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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  drivers/net/ether00.c
  3.  *
  4.  *  Copyright (C) 2001 Altera Corporation
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  */
  20. /* includes */
  21. #include <linux/pci.h>
  22. #include <linux/netdevice.h>
  23. #include <linux/sched.h>
  24. #include <linux/netdevice.h>
  25. #include <linux/skbuff.h>
  26. #include <linux/etherdevice.h>
  27. #include <linux/module.h>
  28. #include <linux/tqueue.h>
  29. #include <linux/mtd/mtd.h>
  30. #include <asm/arch/excalibur.h>
  31. #include <asm/arch/hardware.h>
  32. #include <asm/irq.h>
  33. #include <asm/io.h>
  34. #include <asm/sizes.h>
  35. #include <asm/arch/ether00.h>
  36. #include <asm/arch/tdkphy.h>
  37. MODULE_AUTHOR("Clive Davies");
  38. MODULE_DESCRIPTION("Altera Ether00 IP core driver");
  39. MODULE_LICENSE("GPL");
  40. static long base=0x60000000;
  41. static int irq=0x1;
  42. static int phy_irq=0x2;
  43. MODULE_PARM(base,"l");
  44. MODULE_PARM(irq,"i");
  45. MODULE_PARM(phy_irq,"i");
  46. #define PKT_BUF_SZ 1536 /* Size of each rx buffer */
  47. #define DEBUG(x)
  48. #define __dma_va(x) (unsigned int)((unsigned int)priv->dma_data+(((unsigned int)(x))&(EXC_SPSRAM_BLOCK0_SIZE-1)))
  49. #define __dma_pa(x) (unsigned int)(EXC_SPSRAM_BLOCK0_BASE+(((unsigned int)(x))-(unsigned int)priv->dma_data))
  50. #define ETHER00_BASE 0
  51. #define ETHER00_TYPE
  52. #define ETHER00_PHYS_BASE 0x80000000
  53. #define ETHER00_IRQ  0x1
  54. /* typedefs */
  55. /* The definition of the driver control structure */
  56. #define RX_NUM_BUFF     10
  57. #define RX_NUM_FDESC    10
  58. #define TX_NUM_FDESC    10
  59. struct tx_fda_ent{
  60. FDA_DESC  fd;
  61. BUF_DESC  bd;
  62. BUF_DESC  pad;
  63. };
  64. struct rx_fda_ent{
  65. FDA_DESC  fd;
  66. BUF_DESC  bd;
  67. BUF_DESC  pad;
  68. };
  69. struct rx_blist_ent{
  70. FDA_DESC  fd;
  71. BUF_DESC  bd;
  72. BUF_DESC  pad;
  73. };
  74. struct net_priv
  75. {
  76. struct net_device_stats stats;
  77. struct sk_buff* skb;
  78. void* dma_data;
  79. struct rx_blist_ent*  rx_blist_vp;
  80. struct rx_fda_ent* rx_fda_ptr;
  81. struct tx_fda_ent* tx_fdalist_vp;
  82. struct tq_struct  tq_memupdate;
  83. unsigned char   memupdate_scheduled;
  84. unsigned char   rx_disabled;
  85. unsigned char   queue_stopped;
  86. };
  87. static const char vendor_id[2]={0x07,0xed};
  88. static int ether00_write_phy(struct net_device *dev, short address, short value)
  89. {
  90. volatile int count = 1024;
  91. writew(value,ETHER_MD_DATA(dev->base_addr));
  92. writew( ETHER_MD_CA_BUSY_MSK |
  93. ETHER_MD_CA_WR_MSK |
  94. (address & ETHER_MD_CA_ADDR_MSK),
  95. ETHER_MD_CA(dev->base_addr));
  96. /* Wait for the command to complete */
  97. while((readw(ETHER_MD_CA(dev->base_addr)) & ETHER_MD_CA_BUSY_MSK)&&count){
  98. count--;
  99. }
  100. if (!count){
  101. printk("Write to phy failed, addr=%#x, data=%#xn",address, value);
  102. return -EIO;
  103. }
  104. return 0;
  105. }
  106. static int ether00_read_phy(struct net_device *dev, short address)
  107. {
  108. volatile int count = 1024;
  109. writew( ETHER_MD_CA_BUSY_MSK |
  110. (address & ETHER_MD_CA_ADDR_MSK),
  111. ETHER_MD_CA(dev->base_addr));
  112. /* Wait for the command to complete */
  113. while((readw(ETHER_MD_CA(dev->base_addr)) & ETHER_MD_CA_BUSY_MSK)&&count){
  114. count--;
  115. }
  116. if (!count){
  117. printk(KERN_WARNING "Read from phy timed outn");
  118. return -EIO;
  119. }
  120. return readw(ETHER_MD_DATA(dev->base_addr));
  121. }
  122. static void ether00_phy_int(int irq_num, void* dev_id, struct pt_regs* regs)
  123. {
  124. struct net_device* dev=dev_id;
  125. int irq_status;
  126. irq_status=ether00_read_phy(dev, PHY_IRQ_CONTROL);
  127. if(irq_status & PHY_IRQ_CONTROL_ANEG_COMP_INT_MSK){
  128. /*
  129.  * Autonegotiation complete on epxa10db the mac doesn't
  130.  * twig if we're in full duplex so we need to check the
  131.  * phy status register and configure the mac accordingly
  132.  */
  133. if(ether00_read_phy(dev, PHY_STATUS)&(PHY_STATUS_10T_F_MSK|PHY_STATUS_100_X_F_MSK)){
  134. int tmp;
  135. tmp=readl(ETHER_MAC_CTL(dev->base_addr));
  136. writel(tmp|ETHER_MAC_CTL_FULLDUP_MSK,ETHER_MAC_CTL(dev->base_addr));
  137. }
  138. }
  139. if(irq_status&PHY_IRQ_CONTROL_LS_CHG_INT_MSK){
  140. if(ether00_read_phy(dev, PHY_STATUS)& PHY_STATUS_LINK_MSK){
  141. /* Link is up */
  142. netif_carrier_on(dev);
  143. //printk("Carrier onn");
  144. }else{
  145. netif_carrier_off(dev);
  146. //printk("Carrier offn");
  147. }
  148. }
  149. }
  150. static int ether00_mem_init(struct net_device* dev)
  151. {
  152. struct net_priv* priv=dev->priv;
  153. struct tx_fda_ent *tx_fd_ptr,*tx_end_ptr;
  154. struct rx_blist_ent* blist_ent_ptr;
  155. int i;
  156. /*
  157.  * Grab a block of on chip SRAM to contain the control stuctures for
  158.  * the ethernet MAC. This uncached becuase it needs to be accesses by both
  159.  * bus masters (cpu + mac). However, it shouldn't matter too much in terms
  160.  * of speed as its on chip memory
  161.  */
  162. priv->dma_data=ioremap_nocache(EXC_SPSRAM_BLOCK0_BASE,EXC_SPSRAM_BLOCK0_SIZE );
  163. if (!priv->dma_data)
  164. return -ENOMEM;
  165. priv->rx_fda_ptr=(struct rx_fda_ent*)priv->dma_data;
  166. /*
  167.  * Now share it out amongst the Frame descriptors and the buffer list
  168.  */
  169. priv->rx_blist_vp=(struct rx_blist_ent*)((unsigned int)priv->dma_data+RX_NUM_FDESC*sizeof(struct rx_fda_ent));
  170. /*
  171.  *Initalise the FDA list
  172.  */
  173. /* set ownership to the controller */
  174. memset(priv->rx_fda_ptr,0x80,RX_NUM_FDESC*sizeof(struct rx_fda_ent));
  175. /*
  176.  *Initialise the buffer list
  177.  */
  178. blist_ent_ptr=priv->rx_blist_vp;
  179. i=0;
  180. while(blist_ent_ptr<(priv->rx_blist_vp+RX_NUM_BUFF)){
  181. struct sk_buff *skb;
  182. blist_ent_ptr->fd.FDLength=1;
  183. blist_ent_ptr->fd.FDCtl=0x8000;
  184. skb=dev_alloc_skb(PKT_BUF_SZ);
  185. if(skb){
  186. /* Make the buffer consistent with the cache as the mac is going to write
  187. * directly into it*/
  188. blist_ent_ptr->fd.FDSystem=(unsigned int)skb;
  189. blist_ent_ptr->bd.BuffData=(char*)__pa(skb->data);
  190. consistent_sync(skb->data,PKT_BUF_SZ,PCI_DMA_FROMDEVICE);
  191. skb_reserve(skb,2); /* align IP on 16 Byte (DMA_CTL set to skip 2 bytes) */
  192. blist_ent_ptr->bd.BuffLength=PKT_BUF_SZ-2;
  193. blist_ent_ptr->bd.BDCtl=0x80;
  194. blist_ent_ptr->bd.BDStat=i++;
  195. blist_ent_ptr->fd.FDNext=(FDA_DESC*)__dma_pa(blist_ent_ptr+1);
  196. blist_ent_ptr++;
  197. }
  198. else
  199. {
  200. printk("Failed to initalise buffer listn");
  201. }
  202. }
  203. blist_ent_ptr--;
  204. blist_ent_ptr->fd.FDNext=(FDA_DESC*)__dma_pa(priv->rx_blist_vp);
  205. priv->tx_fdalist_vp=(struct tx_fda_ent*)(priv->rx_blist_vp+RX_NUM_BUFF);
  206. /* Initialise the buffers to be a circular list. The mac will then go poll
  207.  * the list until it fonds a frame ready to transmit */
  208. tx_end_ptr=priv->tx_fdalist_vp+TX_NUM_FDESC;
  209. for(tx_fd_ptr=priv->tx_fdalist_vp;tx_fd_ptr<tx_end_ptr;tx_fd_ptr++){
  210. tx_fd_ptr->fd.FDNext=(FDA_DESC*)__dma_pa((tx_fd_ptr+1));
  211. tx_fd_ptr->fd.FDCtl=1;
  212. tx_fd_ptr->fd.FDStat=0;
  213. tx_fd_ptr->fd.FDLength=1;
  214. }
  215. /* Change the last FDNext pointer to make a circular list */
  216. tx_fd_ptr--;
  217. tx_fd_ptr->fd.FDNext=(FDA_DESC*)__dma_pa(priv->tx_fdalist_vp);
  218. /* Point the device at the chain of Rx and Tx Buffers */
  219. writel((unsigned int)__dma_pa(priv->rx_fda_ptr),ETHER_FDA_BAS(dev->base_addr));
  220. writel((RX_NUM_FDESC-1)*sizeof(struct rx_fda_ent),ETHER_FDA_LIM(dev->base_addr));
  221. writel((unsigned int)__dma_pa(priv->rx_blist_vp),ETHER_BLFRMPTR(dev->base_addr));
  222. writel((unsigned int)__dma_pa(priv->tx_fdalist_vp),ETHER_TXFRMPTR(dev->base_addr));
  223. return 0;
  224. }
  225. void ether00_mem_update(void* dev_id)
  226. {
  227. struct net_device* dev=dev_id;
  228. struct net_priv* priv=dev->priv;
  229. struct sk_buff* skb;
  230. struct tx_fda_ent *fda_ptr=priv->tx_fdalist_vp;
  231. struct rx_blist_ent* blist_ent_ptr;
  232. priv->tq_memupdate.sync=0;
  233. //priv->tq_memupdate.list=
  234. priv->memupdate_scheduled=0;
  235. /* Transmit interrupt */
  236. while(fda_ptr<(priv->tx_fdalist_vp+TX_NUM_FDESC)){
  237. if(!(FDCTL_COWNSFD_MSK&fda_ptr->fd.FDCtl) && (ETHER_TX_STAT_COMP_MSK&fda_ptr->fd.FDStat)){
  238. priv->stats.tx_packets++;
  239. priv->stats.tx_bytes+=fda_ptr->bd.BuffLength;
  240. skb=(struct sk_buff*)fda_ptr->fd.FDSystem;
  241. //printk("%d:txcln:fda=%#x skb=%#xn",jiffies,fda_ptr,skb);
  242. dev_kfree_skb(skb);
  243. fda_ptr->fd.FDSystem=0;
  244. fda_ptr->fd.FDStat=0;
  245. fda_ptr->fd.FDCtl=0;
  246. }
  247. fda_ptr++;
  248. }
  249. /* Fill in any missing buffers from the received queue */
  250. /*
  251.  *Initialise the buffer list
  252.  */
  253. blist_ent_ptr=priv->rx_blist_vp;
  254. while(blist_ent_ptr<(priv->rx_blist_vp+RX_NUM_BUFF)){
  255. /* BuffData of 0 indicates we failed to allocate the buffer in the ISR */
  256. if(!blist_ent_ptr->bd.BuffData){
  257. struct sk_buff *skb;
  258. skb=dev_alloc_skb(PKT_BUF_SZ);
  259. if(skb){
  260. /* Make the buffer consistent with the cache as the mac is going to write
  261.  * directly into it*/
  262. blist_ent_ptr->fd.FDSystem=(unsigned int)skb;
  263. blist_ent_ptr->bd.BuffData=(char*)__pa(skb->data);
  264. consistent_sync(skb->data,PKT_BUF_SZ,PCI_DMA_FROMDEVICE);
  265. skb_reserve(skb,2); /* align IP on 16 Byte (DMA_CTL set to skip 2 bytes) */
  266. blist_ent_ptr->bd.BuffLength=PKT_BUF_SZ-2;
  267. blist_ent_ptr->fd.FDLength=1;
  268. blist_ent_ptr->bd.BDCtl=BDCTL_COWNSBD_MSK;
  269. blist_ent_ptr->fd.FDCtl=FDCTL_COWNSFD_MSK;
  270. }
  271. else
  272. {
  273. break;
  274. }
  275. }
  276. blist_ent_ptr++;
  277. }
  278. if(priv->queue_stopped){
  279. //printk("%d:cln:start qn",jiffies);
  280. netif_start_queue(dev);
  281. }
  282. if(priv->rx_disabled){
  283. //printk("%d:enable_irqn",jiffies);
  284. priv->rx_disabled=0;
  285. writel(ETHER_RX_CTL_RXEN_MSK,ETHER_RX_CTL(dev->base_addr));
  286. }
  287. }
  288. static void ether00_int( int irq_num, void* dev_id, struct pt_regs* regs)
  289. {
  290. struct net_device* dev=dev_id;
  291. struct net_priv* priv=dev->priv;
  292. unsigned int   interruptValue;
  293. interruptValue=readl(ETHER_INT_SRC(dev->base_addr));
  294. //printk("INT_SRC=%xn",interruptValue);
  295. if(!(readl(ETHER_INT_SRC(dev->base_addr)) & ETHER_INT_SRC_IRQ_MSK))
  296. {
  297. return; /* Interrupt wasn't caused by us!! */
  298. }
  299. if(readl(ETHER_INT_SRC(dev->base_addr))&
  300.    (ETHER_INT_SRC_INTMACRX_MSK |
  301.     ETHER_INT_SRC_FDAEX_MSK |
  302.     ETHER_INT_SRC_BLEX_MSK)) {
  303. struct rx_blist_ent* blist_ent_ptr;
  304. struct rx_fda_ent* fda_ent_ptr;
  305. struct sk_buff* skb;
  306. fda_ent_ptr=priv->rx_fda_ptr;
  307. while(fda_ent_ptr<(priv->rx_fda_ptr+RX_NUM_FDESC)){
  308. int result;
  309. if(!(fda_ent_ptr->fd.FDCtl&FDCTL_COWNSFD_MSK))
  310. {
  311. /* This frame is ready for processing */
  312. /*find the corresponding buffer in the bufferlist */
  313. blist_ent_ptr=priv->rx_blist_vp+fda_ent_ptr->bd.BDStat;
  314. skb=(struct sk_buff*)fda_ent_ptr->fd.FDSystem;
  315. /* Pass this skb up the stack */
  316. skb->dev=dev;
  317. skb_put(skb,fda_ent_ptr->fd.FDLength);
  318. skb->protocol=eth_type_trans(skb,dev);
  319. skb->ip_summed=CHECKSUM_UNNECESSARY;
  320. result=netif_rx(skb);
  321. /* Update statistics */
  322. priv->stats.rx_packets++;
  323. priv->stats.rx_bytes+=fda_ent_ptr->fd.FDLength;
  324. /* Free the FDA entry */
  325. fda_ent_ptr->bd.BDStat=0xff;
  326. fda_ent_ptr->fd.FDCtl=FDCTL_COWNSFD_MSK;
  327. /* Allocate a new skb and point the bd entry to it */
  328. skb=dev_alloc_skb(PKT_BUF_SZ);
  329. if(skb){
  330. blist_ent_ptr->bd.BuffData=(char*)__pa(skb->data);
  331. consistent_sync(skb->data,PKT_BUF_SZ,PCI_DMA_FROMDEVICE);
  332. skb_reserve(skb,2); /* align IP on 16 Byte (DMA_CTL set to skip 2 bytes) */
  333. blist_ent_ptr->bd.BuffLength=PKT_BUF_SZ-2;
  334. blist_ent_ptr->fd.FDSystem=(unsigned int)skb;
  335. /* Pass it to the controller */
  336. blist_ent_ptr->bd.BDCtl=BDCTL_COWNSBD_MSK;
  337. blist_ent_ptr->fd.FDCtl=FDCTL_COWNSFD_MSK;
  338. }
  339. else if(!priv->memupdate_scheduled){
  340. int tmp;
  341. /* There are no buffers at the moment, so schedule */
  342. /* the background task to sort this out */
  343. schedule_task(&priv->tq_memupdate);
  344. priv->memupdate_scheduled=1;
  345. /* If this interrupt was due to a lack of buffers then
  346.  * we'd better stop the receiver too */
  347. if(interruptValue&ETHER_INT_SRC_BLEX_MSK){
  348. priv->rx_disabled=1;
  349. tmp=readl(ETHER_INT_SRC(dev->base_addr));
  350. writel(tmp&~ETHER_RX_CTL_RXEN_MSK,ETHER_RX_CTL(dev->base_addr));
  351. }
  352. }
  353. }
  354. fda_ent_ptr++;
  355. }
  356. /* Clear the  interrupts */
  357. writel(ETHER_INT_SRC_INTMACRX_MSK | ETHER_INT_SRC_FDAEX_MSK
  358.        | ETHER_INT_SRC_BLEX_MSK,ETHER_INT_SRC(dev->base_addr));
  359. }
  360. if(readl(ETHER_INT_SRC(dev->base_addr))&ETHER_INT_SRC_INTMACTX_MSK){
  361. if(!priv->memupdate_scheduled){
  362. schedule_task(&priv->tq_memupdate);
  363. priv->memupdate_scheduled=1;
  364. }
  365. /* Clear the interrupt */
  366. writel(ETHER_INT_SRC_INTMACTX_MSK,ETHER_INT_SRC(dev->base_addr));
  367. }
  368. if (readl(ETHER_INT_SRC(dev->base_addr)) & (ETHER_INT_SRC_SWINT_MSK|
  369.     ETHER_INT_SRC_INTEARNOT_MSK|
  370.     ETHER_INT_SRC_INTLINK_MSK|
  371.     ETHER_INT_SRC_INTEXBD_MSK|
  372.     ETHER_INT_SRC_INTTXCTLCMP_MSK))
  373. {
  374. /*
  375.  * Not using any of these so they shouldn't happen
  376.  *
  377.  * In the cased of INTEXBD - I only allocated 16 descriptors
  378.  * if you allocate more than 28 you may need to think about this
  379.  */
  380. printk("Not using this interruptn");
  381. }
  382. if (readl(ETHER_INT_SRC(dev->base_addr)) &
  383.     (ETHER_INT_SRC_INTSBUS_MSK |
  384.      ETHER_INT_SRC_INTNRABT_MSK
  385.      |ETHER_INT_SRC_DMPARERR_MSK))
  386. {
  387. /*
  388.  * Hardware errors, we can either ignore them and hope they go away
  389.  *or reset the device, I'll try the first for now to see if they happen
  390.  */
  391. printk("Hardware errorn");
  392. }
  393. }
  394. static void ether00_setup_ethernet_address(struct net_device* dev)
  395. {
  396. int tmp;
  397. dev->addr_len=6;
  398. writew(0,ETHER_ARC_ADR(dev->base_addr));
  399. writel((dev->dev_addr[0]<<24) |
  400. (dev->dev_addr[1]<<16) |
  401. (dev->dev_addr[2]<<8) |
  402. dev->dev_addr[3],
  403. ETHER_ARC_DATA(dev->base_addr));
  404. writew(4,ETHER_ARC_ADR(dev->base_addr));
  405. tmp=readl(ETHER_ARC_DATA(dev->base_addr));
  406. tmp&=0xffff;
  407. tmp|=(dev->dev_addr[4]<<24) | (dev->dev_addr[5]<<16);
  408. writel(tmp, ETHER_ARC_DATA(dev->base_addr));
  409. /* Enable this entry in the ARC */
  410. writel(1,ETHER_ARC_ENA(dev->base_addr));
  411. return;
  412. }
  413. static void ether00_reset(struct net_device *dev)
  414. {
  415. /* reset the controller */
  416. writew(ETHER_MAC_CTL_RESET_MSK,ETHER_MAC_CTL(dev->base_addr));
  417. /*
  418.  * Make sure we're not going to send anything
  419.  */
  420. writew(ETHER_TX_CTL_TXHALT_MSK,ETHER_TX_CTL(dev->base_addr));
  421. /*
  422.  * Make sure we're not going to receive anything
  423.  */
  424. writew(ETHER_RX_CTL_RXHALT_MSK,ETHER_RX_CTL(dev->base_addr));
  425. /*
  426.  * Disable Interrupts for now, and set the burst size to 8 bytes
  427.  */
  428. writel(ETHER_DMA_CTL_INTMASK_MSK |
  429.        ((8 << ETHER_DMA_CTL_DMBURST_OFST) & ETHER_DMA_CTL_DMBURST_MSK)
  430.        |(2<<ETHER_DMA_CTL_RXALIGN_OFST),
  431.        ETHER_DMA_CTL(dev->base_addr));
  432. /*
  433.  * Set TxThrsh - start transmitting a packet after 1514
  434.  * bytes or when a packet is complete, whichever comes first
  435.  */
  436.  writew(1514,ETHER_TXTHRSH(dev->base_addr));
  437. /*
  438.  * Set TxPollCtr.  Each cycle is
  439.  * 61.44 microseconds with a 33 MHz bus
  440.  */
  441.  writew(1,ETHER_TXPOLLCTR(dev->base_addr));
  442. /*
  443.  * Set Rx_Ctl - Turn off reception and let RxData turn it
  444.  * on later
  445.  */
  446.  writew(ETHER_RX_CTL_RXHALT_MSK,ETHER_RX_CTL(dev->base_addr));
  447. }
  448. static void ether00_set_multicast(struct net_device* dev)
  449. {
  450. int count=dev->mc_count;
  451. /* Set promiscuous mode if it's asked for. */
  452. if (dev->flags&IFF_PROMISC){
  453. writew( ETHER_ARC_CTL_COMPEN_MSK |
  454. ETHER_ARC_CTL_BROADACC_MSK |
  455. ETHER_ARC_CTL_GROUPACC_MSK |
  456. ETHER_ARC_CTL_STATIONACC_MSK,
  457. ETHER_ARC_CTL(dev->base_addr));
  458. return;
  459. }
  460. /*
  461.  * Get all multicast packets if required, or if there are too
  462.  * many addresses to fit in hardware
  463.  */
  464. if (dev->flags & IFF_ALLMULTI){
  465. writew( ETHER_ARC_CTL_COMPEN_MSK |
  466. ETHER_ARC_CTL_GROUPACC_MSK |
  467. ETHER_ARC_CTL_BROADACC_MSK,
  468. ETHER_ARC_CTL(dev->base_addr));
  469. return;
  470. }
  471. if (dev->mc_count > (ETHER_ARC_SIZE - 1)){
  472. printk(KERN_WARNING "Too many multicast addresses for hardware to filter - receiving all multicast packetsn");
  473. writew( ETHER_ARC_CTL_COMPEN_MSK |
  474. ETHER_ARC_CTL_GROUPACC_MSK |
  475. ETHER_ARC_CTL_BROADACC_MSK,
  476. ETHER_ARC_CTL(dev->base_addr));
  477. return;
  478. }
  479. if(dev->mc_count){
  480. struct dev_mc_list *mc_list_ent=dev->mc_list;
  481. unsigned int temp,i;
  482. DEBUG(printk("mc_count=%d mc_list=%#xn",dev-> mc_count, dev->mc_list));
  483. DEBUG(printk("mc addr=%02#x%02x%02x%02x%02x%02xn",
  484.      mc_list_ent->dmi_addr[5],
  485.      mc_list_ent->dmi_addr[4],
  486.      mc_list_ent->dmi_addr[3],
  487.      mc_list_ent->dmi_addr[2],
  488.      mc_list_ent->dmi_addr[1],
  489.      mc_list_ent->dmi_addr[0]);)
  490. /*
  491.  * The first 6 bytes are the MAC address, so
  492.  * don't change them!
  493.  */
  494. writew(4,ETHER_ARC_ADR(dev->base_addr));
  495. temp=readl(ETHER_ARC_DATA(dev->base_addr));
  496. temp&=0xffff0000;
  497. /* Disable the current multicast stuff */
  498. writel(1,ETHER_ARC_ENA(dev->base_addr));
  499. for(;;){
  500. temp|=mc_list_ent->dmi_addr[1] |
  501. mc_list_ent->dmi_addr[0]<<8;
  502. writel(temp,ETHER_ARC_DATA(dev->base_addr));
  503. i=readl(ETHER_ARC_ADR(dev->base_addr));
  504. writew(i+4,ETHER_ARC_ADR(dev->base_addr));
  505. temp=mc_list_ent->dmi_addr[5]|
  506. mc_list_ent->dmi_addr[4]<<8 |
  507. mc_list_ent->dmi_addr[3]<<16 |
  508. mc_list_ent->dmi_addr[2]<<24;
  509. writel(temp,ETHER_ARC_DATA(dev->base_addr));
  510. count--;
  511. if(!mc_list_ent->next || !count){
  512. break;
  513. }
  514. DEBUG(printk("mc_list_next=%#xn",mc_list_ent->next);)
  515. mc_list_ent=mc_list_ent->next;
  516. i=readl(ETHER_ARC_ADR(dev->base_addr));
  517. writel(i+4,ETHER_ARC_ADR(dev->base_addr));
  518. temp=mc_list_ent->dmi_addr[3]|
  519. mc_list_ent->dmi_addr[2]<<8 |
  520. mc_list_ent->dmi_addr[1]<<16 |
  521. mc_list_ent->dmi_addr[0]<<24;
  522. writel(temp,ETHER_ARC_DATA(dev->base_addr));
  523. i=readl(ETHER_ARC_ADR(dev->base_addr));
  524. writel(i+4,ETHER_ARC_ADR(dev->base_addr));
  525. temp=mc_list_ent->dmi_addr[4]<<16 |
  526. mc_list_ent->dmi_addr[5]<<24;
  527. writel(temp,ETHER_ARC_DATA(dev->base_addr));
  528. count--;
  529. if(!mc_list_ent->next || !count){
  530. break;
  531. }
  532. mc_list_ent=mc_list_ent->next;
  533. }
  534. if(count)
  535. printk(KERN_WARNING "Multicast list size errorn");
  536. writew( ETHER_ARC_CTL_BROADACC_MSK|
  537. ETHER_ARC_CTL_COMPEN_MSK,
  538. ETHER_ARC_CTL(dev->base_addr));
  539. }
  540. /* enable the active ARC enties */
  541. writew((1<<(count+2))-1,ETHER_ARC_ENA(dev->base_addr));;
  542. }
  543. static int ether00_open(struct net_device* dev)
  544. {
  545. int result,tmp;
  546. struct net_priv* priv;
  547. dev->base_addr=ioremap_nocache(base,SZ_4K);
  548. dev->irq=irq;
  549. dev->priv=kmalloc(sizeof(struct net_priv),GFP_KERNEL);
  550. if(!dev->priv)
  551. return -ENOMEM;
  552. memset(dev->priv,0,sizeof(struct net_priv));
  553. priv=(struct net_priv*)dev->priv;
  554. priv->tq_memupdate.routine=ether00_mem_update;
  555. priv->tq_memupdate.data=(void*) dev;
  556. if (!is_valid_ether_addr(dev->dev_addr))
  557. return -EINVAL;
  558. /* Install interrupt handlers */
  559. result=request_irq(dev->irq,ether00_int,0,"ether00",dev);
  560. if(result)
  561. return result;
  562. result=request_irq(phy_irq,ether00_phy_int,0,"ether00_phy",dev);
  563. if(result)
  564. return result;
  565. ether00_reset(dev);
  566. result=ether00_mem_init(dev);
  567. if(result) return result;
  568. ether00_setup_ethernet_address(dev);
  569. ether00_set_multicast(dev);
  570. result=ether00_write_phy(dev,PHY_CONTROL, PHY_CONTROL_ANEGEN_MSK | PHY_CONTROL_RANEG_MSK);
  571. if(result) return result;
  572. result=ether00_write_phy(dev,PHY_IRQ_CONTROL, PHY_IRQ_CONTROL_LS_CHG_IE_MSK |
  573.  PHY_IRQ_CONTROL_ANEG_COMP_IE_MSK);
  574. if(result) return result;
  575. /* Start the device enable interrupts */
  576. writew(ETHER_RX_CTL_RXEN_MSK
  577.        | ETHER_RX_CTL_STRIPCRC_MSK
  578.        | ETHER_RX_CTL_ENGOOD_MSK
  579.        | ETHER_RX_CTL_ENRXPAR_MSK| ETHER_RX_CTL_ENLONGERR_MSK
  580.        | ETHER_RX_CTL_ENOVER_MSK| ETHER_RX_CTL_ENCRCERR_MSK,
  581.        ETHER_RX_CTL(dev->base_addr));
  582. writew(ETHER_TX_CTL_TXEN_MSK|
  583.        ETHER_TX_CTL_ENEXDEFER_MSK|
  584.        ETHER_TX_CTL_ENLCARR_MSK|
  585.        ETHER_TX_CTL_ENEXCOLL_MSK|
  586.        ETHER_TX_CTL_ENLATECOLL_MSK|
  587.        ETHER_TX_CTL_ENTXPAR_MSK|
  588.        ETHER_TX_CTL_ENCOMP_MSK,
  589.        ETHER_TX_CTL(dev->base_addr));
  590. tmp=readl(ETHER_DMA_CTL(dev->base_addr));
  591. writel(tmp&~ETHER_DMA_CTL_INTMASK_MSK,ETHER_DMA_CTL(dev->base_addr));
  592. return 0;
  593. }
  594. static int ether00_tx(struct sk_buff* skb, struct net_device* dev)
  595. {
  596. struct net_priv *priv=dev->priv;
  597. struct tx_fda_ent *fda_ptr;
  598. int i;
  599. /*
  600.  * Find an empty slot in which to stick the frame
  601.  */
  602. fda_ptr=(struct tx_fda_ent*)__dma_va(readl(ETHER_TXFRMPTR(dev->base_addr)));
  603. i=0;
  604. while(i<TX_NUM_FDESC){
  605. if (fda_ptr->fd.FDStat||(fda_ptr->fd.FDCtl & FDCTL_COWNSFD_MSK)){
  606. fda_ptr =(struct tx_fda_ent*) __dma_va((struct tx_fda_ent*)fda_ptr->fd.FDNext);
  607. }
  608. else {
  609. break;
  610. }
  611. i++;
  612. }
  613. /* Write the skb data from the cache*/
  614. consistent_sync(skb->data,skb->len,PCI_DMA_TODEVICE);
  615. fda_ptr->bd.BuffData=(char*)__pa(skb->data);
  616. fda_ptr->bd.BuffLength=(unsigned short)skb->len;
  617. /* Save the pointer to the skb for freeing later */
  618. fda_ptr->fd.FDSystem=(unsigned int)skb;
  619. fda_ptr->fd.FDStat=0;
  620. /* Pass ownership of the buffers to the controller */
  621. fda_ptr->fd.FDCtl=1;
  622. fda_ptr->fd.FDCtl|=FDCTL_COWNSFD_MSK;
  623. /* If the next buffer in the list is full, stop the queue */
  624. fda_ptr=(struct tx_fda_ent*)__dma_va(fda_ptr->fd.FDNext);
  625. if ((fda_ptr->fd.FDStat)||(fda_ptr->fd.FDCtl & FDCTL_COWNSFD_MSK)){
  626. netif_stop_queue(dev);
  627. priv->queue_stopped=1;
  628. }
  629. return 0;
  630. }
  631. static struct net_device_stats *ether00_stats(struct net_device* dev)
  632. {
  633. struct net_priv *priv=dev->priv;
  634. return &priv->stats;
  635. }
  636. static int ether00_stop(struct net_device* dev)
  637. {
  638. struct net_priv *priv=dev->priv;
  639. int tmp;
  640. /* Stop/disable the device. */
  641. tmp=readw(ETHER_RX_CTL(dev->base_addr));
  642. tmp&=~(ETHER_RX_CTL_RXEN_MSK | ETHER_RX_CTL_ENGOOD_MSK);
  643. tmp|=ETHER_RX_CTL_RXHALT_MSK;
  644. writew(tmp,ETHER_RX_CTL(dev->base_addr));
  645. tmp=readl(ETHER_TX_CTL(dev->base_addr));
  646. tmp&=~ETHER_TX_CTL_TXEN_MSK;
  647. tmp|=ETHER_TX_CTL_TXHALT_MSK;
  648. writel(tmp,ETHER_TX_CTL(dev->base_addr));
  649. /* Free up system resources */
  650. free_irq(dev->irq,dev);
  651. free_irq(phy_irq,dev);
  652. iounmap(priv->dma_data);
  653. kfree(priv);
  654. return 0;
  655. }
  656. static void ether00_get_ethernet_address(struct net_device* dev)
  657. {
  658. struct mtd_info *mymtd=NULL;
  659. int i;
  660. size_t retlen;
  661. /*
  662.  * For the Epxa10 dev board (camelot), the ethernet MAC
  663.  * address is of the form  00:aa:aa:00:xx:xx where
  664.  * 00:aa:aa is the Altera vendor ID and xx:xx is the
  665.  * last 2 bytes of the board serial number, as programmed
  666.  * into the OTP area of the flash device on EBI1. If this
  667.  * isn't an expa10 dev board, or there's no mtd support to
  668.  * read the serial number from flash then we'll force the
  669.  * use to set their own mac address using ifconfig.
  670.  */
  671. #ifdef CONFIG_ARCH_CAMELOT
  672. #ifdef CONFIG_MTD
  673. /* get the mtd_info structure for the first mtd device*/
  674. for(i=0;i<MAX_MTD_DEVICES;i++){
  675. mymtd=get_mtd_device(NULL,i);
  676. if(mymtd && !strcmp(mymtd->name,"master"))
  677. break;
  678. }
  679. if(!mymtd || !mymtd->read_oob){
  680. printk(KERN_WARNING "%s: Failed to read MAC address from flashn",dev->name);
  681. }else{
  682. mymtd->read_oob(mymtd,10,1,&retlen,&dev->dev_addr[5]);
  683. mymtd->read_oob(mymtd,11,1,&retlen,&dev->dev_addr[4]);
  684. dev->dev_addr[3]=0;
  685. dev->dev_addr[2]=vendor_id[1];
  686. dev->dev_addr[1]=vendor_id[0];
  687. dev->dev_addr[0]=0;
  688. }
  689. #else
  690. printk(KERN_WARNING "%s: MTD support required to read MAC address from EPXA10 dev boardn", dev->name);
  691. #endif
  692. #endif
  693. if (!is_valid_ether_addr(dev->dev_addr))
  694. printk("%s: Invalid ethernet MAC address.  Please set using "
  695. "ifconfign", dev->name);
  696. }
  697. static int ether00_init(struct net_device* dev)
  698. {
  699. ether_setup(dev);
  700. dev->open=ether00_open;
  701. dev->stop=ether00_stop;
  702. dev->set_multicast_list=ether00_set_multicast;
  703. dev->hard_start_xmit=ether00_tx;
  704. dev->get_stats=ether00_stats;
  705. ether00_get_ethernet_address(dev);
  706. SET_MODULE_OWNER(dev);
  707. return 0;
  708. }
  709. struct net_device ether00_dev={
  710. init:ether00_init,
  711. name:"eth%d",
  712. };
  713. static void __exit ether00_cleanup_module(void)
  714. {
  715. unregister_netdev(&ether00_dev);
  716. }
  717. module_exit(ether00_cleanup_module);
  718. static int __init ether00_mod_init(void)
  719. {
  720. int result;
  721. result=register_netdev(&ether00_dev);
  722. if(result)
  723. printk("Ether00: Error %i registering drivern",result);
  724. return result;
  725. }
  726. module_init(ether00_mod_init);