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;

