diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/Documentation/networking/sk98lin.txt linux.15p9/Documentation/networking/sk98lin.txt
--- linux.vanilla/Documentation/networking/sk98lin.txt  Tue Jan  4 21:18:38 2000
+++ linux.15p9/Documentation/networking/sk98lin.txt     Wed Feb 16 18:29:09 2000
@@ -3,7 +3,7 @@

sk98lin.txt created 11-Nov-1999

-Readme File for sk98lin.o v3.02
+Readme File for sk98lin.o v3.04
SK-NET Gigabit Ethernet Adapter SK-98xx Driver for Linux

This file contains
@@ -24,8 +24,8 @@
============

The sk98lin driver supports the SysKonnect SK-NET Gigabit Ethernet
-Adapter SK-98xx family on Linux 2.2.x.
-It has been tested with Linux on Intel/x86 and ALPHA machines.
+Adapter SK-98xx family on Linux 2.2.x and above.
+It has been tested with Linux on Intel/x86, ALPHA and UltraSPARC machines.
From v3.02 on, the driver is integrated in the linux kernel source.
***

@@ -132,7 +132,8 @@
module with 'insmod'. The configuration tools of some distributions
can also give parameters to the driver module.
If you use the kernel module loader, you can set driver parameters
-in the file /etc/conf.modules. Insert a line of the form:
+in the file /etc/modules.conf (or old name: /etc/conf.modules).
+Insert a line of the form:

options sk98lin ...

@@ -281,14 +282,12 @@
the large frames. If one adapter is not set to receive large frames,
it will simply drop them.

-NOTE: If you look at the statistics (with netstat) in large frame
-      mode while there is traffic on the net, you will see the
-      RX error counter go up. This is because the adapter hardware
-      counts received large frames as errors, although they are
-      received correctly. So ignore this counter in that case.
-
You can switch back to the standard ethernet frame size with:
  ifconfig eth0 mtu 1500
+
+To make this setting persitent, add a script with the 'ifconfig'
+line to the system startup sequence (named something like "S99sk98lin"
+in /etc/rc.d/rc2.d).
***


@@ -374,15 +373,27 @@
(8) HISTORY
===========

-VERSION 3.02
+VERSION 3.04 (In-Kernel version)
+Problems fixed:
+- Driver start failed on UltraSPARC
+- Rx checksum calculation for big endian machines did not work
+- Jumbo frames were counted as input-errors in netstat
+
+VERSION 3.03 (Standalone version)
+Problems fixed:
+- Compilation did not find script "printver.sh" if "." not in PATH
+Known limitations:
+- None
+
+VERSION 3.02 (In-Kernel version)
Problems fixed:
- None
New Features:
-- Integration in linux kernel source.
+- Integration in Linux kernel source (2.2.14 and 2.3.29)
Known limitations:
- None

-VERSION 3.02
+VERSION 3.01
Problems fixed:
- None
New Features:
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/config.in linux.15p9/arch/sparc64/config.in
--- linux.vanilla/arch/sparc64/config.in        Tue Jan  4 21:18:42 2000
+++ linux.15p9/arch/sparc64/config.in   Wed Feb 16 18:29:09 2000
@@ -221,6 +241,7 @@
                       tristate 'RealTek 8129/8139 (not 8019/8029!) support' CONFIG_RTL8139
                       tristate 'PCI NE2000 support' CONFIG_NE2K_PCI
                       tristate 'EtherExpressPro/100 support' CONFIG_EEXPRESS_PRO100
+                       tristate 'SysKonnect SK-98xx support' CONFIG_SK98LIN
               fi
#              bool 'FDDI driver support' CONFIG_FDDI
#              if [ "$CONFIG_FDDI" = "y" ]; then
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/defconfig linux.15p9/arch/sparc64/defconfig
--- linux.vanilla/arch/sparc64/defconfig        Tue Jan  4 21:18:42 2000
+++ linux.15p9/arch/sparc64/defconfig   Thu Feb 17 21:58:23 2000
@@ -255,6 +261,7 @@
CONFIG_NE2K_PCI=m
CONFIG_EEXPRESS_PRO100=m
CONFIG_ACENIC=m
+CONFIG_SK98LIN=m

#
# Unix 98 PTY support
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/net/sk98lin/h/skdrv2nd.h linux.15p9/drivers/net/sk98lin/h/skdrv2nd.h
--- linux.vanilla/drivers/net/sk98lin/h/skdrv2nd.h      Tue Jan  4 21:18:52 2000
+++ linux.15p9/drivers/net/sk98lin/h/skdrv2nd.h Wed Feb 16 18:29:09 2000
@@ -411,6 +411,7 @@
       int             RxBufSize;      /* length of receive buffers */
        struct net_device_stats stats; /* linux 'netstat -i' statistics */
       int             Index;          /* internal board index number */
+       SK_BOOL         JumboActivated; /* jumbo support ever activated */

       /* adapter RAM sizes for queues of active port */
       int             RxQueueSize;    /* memory used for receive queue */
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/net/sk98lin/skcsum.c linux.15p9/drivers/net/sk98lin/skcsum.c
--- linux.vanilla/drivers/net/sk98lin/skcsum.c  Tue Jan  4 21:18:52 2000
+++ linux.15p9/drivers/net/sk98lin/skcsum.c     Thu Feb 17 22:03:04 2000
@@ -617,7 +617,6 @@
       /*
        * Calculate the TCP/UDP checksum.
        */
-
       /* Get total length of IP header and data. */

       IpDataLength =
@@ -639,11 +638,10 @@
                       SKCS_OFS_IP_DESTINATION_ADDRESS + 0) +
               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
                       SKCS_OFS_IP_DESTINATION_ADDRESS + 2) +
-               (unsigned long) (NextLevelProtocol << 8) +
+               (unsigned long) SKCS_HTON16(NextLevelProtocol) +
               (unsigned long) SKCS_HTON16(IpDataLength) +

               /* Add the TCP/UDP header checksum. */
-
               (unsigned long) IpDataChecksum;

       /* Add-in any carries. */
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/net/sk98lin/skge.c linux.15p9/drivers/net/sk98lin/skge.c
--- linux.vanilla/drivers/net/sk98lin/skge.c    Tue Jan  4 21:18:52 2000
+++ linux.15p9/drivers/net/sk98lin/skge.c       Thu Feb 17 22:03:04 2000
@@ -225,7 +225,7 @@

static const char SysKonnectFileId[] = "@(#)" __FILE__ " (C) SysKonnect.";
static const char SysKonnectBuildNumber[] =
-       "@(#)SK-BUILD: 3.02 (19991111) PL: 01";
+       "@(#)SK-BUILD: 3.04 (19991111) PL: 01";

#include       <linux/module.h>

@@ -234,10 +234,10 @@

/* defines ******************************************************************/

-#define BOOT_STRING    "sk98lin: Network Device Driver v3.02\n" \
+#define BOOT_STRING    "sk98lin: Network Device Driver v3.04\n" \
                       "Copyright (C) 1999 SysKonnect"

-#define VER_STRING     "3.02"
+#define VER_STRING     "3.04"


/* for debuging on x86 only */
@@ -348,6 +348,7 @@
SK_AC          *pAC;
struct pci_dev *pdev = NULL;
unsigned long  base_address;
+unsigned short tmp;

       if (probed)
               return -ENODEV;
@@ -419,6 +420,15 @@

               base_address = pdev->base_address[0];

+#ifdef __sparc_v9__
+               /* SPARC machines do not initialize the chache line size */
+                pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 64);
+               /* SPARC machines do not set "Memory write and invalidate" */
+                pci_read_config_word(pdev, PCI_COMMAND, &tmp);
+               tmp |= PCI_COMMAND_INVALIDATE;
+                pci_write_config_word(pdev, PCI_COMMAND, tmp);
+#endif
+
#ifdef SK_BIG_ENDIAN
               /*
                * On big endian machines, we use the adapter's aibility of
@@ -437,7 +447,12 @@
                */


+#ifndef __sparc_v9__
               pAC->IoBase = (char*)ioremap(base_address, 0x4000);
+#else
+               /* workaround for bug in 2.2 kernel for sparcv9 */
+               pAC->IoBase = (char*)base_address;
+#endif
               if (!pAC->IoBase){
                       printk(KERN_ERR "%s:  Unable to map I/O register, "
                              "SK 98xx No. %i will be disabled.\n",
@@ -808,6 +823,14 @@
       ProductStr(pAC);
       printk("%s: %s\n", dev->name, pAC->DeviceStr);

+       /* Print configuration settings */
+       printk("      PrefPort:%c  RlmtMode:%s\n",
+               'A' + pAC->Rlmt.PrefPort,
+               (pAC->RlmtMode==0)  ? "ChkLink" :
+               ((pAC->RlmtMode==1) ? "ChkLink" :
+               ((pAC->RlmtMode==3) ? "ChkOth" :
+               ((pAC->RlmtMode==7) ? "ChkSeg" : "Error"))));
+
       SkGeYellowLED(pAC, pAC->IoBase, 1);

       /*
@@ -1527,10 +1550,13 @@

       Rc = XmitFrame(pAC, &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW], skb);

-       if (Rc == 0) {
+       if (Rc <= 0) {
               /* transmitter out of resources */
               set_bit(0, (void*) &dev->tbusy);
-               return (0);
+               if (Rc == 0)
+                       return (0);
+               else
+                       return (-EBUSY);
       }
       dev->trans_start = jiffies;
       return (0);
@@ -1555,9 +1581,9 @@
 *
 * Returns:
 *     > 0 - on succes: the number of bytes in the message
- *     = 0 - on resource shortage: this frame sent or dropped, now
+ *     = 0 - on resource shortage: this frame was sent, now
 *        the ring is full ( -> set tbusy)
- *     < 0 - on failure: other problems (not used)
+ *     < 0 - on resource shortage: this frame could not be sent
 */
static int XmitFrame(
SK_AC          *pAC,           /* pointer to adapter context */
@@ -1585,7 +1611,7 @@
                               ("XmitFrame failed\n"));
                       /* this message can not be sent now */
                       DEV_KFREE_SKB(pMessage);
-                       return (0);
+                       return (-1);
               }
       }
       /* advance head counter behind descriptor needed for this frame */
@@ -1900,8 +1926,10 @@
                       /* hardware checksum */
                       Type = ntohs(*((short*)&pMsg->data[12]));
                       if (Type == 0x800) {
-                               Csum1= pRxd->TcpSums & 0xffff;
-                               Csum2=(pRxd->TcpSums >> 16) & 0xffff;
+                               /* the hardware calculates the checksums in LITTLE ENDIAN */
+                               /* so turn them around for BIG ENDIAN machines */
+                               Csum1= le16_to_cpu(pRxd->TcpSums & 0xffff);
+                               Csum2= le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff);
                               if ((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) {
                                       Result = SkCsGetReceiveInfo(pAC,
                                               &pMsg->data[14],
@@ -2414,6 +2442,7 @@
        * enable/disable hardware support for long frames
        */
       if (NewMtu > 1500) {
+               pAC->JumboActivated = SK_TRUE; // is never set back !!!
               pAC->GIni.GIPortUsage = SK_JUMBO_LINK;
               for (i=0; i<pAC->GIni.GIMacsFound; i++) {
                       pAC->GIni.GP[i].PRxCmd =
@@ -2523,7 +2552,13 @@
       pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF;
       pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts;
       pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts;
-       pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF;
+       if (!pAC->JumboActivated) {
+               pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF;
+       }
+       else {
+               pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts -
+                       pPnmiStat->StatRxTooLongCts) & 0xFFFFFFFF);
+       }
       pAC->stats.tx_errors = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF;
       pAC->stats.rx_dropped = (SK_U32) pPnmiStruct->RxNoBufCts & 0xFFFFFFFF;
       pAC->stats.tx_dropped = (SK_U32) pPnmiStruct->TxNoBufCts & 0xFFFFFFFF;
@@ -3467,8 +3502,10 @@
               pRlmtMbuf = (SK_MBUF*) Param.pParaPtr;
               pMsg = (struct sk_buff*) pRlmtMbuf->pOs;
               skb_put(pMsg, pRlmtMbuf->Length);
-               XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW],
-                       pMsg);
+               if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW],
+                       pMsg) < 0) {
+                       dev_kfree_skb(pMsg);
+               }
               break;
       default:
               break;