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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* cs89x0.c: A Crystal Semiconductor (Now Cirrus Logic) CS89[02]0
  2.  *  driver for linux.
  3.  */
  4. /*
  5. Written 1996 by Russell Nelson, with reference to skeleton.c
  6. written 1993-1994 by Donald Becker.
  7. This software may be used and distributed according to the terms
  8. of the GNU Public License, incorporated herein by reference.
  9.         The author may be reached at nelson@crynwr.com, Crynwr
  10.         Software, 521 Pleasant Valley Rd., Potsdam, NY 13676
  11.   Changelog:
  12.   Mike Cruse        : mcruse@cti-ltd.com
  13.   Russ Nelson       : Jul 13 1998.  Added RxOnly DMA support.
  14.   Melody Lee        : Aug 10 1999.  Changes for Linux 2.2.5 compatibility. 
  15.   Alan Cox          : Removed 1.2 support, added 2.1 extra counters.
  16.   Andrew Morton     : andrewm@uow.edu.au
  17.   Sangwook Lee      : hitchcar@sec.samsung.com
  18. */
  19. static char *version =
  20. "cerf89x0.c: (kernel 2.3.99) Russell Nelson, Andrew Mortonn";
  21. /* ======================= end of configuration ======================= */
  22. /* Always include 'config.h' first in case the user wants to turn on
  23.    or override something. */
  24. #ifdef MODULE
  25. #include <linux/module.h>
  26. #include <linux/version.h>
  27. #else
  28. #define MOD_INC_USE_COUNT
  29. #define MOD_DEC_USE_COUNT
  30. #endif
  31. /*
  32.  * Set this to zero to remove all the debug statements via
  33.  * dead code elimination
  34.  */
  35. #define DEBUGGING 1
  36. /*
  37.   Sources:
  38. Crynwr packet driver epktisa.
  39. Crystal Semiconductor data sheets.
  40. */
  41. #include <linux/kernel.h>
  42. #include <linux/sched.h>
  43. #include <linux/types.h>
  44. #include <linux/fcntl.h>
  45. #include <linux/interrupt.h>
  46. #include <linux/ptrace.h>
  47. #include <linux/ioport.h>
  48. #include <linux/in.h>
  49. #include <linux/slab.h>
  50. #include <linux/string.h>
  51. #include <asm/system.h>
  52. #include <asm/bitops.h>
  53. #include <asm/io.h>
  54. #include <linux/errno.h>
  55. #include <linux/init.h>
  56. #include <linux/spinlock.h>
  57. #include <linux/netdevice.h>
  58. #include <linux/etherdevice.h>
  59. #include <linux/skbuff.h>
  60. #include <asm/irq.h>
  61. #include <asm/hardware.h>
  62. #define IRQ_LAN IRQ_EINT8_23
  63. #include "cs89x0.h"
  64. /* First, a few definitions that the brave might change. */
  65. /* A zero-terminated list of I/O addresses to be probed. */
  66. static unsigned int netcard_portlist[] __initdata =
  67.    { (0xd0000000+0x00000300), 0};
  68. #ifdef  DEBUGGING
  69. static unsigned int net_debug = 4;
  70. #else
  71. #define net_debug 0 /* gcc will remove all the debug code for us */
  72. #endif
  73. /* The number of low I/O ports used by the ethercard. */
  74. #define NETCARD_IO_EXTENT 16
  75. /* Information that need to be kept for each board. */
  76. struct net_local {
  77. struct net_device_stats stats;
  78. int chip_type; /* one of: CS8900, CS8920, CS8920M */
  79. char chip_revision; /* revision letter of the chip ('A'...) */
  80. int send_cmd; /* the proper send command: TX_NOW, TX_AFTER_381, or TX_AFTER_ALL */
  81. int auto_neg_cnf; /* auto-negotiation word from EEPROM */
  82. int adapter_cnf; /* adapter configuration from EEPROM */
  83. int isa_config; /* ISA configuration from EEPROM */
  84. int irq_map; /* IRQ map from EEPROM */
  85. int rx_mode; /* what mode are we in? 0, RX_MULTCAST_ACCEPT, or RX_ALL_ACCEPT */
  86. int curr_rx_cfg; /* a copy of PP_RxCFG */
  87. int linectl; /* either 0 or LOW_RX_SQUELCH, depending on configuration. */
  88. int send_underrun; /* keep track of how many underruns in a row we get */
  89.         struct sk_buff * Gskb; /* pinnter to TX buff waiting for Ready4Tx */
  90. spinlock_t lock;
  91. };
  92. /* Index to functions, as function prototypes. */
  93. extern int cerf89x0_probe(struct net_device *dev);
  94. static int S3C2410_HWinit(void);
  95. static int cerf89x0_probe1(struct net_device *dev, int ioaddr);
  96. static int net_open(struct net_device *dev);
  97. static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
  98. static void net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  99. static void set_multicast_list(struct net_device *dev);
  100. static void net_timeout(struct net_device *dev);
  101. static void net_rx(struct net_device *dev);
  102. static int net_close(struct net_device *dev);
  103. static struct net_device_stats *net_get_stats(struct net_device *dev);
  104. static void reset_chip(struct net_device *dev);
  105. static int set_mac_address(struct net_device *dev, void *addr);
  106. static void count_rx_errors(int status, struct net_local *lp);
  107. /* Example routines you must write ;->. */
  108. #define tx_done(dev) 1
  109. /* Check for a network chip of this type, and return '0' if one exists.
  110.  * Return ENODEV on Failure.
  111.  */
  112. #ifdef CONFIG_S3C2410_SMDK
  113. #define CS8900_Tacs    (0x0)   // 0clk
  114. #define CS8900_Tcos    (0x3)   // 4clk
  115. #define CS8900_Tacc    (0x7)   // 14clk
  116. #define CS8900_Tcoh    (0x1)   // 1clk
  117. #define CS8900_Tah (0x3)   // 4clk
  118. #define CS8900_Tacp    (0x3)   // 6clk
  119. #define CS8900_PMC (0x0)   // normal(1data)
  120. int __init S3C2410_HWinit()
  121. {
  122. // initialize CS8900
  123.     BWSCON  = (BWSCON&~(0xf<<12))|(0xd<<12);  /*  nWAIT */
  124.     //  rGSTATUS0;      /* Read Only */
  125. GPGCON &= ~(3 << 2);
  126.     GPGCON |= (2 << 2); /* GPG1 set to EINT9 */
  127.     BANKCON3=((CS8900_Tacs<<13)+(CS8900_Tcos<<11)+(CS8900_Tacc<<8)
  128.         +(CS8900_Tcoh<<6)+(CS8900_Tah<<4)+(CS8900_Tacp<<2)+(CS8900_PMC));
  129. EXTINT1 &= ~(7 << 4);
  130.     EXTINT1 |= (4 << 4); /* EINT9 rising edge */
  131. return 0;
  132. }
  133. #endif
  134. int __init cerf89x0_probe(struct net_device *dev)
  135. {
  136. static int initialised = 0;
  137. int i;
  138. if (initialised)
  139. return -ENODEV;
  140. initialised = 1;
  141. #ifdef CONFIG_S3C2410_SMDK
  142. S3C2410_HWinit();
  143. #endif
  144. if (net_debug)
  145. printk("cerf89x0:cerf89x0_probe()n");
  146. #ifdef CONFIG_S3C2410_SMDK
  147.     GPGUP  |= (1 << 1); /* GPG1 pull-up disable */
  148.     GPGCON &= ~(3 << 2);
  149.     GPGCON |= (2 << 2); /* GPG1 set to EINT9 */
  150. #endif
  151. for (i = 0; netcard_portlist[i]; i++) {
  152. int ioaddr = netcard_portlist[i];
  153. if (cerf89x0_probe1(dev, ioaddr) == 0)
  154. return 0;
  155. }
  156. printk(KERN_WARNING "cerf89x0: no cs8900 detected.n");
  157. return ENODEV;
  158. }
  159. extern u8 inline
  160. raw_readb(u32 addr)
  161. {
  162. return (*(volatile u8 *)(addr));
  163. }
  164. extern u16 inline
  165. raw_readw(u32 addr)
  166. {
  167. return (*(volatile u16 *)(addr));
  168. }
  169. extern void inline
  170. raw_writeb(u8 value, u32 addr)
  171. {
  172. (*(volatile u8 *)(addr)) = value;
  173. }
  174. extern void inline
  175. raw_writew(u16 value, u32 addr)
  176. {
  177. (*(volatile u16 *)(addr)) = value;
  178. }
  179. extern u16 inline
  180. readreg(struct net_device *dev, int portno)
  181. {
  182. raw_writew(portno, dev->base_addr + ADD_PORT);
  183. return raw_readw(dev->base_addr + DATA_PORT);
  184. }
  185. extern void inline
  186. writereg(struct net_device *dev, int portno, u16 value)
  187. {
  188. raw_writew(portno, dev->base_addr + ADD_PORT);
  189. raw_writew(value,  dev->base_addr + DATA_PORT);
  190. }
  191. extern u16 inline
  192. readword(struct net_device *dev, int portno)
  193. {
  194. return raw_readw(dev->base_addr + portno);
  195. }
  196. extern void inline
  197. writeword(struct net_device *dev, int portno, u16 value)
  198. {
  199. raw_writew(value,  dev->base_addr + portno);
  200. }
  201. static void writeblock(struct net_device *dev, char *pData, int Length)
  202. {
  203. int i;
  204. for (i = 0 ; i < (Length / 2); i++)
  205. {   
  206. writeword(dev, TX_FRAME_PORT, *(u16 *)pData );
  207. pData += 2;
  208. }
  209.    
  210. if (Length % 2) 
  211. {
  212. u16 OddWordValue = *pData;
  213. writeword(dev, TX_FRAME_PORT, OddWordValue);
  214. }
  215. }
  216. static void readblock(struct net_device *dev, char *pData, int Length)
  217. {
  218. #if 0
  219. u16 wOddWord;
  220. int i;
  221.    
  222. u16 StartOffset = PP_RxFrame | AUTOINCREMENT;
  223.     writeword(dev, ADD_PORT, StartOffset);
  224. if ((u32) pData % 2)
  225. {
  226. for (i=0; i < (Length/2); i++) 
  227. {
  228. wOddWord = readword(dev, DATA_PORT);
  229.                
  230. *(u8*)pData++ = (u8) wOddWord & 0xFF;
  231. *(u8*)pData++ = (u8) (wOddWord >> 8) & 0xFF;
  232. }
  233. }
  234. else
  235. {
  236. for (i=0; i < (Length/2); i++) 
  237. {
  238. *(u16*) pData = readword(dev, DATA_PORT);
  239. pData += 2;
  240. }
  241. }
  242. switch (Length % 2) 
  243.     {
  244. case 1:
  245. *pData = (u8) (readword(dev, DATA_PORT) & 0xff);
  246. }
  247. #endif
  248. u16 InputWord;
  249. int i;
  250.    
  251. for (i=0; i < (Length>>1); i++) 
  252. {
  253. InputWord = readword(dev, RX_FRAME_PORT);
  254. *(u8*)pData++ = (u8) InputWord & 0xFF;
  255. *(u8*)pData++ = (u8) (InputWord >> 8) & 0xFF;
  256. }
  257. switch (Length & 0x1) 
  258.     {
  259. case 1:
  260. *pData = (u8) (readword(dev, RX_FRAME_PORT) & 0xff);
  261. }
  262. }
  263. /* This is the real probe routine.  Linux has a history of friendly device
  264.    probes on the ISA bus.  A good device probes avoids doing writes, and
  265.    verifies that the correct device exists and functions.
  266.    Return 0 on success.
  267.  */
  268. char chip_version(int PID)
  269. {
  270.   switch(PID) {
  271.   case 0x7:
  272.     return 'B';
  273.   case 0x8:
  274.     return 'C';
  275.   case 0x9:
  276.     return 'D';
  277.   default :
  278.     return '?';
  279.  }
  280. }
  281. static int __init
  282. cerf89x0_probe1(struct net_device *dev, int ioaddr)
  283. {
  284. struct net_local *lp;
  285. static unsigned version_printed = 0;
  286. int i;
  287. unsigned rev_type = 0;
  288. u16 MacAddr[3] = {0,0,0};
  289. int retval;
  290. unsigned short wData;
  291. /* Initialize the device structure. */
  292. if (dev->priv == NULL)
  293. {
  294. dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
  295. if (dev->priv == 0)
  296. {
  297. retval = ENOMEM;
  298. goto out;
  299. }
  300. memset(dev->priv, 0, sizeof(struct net_local));
  301. }
  302. lp = (struct net_local *)dev->priv;
  303. /*  Bus Reset Consideration  */
  304. wData = raw_readw(ioaddr + ADD_PORT);
  305. if ((wData & ADD_MASK) != ADD_SIG )
  306. {
  307.   // if (net_debug)
  308. printk("cerf89x0:cerf89x0_probe1() 0x%08Xn", wData);
  309. // printk(" BWSCON 0x%08Xn", rBWSCON);
  310. retval = ENODEV;
  311. goto out1;
  312. }
  313. /* Fill in the 'dev' fields. */
  314. dev->base_addr = ioaddr;
  315. /* get the chip type */
  316. rev_type = readreg(dev, PRODUCT_ID_ADD);
  317. lp->chip_type = rev_type &~ REVISON_BITS;
  318. lp->chip_revision = chip_version((rev_type & REVISON_BITS) >> 8);
  319. /* Check the chip type and revision in order to set the correct send command
  320.    CS8920 revision C and CS8900 revision F can use the faster send.
  321. */
  322. /*   lp->send_cmd = TX_AFTER_381; */
  323.    lp->send_cmd = TX_AFTER_ALL; 
  324. /*
  325. if (lp->chip_type == CS8900 && lp->chip_revision >= 'F')
  326. lp->send_cmd = TX_NOW;
  327. if (lp->chip_type != CS8900 && lp->chip_revision >= 'C')
  328. lp->send_cmd = TX_NOW;
  329. */
  330. reset_chip(dev);
  331. if (net_debug  &&  version_printed++ == 0)
  332. printk(version);
  333. printk(KERN_INFO "%s: cs89%c0%s rev %c Base %x",
  334.        dev->name,
  335.        lp->chip_type==CS8900 ? '0' : '2',
  336.        lp->chip_type==CS8920M ? "M" : "",
  337.        lp->chip_revision,
  338.        (unsigned int )dev->base_addr);
  339. MacAddr[0] = 0x0000;
  340. MacAddr[1] = 0x24f0;
  341. MacAddr[2] = 0x5b05;
  342.    
  343. for (i = 0; i < ETH_ALEN/2; i++)
  344. {
  345. dev->dev_addr[i*2]   = MacAddr[i];
  346. dev->dev_addr[i*2+1] = MacAddr[i] >> 8;
  347. }
  348. dev->irq = IRQ_LAN;
  349. printk(KERN_INFO ", IRQ %d", dev->irq);
  350. /* print the ethernet address. */
  351. printk(", MAC ");
  352. for (i = 0; i < ETH_ALEN; i++)
  353. {
  354. printk("%s%02X", i ? ":" : "", dev->dev_addr[i]);
  355. }
  356. printk("n");
  357. dev->open = net_open;
  358. dev->stop = net_close;
  359. dev->tx_timeout = net_timeout;
  360. dev->watchdog_timeo = 3 * HZ ;
  361. dev->hard_start_xmit  = net_send_packet;
  362. dev->get_stats = net_get_stats;
  363. dev->set_multicast_list = set_multicast_list;
  364. dev->set_mac_address  = set_mac_address;
  365. /* Fill in the fields of the device structure with ethernet values. */
  366. ether_setup(dev);
  367. return 0;
  368. out1:
  369. kfree(dev->priv);
  370. dev->priv = 0;
  371. out:
  372. return retval;
  373. }
  374. void  __init reset_chip(struct net_device *dev)
  375. {
  376. int reset_start_time;
  377. writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
  378. /* wait 30 ms */
  379. current->state = TASK_INTERRUPTIBLE;
  380. schedule_timeout(30*HZ/1000);
  381. /* Wait until the chip is reset */
  382. reset_start_time = jiffies;
  383. while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 &&
  384. jiffies - reset_start_time < 4)
  385. ;
  386. }
  387. /* Open/initialize the board.  This is called (in the current kernel)
  388.    sometime after booting when the 'ifconfig' program is run.
  389.    This routine should set everything up anew at each open, even
  390.    registers that "should" only need to be set once at boot, so that
  391.    there is non-reboot way to recover if something goes wrong.
  392.    */
  393. /* AKPM: do we need to do any locking here? */
  394. static int
  395. net_open(struct net_device *dev)
  396. {
  397. struct net_local *lp = (struct net_local *)dev->priv;
  398. int i;
  399. #ifdef CONFIG_S3C2410_SMDK
  400.     EINTPEND |= (1 << 9); /* External Interrupt Pending clear */
  401.     SRCPND |= (1 << 5); /* EINT8_23 source pending clear */
  402.     INTPND |= (1 << 5); /* EINT8_23 interrupt pending clear */
  403.     INTMOD &= ~(1 << 5); /* IRQ interrupt mode */
  404.     INTMSK &= ~(1 << 5); /* interrupt service available */
  405.     EXTINT1 &= ~(7 << 4);
  406.     EXTINT1 |= (4 << 4); /* EINT9 rising edge */
  407.     EINTMASK &= ~(1 << 9); /* External Interrupt Enable */
  408. #endif
  409. /* Prevent the crystal chip from generating interrupts */
  410. writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) & ~ENABLE_IRQ);
  411.         enable_irq(IRQ_EINT8_23);
  412. /* Grab the interrupt */
  413. if (request_irq(dev->irq, &net_interrupt, SA_SHIRQ, "cs89x0", dev))
  414. {
  415. if (net_debug)
  416. printk("cerf89x0: request_irq(%d) failedn", dev->irq);
  417. return -EAGAIN;
  418. }
  419. /* Set up the IRQ - Apparently magic */
  420. if (lp->chip_type == CS8900)
  421. writereg(dev, PP_CS8900_ISAINT, 0);
  422. else
  423. writereg(dev, PP_CS8920_ISAINT, 0);
  424. /* set the Ethernet address */
  425. for (i=0; i < ETH_ALEN/2; i++)
  426. writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
  427. /* Receive only error free packets addressed to this card */
  428. lp->rx_mode = 0;//RX_OK_ACCEPT | RX_IA_ACCEPT;
  429. lp->curr_rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL;
  430. writereg(dev, PP_RxCTL, DEF_RX_ACCEPT);
  431.   writereg(dev, PP_RxCFG, lp->curr_rx_cfg);
  432. writereg(dev, PP_TxCFG,
  433. TX_LOST_CRS_ENBL |
  434. TX_SQE_ERROR_ENBL |
  435. TX_OK_ENBL |
  436. TX_LATE_COL_ENBL |
  437. TX_JBR_ENBL |
  438. TX_ANY_COL_ENBL |
  439. TX_16_COL_ENBL);
  440. writereg(dev, PP_BufCFG,
  441. READY_FOR_TX_ENBL |
  442. RX_MISS_COUNT_OVRFLOW_ENBL |
  443. TX_COL_COUNT_OVRFLOW_ENBL |
  444. TX_UNDERRUN_ENBL);
  445. /* Turn on both receive and transmit operations */
  446. writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) |
  447. SERIAL_RX_ON |
  448. SERIAL_TX_ON);
  449. /* now that we've got our act together, enable everything */
  450. writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) | IO_CHANNEL_READY_ON);
  451. writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) | ENABLE_IRQ);
  452. enable_irq(dev->irq);
  453. MOD_INC_USE_COUNT;
  454. netif_start_queue(dev);
  455. return 0;
  456. }
  457. static void net_timeout(struct net_device *dev)
  458. {
  459. /* If we get here, some higher level has decided we are broken.
  460.    There should really be a "kick me" function call instead. */
  461.         printk(KERN_INFO " CS8900A device is not stable or unplugged n ");
  462. if (net_debug > 0)
  463. printk("%s: transmit timed out, %s?n", dev->name,
  464.     tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
  465. /* Try to restart the adaptor. */
  466. netif_wake_queue(dev);
  467. }
  468. static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
  469. {
  470. struct net_local *lp = (struct net_local *)dev->priv;
  471. writereg(dev, PP_BusCTL, 0x0);
  472. writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) | ENABLE_IRQ);
  473. if (net_debug > 4)
  474. {
  475. printk("%s: sent %d byte packet of type %xn",
  476. dev->name, skb->len,
  477. (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
  478. }
  479. /* keep the upload from being interrupted, since we
  480.                   ask the chip to start transmitting before the
  481.                   whole packet has been completely uploaded. */
  482. spin_lock_irq(&lp->lock);
  483. netif_stop_queue(dev);
  484. /* initiate a transmit sequence */
  485. writeword(dev, TX_CMD_PORT, lp->send_cmd); /* SW.LEE */
  486. writeword(dev, TX_LEN_PORT, skb->len); 
  487. /* Test to see if the chip has allocated memory for the packet */
  488. if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0)
  489. {
  490. /*
  491.  * Gasp!  It hasn't.  But that shouldn't happen since
  492.  * we're waiting for TxOk, so return 1 and requeue this packet.
  493.  */
  494.   lp->Gskb = skb;
  495.   spin_unlock_irq(&lp->lock);
  496.   return 0;
  497. /*   if (net_debug) */
  498.   /*   printk("cs89x0: Tx buffer not free!n"); */
  499.   /*   return 1; */
  500. }
  501. /* Write the contents of the packet */
  502. writeblock(dev, skb->data, skb->len);
  503. spin_unlock_irq(&lp->lock);
  504. dev->trans_start = jiffies;
  505. /*  
  506. netif_start_queue(dev);
  507. It NETDEV WATCHDOG time not happens , It will stop 
  508. */
  509. dev_kfree_skb(skb);
  510. /*
  511.  * We DO NOT call netif_wake_queue() here.
  512.  * We also DO NOT call netif_start_queue().
  513.  *
  514.  * Either of these would cause another bottom half run through
  515.  * net_send_packet() before this packet has fully gone out.  That causes
  516.  * us to hit the "Gasp!" above and the send is rescheduled.  it runs like
  517.  * a dog.  We just return and wait for the Tx completion interrupt handler
  518.  * to restart the netdevice layer
  519.  */
  520. return 0;
  521. }
  522. /* The typical workload of the driver:
  523.    Handle the network interface interrupts. */
  524.    
  525. static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  526. {
  527. struct net_device *dev = dev_id;
  528. struct net_local *lp;
  529. int ioaddr, status;
  530. #ifdef CONFIG_S3C2410_SMDK
  531.     EINTPEND |= (1 << 9); /* External Interrupt Pending clear */
  532.     SRCPND |= (1 << 5); /* EINT8_23 source pending clear */
  533.     INTPND |= (1 << 5); /* EINT8_23 interrupt pending clear */
  534. #endif
  535. ioaddr = dev->base_addr;
  536. lp = (struct net_local *)dev->priv;
  537. /* we MUST read all the events out of the ISQ, otherwise we'll never
  538. get interrupted again.  As a consequence, we can't have any limit
  539. on the number of times we loop in the interrupt handler.  The
  540. hardware guarantees that eventually we'll run out of events.  Of
  541. course, if you're on a slow machine, and packets are arriving
  542. faster than you can read them off, you're screwed.  Hasta la
  543. vista, baby!
  544. */
  545. while ((status = readword(dev, ISQ_PORT)))
  546. {
  547. if (net_debug > 4)
  548. printk("%s: event=%04xn", dev->name, status);
  549. switch(status & ISQ_EVENT_MASK)
  550. {
  551. case ISQ_RECEIVER_EVENT:
  552. /* Got a packet(s). */
  553. net_rx(dev);
  554. break;
  555. case ISQ_TRANSMITTER_EVENT:
  556. lp->stats.tx_packets++;
  557. netif_wake_queue(dev); /* Inform upper layers. */
  558. if ((status & ( TX_OK |
  559. TX_LOST_CRS |
  560. TX_SQE_ERROR |
  561. TX_LATE_COL |
  562. TX_16_COL)) != TX_OK)
  563. {
  564. if ((status & TX_OK) == 0) lp->stats.tx_errors++;
  565. if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++;
  566. if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++;
  567. if (status & TX_LATE_COL) lp->stats.tx_window_errors++;
  568. if (status & TX_16_COL) lp->stats.tx_aborted_errors++;
  569. }
  570. break;
  571. case ISQ_BUFFER_EVENT:
  572. if (status & READY_FOR_TX)
  573. {
  574.     /* we tried to transmit a packet earlier, but inexplicably ran out of buffers.
  575.      * That shouldn't happen since we only ever load one packet.
  576.      * Shrug. Do the right thing anyway. 
  577.      */
  578.   if ( lp->Gskb ) {
  579.     writeblock(dev,lp->Gskb->data,lp->Gskb->len);
  580.     dev->trans_start = jiffies;
  581.     dev_kfree_skb(lp->Gskb);
  582.     lp->Gskb= NULL;
  583. /*      printk(" ------------> Gskb --------> n"); */
  584.   } else {
  585.        
  586. netif_wake_queue(dev); /* Inform upper layers. */
  587.   }
  588. }
  589. if (status & TX_UNDERRUN)
  590. {
  591. if (net_debug > 0)
  592. printk("%s: transmit underrunn", dev->name);
  593. lp->send_underrun++;
  594. if (lp->send_underrun == 3)
  595. lp->send_cmd = TX_AFTER_381;
  596. else if (lp->send_underrun == 6)
  597. lp->send_cmd = TX_AFTER_ALL;
  598. /*
  599.  * transmit cycle is done, although frame wasn't transmitted - this
  600.    * avoids having to wait for the upper layers to timeout on us,
  601.    * in the event of a tx underrun
  602.    */
  603. netif_wake_queue(dev); /* Inform upper layers. */
  604. }
  605. break;
  606. case ISQ_RX_MISS_EVENT:
  607. lp->stats.rx_missed_errors += (status >>6);
  608. break;
  609. case ISQ_TX_COL_EVENT:
  610. lp->stats.collisions += (status >>6);
  611. break;
  612. default:
  613. if (net_debug > 3)
  614. printk("%s: event=%04xn", dev->name, status);
  615. }
  616. }
  617. writereg(dev, PP_BusCTL,0x0); /* DISABLE_IRQ */
  618. writereg(dev, PP_BusCTL,ENABLE_IRQ);
  619. }
  620. static void
  621. count_rx_errors(int status, struct net_local *lp)
  622. {
  623. lp->stats.rx_errors++;
  624. if (status & RX_RUNT) lp->stats.rx_length_errors++;
  625. if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++;
  626. if (status & RX_CRC_ERROR)
  627. if (!(status & (RX_EXTRA_DATA|RX_RUNT)))
  628. /* per str 172 */
  629. lp->stats.rx_crc_errors++;
  630. if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++;
  631. return;
  632. }
  633. /* We have a good packet(s), get it/them out of the buffers. */
  634. static void
  635. net_rx(struct net_device *dev)
  636. {
  637. struct net_local *lp = (struct net_local *)dev->priv;
  638. struct sk_buff *skb;
  639. int status = 0, length = 0;
  640. /*  status = readreg(dev, PP_RxStatus); */
  641. status = readword(dev, RX_FRAME_PORT);
  642. if ((status & RX_OK) == 0) {
  643. count_rx_errors(status, lp);
  644. return;
  645. }
  646. /*   length = readreg(dev, PP_RxLength); */
  647. length = readword(dev, RX_FRAME_PORT);
  648. /* Malloc up new buffer. */
  649. skb = alloc_skb(length+2, GFP_ATOMIC);
  650. skb_reserve(skb, 2);
  651. if (skb == NULL)
  652. {
  653. lp->stats.rx_dropped++;
  654. return;
  655. }
  656. skb->len = length;
  657. skb->dev = dev;
  658. readblock(dev, skb->data, skb->len);
  659. if (net_debug > 4)
  660. {
  661. printk("%s: received %d byte packet of type %xn",
  662. dev->name, length,
  663. (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
  664. }
  665. skb->protocol=eth_type_trans(skb,dev);
  666. netif_rx(skb);
  667. lp->stats.rx_packets++;
  668. lp->stats.rx_bytes+=skb->len;
  669. return;
  670. }
  671. /* The inverse routine to net_open(). */
  672. static int
  673. net_close(struct net_device *dev)
  674. {
  675. netif_stop_queue(dev);
  676. writereg(dev, PP_RxCFG, 0);
  677. writereg(dev, PP_TxCFG, 0);
  678. writereg(dev, PP_BufCFG, 0);
  679. writereg(dev, PP_BusCTL, 0);
  680. free_irq(dev->irq, dev);
  681. /* Update the statistics here. */
  682. MOD_DEC_USE_COUNT;
  683. return 0;
  684. }
  685. /* Get the current statistics. This may be called with the card open or
  686.    closed. */
  687. static struct net_device_stats *
  688. net_get_stats(struct net_device *dev)
  689. {
  690. struct net_local *lp = (struct net_local *)dev->priv;
  691. unsigned long flags;
  692. spin_lock_irqsave(&lp->lock, flags);
  693. /* Update the statistics from the device registers. */
  694. lp->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6);
  695. lp->stats.collisions += (readreg(dev, PP_TxCol) >> 6);
  696. spin_unlock_irqrestore(&lp->lock, flags);
  697. return &lp->stats;
  698. }
  699. static void set_multicast_list(struct net_device *dev)
  700. {
  701. struct net_local *lp = (struct net_local *)dev->priv;
  702. unsigned long flags;
  703. spin_lock_irqsave(&lp->lock, flags);
  704. if(dev->flags&IFF_PROMISC)
  705. {
  706. lp->rx_mode = RX_ALL_ACCEPT;
  707. }
  708. else if((dev->flags&IFF_ALLMULTI)||dev->mc_list)
  709. {
  710. /* The multicast-accept list is initialized to accept-all, and we
  711.    rely on higher-level filtering for now. */
  712. lp->rx_mode = RX_MULTCAST_ACCEPT;
  713. else
  714. lp->rx_mode = 0;
  715. writereg(dev, PP_RxCTL, DEF_RX_ACCEPT | lp->rx_mode);
  716. /* in promiscuous mode, we accept errored packets, so we have to enable interrupts on them also */
  717. writereg(dev, PP_RxCFG, lp->curr_rx_cfg |
  718.      (lp->rx_mode == RX_ALL_ACCEPT? (RX_CRC_ERROR_ENBL|RX_RUNT_ENBL|RX_EXTRA_DATA_ENBL) : 0));
  719. spin_unlock_irqrestore(&lp->lock, flags);
  720. }
  721. static int set_mac_address(struct net_device *dev, void *addr)
  722. {
  723. int i;
  724. if (netif_running(dev))
  725. return -EBUSY;
  726. if (net_debug)
  727. {
  728. printk("%s: Setting MAC address to ", dev->name);
  729. for (i = 0; i < 6; i++)
  730. printk(" %2.2x", dev->dev_addr[i] = ((unsigned char *)addr)[i]);
  731. printk(".n");
  732. }
  733. /* set the Ethernet address */
  734. for (i=0; i < ETH_ALEN/2; i++)
  735. writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
  736. return 0;
  737. }
  738. static char namespace[16] = "";
  739. static struct net_device dev_cs89x0 = {
  740.         "",
  741.         0, 0, 0, 0,
  742.         0, 0,
  743.         0, 0, 0, NULL, NULL };
  744. /*
  745.  * Support the 'debug' module parm even if we're compiled for non-debug to 
  746.  * avoid breaking someone's startup scripts 
  747.  */
  748. static int debug = 1;
  749. static char media[8];
  750. static int duplex = 0;
  751. int
  752. init_s3c2410(void)
  753. {
  754. struct net_local *lp;
  755. #if DEBUGGING
  756. net_debug = debug;
  757. #endif
  758. dev_cs89x0.init = cerf89x0_probe;
  759. dev_cs89x0.priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
  760. if (dev_cs89x0.priv == 0)
  761. {
  762. printk(KERN_ERR "cs89x0.c: Out of memory.n");
  763. return -ENOMEM;
  764. }
  765. memset(dev_cs89x0.priv, 0, sizeof(struct net_local));
  766. lp = (struct net_local *)dev_cs89x0.priv;
  767. spin_lock_init(&lp->lock);
  768. if (register_netdev(&dev_cs89x0) != 0) {
  769. printk(KERN_ERR "cerf89x0.c: No chip found n");
  770. return -ENXIO;
  771. }
  772.     return 0;
  773. }
  774. void
  775. cleanup_s3c2410(void) 
  776. {
  777. writeword(&dev_cs89x0, ADD_PORT, PP_ChipID);
  778. if (dev_cs89x0.priv != NULL) {
  779. /* Free up the private structure, or leak memory :-)  */
  780. unregister_netdev(&dev_cs89x0);
  781. kfree(dev_cs89x0.priv);
  782. dev_cs89x0.priv = NULL; /* gets re-allocated by cerf89x0_probe1 */
  783. /* If we don't do this, we can't re-insmod it later. */
  784. release_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT);
  785. }
  786. }
  787. module_init(init_s3c2410);
  788. module_exit(cleanup_s3c2410);