added change log to natsemi.c
authorUdayan Kumar <udayan.kumar@gmail.com>
Tue, 3 Jul 2007 02:45:50 +0000 (22:45 -0400)
committerUdayan Kumar <udayan.kumar@gmail.com>
Sun, 15 Jul 2007 01:08:05 +0000 (21:08 -0400)
src/drivers/net/natsemi.c

index 5d3a028..d658bb6 100644 (file)
@@ -1,7 +1,66 @@
-/* natsemi.c - gPXE driver for the NatSemi DP8381x series. 
+/* natsemi.c - gPXE driver for the NatSemi DP8381x series. */
+
+/*
+
  
+   natsemi.c: An Etherboot driver for the NatSemi DP8381x series.
+
+   Copyright (C) 2001 Entity Cyber, Inc.
+   
+   This development of this Etherboot driver was funded by 
+   
+      Sicom Systems: http://www.sicompos.com/
+   
+   Author: Marty Connor (mdc@thinguin.org)        
+   Adapted from a Linux driver which was written by Donald Becker
+   
+   This software may be used and distributed according to the terms
+   of the GNU Public License (GPL), incorporated herein by reference.
+   
+   Original Copyright Notice:
+   
+   Written/copyright 1999-2001 by Donald Becker.
+   
+   This software may be used and distributed according to the terms of
+   the GNU General Public License (GPL), incorporated herein by reference.
+   Drivers based on or derived from this code fall under the GPL and must
+   retain the authorship, copyright and license notice.  This file is not
+   a complete program and may only be used when the entire operating
+   system is licensed under the GPL.  License for under other terms may be
+   available.  Contact the original author for details.
+   
+   The original author may be reached as becker@scyld.com, or at
+   Scyld Computing Corporation
+   410 Severn Ave., Suite 210
+   Annapolis MD 21403
+   
+   Support information and updates available at
+   http://www.scyld.com/network/netsemi.html
+   
+   References:
+   
+   http://www.scyld.com/expert/100mbps.html
+   http://www.scyld.com/expert/NWay.html
+   Datasheet is available from:
+   http://www.national.com/pf/DP/DP83815.html
+
+*/
+
+/* Revision History */
 
+/*
+  02 JUL 2007 Udayan Kumar      1.2 ported the driver from etherboot to gPXE API
+                                Added a circular buffer for transmit and receive.
+                                transmit routine will not wait for transmission to finish
+                                poll routine deals with it.
+
+  13 Dec 2003 timlegge                 1.1 Enabled Multicast Support
+  29 May 2001  mdc                     1.0
+     Initial Release.                  Tested with Netgear FA311 and FA312 boards
 */
+
+
 
 #include <stdint.h>
 #include <stdlib.h>
 
 #define TX_RING_SIZE 4
 #define NUM_RX_DESC  4
+#define RX_BUF_SIZE 1536
+#define OWN       0x80000000
+#define DSIZE     0x00000FFF
+#define CRC_SIZE  4
 
 struct natsemi_tx {
        uint32_t link;
@@ -46,26 +109,13 @@ struct natsemi_nic {
         * give the same.*/
        struct io_buffer *iobuf[NUM_RX_DESC];
        /*netdev_tx_complete needs pointer to the iobuf of the data so as to free 
-         it form the memory.*/
+         it from the memory.*/
        struct io_buffer *tx_iobuf[TX_RING_SIZE];
        struct spi_bit_basher spibit;
        struct spi_device eeprom;
        struct nvo_block nvo;
 };
 
-/* Tuning Parameters */
-#define TX_FIFO_THRESH 256     /* In bytes, rounded down to 32 byte units. */
-#define RX_FIFO_THRESH 4       /* Rx buffer level before first PCI xfer.  */
-#define RX_DMA_BURST   4       /* Maximum PCI burst, '4' is 256 bytes */
-#define TX_DMA_BURST   4       /* Calculate as 16<<val. */
-#define TX_IPG         3       /* This is the only valid value */
-//#define RX_BUF_LEN_IDX       0       /*  */
-#define RX_BUF_LEN    8192   /*buffer size should be multiple of 32 */ 
-#define RX_BUF_PAD 4
-#define RX_BUF_SIZE 1536
-#define OWN       0x80000000
-#define DSIZE     0x00000FFF
-#define CRC_SIZE  4
 
 /* NATSEMI: Offsets to the device registers.
    Unlike software-only systems, device drivers interact with complex hardware.
@@ -153,8 +203,6 @@ enum desc_status_bits {
 
 
 /*  EEPROM access , values are devices specific*/
-//#define EE_M1                0x80    /* Mode select bit 1 */
-//#define EE_M0                0x40    /* Mode select bit 0 */
 #define EE_CS          0x08    /* EEPROM chip select */
 #define EE_SK          0x04    /* EEPROM shift clock */
 #define EE_DI          0x01    /* Data in */
@@ -208,7 +256,7 @@ static struct bit_basher_operations nat_basher_ops = {
  * detect that the card is not supporting VPD.
  */
 static struct nvo_fragment nat_nvo_fragments[] = {
-       { 0x0f, 0x40 },
+       { 0x0c, 0x40 },
        { 0, 0 }
 };
 
@@ -218,8 +266,6 @@ static struct nvo_fragment nat_nvo_fragments[] = {
  * @v NAT              NATSEMI NIC
  */
  void nat_init_eeprom ( struct natsemi_nic *nat ) {
-       int ee9356;
-       int vpd;
 
        // Initialise three-wire bus 
        nat->spibit.basher.op = &nat_basher_ops;
@@ -227,18 +273,12 @@ static struct nvo_fragment nat_nvo_fragments[] = {
        nat->spibit.endianness = SPI_BIT_LITTLE_ENDIAN;
        init_spi_bit_basher ( &nat->spibit );
 
-       DBG ( "EEPROM is an AT93C46\n" );
+       /*natsemi DP 83815 only supports at93c46 */
        init_at93c46 ( &nat->eeprom, 16 );
        nat->eeprom.bus = &nat->spibit.bus;
 
-       // Initialise space for non-volatile options, if available 
-       //vpd = ( inw ( rtl->ioaddr + Config1 ) & VPDEnable );
-       //if ( vpd ) {
-       //      DBG ( "EEPROM in use for VPD; cannot use for options\n" );
-       //} else {
                nat->nvo.nvs = &nat->eeprom.nvs;
                nat->nvo.fragments = nat_nvo_fragments;
-//     }
 }
 
 /**
@@ -280,7 +320,6 @@ static void nat_reset ( struct natsemi_nic *nat ) {
  */
 static int nat_open ( struct net_device *netdev ) {
        struct natsemi_nic *nat = netdev->priv;
-       //struct io_buffer *iobuf;
        int i;
        uint32_t tx_config,rx_config;
        
@@ -296,13 +335,10 @@ static int nat_open ( struct net_device *netdev ) {
                
 
 
-       /* Program the MAC address TODO enable this comment */
         uint8_t last=0;
         uint8_t last1=0;
         for ( i = 0 ; i < ETH_ALEN ; i+=2 )
         {
-       //      DBG("MAC address %d octet :%X %X\n",i,netdev->ll_addr[i],netdev->ll_addr[i+1]);
-       //      DBG("LAst = %d last1 = %d\n",last,last1);
                outl(i,nat->ioaddr+RxFilterAddr);
                last1=netdev->ll_addr[i]>>7;
                netdev->ll_addr[i]=netdev->ll_addr[i]<<1|last;
@@ -310,9 +346,6 @@ static int nat_open ( struct net_device *netdev ) {
                netdev->ll_addr[i+1]=(netdev->ll_addr[i+1]<<1)+last1;
 
                outw ( netdev->ll_addr[i] + (netdev->ll_addr[i+1]<<8), nat->ioaddr +RxFilterData);
-               //outw ( (fullbyte>>8)+(fullbyte<<8), nat->ioaddr +RxFilterData);
-       //      DBG("MAC address %d octet :%X %X\n",i,netdev->ll_addr[i],netdev->ll_addr[i+1]);
-       //      DBG("LAst = %d last1 = %d\n",last,last1);
        }
        
 
@@ -417,7 +450,6 @@ static int nat_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
                return -ENOBUFS;
        }
 
-       //DBG_HD(iobuf->data,iob_len(iobuf));
        /* to be used in netdev_tx_complete*/
        nat->tx_iobuf[nat->tx_cur]=iobuf;
 
@@ -432,7 +464,6 @@ static int nat_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
        nat->tx[nat->tx_cur].cmdsts= (uint32_t) iob_len(iobuf)|OWN;
 
 
-       //DBG_HD(bus_to_virt(nat->tx[nat->tx_cur].bufptr), iob_len(iobuf) );
        nat->tx_cur=(nat->tx_cur+1) % TX_RING_SIZE;
 
        /*start the transmitter  */
@@ -459,7 +490,6 @@ static void nat_poll ( struct net_device *netdev, unsigned int rx_quota ) {
        i=nat->tx_dirty;
        while(i!=nat->tx_cur)
        {
-               //status=(uint32_t)bus_to_virt(nat->tx[nat->tx_dirty].cmdsts);
                status=nat->tx[nat->tx_dirty].cmdsts;
                DBG("value of tx_dirty = %d tx_cur=%d status=%X\n",
                        nat->tx_dirty,nat->tx_cur,status);
@@ -487,9 +517,7 @@ static void nat_poll ( struct net_device *netdev, unsigned int rx_quota ) {
        }
                        
        
-       //rx_status=(unsigned int)bus_to_virt(nat->rx[nat->rx_cur].cmdsts); 
        rx_status=(unsigned int)nat->rx[nat->rx_cur].cmdsts; 
-       //DBG ("Receiver Status = %x\n",rx_status);
        /* Handle received packets */
        while (rx_quota && (rx_status & OWN))
        {
@@ -510,16 +538,14 @@ static void nat_poll ( struct net_device *netdev, unsigned int rx_quota ) {
                                return;
                        memcpy(iob_put(rx_iob,rx_len),
                                        bus_to_virt(nat->rx[nat->rx_cur].bufptr),rx_len);
-                       //DBG_HD(bus_to_virt(nat->rx[nat->rx_cur].bufptr),rx_len);
 
-                       DBG("received packet");
+                       DBG("received packet\n");
                        /* add to the receive queue. */
                        netdev_rx(netdev,rx_iob);
                        rx_quota--;
                }
                nat->rx[nat->rx_cur].cmdsts = RX_BUF_SIZE;
                nat->rx_cur=(nat->rx_cur+1) % NUM_RX_DESC;
-               //rx_status=(unsigned int)bus_to_virt(nat->rx[nat->rx_cur].cmdsts); 
                rx_status=(unsigned int)nat->rx[nat->rx_cur].cmdsts; 
        }
 
@@ -568,9 +594,7 @@ static int nat_probe ( struct pci_device *pci,
        nat_init_eeprom ( nat );
        nvs_read ( &nat->eeprom.nvs, EE_MAC, netdev->ll_addr, ETH_ALEN );
        uint8_t  eetest[128];   
-       int i;
        nvs_read ( &nat->eeprom.nvs, 0, eetest,128 );
-       //      DBG_HD(&eetest,128);
        
 
        /* mdio routine of etherboot-5.4.0 natsemi driver has been removed and 
@@ -633,10 +657,10 @@ static int nat_probe ( struct pci_device *pci,
 static void nat_remove ( struct pci_device *pci ) {
        struct net_device *netdev = pci_get_drvdata ( pci );
        struct natsemi_nic *nat = netdev->priv;
-/* TODO 
-       if ( rtl->nvo.nvs )
-               nvo_unregister ( &rtl->nvo );
-               */
+       if ( nat->nvo.nvs )
+               nvo_unregister ( &nat->nvo );
+               
        unregister_netdev ( netdev );
        nat_reset ( nat );
        netdev_put ( netdev );