Commit 9d75228b authored by Linus Torvalds's avatar Linus Torvalds

Import 1.1.27

parent 9f3c745e
VERSION = 1 VERSION = 1
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 26 SUBLEVEL = 27
all: Version zImage all: Version zImage
......
/* 3c509.c: A 3c509 EtherLink3 ethernet driver for linux. */ /* 3c509.c: A 3c509 EtherLink3 ethernet driver for linux. */
/* /*
Written 1993 by Donald Becker. Written 1993,1994 by Donald Becker.
Copyright 1994 by Donald Becker.
Copyright 1993 United States Government as represented by the Copyright 1993 United States Government as represented by the
Director, National Security Agency. This software may be used and Director, National Security Agency. This software may be used and
distributed according to the terms of the GNU Public License, distributed according to the terms of the GNU Public License,
...@@ -9,11 +10,21 @@ ...@@ -9,11 +10,21 @@
This driver is for the 3Com EtherLinkIII series. This driver is for the 3Com EtherLinkIII series.
The author may be reached as becker@super.org or The author may be reached as becker@cesdis.gsfc.nasa.gov or
C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715 C/O Center of Excellence in Space Data and Information Sciences
Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
Known limitations:
Because of the way 3c509 ISA detection works it's difficult to predict
a priori which of several ISA-mode cards will be detected first.
This driver does not use predictive interrupt mode, resulting in higher
packet latency but lower overhead. If interrupts are disabled for an
unusually long time it could also result in missed packets, but in
practice this rarely happens.
*/ */
static char *version = "3c509.c:pl15k 3/5/94 becker@super.org\n"; static char *version = "3c509.c:1.01 7/5/94 becker@cesdis.gsfc.nasa.gov\n";
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -92,11 +103,14 @@ int el3_probe(struct device *dev) ...@@ -92,11 +103,14 @@ int el3_probe(struct device *dev)
short *phys_addr = (short *)dev->dev_addr; short *phys_addr = (short *)dev->dev_addr;
static int current_tag = 0; static int current_tag = 0;
/* First check for a board on the EISA bus. */ /* First check all slots of the EISA bus. The next slot address to
probe is kept in 'eisa_addr' to support multiple probe() calls. */
if (EISA_bus) { if (EISA_bus) {
static int eisa_addr; static int eisa_addr = 0x1000;
for (ioaddr=0x1000 ; ioaddr < 0x9000; ioaddr += 0x1000) { while (eisa_addr < 0x9000) {
eisa_addr = ioaddr; ioaddr = eisa_addr;
eisa_addr += 0x1000;
/* Check the standard EISA ID register for an encoded '3Com'. */ /* Check the standard EISA ID register for an encoded '3Com'. */
if (inw(ioaddr + 0xC80) != 0x6d50) if (inw(ioaddr + 0xC80) != 0x6d50)
continue; continue;
...@@ -136,7 +150,10 @@ int el3_probe(struct device *dev) ...@@ -136,7 +150,10 @@ int el3_probe(struct device *dev)
} }
#endif #endif
/* Send the ID sequence to the ID_PORT. */ /* Next check for all ISA bus boards by sending the ID sequence to the
ID_PORT. We find cards past the first by setting the 'current_tag'
on cards as they are found. Cards with their tag set will not
respond to subseqent ID seqences. */
outb(0x00, ID_PORT); outb(0x00, ID_PORT);
outb(0x00, ID_PORT); outb(0x00, ID_PORT);
for(i = 0; i < 255; i++) { for(i = 0; i < 255; i++) {
...@@ -169,9 +186,6 @@ int el3_probe(struct device *dev) ...@@ -169,9 +186,6 @@ int el3_probe(struct device *dev)
} }
irq = id_read_eeprom(9) >> 12; irq = id_read_eeprom(9) >> 12;
/* The current Space.c structure makes it difficult to have more
than one adaptor initialized. Send me email if you have a need for
multiple adaptors, and we'll work out something. -becker@super.org */
if (dev->base_addr != 0 if (dev->base_addr != 0
&& dev->base_addr != (unsigned short)ioaddr) { && dev->base_addr != (unsigned short)ioaddr) {
return -ENODEV; return -ENODEV;
......
...@@ -127,10 +127,10 @@ int check_disk_change(dev_t dev) ...@@ -127,10 +127,10 @@ int check_disk_change(dev_t dev)
i = MAJOR(dev); i = MAJOR(dev);
if (i >= MAX_BLKDEV || (fops = blkdevs[i].fops) == NULL) if (i >= MAX_BLKDEV || (fops = blkdevs[i].fops) == NULL)
return 0; return 0;
if (fops->check_media_change != NULL) { if (fops->check_media_change == NULL)
if (!fops->check_media_change(dev)) return 0;
return 0; if (!fops->check_media_change(dev))
} return 0;
printk("VFS: Disk change detected on device %d/%d\n", printk("VFS: Disk change detected on device %d/%d\n",
MAJOR(dev), MINOR(dev)); MAJOR(dev), MINOR(dev));
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#define NFS_READDIR_CACHE_SIZE 64 #define NFS_READDIR_CACHE_SIZE 64
#define NFS_MAX_FILE_IO_BUFFER_SIZE (7*512) #define NFS_MAX_FILE_IO_BUFFER_SIZE 16834
#define NFS_DEF_FILE_IO_BUFFER_SIZE 1024 #define NFS_DEF_FILE_IO_BUFFER_SIZE 1024
/* /*
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
* Alan Cox : Routing errors * Alan Cox : Routing errors
* Alan Cox : Changes for newer routing code * Alan Cox : Changes for newer routing code
* Alan Cox : Removed old debugging junk * Alan Cox : Removed old debugging junk
* Alan Cox : Fixed the ICMP error status of net/host unreachable
* Gerhard Koerting : Fixed broadcast ping properly
* *
* *
* *
...@@ -65,8 +67,8 @@ struct icmp_mib icmp_statistics={0,}; ...@@ -65,8 +67,8 @@ struct icmp_mib icmp_statistics={0,};
/* An array of errno for error messages from dest unreach. */ /* An array of errno for error messages from dest unreach. */
struct icmp_err icmp_err_convert[] = { struct icmp_err icmp_err_convert[] = {
{ ENETUNREACH, 1 }, /* ICMP_NET_UNREACH */ { ENETUNREACH, 0 }, /* ICMP_NET_UNREACH */
{ EHOSTUNREACH, 1 }, /* ICMP_HOST_UNREACH */ { EHOSTUNREACH, 0 }, /* ICMP_HOST_UNREACH */
{ ENOPROTOOPT, 1 }, /* ICMP_PROT_UNREACH */ { ENOPROTOOPT, 1 }, /* ICMP_PROT_UNREACH */
{ ECONNREFUSED, 1 }, /* ICMP_PORT_UNREACH */ { ECONNREFUSED, 1 }, /* ICMP_PORT_UNREACH */
{ EOPNOTSUPP, 0 }, /* ICMP_FRAG_NEEDED */ { EOPNOTSUPP, 0 }, /* ICMP_FRAG_NEEDED */
...@@ -370,7 +372,7 @@ static void icmp_echo(struct icmphdr *icmph, struct sk_buff *skb, struct device ...@@ -370,7 +372,7 @@ static void icmp_echo(struct icmphdr *icmph, struct sk_buff *skb, struct device
skb2->free = 1; skb2->free = 1;
/* Build Layer 2-3 headers for message back to source */ /* Build Layer 2-3 headers for message back to source */
offset = ip_build_header(skb2, daddr, dev->pa_addr, &ndev, offset = ip_build_header(skb2, daddr, saddr, &ndev,
IPPROTO_ICMP, opt, len, skb->ip_hdr->tos,255); IPPROTO_ICMP, opt, len, skb->ip_hdr->tos,255);
if (offset < 0) if (offset < 0)
{ {
...@@ -611,12 +613,16 @@ int icmp_rcv(struct sk_buff *skb1, struct device *dev, struct options *opt, ...@@ -611,12 +613,16 @@ int icmp_rcv(struct sk_buff *skb1, struct device *dev, struct options *opt,
* Parse the ICMP message * Parse the ICMP message
*/ */
if (ip_chk_addr(daddr) == IS_BROADCAST && icmph->type != ICMP_ECHO) if (ip_chk_addr(daddr) == IS_BROADCAST)
{ {
icmp_statistics.IcmpInErrors++; if (icmph->type != ICMP_ECHO)
kfree_skb(skb1, FREE_READ); {
return(0); icmp_statistics.IcmpInErrors++;
} kfree_skb(skb1, FREE_READ);
return(0);
}
daddr=dev->pa_addr;
}
switch(icmph->type) switch(icmph->type)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment