Index: oldkernel/linux/Documentation/networking/sk98lin.txt diff -u linux/Documentation/networking/sk98lin.txt:1.1.1.1 linux/Documentation/networking/sk98lin.txt:1.2 --- linux/Documentation/networking/sk98lin.txt:1.1.1.1 Wed May 31 12:33:54 2000 +++ linux/Documentation/networking/sk98lin.txt Thu Jun 1 16:59:06 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). *** @@ -373,16 +372,28 @@ (8) HISTORY =========== + +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 +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: Index: oldkernel/linux/arch/sparc64/config.in diff -u linux/arch/sparc64/config.in:1.4 linux/arch/sparc64/config.in:1.5 --- linux/arch/sparc64/config.in:1.4 Thu Jun 1 15:47:21 2000 +++ linux/arch/sparc64/config.in Thu Jun 1 16:59:06 2000 @@ -245,6 +245,7 @@ tristate 'Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support' CONFIG_ACENIC fi 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 Index: oldkernel/linux/arch/sparc64/defconfig diff -u linux/arch/sparc64/defconfig:1.4 linux/arch/sparc64/defconfig:1.5 --- linux/arch/sparc64/defconfig:1.4 Thu Jun 1 15:47:21 2000 +++ linux/arch/sparc64/defconfig Thu Jun 1 16:59:06 2000 @@ -261,6 +261,7 @@ CONFIG_NE2K_PCI=m CONFIG_EEXPRESS_PRO100=m CONFIG_ACENIC=m +CONFIG_SK98LIN=m # # Unix 98 PTY support Index: oldkernel/linux/drivers/net/sk98lin/skcsum.c diff -u linux/drivers/net/sk98lin/skcsum.c:1.1.1.1 linux/drivers/net/sk98lin/skcsum.c:1.2 --- linux/drivers/net/sk98lin/skcsum.c:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/net/sk98lin/skcsum.c Thu Jun 1 16:59:06 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. */ Index: oldkernel/linux/drivers/net/sk98lin/skge.c diff -u linux/drivers/net/sk98lin/skge.c:1.1.1.1 linux/drivers/net/sk98lin/skge.c:1.2 --- linux/drivers/net/sk98lin/skge.c:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/net/sk98lin/skge.c Thu Jun 1 16:59:06 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 @@ -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; iGIni.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; Index: oldkernel/linux/drivers/net/sk98lin/h/skdrv2nd.h diff -u linux/drivers/net/sk98lin/h/skdrv2nd.h:1.1.1.1 linux/drivers/net/sk98lin/h/skdrv2nd.h:1.2 --- linux/drivers/net/sk98lin/h/skdrv2nd.h:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/net/sk98lin/h/skdrv2nd.h Thu Jun 1 16:59:06 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 */