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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * cs8900a.c: A Crystal Semiconductor (Now Cirrus Logic) CS8900A
  3. driver for SMDK-s3c2410 (based on cs89x0.c)
  4.  *
  5.  * Author: Yong-iL Joh <tolkien@mizi.com>
  6.  * Date  : $Date: 2002/10/16 09:08:07 $ 
  7.  *
  8.  * $Revision: 1.1.2.5 $
  9.    Wed Aug 14 2002 Yong-iL Joh <tolkien@mizi.com>
  10.    - initial, based on cs89x0.c
  11.    Wed Aug 16 2002 Yong-iL Joh <tolkien@mizi.com>
  12.    - working!
  13.  *
  14.  * This file is subject to the terms and conditions of the GNU General Public
  15.  * License.  See the file COPYING in the main directory of this archive
  16.  * for more details.
  17.  */
  18. #include <linux/config.h>
  19. #include <linux/kernel.h>
  20. #include <linux/module.h>
  21. #include <linux/init.h>
  22. #include <linux/slab.h>
  23. #include <linux/errno.h>
  24. #include <linux/spinlock.h>
  25. #include <linux/ioport.h>
  26. #include <linux/netdevice.h>
  27. #include <linux/etherdevice.h>
  28. #include <linux/skbuff.h>
  29. #include <asm/io.h>
  30. #include <asm/irq.h>
  31. #include <asm/hardware.h>
  32. #define IRQ_LAN        IRQ_CS8900
  33. #include "cs89x0.h"
  34. /*
  35.  * Set this to zero to remove all the debug statements via
  36.  * dead code elimination
  37.  */
  38. #undef DEBUGGING 4
  39. #if DEBUGGING
  40. #define DPRINTK(n, args...)
  41. if (n <= DEBUGGING) {
  42. printk(args);
  43. }
  44. #else
  45. #define DPRINTK(n, args...)
  46. #endif
  47. #if DEBUGGING
  48. static char version[] __initdata =
  49. "cs89x0.c: v2.4.3-pre1 Russell Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>n";
  50. #endif
  51. /* First, a few definitions that the brave might change.
  52.    A zero-terminated list of I/O addresses to be probed. Some special flags..
  53.       Addr & 1 = Read back the address port, look for signature and reset
  54.                  the page window before probing 
  55.       Addr & 3 = Reset the page window and probe 
  56.    The CLPS eval board has the Cirrus chip at 0x80090300, in ARM IO space,
  57.    but it is possible that a Cirrus board could be plugged into the ISA
  58.    slots. */
  59. static unsigned int netcard_portlist[] __initdata =
  60.    { vCS8900_BASE + 0x300, 0};
  61. /* The number of low I/O ports used by the ethercard. */
  62. #define NETCARD_IO_EXTENT 0xfff
  63. /* we allow the user to override various values normally set in the EEPROM */
  64. #define FORCE_RJ45 0x0001    /* pick one of these three */
  65. #define FORCE_AUI 0x0002
  66. #define FORCE_BNC 0x0004
  67. #define FORCE_AUTO 0x0010    /* pick one of these three */
  68. #define FORCE_HALF 0x0020
  69. #define FORCE_FULL 0x0030
  70. /* Information that need to be kept for each board. */
  71. struct net_local {
  72. struct net_device_stats stats;
  73. int chip_type; /* one of: CS8900, CS8920, CS8920M */
  74. char chip_revision; /* revision letter of the chip ('A'...) */
  75. int send_cmd; /* the proper send command:
  76.    TX_NOW, TX_AFTER_381, or TX_AFTER_ALL */
  77. int auto_neg_cnf; /* auto-negotiation word from EEPROM */
  78. int adapter_cnf; /* adapter configuration from EEPROM */
  79. int isa_config; /* ISA configuration from EEPROM */
  80. int irq_map; /* IRQ map from EEPROM */
  81. int rx_mode; /* what mode are we in?
  82.    0, RX_MULTCAST_ACCEPT, or RX_ALL_ACCEPT */
  83. int curr_rx_cfg; /* a copy of PP_RxCFG */
  84. int linectl; /* either 0 or LOW_RX_SQUELCH,
  85.    depending on configuration. */
  86. int send_underrun; /* keep track of how many underruns
  87.    in a row we get */
  88. int force; /* force various values; see FORCE* above. */
  89. spinlock_t lock;
  90. };
  91. /* Index to functions, as function prototypes. */
  92. extern int cs89x0_probe(struct net_device *dev);
  93. static int cs89x0_probe1(struct net_device *dev, int ioaddr);
  94. static int net_open(struct net_device *dev);
  95. static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
  96. static void net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  97. static void set_multicast_list(struct net_device *dev);
  98. static void net_timeout(struct net_device *dev);
  99. static void net_rx(struct net_device *dev);
  100. static int net_close(struct net_device *dev);
  101. static struct net_device_stats *net_get_stats(struct net_device *dev);
  102. static void reset_chip(struct net_device *dev);
  103. static int set_mac_address(struct net_device *dev, void *addr);
  104. static void count_rx_errors(int status, struct net_local *lp);
  105. /* Example routines you must write ;->. */
  106. #define tx_done(dev) 1
  107. /* Check for a network adaptor of this type, and return '0' iff one exists.
  108.    If dev->base_addr == 0, probe all likely locations.
  109.    If dev->base_addr == 1, always return failure.
  110.    If dev->base_addr == 2, allocate space for the device and return success
  111.    (detachable devices only).
  112.    Return 0 on success.
  113.    */
  114. int __init cs89x0_probe(struct net_device *dev) {
  115.     int i;
  116.     SET_MODULE_OWNER(dev);
  117.     DPRINTK(1, "cs89x0:cs89x0_probe(0x%x)n", base_addr);
  118.     BWSCON = (BWSCON & ~(BWSCON_ST3 | BWSCON_WS3 | BWSCON_DW3)) |
  119.       (BWSCON_ST3 | BWSCON_WS3 | BWSCON_DW(3, BWSCON_DW_16));
  120.     BANKCON3= BANKCON_Tacs0 | BANKCON_Tcos4 | BANKCON_Tacc14 |
  121.       BANKCON_Toch1 | BANKCON_Tcah4 | BANKCON_Tacp6 | BANKCON_PMC1;
  122.     set_external_irq(IRQ_CS8900, EXT_RISING_EDGE, GPIO_PULLUP_DIS);
  123.     for (i = 0; netcard_portlist[i]; i++) {
  124.       if (cs89x0_probe1(dev, netcard_portlist[i]) == 0)
  125. return 0;
  126.     }
  127.     printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected."
  128.    "Be sure to disable PnP with SETUPn");
  129.     return -ENODEV;
  130. }
  131. inline int readreg(struct net_device *dev, int portno) {
  132. outw(portno, dev->base_addr + ADD_PORT);
  133. return inw(dev->base_addr + DATA_PORT);
  134. }
  135. inline void writereg(struct net_device *dev, int portno, int value) {
  136. outw(portno, dev->base_addr + ADD_PORT);
  137. outw(value, dev->base_addr + DATA_PORT);
  138. }
  139. inline int readword(struct net_device *dev, int portno) {
  140. return inw(dev->base_addr + portno);
  141. }
  142. inline void writeword(struct net_device *dev, int portno, int value) {
  143. outw(value, dev->base_addr + portno);
  144. }
  145. inline void writeblock(struct net_device *dev, char *pData, int Length) {
  146.     int i;
  147.     for (i = 0 ; i < (Length/2); i++) {
  148.         writeword(dev, TX_FRAME_PORT, *(u16 *)pData );
  149.         pData += 2;
  150.     }
  151.     if (Length % 2) {
  152.         u16 OddWordValue = *pData;
  153.         writeword(dev, TX_FRAME_PORT, OddWordValue);
  154.     }
  155. }
  156. inline void readblock(struct net_device *dev, char *pData, int Length) {
  157.     u16 InputWord;
  158.     int i;
  159.     for (i=0; i < (Length/2); i++) {
  160.         InputWord = readword(dev, RX_FRAME_PORT);
  161.         *(u8*)pData++ = (u8) InputWord & 0xFF;
  162.         *(u8*)pData++ = (u8) (InputWord >> 8) & 0xFF;
  163.     }
  164.     if (Length & 0x1)
  165.       *pData = (u8) (readword(dev, RX_FRAME_PORT) & 0xff);
  166. }
  167. /* This is the real probe routine.  Linux has a history of friendly device
  168.    probes on the ISA bus.  A good device probes avoids doing writes, and
  169.    verifies that the correct device exists and functions.
  170.    Return 0 on success.
  171.  */
  172. static int __init cs89x0_probe1(struct net_device *dev, int ioaddr) {
  173.     struct net_local *lp;
  174. #if DEBUGGING
  175.     static unsigned version_printed;
  176. #endif
  177.     unsigned rev_type = 0;
  178.     int ret;
  179.     /* Initialize the device structure. */
  180.     if (dev->priv == NULL) {
  181.       dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
  182.       if (dev->priv == 0) {
  183. ret = -ENOMEM;
  184. goto before_kmalloc;
  185.       }
  186.       lp = (struct net_local *)dev->priv;
  187.       memset(lp, 0, sizeof(*lp));
  188.       spin_lock_init(&lp->lock);
  189.     }
  190.     lp = (struct net_local *)dev->priv;
  191.     /* Fill in the 'dev' fields. */
  192.     dev->base_addr = ioaddr;
  193.     /*  Bus Reset Consideration  */
  194.     ret = readword(dev, ADD_PORT);
  195.     if ((ret & ADD_MASK) != ADD_SIG ) {
  196.       DPRINTK(1, __FUNCTION__ " 0x%08Xn", ret);
  197.       ret = -ENODEV;
  198.       goto after_kmalloc;
  199.     }
  200.     /* get the chip type */
  201.     rev_type = readreg(dev, PRODUCT_ID_ADD);
  202.     lp->chip_type = rev_type &~ REVISON_BITS;
  203.     lp->chip_revision = ((rev_type & REVISON_BITS) >> 8) + 'A';
  204. #if DEBUGGING
  205.     if (version_printed++ == 0)
  206.       printk(version);
  207. #endif
  208.     printk(KERN_INFO "%s: cs89%c0%s rev %c(%s) found at %#3lxn",
  209.    dev->name,
  210.    lp->chip_type==CS8900 ? '0' : '2',
  211.    lp->chip_type==CS8920M ? "M" : "",
  212.    lp->chip_revision,
  213.    readreg(dev, PP_SelfST) & ACTIVE_33V ? "3.3 Volts" : "5 Volts",
  214.    dev->base_addr);
  215.     if (lp->chip_type != CS8900) {
  216.       printk(__FILE__ ": wrong device driver!n");
  217.       ret = -ENODEV;
  218.       goto after_kmalloc;
  219.     }
  220.     /* Check the chip type and revision in order to
  221.        set the correct send command
  222.        CS8900 revision F can use the faster send. */
  223.     lp->send_cmd = TX_AFTER_ALL;
  224.     if (lp->chip_type == CS8900 && lp->chip_revision >= 'F')
  225.       lp->send_cmd = TX_NOW;
  226.     reset_chip(dev);
  227.     lp->adapter_cnf = A_CNF_10B_T | A_CNF_MEDIA_10B_T;
  228.     lp->auto_neg_cnf = EE_AUTO_NEG_ENABLE;
  229.     printk(KERN_INFO "cs89x0 media %s%s",
  230.    (lp->adapter_cnf & A_CNF_10B_T)?"RJ-45":"",
  231.    (lp->adapter_cnf & A_CNF_AUI)?"AUI":"");
  232.     dev->dev_addr[0] = 0x00;
  233.     dev->dev_addr[1] = 0x00;
  234.     dev->dev_addr[2] = 0xc0;
  235.     dev->dev_addr[3] = 0xff;
  236.     dev->dev_addr[4] = 0xee;
  237.     dev->dev_addr[5] = 0x08;
  238.     set_mac_address(dev, dev->dev_addr);
  239.     dev->irq = IRQ_LAN;
  240.     printk(", IRQ %d", dev->irq);
  241.     dev->open = net_open;
  242.     dev->stop = net_close;
  243.     dev->tx_timeout = net_timeout;
  244.     dev->watchdog_timeo = 3 * HZ;
  245.     dev->hard_start_xmit = net_send_packet;
  246.     dev->get_stats = net_get_stats;
  247.     dev->set_multicast_list = set_multicast_list;
  248.     dev->set_mac_address  = set_mac_address;
  249.     /* Fill in the fields of the device structure with ethernet values. */
  250.     ether_setup(dev);
  251.     printk("n");
  252.     DPRINTK(1, "cs89x0_probe1() successfuln");
  253.     return 0;
  254.  after_kmalloc:
  255.     kfree(dev->priv);
  256.  before_kmalloc:
  257.     return ret;
  258. }
  259. void  __init reset_chip(struct net_device *dev)
  260. {
  261.     int reset_start_time;
  262.     writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
  263.     /* wait 30 ms */
  264.     current->state = TASK_INTERRUPTIBLE;
  265.     schedule_timeout(30*HZ/1000);
  266.     /* Wait until the chip is reset */
  267.     reset_start_time = jiffies;
  268.     while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 &&
  269.    jiffies - reset_start_time < 4)
  270.       ;
  271. }
  272. /* Open/initialize the board.  This is called (in the current kernel)
  273.    sometime after booting when the 'ifconfig' program is run.
  274.    This routine should set everything up anew at each open, even
  275.    registers that "should" only need to be set once at boot, so that
  276.    there is non-reboot way to recover if something goes wrong.
  277.    */
  278. static int net_open(struct net_device *dev)
  279. {
  280.     struct net_local *lp = (struct net_local *)dev->priv;
  281.     int ret;
  282.     /* Prevent the crystal chip from generating interrupts */
  283.     writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) & ~ENABLE_IRQ);
  284.     ret = request_irq(dev->irq, &net_interrupt, SA_SHIRQ, "cs89x0", dev);
  285.     if (ret) {
  286.       printk("%s: request_irq(%d) failedn", dev->name, dev->irq);
  287.       goto bad_out;
  288.     }
  289.     /* Set up the IRQ - Apparently magic */
  290.     if (lp->chip_type == CS8900)
  291.       writereg(dev, PP_CS8900_ISAINT, 0);
  292.     else
  293.       writereg(dev, PP_CS8920_ISAINT, 0);
  294.     /* while we're testing the interface, leave interrupts disabled */
  295.     writereg(dev, PP_BusCTL, MEMORY_ON);
  296.     /* Set the LineCTL quintuplet */
  297.     lp->linectl = 0;
  298.     /* Turn on both receive and transmit operations */
  299.     writereg(dev, PP_LineCTL,
  300.      readreg(dev, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON);
  301.     /* Receive only error free packets addressed to this card */
  302.     lp->rx_mode = 0;
  303.     writereg(dev, PP_RxCTL, DEF_RX_ACCEPT);
  304.     lp->curr_rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL;
  305.     if (lp->isa_config & STREAM_TRANSFER)
  306.       lp->curr_rx_cfg |= RX_STREAM_ENBL;
  307.     writereg(dev, PP_RxCFG, lp->curr_rx_cfg);
  308.     writereg(dev, PP_TxCFG,
  309.      TX_LOST_CRS_ENBL | TX_SQE_ERROR_ENBL | TX_OK_ENBL |
  310.      TX_LATE_COL_ENBL | TX_JBR_ENBL |
  311.      TX_ANY_COL_ENBL | TX_16_COL_ENBL);
  312.     writereg(dev, PP_BufCFG,
  313.      READY_FOR_TX_ENBL | RX_MISS_COUNT_OVRFLOW_ENBL |
  314.      TX_COL_COUNT_OVRFLOW_ENBL | TX_UNDERRUN_ENBL);
  315.     /* now that we've got our act together, enable everything */
  316.     writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) | ENABLE_IRQ);
  317.     enable_irq(dev->irq);
  318.     netif_start_queue(dev);
  319.     DPRINTK(1, "cs89x0: net_open() succeededn");
  320.     return 0;
  321.  bad_out:
  322.     return ret;
  323. }
  324. static void net_timeout(struct net_device *dev)
  325. {
  326.   /* If we get here, some higher level has decided we are broken.
  327.      There should really be a "kick me" function call instead. */
  328.     DPRINTK(1, "%s: transmit timed out, %s?n", dev->name,
  329.     tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
  330.     /* Try to restart the adaptor. */
  331.     //netif_wake_queue(dev);
  332.     net_close(dev);
  333.     writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
  334.     net_open(dev);
  335. }
  336. static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
  337. {
  338.     struct net_local *lp = (struct net_local *)dev->priv;
  339.     writereg(dev, PP_BusCTL, 0x0);
  340.     writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL) | ENABLE_IRQ);
  341.     DPRINTK(3, "%s: sent %d byte packet of type %xn",
  342.     dev->name, skb->len,
  343.     (skb->data[ETH_ALEN+ETH_ALEN] << 8) |
  344.     (skb->data[ETH_ALEN+ETH_ALEN+1]));
  345.     /* keep the upload from being interrupted, since we
  346.        ask the chip to start transmitting before the
  347.        whole packet has been completely uploaded. */
  348.     spin_lock_irq(&lp->lock);
  349.     netif_stop_queue(dev);
  350.     /* initiate a transmit sequence */
  351.     writeword(dev, TX_CMD_PORT, lp->send_cmd);
  352.     writeword(dev, TX_LEN_PORT, skb->len);
  353.     /* Test to see if the chip has allocated memory for the packet */
  354.     if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {
  355.       /*
  356.        * Gasp!  It hasn't.  But that shouldn't happen since
  357.        * we're waiting for TxOk, so return 1 and requeue this packet.
  358.        */
  359.       spin_unlock_irq(&lp->lock);
  360.       DPRINTK(1, "cs89x0: Tx buffer not free!n");
  361.       return 1;
  362.     }
  363.     /* Write the contents of the packet */
  364.     writeblock(dev, skb->data, skb->len);
  365.     spin_unlock_irq(&lp->lock);
  366.     dev->trans_start = jiffies;
  367.     dev_kfree_skb (skb);
  368.     /*
  369.      * We DO NOT call netif_wake_queue() here.
  370.      * We also DO NOT call netif_start_queue().
  371.      *
  372.      * Either of these would cause another bottom half run through
  373.      * net_send_packet() before this packet has fully gone out.  That causes
  374.      * us to hit the "Gasp!" above and the send is rescheduled.  it runs like
  375.      * a dog.  We just return and wait for the Tx completion interrupt handler
  376.      * to restart the netdevice layer
  377.      */
  378.     return 0;
  379. }
  380. /* The typical workload of the driver:
  381.    Handle the network interface interrupts. */
  382.    
  383. static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  384. {
  385.     struct net_device *dev = dev_id;
  386.     struct net_local *lp;
  387.     int ioaddr, status;
  388.     ioaddr = dev->base_addr;
  389.     lp = (struct net_local *)dev->priv;
  390.     /* we MUST read all the events out of the ISQ, otherwise we'll never
  391.        get interrupted again.  As a consequence, we can't have any limit
  392.        on the number of times we loop in the interrupt handler.  The
  393.        hardware guarantees that eventually we'll run out of events.  Of
  394.        course, if you're on a slow machine, and packets are arriving
  395.        faster than you can read them off, you're screwed.  Hasta la
  396.        vista, baby!  */
  397.     while ((status = readword(dev, ISQ_PORT))) {
  398.       DPRINTK(4, "%s: event=%04xn", dev->name, status);
  399.       switch(status & ISQ_EVENT_MASK) {
  400.       case ISQ_RECEIVER_EVENT:
  401. /* Got a packet(s). */
  402. net_rx(dev);
  403. break;
  404.       case ISQ_TRANSMITTER_EVENT:
  405. lp->stats.tx_packets++;
  406. netif_wake_queue(dev); /* Inform upper layers. */
  407. if ((status & ( TX_OK |
  408. TX_LOST_CRS | TX_SQE_ERROR |
  409. TX_LATE_COL | TX_16_COL)) != TX_OK) {
  410.   if ((status & TX_OK) == 0) lp->stats.tx_errors++;
  411.   if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++;
  412.   if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++;
  413.   if (status & TX_LATE_COL) lp->stats.tx_window_errors++;
  414.   if (status & TX_16_COL) lp->stats.tx_aborted_errors++;
  415. }
  416. break;
  417.       case ISQ_BUFFER_EVENT:
  418. if (status & READY_FOR_TX) {
  419.   /* we tried to transmit a packet earlier,
  420.      but inexplicably ran out of buffers.
  421.      That shouldn't happen since we only ever
  422.      load one packet.  Shrug.  Do the right
  423.      thing anyway. */
  424.   netif_wake_queue(dev); /* Inform upper layers. */
  425. }
  426. if (status & TX_UNDERRUN) {
  427.   DPRINTK(1, "%s: transmit underrunn", dev->name);
  428.   lp->send_underrun++;
  429.   if (lp->send_underrun == 3) lp->send_cmd = TX_AFTER_381;
  430.   else if (lp->send_underrun == 6) lp->send_cmd = TX_AFTER_ALL;
  431.   /* transmit cycle is done, although
  432.      frame wasn't transmitted - this
  433.      avoids having to wait for the upper
  434.      layers to timeout on us, in the
  435.      event of a tx underrun */
  436.   netif_wake_queue(dev); /* Inform upper layers. */
  437. }
  438. break;
  439.       case ISQ_RX_MISS_EVENT:
  440. lp->stats.rx_missed_errors += (status >>6);
  441. break;
  442.       case ISQ_TX_COL_EVENT:
  443. lp->stats.collisions += (status >>6);
  444. break;
  445.       }
  446.     }
  447. }
  448. static void count_rx_errors(int status, struct net_local *lp) {
  449.     lp->stats.rx_errors++;
  450.     if (status & RX_RUNT) lp->stats.rx_length_errors++;
  451.     if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++;
  452.     if (status & RX_CRC_ERROR) if (!(status & (RX_EXTRA_DATA|RX_RUNT)))
  453.       /* per str 172 */
  454.       lp->stats.rx_crc_errors++;
  455.     if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++;
  456.     return;
  457. }
  458. /* We have a good packet(s), get it/them out of the buffers. */
  459. static void net_rx(struct net_device *dev) {
  460.     struct net_local *lp = (struct net_local *)dev->priv;
  461.     struct sk_buff *skb;
  462.     int status, length;
  463.     int ioaddr = dev->base_addr;
  464.     status = inw(ioaddr + RX_FRAME_PORT);
  465.     if ((status & RX_OK) == 0) {
  466.       count_rx_errors(status, lp);
  467.       return;
  468.     }
  469.     length = inw(ioaddr + RX_FRAME_PORT);
  470.     /* Malloc up new buffer. */
  471.     skb = dev_alloc_skb(length + 2);
  472.     if (skb == NULL) {
  473.       lp->stats.rx_dropped++;
  474.       return;
  475.     }
  476.     skb_reserve(skb, 2); /* longword align L3 header */
  477.     skb->len = length;
  478.     skb->dev = dev;
  479.     readblock(dev, skb->data, skb->len);
  480.     DPRINTK(3, "%s: received %d byte packet of type %xn",
  481.     dev->name, length,
  482.     (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
  483.     skb->protocol=eth_type_trans(skb,dev);
  484.     netif_rx(skb);
  485.     dev->last_rx = jiffies;
  486.     lp->stats.rx_packets++;
  487.     lp->stats.rx_bytes += length;
  488. }
  489. /* The inverse routine to net_open(). */
  490. static int net_close(struct net_device *dev)
  491. {
  492. netif_stop_queue(dev);
  493. writereg(dev, PP_RxCFG, 0);
  494. writereg(dev, PP_TxCFG, 0);
  495. writereg(dev, PP_BufCFG, 0);
  496. writereg(dev, PP_BusCTL, 0);
  497. free_irq(dev->irq, dev);
  498. /* Update the statistics here. */
  499. return 0;
  500. }
  501. /* Get the current statistics. This may be called with the card open or
  502.    closed. */
  503. static struct net_device_stats *
  504. net_get_stats(struct net_device *dev)
  505. {
  506. struct net_local *lp = (struct net_local *)dev->priv;
  507. unsigned long flags;
  508. spin_lock_irqsave(&lp->lock, flags);
  509. /* Update the statistics from the device registers. */
  510. lp->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6);
  511. lp->stats.collisions += (readreg(dev, PP_TxCol) >> 6);
  512. spin_unlock_irqrestore(&lp->lock, flags);
  513. return &lp->stats;
  514. }
  515. static void set_multicast_list(struct net_device *dev)
  516. {
  517. struct net_local *lp = (struct net_local *)dev->priv;
  518. unsigned long flags;
  519. spin_lock_irqsave(&lp->lock, flags);
  520. if (dev->flags&IFF_PROMISC) {
  521. lp->rx_mode = RX_ALL_ACCEPT;
  522. } else if((dev->flags&IFF_ALLMULTI)||dev->mc_list) {
  523. /* The multicast-accept list is initialized to accept-all,
  524.    and we rely on higher-level filtering for now. */
  525. lp->rx_mode = RX_MULTCAST_ACCEPT;
  526. } else
  527. lp->rx_mode = 0;
  528. writereg(dev, PP_RxCTL, DEF_RX_ACCEPT | lp->rx_mode);
  529. /* in promiscuous mode, we accept errored packets,
  530.    so we have to enable interrupts on them also */
  531. writereg(dev, PP_RxCFG, lp->curr_rx_cfg |
  532.  (lp->rx_mode == RX_ALL_ACCEPT ?
  533.   (RX_CRC_ERROR_ENBL|RX_RUNT_ENBL|RX_EXTRA_DATA_ENBL) : 0));
  534. spin_unlock_irqrestore(&lp->lock, flags);
  535. }
  536. static int set_mac_address(struct net_device *dev, void *addr)
  537. {
  538.     int i;
  539.     if (netif_running(dev))
  540.       return -EBUSY;
  541.     DPRINTK(1, "%s: Setting MAC address to ", dev->name);
  542.     for (i = 0; i < 6; i++) {
  543.       dev->dev_addr[i] = ((unsigned char *)addr)[i];
  544.       DPRINTK(1, " %2.2x", dev->dev_addr[i]);
  545.     }
  546.     DPRINTK(1, ".n");
  547.     /* set the Ethernet address */
  548.     for (i=0; i < ETH_ALEN/2; i++)
  549.       writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
  550.     return 0;
  551. }
  552. #ifdef MODULE
  553. static struct net_device dev_cs89x0 = {
  554.         "",
  555.         0, 0, 0, 0,
  556.         0, 0,
  557.         0, 0, 0, NULL, NULL };
  558. /*
  559.  * Support the 'debug' module parm even if we're compiled for non-debug to 
  560.  * avoid breaking someone's startup scripts 
  561.  */
  562. static int io = 0xd0000300;
  563. static int irq = IRQ_LAN;
  564. static char media[8];
  565. static int duplex= 0;
  566. MODULE_PARM(io, "i");
  567. MODULE_PARM(irq, "i");
  568. MODULE_PARM(media, "c8");
  569. MODULE_PARM(duplex, "i");
  570. MODULE_PARM_DESC(io, "cs89x0 I/O base address");
  571. MODULE_PARM_DESC(irq, "cs89x0 IRQ number");
  572. MODULE_PARM_DESC(media, "Set cs89x0 adapter(s) media type(s) (rj45,bnc,aui)");
  573. /* No other value than -1 for duplex seems to be currently interpreted */
  574. MODULE_PARM_DESC(duplex, "(ignored)");
  575. MODULE_AUTHOR("Mike Cruse, Russwll Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>");
  576. MODULE_LICENSE("GPL");
  577. EXPORT_NO_SYMBOLS;
  578. /*
  579. * media=t             - specify media type
  580.    or media=2
  581.    or media=aui
  582.    or medai=auto
  583. * duplex=0            - specify forced half/full/autonegotiate duplex
  584. * debug=#             - debug level
  585. * Default Chip Configuration:
  586.   * DMA Burst = enabled
  587.   * IOCHRDY Enabled = enabled
  588.     * UseSA = enabled
  589.     * CS8900 defaults to half-duplex if not specified on command-line
  590.     * CS8920 defaults to autoneg if not specified on command-line
  591.     * Use reset defaults for other config parameters
  592. * Assumptions:
  593.   * media type specified is supported (circuitry is present)
  594.   * if memory address is > 1MB, then required mem decode hw is present
  595.   * if 10B-2, then agent other than driver will enable DC/DC converter
  596.     (hw or software util)
  597. */
  598. static int __init init_cs8900a_s3c2410(void) {
  599.     struct net_local *lp;
  600.     int ret = 0;
  601.     dev_cs89x0.irq = irq;
  602.     dev_cs89x0.base_addr = io;
  603.     dev_cs89x0.init = cs89x0_probe;
  604.     dev_cs89x0.priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
  605.     if (dev_cs89x0.priv == 0) {
  606.       printk(KERN_ERR "cs89x0.c: Out of memory.n");
  607.       return -ENOMEM;
  608.     }
  609.     memset(dev_cs89x0.priv, 0, sizeof(struct net_local));
  610.     lp = (struct net_local *)dev_cs89x0.priv;
  611.     request_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT, "cs8900a");
  612.     spin_lock_init(&lp->lock);
  613.     /* boy, they'd better get these right */
  614.     if (!strcmp(media, "rj45"))
  615.       lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
  616.     else if (!strcmp(media, "aui"))
  617.       lp->adapter_cnf = A_CNF_MEDIA_AUI   | A_CNF_AUI;
  618.     else if (!strcmp(media, "bnc"))
  619.       lp->adapter_cnf = A_CNF_MEDIA_10B_2 | A_CNF_10B_2;
  620.     else
  621.       lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
  622.     if (duplex==-1)
  623.       lp->auto_neg_cnf = AUTO_NEG_ENABLE;
  624.     if (io == 0) {
  625.       printk(KERN_ERR "cs89x0.c: Module autoprobing not allowed.n");
  626.       printk(KERN_ERR "cs89x0.c: Append io=0xNNNn");
  627.       ret = -EPERM;
  628.       goto out;
  629.     }
  630.     if (register_netdev(&dev_cs89x0) != 0) {
  631.       printk(KERN_ERR "cs89x0.c: No card found at 0x%xn", io);
  632.       ret = -ENXIO;
  633.       goto out;
  634.     }
  635. out:
  636.     if (ret)
  637.       kfree(dev_cs89x0.priv);
  638.     return ret;
  639. }
  640. static void __exit cleanup_cs8900a_s3c2410(void) {
  641.     if (dev_cs89x0.priv != NULL) {
  642.       /* Free up the private structure, or leak memory :-)  */
  643.       unregister_netdev(&dev_cs89x0);
  644.       outw(PP_ChipID, dev_cs89x0.base_addr + ADD_PORT);
  645.       kfree(dev_cs89x0.priv);
  646.       dev_cs89x0.priv = NULL; /* gets re-allocated by cs89x0_probe1 */
  647.       /* If we don't do this, we can't re-insmod it later. */
  648.       release_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT);
  649.     }
  650. }
  651. module_init(init_cs8900a_s3c2410);
  652. module_exit(cleanup_cs8900a_s3c2410);
  653. #endif
  654. /*
  655.  | $Id: cs8900a.c,v 1.1.2.5 2002/10/16 09:08:07 tolkien Exp $
  656.  |
  657.  | Local Variables:
  658.  | mode: c
  659.  | mode: font-lock
  660.  | version-control: t
  661.  | delete-old-versions: t
  662.  | End:
  663.  |
  664.  | -*- End-Of-File -*-
  665.  */