diff -Nru a/drivers/net/e100/e100_main.c b/drivers/net/e100/e100_main.c --- a/drivers/net/e100/e100_main.c Tue Jul 1 15:36:25 2003 +++ b/drivers/net/e100/e100_main.c Tue Jul 1 15:36:25 2003 @@ -2068,13 +2068,14 @@ skb->ip_summed = CHECKSUM_NONE; } + bdp->drv_stats.net_stats.rx_bytes += skb->len; + if(bdp->vlgrp && (rfd_status & CB_STATUS_VLAN)) { vlan_hwaccel_rx(skb, bdp->vlgrp, be16_to_cpu(rfd->vlanid)); } else { netif_rx(skb); } dev->last_rx = jiffies; - bdp->drv_stats.net_stats.rx_bytes += skb->len; rfd_cnt++; } /* end of rfd loop */ diff -Nru a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c --- a/drivers/net/tulip/de2104x.c Tue Jul 1 15:36:25 2003 +++ b/drivers/net/tulip/de2104x.c Tue Jul 1 15:36:25 2003 @@ -77,7 +77,6 @@ #define DE_DEF_MSG_ENABLE (NETIF_MSG_DRV | \ NETIF_MSG_PROBE | \ NETIF_MSG_LINK | \ - NETIF_MSG_TIMER | \ NETIF_MSG_IFDOWN | \ NETIF_MSG_IFUP | \ NETIF_MSG_RX_ERR | \ diff -Nru a/drivers/net/typhoon.c b/drivers/net/typhoon.c --- a/drivers/net/typhoon.c Tue Jul 1 15:36:25 2003 +++ b/drivers/net/typhoon.c Tue Jul 1 15:36:25 2003 @@ -40,7 +40,7 @@ /* Set the copy breakpoint for the copy-only-tiny-frames scheme. * Setting to > 1518 effectively disables this feature. */ -static int rx_copybreak = 0; +static int rx_copybreak = 200; /* end user-configurable values */ @@ -85,8 +85,8 @@ #define PKT_BUF_SZ 1536 #define DRV_MODULE_NAME "typhoon" -#define DRV_MODULE_VERSION "1.0" -#define DRV_MODULE_RELDATE "03/02/14" +#define DRV_MODULE_VERSION "1.5.1" +#define DRV_MODULE_RELDATE "03/06/26" #define PFX DRV_MODULE_NAME ": " #define ERR_PFX KERN_ERR PFX @@ -150,7 +150,7 @@ #define TYPHOON_CRYPTO_DES 1 #define TYPHOON_CRYPTO_3DES 2 #define TYPHOON_CRYPTO_VARIABLE 4 -#define TYPHOON_FIBER 5 +#define TYPHOON_FIBER 8 enum typhoon_cards { TYPHOON_TX = 0, TYPHOON_TX95, TYPHOON_TX97, TYPHOON_SVR, @@ -1798,7 +1798,7 @@ u32 intr_status; intr_status = readl(ioaddr + TYPHOON_REG_INTR_STATUS); - if(!intr_status) + if(!(intr_status & TYPHOON_INTR_HOST_INT)) return IRQ_NONE; writel(intr_status, ioaddr + TYPHOON_REG_INTR_STATUS); diff -Nru a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c --- a/drivers/net/wireless/airo.c Tue Jul 1 15:36:25 2003 +++ b/drivers/net/wireless/airo.c Tue Jul 1 15:36:25 2003 @@ -2901,6 +2901,7 @@ airo_entry); apriv->proc_entry->uid = proc_uid; apriv->proc_entry->gid = proc_gid; + apriv->proc_entry->owner = THIS_MODULE; /* Setup the StatsDelta */ entry = create_proc_entry("StatsDelta", @@ -2909,6 +2910,7 @@ entry->uid = proc_uid; entry->gid = proc_gid; entry->data = dev; + entry->owner = THIS_MODULE; SETPROC_OPS(entry, proc_statsdelta_ops); /* Setup the Stats */ @@ -2918,6 +2920,7 @@ entry->uid = proc_uid; entry->gid = proc_gid; entry->data = dev; + entry->owner = THIS_MODULE; SETPROC_OPS(entry, proc_stats_ops); /* Setup the Status */ @@ -2927,6 +2930,7 @@ entry->uid = proc_uid; entry->gid = proc_gid; entry->data = dev; + entry->owner = THIS_MODULE; SETPROC_OPS(entry, proc_status_ops); /* Setup the Config */ @@ -2936,6 +2940,7 @@ entry->uid = proc_uid; entry->gid = proc_gid; entry->data = dev; + entry->owner = THIS_MODULE; SETPROC_OPS(entry, proc_config_ops); /* Setup the SSID */ @@ -2945,6 +2950,7 @@ entry->uid = proc_uid; entry->gid = proc_gid; entry->data = dev; + entry->owner = THIS_MODULE; SETPROC_OPS(entry, proc_SSID_ops); /* Setup the APList */ @@ -2954,6 +2960,7 @@ entry->uid = proc_uid; entry->gid = proc_gid; entry->data = dev; + entry->owner = THIS_MODULE; SETPROC_OPS(entry, proc_APList_ops); /* Setup the BSSList */ @@ -2963,6 +2970,7 @@ entry->uid = proc_uid; entry->gid = proc_gid; entry->data = dev; + entry->owner = THIS_MODULE; SETPROC_OPS(entry, proc_BSSList_ops); /* Setup the WepKey */ @@ -2972,6 +2980,7 @@ entry->uid = proc_uid; entry->gid = proc_gid; entry->data = dev; + entry->owner = THIS_MODULE; SETPROC_OPS(entry, proc_wepkey_ops); return 0; @@ -3062,8 +3071,6 @@ StatusRid status_rid; int i; - MOD_INC_USE_COUNT; - if ((file->private_data = kmalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) return -ENOMEM; memset(file->private_data, 0, sizeof(struct proc_data)); @@ -3143,8 +3150,6 @@ StatsRid stats; int i, j; int *vals = stats.vals; - MOD_INC_USE_COUNT; - if ((file->private_data = kmalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) return -ENOMEM; @@ -3421,8 +3426,6 @@ struct airo_info *ai = dev->priv; int i; - MOD_INC_USE_COUNT; - if ((file->private_data = kmalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) return -ENOMEM; memset(file->private_data, 0, sizeof(struct proc_data)); @@ -3692,8 +3695,6 @@ int j=0; int rc; - MOD_INC_USE_COUNT; - if ((file->private_data = kmalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) return -ENOMEM; memset(file->private_data, 0, sizeof(struct proc_data)); @@ -3742,8 +3743,6 @@ char *ptr; SsidRid SSID_rid; - MOD_INC_USE_COUNT; - if ((file->private_data = kmalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) return -ENOMEM; memset(file->private_data, 0, sizeof(struct proc_data)); @@ -3788,8 +3787,6 @@ char *ptr; APListRid APList_rid; - MOD_INC_USE_COUNT; - if ((file->private_data = kmalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) return -ENOMEM; memset(file->private_data, 0, sizeof(struct proc_data)); @@ -3840,8 +3837,6 @@ /* If doLoseSync is not 1, we won't do a Lose Sync */ int doLoseSync = -1; - MOD_INC_USE_COUNT; - if ((file->private_data = kmalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL) return -ENOMEM; memset(file->private_data, 0, sizeof(struct proc_data)); @@ -3904,7 +3899,6 @@ { struct proc_data *data = (struct proc_data *)file->private_data; if ( data->on_close != NULL ) data->on_close( inode, file ); - MOD_DEC_USE_COUNT; if ( data->rbuffer ) kfree( data->rbuffer ); if ( data->wbuffer ) kfree( data->wbuffer ); kfree( data ); diff -Nru a/drivers/net/wireless/netwave_cs.c b/drivers/net/wireless/netwave_cs.c --- a/drivers/net/wireless/netwave_cs.c Tue Jul 1 15:36:25 2003 +++ b/drivers/net/wireless/netwave_cs.c Tue Jul 1 15:36:25 2003 @@ -321,7 +321,6 @@ typedef struct netwave_private { dev_link_t link; - struct net_device dev; spinlock_t spinlock; /* Serialize access to the hardware (SMP) */ dev_node_t node; u_char *ramBase; @@ -449,11 +448,13 @@ netwave_flush_stale_links(); /* Initialize the dev_link_t structure */ - priv = kmalloc(sizeof(*priv), GFP_KERNEL); - if (!priv) return NULL; - memset(priv, 0, sizeof(*priv)); - link = &priv->link; dev = &priv->dev; - link->priv = dev->priv = priv; + dev = alloc_etherdev(sizeof(netwave_private)); + if (!dev) + return NULL; + priv = dev->priv; + link = &priv->link; + link->priv = dev; + init_timer(&link->release); link->release.function = &netwave_release; link->release.data = (u_long)link; @@ -504,7 +505,6 @@ dev->tx_timeout = &netwave_watchdog; dev->watchdog_timeo = TX_TIMEOUT; - ether_setup(dev); dev->open = &netwave_open; dev->stop = &netwave_close; link->irq.Instance = dev; @@ -541,7 +541,7 @@ */ static void netwave_detach(dev_link_t *link) { - netwave_private *priv = link->priv; + struct net_device *dev = link->priv; dev_link_t **linkp; DEBUG(0, "netwave_detach(0x%p)\n", link); @@ -580,8 +580,8 @@ /* Unlink device structure, free pieces */ *linkp = link->next; if (link->dev) - unregister_netdev(&priv->dev); - kfree(priv); + unregister_netdev(dev); + kfree(dev); } /* netwave_detach */ @@ -1038,8 +1038,8 @@ static void netwave_pcmcia_config(dev_link_t *link) { client_handle_t handle = link->handle; - netwave_private *priv = link->priv; - struct net_device *dev = &priv->dev; + struct net_device *dev = link->priv; + netwave_private *priv = dev->priv; tuple_t tuple; cisparse_t parse; int i, j, last_ret, last_fn; @@ -1099,7 +1099,7 @@ * Allocate a 32K memory window. Note that the dev_link_t * structure provides space for one window handle -- if your * device needs several windows, you'll need to keep track of - * the handles in your private data structure, link->priv. + * the handles in your private data structure, dev->priv. */ DEBUG(1, "Setting mem speed of %d\n", mem_speed); @@ -1161,7 +1161,8 @@ */ static void netwave_release(u_long arg) { dev_link_t *link = (dev_link_t *)arg; - netwave_private *priv = link->priv; + struct net_device *dev = link->priv; + netwave_private *priv = dev->priv; DEBUG(0, "netwave_release(0x%p)\n", link); @@ -1206,8 +1207,7 @@ static int netwave_event(event_t event, int priority, event_callback_args_t *args) { dev_link_t *link = args->client_data; - netwave_private *priv = link->priv; - struct net_device *dev = &priv->dev; + struct net_device *dev = link->priv; DEBUG(1, "netwave_event(0x%06x)\n", event); diff -Nru a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c --- a/drivers/net/wireless/strip.c Tue Jul 1 15:36:25 2003 +++ b/drivers/net/wireless/strip.c Tue Jul 1 15:36:25 2003 @@ -284,7 +284,7 @@ */ struct tty_struct *tty; /* ptr to TTY structure */ - struct net_device dev; /* Our device structure */ + struct net_device *dev; /* Our device structure */ /* * Neighbour radio records @@ -509,7 +509,7 @@ *p++ = '\"'; *p++ = 0; - printk(KERN_INFO "%s: %-13s%s\n", strip_info->dev.name, msg, pkt_text); + printk(KERN_INFO "%s: %-13s%s\n", strip_info->dev->name, msg, pkt_text); } @@ -846,7 +846,7 @@ static int allocate_buffers(struct strip *strip_info) { - struct net_device *dev = &strip_info->dev; + struct net_device *dev = strip_info->dev; int sx_size = MAX(STRIP_ENCAP_SIZE(MAX_RECV_MTU), 4096); int tx_size = STRIP_ENCAP_SIZE(dev->mtu) + MaxCommandStringLength; __u8 *r = kmalloc(MAX_RECV_MTU, GFP_ATOMIC); @@ -881,7 +881,7 @@ static void strip_changedmtu(struct strip *strip_info) { int old_mtu = strip_info->mtu; - struct net_device *dev = &strip_info->dev; + struct net_device *dev = strip_info->dev; unsigned char *orbuff = strip_info->rx_buff; unsigned char *osbuff = strip_info->sx_buff; unsigned char *otbuff = strip_info->tx_buff; @@ -889,14 +889,14 @@ if (dev->mtu > MAX_SEND_MTU) { printk(KERN_ERR "%s: MTU exceeds maximum allowable (%d), MTU change cancelled.\n", - strip_info->dev.name, MAX_SEND_MTU); + strip_info->dev->name, MAX_SEND_MTU); dev->mtu = old_mtu; return; } if (!allocate_buffers(strip_info)) { printk(KERN_ERR "%s: unable to grow strip buffers, MTU change cancelled.\n", - strip_info->dev.name); + strip_info->dev->name); dev->mtu = old_mtu; return; } @@ -923,7 +923,7 @@ strip_info->tx_head = strip_info->tx_buff; printk(KERN_NOTICE "%s: strip MTU changed fom %d to %d.\n", - strip_info->dev.name, old_mtu, strip_info->mtu); + strip_info->dev->name, old_mtu, strip_info->mtu); if (orbuff) kfree(orbuff); @@ -940,7 +940,7 @@ */ strip_info->idle_timer.expires = jiffies + 1 * HZ; add_timer(&strip_info->idle_timer); - netif_wake_queue(&strip_info->dev); + netif_wake_queue(strip_info->dev); } @@ -1087,10 +1087,10 @@ FirmwareVersion firmware_version = strip_info->firmware_version; SerialNumber serial_number = strip_info->serial_number; BatteryVoltage battery_voltage = strip_info->battery_voltage; - char *if_name = strip_info->dev.name; + char *if_name = strip_info->dev->name; MetricomAddress true_dev_addr = strip_info->true_dev_addr; MetricomAddress dev_dev_addr = - *(MetricomAddress *) strip_info->dev.dev_addr; + *(MetricomAddress *) strip_info->dev->dev_addr; int manual_dev_addr = strip_info->manual_dev_addr; #ifdef EXT_COUNTERS unsigned long rx_bytes = strip_info->rx_bytes; @@ -1133,7 +1133,7 @@ p += sprintf(p, " Next gratuitous ARP:\t"); if (!memcmp - (strip_info->dev.dev_addr, zero_address.c, + (strip_info->dev->dev_addr, zero_address.c, sizeof(zero_address))) p += sprintf(p, "Disabled\n"); else { @@ -1210,7 +1210,7 @@ */ if (strip_info->working) { printk(KERN_INFO "%s: No response: Resetting radio.\n", - strip_info->dev.name); + strip_info->dev->name); strip_info->firmware_version.c[0] = '\0'; strip_info->serial_number.c[0] = '\0'; strip_info->battery_voltage.c[0] = '\0'; @@ -1231,7 +1231,7 @@ /* Mark radio address as unknown */ *(MetricomAddress *) & strip_info->true_dev_addr = zero_address; if (!strip_info->manual_dev_addr) - *(MetricomAddress *) strip_info->dev.dev_addr = + *(MetricomAddress *) strip_info->dev->dev_addr = zero_address; strip_info->working = FALSE; strip_info->firmware_level = NoStructure; @@ -1285,7 +1285,7 @@ /* First make sure we're connected. */ if (!strip_info || strip_info->magic != STRIP_MAGIC || - !netif_running(&strip_info->dev)) + !netif_running(strip_info->dev)) return; if (strip_info->tx_left > 0) { @@ -1340,14 +1340,14 @@ else { printk(KERN_ERR "%s: strip_make_packet: Unknown packet type 0x%04X\n", - strip_info->dev.name, ntohs(header->protocol)); + strip_info->dev->name, ntohs(header->protocol)); return (NULL); } if (len > strip_info->mtu) { printk(KERN_ERR "%s: Dropping oversized transmit packet: %d bytes\n", - strip_info->dev.name, len); + strip_info->dev->name, len); return (NULL); } @@ -1357,7 +1357,7 @@ */ if (!memcmp(haddr.c, strip_info->true_dev_addr.c, sizeof(haddr))) { printk(KERN_ERR "%s: Dropping packet addressed to self\n", - strip_info->dev.name); + strip_info->dev->name); return (NULL); } @@ -1367,7 +1367,7 @@ */ if (haddr.c[0] == 0xFF) { u32 brd = 0; - struct in_device *in_dev = in_dev_get(&strip_info->dev); + struct in_device *in_dev = in_dev_get(strip_info->dev); if (in_dev == NULL) return NULL; read_lock(&in_dev->lock); @@ -1377,10 +1377,10 @@ in_dev_put(in_dev); /* arp_query returns 1 if it succeeds in looking up the address, 0 if it fails */ - if (!arp_query(haddr.c, brd, &strip_info->dev)) { + if (!arp_query(haddr.c, brd, strip_info->dev)) { printk(KERN_ERR "%s: Unable to send packet (no broadcast hub configured)\n", - strip_info->dev.name); + strip_info->dev->name); return (NULL); } /* @@ -1491,7 +1491,7 @@ #endif strip_info->watchdog_doprobe = jiffies + 10 * HZ; strip_info->watchdog_doreset = jiffies + 1 * HZ; - /*printk(KERN_INFO "%s: Routine radio test.\n", strip_info->dev.name); */ + /*printk(KERN_INFO "%s: Routine radio test.\n", strip_info->dev->name); */ } /* @@ -1506,7 +1506,7 @@ */ if (strip_info->tx_size - strip_info->tx_left < 20) printk(KERN_ERR "%s: Sending%5d bytes;%5d bytes free.\n", - strip_info->dev.name, strip_info->tx_left, + strip_info->dev->name, strip_info->tx_left, strip_info->tx_size - strip_info->tx_left); /* @@ -1519,7 +1519,7 @@ } if (1) { - struct in_device *in_dev = in_dev_get(&strip_info->dev); + struct in_device *in_dev = in_dev_get(strip_info->dev); brd = addr = 0; if (in_dev) { read_lock(&in_dev->lock); @@ -1549,11 +1549,11 @@ */ if (strip_info->working && (long) jiffies - strip_info->gratuitous_arp >= 0 - && memcmp(strip_info->dev.dev_addr, zero_address.c, + && memcmp(strip_info->dev->dev_addr, zero_address.c, sizeof(zero_address)) - && arp_query(haddr.c, brd, &strip_info->dev)) { + && arp_query(haddr.c, brd, strip_info->dev)) { /*printk(KERN_INFO "%s: Sending gratuitous ARP with interval %ld\n", - strip_info->dev.name, strip_info->arp_interval / HZ); */ + strip_info->dev->name, strip_info->arp_interval / HZ); */ strip_info->gratuitous_arp = jiffies + strip_info->arp_interval; strip_info->arp_interval *= 2; @@ -1561,11 +1561,11 @@ strip_info->arp_interval = MaxARPInterval; if (addr) arp_send(ARPOP_REPLY, ETH_P_ARP, addr, /* Target address of ARP packet is our address */ - &strip_info->dev, /* Device to send packet on */ + strip_info->dev, /* Device to send packet on */ addr, /* Source IP address this ARP packet comes from */ NULL, /* Destination HW address is NULL (broadcast it) */ - strip_info->dev.dev_addr, /* Source HW address is our HW address */ - strip_info->dev.dev_addr); /* Target HW address is our HW address (redundant) */ + strip_info->dev->dev_addr, /* Source HW address is our HW address */ + strip_info->dev->dev_addr); /* Target HW address is our HW address (redundant) */ } /* @@ -1608,18 +1608,18 @@ if (rx_pps_count / 8 >= 10) printk(KERN_INFO "%s: WARNING: Receiving %ld packets per second.\n", - strip_info->dev.name, rx_pps_count / 8); + strip_info->dev->name, rx_pps_count / 8); if (tx_pps_count / 8 >= 10) printk(KERN_INFO "%s: WARNING: Tx %ld packets per second.\n", - strip_info->dev.name, tx_pps_count / 8); + strip_info->dev->name, tx_pps_count / 8); if (sx_pps_count / 8 >= 10) printk(KERN_INFO "%s: WARNING: Sending %ld packets per second.\n", - strip_info->dev.name, sx_pps_count / 8); + strip_info->dev->name, sx_pps_count / 8); } spin_lock_irqsave(&strip_lock, flags); /* See if someone has been ifconfigging */ - if (strip_info->mtu != strip_info->dev.mtu) + if (strip_info->mtu != strip_info->dev->mtu) strip_changedmtu(strip_info); strip_send(strip_info, skb); @@ -1735,7 +1735,7 @@ len = MIN(len, sizeof(FirmwareVersion) - 1); if (strip_info->firmware_version.c[0] == 0) printk(KERN_INFO "%s: Radio Firmware: %.*s\n", - strip_info->dev.name, len, value_begin); + strip_info->dev->name, len, value_begin); sprintf(strip_info->firmware_version.c, "%.*s", len, value_begin); /* Look for the first colon */ @@ -1806,10 +1806,10 @@ MetricomAddressString addr_string; radio_address_to_string(&addr, &addr_string); printk(KERN_INFO "%s: Radio address = %s\n", - strip_info->dev.name, addr_string.c); + strip_info->dev->name, addr_string.c); strip_info->true_dev_addr = addr; if (!strip_info->manual_dev_addr) - *(MetricomAddress *) strip_info->dev.dev_addr = + *(MetricomAddress *) strip_info->dev->dev_addr = addr; /* Give the radio a few seconds to get its head straight, then send an arp */ strip_info->gratuitous_arp = jiffies + 15 * HZ; @@ -1830,7 +1830,7 @@ if (sum == 0 && strip_info->firmware_level == StructuredMessages) { strip_info->firmware_level = ChecksummedMessages; printk(KERN_INFO "%s: Radio provides message checksums\n", - strip_info->dev.name); + strip_info->dev->name); } return (sum == 0); } @@ -1849,7 +1849,7 @@ if (has_prefix(msg, len, "001")) { /* Not in StarMode! */ RecvErr("Error Msg:", strip_info); printk(KERN_INFO "%s: Radio %s is not in StarMode\n", - strip_info->dev.name, sendername); + strip_info->dev->name, sendername); } else if (has_prefix(msg, len, "002")) { /* Remap handle */ @@ -1859,7 +1859,7 @@ else if (has_prefix(msg, len, "003")) { /* Can't resolve name */ RecvErr("Error Msg:", strip_info); printk(KERN_INFO "%s: Destination radio name is unknown\n", - strip_info->dev.name); + strip_info->dev->name); } else if (has_prefix(msg, len, "004")) { /* Name too small or missing */ @@ -1876,7 +1876,7 @@ if (!strip_info->working) { strip_info->working = TRUE; printk(KERN_INFO "%s: Radio now in starmode\n", - strip_info->dev.name); + strip_info->dev->name); /* * If the radio has just entered a working state, we should do our first * probe ASAP, so that we find out our radio address etc. without delay. @@ -1888,7 +1888,7 @@ strip_info->next_command = 0; /* Try to enable checksums ASAP */ printk(KERN_INFO "%s: Radio provides structured messages\n", - strip_info->dev.name); + strip_info->dev->name); } if (strip_info->firmware_level >= StructuredMessages) { /* @@ -1916,14 +1916,14 @@ RecvErr("Error Msg:", strip_info); printk(KERN_ERR "%s: Error! Packet size too big for radio.\n", - strip_info->dev.name); + strip_info->dev->name); } else if (has_prefix(msg, len, "008")) { /* Bad character in name */ RecvErr("Error Msg:", strip_info); printk(KERN_ERR "%s: Radio name contains illegal character\n", - strip_info->dev.name); + strip_info->dev->name); } else if (has_prefix(msg, len, "009")) /* No count or line terminator */ @@ -1994,7 +1994,7 @@ /* real radio hardware address, try to find another strip device that has been */ /* manually set to that address that we can 'transfer ownership' of this packet to */ if (strip_info->manual_dev_addr && - !memcmp(strip_info->dev.dev_addr, zero_address.c, + !memcmp(strip_info->dev->dev_addr, zero_address.c, sizeof(zero_address)) && memcmp(&strip_info->true_dev_addr, zero_address.c, sizeof(zero_address))) { @@ -2002,13 +2002,13 @@ read_lock_bh(&dev_base_lock); dev = dev_base; while (dev) { - if (dev->type == strip_info->dev.type && + if (dev->type == strip_info->dev->type && !memcmp(dev->dev_addr, &strip_info->true_dev_addr, sizeof(MetricomAddress))) { printk(KERN_INFO "%s: Transferred packet ownership to %s.\n", - strip_info->dev.name, dev->name); + strip_info->dev->name, dev->name); read_unlock_bh(&dev_base_lock); return (dev); } @@ -2016,7 +2016,7 @@ } read_unlock_bh(&dev_base_lock); } - return (&strip_info->dev); + return (strip_info->dev); } /* @@ -2029,7 +2029,7 @@ struct sk_buff *skb = dev_alloc_skb(sizeof(STRIP_Header) + packetlen); if (!skb) { printk(KERN_ERR "%s: memory squeeze, dropping packet.\n", - strip_info->dev.name); + strip_info->dev->name); strip_info->rx_dropped++; } else { memcpy(skb_put(skb, sizeof(STRIP_Header)), header, @@ -2073,12 +2073,12 @@ if (packetlen > MAX_RECV_MTU) { printk(KERN_INFO "%s: Dropping oversized received IP packet: %d bytes\n", - strip_info->dev.name, packetlen); + strip_info->dev->name, packetlen); strip_info->rx_dropped++; return; } - /*printk(KERN_INFO "%s: Got %d byte IP packet\n", strip_info->dev.name, packetlen); */ + /*printk(KERN_INFO "%s: Got %d byte IP packet\n", strip_info->dev->name, packetlen); */ /* Decode remainder of the IP packet */ ptr = @@ -2117,13 +2117,13 @@ if (packetlen > MAX_RECV_MTU) { printk(KERN_INFO "%s: Dropping oversized received ARP packet: %d bytes\n", - strip_info->dev.name, packetlen); + strip_info->dev->name, packetlen); strip_info->rx_dropped++; return; } /*printk(KERN_INFO "%s: Got %d byte ARP %s\n", - strip_info->dev.name, packetlen, + strip_info->dev->name, packetlen, ntohs(arphdr->ar_op) == ARPOP_REQUEST ? "request" : "reply"); */ /* Decode remainder of the ARP packet */ @@ -2251,7 +2251,7 @@ } } - /*printk(KERN_INFO "%s: Got packet from \"%s\".\n", strip_info->dev.name, sendername); */ + /*printk(KERN_INFO "%s: Got packet from \"%s\".\n", strip_info->dev->name, sendername); */ /* * Fill in (pseudo) source and destination addresses in the packet. @@ -2320,13 +2320,13 @@ unsigned long flags; if (!strip_info || strip_info->magic != STRIP_MAGIC - || !netif_running(&strip_info->dev)) + || !netif_running(strip_info->dev)) return; spin_lock_irqsave(&strip_lock, flags); /* Argh! mtu change time! - costs us the packet part received at the change */ - if (strip_info->mtu != strip_info->dev.mtu) + if (strip_info->mtu != strip_info->dev->mtu) strip_changedmtu(strip_info); #if 0 @@ -2347,7 +2347,7 @@ while (cp < end) { if (fp && *fp) printk(KERN_INFO "%s: %s on serial port\n", - strip_info->dev.name, TTYERROR(*fp)); + strip_info->dev->name, TTYERROR(*fp)); if (fp && *fp++ && !strip_info->discard) { /* If there's a serial error, record it */ /* If we have some characters in the buffer, discard them */ strip_info->discard = strip_info->sx_count; @@ -2360,7 +2360,7 @@ if (strip_info->sx_count > 3000) printk(KERN_INFO "%s: Cut a %d byte packet (%d bytes remaining)%s\n", - strip_info->dev.name, + strip_info->dev->name, strip_info->sx_count, end - cp - 1, strip_info-> @@ -2371,12 +2371,12 @@ strip_info->rx_over_errors++; printk(KERN_INFO "%s: sx_buff overflow (%d bytes total)\n", - strip_info->dev.name, + strip_info->dev->name, strip_info->sx_count); } else if (strip_info->discard) printk(KERN_INFO "%s: Discarding bad packet (%d/%d)\n", - strip_info->dev.name, + strip_info->dev->name, strip_info->discard, strip_info->sx_count); else @@ -2415,9 +2415,9 @@ memcmp(addr->c, broadcast_address.c, sizeof(broadcast_address)); if (strip_info->manual_dev_addr) - *(MetricomAddress *) strip_info->dev.dev_addr = *addr; + *(MetricomAddress *) strip_info->dev->dev_addr = *addr; else - *(MetricomAddress *) strip_info->dev.dev_addr = + *(MetricomAddress *) strip_info->dev->dev_addr = strip_info->true_dev_addr; return 0; } @@ -2496,7 +2496,7 @@ strip_info->user_baud = get_baud(strip_info->tty); printk(KERN_INFO "%s: Initializing Radio.\n", - strip_info->dev.name); + strip_info->dev->name); ResetRadio(strip_info); strip_info->idle_timer.expires = jiffies + 1 * HZ; add_timer(&strip_info->idle_timer); @@ -2589,6 +2589,8 @@ if (strip_info->next) strip_info->next->referrer = strip_info->referrer; strip_info->magic = 0; + if (strip_info->dev) + kfree(strip_info->dev); kfree(strip_info); } @@ -2600,6 +2602,7 @@ { int channel_id = 0; struct strip **s = &struct_strip_list; + struct net_device *dev; struct strip *strip_info = (struct strip *) kmalloc(sizeof(struct strip), GFP_KERNEL); @@ -2612,13 +2615,22 @@ memset(strip_info, 0, sizeof(struct strip)); + /* allocate the net_device */ + dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); + if (!dev) { + kfree(strip_info); + return NULL; + } + strip_info->dev = dev; + SET_MODULE_OWNER(dev); + /* * Search the list to find where to put our new entry * (and in the process decide what channel number it is * going to be) */ - while (*s && (*s)->dev.base_addr == channel_id) { + while (*s && (*s)->dev->base_addr == channel_id) { channel_id++; s = &(*s)->next; } @@ -2639,15 +2651,15 @@ strip_info->gratuitous_arp = jiffies + LongTime; strip_info->arp_interval = 0; init_timer(&strip_info->idle_timer); - strip_info->idle_timer.data = (long) &strip_info->dev; + strip_info->idle_timer.data = (long) dev; strip_info->idle_timer.function = strip_IdleTask; /* Note: strip_info->if_name is currently 8 characters long */ - sprintf(strip_info->dev.name, "st%d", channel_id); - strip_info->dev.base_addr = channel_id; - strip_info->dev.priv = (void *) strip_info; - strip_info->dev.next = NULL; - strip_info->dev.init = strip_dev_init; + sprintf(dev->name, "st%d", channel_id); + dev->base_addr = channel_id; + dev->priv = (void *) strip_info; + dev->next = NULL; + dev->init = strip_dev_init; return strip_info; } @@ -2682,7 +2694,7 @@ * strip_dev_init() will be called as a side-effect */ - if (register_netdev(&strip_info->dev) != 0) { + if (register_netdev(strip_info->dev) != 0) { printk(KERN_ERR "strip: register_netdev() failed.\n"); strip_free(strip_info); return -ENFILE; @@ -2699,7 +2711,7 @@ * Restore default settings */ - strip_info->dev.type = ARPHRD_METRICOM; /* dtang */ + strip_info->dev->type = ARPHRD_METRICOM; /* dtang */ /* * Set tty options @@ -2709,15 +2721,13 @@ tty->termios->c_cflag |= CLOCAL; /* Ignore modem control signals. */ tty->termios->c_cflag &= ~HUPCL; /* Don't close on hup */ - MOD_INC_USE_COUNT; - printk(KERN_INFO "STRIP: device \"%s\" activated\n", - strip_info->dev.name); + strip_info->dev->name); /* * Done. We have linked the TTY line to a channel. */ - return (strip_info->dev.base_addr); + return (strip_info->dev->base_addr); } /* @@ -2738,15 +2748,14 @@ if (!strip_info || strip_info->magic != STRIP_MAGIC) return; - unregister_netdev(&strip_info->dev); + unregister_netdev(strip_info->dev); tty->disc_data = 0; strip_info->tty = NULL; printk(KERN_INFO "STRIP: device \"%s\" closed down\n", - strip_info->dev.name); + strip_info->dev->name); strip_free(strip_info); tty->disc_data = NULL; - MOD_DEC_USE_COUNT; } @@ -2767,13 +2776,13 @@ switch (cmd) { case SIOCGIFNAME: - if(copy_to_user((void *) arg, strip_info->dev.name, strlen(strip_info->dev.name) + 1)) + if(copy_to_user((void *) arg, strip_info->dev->name, strlen(strip_info->dev->name) + 1)) return -EFAULT; break; case SIOCSIFHWADDR: { MetricomAddress addr; - //printk(KERN_INFO "%s: SIOCSIFHWADDR\n", strip_info->dev.name); + //printk(KERN_INFO "%s: SIOCSIFHWADDR\n", strip_info->dev->name); if(copy_from_user(&addr, (void *) arg, sizeof(MetricomAddress))) return -EFAULT; return set_mac_address(strip_info, &addr);