a system with only one CPU, like most personal computers, say N. If
you have a system with more than one CPU, say Y.
- If you say Y here, the kernel will run on single and multiprocessor
+ If you say N here, the kernel will run on single and multiprocessor
machines, but will use only one CPU of a multiprocessor machine. If
you say Y here, the kernel will run on many, but not all,
singleprocessor machines. On a singleprocessor machine, the kernel
- will run faster if you say Y here.
+ will run faster if you say N here.
Note that if you say Y here and choose architecture "586" or
"Pentium" under "Processor family", the kernel will not work on 486
struct super_block * sb = inode->i_sb;
int error;
- error = -ENOSYS;
- if (sb->s_op->statfs) {
+ error = -ENODEV;
+ if (sb && sb->s_op && sb->s_op->statfs) {
set_fs(KERNEL_DS);
error = sb->s_op->statfs(sb, &linux_stat, sizeof(linux_stat));
set_fs(USER_DS);
extern void SMC93x_Init(void);
/* smc37c669.c */
-extern void SMC669_Init(void);
+extern void SMC669_Init(int);
/* es1888.c */
extern void es1888_init(void);
*/
SMC37c669_CONFIG_REGS *SMC37c669_detect(
- void
+ int
);
unsigned int SMC37c669_enable_device(
{ -1, -1 } /* End of table */
};
+/*
+** The following definition is for the MONET (XP1000) IRQ
+** translation table.
+*/
+static SMC37c669_IRQ_TRANSLATION_ENTRY SMC37c669_monet_irq_table[]
+__initdata =
+ {
+ { SMC37c669_DEVICE_IRQ_A, -1 },
+ { SMC37c669_DEVICE_IRQ_B, -1 },
+ { SMC37c669_DEVICE_IRQ_C, 6 },
+ { SMC37c669_DEVICE_IRQ_D, 7 },
+ { SMC37c669_DEVICE_IRQ_E, 4 },
+ { SMC37c669_DEVICE_IRQ_F, 3 },
+ { SMC37c669_DEVICE_IRQ_H, -1 },
+ { -1, -1 } /* End of table */
+ };
+
+static SMC37c669_IRQ_TRANSLATION_ENTRY *SMC37c669_irq_tables[] __initdata =
+ {
+ SMC37c669_default_irq_table,
+ SMC37c669_monet_irq_table
+ };
+
/*
** DRQ Translation Table
**
**
**--
*/
-SMC37c669_CONFIG_REGS * __init SMC37c669_detect( void )
+SMC37c669_CONFIG_REGS * __init SMC37c669_detect( int index )
{
int i;
SMC37c669_DEVICE_ID_REGISTER id;
/*
** Initialize the IRQ and DRQ translation tables.
*/
- SMC37c669_irq_table = SMC37c669_default_irq_table;
+ SMC37c669_irq_table = SMC37c669_irq_tables[ index ];
SMC37c669_drq_table = SMC37c669_default_drq_table;
/*
** erfix
* None
*
*/
-void __init SMC669_Init ( void )
+void __init SMC669_Init ( int index )
{
SMC37c669_CONFIG_REGS *SMC_base;
unsigned long flags;
__save_and_cli(flags);
- if ( ( SMC_base = SMC37c669_detect( ) ) != NULL ) {
+ if ( ( SMC_base = SMC37c669_detect( index ) ) != NULL ) {
#if SMC_DEBUG
SMC37c669_config_mode( TRUE );
SMC37c669_dump_registers( );
{
layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
common_pci_fixup(dp264_map_irq, common_swizzle);
- SMC669_Init();
+ SMC669_Init(0);
}
static void __init
layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
common_pci_fixup(monet_map_irq, monet_swizzle);
/* es1888_init(); */ /* later? */
- SMC669_Init();
+ SMC669_Init(1);
}
static void __init
{
layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
common_pci_fixup(webbrick_map_irq, common_swizzle);
- SMC669_Init();
+ SMC669_Init(0);
}
{
layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
common_pci_fixup(miata_map_irq, miata_swizzle);
- SMC669_Init(); /* it might be a GL (fails harmlessly if not) */
+ SMC669_Init(0); /* it might be a GL (fails harmlessly if not) */
es1888_init();
}
{
layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
common_pci_fixup(sx164_map_irq, common_swizzle);
- SMC669_Init();
+ SMC669_Init(0);
}
& ~1 ) & ~2);
udelay(1);
parport_write_data(port, mode);
- udelay(1);
+ udelay(400);
/* nSelectIn high, nAutoFd low */
parport_write_control(port, (parport_read_control(port) & ~8) | 2);
if (parport_wait_peripheral(port, 0x78, 0x38)) {
&& dfx_probe(dev)
#endif
#ifdef CONFIG_APFDDI
- && apfddi_init(dev);
+ && apfddi_init(dev)
#endif
&& 1 ) {
return 1; /* -ENODEV or -EAGAIN would be more accurate. */
int init_module(void)
{
- printk(KERN_INFO "SV-11 Z85230 Synchronous Driver v 0.01.\n");
+ printk(KERN_INFO "SV-11 Z85230 Synchronous Driver v 0.02.\n");
printk(KERN_INFO "(c) Copyright 1998, Building Number Three Ltd.\n");
- if(dma)
- printk(KERN_WARNING "DMA mode probably wont work right now.\n");
if((sv11_unit=sv11_init(io,irq))==NULL)
return -ENODEV;
return 0;
"ppp: error in VJ decompression\n");
return 0;
}
- skb_put(skb, new_count + PPP_HDRLEN - skb->len);
+ new_count += PPP_HDRLEN;
+ if (new_count > skb->len)
+ skb_put(skb, new_count - skb->len);
+ else
+ skb_trim(skb, new_count);
return rcv_proto_ip(ppp, skb);
}
#include <asm/byteorder.h>
#include "syncppp.h"
-#define MAXALIVECNT 3 /* max. alive packets */
+#define MAXALIVECNT 6 /* max. alive packets */
#define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */
#define PPP_UI 0x03 /* Unnumbered Information */
these silly disclaimers.
Copyright 1994, Tom Zerucha.
- zerucha@shell.portal.com
-
+ tz@execpc.com
+
Additional Code, and much appreciated help by
Michael A. Griffith
grif@cs.ucr.edu
NULL, /* d_compare */
};
-static int autofs_root_lookup(struct inode *dir, struct dentry * dentry)
+static int autofs_root_lookup(struct inode *dir, struct dentry *dentry)
{
struct autofs_sb_info *sbi;
int oz_mode;
if (!S_ISDIR(dir->i_mode))
return -ENOTDIR;
+ if (dentry->d_name.len > NAME_MAX)
+ return -ENOENT; /* File name too long to exist */
+
sbi = autofs_sbi(dir->i_sb);
oz_mode = autofs_oz_mode(sbi);
if ( !autofs_oz_mode(sbi) )
return -EPERM;
+ if ( dentry->d_name.len > NAME_MAX )
+ return -ENAMETOOLONG;
+
if ( autofs_hash_lookup(dh, &dentry->d_name) )
return -EEXIST;
if ( !autofs_oz_mode(sbi) )
return -EPERM;
+ if ( dentry->d_name.len > NAME_MAX )
+ return -ENAMETOOLONG;
+
ent = autofs_hash_lookup(dh, &dentry->d_name);
if ( ent )
return -EEXIST;
autofs_catatonic_mode(sbi);
}
-int autofs_wait(struct autofs_sb_info *sbi, struct qstr * name)
+int autofs_wait(struct autofs_sb_info *sbi, struct qstr *name)
{
struct autofs_wait_queue *wq;
int status;
/* In catatonic mode, we don't wait for nobody */
if ( sbi->catatonic )
return -ENOENT;
+
+ /* We shouldn't be able to get here, but just in case */
+ if ( name->len > NAME_MAX )
+ return -ENOENT;
for ( wq = sbi->queues ; wq ; wq = wq->next ) {
if ( wq->hash == name->hash &&
goal -= inodes_stat.nr_free_inodes;
if (goal > 0) {
spin_unlock(&inode_lock);
+ select_dcache(goal, 0);
prune_dcache(goal);
spin_lock(&inode_lock);
sync_all_inodes();
error = PTR_ERR(dentry);
if (!IS_ERR(dentry)) {
struct inode * inode = dentry->d_inode;
+ struct super_block * sb = inode->i_sb;
- error = -ENOSYS;
- if (inode->i_sb->s_op->statfs)
- error = inode->i_sb->s_op->statfs(inode->i_sb, buf, sizeof(struct statfs));
+ error = -ENODEV;
+ if (sb && sb->s_op && sb->s_op->statfs)
+ error = sb->s_op->statfs(sb, buf, sizeof(struct statfs));
dput(dentry);
}
if (!(inode = dentry->d_inode))
goto out_putf;
error = -ENODEV;
- if (!(sb = inode->i_sb))
- goto out_putf;
- error = -ENOSYS;
- if (sb->s_op->statfs)
+ sb = inode->i_sb;
+ if (sb && sb->s_op && sb->s_op->statfs)
error = sb->s_op->statfs(sb, buf, sizeof(struct statfs));
out_putf:
fput(file);
#define VID_HARDWARE_PLANB 16 /* PowerMac motherboard video-in */
#define VID_HARDWARE_BROADWAY 17 /* Broadway project */
#define VID_HARDWARE_GEMTEK 18
+#define VID_HARDWARE_TYPHOON 19
+#define VID_HARDWARE_VINO 20 /* Reserved for SGI Indy Vino */
/*
* Initialiser list
unsigned long flags;
spin_lock_irqsave(&timerlist_lock, flags);
+ if (timer->prev)
+ goto bug;
internal_add_timer(timer);
+out:
spin_unlock_irqrestore(&timerlist_lock, flags);
+ return;
+
+bug:
+ printk("bug: kernel timer added twice at %p.\n",
+ __builtin_return_address(0));
+ goto out;
}
static inline int detach_timer(struct timer_list *timer)
*
* PF_INET protocol family socket handler.
*
- * Version: $Id: af_inet.c,v 1.82 1999/01/04 20:36:44 davem Exp $
+ * Version: $Id: af_inet.c,v 1.83 1999/02/22 13:54:18 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
sk->shutdown |= how;
if (sk->prot->shutdown)
sk->prot->shutdown(sk, how);
+ /* Wake up anyone sleeping in poll. */
+ sk->state_change(sk);
return(0);
}
if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED)
return 1;
+ /* No rate limit on loopback */
+ if (dst->dev && (dst->dev->flags&IFF_LOOPBACK))
+ return 1;
+
return xrlim_allow(dst, *(icmp_pointers[type].timeout));
}
*
* Implementation of the Transmission Control Protocol(TCP).
*
- * Version: $Id: tcp.c,v 1.134 1999/01/09 08:50:09 davem Exp $
+ * Version: $Id: tcp.c,v 1.135 1999/02/22 13:54:21 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
(TCPF_ESTABLISHED|TCPF_SYN_SENT|TCPF_SYN_RECV|TCPF_CLOSE_WAIT)) {
lock_sock(sk);
- /* Flag that the sender has shutdown. */
- sk->shutdown |= SEND_SHUTDOWN;
-
/* Clear out any half completed packets. FIN if needed. */
if (tcp_close_state(sk,0))
tcp_send_fin(sk);
*
* Implementation of the Transmission Control Protocol(TCP).
*
- * Version: $Id: tcp_input.c,v 1.155 1999/01/26 05:33:50 davem Exp $
+ * Version: $Id: tcp_input.c,v 1.156 1999/02/22 13:54:13 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
{
tp->delayed_acks++;
- /* Tiny-grams with PSH set make us ACK quickly.
- * Note: This also clears the "quick ack mode" bit.
+ /* Tiny-grams with PSH set artifically deflate our
+ * ato measurement, but with a lower bound.
*/
- if(th->psh && (skb->len < (tp->mss_cache >> 1)))
- tp->ato = HZ/50;
+ if(th->psh && (skb->len < (tp->mss_cache >> 1))) {
+ /* Preserve the quickack state. */
+ if((tp->ato & 0x7fffffff) > HZ/50)
+ tp->ato = ((tp->ato & 0x80000000) |
+ (HZ/50));
+ }
}
/* Called to compute a smoothed rtt estimate. The data fed to this
*
* Implementation of the Transmission Control Protocol(TCP).
*
- * Version: $Id: tcp_output.c,v 1.101 1999/01/20 07:20:14 davem Exp $
+ * Version: $Id: tcp_output.c,v 1.102 1999/02/22 13:54:26 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
*
* TIMER - implementation of software timers for IP.
*
- * Version: $Id: timer.c,v 1.14 1998/11/07 11:55:43 davem Exp $
+ * Version: $Id: timer.c,v 1.15 1999/02/22 13:54:29 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
i = 0;
- /* Dump packet if too many hops or already seen this net */
- if(ipx->ipx_tctrl < 8)
- for( ; i < ipx->ipx_tctrl; i++)
- if(*l++ == intrfc->if_netnum)
- break;
+ /* Dump packet if already seen this net */
+ for( ; i < ipx->ipx_tctrl; i++)
+ if(*l++ == intrfc->if_netnum)
+ break;
if(i == ipx->ipx_tctrl)
{
/* xmit on all other interfaces... */
for(ifcs = ipx_interfaces; ifcs != NULL; ifcs = ifcs->if_next)
{
+ /* Except unconfigured interfaces */
+ if(ifcs->if_netnum == 0)
+ continue;
+
/* That aren't in the list */
l = (__u32 *) c;
for(i = 0; i <= ipx->ipx_tctrl; i++)
/* Too small? */
if(ntohs(ipx->ipx_pktsize) < sizeof(struct ipxhdr))
- {
- kfree_skb(skb);
- return (0);
- }
-
+ goto drop;
+
+ /* Not ours */
+ if (skb->pkt_type == PACKET_OTHERHOST)
+ goto drop;
+
if(ipx->ipx_checksum != IPX_NO_CHECKSUM)
{
if(ipx_set_checksum(ipx, ntohs(ipx->ipx_pktsize)) != ipx->ipx_checksum)
- {
- kfree_skb(skb);
- return (0);
- }
+ goto drop;
}
/* Determine what local ipx endpoint this is */
}
if(intrfc == NULL) /* Not one of ours */
- {
- kfree_skb(skb);
- return (0);
- }
+ goto drop;
}
return (ipxitf_rcv(intrfc, skb));
+
+drop:
+ kfree_skb(skb);
+ return (0);
}
static int ipx_sendmsg(struct socket *sock, struct msghdr *msg, int len,
uaddr.sipx_port = 0;
uaddr.sipx_network = 0L;
#ifdef CONFIG_IPX_INTERN
- memcpy(uaddr.sipx_node, sk->protinfo.af_ipx.intrfc
- ->if_node, IPX_NODE_LEN);
+ if(sk->protinfo.af_ipx.intrfc)
+ memcpy(uaddr.sipx_node, sk->protinfo.af_ipx.intrfc
+ ->if_node,IPX_NODE_LEN);
+ else
+ return -ENETDOWN; /* Someone zonked the iface */
#endif
ret = ipx_bind(sock, (struct sockaddr *)&uaddr,
sizeof(struct sockaddr_ipx));