Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

+108 -1092
+9 -4
drivers/net/b44.c
··· 28 29 #define DRV_MODULE_NAME "b44" 30 #define PFX DRV_MODULE_NAME ": " 31 - #define DRV_MODULE_VERSION "0.96" 32 - #define DRV_MODULE_RELDATE "Nov 8, 2005" 33 34 #define B44_DEF_MSG_ENABLE \ 35 (NETIF_MSG_DRV | \ ··· 1417 add_timer(&bp->timer); 1418 1419 b44_enable_ints(bp); 1420 out: 1421 return err; 1422 } ··· 1838 { 1839 struct mii_ioctl_data *data = if_mii(ifr); 1840 struct b44 *bp = netdev_priv(dev); 1841 - int err; 1842 1843 spin_lock_irq(&bp->lock); 1844 err = generic_mii_ioctl(&bp->mii_if, data, cmd, NULL); 1845 spin_unlock_irq(&bp->lock); 1846 - 1847 return err; 1848 } 1849 ··· 2117 add_timer(&bp->timer); 2118 2119 b44_enable_ints(bp); 2120 return 0; 2121 } 2122
··· 28 29 #define DRV_MODULE_NAME "b44" 30 #define PFX DRV_MODULE_NAME ": " 31 + #define DRV_MODULE_VERSION "0.97" 32 + #define DRV_MODULE_RELDATE "Nov 30, 2005" 33 34 #define B44_DEF_MSG_ENABLE \ 35 (NETIF_MSG_DRV | \ ··· 1417 add_timer(&bp->timer); 1418 1419 b44_enable_ints(bp); 1420 + netif_start_queue(dev); 1421 out: 1422 return err; 1423 } ··· 1837 { 1838 struct mii_ioctl_data *data = if_mii(ifr); 1839 struct b44 *bp = netdev_priv(dev); 1840 + int err = -EINVAL; 1841 + 1842 + if (!netif_running(dev)) 1843 + goto out; 1844 1845 spin_lock_irq(&bp->lock); 1846 err = generic_mii_ioctl(&bp->mii_if, data, cmd, NULL); 1847 spin_unlock_irq(&bp->lock); 1848 + out: 1849 return err; 1850 } 1851 ··· 2113 add_timer(&bp->timer); 2114 2115 b44_enable_ints(bp); 2116 + netif_wake_queue(dev); 2117 return 0; 2118 } 2119
+1 -13
drivers/net/e1000/e1000_main.c
··· 2621 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) ) 2622 return 0; 2623 } 2624 - if(htons(ETH_P_IP) == skb->protocol) { 2625 - const struct iphdr *ip = skb->nh.iph; 2626 - if(IPPROTO_UDP == ip->protocol) { 2627 - struct udphdr *udp = (struct udphdr *)(skb->h.uh); 2628 - if(ntohs(udp->dest) == 67) { 2629 - offset = (uint8_t *)udp + 8 - skb->data; 2630 - length = skb->len - offset; 2631 - 2632 - return e1000_mng_write_dhcp_info(hw, 2633 - (uint8_t *)udp + 8, length); 2634 - } 2635 - } 2636 - } else if((skb->len > MINIMUM_DHCP_PACKET_SIZE) && (!skb->protocol)) { 2637 struct ethhdr *eth = (struct ethhdr *) skb->data; 2638 if((htons(ETH_P_IP) == eth->h_proto)) { 2639 const struct iphdr *ip =
··· 2621 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) ) 2622 return 0; 2623 } 2624 + if ((skb->len > MINIMUM_DHCP_PACKET_SIZE) && (!skb->protocol)) { 2625 struct ethhdr *eth = (struct ethhdr *) skb->data; 2626 if((htons(ETH_P_IP) == eth->h_proto)) { 2627 const struct iphdr *ip =
+29 -9
drivers/net/ibm_emac/ibm_emac_core.c
··· 65 */ 66 67 #define DRV_NAME "emac" 68 - #define DRV_VERSION "3.53" 69 #define DRV_DESC "PPC 4xx OCP EMAC driver" 70 71 MODULE_DESCRIPTION(DRV_DESC); ··· 158 #define PHY_POLL_LINK_ON HZ 159 #define PHY_POLL_LINK_OFF (HZ / 5) 160 161 /* Please, keep in sync with struct ibm_emac_stats/ibm_emac_error_stats */ 162 static const char emac_stats_keys[EMAC_ETHTOOL_STATS_COUNT][ETH_GSTRING_LEN] = { 163 "rx_packets", "rx_bytes", "tx_packets", "tx_bytes", "rx_packets_csum", ··· 230 231 r = in_be32(&p->mr0); 232 if (r & EMAC_MR0_TXE) { 233 - int n = 300; 234 out_be32(&p->mr0, r & ~EMAC_MR0_TXE); 235 - while (!(in_be32(&p->mr0) & EMAC_MR0_TXI) && n) 236 --n; 237 if (unlikely(!n)) 238 emac_report_timeout_error(dev, "TX disable timeout"); 239 } ··· 258 if (!(r & EMAC_MR0_RXE)) { 259 if (unlikely(!(r & EMAC_MR0_RXI))) { 260 /* Wait if previous async disable is still in progress */ 261 - int n = 100; 262 - while (!(r = in_be32(&p->mr0) & EMAC_MR0_RXI) && n) 263 --n; 264 if (unlikely(!n)) 265 emac_report_timeout_error(dev, 266 "RX disable timeout"); ··· 285 286 r = in_be32(&p->mr0); 287 if (r & EMAC_MR0_RXE) { 288 - int n = 300; 289 out_be32(&p->mr0, r & ~EMAC_MR0_RXE); 290 - while (!(in_be32(&p->mr0) & EMAC_MR0_RXI) && n) 291 --n; 292 if (unlikely(!n)) 293 emac_report_timeout_error(dev, "RX disable timeout"); 294 } ··· 409 r = EMAC_MR1_BASE(emac_opb_mhz()) | EMAC_MR1_VLE | EMAC_MR1_IST; 410 if (dev->phy.duplex == DUPLEX_FULL) 411 r |= EMAC_MR1_FDE; 412 switch (dev->phy.speed) { 413 case SPEED_1000: 414 if (emac_phy_gpcs(dev->phy.mode)) { ··· 424 r |= EMAC_MR1_MF_1000; 425 r |= EMAC_MR1_RFS_16K; 426 gige = 1; 427 - 428 - if (dev->ndev->mtu > ETH_DATA_LEN) 429 r |= EMAC_MR1_JPSM; 430 break; 431 case SPEED_100: 432 r |= EMAC_MR1_MF_100; 433 /* Fall through */ 434 default: 435 r |= EMAC_MR1_RFS_4K; ··· 2067 dev->phy.duplex = DUPLEX_FULL; 2068 dev->phy.autoneg = AUTONEG_DISABLE; 2069 dev->phy.pause = dev->phy.asym_pause = 0; 2070 init_timer(&dev->link_timer); 2071 dev->link_timer.function = emac_link_timer; 2072 dev->link_timer.data = (unsigned long)dev;
··· 65 */ 66 67 #define DRV_NAME "emac" 68 + #define DRV_VERSION "3.54" 69 #define DRV_DESC "PPC 4xx OCP EMAC driver" 70 71 MODULE_DESCRIPTION(DRV_DESC); ··· 158 #define PHY_POLL_LINK_ON HZ 159 #define PHY_POLL_LINK_OFF (HZ / 5) 160 161 + /* Graceful stop timeouts in us. 162 + * We should allow up to 1 frame time (full-duplex, ignoring collisions) 163 + */ 164 + #define STOP_TIMEOUT_10 1230 165 + #define STOP_TIMEOUT_100 124 166 + #define STOP_TIMEOUT_1000 13 167 + #define STOP_TIMEOUT_1000_JUMBO 73 168 + 169 /* Please, keep in sync with struct ibm_emac_stats/ibm_emac_error_stats */ 170 static const char emac_stats_keys[EMAC_ETHTOOL_STATS_COUNT][ETH_GSTRING_LEN] = { 171 "rx_packets", "rx_bytes", "tx_packets", "tx_bytes", "rx_packets_csum", ··· 222 223 r = in_be32(&p->mr0); 224 if (r & EMAC_MR0_TXE) { 225 + int n = dev->stop_timeout; 226 out_be32(&p->mr0, r & ~EMAC_MR0_TXE); 227 + while (!(in_be32(&p->mr0) & EMAC_MR0_TXI) && n) { 228 + udelay(1); 229 --n; 230 + } 231 if (unlikely(!n)) 232 emac_report_timeout_error(dev, "TX disable timeout"); 233 } ··· 248 if (!(r & EMAC_MR0_RXE)) { 249 if (unlikely(!(r & EMAC_MR0_RXI))) { 250 /* Wait if previous async disable is still in progress */ 251 + int n = dev->stop_timeout; 252 + while (!(r = in_be32(&p->mr0) & EMAC_MR0_RXI) && n) { 253 + udelay(1); 254 --n; 255 + } 256 if (unlikely(!n)) 257 emac_report_timeout_error(dev, 258 "RX disable timeout"); ··· 273 274 r = in_be32(&p->mr0); 275 if (r & EMAC_MR0_RXE) { 276 + int n = dev->stop_timeout; 277 out_be32(&p->mr0, r & ~EMAC_MR0_RXE); 278 + while (!(in_be32(&p->mr0) & EMAC_MR0_RXI) && n) { 279 + udelay(1); 280 --n; 281 + } 282 if (unlikely(!n)) 283 emac_report_timeout_error(dev, "RX disable timeout"); 284 } ··· 395 r = EMAC_MR1_BASE(emac_opb_mhz()) | EMAC_MR1_VLE | EMAC_MR1_IST; 396 if (dev->phy.duplex == DUPLEX_FULL) 397 r |= EMAC_MR1_FDE; 398 + dev->stop_timeout = STOP_TIMEOUT_10; 399 switch (dev->phy.speed) { 400 case SPEED_1000: 401 if (emac_phy_gpcs(dev->phy.mode)) { ··· 409 r |= EMAC_MR1_MF_1000; 410 r |= EMAC_MR1_RFS_16K; 411 gige = 1; 412 + 413 + if (dev->ndev->mtu > ETH_DATA_LEN) { 414 r |= EMAC_MR1_JPSM; 415 + dev->stop_timeout = STOP_TIMEOUT_1000_JUMBO; 416 + } else 417 + dev->stop_timeout = STOP_TIMEOUT_1000; 418 break; 419 case SPEED_100: 420 r |= EMAC_MR1_MF_100; 421 + dev->stop_timeout = STOP_TIMEOUT_100; 422 /* Fall through */ 423 default: 424 r |= EMAC_MR1_RFS_4K; ··· 2048 dev->phy.duplex = DUPLEX_FULL; 2049 dev->phy.autoneg = AUTONEG_DISABLE; 2050 dev->phy.pause = dev->phy.asym_pause = 0; 2051 + dev->stop_timeout = STOP_TIMEOUT_100; 2052 init_timer(&dev->link_timer); 2053 dev->link_timer.function = emac_link_timer; 2054 dev->link_timer.data = (unsigned long)dev;
+2
drivers/net/ibm_emac/ibm_emac_core.h
··· 189 struct timer_list link_timer; 190 int reset_failed; 191 192 struct ibm_emac_error_stats estats; 193 struct net_device_stats nstats; 194
··· 189 struct timer_list link_timer; 190 int reset_failed; 191 192 + int stop_timeout; /* in us */ 193 + 194 struct ibm_emac_error_stats estats; 195 struct net_device_stats nstats; 196
+2 -2
drivers/net/jazzsonic.c
··· 296 } 297 298 jazz_sonic_device = platform_device_alloc(jazz_sonic_string, 0); 299 - if (!jazz_sonnic_device) 300 goto out_unregister; 301 302 if (platform_device_add(jazz_sonic_device)) { ··· 307 return 0; 308 309 out_unregister: 310 - driver_unregister(&jazz_sonic_driver); 311 312 return -ENOMEM; 313 }
··· 296 } 297 298 jazz_sonic_device = platform_device_alloc(jazz_sonic_string, 0); 299 + if (!jazz_sonic_device) 300 goto out_unregister; 301 302 if (platform_device_add(jazz_sonic_device)) { ··· 307 return 0; 308 309 out_unregister: 310 + platform_driver_unregister(&jazz_sonic_driver); 311 312 return -ENOMEM; 313 }
+5 -25
drivers/net/mipsnet.h
··· 1 - // 2 - // <COPYRIGHT CLASS="1B" YEAR="2005"> 3 - // Unpublished work (c) MIPS Technologies, Inc. All rights reserved. 4 - // Unpublished rights reserved under the copyright laws of the U.S.A. and 5 - // other countries. 6 - // 7 - // PROPRIETARY / SECRET CONFIDENTIAL INFORMATION OF MIPS TECHNOLOGIES, INC. 8 - // FOR INTERNAL USE ONLY. 9 - // 10 - // Under no circumstances (contract or otherwise) may this information be 11 - // disclosed to, or copied, modified or used by anyone other than employees 12 - // or contractors of MIPS Technologies having a need to know. 13 - // </COPYRIGHT> 14 - // 15 - //++ 16 - // File: MIPS_Net.h 17 - // 18 - // Description: 19 - // The definition of the emulated MIPSNET device's interface. 20 - // 21 - // Notes: This include file needs to work from a Linux device drivers. 22 - // 23 - //-- 24 - // 25 - 26 #ifndef __MIPSNET_H 27 #define __MIPSNET_H 28
··· 1 + /* 2 + * This file is subject to the terms and conditions of the GNU General Public 3 + * License. See the file "COPYING" in the main directory of this archive 4 + * for more details. 5 + */ 6 #ifndef __MIPSNET_H 7 #define __MIPSNET_H 8
+11 -21
drivers/net/pcmcia/fmvj18x_cs.c
··· 131 u_short tx_queue_len; 132 cardtype_t cardtype; 133 u_short sent; 134 - u_char mc_filter[8]; 135 } local_info_t; 136 137 - #define MC_FILTERBREAK 8 138 139 /*====================================================================*/ 140 /* ··· 1004 for (i = 0; i < 6; i++) 1005 outb(dev->dev_addr[i], ioaddr + NODE_ID + i); 1006 1007 - /* Switch to bank 1 */ 1008 - if (lp->cardtype == MBH10302) 1009 - outb(BANK_1, ioaddr + CONFIG_1); 1010 - else 1011 - outb(BANK_1U, ioaddr + CONFIG_1); 1012 - 1013 - /* set the multicast table to accept none. */ 1014 - for (i = 0; i < 8; i++) 1015 - outb(0x00, ioaddr + MAR_ADR + i); 1016 1017 /* Switch to bank 2 (runtime mode) */ 1018 if (lp->cardtype == MBH10302) ··· 1256 static void set_rx_mode(struct net_device *dev) 1257 { 1258 kio_addr_t ioaddr = dev->base_addr; 1259 - struct local_info_t *lp = netdev_priv(dev); 1260 u_char mc_filter[8]; /* Multicast hash filter */ 1261 u_long flags; 1262 int i; 1263 1264 int saved_config_0 = inb(ioaddr + CONFIG_0); 1265 1266 local_irq_save(flags); ··· 1298 outb(2, ioaddr + RX_MODE); /* Use normal mode. */ 1299 } 1300 1301 - if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) { 1302 - int saved_bank = inb(ioaddr + CONFIG_1); 1303 - /* Switch to bank 1 and set the multicast table. */ 1304 - outb(0xe4, ioaddr + CONFIG_1); 1305 - for (i = 0; i < 8; i++) 1306 - outb(mc_filter[i], ioaddr + MAR_ADR + i); 1307 - memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter)); 1308 - outb(saved_bank, ioaddr + CONFIG_1); 1309 - } 1310 1311 outb(saved_config_0, ioaddr + CONFIG_0); 1312
··· 131 u_short tx_queue_len; 132 cardtype_t cardtype; 133 u_short sent; 134 } local_info_t; 135 136 + #define MC_FILTERBREAK 64 137 138 /*====================================================================*/ 139 /* ··· 1005 for (i = 0; i < 6; i++) 1006 outb(dev->dev_addr[i], ioaddr + NODE_ID + i); 1007 1008 + /* (re)initialize the multicast table */ 1009 + set_rx_mode(dev); 1010 1011 /* Switch to bank 2 (runtime mode) */ 1012 if (lp->cardtype == MBH10302) ··· 1264 static void set_rx_mode(struct net_device *dev) 1265 { 1266 kio_addr_t ioaddr = dev->base_addr; 1267 u_char mc_filter[8]; /* Multicast hash filter */ 1268 u_long flags; 1269 int i; 1270 1271 + int saved_bank; 1272 int saved_config_0 = inb(ioaddr + CONFIG_0); 1273 1274 local_irq_save(flags); ··· 1306 outb(2, ioaddr + RX_MODE); /* Use normal mode. */ 1307 } 1308 1309 + /* Switch to bank 1 and set the multicast table. */ 1310 + saved_bank = inb(ioaddr + CONFIG_1); 1311 + outb(0xe4, ioaddr + CONFIG_1); 1312 + 1313 + for (i = 0; i < 8; i++) 1314 + outb(mc_filter[i], ioaddr + MAR_ADR + i); 1315 + outb(saved_bank, ioaddr + CONFIG_1); 1316 1317 outb(saved_config_0, ioaddr + CONFIG_0); 1318
+2 -3
drivers/net/sk98lin/Makefile
··· 27 sktimer.o \ 28 skvpd.o \ 29 skxmac2.o \ 30 - skproc.o \ 31 - skcsum.o 32 33 # DBGDEF = \ 34 # -DDEBUG ··· 76 # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources 77 # SK_DBGCAT_DRV_EVENT 0x08000000 driver events 78 79 - EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) 80 81 clean: 82 rm -f core *.o *.a *.s
··· 27 sktimer.o \ 28 skvpd.o \ 29 skxmac2.o \ 30 + skproc.o 31 32 # DBGDEF = \ 33 # -DDEBUG ··· 77 # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources 78 # SK_DBGCAT_DRV_EVENT 0x08000000 driver events 79 80 + EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) 81 82 clean: 83 rm -f core *.o *.a *.s
-4
drivers/net/sk98lin/h/skdrv2nd.h
··· 425 TX_PORT TxPort[SK_MAX_MACS][2]; 426 RX_PORT RxPort[SK_MAX_MACS]; 427 428 - unsigned int CsOfs1; /* for checksum calculation */ 429 - unsigned int CsOfs2; /* for checksum calculation */ 430 - SK_U32 CsOfs; /* for checksum calculation */ 431 - 432 SK_BOOL CheckQueue; /* check event queue soon */ 433 SK_TIMER DrvCleanupTimer;/* to check for pending descriptors */ 434 DIM_INFO DynIrqModInfo; /* all data related to DIM */
··· 425 TX_PORT TxPort[SK_MAX_MACS][2]; 426 RX_PORT RxPort[SK_MAX_MACS]; 427 428 SK_BOOL CheckQueue; /* check event queue soon */ 429 SK_TIMER DrvCleanupTimer;/* to check for pending descriptors */ 430 DIM_INFO DynIrqModInfo; /* all data related to DIM */
-871
drivers/net/sk98lin/skcsum.c
··· 1 - /****************************************************************************** 2 - * 3 - * Name: skcsum.c 4 - * Project: GEnesis, PCI Gigabit Ethernet Adapter 5 - * Version: $Revision: 1.12 $ 6 - * Date: $Date: 2003/08/20 13:55:53 $ 7 - * Purpose: Store/verify Internet checksum in send/receive packets. 8 - * 9 - ******************************************************************************/ 10 - 11 - /****************************************************************************** 12 - * 13 - * (C)Copyright 1998-2003 SysKonnect GmbH. 14 - * 15 - * This program is free software; you can redistribute it and/or modify 16 - * it under the terms of the GNU General Public License as published by 17 - * the Free Software Foundation; either version 2 of the License, or 18 - * (at your option) any later version. 19 - * 20 - * The information in this file is provided "AS IS" without warranty. 21 - * 22 - ******************************************************************************/ 23 - 24 - #ifdef SK_USE_CSUM /* Check if CSUM is to be used. */ 25 - 26 - #ifndef lint 27 - static const char SysKonnectFileId[] = 28 - "@(#) $Id: skcsum.c,v 1.12 2003/08/20 13:55:53 mschmid Exp $ (C) SysKonnect."; 29 - #endif /* !lint */ 30 - 31 - /****************************************************************************** 32 - * 33 - * Description: 34 - * 35 - * This is the "GEnesis" common module "CSUM". 36 - * 37 - * This module contains the code necessary to calculate, store, and verify the 38 - * Internet Checksum of IP, TCP, and UDP frames. 39 - * 40 - * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon" 41 - * and is the code name of this SysKonnect project. 42 - * 43 - * Compilation Options: 44 - * 45 - * SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an 46 - * empty module. 47 - * 48 - * SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id 49 - * definitions. In this case, all SKCS_PROTO_xxx definitions must be made 50 - * external. 51 - * 52 - * SKCS_OVERWRITE_STATUS - Define to overwrite the default return status 53 - * definitions. In this case, all SKCS_STATUS_xxx definitions must be made 54 - * external. 55 - * 56 - * Include File Hierarchy: 57 - * 58 - * "h/skdrv1st.h" 59 - * "h/skcsum.h" 60 - * "h/sktypes.h" 61 - * "h/skqueue.h" 62 - * "h/skdrv2nd.h" 63 - * 64 - ******************************************************************************/ 65 - 66 - #include "h/skdrv1st.h" 67 - #include "h/skcsum.h" 68 - #include "h/skdrv2nd.h" 69 - 70 - /* defines ********************************************************************/ 71 - 72 - /* The size of an Ethernet MAC header. */ 73 - #define SKCS_ETHERNET_MAC_HEADER_SIZE (6+6+2) 74 - 75 - /* The size of the used topology's MAC header. */ 76 - #define SKCS_MAC_HEADER_SIZE SKCS_ETHERNET_MAC_HEADER_SIZE 77 - 78 - /* The size of the IP header without any option fields. */ 79 - #define SKCS_IP_HEADER_SIZE 20 80 - 81 - /* 82 - * Field offsets within the IP header. 83 - */ 84 - 85 - /* "Internet Header Version" and "Length". */ 86 - #define SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH 0 87 - 88 - /* "Total Length". */ 89 - #define SKCS_OFS_IP_TOTAL_LENGTH 2 90 - 91 - /* "Flags" "Fragment Offset". */ 92 - #define SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET 6 93 - 94 - /* "Next Level Protocol" identifier. */ 95 - #define SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL 9 96 - 97 - /* Source IP address. */ 98 - #define SKCS_OFS_IP_SOURCE_ADDRESS 12 99 - 100 - /* Destination IP address. */ 101 - #define SKCS_OFS_IP_DESTINATION_ADDRESS 16 102 - 103 - 104 - /* 105 - * Field offsets within the UDP header. 106 - */ 107 - 108 - /* UDP checksum. */ 109 - #define SKCS_OFS_UDP_CHECKSUM 6 110 - 111 - /* IP "Next Level Protocol" identifiers (see RFC 790). */ 112 - #define SKCS_PROTO_ID_TCP 6 /* Transport Control Protocol */ 113 - #define SKCS_PROTO_ID_UDP 17 /* User Datagram Protocol */ 114 - 115 - /* IP "Don't Fragment" bit. */ 116 - #define SKCS_IP_DONT_FRAGMENT SKCS_HTON16(0x4000) 117 - 118 - /* Add a byte offset to a pointer. */ 119 - #define SKCS_IDX(pPtr, Ofs) ((void *) ((char *) (pPtr) + (Ofs))) 120 - 121 - /* 122 - * Macros that convert host to network representation and vice versa, i.e. 123 - * little/big endian conversion on little endian machines only. 124 - */ 125 - #ifdef SK_LITTLE_ENDIAN 126 - #define SKCS_HTON16(Val16) (((unsigned) (Val16) >> 8) | (((Val16) & 0xff) << 8)) 127 - #endif /* SK_LITTLE_ENDIAN */ 128 - #ifdef SK_BIG_ENDIAN 129 - #define SKCS_HTON16(Val16) (Val16) 130 - #endif /* SK_BIG_ENDIAN */ 131 - #define SKCS_NTOH16(Val16) SKCS_HTON16(Val16) 132 - 133 - /* typedefs *******************************************************************/ 134 - 135 - /* function prototypes ********************************************************/ 136 - 137 - /****************************************************************************** 138 - * 139 - * SkCsGetSendInfo - get checksum information for a send packet 140 - * 141 - * Description: 142 - * Get all checksum information necessary to send a TCP or UDP packet. The 143 - * function checks the IP header passed to it. If the high-level protocol 144 - * is either TCP or UDP the pseudo header checksum is calculated and 145 - * returned. 146 - * 147 - * The function returns the total length of the IP header (including any 148 - * IP option fields), which is the same as the start offset of the IP data 149 - * which in turn is the start offset of the TCP or UDP header. 150 - * 151 - * The function also returns the TCP or UDP pseudo header checksum, which 152 - * should be used as the start value for the hardware checksum calculation. 153 - * (Note that any actual pseudo header checksum can never calculate to 154 - * zero.) 155 - * 156 - * Note: 157 - * There is a bug in the GENESIS ASIC which may lead to wrong checksums. 158 - * 159 - * Arguments: 160 - * pAc - A pointer to the adapter context struct. 161 - * 162 - * pIpHeader - Pointer to IP header. Must be at least the IP header *not* 163 - * including any option fields, i.e. at least 20 bytes. 164 - * 165 - * Note: This pointer will be used to address 8-, 16-, and 32-bit 166 - * variables with the respective alignment offsets relative to the pointer. 167 - * Thus, the pointer should point to a 32-bit aligned address. If the 168 - * target system cannot address 32-bit variables on non 32-bit aligned 169 - * addresses, then the pointer *must* point to a 32-bit aligned address. 170 - * 171 - * pPacketInfo - A pointer to the packet information structure for this 172 - * packet. Before calling this SkCsGetSendInfo(), the following field must 173 - * be initialized: 174 - * 175 - * ProtocolFlags - Initialize with any combination of 176 - * SKCS_PROTO_XXX bit flags. SkCsGetSendInfo() will only work on 177 - * the protocols specified here. Any protocol(s) not specified 178 - * here will be ignored. 179 - * 180 - * Note: Only one checksum can be calculated in hardware. Thus, if 181 - * SKCS_PROTO_IP is specified in the 'ProtocolFlags', 182 - * SkCsGetSendInfo() must calculate the IP header checksum in 183 - * software. It might be a better idea to have the calling 184 - * protocol stack calculate the IP header checksum. 185 - * 186 - * Returns: N/A 187 - * On return, the following fields in 'pPacketInfo' may or may not have 188 - * been filled with information, depending on the protocol(s) found in the 189 - * packet: 190 - * 191 - * ProtocolFlags - Returns the SKCS_PROTO_XXX bit flags of the protocol(s) 192 - * that were both requested by the caller and actually found in the packet. 193 - * Protocol(s) not specified by the caller and/or not found in the packet 194 - * will have their respective SKCS_PROTO_XXX bit flags reset. 195 - * 196 - * Note: For IP fragments, TCP and UDP packet information is ignored. 197 - * 198 - * IpHeaderLength - The total length in bytes of the complete IP header 199 - * including any option fields is returned here. This is the start offset 200 - * of the IP data, i.e. the TCP or UDP header if present. 201 - * 202 - * IpHeaderChecksum - If IP has been specified in the 'ProtocolFlags', the 203 - * 16-bit Internet Checksum of the IP header is returned here. This value 204 - * is to be stored into the packet's 'IP Header Checksum' field. 205 - * 206 - * PseudoHeaderChecksum - If this is a TCP or UDP packet and if TCP or UDP 207 - * has been specified in the 'ProtocolFlags', the 16-bit Internet Checksum 208 - * of the TCP or UDP pseudo header is returned here. 209 - */ 210 - void SkCsGetSendInfo( 211 - SK_AC *pAc, /* Adapter context struct. */ 212 - void *pIpHeader, /* IP header. */ 213 - SKCS_PACKET_INFO *pPacketInfo, /* Packet information struct. */ 214 - int NetNumber) /* Net number */ 215 - { 216 - /* Internet Header Version found in IP header. */ 217 - unsigned InternetHeaderVersion; 218 - 219 - /* Length of the IP header as found in IP header. */ 220 - unsigned IpHeaderLength; 221 - 222 - /* Bit field specifiying the desired/found protocols. */ 223 - unsigned ProtocolFlags; 224 - 225 - /* Next level protocol identifier found in IP header. */ 226 - unsigned NextLevelProtocol; 227 - 228 - /* Length of IP data portion. */ 229 - unsigned IpDataLength; 230 - 231 - /* TCP/UDP pseudo header checksum. */ 232 - unsigned long PseudoHeaderChecksum; 233 - 234 - /* Pointer to next level protocol statistics structure. */ 235 - SKCS_PROTO_STATS *NextLevelProtoStats; 236 - 237 - /* Temporary variable. */ 238 - unsigned Tmp; 239 - 240 - Tmp = *(SK_U8 *) 241 - SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH); 242 - 243 - /* Get the Internet Header Version (IHV). */ 244 - /* Note: The IHV is stored in the upper four bits. */ 245 - 246 - InternetHeaderVersion = Tmp >> 4; 247 - 248 - /* Check the Internet Header Version. */ 249 - /* Note: We currently only support IP version 4. */ 250 - 251 - if (InternetHeaderVersion != 4) { /* IPv4? */ 252 - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX, 253 - ("Tx: Unknown Internet Header Version %u.\n", 254 - InternetHeaderVersion)); 255 - pPacketInfo->ProtocolFlags = 0; 256 - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++; 257 - return; 258 - } 259 - 260 - /* Get the IP header length (IHL). */ 261 - /* 262 - * Note: The IHL is stored in the lower four bits as the number of 263 - * 4-byte words. 264 - */ 265 - 266 - IpHeaderLength = (Tmp & 0xf) * 4; 267 - pPacketInfo->IpHeaderLength = IpHeaderLength; 268 - 269 - /* Check the IP header length. */ 270 - 271 - /* 04-Aug-1998 sw - Really check the IHL? Necessary? */ 272 - 273 - if (IpHeaderLength < 5*4) { 274 - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX, 275 - ("Tx: Invalid IP Header Length %u.\n", IpHeaderLength)); 276 - pPacketInfo->ProtocolFlags = 0; 277 - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++; 278 - return; 279 - } 280 - 281 - /* This is an IPv4 frame with a header of valid length. */ 282 - 283 - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxOkCts++; 284 - 285 - /* Check if we should calculate the IP header checksum. */ 286 - 287 - ProtocolFlags = pPacketInfo->ProtocolFlags; 288 - 289 - if (ProtocolFlags & SKCS_PROTO_IP) { 290 - pPacketInfo->IpHeaderChecksum = 291 - SkCsCalculateChecksum(pIpHeader, IpHeaderLength); 292 - } 293 - 294 - /* Get the next level protocol identifier. */ 295 - 296 - NextLevelProtocol = 297 - *(SK_U8 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); 298 - 299 - /* 300 - * Check if this is a TCP or UDP frame and if we should calculate the 301 - * TCP/UDP pseudo header checksum. 302 - * 303 - * Also clear all protocol bit flags of protocols not present in the 304 - * frame. 305 - */ 306 - 307 - if ((ProtocolFlags & SKCS_PROTO_TCP) != 0 && 308 - NextLevelProtocol == SKCS_PROTO_ID_TCP) { 309 - /* TCP/IP frame. */ 310 - ProtocolFlags &= SKCS_PROTO_TCP | SKCS_PROTO_IP; 311 - NextLevelProtoStats = 312 - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP]; 313 - } 314 - else if ((ProtocolFlags & SKCS_PROTO_UDP) != 0 && 315 - NextLevelProtocol == SKCS_PROTO_ID_UDP) { 316 - /* UDP/IP frame. */ 317 - ProtocolFlags &= SKCS_PROTO_UDP | SKCS_PROTO_IP; 318 - NextLevelProtoStats = 319 - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP]; 320 - } 321 - else { 322 - /* 323 - * Either not a TCP or UDP frame and/or TCP/UDP processing not 324 - * specified. 325 - */ 326 - pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP; 327 - return; 328 - } 329 - 330 - /* Check if this is an IP fragment. */ 331 - 332 - /* 333 - * Note: An IP fragment has a non-zero "Fragment Offset" field and/or 334 - * the "More Fragments" bit set. Thus, if both the "Fragment Offset" 335 - * and the "More Fragments" are zero, it is *not* a fragment. We can 336 - * easily check both at the same time since they are in the same 16-bit 337 - * word. 338 - */ 339 - 340 - if ((*(SK_U16 *) 341 - SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) & 342 - ~SKCS_IP_DONT_FRAGMENT) != 0) { 343 - /* IP fragment; ignore all other protocols. */ 344 - pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP; 345 - NextLevelProtoStats->TxUnableCts++; 346 - return; 347 - } 348 - 349 - /* 350 - * Calculate the TCP/UDP pseudo header checksum. 351 - */ 352 - 353 - /* Get total length of IP header and data. */ 354 - 355 - IpDataLength = 356 - *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH); 357 - 358 - /* Get length of IP data portion. */ 359 - 360 - IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength; 361 - 362 - /* Calculate the sum of all pseudo header fields (16-bit). */ 363 - 364 - PseudoHeaderChecksum = 365 - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, 366 - SKCS_OFS_IP_SOURCE_ADDRESS + 0) + 367 - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, 368 - SKCS_OFS_IP_SOURCE_ADDRESS + 2) + 369 - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, 370 - SKCS_OFS_IP_DESTINATION_ADDRESS + 0) + 371 - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, 372 - SKCS_OFS_IP_DESTINATION_ADDRESS + 2) + 373 - (unsigned long) SKCS_HTON16(NextLevelProtocol) + 374 - (unsigned long) SKCS_HTON16(IpDataLength); 375 - 376 - /* Add-in any carries. */ 377 - 378 - SKCS_OC_ADD(PseudoHeaderChecksum, PseudoHeaderChecksum, 0); 379 - 380 - /* Add-in any new carry. */ 381 - 382 - SKCS_OC_ADD(pPacketInfo->PseudoHeaderChecksum, PseudoHeaderChecksum, 0); 383 - 384 - pPacketInfo->ProtocolFlags = ProtocolFlags; 385 - NextLevelProtoStats->TxOkCts++; /* Success. */ 386 - } /* SkCsGetSendInfo */ 387 - 388 - 389 - /****************************************************************************** 390 - * 391 - * SkCsGetReceiveInfo - verify checksum information for a received packet 392 - * 393 - * Description: 394 - * Verify a received frame's checksum. The function returns a status code 395 - * reflecting the result of the verification. 396 - * 397 - * Note: 398 - * Before calling this function you have to verify that the frame is 399 - * not padded and Checksum1 and Checksum2 are bigger than 1. 400 - * 401 - * Arguments: 402 - * pAc - Pointer to adapter context struct. 403 - * 404 - * pIpHeader - Pointer to IP header. Must be at least the length in bytes 405 - * of the received IP header including any option fields. For UDP packets, 406 - * 8 additional bytes are needed to access the UDP checksum. 407 - * 408 - * Note: The actual length of the IP header is stored in the lower four 409 - * bits of the first octet of the IP header as the number of 4-byte words, 410 - * so it must be multiplied by four to get the length in bytes. Thus, the 411 - * maximum IP header length is 15 * 4 = 60 bytes. 412 - * 413 - * Checksum1 - The first 16-bit Internet Checksum calculated by the 414 - * hardware starting at the offset returned by SkCsSetReceiveFlags(). 415 - * 416 - * Checksum2 - The second 16-bit Internet Checksum calculated by the 417 - * hardware starting at the offset returned by SkCsSetReceiveFlags(). 418 - * 419 - * Returns: 420 - * SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame. 421 - * SKCS_STATUS_IP_CSUM_ERROR - IP checksum error. 422 - * SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame. 423 - * SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame 424 - * SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok). 425 - * SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame). 426 - * SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok). 427 - * SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok). 428 - * SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok. 429 - * SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok. 430 - * SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum. 431 - * 432 - * Note: If SKCS_OVERWRITE_STATUS is defined, the SKCS_STATUS_XXX values 433 - * returned here can be defined in some header file by the module using CSUM. 434 - * In this way, the calling module can assign return values for its own needs, 435 - * e.g. by assigning bit flags to the individual protocols. 436 - */ 437 - SKCS_STATUS SkCsGetReceiveInfo( 438 - SK_AC *pAc, /* Adapter context struct. */ 439 - void *pIpHeader, /* IP header. */ 440 - unsigned Checksum1, /* Hardware checksum 1. */ 441 - unsigned Checksum2, /* Hardware checksum 2. */ 442 - int NetNumber) /* Net number */ 443 - { 444 - /* Internet Header Version found in IP header. */ 445 - unsigned InternetHeaderVersion; 446 - 447 - /* Length of the IP header as found in IP header. */ 448 - unsigned IpHeaderLength; 449 - 450 - /* Length of IP data portion. */ 451 - unsigned IpDataLength; 452 - 453 - /* IP header checksum. */ 454 - unsigned IpHeaderChecksum; 455 - 456 - /* IP header options checksum, if any. */ 457 - unsigned IpOptionsChecksum; 458 - 459 - /* IP data checksum, i.e. TCP/UDP checksum. */ 460 - unsigned IpDataChecksum; 461 - 462 - /* Next level protocol identifier found in IP header. */ 463 - unsigned NextLevelProtocol; 464 - 465 - /* The checksum of the "next level protocol", i.e. TCP or UDP. */ 466 - unsigned long NextLevelProtocolChecksum; 467 - 468 - /* Pointer to next level protocol statistics structure. */ 469 - SKCS_PROTO_STATS *NextLevelProtoStats; 470 - 471 - /* Temporary variable. */ 472 - unsigned Tmp; 473 - 474 - Tmp = *(SK_U8 *) 475 - SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH); 476 - 477 - /* Get the Internet Header Version (IHV). */ 478 - /* Note: The IHV is stored in the upper four bits. */ 479 - 480 - InternetHeaderVersion = Tmp >> 4; 481 - 482 - /* Check the Internet Header Version. */ 483 - /* Note: We currently only support IP version 4. */ 484 - 485 - if (InternetHeaderVersion != 4) { /* IPv4? */ 486 - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX, 487 - ("Rx: Unknown Internet Header Version %u.\n", 488 - InternetHeaderVersion)); 489 - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxUnableCts++; 490 - return (SKCS_STATUS_UNKNOWN_IP_VERSION); 491 - } 492 - 493 - /* Get the IP header length (IHL). */ 494 - /* 495 - * Note: The IHL is stored in the lower four bits as the number of 496 - * 4-byte words. 497 - */ 498 - 499 - IpHeaderLength = (Tmp & 0xf) * 4; 500 - 501 - /* Check the IP header length. */ 502 - 503 - /* 04-Aug-1998 sw - Really check the IHL? Necessary? */ 504 - 505 - if (IpHeaderLength < 5*4) { 506 - SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX, 507 - ("Rx: Invalid IP Header Length %u.\n", IpHeaderLength)); 508 - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; 509 - return (SKCS_STATUS_IP_CSUM_ERROR); 510 - } 511 - 512 - /* This is an IPv4 frame with a header of valid length. */ 513 - 514 - /* Get the IP header and data checksum. */ 515 - 516 - IpDataChecksum = Checksum2; 517 - 518 - /* 519 - * The IP header checksum is calculated as follows: 520 - * 521 - * IpHeaderChecksum = Checksum1 - Checksum2 522 - */ 523 - 524 - SKCS_OC_SUB(IpHeaderChecksum, Checksum1, Checksum2); 525 - 526 - /* Check if any IP header options. */ 527 - 528 - if (IpHeaderLength > SKCS_IP_HEADER_SIZE) { 529 - 530 - /* Get the IP options checksum. */ 531 - 532 - IpOptionsChecksum = SkCsCalculateChecksum( 533 - SKCS_IDX(pIpHeader, SKCS_IP_HEADER_SIZE), 534 - IpHeaderLength - SKCS_IP_HEADER_SIZE); 535 - 536 - /* Adjust the IP header and IP data checksums. */ 537 - 538 - SKCS_OC_ADD(IpHeaderChecksum, IpHeaderChecksum, IpOptionsChecksum); 539 - 540 - SKCS_OC_SUB(IpDataChecksum, IpDataChecksum, IpOptionsChecksum); 541 - } 542 - 543 - /* 544 - * Check if the IP header checksum is ok. 545 - * 546 - * NOTE: We must check the IP header checksum even if the caller just wants 547 - * us to check upper-layer checksums, because we cannot do any further 548 - * processing of the packet without a valid IP checksum. 549 - */ 550 - 551 - /* Get the next level protocol identifier. */ 552 - 553 - NextLevelProtocol = *(SK_U8 *) 554 - SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); 555 - 556 - if (IpHeaderChecksum != 0xffff) { 557 - pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; 558 - /* the NDIS tester wants to know the upper level protocol too */ 559 - if (NextLevelProtocol == SKCS_PROTO_ID_TCP) { 560 - return(SKCS_STATUS_IP_CSUM_ERROR_TCP); 561 - } 562 - else if (NextLevelProtocol == SKCS_PROTO_ID_UDP) { 563 - return(SKCS_STATUS_IP_CSUM_ERROR_UDP); 564 - } 565 - return (SKCS_STATUS_IP_CSUM_ERROR); 566 - } 567 - 568 - /* 569 - * Check if this is a TCP or UDP frame and if we should calculate the 570 - * TCP/UDP pseudo header checksum. 571 - * 572 - * Also clear all protocol bit flags of protocols not present in the 573 - * frame. 574 - */ 575 - 576 - if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_TCP) != 0 && 577 - NextLevelProtocol == SKCS_PROTO_ID_TCP) { 578 - /* TCP/IP frame. */ 579 - NextLevelProtoStats = 580 - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP]; 581 - } 582 - else if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_UDP) != 0 && 583 - NextLevelProtocol == SKCS_PROTO_ID_UDP) { 584 - /* UDP/IP frame. */ 585 - NextLevelProtoStats = 586 - &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP]; 587 - } 588 - else { 589 - /* 590 - * Either not a TCP or UDP frame and/or TCP/UDP processing not 591 - * specified. 592 - */ 593 - return (SKCS_STATUS_IP_CSUM_OK); 594 - } 595 - 596 - /* Check if this is an IP fragment. */ 597 - 598 - /* 599 - * Note: An IP fragment has a non-zero "Fragment Offset" field and/or 600 - * the "More Fragments" bit set. Thus, if both the "Fragment Offset" 601 - * and the "More Fragments" are zero, it is *not* a fragment. We can 602 - * easily check both at the same time since they are in the same 16-bit 603 - * word. 604 - */ 605 - 606 - if ((*(SK_U16 *) 607 - SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) & 608 - ~SKCS_IP_DONT_FRAGMENT) != 0) { 609 - /* IP fragment; ignore all other protocols. */ 610 - NextLevelProtoStats->RxUnableCts++; 611 - return (SKCS_STATUS_IP_FRAGMENT); 612 - } 613 - 614 - /* 615 - * 08-May-2000 ra 616 - * 617 - * From RFC 768 (UDP) 618 - * If the computed checksum is zero, it is transmitted as all ones (the 619 - * equivalent in one's complement arithmetic). An all zero transmitted 620 - * checksum value means that the transmitter generated no checksum (for 621 - * debugging or for higher level protocols that don't care). 622 - */ 623 - 624 - if (NextLevelProtocol == SKCS_PROTO_ID_UDP && 625 - *(SK_U16*)SKCS_IDX(pIpHeader, IpHeaderLength + 6) == 0x0000) { 626 - 627 - NextLevelProtoStats->RxOkCts++; 628 - 629 - return (SKCS_STATUS_IP_CSUM_OK_NO_UDP); 630 - } 631 - 632 - /* 633 - * Calculate the TCP/UDP checksum. 634 - */ 635 - 636 - /* Get total length of IP header and data. */ 637 - 638 - IpDataLength = 639 - *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH); 640 - 641 - /* Get length of IP data portion. */ 642 - 643 - IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength; 644 - 645 - NextLevelProtocolChecksum = 646 - 647 - /* Calculate the pseudo header checksum. */ 648 - 649 - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, 650 - SKCS_OFS_IP_SOURCE_ADDRESS + 0) + 651 - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, 652 - SKCS_OFS_IP_SOURCE_ADDRESS + 2) + 653 - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, 654 - SKCS_OFS_IP_DESTINATION_ADDRESS + 0) + 655 - (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader, 656 - SKCS_OFS_IP_DESTINATION_ADDRESS + 2) + 657 - (unsigned long) SKCS_HTON16(NextLevelProtocol) + 658 - (unsigned long) SKCS_HTON16(IpDataLength) + 659 - 660 - /* Add the TCP/UDP header checksum. */ 661 - 662 - (unsigned long) IpDataChecksum; 663 - 664 - /* Add-in any carries. */ 665 - 666 - SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0); 667 - 668 - /* Add-in any new carry. */ 669 - 670 - SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0); 671 - 672 - /* Check if the TCP/UDP checksum is ok. */ 673 - 674 - if ((unsigned) NextLevelProtocolChecksum == 0xffff) { 675 - 676 - /* TCP/UDP checksum ok. */ 677 - 678 - NextLevelProtoStats->RxOkCts++; 679 - 680 - return (NextLevelProtocol == SKCS_PROTO_ID_TCP ? 681 - SKCS_STATUS_TCP_CSUM_OK : SKCS_STATUS_UDP_CSUM_OK); 682 - } 683 - 684 - /* TCP/UDP checksum error. */ 685 - 686 - NextLevelProtoStats->RxErrCts++; 687 - 688 - return (NextLevelProtocol == SKCS_PROTO_ID_TCP ? 689 - SKCS_STATUS_TCP_CSUM_ERROR : SKCS_STATUS_UDP_CSUM_ERROR); 690 - } /* SkCsGetReceiveInfo */ 691 - 692 - 693 - /****************************************************************************** 694 - * 695 - * SkCsSetReceiveFlags - set checksum receive flags 696 - * 697 - * Description: 698 - * Use this function to set the various receive flags. According to the 699 - * protocol flags set by the caller, the start offsets within received 700 - * packets of the two hardware checksums are returned. These offsets must 701 - * be stored in all receive descriptors. 702 - * 703 - * Arguments: 704 - * pAc - Pointer to adapter context struct. 705 - * 706 - * ReceiveFlags - Any combination of SK_PROTO_XXX flags of the protocols 707 - * for which the caller wants checksum information on received frames. 708 - * 709 - * pChecksum1Offset - The start offset of the first receive descriptor 710 - * hardware checksum to be calculated for received frames is returned 711 - * here. 712 - * 713 - * pChecksum2Offset - The start offset of the second receive descriptor 714 - * hardware checksum to be calculated for received frames is returned 715 - * here. 716 - * 717 - * Returns: N/A 718 - * Returns the two hardware checksum start offsets. 719 - */ 720 - void SkCsSetReceiveFlags( 721 - SK_AC *pAc, /* Adapter context struct. */ 722 - unsigned ReceiveFlags, /* New receive flags. */ 723 - unsigned *pChecksum1Offset, /* Offset for hardware checksum 1. */ 724 - unsigned *pChecksum2Offset, /* Offset for hardware checksum 2. */ 725 - int NetNumber) 726 - { 727 - /* Save the receive flags. */ 728 - 729 - pAc->Csum.ReceiveFlags[NetNumber] = ReceiveFlags; 730 - 731 - /* First checksum start offset is the IP header. */ 732 - *pChecksum1Offset = SKCS_MAC_HEADER_SIZE; 733 - 734 - /* 735 - * Second checksum start offset is the IP data. Note that this may vary 736 - * if there are any IP header options in the actual packet. 737 - */ 738 - *pChecksum2Offset = SKCS_MAC_HEADER_SIZE + SKCS_IP_HEADER_SIZE; 739 - } /* SkCsSetReceiveFlags */ 740 - 741 - #ifndef SK_CS_CALCULATE_CHECKSUM 742 - 743 - /****************************************************************************** 744 - * 745 - * SkCsCalculateChecksum - calculate checksum for specified data 746 - * 747 - * Description: 748 - * Calculate and return the 16-bit Internet Checksum for the specified 749 - * data. 750 - * 751 - * Arguments: 752 - * pData - Pointer to data for which the checksum shall be calculated. 753 - * Note: The pointer should be aligned on a 16-bit boundary. 754 - * 755 - * Length - Length in bytes of data to checksum. 756 - * 757 - * Returns: 758 - * The 16-bit Internet Checksum for the specified data. 759 - * 760 - * Note: The checksum is calculated in the machine's natural byte order, 761 - * i.e. little vs. big endian. Thus, the resulting checksum is different 762 - * for the same input data on little and big endian machines. 763 - * 764 - * However, when written back to the network packet, the byte order is 765 - * always in correct network order. 766 - */ 767 - unsigned SkCsCalculateChecksum( 768 - void *pData, /* Data to checksum. */ 769 - unsigned Length) /* Length of data. */ 770 - { 771 - SK_U16 *pU16; /* Pointer to the data as 16-bit words. */ 772 - unsigned long Checksum; /* Checksum; must be at least 32 bits. */ 773 - 774 - /* Sum up all 16-bit words. */ 775 - 776 - pU16 = (SK_U16 *) pData; 777 - for (Checksum = 0; Length > 1; Length -= 2) { 778 - Checksum += *pU16++; 779 - } 780 - 781 - /* If this is an odd number of bytes, add-in the last byte. */ 782 - 783 - if (Length > 0) { 784 - #ifdef SK_BIG_ENDIAN 785 - /* Add the last byte as the high byte. */ 786 - Checksum += ((unsigned) *(SK_U8 *) pU16) << 8; 787 - #else /* !SK_BIG_ENDIAN */ 788 - /* Add the last byte as the low byte. */ 789 - Checksum += *(SK_U8 *) pU16; 790 - #endif /* !SK_BIG_ENDIAN */ 791 - } 792 - 793 - /* Add-in any carries. */ 794 - 795 - SKCS_OC_ADD(Checksum, Checksum, 0); 796 - 797 - /* Add-in any new carry. */ 798 - 799 - SKCS_OC_ADD(Checksum, Checksum, 0); 800 - 801 - /* Note: All bits beyond the 16-bit limit are now zero. */ 802 - 803 - return ((unsigned) Checksum); 804 - } /* SkCsCalculateChecksum */ 805 - 806 - #endif /* SK_CS_CALCULATE_CHECKSUM */ 807 - 808 - /****************************************************************************** 809 - * 810 - * SkCsEvent - the CSUM event dispatcher 811 - * 812 - * Description: 813 - * This is the event handler for the CSUM module. 814 - * 815 - * Arguments: 816 - * pAc - Pointer to adapter context. 817 - * 818 - * Ioc - I/O context. 819 - * 820 - * Event - Event id. 821 - * 822 - * Param - Event dependent parameter. 823 - * 824 - * Returns: 825 - * The 16-bit Internet Checksum for the specified data. 826 - * 827 - * Note: The checksum is calculated in the machine's natural byte order, 828 - * i.e. little vs. big endian. Thus, the resulting checksum is different 829 - * for the same input data on little and big endian machines. 830 - * 831 - * However, when written back to the network packet, the byte order is 832 - * always in correct network order. 833 - */ 834 - int SkCsEvent( 835 - SK_AC *pAc, /* Pointer to adapter context. */ 836 - SK_IOC Ioc, /* I/O context. */ 837 - SK_U32 Event, /* Event id. */ 838 - SK_EVPARA Param) /* Event dependent parameter. */ 839 - { 840 - int ProtoIndex; 841 - int NetNumber; 842 - 843 - switch (Event) { 844 - /* 845 - * Clear protocol statistics. 846 - * 847 - * Param - Protocol index, or -1 for all protocols. 848 - * - Net number. 849 - */ 850 - case SK_CSUM_EVENT_CLEAR_PROTO_STATS: 851 - 852 - ProtoIndex = (int)Param.Para32[1]; 853 - NetNumber = (int)Param.Para32[0]; 854 - if (ProtoIndex < 0) { /* Clear for all protocols. */ 855 - if (NetNumber >= 0) { 856 - SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][0], 0, 857 - sizeof(pAc->Csum.ProtoStats[NetNumber])); 858 - } 859 - } 860 - else { /* Clear for individual protocol. */ 861 - SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][ProtoIndex], 0, 862 - sizeof(pAc->Csum.ProtoStats[NetNumber][ProtoIndex])); 863 - } 864 - break; 865 - default: 866 - break; 867 - } 868 - return (0); /* Success. */ 869 - } /* SkCsEvent */ 870 - 871 - #endif /* SK_USE_CSUM */
···
+2
drivers/net/sk98lin/skethtool.c
··· 549 .phys_id = locateDevice, 550 .get_pauseparam = getPauseParams, 551 .set_pauseparam = setPauseParams, 552 };
··· 549 .phys_id = locateDevice, 550 .get_pauseparam = getPauseParams, 551 .set_pauseparam = setPauseParams, 552 + .get_link = ethtool_op_get_link, 553 + .get_perm_addr = ethtool_op_get_perm_addr, 554 };
+41 -133
drivers/net/sk98lin/skge.c
··· 101 * "h/skgeinit.h" 102 * "h/skaddr.h" 103 * "h/skgesirq.h" 104 - * "h/skcsum.h" 105 * "h/skrlmt.h" 106 * 107 ******************************************************************************/ ··· 112 #include <linux/init.h> 113 #include <linux/proc_fs.h> 114 #include <linux/dma-mapping.h> 115 116 #include "h/skdrv1st.h" 117 #include "h/skdrv2nd.h" ··· 601 return(-EAGAIN); 602 } 603 604 - SkCsSetReceiveFlags(pAC, 605 - SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP, 606 - &pAC->CsOfs1, &pAC->CsOfs2, 0); 607 - pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1; 608 - 609 BoardInitMem(pAC); 610 /* tschilling: New common function with minimum size check. */ 611 DualNet = SK_FALSE; ··· 818 /* set the pointers right */ 819 pDescr->VNextRxd = VNextDescr & 0xffffffffULL; 820 pDescr->pNextRxd = pNextDescr; 821 - pDescr->TcpSumStarts = pAC->CsOfs; 822 823 /* advance one step */ 824 pPrevDescr = pDescr; ··· 1500 TXD *pOldTxd; 1501 unsigned long Flags; 1502 SK_U64 PhysAddr; 1503 - int Protocol; 1504 - int IpHeaderLength; 1505 int BytesSend = pMessage->len; 1506 1507 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("X")); ··· 1572 pTxd->pMBuf = pMessage; 1573 1574 if (pMessage->ip_summed == CHECKSUM_HW) { 1575 - Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff); 1576 - if ((Protocol == C_PROTO_ID_UDP) && 1577 (pAC->GIni.GIChipRev == 0) && 1578 (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { 1579 pTxd->TBControl = BMU_TCP_CHECK; ··· 1583 pTxd->TBControl = BMU_UDP_CHECK; 1584 } 1585 1586 - IpHeaderLength = (SK_U8)pMessage->data[C_OFFSET_IPHEADER]; 1587 - IpHeaderLength = (IpHeaderLength & 0xf) * 4; 1588 - pTxd->TcpSumOfs = 0; /* PH-Checksum already calculated */ 1589 - pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength + 1590 - (Protocol == C_PROTO_ID_UDP ? 1591 - C_OFFSET_UDPHEADER_UDPCS : 1592 - C_OFFSET_TCPHEADER_TCPCS); 1593 - pTxd->TcpSumWr = C_LEN_ETHERMAC_HEADER + IpHeaderLength; 1594 1595 pTxd->TBControl |= BMU_OWN | BMU_STF | 1596 BMU_SW | BMU_EOF | ··· 1648 TXD *pTxdLst; 1649 int CurrFrag; 1650 int BytesSend; 1651 - int IpHeaderLength; 1652 - int Protocol; 1653 skb_frag_t *sk_frag; 1654 SK_U64 PhysAddr; 1655 unsigned long Flags; 1656 1657 spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); 1658 #ifndef USE_TX_COMPLETE ··· 1674 pTxdFst = pTxd; 1675 pTxdLst = pTxd; 1676 BytesSend = 0; 1677 - Protocol = 0; 1678 1679 /* 1680 ** Map the first fragment (header) into the DMA-space ··· 1691 ** Does the HW need to evaluate checksum for TCP or UDP packets? 1692 */ 1693 if (pMessage->ip_summed == CHECKSUM_HW) { 1694 - pTxd->TBControl = BMU_STF | BMU_STFWD | skb_headlen(pMessage); 1695 /* 1696 ** We have to use the opcode for tcp here, because the 1697 ** opcode for udp is not working in the hardware yet 1698 ** (Revision 2.0) 1699 */ 1700 - Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff); 1701 - if ((Protocol == C_PROTO_ID_UDP) && 1702 (pAC->GIni.GIChipRev == 0) && 1703 (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { 1704 - pTxd->TBControl |= BMU_TCP_CHECK; 1705 } else { 1706 - pTxd->TBControl |= BMU_UDP_CHECK; 1707 } 1708 1709 - IpHeaderLength = ((SK_U8)pMessage->data[C_OFFSET_IPHEADER] & 0xf)*4; 1710 - pTxd->TcpSumOfs = 0; /* PH-Checksum already claculated */ 1711 - pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength + 1712 - (Protocol == C_PROTO_ID_UDP ? 1713 - C_OFFSET_UDPHEADER_UDPCS : 1714 - C_OFFSET_TCPHEADER_TCPCS); 1715 - pTxd->TcpSumWr = C_LEN_ETHERMAC_HEADER + IpHeaderLength; 1716 - } else { 1717 - pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_STF | 1718 - skb_headlen(pMessage); 1719 - } 1720 1721 pTxd = pTxd->pNextTxd; 1722 pTxPort->TxdRingFree--; ··· 1739 pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); 1740 pTxd->pMBuf = pMessage; 1741 1742 - /* 1743 - ** Does the HW need to evaluate checksum for TCP or UDP packets? 1744 - */ 1745 - if (pMessage->ip_summed == CHECKSUM_HW) { 1746 - pTxd->TBControl = BMU_OWN | BMU_SW | BMU_STFWD; 1747 - /* 1748 - ** We have to use the opcode for tcp here because the 1749 - ** opcode for udp is not working in the hardware yet 1750 - ** (revision 2.0) 1751 - */ 1752 - if ((Protocol == C_PROTO_ID_UDP) && 1753 - (pAC->GIni.GIChipRev == 0) && 1754 - (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { 1755 - pTxd->TBControl |= BMU_TCP_CHECK; 1756 - } else { 1757 - pTxd->TBControl |= BMU_UDP_CHECK; 1758 - } 1759 - } else { 1760 - pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_OWN; 1761 - } 1762 1763 /* 1764 ** Do we have the last fragment? 1765 */ 1766 if( (CurrFrag+1) == skb_shinfo(pMessage)->nr_frags ) { 1767 #ifdef USE_TX_COMPLETE 1768 - pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF | sk_frag->size; 1769 #else 1770 - pTxd->TBControl |= BMU_EOF | sk_frag->size; 1771 #endif 1772 pTxdFst->TBControl |= BMU_OWN | BMU_SW; 1773 - 1774 - } else { 1775 - pTxd->TBControl |= sk_frag->size; 1776 } 1777 pTxdLst = pTxd; 1778 pTxd = pTxd->pNextTxd; ··· 1997 struct sk_buff *pMsg; /* pointer to message holding frame */ 1998 struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */ 1999 int FrameLength; /* total length of received frame */ 2000 - int IpFrameLength; 2001 SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */ 2002 SK_EVPARA EvPara; /* an event parameter union */ 2003 unsigned long Flags; /* for spin lock */ ··· 2009 SK_BOOL IsBadFrame; /* Bad frame */ 2010 2011 SK_U32 FrameStat; 2012 - unsigned short Csum1; 2013 - unsigned short Csum2; 2014 - unsigned short Type; 2015 - int Result; 2016 SK_U64 PhysAddr; 2017 2018 rx_start: ··· 2137 (dma_addr_t) PhysAddr, 2138 FrameLength, 2139 PCI_DMA_FROMDEVICE); 2140 - eth_copy_and_sum(pNewMsg, pMsg->data, 2141 - FrameLength, 0); 2142 pci_dma_sync_single_for_device(pAC->PciDev, 2143 (dma_addr_t) PhysAddr, 2144 FrameLength, ··· 2166 2167 /* set length in message */ 2168 skb_put(pMsg, FrameLength); 2169 - /* hardware checksum */ 2170 - Type = ntohs(*((short*)&pMsg->data[12])); 2171 2172 #ifdef USE_SK_RX_CHECKSUM 2173 - if (Type == 0x800) { 2174 - Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff); 2175 - Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff); 2176 - IpFrameLength = (int) ntohs((unsigned short) 2177 - ((unsigned short *) pMsg->data)[8]); 2178 - 2179 - /* 2180 - * Test: If frame is padded, a check is not possible! 2181 - * Frame not padded? Length difference must be 14 (0xe)! 2182 - */ 2183 - if ((FrameLength - IpFrameLength) != 0xe) { 2184 - /* Frame padded => TCP offload not possible! */ 2185 - pMsg->ip_summed = CHECKSUM_NONE; 2186 - } else { 2187 - /* Frame not padded => TCP offload! */ 2188 - if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) && 2189 - (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) || 2190 - (pAC->ChipsetType)) { 2191 - Result = SkCsGetReceiveInfo(pAC, 2192 - &pMsg->data[14], 2193 - Csum1, Csum2, pRxPort->PortIndex); 2194 - if (Result == 2195 - SKCS_STATUS_IP_FRAGMENT || 2196 - Result == 2197 - SKCS_STATUS_IP_CSUM_OK || 2198 - Result == 2199 - SKCS_STATUS_TCP_CSUM_OK || 2200 - Result == 2201 - SKCS_STATUS_UDP_CSUM_OK) { 2202 - pMsg->ip_summed = 2203 - CHECKSUM_UNNECESSARY; 2204 - } 2205 - else if (Result == 2206 - SKCS_STATUS_TCP_CSUM_ERROR || 2207 - Result == 2208 - SKCS_STATUS_UDP_CSUM_ERROR || 2209 - Result == 2210 - SKCS_STATUS_IP_CSUM_ERROR_UDP || 2211 - Result == 2212 - SKCS_STATUS_IP_CSUM_ERROR_TCP || 2213 - Result == 2214 - SKCS_STATUS_IP_CSUM_ERROR ) { 2215 - /* HW Checksum error */ 2216 - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 2217 - SK_DBGCAT_DRV_RX_PROGRESS, 2218 - ("skge: CRC error. Frame dropped!\n")); 2219 - goto rx_failed; 2220 - } else { 2221 - pMsg->ip_summed = 2222 - CHECKSUM_NONE; 2223 - } 2224 - }/* checksumControl calculation valid */ 2225 - } /* Frame length check */ 2226 - } /* IP frame */ 2227 #else 2228 - pMsg->ip_summed = CHECKSUM_NONE; 2229 #endif 2230 - } /* frame > SK_COPY_TRESHOLD */ 2231 - 2232 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); 2233 ForRlmt = SK_RLMT_RX_PROTOCOL; 2234 #if 0 ··· 4853 dev->irq = pdev->irq; 4854 error = SkGeInitPCI(pAC); 4855 if (error) { 4856 - printk("SKGE: PCI setup failed: %i\n", error); 4857 goto out_free_netdev; 4858 } 4859 ··· 4889 4890 /* Register net device */ 4891 if (register_netdev(dev)) { 4892 - printk(KERN_ERR "SKGE: Could not register device.\n"); 4893 goto out_free_resources; 4894 } 4895 ··· 4908 4909 SkGeYellowLED(pAC, pAC->IoBase, 1); 4910 4911 - 4912 memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6); 4913 4914 SkGeProcCreate(dev); 4915 ··· 4955 #endif 4956 4957 if (register_netdev(dev)) { 4958 - printk(KERN_ERR "SKGE: Could not register device.\n"); 4959 free_netdev(dev); 4960 pAC->dev[1] = pAC->dev[0]; 4961 } else { 4962 SkGeProcCreate(dev); 4963 memcpy(&dev->dev_addr, 4964 &pAC->Addr.Net[1].CurrentMacAddress, 6); 4965 4966 printk("%s: %s\n", dev->name, pAC->DeviceStr); 4967 printk(" PrefPort:B RlmtMode:Dual Check Link State\n");
··· 101 * "h/skgeinit.h" 102 * "h/skaddr.h" 103 * "h/skgesirq.h" 104 * "h/skrlmt.h" 105 * 106 ******************************************************************************/ ··· 113 #include <linux/init.h> 114 #include <linux/proc_fs.h> 115 #include <linux/dma-mapping.h> 116 + #include <linux/ip.h> 117 118 #include "h/skdrv1st.h" 119 #include "h/skdrv2nd.h" ··· 601 return(-EAGAIN); 602 } 603 604 BoardInitMem(pAC); 605 /* tschilling: New common function with minimum size check. */ 606 DualNet = SK_FALSE; ··· 823 /* set the pointers right */ 824 pDescr->VNextRxd = VNextDescr & 0xffffffffULL; 825 pDescr->pNextRxd = pNextDescr; 826 + pDescr->TcpSumStarts = 0; 827 828 /* advance one step */ 829 pPrevDescr = pDescr; ··· 1505 TXD *pOldTxd; 1506 unsigned long Flags; 1507 SK_U64 PhysAddr; 1508 int BytesSend = pMessage->len; 1509 1510 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("X")); ··· 1579 pTxd->pMBuf = pMessage; 1580 1581 if (pMessage->ip_summed == CHECKSUM_HW) { 1582 + u16 hdrlen = pMessage->h.raw - pMessage->data; 1583 + u16 offset = hdrlen + pMessage->csum; 1584 + 1585 + if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) && 1586 (pAC->GIni.GIChipRev == 0) && 1587 (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { 1588 pTxd->TBControl = BMU_TCP_CHECK; ··· 1588 pTxd->TBControl = BMU_UDP_CHECK; 1589 } 1590 1591 + pTxd->TcpSumOfs = 0; 1592 + pTxd->TcpSumSt = hdrlen; 1593 + pTxd->TcpSumWr = offset; 1594 1595 pTxd->TBControl |= BMU_OWN | BMU_STF | 1596 BMU_SW | BMU_EOF | ··· 1658 TXD *pTxdLst; 1659 int CurrFrag; 1660 int BytesSend; 1661 skb_frag_t *sk_frag; 1662 SK_U64 PhysAddr; 1663 unsigned long Flags; 1664 + SK_U32 Control; 1665 1666 spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); 1667 #ifndef USE_TX_COMPLETE ··· 1685 pTxdFst = pTxd; 1686 pTxdLst = pTxd; 1687 BytesSend = 0; 1688 1689 /* 1690 ** Map the first fragment (header) into the DMA-space ··· 1703 ** Does the HW need to evaluate checksum for TCP or UDP packets? 1704 */ 1705 if (pMessage->ip_summed == CHECKSUM_HW) { 1706 + u16 hdrlen = pMessage->h.raw - pMessage->data; 1707 + u16 offset = hdrlen + pMessage->csum; 1708 + 1709 + Control = BMU_STFWD; 1710 + 1711 /* 1712 ** We have to use the opcode for tcp here, because the 1713 ** opcode for udp is not working in the hardware yet 1714 ** (Revision 2.0) 1715 */ 1716 + if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) && 1717 (pAC->GIni.GIChipRev == 0) && 1718 (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { 1719 + Control |= BMU_TCP_CHECK; 1720 } else { 1721 + Control |= BMU_UDP_CHECK; 1722 } 1723 1724 + pTxd->TcpSumOfs = 0; 1725 + pTxd->TcpSumSt = hdrlen; 1726 + pTxd->TcpSumWr = offset; 1727 + } else 1728 + Control = BMU_CHECK | BMU_SW; 1729 + 1730 + pTxd->TBControl = BMU_STF | Control | skb_headlen(pMessage); 1731 1732 pTxd = pTxd->pNextTxd; 1733 pTxPort->TxdRingFree--; ··· 1752 pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); 1753 pTxd->pMBuf = pMessage; 1754 1755 + pTxd->TBControl = Control | BMU_OWN | sk_frag->size;; 1756 1757 /* 1758 ** Do we have the last fragment? 1759 */ 1760 if( (CurrFrag+1) == skb_shinfo(pMessage)->nr_frags ) { 1761 #ifdef USE_TX_COMPLETE 1762 + pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF; 1763 #else 1764 + pTxd->TBControl |= BMU_EOF; 1765 #endif 1766 pTxdFst->TBControl |= BMU_OWN | BMU_SW; 1767 } 1768 pTxdLst = pTxd; 1769 pTxd = pTxd->pNextTxd; ··· 2032 struct sk_buff *pMsg; /* pointer to message holding frame */ 2033 struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */ 2034 int FrameLength; /* total length of received frame */ 2035 SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */ 2036 SK_EVPARA EvPara; /* an event parameter union */ 2037 unsigned long Flags; /* for spin lock */ ··· 2045 SK_BOOL IsBadFrame; /* Bad frame */ 2046 2047 SK_U32 FrameStat; 2048 SK_U64 PhysAddr; 2049 2050 rx_start: ··· 2177 (dma_addr_t) PhysAddr, 2178 FrameLength, 2179 PCI_DMA_FROMDEVICE); 2180 + memcpy(pNewMsg->data, pMsg, FrameLength); 2181 + 2182 pci_dma_sync_single_for_device(pAC->PciDev, 2183 (dma_addr_t) PhysAddr, 2184 FrameLength, ··· 2206 2207 /* set length in message */ 2208 skb_put(pMsg, FrameLength); 2209 + } /* frame > SK_COPY_TRESHOLD */ 2210 2211 #ifdef USE_SK_RX_CHECKSUM 2212 + pMsg->csum = pRxd->TcpSums; 2213 + pMsg->ip_summed = CHECKSUM_HW; 2214 #else 2215 + pMsg->ip_summed = CHECKSUM_NONE; 2216 #endif 2217 + 2218 + 2219 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); 2220 ForRlmt = SK_RLMT_RX_PROTOCOL; 2221 #if 0 ··· 4946 dev->irq = pdev->irq; 4947 error = SkGeInitPCI(pAC); 4948 if (error) { 4949 + printk(KERN_ERR "sk98lin: PCI setup failed: %i\n", error); 4950 goto out_free_netdev; 4951 } 4952 ··· 4982 4983 /* Register net device */ 4984 if (register_netdev(dev)) { 4985 + printk(KERN_ERR "sk98lin: Could not register device.\n"); 4986 goto out_free_resources; 4987 } 4988 ··· 5001 5002 SkGeYellowLED(pAC, pAC->IoBase, 1); 5003 5004 memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6); 5005 + memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); 5006 5007 SkGeProcCreate(dev); 5008 ··· 5048 #endif 5049 5050 if (register_netdev(dev)) { 5051 + printk(KERN_ERR "sk98lin: Could not register device for seconf port.\n"); 5052 free_netdev(dev); 5053 pAC->dev[1] = pAC->dev[0]; 5054 } else { 5055 SkGeProcCreate(dev); 5056 memcpy(&dev->dev_addr, 5057 &pAC->Addr.Net[1].CurrentMacAddress, 6); 5058 + memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); 5059 5060 printk("%s: %s\n", dev->name, pAC->DeviceStr); 5061 printk(" PrefPort:B RlmtMode:Dual Check Link State\n");
+1 -3
drivers/net/skge.c
··· 2300 td->dma_hi = map >> 32; 2301 2302 if (skb->ip_summed == CHECKSUM_HW) { 2303 - const struct iphdr *ip 2304 - = (const struct iphdr *) (skb->data + ETH_HLEN); 2305 int offset = skb->h.raw - skb->data; 2306 2307 /* This seems backwards, but it is what the sk98lin 2308 * does. Looks like hardware is wrong? 2309 */ 2310 - if (ip->protocol == IPPROTO_UDP 2311 && hw->chip_rev == 0 && hw->chip_id == CHIP_ID_YUKON) 2312 control = BMU_TCP_CHECK; 2313 else
··· 2300 td->dma_hi = map >> 32; 2301 2302 if (skb->ip_summed == CHECKSUM_HW) { 2303 int offset = skb->h.raw - skb->data; 2304 2305 /* This seems backwards, but it is what the sk98lin 2306 * does. Looks like hardware is wrong? 2307 */ 2308 + if (skb->h.ipiph->protocol == IPPROTO_UDP 2309 && hw->chip_rev == 0 && hw->chip_id == CHIP_ID_YUKON) 2310 control = BMU_TCP_CHECK; 2311 else
+2 -2
drivers/net/wireless/airo.c
··· 2755 SET_NETDEV_DEV(dev, dmdev); 2756 2757 2758 - if (test_bit(FLAG_MPI,&ai->flags)) 2759 - reset_card (dev, 1); 2760 2761 rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev ); 2762 if (rc) {
··· 2755 SET_NETDEV_DEV(dev, dmdev); 2756 2757 2758 + reset_card (dev, 1); 2759 + msleep(400); 2760 2761 rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev ); 2762 if (rc) {
+1 -2
drivers/net/wireless/orinoco.c
··· 3512 break; 3513 default: 3514 err = -EINVAL; 3515 - } 3516 - if (err) 3517 goto out; 3518 3519 if (prq->flags & IW_POWER_TIMEOUT) { 3520 priv->pm_on = 1;
··· 3512 break; 3513 default: 3514 err = -EINVAL; 3515 goto out; 3516 + } 3517 3518 if (prq->flags & IW_POWER_TIMEOUT) { 3519 priv->pm_on = 1;