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

This commit is contained in:
John W. Linville 2006-02-17 08:15:41 -05:00
commit 750b50ab56
92 changed files with 2128 additions and 2318 deletions

View File

@ -151,6 +151,13 @@ Who: Ralf Baechle <ralf@linux-mips.org>
--------------------------- ---------------------------
What: eepro100 network driver
When: January 2007
Why: replaced by the e100 driver
Who: Adrian Bunk <bunk@stusta.de>
---------------------------
What: Legacy /proc/pci interface (PCI_LEGACY_PROC) What: Legacy /proc/pci interface (PCI_LEGACY_PROC)
When: March 2006 When: March 2006
Why: deprecated since 2.5.53 in favor of lspci(8) Why: deprecated since 2.5.53 in favor of lspci(8)

View File

@ -319,11 +319,10 @@ static void __init hdpu_fixup_eth_pdata(struct platform_device *pd)
struct mv643xx_eth_platform_data *eth_pd; struct mv643xx_eth_platform_data *eth_pd;
eth_pd = pd->dev.platform_data; eth_pd = pd->dev.platform_data;
eth_pd->port_serial_control =
mv64x60_read(&bh, MV643XX_ETH_PORT_SERIAL_CONTROL_REG(pd->id) & ~1);
eth_pd->force_phy_addr = 1; eth_pd->force_phy_addr = 1;
eth_pd->phy_addr = pd->id; eth_pd->phy_addr = pd->id;
eth_pd->speed = SPEED_100;
eth_pd->duplex = DUPLEX_FULL;
eth_pd->tx_queue_size = 400; eth_pd->tx_queue_size = 400;
eth_pd->rx_queue_size = 800; eth_pd->rx_queue_size = 800;
} }

View File

@ -105,6 +105,7 @@
#include <linux/mca-legacy.h> #include <linux/mca-legacy.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/processor.h> #include <asm/processor.h>
@ -658,7 +659,7 @@ static int init586(struct net_device *dev)
s = jiffies; /* warning: only active with interrupts on !! */ s = jiffies; /* warning: only active with interrupts on !! */
while (!(cfg_cmd->cmd_status & STAT_COMPL)) { while (!(cfg_cmd->cmd_status & STAT_COMPL)) {
if (jiffies - s > 30*HZ/100) if (time_after(jiffies, s + 30*HZ/100))
break; break;
} }
@ -684,7 +685,7 @@ static int init586(struct net_device *dev)
s = jiffies; s = jiffies;
while (!(ias_cmd->cmd_status & STAT_COMPL)) { while (!(ias_cmd->cmd_status & STAT_COMPL)) {
if (jiffies - s > 30*HZ/100) if (time_after(jiffies, s + 30*HZ/100))
break; break;
} }
@ -709,7 +710,7 @@ static int init586(struct net_device *dev)
s = jiffies; s = jiffies;
while (!(tdr_cmd->cmd_status & STAT_COMPL)) { while (!(tdr_cmd->cmd_status & STAT_COMPL)) {
if (jiffies - s > 30*HZ/100) { if (time_after(jiffies, s + 30*HZ/100)) {
printk(KERN_WARNING "%s: %d Problems while running the TDR.\n", dev->name, __LINE__); printk(KERN_WARNING "%s: %d Problems while running the TDR.\n", dev->name, __LINE__);
result = 1; result = 1;
break; break;
@ -798,7 +799,7 @@ static int init586(struct net_device *dev)
elmc_id_attn586(); elmc_id_attn586();
s = jiffies; s = jiffies;
while (!(mc_cmd->cmd_status & STAT_COMPL)) { while (!(mc_cmd->cmd_status & STAT_COMPL)) {
if (jiffies - s > 30*HZ/100) if (time_after(jiffies, s + 30*HZ/100))
break; break;
} }
if (!(mc_cmd->cmd_status & STAT_COMPL)) { if (!(mc_cmd->cmd_status & STAT_COMPL)) {

View File

@ -258,6 +258,7 @@ static int vortex_debug = 1;
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/eisa.h> #include <linux/eisa.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/irq.h> /* For NR_IRQS only. */ #include <asm/irq.h> /* For NR_IRQS only. */
#include <asm/io.h> #include <asm/io.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -2724,7 +2725,7 @@ boomerang_rx(struct net_device *dev)
skb = dev_alloc_skb(PKT_BUF_SZ); skb = dev_alloc_skb(PKT_BUF_SZ);
if (skb == NULL) { if (skb == NULL) {
static unsigned long last_jif; static unsigned long last_jif;
if ((jiffies - last_jif) > 10 * HZ) { if (time_after(jiffies, last_jif + 10 * HZ)) {
printk(KERN_WARNING "%s: memory shortage\n", dev->name); printk(KERN_WARNING "%s: memory shortage\n", dev->name);
last_jif = jiffies; last_jif = jiffies;
} }

View File

@ -29,7 +29,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/irq.h> #include <asm/irq.h>
/* Used for the temporal inet entries and routing */ /* Used for the temporal inet entries and routing */
#include <linux/socket.h> #include <linux/socket.h>
#include <linux/bitops.h> #include <linux/bitops.h>

View File

@ -614,7 +614,7 @@ static void rebuild_rx_bufs(struct net_device *dev)
static int init_i596_mem(struct net_device *dev) static int init_i596_mem(struct net_device *dev)
{ {
struct i596_private *lp = dev->priv; struct i596_private *lp = dev->priv;
#if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) #if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) || defined(ENABLE_APRICOT)
short ioaddr = dev->base_addr; short ioaddr = dev->base_addr;
#endif #endif
unsigned long flags; unsigned long flags;

View File

@ -36,6 +36,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -216,7 +217,7 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr)
outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET); outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
while ((inb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0) while ((inb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(" not found (no reset ack).\n"); printk(" not found (no reset ack).\n");
return -ENODEV; return -ENODEV;
} }
@ -382,7 +383,7 @@ apne_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((inb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0) while ((inb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk("%s: ne_reset_8390() did not complete.\n", dev->name); printk("%s: ne_reset_8390() did not complete.\n", dev->name);
break; break;
} }
@ -530,7 +531,7 @@ apne_block_output(struct net_device *dev, int count,
dma_start = jiffies; dma_start = jiffies;
while ((inb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0) while ((inb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk("%s: timeout waiting for Tx RDC.\n", dev->name); printk("%s: timeout waiting for Tx RDC.\n", dev->name);
apne_reset_8390(dev); apne_reset_8390(dev);
NS8390_init(dev,1); NS8390_init(dev,1);

View File

@ -42,7 +42,7 @@ static int build_header(struct sk_buff *skb, struct net_device *dev,
static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length,
int bufnum); int bufnum);
struct ArcProto rawmode_proto = static struct ArcProto rawmode_proto =
{ {
.suffix = 'r', .suffix = 'r',
.mtu = XMTU, .mtu = XMTU,

View File

@ -97,25 +97,44 @@ static int __init arcrimi_probe(struct net_device *dev)
"must specify the shmem and irq!\n"); "must specify the shmem and irq!\n");
return -ENODEV; return -ENODEV;
} }
if (dev->dev_addr[0] == 0) {
BUGMSG(D_NORMAL, "You need to specify your card's station "
"ID!\n");
return -ENODEV;
}
/* /*
* Grab the memory region at mem_start for BUFFER_SIZE bytes. * Grab the memory region at mem_start for MIRROR_SIZE bytes.
* Later in arcrimi_found() the real size will be determined * Later in arcrimi_found() the real size will be determined
* and this reserve will be released and the correct size * and this reserve will be released and the correct size
* will be taken. * will be taken.
*/ */
if (!request_mem_region(dev->mem_start, BUFFER_SIZE, "arcnet (90xx)")) { if (!request_mem_region(dev->mem_start, MIRROR_SIZE, "arcnet (90xx)")) {
BUGMSG(D_NORMAL, "Card memory already allocated\n"); BUGMSG(D_NORMAL, "Card memory already allocated\n");
return -ENODEV; return -ENODEV;
} }
if (dev->dev_addr[0] == 0) {
release_mem_region(dev->mem_start, BUFFER_SIZE);
BUGMSG(D_NORMAL, "You need to specify your card's station "
"ID!\n");
return -ENODEV;
}
return arcrimi_found(dev); return arcrimi_found(dev);
} }
static int check_mirror(unsigned long addr, size_t size)
{
void __iomem *p;
int res = -1;
if (!request_mem_region(addr, size, "arcnet (90xx)"))
return -1;
p = ioremap(addr, size);
if (p) {
if (readb(p) == TESTvalue)
res = 1;
else
res = 0;
iounmap(p);
}
release_mem_region(addr, size);
return res;
}
/* /*
* Set up the struct net_device associated with this card. Called after * Set up the struct net_device associated with this card. Called after
@ -125,19 +144,28 @@ static int __init arcrimi_found(struct net_device *dev)
{ {
struct arcnet_local *lp; struct arcnet_local *lp;
unsigned long first_mirror, last_mirror, shmem; unsigned long first_mirror, last_mirror, shmem;
void __iomem *p;
int mirror_size; int mirror_size;
int err; int err;
p = ioremap(dev->mem_start, MIRROR_SIZE);
if (!p) {
release_mem_region(dev->mem_start, MIRROR_SIZE);
BUGMSG(D_NORMAL, "Can't ioremap\n");
return -ENODEV;
}
/* reserve the irq */ /* reserve the irq */
if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (RIM I)", dev)) { if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (RIM I)", dev)) {
release_mem_region(dev->mem_start, BUFFER_SIZE); iounmap(p);
release_mem_region(dev->mem_start, MIRROR_SIZE);
BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq); BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq);
return -ENODEV; return -ENODEV;
} }
shmem = dev->mem_start; shmem = dev->mem_start;
isa_writeb(TESTvalue, shmem); writeb(TESTvalue, p);
isa_writeb(dev->dev_addr[0], shmem + 1); /* actually the node ID */ writeb(dev->dev_addr[0], p + 1); /* actually the node ID */
/* find the real shared memory start/end points, including mirrors */ /* find the real shared memory start/end points, including mirrors */
@ -146,17 +174,18 @@ static int __init arcrimi_found(struct net_device *dev)
* 2k (or there are no mirrors at all) but on some, it's 4k. * 2k (or there are no mirrors at all) but on some, it's 4k.
*/ */
mirror_size = MIRROR_SIZE; mirror_size = MIRROR_SIZE;
if (isa_readb(shmem) == TESTvalue if (readb(p) == TESTvalue
&& isa_readb(shmem - mirror_size) != TESTvalue && check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0
&& isa_readb(shmem - 2 * mirror_size) == TESTvalue) && check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1)
mirror_size *= 2; mirror_size = 2 * MIRROR_SIZE;
first_mirror = last_mirror = shmem; first_mirror = shmem - mirror_size;
while (isa_readb(first_mirror) == TESTvalue) while (check_mirror(first_mirror, mirror_size) == 1)
first_mirror -= mirror_size; first_mirror -= mirror_size;
first_mirror += mirror_size; first_mirror += mirror_size;
while (isa_readb(last_mirror) == TESTvalue) last_mirror = shmem + mirror_size;
while (check_mirror(last_mirror, mirror_size) == 1)
last_mirror += mirror_size; last_mirror += mirror_size;
last_mirror -= mirror_size; last_mirror -= mirror_size;
@ -181,7 +210,8 @@ static int __init arcrimi_found(struct net_device *dev)
* with the correct size. There is a VERY slim chance this could * with the correct size. There is a VERY slim chance this could
* fail. * fail.
*/ */
release_mem_region(shmem, BUFFER_SIZE); iounmap(p);
release_mem_region(shmem, MIRROR_SIZE);
if (!request_mem_region(dev->mem_start, if (!request_mem_region(dev->mem_start,
dev->mem_end - dev->mem_start + 1, dev->mem_end - dev->mem_start + 1,
"arcnet (90xx)")) { "arcnet (90xx)")) {

View File

@ -52,6 +52,7 @@
#include <net/arp.h> #include <net/arp.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/arcdevice.h> #include <linux/arcdevice.h>
#include <linux/jiffies.h>
/* "do nothing" functions for protocol drivers */ /* "do nothing" functions for protocol drivers */
static void null_rx(struct net_device *dev, int bufnum, static void null_rx(struct net_device *dev, int bufnum,
@ -61,6 +62,7 @@ static int null_build_header(struct sk_buff *skb, struct net_device *dev,
static int null_prepare_tx(struct net_device *dev, struct archdr *pkt, static int null_prepare_tx(struct net_device *dev, struct archdr *pkt,
int length, int bufnum); int length, int bufnum);
static void arcnet_rx(struct net_device *dev, int bufnum);
/* /*
* one ArcProto per possible proto ID. None of the elements of * one ArcProto per possible proto ID. None of the elements of
@ -71,7 +73,7 @@ static int null_prepare_tx(struct net_device *dev, struct archdr *pkt,
struct ArcProto *arc_proto_map[256], *arc_proto_default, struct ArcProto *arc_proto_map[256], *arc_proto_default,
*arc_bcast_proto, *arc_raw_proto; *arc_bcast_proto, *arc_raw_proto;
struct ArcProto arc_proto_null = static struct ArcProto arc_proto_null =
{ {
.suffix = '?', .suffix = '?',
.mtu = XMTU, .mtu = XMTU,
@ -90,7 +92,6 @@ EXPORT_SYMBOL(arc_proto_map);
EXPORT_SYMBOL(arc_proto_default); EXPORT_SYMBOL(arc_proto_default);
EXPORT_SYMBOL(arc_bcast_proto); EXPORT_SYMBOL(arc_bcast_proto);
EXPORT_SYMBOL(arc_raw_proto); EXPORT_SYMBOL(arc_raw_proto);
EXPORT_SYMBOL(arc_proto_null);
EXPORT_SYMBOL(arcnet_unregister_proto); EXPORT_SYMBOL(arcnet_unregister_proto);
EXPORT_SYMBOL(arcnet_debug); EXPORT_SYMBOL(arcnet_debug);
EXPORT_SYMBOL(alloc_arcdev); EXPORT_SYMBOL(alloc_arcdev);
@ -118,7 +119,7 @@ static int __init arcnet_init(void)
arcnet_debug = debug; arcnet_debug = debug;
printk(VERSION); printk("arcnet loaded.\n");
#ifdef ALPHA_WARNING #ifdef ALPHA_WARNING
BUGLVL(D_EXTRA) { BUGLVL(D_EXTRA) {
@ -178,8 +179,8 @@ EXPORT_SYMBOL(arcnet_dump_skb);
* Dump the contents of an ARCnet buffer * Dump the contents of an ARCnet buffer
*/ */
#if (ARCNET_DEBUG_MAX & (D_RX | D_TX)) #if (ARCNET_DEBUG_MAX & (D_RX | D_TX))
void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc, static void arcnet_dump_packet(struct net_device *dev, int bufnum,
int take_arcnet_lock) char *desc, int take_arcnet_lock)
{ {
struct arcnet_local *lp = dev->priv; struct arcnet_local *lp = dev->priv;
int i, length; int i, length;
@ -208,7 +209,10 @@ void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc,
} }
EXPORT_SYMBOL(arcnet_dump_packet); #else
#define arcnet_dump_packet(dev, bufnum, desc,take_arcnet_lock) do { } while (0)
#endif #endif
@ -733,7 +737,7 @@ static void arcnet_timeout(struct net_device *dev)
spin_unlock_irqrestore(&lp->lock, flags); spin_unlock_irqrestore(&lp->lock, flags);
if (jiffies - lp->last_timeout > 10*HZ) { if (time_after(jiffies, lp->last_timeout + 10*HZ)) {
BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)\n", BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)\n",
msg, status, lp->intmask, lp->lasttrans_dest); msg, status, lp->intmask, lp->lasttrans_dest);
lp->last_timeout = jiffies; lp->last_timeout = jiffies;
@ -996,7 +1000,7 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs)
* This is a generic packet receiver that calls arcnet??_rx depending on the * This is a generic packet receiver that calls arcnet??_rx depending on the
* protocol ID found. * protocol ID found.
*/ */
void arcnet_rx(struct net_device *dev, int bufnum) static void arcnet_rx(struct net_device *dev, int bufnum)
{ {
struct arcnet_local *lp = dev->priv; struct arcnet_local *lp = dev->priv;
struct archdr pkt; struct archdr pkt;

View File

@ -53,7 +53,7 @@
/* Internal function declarations */ /* Internal function declarations */
static int com90xx_found(int ioaddr, int airq, u_long shmem); static int com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem *);
static void com90xx_command(struct net_device *dev, int command); static void com90xx_command(struct net_device *dev, int command);
static int com90xx_status(struct net_device *dev); static int com90xx_status(struct net_device *dev);
static void com90xx_setmask(struct net_device *dev, int mask); static void com90xx_setmask(struct net_device *dev, int mask);
@ -116,14 +116,26 @@ static void __init com90xx_probe(void)
unsigned long airqmask; unsigned long airqmask;
int ports[(0x3f0 - 0x200) / 16 + 1] = int ports[(0x3f0 - 0x200) / 16 + 1] =
{0}; {0};
u_long shmems[(0xFF800 - 0xA0000) / 2048 + 1] = unsigned long *shmems;
{0}; void __iomem **iomem;
int numports, numshmems, *port; int numports, numshmems, *port;
u_long *p; u_long *p;
int index;
if (!io && !irq && !shmem && !*device && com90xx_skip_probe) if (!io && !irq && !shmem && !*device && com90xx_skip_probe)
return; return;
shmems = kzalloc(((0x10000-0xa0000) / 0x800) * sizeof(unsigned long),
GFP_KERNEL);
if (!shmems)
return;
iomem = kzalloc(((0x10000-0xa0000) / 0x800) * sizeof(void __iomem *),
GFP_KERNEL);
if (!iomem) {
kfree(shmems);
return;
}
BUGLVL(D_NORMAL) printk(VERSION); BUGLVL(D_NORMAL) printk(VERSION);
/* set up the arrays where we'll store the possible probe addresses */ /* set up the arrays where we'll store the possible probe addresses */
@ -179,6 +191,8 @@ static void __init com90xx_probe(void)
if (!numports) { if (!numports) {
BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n"); BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n");
kfree(shmems);
kfree(iomem);
return; return;
} }
/* Stage 2: we have now reset any possible ARCnet cards, so we can't /* Stage 2: we have now reset any possible ARCnet cards, so we can't
@ -202,8 +216,8 @@ static void __init com90xx_probe(void)
* 0xD1 byte in the right place, or are read-only. * 0xD1 byte in the right place, or are read-only.
*/ */
numprint = -1; numprint = -1;
for (p = &shmems[0]; p < shmems + numshmems; p++) { for (index = 0, p = &shmems[0]; index < numshmems; p++, index++) {
u_long ptr = *p; void __iomem *base;
numprint++; numprint++;
numprint %= 8; numprint %= 8;
@ -213,38 +227,49 @@ static void __init com90xx_probe(void)
} }
BUGMSG2(D_INIT, "%lXh ", *p); BUGMSG2(D_INIT, "%lXh ", *p);
if (!request_mem_region(*p, BUFFER_SIZE, "arcnet (90xx)")) { if (!request_mem_region(*p, MIRROR_SIZE, "arcnet (90xx)")) {
BUGMSG2(D_INIT_REASONS, "(request_mem_region)\n"); BUGMSG2(D_INIT_REASONS, "(request_mem_region)\n");
BUGMSG2(D_INIT_REASONS, "Stage 3: "); BUGMSG2(D_INIT_REASONS, "Stage 3: ");
BUGLVL(D_INIT_REASONS) numprint = 0; BUGLVL(D_INIT_REASONS) numprint = 0;
*p-- = shmems[--numshmems]; goto out;
continue;
} }
if (isa_readb(ptr) != TESTvalue) { base = ioremap(*p, MIRROR_SIZE);
if (!base) {
BUGMSG2(D_INIT_REASONS, "(ioremap)\n");
BUGMSG2(D_INIT_REASONS, "Stage 3: ");
BUGLVL(D_INIT_REASONS) numprint = 0;
goto out1;
}
if (readb(base) != TESTvalue) {
BUGMSG2(D_INIT_REASONS, "(%02Xh != %02Xh)\n", BUGMSG2(D_INIT_REASONS, "(%02Xh != %02Xh)\n",
isa_readb(ptr), TESTvalue); readb(base), TESTvalue);
BUGMSG2(D_INIT_REASONS, "S3: "); BUGMSG2(D_INIT_REASONS, "S3: ");
BUGLVL(D_INIT_REASONS) numprint = 0; BUGLVL(D_INIT_REASONS) numprint = 0;
release_mem_region(*p, BUFFER_SIZE); goto out2;
*p-- = shmems[--numshmems];
continue;
} }
/* By writing 0x42 to the TESTvalue location, we also make /* By writing 0x42 to the TESTvalue location, we also make
* sure no "mirror" shmem areas show up - if they occur * sure no "mirror" shmem areas show up - if they occur
* in another pass through this loop, they will be discarded * in another pass through this loop, they will be discarded
* because *cptr != TESTvalue. * because *cptr != TESTvalue.
*/ */
isa_writeb(0x42, ptr); writeb(0x42, base);
if (isa_readb(ptr) != 0x42) { if (readb(base) != 0x42) {
BUGMSG2(D_INIT_REASONS, "(read only)\n"); BUGMSG2(D_INIT_REASONS, "(read only)\n");
BUGMSG2(D_INIT_REASONS, "S3: "); BUGMSG2(D_INIT_REASONS, "S3: ");
release_mem_region(*p, BUFFER_SIZE); goto out2;
*p-- = shmems[--numshmems];
continue;
} }
BUGMSG2(D_INIT_REASONS, "\n"); BUGMSG2(D_INIT_REASONS, "\n");
BUGMSG2(D_INIT_REASONS, "S3: "); BUGMSG2(D_INIT_REASONS, "S3: ");
BUGLVL(D_INIT_REASONS) numprint = 0; BUGLVL(D_INIT_REASONS) numprint = 0;
iomem[index] = base;
continue;
out2:
iounmap(base);
out1:
release_mem_region(*p, MIRROR_SIZE);
out:
*p-- = shmems[--numshmems];
index--;
} }
BUGMSG2(D_INIT, "\n"); BUGMSG2(D_INIT, "\n");
@ -252,6 +277,8 @@ static void __init com90xx_probe(void)
BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n"); BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n");
for (port = &ports[0]; port < ports + numports; port++) for (port = &ports[0]; port < ports + numports; port++)
release_region(*port, ARCNET_TOTAL_SIZE); release_region(*port, ARCNET_TOTAL_SIZE);
kfree(shmems);
kfree(iomem);
return; return;
} }
/* Stage 4: something of a dummy, to report the shmems that are /* Stage 4: something of a dummy, to report the shmems that are
@ -351,30 +378,32 @@ static void __init com90xx_probe(void)
mdelay(RESETtime); mdelay(RESETtime);
} else { } else {
/* just one shmem and port, assume they match */ /* just one shmem and port, assume they match */
isa_writeb(TESTvalue, shmems[0]); writeb(TESTvalue, iomem[0]);
} }
#else #else
inb(_RESET); inb(_RESET);
mdelay(RESETtime); mdelay(RESETtime);
#endif #endif
for (p = &shmems[0]; p < shmems + numshmems; p++) { for (index = 0; index < numshmems; index++) {
u_long ptr = *p; u_long ptr = shmems[index];
void __iomem *base = iomem[index];
if (isa_readb(ptr) == TESTvalue) { /* found one */ if (readb(base) == TESTvalue) { /* found one */
BUGMSG2(D_INIT, "%lXh)\n", *p); BUGMSG2(D_INIT, "%lXh)\n", *p);
openparen = 0; openparen = 0;
/* register the card */ /* register the card */
if (com90xx_found(*port, airq, *p) == 0) if (com90xx_found(*port, airq, ptr, base) == 0)
found = 1; found = 1;
numprint = -1; numprint = -1;
/* remove shmem from the list */ /* remove shmem from the list */
*p = shmems[--numshmems]; shmems[index] = shmems[--numshmems];
iomem[index] = iomem[numshmems];
break; /* go to the next I/O port */ break; /* go to the next I/O port */
} else { } else {
BUGMSG2(D_INIT_REASONS, "%Xh-", isa_readb(ptr)); BUGMSG2(D_INIT_REASONS, "%Xh-", readb(base));
} }
} }
@ -391,17 +420,40 @@ static void __init com90xx_probe(void)
BUGLVL(D_INIT_REASONS) printk("\n"); BUGLVL(D_INIT_REASONS) printk("\n");
/* Now put back TESTvalue on all leftover shmems. */ /* Now put back TESTvalue on all leftover shmems. */
for (p = &shmems[0]; p < shmems + numshmems; p++) { for (index = 0; index < numshmems; index++) {
isa_writeb(TESTvalue, *p); writeb(TESTvalue, iomem[index]);
release_mem_region(*p, BUFFER_SIZE); iounmap(iomem[index]);
release_mem_region(shmems[index], MIRROR_SIZE);
} }
kfree(shmems);
kfree(iomem);
} }
static int check_mirror(unsigned long addr, size_t size)
{
void __iomem *p;
int res = -1;
if (!request_mem_region(addr, size, "arcnet (90xx)"))
return -1;
p = ioremap(addr, size);
if (p) {
if (readb(p) == TESTvalue)
res = 1;
else
res = 0;
iounmap(p);
}
release_mem_region(addr, size);
return res;
}
/* Set up the struct net_device associated with this card. Called after /* Set up the struct net_device associated with this card. Called after
* probing succeeds. * probing succeeds.
*/ */
static int __init com90xx_found(int ioaddr, int airq, u_long shmem) static int __init com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem *p)
{ {
struct net_device *dev = NULL; struct net_device *dev = NULL;
struct arcnet_local *lp; struct arcnet_local *lp;
@ -412,7 +464,8 @@ static int __init com90xx_found(int ioaddr, int airq, u_long shmem)
dev = alloc_arcdev(device); dev = alloc_arcdev(device);
if (!dev) { if (!dev) {
BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n"); BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n");
release_mem_region(shmem, BUFFER_SIZE); iounmap(p);
release_mem_region(shmem, MIRROR_SIZE);
return -ENOMEM; return -ENOMEM;
} }
lp = dev->priv; lp = dev->priv;
@ -423,24 +476,27 @@ static int __init com90xx_found(int ioaddr, int airq, u_long shmem)
* 2k (or there are no mirrors at all) but on some, it's 4k. * 2k (or there are no mirrors at all) but on some, it's 4k.
*/ */
mirror_size = MIRROR_SIZE; mirror_size = MIRROR_SIZE;
if (isa_readb(shmem) == TESTvalue if (readb(p) == TESTvalue &&
&& isa_readb(shmem - mirror_size) != TESTvalue check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0 &&
&& isa_readb(shmem - 2 * mirror_size) == TESTvalue) check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1)
mirror_size *= 2; mirror_size = 2 * MIRROR_SIZE;
first_mirror = last_mirror = shmem; first_mirror = shmem - mirror_size;
while (isa_readb(first_mirror) == TESTvalue) while (check_mirror(first_mirror, mirror_size) == 1)
first_mirror -= mirror_size; first_mirror -= mirror_size;
first_mirror += mirror_size; first_mirror += mirror_size;
while (isa_readb(last_mirror) == TESTvalue) last_mirror = shmem + mirror_size;
while (check_mirror(last_mirror, mirror_size) == 1)
last_mirror += mirror_size; last_mirror += mirror_size;
last_mirror -= mirror_size; last_mirror -= mirror_size;
dev->mem_start = first_mirror; dev->mem_start = first_mirror;
dev->mem_end = last_mirror + MIRROR_SIZE - 1; dev->mem_end = last_mirror + MIRROR_SIZE - 1;
release_mem_region(shmem, BUFFER_SIZE); iounmap(p);
release_mem_region(shmem, MIRROR_SIZE);
if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)")) if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)"))
goto err_free_dev; goto err_free_dev;

View File

@ -43,7 +43,7 @@ static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length,
int bufnum); int bufnum);
struct ArcProto rfc1051_proto = static struct ArcProto rfc1051_proto =
{ {
.suffix = 's', .suffix = 's',
.mtu = XMTU - RFC1051_HDR_SIZE, .mtu = XMTU - RFC1051_HDR_SIZE,

View File

@ -43,7 +43,7 @@ static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length,
int bufnum); int bufnum);
static int continue_tx(struct net_device *dev, int bufnum); static int continue_tx(struct net_device *dev, int bufnum);
struct ArcProto rfc1201_proto = static struct ArcProto rfc1201_proto =
{ {
.suffix = 'a', .suffix = 'a',
.mtu = 1500, /* could be more, but some receivers can't handle it... */ .mtu = 1500, /* could be more, but some receivers can't handle it... */

View File

@ -46,6 +46,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/ecard.h> #include <asm/ecard.h>
@ -355,7 +356,7 @@ etherh_block_output (struct net_device *dev, int count, const unsigned char *buf
dma_start = jiffies; dma_start = jiffies;
while ((readb (addr + EN0_ISR) & ENISR_RDC) == 0) while ((readb (addr + EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk(KERN_ERR "%s: timeout waiting for TX RDC\n", printk(KERN_ERR "%s: timeout waiting for TX RDC\n",
dev->name); dev->name);
etherh_reset (dev); etherh_reset (dev);

View File

@ -161,6 +161,7 @@ static char *version =
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -754,7 +755,7 @@ static void eth16i_set_port(int ioaddr, int porttype)
static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l) static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
{ {
int starttime; unsigned long starttime;
outb(0xff, ioaddr + TX_STATUS_REG); outb(0xff, ioaddr + TX_STATUS_REG);
@ -765,7 +766,7 @@ static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
outb(TX_START | 1, ioaddr + TRANSMIT_START_REG); outb(TX_START | 1, ioaddr + TRANSMIT_START_REG);
while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) { while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) {
if( (jiffies - starttime) > TX_TIMEOUT) { if( time_after(jiffies, starttime + TX_TIMEOUT)) {
return -1; return -1;
} }
} }
@ -775,18 +776,18 @@ static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
static int eth16i_receive_probe_packet(int ioaddr) static int eth16i_receive_probe_packet(int ioaddr)
{ {
int starttime; unsigned long starttime;
starttime = jiffies; starttime = jiffies;
while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) { while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) {
if( (jiffies - starttime) > TX_TIMEOUT) { if( time_after(jiffies, starttime + TX_TIMEOUT)) {
if(eth16i_debug > 1) if(eth16i_debug > 1)
printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n"); printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n");
starttime = jiffies; starttime = jiffies;
while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) { while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
if( (jiffies - starttime) > TX_TIMEOUT) { if( time_after(jiffies, starttime + TX_TIMEOUT)) {
if(eth16i_debug > 1) if(eth16i_debug > 1)
printk(KERN_DEBUG "Timeout occurred waiting receive packet\n"); printk(KERN_DEBUG "Timeout occurred waiting receive packet\n");
return -1; return -1;

View File

@ -905,7 +905,7 @@ static int epp_open(struct net_device *dev)
/* autoprobe baud rate */ /* autoprobe baud rate */
tstart = jiffies; tstart = jiffies;
i = 0; i = 0;
while ((signed)(jiffies-tstart-HZ/3) < 0) { while (time_before(jiffies, tstart + HZ/3)) {
if (pp->ops->epp_read_addr(pp, &stat, 1, 0) != 1) if (pp->ops->epp_read_addr(pp, &stat, 1, 0) != 1)
goto epptimeout; goto epptimeout;
if ((stat & (EPP_NRAEF|EPP_NRHF)) == EPP_NRHF) { if ((stat & (EPP_NRAEF|EPP_NRHF)) == EPP_NRHF) {

View File

@ -115,6 +115,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/io.h> #include <asm/io.h>
@ -1499,7 +1500,7 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev)
printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name); printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name);
#endif #endif
/* not waited long enough since last tx? */ /* not waited long enough since last tx? */
if (jiffies - dev->trans_start < HZ) if (time_before(jiffies, dev->trans_start + HZ))
return -EAGAIN; return -EAGAIN;
if (hp100_check_lan(dev)) if (hp100_check_lan(dev))
@ -1652,7 +1653,7 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev)
printk("hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i); printk("hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i);
#endif #endif
/* not waited long enough since last failed tx try? */ /* not waited long enough since last failed tx try? */
if (jiffies - dev->trans_start < HZ) { if (time_before(jiffies, dev->trans_start + HZ)) {
#ifdef HP100_DEBUG #ifdef HP100_DEBUG
printk("hp100: %s: trans_start timing problem\n", printk("hp100: %s: trans_start timing problem\n",
dev->name); dev->name);
@ -1718,17 +1719,10 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev)
hp100_outw(i, FRAGMENT_LEN); /* and first/only fragment length */ hp100_outw(i, FRAGMENT_LEN); /* and first/only fragment length */
if (lp->mode == 2) { /* memory mapped */ if (lp->mode == 2) { /* memory mapped */
if (lp->mem_ptr_virt) { /* high pci memory was remapped */ /* Note: The J2585B needs alignment to 32bits here! */
/* Note: The J2585B needs alignment to 32bits here! */ memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3);
memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3); if (!ok_flag)
if (!ok_flag) memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len);
memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len);
} else {
/* Note: The J2585B needs alignment to 32bits here! */
isa_memcpy_toio(lp->mem_ptr_phys, skb->data, (skb->len + 3) & ~3);
if (!ok_flag)
isa_memset_io(lp->mem_ptr_phys, 0, HP100_MIN_PACKET_SIZE - skb->len);
}
} else { /* programmed i/o */ } else { /* programmed i/o */
outsl(ioaddr + HP100_REG_DATA32, skb->data, outsl(ioaddr + HP100_REG_DATA32, skb->data,
(skb->len + 3) >> 2); (skb->len + 3) >> 2);
@ -1798,10 +1792,7 @@ static void hp100_rx(struct net_device *dev)
/* First we get the header, which contains information about the */ /* First we get the header, which contains information about the */
/* actual length of the received packet. */ /* actual length of the received packet. */
if (lp->mode == 2) { /* memory mapped mode */ if (lp->mode == 2) { /* memory mapped mode */
if (lp->mem_ptr_virt) /* if memory was remapped */ header = readl(lp->mem_ptr_virt);
header = readl(lp->mem_ptr_virt);
else
header = isa_readl(lp->mem_ptr_phys);
} else /* programmed i/o */ } else /* programmed i/o */
header = hp100_inl(DATA32); header = hp100_inl(DATA32);
@ -1833,13 +1824,9 @@ static void hp100_rx(struct net_device *dev)
ptr = skb->data; ptr = skb->data;
/* Now transfer the data from the card into that area */ /* Now transfer the data from the card into that area */
if (lp->mode == 2) { if (lp->mode == 2)
if (lp->mem_ptr_virt) memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len);
memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len); else /* io mapped */
/* Note alignment to 32bit transfers */
else
isa_memcpy_fromio(ptr, lp->mem_ptr_phys, pkt_len);
} else /* io mapped */
insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2); insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2);
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);

View File

@ -204,7 +204,7 @@ static inline int emac_phy_gpcs(int phy_mode)
static inline void emac_tx_enable(struct ocp_enet_private *dev) static inline void emac_tx_enable(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -220,7 +220,7 @@ static inline void emac_tx_enable(struct ocp_enet_private *dev)
static void emac_tx_disable(struct ocp_enet_private *dev) static void emac_tx_disable(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -244,7 +244,7 @@ static void emac_tx_disable(struct ocp_enet_private *dev)
static void emac_rx_enable(struct ocp_enet_private *dev) static void emac_rx_enable(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -275,7 +275,7 @@ static void emac_rx_enable(struct ocp_enet_private *dev)
static void emac_rx_disable(struct ocp_enet_private *dev) static void emac_rx_disable(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -299,7 +299,7 @@ static void emac_rx_disable(struct ocp_enet_private *dev)
static inline void emac_rx_disable_async(struct ocp_enet_private *dev) static inline void emac_rx_disable_async(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -315,7 +315,7 @@ static inline void emac_rx_disable_async(struct ocp_enet_private *dev)
static int emac_reset(struct ocp_enet_private *dev) static int emac_reset(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
int n = 20; int n = 20;
@ -348,7 +348,7 @@ static int emac_reset(struct ocp_enet_private *dev)
static void emac_hash_mc(struct ocp_enet_private *dev) static void emac_hash_mc(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
u16 gaht[4] = { 0 }; u16 gaht[4] = { 0 };
struct dev_mc_list *dmi; struct dev_mc_list *dmi;
@ -393,7 +393,7 @@ static inline int emac_opb_mhz(void)
/* BHs disabled */ /* BHs disabled */
static int emac_configure(struct ocp_enet_private *dev) static int emac_configure(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
struct net_device *ndev = dev->ndev; struct net_device *ndev = dev->ndev;
int gige; int gige;
u32 r; u32 r;
@ -555,7 +555,7 @@ static void emac_full_tx_reset(struct net_device *ndev)
static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg) static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
u32 r; u32 r;
int n; int n;
@ -604,7 +604,7 @@ static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg)
static void __emac_mdio_write(struct ocp_enet_private *dev, u8 id, u8 reg, static void __emac_mdio_write(struct ocp_enet_private *dev, u8 id, u8 reg,
u16 val) u16 val)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
int n; int n;
DBG2("%d: mdio_write(%02x,%02x,%04x)" NL, dev->def->index, id, reg, DBG2("%d: mdio_write(%02x,%02x,%04x)" NL, dev->def->index, id, reg,
@ -666,7 +666,7 @@ static void emac_mdio_write(struct net_device *ndev, int id, int reg, int val)
static void emac_set_multicast_list(struct net_device *ndev) static void emac_set_multicast_list(struct net_device *ndev)
{ {
struct ocp_enet_private *dev = ndev->priv; struct ocp_enet_private *dev = ndev->priv;
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
u32 rmr = emac_iff2rmr(ndev); u32 rmr = emac_iff2rmr(ndev);
DBG("%d: multicast %08x" NL, dev->def->index, rmr); DBG("%d: multicast %08x" NL, dev->def->index, rmr);
@ -825,7 +825,7 @@ static void emac_clean_rx_ring(struct ocp_enet_private *dev)
} }
static inline int emac_alloc_rx_skb(struct ocp_enet_private *dev, int slot, static inline int emac_alloc_rx_skb(struct ocp_enet_private *dev, int slot,
int flags) gfp_t flags)
{ {
struct sk_buff *skb = alloc_skb(dev->rx_skb_size, flags); struct sk_buff *skb = alloc_skb(dev->rx_skb_size, flags);
if (unlikely(!skb)) if (unlikely(!skb))
@ -1047,7 +1047,7 @@ static inline u16 emac_tx_csum(struct ocp_enet_private *dev,
static inline int emac_xmit_finish(struct ocp_enet_private *dev, int len) static inline int emac_xmit_finish(struct ocp_enet_private *dev, int len)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
struct net_device *ndev = dev->ndev; struct net_device *ndev = dev->ndev;
/* Send the packet out */ /* Send the packet out */
@ -1519,7 +1519,7 @@ static void emac_rxde(void *param)
static irqreturn_t emac_irq(int irq, void *dev_instance, struct pt_regs *regs) static irqreturn_t emac_irq(int irq, void *dev_instance, struct pt_regs *regs)
{ {
struct ocp_enet_private *dev = dev_instance; struct ocp_enet_private *dev = dev_instance;
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
struct ibm_emac_error_stats *st = &dev->estats; struct ibm_emac_error_stats *st = &dev->estats;
u32 isr = in_be32(&p->isr); u32 isr = in_be32(&p->isr);
@ -1619,17 +1619,17 @@ static void emac_remove(struct ocp_device *ocpdev)
DBG("%d: remove" NL, dev->def->index); DBG("%d: remove" NL, dev->def->index);
ocp_set_drvdata(ocpdev, 0); ocp_set_drvdata(ocpdev, NULL);
unregister_netdev(dev->ndev); unregister_netdev(dev->ndev);
tah_fini(dev->tah_dev); tah_fini(dev->tah_dev);
rgmii_fini(dev->rgmii_dev, dev->rgmii_input); rgmii_fini(dev->rgmii_dev, dev->rgmii_input);
zmii_fini(dev->zmii_dev, dev->zmii_input); zmii_fini(dev->zmii_dev, dev->zmii_input);
emac_dbg_register(dev->def->index, 0); emac_dbg_register(dev->def->index, NULL);
mal_unregister_commac(dev->mal, &dev->commac); mal_unregister_commac(dev->mal, &dev->commac);
iounmap((void *)dev->emacp); iounmap(dev->emacp);
kfree(dev->ndev); kfree(dev->ndev);
} }
@ -2048,9 +2048,7 @@ static int __init emac_probe(struct ocp_device *ocpdev)
goto out4; goto out4;
/* Map EMAC regs */ /* Map EMAC regs */
dev->emacp = dev->emacp = ioremap(dev->def->paddr, sizeof(struct emac_regs));
(struct emac_regs *)ioremap(dev->def->paddr,
sizeof(struct emac_regs));
if (!dev->emacp) { if (!dev->emacp) {
printk(KERN_ERR "emac%d: could not ioremap device registers!\n", printk(KERN_ERR "emac%d: could not ioremap device registers!\n",
dev->def->index); dev->def->index);
@ -2210,7 +2208,7 @@ static int __init emac_probe(struct ocp_device *ocpdev)
return 0; return 0;
out6: out6:
iounmap((void *)dev->emacp); iounmap(dev->emacp);
out5: out5:
tah_fini(dev->tah_dev); tah_fini(dev->tah_dev);
out4: out4:

View File

@ -155,7 +155,7 @@ struct ibm_emac_error_stats {
struct ocp_enet_private { struct ocp_enet_private {
struct net_device *ndev; /* 0 */ struct net_device *ndev; /* 0 */
struct emac_regs *emacp; struct emac_regs __iomem *emacp;
struct mal_descriptor *tx_desc; struct mal_descriptor *tx_desc;
int tx_cnt; int tx_cnt;

View File

@ -58,7 +58,7 @@ static void emac_desc_dump(int idx, struct ocp_enet_private *p)
static void emac_mac_dump(int idx, struct ocp_enet_private *dev) static void emac_mac_dump(int idx, struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
printk("** EMAC%d registers **\n" printk("** EMAC%d registers **\n"
"MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n" "MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n"

View File

@ -31,7 +31,7 @@ struct rgmii_regs {
/* RGMII device */ /* RGMII device */
struct ibm_ocp_rgmii { struct ibm_ocp_rgmii {
struct rgmii_regs *base; struct rgmii_regs __iomem *base;
int users; /* number of EMACs using this RGMII bridge */ int users; /* number of EMACs using this RGMII bridge */
}; };

View File

@ -80,7 +80,7 @@ static inline u32 zmii_mode_mask(int mode, int input)
static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode) static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode)
{ {
struct ibm_ocp_zmii *dev = ocp_get_drvdata(ocpdev); struct ibm_ocp_zmii *dev = ocp_get_drvdata(ocpdev);
struct zmii_regs *p; struct zmii_regs __iomem *p;
ZMII_DBG("%d: init(%d, %d)" NL, ocpdev->def->index, input, *mode); ZMII_DBG("%d: init(%d, %d)" NL, ocpdev->def->index, input, *mode);
@ -94,8 +94,7 @@ static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode)
} }
dev->mode = PHY_MODE_NA; dev->mode = PHY_MODE_NA;
p = (struct zmii_regs *)ioremap(ocpdev->def->paddr, p = ioremap(ocpdev->def->paddr, sizeof(struct zmii_regs));
sizeof(struct zmii_regs));
if (!p) { if (!p) {
printk(KERN_ERR printk(KERN_ERR
"zmii%d: could not ioremap device registers!\n", "zmii%d: could not ioremap device registers!\n",
@ -231,7 +230,7 @@ void __exit __zmii_fini(struct ocp_device *ocpdev, int input)
if (!--dev->users) { if (!--dev->users) {
/* Free everything if this is the last user */ /* Free everything if this is the last user */
ocp_set_drvdata(ocpdev, NULL); ocp_set_drvdata(ocpdev, NULL);
iounmap((void *)dev->base); iounmap(dev->base);
kfree(dev); kfree(dev);
} }
} }

View File

@ -32,7 +32,7 @@ struct zmii_regs {
/* ZMII device */ /* ZMII device */
struct ibm_ocp_zmii { struct ibm_ocp_zmii {
struct zmii_regs *base; struct zmii_regs __iomem *base;
int mode; /* subset of PHY_MODE_XXXX */ int mode; /* subset of PHY_MODE_XXXX */
int users; /* number of EMACs using this ZMII bridge */ int users; /* number of EMACs using this ZMII bridge */
u32 fer_save; /* FER value left by firmware */ u32 fer_save; /* FER value left by firmware */

View File

@ -622,7 +622,7 @@ static int __init mac_sonic_init_module(void)
return 0; return 0;
out_unregister: out_unregister:
driver_unregister(&mac_sonic_driver); platform_driver_unregister(&mac_sonic_driver);
return -ENOMEM; return -ENOMEM;
} }

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/mii.h>
#include <linux/mv643xx.h> #include <linux/mv643xx.h>
@ -89,10 +90,6 @@
* *
*/ */
/* MAC accepet/reject macros */
#define ACCEPT_MAC_ADDR 0
#define REJECT_MAC_ADDR 1
/* Buffer offset from buffer pointer */ /* Buffer offset from buffer pointer */
#define RX_BUF_OFFSET 0x2 #define RX_BUF_OFFSET 0x2
@ -324,11 +321,6 @@ struct mv643xx_mib_counters {
struct mv643xx_private { struct mv643xx_private {
int port_num; /* User Ethernet port number */ int port_num; /* User Ethernet port number */
u8 port_mac_addr[6]; /* User defined port MAC address.*/
u32 port_config; /* User port configuration value*/
u32 port_config_extend; /* User port config extend value*/
u32 port_sdma_config; /* User port SDMA config value */
u32 port_serial_control; /* User port serial control value */
u32 port_tx_queue_command; /* Port active Tx queues summary*/ u32 port_tx_queue_command; /* Port active Tx queues summary*/
u32 port_rx_queue_command; /* Port active Rx queues summary*/ u32 port_rx_queue_command; /* Port active Rx queues summary*/
@ -376,12 +368,12 @@ struct mv643xx_private {
spinlock_t lock; spinlock_t lock;
/* Size of Tx Ring per queue */ /* Size of Tx Ring per queue */
unsigned int tx_ring_size; unsigned int tx_ring_size;
/* Ammont of SKBs outstanding on Tx queue */ /* Number of tx descriptors in use */
unsigned int tx_ring_skbs; unsigned int tx_desc_count;
/* Size of Rx Ring per queue */ /* Size of Rx Ring per queue */
unsigned int rx_ring_size; unsigned int rx_ring_size;
/* Ammount of SKBs allocated to Rx Ring per queue */ /* Number of rx descriptors in use */
unsigned int rx_ring_skbs; unsigned int rx_desc_count;
/* /*
* rx_task used to fill RX ring out of bottom half context * rx_task used to fill RX ring out of bottom half context
@ -398,6 +390,7 @@ struct mv643xx_private {
u32 rx_int_coal; u32 rx_int_coal;
u32 tx_int_coal; u32 tx_int_coal;
struct mii_if_info mii;
}; };
/* ethernet.h API list */ /* ethernet.h API list */
@ -405,7 +398,7 @@ struct mv643xx_private {
/* Port operation control routines */ /* Port operation control routines */
static void eth_port_init(struct mv643xx_private *mp); static void eth_port_init(struct mv643xx_private *mp);
static void eth_port_reset(unsigned int eth_port_num); static void eth_port_reset(unsigned int eth_port_num);
static void eth_port_start(struct mv643xx_private *mp); static void eth_port_start(struct net_device *dev);
/* Port MAC address routines */ /* Port MAC address routines */
static void eth_port_uc_addr_set(unsigned int eth_port_num, static void eth_port_uc_addr_set(unsigned int eth_port_num,

View File

@ -27,6 +27,7 @@ static const char version1[] =
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -365,7 +366,7 @@ static void ne_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name); printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name);
break; break;
} }
@ -580,7 +581,7 @@ retry:
#endif #endif
while ((inb_p(NE_BASE + EN0_ISR) & ENISR_RDC) == 0) while ((inb_p(NE_BASE + EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name); printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
ne_reset_8390(dev); ne_reset_8390(dev);
NS8390_init(dev,1); NS8390_init(dev,1);

View File

@ -50,6 +50,7 @@ static const char version2[] =
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -341,7 +342,7 @@ static int __init ne_probe1(struct net_device *dev, int ioaddr)
outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET); outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
if (bad_card) { if (bad_card) {
printk(" (warning: no reset ack)"); printk(" (warning: no reset ack)");
break; break;
@ -580,7 +581,7 @@ static void ne_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name); printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name);
break; break;
} }
@ -787,7 +788,7 @@ retry:
#endif #endif
while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name); printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
ne_reset_8390(dev); ne_reset_8390(dev);
NS8390_init(dev,1); NS8390_init(dev,1);

View File

@ -75,6 +75,7 @@ static const char *version = "ne2.c:v0.91 Nov 16 1998 Wim Dumon <wimpie@kotnet.o
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -395,7 +396,7 @@ static int __init ne2_probe1(struct net_device *dev, int slot)
outb(inb(base_addr + NE_RESET), base_addr + NE_RESET); outb(inb(base_addr + NE_RESET), base_addr + NE_RESET);
while ((inb_p(base_addr + EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(base_addr + EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(" not found (no reset ack).\n"); printk(" not found (no reset ack).\n");
retval = -ENODEV; retval = -ENODEV;
goto out; goto out;
@ -548,7 +549,7 @@ static void ne_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk("%s: ne_reset_8390() did not complete.\n", printk("%s: ne_reset_8390() did not complete.\n",
dev->name); dev->name);
break; break;
@ -749,7 +750,7 @@ retry:
#endif #endif
while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk("%s: timeout waiting for Tx RDC.\n", dev->name); printk("%s: timeout waiting for Tx RDC.\n", dev->name);
ne_reset_8390(dev); ne_reset_8390(dev);
NS8390_init(dev,1); NS8390_init(dev,1);

View File

@ -116,6 +116,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <linux/jiffies.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -1607,7 +1608,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab
{ {
struct ns83820 *dev = PRIV(ndev); struct ns83820 *dev = PRIV(ndev);
int timed_out = 0; int timed_out = 0;
long start; unsigned long start;
u32 status; u32 status;
int loops = 0; int loops = 0;
@ -1625,7 +1626,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab
break; break;
if (status & fail) if (status & fail)
break; break;
if ((jiffies - start) >= HZ) { if (time_after_eq(jiffies, start + HZ)) {
timed_out = 1; timed_out = 1;
break; break;
} }

View File

@ -20,6 +20,7 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/jiffies.h>
#include <asm/board.h> #include <asm/board.h>
#include <asm/io.h> #include <asm/io.h>
@ -606,7 +607,7 @@ retry:
#endif #endif
while ((ei_ibp(base + EN0_ISR) & ENISR_RDC) == 0) { while ((ei_ibp(base + EN0_ISR) & ENISR_RDC) == 0) {
if (jiffies - start > OAKNET_WAIT) { if (time_after(jiffies, start + OAKNET_WAIT)) {
printk("%s: timeout waiting for Tx RDC.\n", dev->name); printk("%s: timeout waiting for Tx RDC.\n", dev->name);
oaknet_reset_8390(dev); oaknet_reset_8390(dev);
NS8390_init(dev, TRUE); NS8390_init(dev, TRUE);

View File

@ -39,6 +39,7 @@
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <pcmcia/cs_types.h> #include <pcmcia/cs_types.h>
#include <pcmcia/cs.h> #include <pcmcia/cs.h>
@ -796,7 +797,7 @@ static void media_check(unsigned long arg)
media = inw(ioaddr+WN4_MEDIA) & 0xc810; media = inw(ioaddr+WN4_MEDIA) & 0xc810;
/* Ignore collisions unless we've had no irq's recently */ /* Ignore collisions unless we've had no irq's recently */
if (jiffies - lp->last_irq < HZ) { if (time_before(jiffies, lp->last_irq + HZ)) {
media &= ~0x0010; media &= ~0x0010;
} else { } else {
/* Try harder to detect carrier errors */ /* Try harder to detect carrier errors */

View File

@ -30,6 +30,7 @@
#include <linux/ppp_channel.h> #include <linux/ppp_channel.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/jiffies.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/string.h> #include <asm/string.h>
@ -570,7 +571,7 @@ ppp_async_encode(struct asyncppp *ap)
* character if necessary. * character if necessary.
*/ */
if (islcp || flag_time == 0 if (islcp || flag_time == 0
|| jiffies - ap->last_xmit >= flag_time) || time_after_eq(jiffies, ap->last_xmit + flag_time))
*buf++ = PPP_FLAG; *buf++ = PPP_FLAG;
ap->last_xmit = jiffies; ap->last_xmit = jiffies;
fcs = PPP_INITFCS; fcs = PPP_INITFCS;

View File

@ -72,8 +72,8 @@
static char s2io_driver_name[] = "Neterion"; static char s2io_driver_name[] = "Neterion";
static char s2io_driver_version[] = DRV_VERSION; static char s2io_driver_version[] = DRV_VERSION;
int rxd_size[4] = {32,48,48,64}; static int rxd_size[4] = {32,48,48,64};
int rxd_count[4] = {127,85,85,63}; static int rxd_count[4] = {127,85,85,63};
static inline int RXD_IS_UP2DT(RxD_t *rxdp) static inline int RXD_IS_UP2DT(RxD_t *rxdp)
{ {
@ -2127,7 +2127,7 @@ static void stop_nic(struct s2io_nic *nic)
} }
} }
int fill_rxd_3buf(nic_t *nic, RxD_t *rxdp, struct sk_buff *skb) static int fill_rxd_3buf(nic_t *nic, RxD_t *rxdp, struct sk_buff *skb)
{ {
struct net_device *dev = nic->dev; struct net_device *dev = nic->dev;
struct sk_buff *frag_list; struct sk_buff *frag_list;
@ -2852,7 +2852,7 @@ static int wait_for_cmd_complete(nic_t * sp)
* void. * void.
*/ */
void s2io_reset(nic_t * sp) static void s2io_reset(nic_t * sp)
{ {
XENA_dev_config_t __iomem *bar0 = sp->bar0; XENA_dev_config_t __iomem *bar0 = sp->bar0;
u64 val64; u64 val64;
@ -2940,7 +2940,7 @@ void s2io_reset(nic_t * sp)
* SUCCESS on success and FAILURE on failure. * SUCCESS on success and FAILURE on failure.
*/ */
int s2io_set_swapper(nic_t * sp) static int s2io_set_swapper(nic_t * sp)
{ {
struct net_device *dev = sp->dev; struct net_device *dev = sp->dev;
XENA_dev_config_t __iomem *bar0 = sp->bar0; XENA_dev_config_t __iomem *bar0 = sp->bar0;
@ -3089,7 +3089,7 @@ static int wait_for_msix_trans(nic_t *nic, int i)
return ret; return ret;
} }
void restore_xmsi_data(nic_t *nic) static void restore_xmsi_data(nic_t *nic)
{ {
XENA_dev_config_t __iomem *bar0 = nic->bar0; XENA_dev_config_t __iomem *bar0 = nic->bar0;
u64 val64; u64 val64;
@ -3180,7 +3180,7 @@ int s2io_enable_msi(nic_t *nic)
return 0; return 0;
} }
int s2io_enable_msi_x(nic_t *nic) static int s2io_enable_msi_x(nic_t *nic)
{ {
XENA_dev_config_t __iomem *bar0 = nic->bar0; XENA_dev_config_t __iomem *bar0 = nic->bar0;
u64 tx_mat, rx_mat; u64 tx_mat, rx_mat;
@ -4128,7 +4128,7 @@ static void s2io_set_multicast(struct net_device *dev)
* as defined in errno.h file on failure. * as defined in errno.h file on failure.
*/ */
int s2io_set_mac_addr(struct net_device *dev, u8 * addr) static int s2io_set_mac_addr(struct net_device *dev, u8 * addr)
{ {
nic_t *sp = dev->priv; nic_t *sp = dev->priv;
XENA_dev_config_t __iomem *bar0 = sp->bar0; XENA_dev_config_t __iomem *bar0 = sp->bar0;
@ -5713,7 +5713,7 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
* void. * void.
*/ */
void s2io_link(nic_t * sp, int link) static void s2io_link(nic_t * sp, int link)
{ {
struct net_device *dev = (struct net_device *) sp->dev; struct net_device *dev = (struct net_device *) sp->dev;
@ -5738,7 +5738,7 @@ void s2io_link(nic_t * sp, int link)
* returns the revision ID of the device. * returns the revision ID of the device.
*/ */
int get_xena_rev_id(struct pci_dev *pdev) static int get_xena_rev_id(struct pci_dev *pdev)
{ {
u8 id = 0; u8 id = 0;
int ret; int ret;
@ -6343,7 +6343,7 @@ int __init s2io_starter(void)
* Description: This function is the cleanup routine for the driver. It unregist * ers the driver. * Description: This function is the cleanup routine for the driver. It unregist * ers the driver.
*/ */
void s2io_closer(void) static void s2io_closer(void)
{ {
pci_unregister_driver(&s2io_driver); pci_unregister_driver(&s2io_driver);
DBG_PRINT(INIT_DBG, "cleanup done\n"); DBG_PRINT(INIT_DBG, "cleanup done\n");

View File

@ -64,7 +64,7 @@ typedef enum xena_max_outstanding_splits {
#define INTR_DBG 4 #define INTR_DBG 4
/* Global variable that defines the present debug level of the driver. */ /* Global variable that defines the present debug level of the driver. */
int debug_level = ERR_DBG; /* Default level. */ static int debug_level = ERR_DBG;
/* DEBUG message print. */ /* DEBUG message print. */
#define DBG_PRINT(dbg_level, args...) if(!(debug_level<dbg_level)) printk(args) #define DBG_PRINT(dbg_level, args...) if(!(debug_level<dbg_level)) printk(args)
@ -268,7 +268,7 @@ typedef struct stat_block {
#define MAX_RX_RINGS 8 #define MAX_RX_RINGS 8
/* FIFO mappings for all possible number of fifos configured */ /* FIFO mappings for all possible number of fifos configured */
int fifo_map[][MAX_TX_FIFOS] = { static int fifo_map[][MAX_TX_FIFOS] = {
{0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 1, 1, 1, 1},
{0, 0, 0, 1, 1, 1, 2, 2}, {0, 0, 0, 1, 1, 1, 2, 2},
@ -911,18 +911,16 @@ static void tx_intr_handler(fifo_info_t *fifo_data);
static void alarm_intr_handler(struct s2io_nic *sp); static void alarm_intr_handler(struct s2io_nic *sp);
static int s2io_starter(void); static int s2io_starter(void);
void s2io_closer(void);
static void s2io_tx_watchdog(struct net_device *dev); static void s2io_tx_watchdog(struct net_device *dev);
static void s2io_tasklet(unsigned long dev_addr); static void s2io_tasklet(unsigned long dev_addr);
static void s2io_set_multicast(struct net_device *dev); static void s2io_set_multicast(struct net_device *dev);
static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp); static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp);
void s2io_link(nic_t * sp, int link); static void s2io_link(nic_t * sp, int link);
void s2io_reset(nic_t * sp);
#if defined(CONFIG_S2IO_NAPI) #if defined(CONFIG_S2IO_NAPI)
static int s2io_poll(struct net_device *dev, int *budget); static int s2io_poll(struct net_device *dev, int *budget);
#endif #endif
static void s2io_init_pci(nic_t * sp); static void s2io_init_pci(nic_t * sp);
int s2io_set_mac_addr(struct net_device *dev, u8 * addr); static int s2io_set_mac_addr(struct net_device *dev, u8 * addr);
static void s2io_alarm_handle(unsigned long data); static void s2io_alarm_handle(unsigned long data);
static int s2io_enable_msi(nic_t *nic); static int s2io_enable_msi(nic_t *nic);
static irqreturn_t s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs);
@ -930,14 +928,13 @@ static irqreturn_t
s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs); s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs);
static irqreturn_t static irqreturn_t
s2io_msix_fifo_handle(int irq, void *dev_id, struct pt_regs *regs); s2io_msix_fifo_handle(int irq, void *dev_id, struct pt_regs *regs);
int s2io_enable_msi_x(nic_t *nic);
static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs);
static int verify_xena_quiescence(nic_t *sp, u64 val64, int flag); static int verify_xena_quiescence(nic_t *sp, u64 val64, int flag);
static struct ethtool_ops netdev_ethtool_ops; static struct ethtool_ops netdev_ethtool_ops;
static void s2io_set_link(unsigned long data); static void s2io_set_link(unsigned long data);
int s2io_set_swapper(nic_t * sp); static int s2io_set_swapper(nic_t * sp);
static void s2io_card_down(nic_t *nic); static void s2io_card_down(nic_t *nic);
static int s2io_card_up(nic_t *nic); static int s2io_card_up(nic_t *nic);
int get_xena_rev_id(struct pci_dev *pdev); static int get_xena_rev_id(struct pci_dev *pdev);
void restore_xmsi_data(nic_t *nic); static void restore_xmsi_data(nic_t *nic);
#endif /* _S2IO_H */ #endif /* _S2IO_H */

View File

@ -46,6 +46,7 @@ static const char version[] =
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -699,7 +700,7 @@ static void hardware_send_packet(struct net_device * dev, char *buf, int length)
int ioaddr = dev->base_addr; int ioaddr = dev->base_addr;
int status = inw(SEEQ_STATUS); int status = inw(SEEQ_STATUS);
int transmit_ptr = 0; int transmit_ptr = 0;
int tmp; unsigned long tmp;
if (net_debug>4) { if (net_debug>4) {
printk("%s: send 0x%04x\n",dev->name,length); printk("%s: send 0x%04x\n",dev->name,length);
@ -724,7 +725,7 @@ static void hardware_send_packet(struct net_device * dev, char *buf, int length)
/* drain FIFO */ /* drain FIFO */
tmp = jiffies; tmp = jiffies;
while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && (jiffies - tmp < HZ)) while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && time_before(jiffies, tmp + HZ))
mb(); mb();
/* doit ! */ /* doit ! */

View File

@ -83,6 +83,7 @@
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/if_shaper.h> #include <linux/if_shaper.h>
#include <linux/jiffies.h>
#include <net/dst.h> #include <net/dst.h>
#include <net/arp.h> #include <net/arp.h>
@ -168,7 +169,7 @@ static int shaper_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* /*
* Queue over time. Spill packet. * Queue over time. Spill packet.
*/ */
if(SHAPERCB(skb)->shapeclock-jiffies > SHAPER_LATENCY) { if(time_after(SHAPERCB(skb)->shapeclock,jiffies + SHAPER_LATENCY)) {
dev_kfree_skb(skb); dev_kfree_skb(skb);
shaper->stats.tx_dropped++; shaper->stats.tx_dropped++;
} else } else

View File

@ -236,18 +236,6 @@ extern int SkAddrMcClear(
SK_U32 PortNumber, SK_U32 PortNumber,
int Flags); int Flags);
extern int SkAddrXmacMcClear(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
int Flags);
extern int SkAddrGmacMcClear(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
int Flags);
extern int SkAddrMcAdd( extern int SkAddrMcAdd(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -255,35 +243,11 @@ extern int SkAddrMcAdd(
SK_MAC_ADDR *pMc, SK_MAC_ADDR *pMc,
int Flags); int Flags);
extern int SkAddrXmacMcAdd(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
SK_MAC_ADDR *pMc,
int Flags);
extern int SkAddrGmacMcAdd(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
SK_MAC_ADDR *pMc,
int Flags);
extern int SkAddrMcUpdate( extern int SkAddrMcUpdate(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
SK_U32 PortNumber); SK_U32 PortNumber);
extern int SkAddrXmacMcUpdate(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber);
extern int SkAddrGmacMcUpdate(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber);
extern int SkAddrOverride( extern int SkAddrOverride(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -297,18 +261,6 @@ extern int SkAddrPromiscuousChange(
SK_U32 PortNumber, SK_U32 PortNumber,
int NewPromMode); int NewPromMode);
extern int SkAddrXmacPromiscuousChange(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
int NewPromMode);
extern int SkAddrGmacPromiscuousChange(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
int NewPromMode);
#ifndef SK_SLIM #ifndef SK_SLIM
extern int SkAddrSwap( extern int SkAddrSwap(
SK_AC *pAC, SK_AC *pAC,

View File

@ -203,12 +203,6 @@ extern SKCS_STATUS SkCsGetReceiveInfo(
unsigned Checksum2, unsigned Checksum2,
int NetNumber); int NetNumber);
extern void SkCsGetSendInfo(
SK_AC *pAc,
void *pIpHeader,
SKCS_PACKET_INFO *pPacketInfo,
int NetNumber);
extern void SkCsSetReceiveFlags( extern void SkCsSetReceiveFlags(
SK_AC *pAc, SK_AC *pAc,
unsigned ReceiveFlags, unsigned ReceiveFlags,

View File

@ -464,12 +464,6 @@ typedef struct s_GeInit {
/* /*
* public functions in skgeinit.c * public functions in skgeinit.c
*/ */
extern void SkGePollRxD(
SK_AC *pAC,
SK_IOC IoC,
int Port,
SK_BOOL PollRxD);
extern void SkGePollTxD( extern void SkGePollTxD(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -522,10 +516,6 @@ extern void SkGeXmitLED(
int Led, int Led,
int Mode); int Mode);
extern void SkGeInitRamIface(
SK_AC *pAC,
SK_IOC IoC);
extern int SkGeInitAssignRamToQueues( extern int SkGeInitAssignRamToQueues(
SK_AC *pAC, SK_AC *pAC,
int ActivePort, int ActivePort,
@ -549,11 +539,6 @@ extern void SkMacHardRst(
SK_IOC IoC, SK_IOC IoC,
int Port); int Port);
extern void SkMacClearRst(
SK_AC *pAC,
SK_IOC IoC,
int Port);
extern void SkXmInitMac( extern void SkXmInitMac(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -580,11 +565,6 @@ extern void SkMacFlushTxFifo(
SK_IOC IoC, SK_IOC IoC,
int Port); int Port);
extern void SkMacFlushRxFifo(
SK_AC *pAC,
SK_IOC IoC,
int Port);
extern void SkMacIrq( extern void SkMacIrq(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -601,12 +581,6 @@ extern void SkMacAutoNegLipaPhy(
int Port, int Port,
SK_U16 IStatus); SK_U16 IStatus);
extern void SkMacSetRxTxEn(
SK_AC *pAC,
SK_IOC IoC,
int Port,
int Para);
extern int SkMacRxTxEnable( extern int SkMacRxTxEnable(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -659,16 +633,6 @@ extern void SkXmClrExactAddr(
int StartNum, int StartNum,
int StopNum); int StopNum);
extern void SkXmInitDupMd(
SK_AC *pAC,
SK_IOC IoC,
int Port);
extern void SkXmInitPauseMd(
SK_AC *pAC,
SK_IOC IoC,
int Port);
extern void SkXmAutoNegLipaXmac( extern void SkXmAutoNegLipaXmac(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -729,17 +693,6 @@ extern int SkGmCableDiagStatus(
int Port, int Port,
SK_BOOL StartTest); SK_BOOL StartTest);
extern int SkGmEnterLowPowerMode(
SK_AC *pAC,
SK_IOC IoC,
int Port,
SK_U8 Mode);
extern int SkGmLeaveLowPowerMode(
SK_AC *pAC,
SK_IOC IoC,
int Port);
#ifdef SK_DIAG #ifdef SK_DIAG
extern void SkGePhyRead( extern void SkGePhyRead(
SK_AC *pAC, SK_AC *pAC,
@ -782,7 +735,6 @@ extern void SkXmSendCont(
/* /*
* public functions in skgeinit.c * public functions in skgeinit.c
*/ */
extern void SkGePollRxD();
extern void SkGePollTxD(); extern void SkGePollTxD();
extern void SkGeYellowLED(); extern void SkGeYellowLED();
extern int SkGeCfgSync(); extern int SkGeCfgSync();
@ -792,7 +744,6 @@ extern int SkGeInit();
extern void SkGeDeInit(); extern void SkGeDeInit();
extern int SkGeInitPort(); extern int SkGeInitPort();
extern void SkGeXmitLED(); extern void SkGeXmitLED();
extern void SkGeInitRamIface();
extern int SkGeInitAssignRamToQueues(); extern int SkGeInitAssignRamToQueues();
/* /*
@ -801,18 +752,15 @@ extern int SkGeInitAssignRamToQueues();
extern void SkMacRxTxDisable(); extern void SkMacRxTxDisable();
extern void SkMacSoftRst(); extern void SkMacSoftRst();
extern void SkMacHardRst(); extern void SkMacHardRst();
extern void SkMacClearRst();
extern void SkMacInitPhy(); extern void SkMacInitPhy();
extern int SkMacRxTxEnable(); extern int SkMacRxTxEnable();
extern void SkMacPromiscMode(); extern void SkMacPromiscMode();
extern void SkMacHashing(); extern void SkMacHashing();
extern void SkMacIrqDisable(); extern void SkMacIrqDisable();
extern void SkMacFlushTxFifo(); extern void SkMacFlushTxFifo();
extern void SkMacFlushRxFifo();
extern void SkMacIrq(); extern void SkMacIrq();
extern int SkMacAutoNegDone(); extern int SkMacAutoNegDone();
extern void SkMacAutoNegLipaPhy(); extern void SkMacAutoNegLipaPhy();
extern void SkMacSetRxTxEn();
extern void SkXmInitMac(); extern void SkXmInitMac();
extern void SkXmPhyRead(); extern void SkXmPhyRead();
extern void SkXmPhyWrite(); extern void SkXmPhyWrite();
@ -820,8 +768,6 @@ extern void SkGmInitMac();
extern void SkGmPhyRead(); extern void SkGmPhyRead();
extern void SkGmPhyWrite(); extern void SkGmPhyWrite();
extern void SkXmClrExactAddr(); extern void SkXmClrExactAddr();
extern void SkXmInitDupMd();
extern void SkXmInitPauseMd();
extern void SkXmAutoNegLipaXmac(); extern void SkXmAutoNegLipaXmac();
extern int SkXmUpdateStats(); extern int SkXmUpdateStats();
extern int SkGmUpdateStats(); extern int SkGmUpdateStats();
@ -832,8 +778,6 @@ extern int SkGmResetCounter();
extern int SkXmOverflowStatus(); extern int SkXmOverflowStatus();
extern int SkGmOverflowStatus(); extern int SkGmOverflowStatus();
extern int SkGmCableDiagStatus(); extern int SkGmCableDiagStatus();
extern int SkGmEnterLowPowerMode();
extern int SkGmLeaveLowPowerMode();
#ifdef SK_DIAG #ifdef SK_DIAG
extern void SkGePhyRead(); extern void SkGePhyRead();

View File

@ -946,10 +946,6 @@ typedef struct s_PnmiData {
* Function prototypes * Function prototypes
*/ */
extern int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int Level); extern int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int Level);
extern int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf,
unsigned int* pLen, SK_U32 Instance, SK_U32 NetIndex);
extern int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id,
void* pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
extern int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf, extern int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf,
unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf, extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,

View File

@ -105,7 +105,6 @@
extern void SkGeSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus); extern void SkGeSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus);
extern int SkGeSirqEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para); extern int SkGeSirqEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para);
extern void SkHWLinkUp(SK_AC *pAC, SK_IOC IoC, int Port);
extern void SkHWLinkDown(SK_AC *pAC, SK_IOC IoC, int Port); extern void SkHWLinkDown(SK_AC *pAC, SK_IOC IoC, int Port);
#endif /* _INC_SKGESIRQ_H_ */ #endif /* _INC_SKGESIRQ_H_ */

View File

@ -162,9 +162,6 @@ typedef struct s_I2c {
} SK_I2C; } SK_I2C;
extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level); extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level);
extern int SkI2cWrite(SK_AC *pAC, SK_IOC IoC, SK_U32 Data, int Dev, int Size,
int Reg, int Burst);
extern int SkI2cReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen);
#ifdef SK_DIAG #ifdef SK_DIAG
extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg, extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg,
int Burst); int Burst);

View File

@ -183,14 +183,6 @@ extern SK_U32 VpdReadDWord(
int addr); int addr);
#endif /* SKDIAG */ #endif /* SKDIAG */
extern int VpdSetupPara(
SK_AC *pAC,
const char *key,
const char *buf,
int len,
int type,
int op);
extern SK_VPD_STATUS *VpdStat( extern SK_VPD_STATUS *VpdStat(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC); SK_IOC IoC);
@ -227,11 +219,6 @@ extern int VpdUpdate(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC); SK_IOC IoC);
extern void VpdErrLog(
SK_AC *pAC,
SK_IOC IoC,
char *msg);
#ifdef SKDIAG #ifdef SKDIAG
extern int VpdReadBlock( extern int VpdReadBlock(
SK_AC *pAC, SK_AC *pAC,
@ -249,7 +236,6 @@ extern int VpdWriteBlock(
#endif /* SKDIAG */ #endif /* SKDIAG */
#else /* SK_KR_PROTO */ #else /* SK_KR_PROTO */
extern SK_U32 VpdReadDWord(); extern SK_U32 VpdReadDWord();
extern int VpdSetupPara();
extern SK_VPD_STATUS *VpdStat(); extern SK_VPD_STATUS *VpdStat();
extern int VpdKeys(); extern int VpdKeys();
extern int VpdRead(); extern int VpdRead();
@ -257,7 +243,6 @@ extern SK_BOOL VpdMayWrite();
extern int VpdWrite(); extern int VpdWrite();
extern int VpdDelete(); extern int VpdDelete();
extern int VpdUpdate(); extern int VpdUpdate();
extern void VpdErrLog();
#endif /* SK_KR_PROTO */ #endif /* SK_KR_PROTO */
#endif /* __INC_SKVPD_H_ */ #endif /* __INC_SKVPD_H_ */

View File

@ -87,6 +87,21 @@ static const SK_U16 OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
static int Next0[SK_MAX_MACS] = {0}; static int Next0[SK_MAX_MACS] = {0};
#endif /* DEBUG */ #endif /* DEBUG */
static int SkAddrGmacMcAdd(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber,
SK_MAC_ADDR *pMc, int Flags);
static int SkAddrGmacMcClear(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber,
int Flags);
static int SkAddrGmacMcUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber);
static int SkAddrGmacPromiscuousChange(SK_AC *pAC, SK_IOC IoC,
SK_U32 PortNumber, int NewPromMode);
static int SkAddrXmacMcAdd(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber,
SK_MAC_ADDR *pMc, int Flags);
static int SkAddrXmacMcClear(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber,
int Flags);
static int SkAddrXmacMcUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber);
static int SkAddrXmacPromiscuousChange(SK_AC *pAC, SK_IOC IoC,
SK_U32 PortNumber, int NewPromMode);
/* functions ******************************************************************/ /* functions ******************************************************************/
/****************************************************************************** /******************************************************************************
@ -372,7 +387,7 @@ int Flags) /* permanent/non-perm, sw-only */
* SK_ADDR_SUCCESS * SK_ADDR_SUCCESS
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrXmacMcClear( static int SkAddrXmacMcClear(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* Index of affected port */ SK_U32 PortNumber, /* Index of affected port */
@ -429,7 +444,7 @@ int Flags) /* permanent/non-perm, sw-only */
* SK_ADDR_SUCCESS * SK_ADDR_SUCCESS
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrGmacMcClear( static int SkAddrGmacMcClear(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* Index of affected port */ SK_U32 PortNumber, /* Index of affected port */
@ -519,7 +534,7 @@ int Flags) /* permanent/non-perm, sw-only */
* Returns: * Returns:
* Hash value of multicast address. * Hash value of multicast address.
*/ */
SK_U32 SkXmacMcHash( static SK_U32 SkXmacMcHash(
unsigned char *pMc) /* Multicast address */ unsigned char *pMc) /* Multicast address */
{ {
SK_U32 Idx; SK_U32 Idx;
@ -557,7 +572,7 @@ unsigned char *pMc) /* Multicast address */
* Returns: * Returns:
* Hash value of multicast address. * Hash value of multicast address.
*/ */
SK_U32 SkGmacMcHash( static SK_U32 SkGmacMcHash(
unsigned char *pMc) /* Multicast address */ unsigned char *pMc) /* Multicast address */
{ {
SK_U32 Data; SK_U32 Data;
@ -672,7 +687,7 @@ int Flags) /* permanent/non-permanent */
* SK_MC_ILLEGAL_ADDRESS * SK_MC_ILLEGAL_ADDRESS
* SK_MC_RLMT_OVERFLOW * SK_MC_RLMT_OVERFLOW
*/ */
int SkAddrXmacMcAdd( static int SkAddrXmacMcAdd(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* Port Number */ SK_U32 PortNumber, /* Port Number */
@ -778,7 +793,7 @@ int Flags) /* permanent/non-permanent */
* SK_MC_FILTERING_INEXACT * SK_MC_FILTERING_INEXACT
* SK_MC_ILLEGAL_ADDRESS * SK_MC_ILLEGAL_ADDRESS
*/ */
int SkAddrGmacMcAdd( static int SkAddrGmacMcAdd(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* Port Number */ SK_U32 PortNumber, /* Port Number */
@ -937,7 +952,7 @@ SK_U32 PortNumber) /* Port Number */
* SK_MC_FILTERING_INEXACT * SK_MC_FILTERING_INEXACT
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrXmacMcUpdate( static int SkAddrXmacMcUpdate(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber) /* Port Number */ SK_U32 PortNumber) /* Port Number */
@ -1082,7 +1097,7 @@ SK_U32 PortNumber) /* Port Number */
* SK_MC_FILTERING_INEXACT * SK_MC_FILTERING_INEXACT
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrGmacMcUpdate( static int SkAddrGmacMcUpdate(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber) /* Port Number */ SK_U32 PortNumber) /* Port Number */
@ -1468,7 +1483,7 @@ int NewPromMode) /* new promiscuous mode */
* SK_ADDR_SUCCESS * SK_ADDR_SUCCESS
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrXmacPromiscuousChange( static int SkAddrXmacPromiscuousChange(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* port whose promiscuous mode changes */ SK_U32 PortNumber, /* port whose promiscuous mode changes */
@ -1585,7 +1600,7 @@ int NewPromMode) /* new promiscuous mode */
* SK_ADDR_SUCCESS * SK_ADDR_SUCCESS
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrGmacPromiscuousChange( static int SkAddrGmacPromiscuousChange(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* port whose promiscuous mode changes */ SK_U32 PortNumber, /* port whose promiscuous mode changes */

View File

@ -57,34 +57,6 @@ static struct s_Config OemConfig = {
#endif #endif
}; };
/******************************************************************************
*
* SkGePollRxD() - Enable / Disable Descriptor Polling of RxD Ring
*
* Description:
* Enable or disable the descriptor polling of the receive descriptor
* ring (RxD) for port 'Port'.
* The new configuration is *not* saved over any SkGeStopPort() and
* SkGeInitPort() calls.
*
* Returns:
* nothing
*/
void SkGePollRxD(
SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */
int Port, /* Port Index (MAC_1 + n) */
SK_BOOL PollRxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */
{
SK_GEPORT *pPrt;
pPrt = &pAC->GIni.GP[Port];
SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), (PollRxD) ?
CSR_ENA_POL : CSR_DIS_POL);
} /* SkGePollRxD */
/****************************************************************************** /******************************************************************************
* *
* SkGePollTxD() - Enable / Disable Descriptor Polling of TxD Rings * SkGePollTxD() - Enable / Disable Descriptor Polling of TxD Rings
@ -952,7 +924,7 @@ int Port) /* Port Index (MAC_1 + n) */
* Returns: * Returns:
* nothing * nothing
*/ */
void SkGeInitRamIface( static void SkGeInitRamIface(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC) /* IO context */ SK_IOC IoC) /* IO context */
{ {
@ -1409,83 +1381,6 @@ SK_IOC IoC) /* IO context */
} /* SkGeInit0*/ } /* SkGeInit0*/
#ifdef SK_PCI_RESET
/******************************************************************************
*
* SkGePciReset() - Reset PCI interface
*
* Description:
* o Read PCI configuration.
* o Change power state to 3.
* o Change power state to 0.
* o Restore PCI configuration.
*
* Returns:
* 0: Success.
* 1: Power state could not be changed to 3.
*/
static int SkGePciReset(
SK_AC *pAC, /* adapter context */
SK_IOC IoC) /* IO context */
{
int i;
SK_U16 PmCtlSts;
SK_U32 Bp1;
SK_U32 Bp2;
SK_U16 PciCmd;
SK_U8 Cls;
SK_U8 Lat;
SK_U8 ConfigSpace[PCI_CFG_SIZE];
/*
* Note: Switching to D3 state is like a software reset.
* Switching from D3 to D0 is a hardware reset.
* We have to save and restore the configuration space.
*/
for (i = 0; i < PCI_CFG_SIZE; i++) {
SkPciReadCfgDWord(pAC, i*4, &ConfigSpace[i]);
}
/* We know the RAM Interface Arbiter is enabled. */
SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D3);
SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D3) {
return(1);
}
/* Return to D0 state. */
SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D0);
/* Check for D0 state. */
SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D0) {
return(1);
}
/* Check PCI Config Registers. */
SkPciReadCfgWord(pAC, PCI_COMMAND, &PciCmd);
SkPciReadCfgByte(pAC, PCI_CACHE_LSZ, &Cls);
SkPciReadCfgDWord(pAC, PCI_BASE_1ST, &Bp1);
SkPciReadCfgDWord(pAC, PCI_BASE_2ND, &Bp2);
SkPciReadCfgByte(pAC, PCI_LAT_TIM, &Lat);
if (PciCmd != 0 || Cls != (SK_U8)0 || Lat != (SK_U8)0 ||
(Bp1 & 0xfffffff0L) != 0 || Bp2 != 1) {
return(1);
}
/* Restore PCI Config Space. */
for (i = 0; i < PCI_CFG_SIZE; i++) {
SkPciWriteCfgDWord(pAC, i*4, ConfigSpace[i]);
}
return(0);
} /* SkGePciReset */
#endif /* SK_PCI_RESET */
/****************************************************************************** /******************************************************************************
* *
@ -1524,10 +1419,6 @@ SK_IOC IoC) /* IO context */
/* save CLK_RUN bits (YUKON-Lite) */ /* save CLK_RUN bits (YUKON-Lite) */
SK_IN16(IoC, B0_CTST, &CtrlStat); SK_IN16(IoC, B0_CTST, &CtrlStat);
#ifdef SK_PCI_RESET
(void)SkGePciReset(pAC, IoC);
#endif /* SK_PCI_RESET */
/* do the SW-reset */ /* do the SW-reset */
SK_OUT8(IoC, B0_CTST, CS_RST_SET); SK_OUT8(IoC, B0_CTST, CS_RST_SET);
@ -1991,11 +1882,6 @@ SK_IOC IoC) /* IO context */
int i; int i;
SK_U16 Word; SK_U16 Word;
#ifdef SK_PHY_LP_MODE
SK_U8 Byte;
SK_U16 PmCtlSts;
#endif /* SK_PHY_LP_MODE */
#if (!defined(SK_SLIM) && !defined(VCPU)) #if (!defined(SK_SLIM) && !defined(VCPU))
/* ensure I2C is ready */ /* ensure I2C is ready */
SkI2cWaitIrq(pAC, IoC); SkI2cWaitIrq(pAC, IoC);
@ -2010,38 +1896,6 @@ SK_IOC IoC) /* IO context */
} }
} }
#ifdef SK_PHY_LP_MODE
/*
* for power saving purposes within mobile environments
* we set the PHY to coma mode and switch to D3 power state.
*/
if (pAC->GIni.GIYukonLite &&
pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
/* for all ports switch PHY to coma mode */
for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP);
}
if (pAC->GIni.GIVauxAvail) {
/* switch power to VAUX */
Byte = PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF;
SK_OUT8(IoC, B0_POWER_CTRL, Byte);
}
/* switch to D3 state */
SK_IN16(IoC, PCI_C(PCI_PM_CTL_STS), &PmCtlSts);
PmCtlSts |= PCI_PM_STATE_D3;
SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
SK_OUT16(IoC, PCI_C(PCI_PM_CTL_STS), PmCtlSts);
}
#endif /* SK_PHY_LP_MODE */
/* Reset all bits in the PCI STATUS register */ /* Reset all bits in the PCI STATUS register */
/* /*
* Note: PCI Cfg cycles cannot be used, because they are not * Note: PCI Cfg cycles cannot be used, because they are not

View File

@ -871,13 +871,6 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTable[] = {
sizeof(SK_PNMI_CONF), sizeof(SK_PNMI_CONF),
SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType), SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType),
SK_PNMI_RO, MacPrivateConf, 0}, SK_PNMI_RO, MacPrivateConf, 0},
#ifdef SK_PHY_LP_MODE
{OID_SKGE_PHY_LP_MODE,
SK_PNMI_MAC_ENTRIES,
sizeof(SK_PNMI_CONF),
SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyMode),
SK_PNMI_RW, MacPrivateConf, 0},
#endif
{OID_SKGE_LINK_CAP, {OID_SKGE_LINK_CAP,
SK_PNMI_MAC_ENTRIES, SK_PNMI_MAC_ENTRIES,
sizeof(SK_PNMI_CONF), sizeof(SK_PNMI_CONF),

View File

@ -56,10 +56,6 @@ static const char SysKonnectFileId[] =
* Public Function prototypes * Public Function prototypes
*/ */
int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int level); int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int level);
int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf, int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf,
@ -587,7 +583,7 @@ int Level) /* Initialization level */
* exist (e.g. port instance 3 on a two port * exist (e.g. port instance 3 on a two port
* adapter. * adapter.
*/ */
int SkPnmiGetVar( static int SkPnmiGetVar(
SK_AC *pAC, /* Pointer to adapter context */ SK_AC *pAC, /* Pointer to adapter context */
SK_IOC IoC, /* IO context handle */ SK_IOC IoC, /* IO context handle */
SK_U32 Id, /* Object ID that is to be processed */ SK_U32 Id, /* Object ID that is to be processed */
@ -629,7 +625,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
* exist (e.g. port instance 3 on a two port * exist (e.g. port instance 3 on a two port
* adapter. * adapter.
*/ */
int SkPnmiPreSetVar( static int SkPnmiPreSetVar(
SK_AC *pAC, /* Pointer to adapter context */ SK_AC *pAC, /* Pointer to adapter context */
SK_IOC IoC, /* IO context handle */ SK_IOC IoC, /* IO context handle */
SK_U32 Id, /* Object ID that is to be processed */ SK_U32 Id, /* Object ID that is to be processed */
@ -5062,9 +5058,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
case OID_SKGE_SPEED_CAP: case OID_SKGE_SPEED_CAP:
case OID_SKGE_SPEED_MODE: case OID_SKGE_SPEED_MODE:
case OID_SKGE_SPEED_STATUS: case OID_SKGE_SPEED_STATUS:
#ifdef SK_PHY_LP_MODE
case OID_SKGE_PHY_LP_MODE:
#endif
if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U8)) { if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U8)) {
*pLen = (Limit - LogPortIndex) * sizeof(SK_U8); *pLen = (Limit - LogPortIndex) * sizeof(SK_U8);
@ -5140,28 +5133,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
Offset += sizeof(SK_U32); Offset += sizeof(SK_U32);
break; break;
#ifdef SK_PHY_LP_MODE
case OID_SKGE_PHY_LP_MODE:
if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
if (LogPortIndex == 0) {
continue;
}
else {
/* Get value for physical ports */
PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState;
*pBufPtr = Val8;
}
}
else { /* DualNetMode */
Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState;
*pBufPtr = Val8;
}
Offset += sizeof(SK_U8);
break;
#endif
case OID_SKGE_LINK_CAP: case OID_SKGE_LINK_CAP:
if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
if (LogPortIndex == 0) { if (LogPortIndex == 0) {
@ -5478,16 +5449,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
} }
break; break;
#ifdef SK_PHY_LP_MODE
case OID_SKGE_PHY_LP_MODE:
if (*pLen < Limit - LogPortIndex) {
*pLen = Limit - LogPortIndex;
return (SK_PNMI_ERR_TOO_SHORT);
}
break;
#endif
case OID_SKGE_MTU: case OID_SKGE_MTU:
if (*pLen < sizeof(SK_U32)) { if (*pLen < sizeof(SK_U32)) {
@ -5845,116 +5806,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
Offset += sizeof(SK_U32); Offset += sizeof(SK_U32);
break; break;
#ifdef SK_PHY_LP_MODE
case OID_SKGE_PHY_LP_MODE:
/* The preset ends here */
if (Action == SK_PNMI_PRESET) {
return (SK_PNMI_ERR_OK);
}
if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
if (LogPortIndex == 0) {
Offset = 0;
continue;
}
else {
/* Set value for physical ports */
PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
switch (*(pBuf + Offset)) {
case 0:
/* If LowPowerMode is active, we can leave it. */
if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex);
if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) {
SkDrvInitAdapter(pAC);
}
break;
}
else {
*pLen = 0;
return (SK_PNMI_ERR_GENERAL);
}
case 1:
case 2:
case 3:
case 4:
/* If no LowPowerMode is active, we can enter it. */
if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
if ((*(pBuf + Offset)) < 3) {
SkDrvDeInitAdapter(pAC);
}
Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf);
break;
}
else {
*pLen = 0;
return (SK_PNMI_ERR_GENERAL);
}
default:
*pLen = 0;
return (SK_PNMI_ERR_BAD_VALUE);
}
}
}
else { /* DualNetMode */
switch (*(pBuf + Offset)) {
case 0:
/* If we are in a LowPowerMode, we can leave it. */
if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex);
if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) {
SkDrvInitAdapter(pAC);
}
break;
}
else {
*pLen = 0;
return (SK_PNMI_ERR_GENERAL);
}
case 1:
case 2:
case 3:
case 4:
/* If we are not already in LowPowerMode, we can enter it. */
if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
if ((*(pBuf + Offset)) < 3) {
SkDrvDeInitAdapter(pAC);
}
else {
Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf);
}
break;
}
else {
*pLen = 0;
return (SK_PNMI_ERR_GENERAL);
}
default:
*pLen = 0;
return (SK_PNMI_ERR_BAD_VALUE);
}
}
Offset += sizeof(SK_U8);
break;
#endif
default: default:
SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR, SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,
("MacPrivateConf: Unknown OID should be handled before set")); ("MacPrivateConf: Unknown OID should be handled before set"));

View File

@ -265,7 +265,7 @@ int Port) /* Port Index (MAC_1 + n) */
* *
* Returns: N/A * Returns: N/A
*/ */
void SkHWLinkUp( static void SkHWLinkUp(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */ SK_IOC IoC, /* IO context */
int Port) /* Port Index (MAC_1 + n) */ int Port) /* Port Index (MAC_1 + n) */
@ -612,14 +612,6 @@ SK_U32 Istatus) /* Interrupt status word */
* we ignore those * we ignore those
*/ */
pPrt->HalfDupTimerActive = SK_TRUE; pPrt->HalfDupTimerActive = SK_TRUE;
#ifdef XXX
Len = sizeof(SK_U64);
SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets,
&Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 0),
pAC->Rlmt.Port[0].Net->NetNumber);
pPrt->LastOctets = Octets;
#endif /* XXX */
/* Snap statistic counters */ /* Snap statistic counters */
(void)SkXmUpdateStats(pAC, IoC, 0); (void)SkXmUpdateStats(pAC, IoC, 0);
@ -653,14 +645,6 @@ SK_U32 Istatus) /* Interrupt status word */
pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) && pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) &&
!pPrt->HalfDupTimerActive) { !pPrt->HalfDupTimerActive) {
pPrt->HalfDupTimerActive = SK_TRUE; pPrt->HalfDupTimerActive = SK_TRUE;
#ifdef XXX
Len = sizeof(SK_U64);
SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets,
&Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 1),
pAC->Rlmt.Port[1].Net->NetNumber);
pPrt->LastOctets = Octets;
#endif /* XXX */
/* Snap statistic counters */ /* Snap statistic counters */
(void)SkXmUpdateStats(pAC, IoC, 1); (void)SkXmUpdateStats(pAC, IoC, 1);
@ -2085,12 +2069,6 @@ SK_EVPARA Para) /* Event specific Parameter */
pPrt->HalfDupTimerActive = SK_FALSE; pPrt->HalfDupTimerActive = SK_FALSE;
if (pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || if (pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF ||
pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) { pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) {
#ifdef XXX
Len = sizeof(SK_U64);
SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets,
&Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, Port),
pAC->Rlmt.Port[Port].Net->NetNumber);
#endif /* XXX */
/* Snap statistic counters */ /* Snap statistic counters */
(void)SkXmUpdateStats(pAC, IoC, Port); (void)SkXmUpdateStats(pAC, IoC, Port);

View File

@ -396,7 +396,7 @@ int Rw) /* Read / Write Flag */
* 1: error, transfer does not complete, I2C transfer * 1: error, transfer does not complete, I2C transfer
* killed, wait loop terminated. * killed, wait loop terminated.
*/ */
int SkI2cWait( static int SkI2cWait(
SK_AC *pAC, /* Adapter Context */ SK_AC *pAC, /* Adapter Context */
SK_IOC IoC, /* I/O Context */ SK_IOC IoC, /* I/O Context */
int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */ int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */
@ -481,7 +481,7 @@ SK_IOC IoC) /* I/O Context */
* returns 0: success * returns 0: success
* 1: error * 1: error
*/ */
int SkI2cWrite( static int SkI2cWrite(
SK_AC *pAC, /* Adapter Context */ SK_AC *pAC, /* Adapter Context */
SK_IOC IoC, /* I/O Context */ SK_IOC IoC, /* I/O Context */
SK_U32 I2cData, /* I2C Data to write */ SK_U32 I2cData, /* I2C Data to write */
@ -538,7 +538,7 @@ int I2cBurst) /* I2C Burst Flag */
* 1 if the read is completed * 1 if the read is completed
* 0 if the read must be continued (I2C Bus still allocated) * 0 if the read must be continued (I2C Bus still allocated)
*/ */
int SkI2cReadSensor( static int SkI2cReadSensor(
SK_AC *pAC, /* Adapter Context */ SK_AC *pAC, /* Adapter Context */
SK_IOC IoC, /* I/O Context */ SK_IOC IoC, /* I/O Context */
SK_SENSOR *pSen) /* Sensor to be read */ SK_SENSOR *pSen) /* Sensor to be read */

View File

@ -34,79 +34,7 @@ static const char SysKonnectFileId[] =
#include "h/lm80.h" #include "h/lm80.h"
#include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */ #include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */
#ifdef SK_DIAG
#define BREAK_OR_WAIT(pAC,IoC,Event) SkI2cWait(pAC,IoC,Event)
#else /* nSK_DIAG */
#define BREAK_OR_WAIT(pAC,IoC,Event) break #define BREAK_OR_WAIT(pAC,IoC,Event) break
#endif /* nSK_DIAG */
#ifdef SK_DIAG
/*
* read the register 'Reg' from the device 'Dev'
*
* return read error -1
* success the read value
*/
int SkLm80RcvReg(
SK_IOC IoC, /* Adapter Context */
int Dev, /* I2C device address */
int Reg) /* register to read */
{
int Val = 0;
int TempExt;
/* Signal device number */
if (SkI2cSndDev(IoC, Dev, I2C_WRITE)) {
return(-1);
}
if (SkI2cSndByte(IoC, Reg)) {
return(-1);
}
/* repeat start */
if (SkI2cSndDev(IoC, Dev, I2C_READ)) {
return(-1);
}
switch (Reg) {
case LM80_TEMP_IN:
Val = (int)SkI2cRcvByte(IoC, 1);
/* First: correct the value: it might be negative */
if ((Val & 0x80) != 0) {
/* Value is negative */
Val = Val - 256;
}
Val = Val * SK_LM80_TEMP_LSB;
SkI2cStop(IoC);
TempExt = (int)SkLm80RcvReg(IoC, LM80_ADDR, LM80_TEMP_CTRL);
if (Val > 0) {
Val += ((TempExt >> 7) * SK_LM80_TEMPEXT_LSB);
}
else {
Val -= ((TempExt >> 7) * SK_LM80_TEMPEXT_LSB);
}
return(Val);
break;
case LM80_VT0_IN:
case LM80_VT1_IN:
case LM80_VT2_IN:
case LM80_VT3_IN:
Val = (int)SkI2cRcvByte(IoC, 1) * SK_LM80_VT_LSB;
break;
default:
Val = (int)SkI2cRcvByte(IoC, 1);
break;
}
SkI2cStop(IoC);
return(Val);
}
#endif /* SK_DIAG */
/* /*
* read a sensors value (LM80 specific) * read a sensors value (LM80 specific)

View File

@ -282,7 +282,6 @@ typedef struct s_SpTreeRlmtPacket {
SK_MAC_ADDR SkRlmtMcAddr = {{0x01, 0x00, 0x5A, 0x52, 0x4C, 0x4D}}; SK_MAC_ADDR SkRlmtMcAddr = {{0x01, 0x00, 0x5A, 0x52, 0x4C, 0x4D}};
SK_MAC_ADDR BridgeMcAddr = {{0x01, 0x80, 0xC2, 0x00, 0x00, 0x00}}; SK_MAC_ADDR BridgeMcAddr = {{0x01, 0x80, 0xC2, 0x00, 0x00, 0x00}};
SK_MAC_ADDR BcAddr = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}};
/* local variables ************************************************************/ /* local variables ************************************************************/

View File

@ -132,65 +132,6 @@ int addr) /* VPD address */
#endif /* SKDIAG */ #endif /* SKDIAG */
#if 0
/*
Write the dword 'data' at address 'addr' into the VPD EEPROM, and
verify that the data is written.
Needed Time:
. MIN MAX
. -------------------------------------------------------------------
. write 1.8 ms 3.6 ms
. internal write cyles 0.7 ms 7.0 ms
. -------------------------------------------------------------------
. over all program time 2.5 ms 10.6 ms
. read 1.3 ms 2.6 ms
. -------------------------------------------------------------------
. over all 3.8 ms 13.2 ms
.
Returns 0: success
1: error, I2C transfer does not terminate
2: error, data verify error
*/
static int VpdWriteDWord(
SK_AC *pAC, /* pAC pointer */
SK_IOC IoC, /* IO Context */
int addr, /* VPD address */
SK_U32 data) /* VPD data to write */
{
/* start VPD write */
/* Don't swap here, it's a data stream of bytes */
SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL,
("VPD write dword at addr 0x%x, data = 0x%x\n",addr,data));
VPD_OUT32(pAC, IoC, PCI_VPD_DAT_REG, (SK_U32)data);
/* But do it here */
addr |= VPD_WRITE;
VPD_OUT16(pAC, IoC, PCI_VPD_ADR_REG, (SK_U16)(addr | VPD_WRITE));
/* this may take up to 10,6 ms */
if (VpdWait(pAC, IoC, VPD_WRITE)) {
SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
("Write Timed Out\n"));
return(1);
};
/* verify data */
if (VpdReadDWord(pAC, IoC, addr) != data) {
SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
("Data Verify Error\n"));
return(2);
}
return(0);
} /* VpdWriteDWord */
#endif /* 0 */
/* /*
* Read one Stream of 'len' bytes of VPD data, starting at 'addr' from * Read one Stream of 'len' bytes of VPD data, starting at 'addr' from
* or to the I2C EEPROM. * or to the I2C EEPROM.
@ -728,7 +669,7 @@ char *etp) /* end pointer input position */
* 6: fatal VPD error * 6: fatal VPD error
* *
*/ */
int VpdSetupPara( static int VpdSetupPara(
SK_AC *pAC, /* common data base */ SK_AC *pAC, /* common data base */
const char *key, /* keyword to insert */ const char *key, /* keyword to insert */
const char *buf, /* buffer with the keyword value */ const char *buf, /* buffer with the keyword value */
@ -1148,50 +1089,3 @@ SK_IOC IoC) /* IO Context */
return(0); return(0);
} }
/*
* Read the contents of the VPD EEPROM and copy it to the VPD buffer
* if not already done. If the keyword "VF" is not present it will be
* created and the error log message will be stored to this keyword.
* If "VF" is not present the error log message will be stored to the
* keyword "VL". "VL" will created or overwritten if "VF" is present.
* The VPD read/write area is saved to the VPD EEPROM.
*
* returns nothing, errors will be ignored.
*/
void VpdErrLog(
SK_AC *pAC, /* common data base */
SK_IOC IoC, /* IO Context */
char *msg) /* error log message */
{
SK_VPD_PARA *v, vf; /* VF */
int len;
SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX,
("VPD error log msg %s\n", msg));
if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) {
if (VpdInit(pAC, IoC) != 0) {
SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
("VPD init error\n"));
return;
}
}
len = strlen(msg);
if (len > VPD_MAX_LEN) {
/* cut it */
len = VPD_MAX_LEN;
}
if ((v = vpd_find_para(pAC, VPD_VF, &vf)) != NULL) {
SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, ("overwrite VL\n"));
(void)VpdSetupPara(pAC, VPD_VL, msg, len, VPD_RW_KEY, OWR_KEY);
}
else {
SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, ("write VF\n"));
(void)VpdSetupPara(pAC, VPD_VF, msg, len, VPD_RW_KEY, ADD_KEY);
}
(void)VpdUpdate(pAC, IoC);
}

View File

@ -41,13 +41,13 @@ static const char SysKonnectFileId[] =
#endif #endif
#ifdef GENESIS #ifdef GENESIS
BCOM_HACK BcomRegA1Hack[] = { static BCOM_HACK BcomRegA1Hack[] = {
{ 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1104 }, { 0x17, 0x0013 }, { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1104 }, { 0x17, 0x0013 },
{ 0x15, 0x0404 }, { 0x17, 0x8006 }, { 0x15, 0x0132 }, { 0x17, 0x8006 }, { 0x15, 0x0404 }, { 0x17, 0x8006 }, { 0x15, 0x0132 }, { 0x17, 0x8006 },
{ 0x15, 0x0232 }, { 0x17, 0x800D }, { 0x15, 0x000F }, { 0x18, 0x0420 }, { 0x15, 0x0232 }, { 0x17, 0x800D }, { 0x15, 0x000F }, { 0x18, 0x0420 },
{ 0, 0 } { 0, 0 }
}; };
BCOM_HACK BcomRegC0Hack[] = { static BCOM_HACK BcomRegC0Hack[] = {
{ 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1204 }, { 0x17, 0x0013 }, { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1204 }, { 0x17, 0x0013 },
{ 0x15, 0x0A04 }, { 0x18, 0x0420 }, { 0x15, 0x0A04 }, { 0x18, 0x0420 },
{ 0, 0 } { 0, 0 }
@ -790,7 +790,7 @@ int Port) /* Port Index (MAC_1 + n) */
* Returns: * Returns:
* nothing * nothing
*/ */
void SkMacFlushRxFifo( static void SkMacFlushRxFifo(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */ SK_IOC IoC, /* IO context */
int Port) /* Port Index (MAC_1 + n) */ int Port) /* Port Index (MAC_1 + n) */
@ -1231,38 +1231,6 @@ int Port) /* Port Index (MAC_1 + n) */
} /* SkMacHardRst */ } /* SkMacHardRst */
/******************************************************************************
*
* SkMacClearRst() - Clear the MAC reset
*
* Description: calls a clear MAC reset routine dep. on board type
*
* Returns:
* nothing
*/
void SkMacClearRst(
SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */
int Port) /* Port Index (MAC_1 + n) */
{
#ifdef GENESIS
if (pAC->GIni.GIGenesis) {
SkXmClearRst(pAC, IoC, Port);
}
#endif /* GENESIS */
#ifdef YUKON
if (pAC->GIni.GIYukon) {
SkGmClearRst(pAC, IoC, Port);
}
#endif /* YUKON */
} /* SkMacClearRst */
#ifdef GENESIS #ifdef GENESIS
/****************************************************************************** /******************************************************************************
* *
@ -1713,7 +1681,7 @@ int Port) /* Port Index (MAC_1 + n) */
* Returns: * Returns:
* nothing * nothing
*/ */
void SkXmInitDupMd( static void SkXmInitDupMd(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */ SK_IOC IoC, /* IO context */
int Port) /* Port Index (MAC_1 + n) */ int Port) /* Port Index (MAC_1 + n) */
@ -1761,7 +1729,7 @@ int Port) /* Port Index (MAC_1 + n) */
* Returns: * Returns:
* nothing * nothing
*/ */
void SkXmInitPauseMd( static void SkXmInitPauseMd(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */ SK_IOC IoC, /* IO context */
int Port) /* Port Index (MAC_1 + n) */ int Port) /* Port Index (MAC_1 + n) */
@ -2076,283 +2044,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */
} /* SkXmInitPhyBcom */ } /* SkXmInitPhyBcom */
#endif /* GENESIS */ #endif /* GENESIS */
#ifdef YUKON #ifdef YUKON
#ifndef SK_SLIM
/******************************************************************************
*
* SkGmEnterLowPowerMode()
*
* Description:
* This function sets the Marvell Alaska PHY to the low power mode
* given by parameter mode.
* The following low power modes are available:
*
* - Coma Mode (Deep Sleep):
* Power consumption: ~15 - 30 mW
* The PHY cannot wake up on its own.
*
* - IEEE 22.2.4.1.5 compatible power down mode
* Power consumption: ~240 mW
* The PHY cannot wake up on its own.
*
* - energy detect mode
* Power consumption: ~160 mW
* The PHY can wake up on its own by detecting activity
* on the CAT 5 cable.
*
* - energy detect plus mode
* Power consumption: ~150 mW
* The PHY can wake up on its own by detecting activity
* on the CAT 5 cable.
* Connected devices can be woken up by sending normal link
* pulses every one second.
*
* Note:
*
* Returns:
* 0: ok
* 1: error
*/
int SkGmEnterLowPowerMode(
SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */
int Port, /* Port Index (e.g. MAC_1) */
SK_U8 Mode) /* low power mode */
{
SK_U16 Word;
SK_U32 DWord;
SK_U8 LastMode;
int Ret = 0;
if (pAC->GIni.GIYukonLite &&
pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
/* save current power mode */
LastMode = pAC->GIni.GP[Port].PPhyPowerState;
pAC->GIni.GP[Port].PPhyPowerState = Mode;
switch (Mode) {
/* coma mode (deep sleep) */
case PHY_PM_DEEP_SLEEP:
/* setup General Purpose Control Register */
GM_OUT16(IoC, 0, GM_GP_CTRL, GM_GPCR_FL_PASS |
GM_GPCR_SPEED_100 | GM_GPCR_AU_ALL_DIS);
/* apply COMA mode workaround */
SkGmPhyWrite(pAC, IoC, Port, 29, 0x001f);
SkGmPhyWrite(pAC, IoC, Port, 30, 0xfff3);
SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord);
SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
/* Set PHY to Coma Mode */
SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord | PCI_PHY_COMA);
SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
break;
/* IEEE 22.2.4.1.5 compatible power down mode */
case PHY_PM_IEEE_POWER_DOWN:
/*
* - disable MAC 125 MHz clock
* - allow MAC power down
*/
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
Word |= PHY_M_PC_DIS_125CLK;
Word &= ~PHY_M_PC_MAC_POW_UP;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
/*
* register changes must be followed by a software
* reset to take effect
*/
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
Word |= PHY_CT_RESET;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
/* switch IEEE compatible power down mode on */
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
Word |= PHY_CT_PDOWN;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
break;
/* energy detect and energy detect plus mode */
case PHY_PM_ENERGY_DETECT:
case PHY_PM_ENERGY_DETECT_PLUS:
/*
* - disable MAC 125 MHz clock
*/
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
Word |= PHY_M_PC_DIS_125CLK;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
/* activate energy detect mode 1 */
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
/* energy detect mode */
if (Mode == PHY_PM_ENERGY_DETECT) {
Word |= PHY_M_PC_EN_DET;
}
/* energy detect plus mode */
else {
Word |= PHY_M_PC_EN_DET_PLUS;
}
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
/*
* reinitialize the PHY to force a software reset
* which is necessary after the register settings
* for the energy detect modes.
* Furthermore reinitialisation prevents that the
* PHY is running out of a stable state.
*/
SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE);
break;
/* don't change current power mode */
default:
pAC->GIni.GP[Port].PPhyPowerState = LastMode;
Ret = 1;
break;
}
}
/* low power modes are not supported by this chip */
else {
Ret = 1;
}
return(Ret);
} /* SkGmEnterLowPowerMode */
/******************************************************************************
*
* SkGmLeaveLowPowerMode()
*
* Description:
* Leave the current low power mode and switch to normal mode
*
* Note:
*
* Returns:
* 0: ok
* 1: error
*/
int SkGmLeaveLowPowerMode(
SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */
int Port) /* Port Index (e.g. MAC_1) */
{
SK_U32 DWord;
SK_U16 Word;
SK_U8 LastMode;
int Ret = 0;
if (pAC->GIni.GIYukonLite &&
pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
/* save current power mode */
LastMode = pAC->GIni.GP[Port].PPhyPowerState;
pAC->GIni.GP[Port].PPhyPowerState = PHY_PM_OPERATIONAL_MODE;
switch (LastMode) {
/* coma mode (deep sleep) */
case PHY_PM_DEEP_SLEEP:
SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord);
SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
/* Release PHY from Coma Mode */
SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord & ~PCI_PHY_COMA);
SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
SK_IN32(IoC, B2_GP_IO, &DWord);
/* set to output */
DWord |= (GP_DIR_9 | GP_IO_9);
/* set PHY reset */
SK_OUT32(IoC, B2_GP_IO, DWord);
DWord &= ~GP_IO_9; /* clear PHY reset (active high) */
/* clear PHY reset */
SK_OUT32(IoC, B2_GP_IO, DWord);
break;
/* IEEE 22.2.4.1.5 compatible power down mode */
case PHY_PM_IEEE_POWER_DOWN:
/*
* - enable MAC 125 MHz clock
* - set MAC power up
*/
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
Word &= ~PHY_M_PC_DIS_125CLK;
Word |= PHY_M_PC_MAC_POW_UP;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
/*
* register changes must be followed by a software
* reset to take effect
*/
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
Word |= PHY_CT_RESET;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
/* switch IEEE compatible power down mode off */
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
Word &= ~PHY_CT_PDOWN;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
break;
/* energy detect and energy detect plus mode */
case PHY_PM_ENERGY_DETECT:
case PHY_PM_ENERGY_DETECT_PLUS:
/*
* - enable MAC 125 MHz clock
*/
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
Word &= ~PHY_M_PC_DIS_125CLK;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
/* disable energy detect mode */
SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
Word &= ~PHY_M_PC_EN_DET_MSK;
SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
/*
* reinitialize the PHY to force a software reset
* which is necessary after the register settings
* for the energy detect modes.
* Furthermore reinitialisation prevents that the
* PHY is running out of a stable state.
*/
SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE);
break;
/* don't change current power mode */
default:
pAC->GIni.GP[Port].PPhyPowerState = LastMode;
Ret = 1;
break;
}
}
/* low power modes are not supported by this chip */
else {
Ret = 1;
}
return(Ret);
} /* SkGmLeaveLowPowerMode */
#endif /* !SK_SLIM */
/****************************************************************************** /******************************************************************************
* *
* SkGmInitPhyMarv() - Initialize the Marvell Phy registers * SkGmInitPhyMarv() - Initialize the Marvell Phy registers
@ -3420,145 +3112,6 @@ int Port) /* Port Index (MAC_1 + n) */
} /* SkMacAutoNegDone */ } /* SkMacAutoNegDone */
#ifdef GENESIS
/******************************************************************************
*
* SkXmSetRxTxEn() - Special Set Rx/Tx Enable and some features in XMAC
*
* Description:
* sets MAC or PHY LoopBack and Duplex Mode in the MMU Command Reg.
* enables Rx/Tx
*
* Returns: N/A
*/
static void SkXmSetRxTxEn(
SK_AC *pAC, /* Adapter Context */
SK_IOC IoC, /* IO context */
int Port, /* Port Index (MAC_1 + n) */
int Para) /* Parameter to set: MAC or PHY LoopBack, Duplex Mode */
{
SK_U16 Word;
XM_IN16(IoC, Port, XM_MMU_CMD, &Word);
switch (Para & (SK_MAC_LOOPB_ON | SK_MAC_LOOPB_OFF)) {
case SK_MAC_LOOPB_ON:
Word |= XM_MMU_MAC_LB;
break;
case SK_MAC_LOOPB_OFF:
Word &= ~XM_MMU_MAC_LB;
break;
}
switch (Para & (SK_PHY_LOOPB_ON | SK_PHY_LOOPB_OFF)) {
case SK_PHY_LOOPB_ON:
Word |= XM_MMU_GMII_LOOP;
break;
case SK_PHY_LOOPB_OFF:
Word &= ~XM_MMU_GMII_LOOP;
break;
}
switch (Para & (SK_PHY_FULLD_ON | SK_PHY_FULLD_OFF)) {
case SK_PHY_FULLD_ON:
Word |= XM_MMU_GMII_FD;
break;
case SK_PHY_FULLD_OFF:
Word &= ~XM_MMU_GMII_FD;
break;
}
XM_OUT16(IoC, Port, XM_MMU_CMD, Word | XM_MMU_ENA_RX | XM_MMU_ENA_TX);
/* dummy read to ensure writing */
XM_IN16(IoC, Port, XM_MMU_CMD, &Word);
} /* SkXmSetRxTxEn */
#endif /* GENESIS */
#ifdef YUKON
/******************************************************************************
*
* SkGmSetRxTxEn() - Special Set Rx/Tx Enable and some features in GMAC
*
* Description:
* sets MAC LoopBack and Duplex Mode in the General Purpose Control Reg.
* enables Rx/Tx
*
* Returns: N/A
*/
static void SkGmSetRxTxEn(
SK_AC *pAC, /* Adapter Context */
SK_IOC IoC, /* IO context */
int Port, /* Port Index (MAC_1 + n) */
int Para) /* Parameter to set: MAC LoopBack, Duplex Mode */
{
SK_U16 Ctrl;
GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl);
switch (Para & (SK_MAC_LOOPB_ON | SK_MAC_LOOPB_OFF)) {
case SK_MAC_LOOPB_ON:
Ctrl |= GM_GPCR_LOOP_ENA;
break;
case SK_MAC_LOOPB_OFF:
Ctrl &= ~GM_GPCR_LOOP_ENA;
break;
}
switch (Para & (SK_PHY_FULLD_ON | SK_PHY_FULLD_OFF)) {
case SK_PHY_FULLD_ON:
Ctrl |= GM_GPCR_DUP_FULL;
break;
case SK_PHY_FULLD_OFF:
Ctrl &= ~GM_GPCR_DUP_FULL;
break;
}
GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Ctrl | GM_GPCR_RX_ENA |
GM_GPCR_TX_ENA));
/* dummy read to ensure writing */
GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl);
} /* SkGmSetRxTxEn */
#endif /* YUKON */
#ifndef SK_SLIM
/******************************************************************************
*
* SkMacSetRxTxEn() - Special Set Rx/Tx Enable and parameters
*
* Description: calls the Special Set Rx/Tx Enable routines dep. on board type
*
* Returns: N/A
*/
void SkMacSetRxTxEn(
SK_AC *pAC, /* Adapter Context */
SK_IOC IoC, /* IO context */
int Port, /* Port Index (MAC_1 + n) */
int Para)
{
#ifdef GENESIS
if (pAC->GIni.GIGenesis) {
SkXmSetRxTxEn(pAC, IoC, Port, Para);
}
#endif /* GENESIS */
#ifdef YUKON
if (pAC->GIni.GIYukon) {
SkGmSetRxTxEn(pAC, IoC, Port, Para);
}
#endif /* YUKON */
} /* SkMacSetRxTxEn */
#endif /* !SK_SLIM */
/****************************************************************************** /******************************************************************************
* *
* SkMacRxTxEnable() - Enable Rx/Tx activity if port is up * SkMacRxTxEnable() - Enable Rx/Tx activity if port is up
@ -3976,7 +3529,7 @@ SK_U16 PhyStat) /* PHY Status word to analyse */
* Returns: * Returns:
* nothing * nothing
*/ */
void SkXmIrq( static void SkXmIrq(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */ SK_IOC IoC, /* IO context */
int Port) /* Port Index (MAC_1 + n) */ int Port) /* Port Index (MAC_1 + n) */
@ -4112,7 +3665,7 @@ int Port) /* Port Index (MAC_1 + n) */
* Returns: * Returns:
* nothing * nothing
*/ */
void SkGmIrq( static void SkGmIrq(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */ SK_IOC IoC, /* IO context */
int Port) /* Port Index (MAC_1 + n) */ int Port) /* Port Index (MAC_1 + n) */

View File

@ -2084,6 +2084,38 @@ static int netdev_close(struct net_device *dev)
return 0; return 0;
} }
#ifdef CONFIG_PM
static int starfire_suspend(struct pci_dev *pdev, pm_message_t state)
{
struct net_device *dev = pci_get_drvdata(pdev);
if (netif_running(dev)) {
netif_device_detach(dev);
netdev_close(dev);
}
pci_save_state(pdev);
pci_set_power_state(pdev, pci_choose_state(pdev,state));
return 0;
}
static int starfire_resume(struct pci_dev *pdev)
{
struct net_device *dev = pci_get_drvdata(pdev);
pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
if (netif_running(dev)) {
netdev_open(dev);
netif_device_attach(dev);
}
return 0;
}
#endif /* CONFIG_PM */
static void __devexit starfire_remove_one (struct pci_dev *pdev) static void __devexit starfire_remove_one (struct pci_dev *pdev)
{ {
@ -2115,6 +2147,10 @@ static struct pci_driver starfire_driver = {
.name = DRV_NAME, .name = DRV_NAME,
.probe = starfire_init_one, .probe = starfire_init_one,
.remove = __devexit_p(starfire_remove_one), .remove = __devexit_p(starfire_remove_one),
#ifdef CONFIG_PM
.suspend = starfire_suspend,
.resume = starfire_resume,
#endif /* CONFIG_PM */
.id_table = starfire_pci_tbl, .id_table = starfire_pci_tbl,
}; };

View File

@ -633,9 +633,13 @@ static int __devinit sundance_probe1 (struct pci_dev *pdev,
np->phys[0] = 1; /* Default setting */ np->phys[0] = 1; /* Default setting */
np->mii_preamble_required++; np->mii_preamble_required++;
/*
* It seems some phys doesn't deal well with address 0 being accessed
* first, so leave address zero to the end of the loop (32 & 31).
*/
for (phy = 1; phy <= 32 && phy_idx < MII_CNT; phy++) { for (phy = 1; phy <= 32 && phy_idx < MII_CNT; phy++) {
int mii_status = mdio_read(dev, phy, MII_BMSR);
int phyx = phy & 0x1f; int phyx = phy & 0x1f;
int mii_status = mdio_read(dev, phyx, MII_BMSR);
if (mii_status != 0xffff && mii_status != 0x0000) { if (mii_status != 0xffff && mii_status != 0x0000) {
np->phys[phy_idx++] = phyx; np->phys[phy_idx++] = phyx;
np->mii_if.advertising = mdio_read(dev, phyx, MII_ADVERTISE); np->mii_if.advertising = mdio_read(dev, phyx, MII_ADVERTISE);

View File

@ -122,6 +122,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <net/checksum.h> #include <net/checksum.h>
@ -512,7 +513,7 @@ static int streamer_reset(struct net_device *dev)
while (!((readw(streamer_mmio + SISR)) & SISR_SRB_REPLY)) { while (!((readw(streamer_mmio + SISR)) & SISR_SRB_REPLY)) {
msleep_interruptible(100); msleep_interruptible(100);
if (jiffies - t > 40 * HZ) { if (time_after(jiffies, t + 40 * HZ)) {
printk(KERN_ERR printk(KERN_ERR
"IBM PCI tokenring card not responding\n"); "IBM PCI tokenring card not responding\n");
release_region(dev->base_addr, STREAMER_IO_SPACE); release_region(dev->base_addr, STREAMER_IO_SPACE);

View File

@ -100,6 +100,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <net/checksum.h> #include <net/checksum.h>
@ -307,7 +308,7 @@ static int __devinit olympic_init(struct net_device *dev)
t=jiffies; t=jiffies;
while((readl(olympic_mmio+BCTL)) & BCTL_SOFTRESET) { while((readl(olympic_mmio+BCTL)) & BCTL_SOFTRESET) {
schedule(); schedule();
if(jiffies-t > 40*HZ) { if(time_after(jiffies, t + 40*HZ)) {
printk(KERN_ERR "IBM PCI tokenring card not responding.\n"); printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
return -ENODEV; return -ENODEV;
} }
@ -359,7 +360,7 @@ static int __devinit olympic_init(struct net_device *dev)
t=jiffies; t=jiffies;
while (!readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE) { while (!readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE) {
schedule() ; schedule() ;
if(jiffies-t > 2*HZ) { if(time_after(jiffies, t + 2*HZ)) {
printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ; printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ;
return -ENODEV; return -ENODEV;
} }
@ -373,7 +374,7 @@ static int __devinit olympic_init(struct net_device *dev)
t=jiffies; t=jiffies;
while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) { while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) {
schedule(); schedule();
if(jiffies-t > 15*HZ) { if(time_after(jiffies, t + 15*HZ)) {
printk(KERN_ERR "IBM PCI tokenring card not responding.\n"); printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
return -ENODEV; return -ENODEV;
} }
@ -519,7 +520,7 @@ static int olympic_open(struct net_device *dev)
olympic_priv->srb_queued=0; olympic_priv->srb_queued=0;
break; break;
} }
if ((jiffies-t) > 10*HZ) { if (time_after(jiffies, t + 10*HZ)) {
printk(KERN_WARNING "%s: SRB timed out. \n",dev->name) ; printk(KERN_WARNING "%s: SRB timed out. \n",dev->name) ;
olympic_priv->srb_queued=0; olympic_priv->srb_queued=0;
break ; break ;

View File

@ -402,8 +402,7 @@ static void de_rx (struct de_private *de)
unsigned copying_skb, buflen; unsigned copying_skb, buflen;
skb = de->rx_skb[rx_tail].skb; skb = de->rx_skb[rx_tail].skb;
if (!skb) BUG_ON(!skb);
BUG();
rmb(); rmb();
status = le32_to_cpu(de->rx_ring[rx_tail].opts1); status = le32_to_cpu(de->rx_ring[rx_tail].opts1);
if (status & DescOwn) if (status & DescOwn)
@ -545,8 +544,7 @@ static void de_tx (struct de_private *de)
break; break;
skb = de->tx_skb[tx_tail].skb; skb = de->tx_skb[tx_tail].skb;
if (!skb) BUG_ON(!skb);
BUG();
if (unlikely(skb == DE_DUMMY_SKB)) if (unlikely(skb == DE_DUMMY_SKB))
goto next; goto next;
@ -789,8 +787,7 @@ static void __de_set_rx_mode (struct net_device *dev)
de->tx_head = NEXT_TX(entry); de->tx_head = NEXT_TX(entry);
if (TX_BUFFS_AVAIL(de) < 0) BUG_ON(TX_BUFFS_AVAIL(de) < 0);
BUG();
if (TX_BUFFS_AVAIL(de) == 0) if (TX_BUFFS_AVAIL(de) == 0)
netif_stop_queue(dev); netif_stop_queue(dev);
@ -916,8 +913,7 @@ static void de_set_media (struct de_private *de)
unsigned media = de->media_type; unsigned media = de->media_type;
u32 macmode = dr32(MacMode); u32 macmode = dr32(MacMode);
if (de_is_running(de)) BUG_ON(de_is_running(de));
BUG();
if (de->de21040) if (de->de21040)
dw32(CSR11, FULL_DUPLEX_MAGIC); dw32(CSR11, FULL_DUPLEX_MAGIC);
@ -1153,8 +1149,7 @@ static void de_media_interrupt (struct de_private *de, u32 status)
return; return;
} }
if (!(status & LinkFail)) BUG_ON(!(status & LinkFail));
BUG();
if (netif_carrier_ok(de->dev)) { if (netif_carrier_ok(de->dev)) {
de_link_down(de); de_link_down(de);
@ -2092,8 +2087,7 @@ static void __exit de_remove_one (struct pci_dev *pdev)
struct net_device *dev = pci_get_drvdata(pdev); struct net_device *dev = pci_get_drvdata(pdev);
struct de_private *de = dev->priv; struct de_private *de = dev->priv;
if (!dev) BUG_ON(!dev);
BUG();
unregister_netdev(dev); unregister_netdev(dev);
kfree(de->ee_data); kfree(de->ee_data);
iounmap(de->regs); iounmap(de->regs);

View File

@ -16,6 +16,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/jiffies.h>
#include "tulip.h" #include "tulip.h"
@ -68,7 +69,7 @@ void pnic_lnk_change(struct net_device *dev, int csr5)
*/ */
if (tulip_media_cap[dev->if_port] & MediaIsMII) if (tulip_media_cap[dev->if_port] & MediaIsMII)
return; return;
if (! tp->nwayset || jiffies - dev->trans_start > 1*HZ) { if (! tp->nwayset || time_after(jiffies, dev->trans_start + 1*HZ)) {
tp->csr6 = 0x00420000 | (tp->csr6 & 0x0000fdff); tp->csr6 = 0x00420000 | (tp->csr6 & 0x0000fdff);
iowrite32(tp->csr6, ioaddr + CSR6); iowrite32(tp->csr6, ioaddr + CSR6);
iowrite32(0x30, ioaddr + CSR12); iowrite32(0x30, ioaddr + CSR12);

View File

@ -1645,7 +1645,7 @@ static int w840_suspend (struct pci_dev *pdev, pm_message_t state)
/* no more hardware accesses behind this line. */ /* no more hardware accesses behind this line. */
if (np->csr6) BUG(); BUG_ON(np->csr6);
if (ioread32(ioaddr + IntrEnable)) BUG(); if (ioread32(ioaddr + IntrEnable)) BUG();
/* pci_power_off(pdev, -1); */ /* pci_power_off(pdev, -1); */

View File

@ -32,6 +32,9 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_NET_POLL_CONTROLLER
#include <asm/irq.h>
#endif
#ifdef DEBUG #ifdef DEBUG
#define enter(x) printk("Enter: %s, %s line %i\n",x,__FILE__,__LINE__) #define enter(x) printk("Enter: %s, %s line %i\n",x,__FILE__,__LINE__)
@ -598,10 +601,8 @@ static void setup_descriptors(struct xircom_private *card)
enter("setup_descriptors"); enter("setup_descriptors");
if (card->rx_buffer == NULL) BUG_ON(card->rx_buffer == NULL);
BUG(); BUG_ON(card->tx_buffer == NULL);
if (card->tx_buffer == NULL)
BUG();
/* Receive descriptors */ /* Receive descriptors */
memset(card->rx_buffer, 0, 128); /* clear the descriptors */ memset(card->rx_buffer, 0, 128); /* clear the descriptors */

View File

@ -29,6 +29,7 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <net/arp.h> #include <net/arp.h>
#include <asm/irq.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>

View File

@ -23,6 +23,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <net/arp.h> #include <net/arp.h>
#include <asm/irq.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>

View File

@ -6,7 +6,8 @@ menu "Wireless LAN (non-hamradio)"
depends on NETDEVICES depends on NETDEVICES
config NET_RADIO config NET_RADIO
bool "Wireless LAN drivers (non-hamradio) & Wireless Extensions" bool "Wireless LAN drivers (non-hamradio)"
select WIRELESS_EXT
---help--- ---help---
Support for wireless LANs and everything having to do with radio, Support for wireless LANs and everything having to do with radio,
but not with amateur radio or FM broadcasting. but not with amateur radio or FM broadcasting.
@ -239,7 +240,8 @@ config IPW2200_DEBUG
config AIRO config AIRO
tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards"
depends on NET_RADIO && ISA_DMA_API && CRYPTO && (PCI || BROKEN) depends on NET_RADIO && ISA_DMA_API && (PCI || BROKEN)
select CRYPTO
---help--- ---help---
This is the standard Linux driver to support Cisco/Aironet ISA and This is the standard Linux driver to support Cisco/Aironet ISA and
PCI 802.11 wireless cards. PCI 802.11 wireless cards.
@ -387,6 +389,7 @@ config PCMCIA_SPECTRUM
config AIRO_CS config AIRO_CS
tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
depends on NET_RADIO && PCMCIA && (BROKEN || !M32R) depends on NET_RADIO && PCMCIA && (BROKEN || !M32R)
select CRYPTO
---help--- ---help---
This is the standard Linux driver to support Cisco/Aironet PCMCIA This is the standard Linux driver to support Cisco/Aironet PCMCIA
802.11 wireless cards. This driver is the same as the Aironet 802.11 wireless cards. This driver is the same as the Aironet

View File

@ -36,6 +36,7 @@
#include <linux/in.h> #include <linux/in.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/crypto.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/system.h> #include <asm/system.h>
@ -87,14 +88,6 @@ static struct pci_driver airo_driver = {
#include <linux/delay.h> #include <linux/delay.h>
#endif #endif
/* Support Cisco MIC feature */
#define MICSUPPORT
#if defined(MICSUPPORT) && !defined(CONFIG_CRYPTO)
#warning MIC support requires Crypto API
#undef MICSUPPORT
#endif
/* Hack to do some power saving */ /* Hack to do some power saving */
#define POWER_ON_DOWN #define POWER_ON_DOWN
@ -1118,7 +1111,6 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp);
static int writerids(struct net_device *dev, aironet_ioctl *comp); static int writerids(struct net_device *dev, aironet_ioctl *comp);
static int flashcard(struct net_device *dev, aironet_ioctl *comp); static int flashcard(struct net_device *dev, aironet_ioctl *comp);
#endif /* CISCO_EXT */ #endif /* CISCO_EXT */
#ifdef MICSUPPORT
static void micinit(struct airo_info *ai); static void micinit(struct airo_info *ai);
static int micsetup(struct airo_info *ai); static int micsetup(struct airo_info *ai);
static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len); static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len);
@ -1127,9 +1119,6 @@ static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket,
static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi); static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi);
static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm); static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm);
#include <linux/crypto.h>
#endif
struct airo_info { struct airo_info {
struct net_device_stats stats; struct net_device_stats stats;
struct net_device *dev; struct net_device *dev;
@ -1190,12 +1179,10 @@ struct airo_info {
unsigned long scan_timestamp; /* Time started to scan */ unsigned long scan_timestamp; /* Time started to scan */
struct iw_spy_data spy_data; struct iw_spy_data spy_data;
struct iw_public_data wireless_data; struct iw_public_data wireless_data;
#ifdef MICSUPPORT
/* MIC stuff */ /* MIC stuff */
struct crypto_tfm *tfm; struct crypto_tfm *tfm;
mic_module mod[2]; mic_module mod[2];
mic_statistics micstats; mic_statistics micstats;
#endif
HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors
HostTxDesc txfids[MPI_MAX_FIDS]; HostTxDesc txfids[MPI_MAX_FIDS];
HostRidDesc config_desc; HostRidDesc config_desc;
@ -1229,7 +1216,6 @@ static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime);
static int flashputbuf(struct airo_info *ai); static int flashputbuf(struct airo_info *ai);
static int flashrestart(struct airo_info *ai,struct net_device *dev); static int flashrestart(struct airo_info *ai,struct net_device *dev);
#ifdef MICSUPPORT
/*********************************************************************** /***********************************************************************
* MIC ROUTINES * * MIC ROUTINES *
*********************************************************************** ***********************************************************************
@ -1686,7 +1672,6 @@ static void emmh32_final(emmh32_context *context, u8 digest[4])
digest[2] = (val>>8) & 0xFF; digest[2] = (val>>8) & 0xFF;
digest[3] = val & 0xFF; digest[3] = val & 0xFF;
} }
#endif
static int readBSSListRid(struct airo_info *ai, int first, static int readBSSListRid(struct airo_info *ai, int first,
BSSListRid *list) { BSSListRid *list) {
@ -2005,7 +1990,6 @@ static int mpi_send_packet (struct net_device *dev)
* Firmware automaticly puts 802 header on so * Firmware automaticly puts 802 header on so
* we don't need to account for it in the length * we don't need to account for it in the length
*/ */
#ifdef MICSUPPORT
if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
(ntohs(((u16 *)buffer)[6]) != 0x888E)) { (ntohs(((u16 *)buffer)[6]) != 0x888E)) {
MICBuffer pMic; MICBuffer pMic;
@ -2022,9 +2006,7 @@ static int mpi_send_packet (struct net_device *dev)
memcpy (sendbuf, &pMic, sizeof(pMic)); memcpy (sendbuf, &pMic, sizeof(pMic));
sendbuf += sizeof(pMic); sendbuf += sizeof(pMic);
memcpy (sendbuf, buffer, len - sizeof(etherHead)); memcpy (sendbuf, buffer, len - sizeof(etherHead));
} else } else {
#endif
{
*payloadLen = cpu_to_le16(len - sizeof(etherHead)); *payloadLen = cpu_to_le16(len - sizeof(etherHead));
dev->trans_start = jiffies; dev->trans_start = jiffies;
@ -2400,9 +2382,7 @@ void stop_airo_card( struct net_device *dev, int freeres )
ai->shared, ai->shared_dma); ai->shared, ai->shared_dma);
} }
} }
#ifdef MICSUPPORT
crypto_free_tfm(ai->tfm); crypto_free_tfm(ai->tfm);
#endif
del_airo_dev( dev ); del_airo_dev( dev );
free_netdev( dev ); free_netdev( dev );
} }
@ -2726,9 +2706,7 @@ static struct net_device *_init_airo_card( unsigned short irq, int port,
ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES); ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES);
if (ai->thr_pid < 0) if (ai->thr_pid < 0)
goto err_out_free; goto err_out_free;
#ifdef MICSUPPORT
ai->tfm = NULL; ai->tfm = NULL;
#endif
rc = add_airo_dev( dev ); rc = add_airo_dev( dev );
if (rc) if (rc)
goto err_out_thr; goto err_out_thr;
@ -2969,10 +2947,8 @@ static int airo_thread(void *data) {
airo_read_wireless_stats(ai); airo_read_wireless_stats(ai);
else if (test_bit(JOB_PROMISC, &ai->flags)) else if (test_bit(JOB_PROMISC, &ai->flags))
airo_set_promisc(ai); airo_set_promisc(ai);
#ifdef MICSUPPORT
else if (test_bit(JOB_MIC, &ai->flags)) else if (test_bit(JOB_MIC, &ai->flags))
micinit(ai); micinit(ai);
#endif
else if (test_bit(JOB_EVENT, &ai->flags)) else if (test_bit(JOB_EVENT, &ai->flags))
airo_send_event(dev); airo_send_event(dev);
else if (test_bit(JOB_AUTOWEP, &ai->flags)) else if (test_bit(JOB_AUTOWEP, &ai->flags))
@ -3010,12 +2986,10 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs)
if ( status & EV_MIC ) { if ( status & EV_MIC ) {
OUT4500( apriv, EVACK, EV_MIC ); OUT4500( apriv, EVACK, EV_MIC );
#ifdef MICSUPPORT
if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) { if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) {
set_bit(JOB_MIC, &apriv->flags); set_bit(JOB_MIC, &apriv->flags);
wake_up_interruptible(&apriv->thr_wait); wake_up_interruptible(&apriv->thr_wait);
} }
#endif
} }
if ( status & EV_LINK ) { if ( status & EV_LINK ) {
union iwreq_data wrqu; union iwreq_data wrqu;
@ -3194,11 +3168,8 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs)
} }
bap_read (apriv, buffer + hdrlen/2, len, BAP0); bap_read (apriv, buffer + hdrlen/2, len, BAP0);
} else { } else {
#ifdef MICSUPPORT
MICBuffer micbuf; MICBuffer micbuf;
#endif
bap_read (apriv, buffer, ETH_ALEN*2, BAP0); bap_read (apriv, buffer, ETH_ALEN*2, BAP0);
#ifdef MICSUPPORT
if (apriv->micstats.enabled) { if (apriv->micstats.enabled) {
bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0); bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0);
if (ntohs(micbuf.typelen) > 0x05DC) if (ntohs(micbuf.typelen) > 0x05DC)
@ -3211,15 +3182,10 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs)
skb_trim (skb, len + hdrlen); skb_trim (skb, len + hdrlen);
} }
} }
#endif
bap_read(apriv,buffer+ETH_ALEN,len,BAP0); bap_read(apriv,buffer+ETH_ALEN,len,BAP0);
#ifdef MICSUPPORT
if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) { if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) {
badmic: badmic:
dev_kfree_skb_irq (skb); dev_kfree_skb_irq (skb);
#else
if (0) {
#endif
badrx: badrx:
OUT4500( apriv, EVACK, EV_RX); OUT4500( apriv, EVACK, EV_RX);
goto exitrx; goto exitrx;
@ -3430,10 +3396,8 @@ static void mpi_receive_802_3(struct airo_info *ai)
int len = 0; int len = 0;
struct sk_buff *skb; struct sk_buff *skb;
char *buffer; char *buffer;
#ifdef MICSUPPORT
int off = 0; int off = 0;
MICBuffer micbuf; MICBuffer micbuf;
#endif
memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd)); memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd));
/* Make sure we got something */ /* Make sure we got something */
@ -3448,7 +3412,6 @@ static void mpi_receive_802_3(struct airo_info *ai)
goto badrx; goto badrx;
} }
buffer = skb_put(skb,len); buffer = skb_put(skb,len);
#ifdef MICSUPPORT
memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2); memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2);
if (ai->micstats.enabled) { if (ai->micstats.enabled) {
memcpy(&micbuf, memcpy(&micbuf,
@ -3470,9 +3433,6 @@ badmic:
dev_kfree_skb_irq (skb); dev_kfree_skb_irq (skb);
goto badrx; goto badrx;
} }
#else
memcpy(buffer, ai->rxfids[0].virtual_host_addr, len);
#endif
#ifdef WIRELESS_SPY #ifdef WIRELESS_SPY
if (ai->spy_data.spy_number > 0) { if (ai->spy_data.spy_number > 0) {
char *sa; char *sa;
@ -3689,13 +3649,11 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
ai->config.authType = AUTH_OPEN; ai->config.authType = AUTH_OPEN;
ai->config.modulation = MOD_CCK; ai->config.modulation = MOD_CCK;
#ifdef MICSUPPORT
if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) && if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) &&
(micsetup(ai) == SUCCESS)) { (micsetup(ai) == SUCCESS)) {
ai->config.opmode |= MODE_MIC; ai->config.opmode |= MODE_MIC;
set_bit(FLAG_MIC_CAPABLE, &ai->flags); set_bit(FLAG_MIC_CAPABLE, &ai->flags);
} }
#endif
/* Save off the MAC */ /* Save off the MAC */
for( i = 0; i < ETH_ALEN; i++ ) { for( i = 0; i < ETH_ALEN; i++ ) {
@ -4170,15 +4128,12 @@ static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket)
} }
len -= ETH_ALEN * 2; len -= ETH_ALEN * 2;
#ifdef MICSUPPORT
if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
(ntohs(((u16 *)pPacket)[6]) != 0x888E)) { (ntohs(((u16 *)pPacket)[6]) != 0x888E)) {
if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS) if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS)
return ERROR; return ERROR;
miclen = sizeof(pMic); miclen = sizeof(pMic);
} }
#endif
// packet is destination[6], source[6], payload[len-12] // packet is destination[6], source[6], payload[len-12]
// write the payload length and dst/src/payload // write the payload length and dst/src/payload
if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR; if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR;
@ -5801,11 +5756,13 @@ static int airo_set_wap(struct net_device *dev,
Cmd cmd; Cmd cmd;
Resp rsp; Resp rsp;
APListRid APList_rid; APListRid APList_rid;
static const unsigned char bcast[ETH_ALEN] = { 255, 255, 255, 255, 255, 255 }; static const u8 any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
static const u8 off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
if (awrq->sa_family != ARPHRD_ETHER) if (awrq->sa_family != ARPHRD_ETHER)
return -EINVAL; return -EINVAL;
else if (!memcmp(bcast, awrq->sa_data, ETH_ALEN)) { else if (!memcmp(any, awrq->sa_data, ETH_ALEN) ||
!memcmp(off, awrq->sa_data, ETH_ALEN)) {
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
cmd.cmd=CMD_LOSE_SYNC; cmd.cmd=CMD_LOSE_SYNC;
if (down_interruptible(&local->sem)) if (down_interruptible(&local->sem))
@ -6294,6 +6251,267 @@ static int airo_get_encode(struct net_device *dev,
return 0; return 0;
} }
/*------------------------------------------------------------------*/
/*
* Wireless Handler : set extended Encryption parameters
*/
static int airo_set_encodeext(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
char *extra)
{
struct airo_info *local = dev->priv;
struct iw_point *encoding = &wrqu->encoding;
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
CapabilityRid cap_rid; /* Card capability info */
int perm = ( encoding->flags & IW_ENCODE_TEMP ? 0 : 1 );
u16 currentAuthType = local->config.authType;
int idx, key_len, alg = ext->alg; /* Check encryption mode */
wep_key_t key;
/* Is WEP supported ? */
readCapabilityRid(local, &cap_rid, 1);
/* Older firmware doesn't support this...
if(!(cap_rid.softCap & 2)) {
return -EOPNOTSUPP;
} */
readConfigRid(local, 1);
/* Determine and validate the key index */
idx = encoding->flags & IW_ENCODE_INDEX;
if (idx) {
if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1))
return -EINVAL;
idx--;
} else
idx = get_wep_key(local, 0xffff);
if (encoding->flags & IW_ENCODE_DISABLED)
alg = IW_ENCODE_ALG_NONE;
/* Just setting the transmit key? */
if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
set_wep_key(local, idx, NULL, 0, perm, 1);
} else {
/* Set the requested key first */
memset(key.key, 0, MAX_KEY_SIZE);
switch (alg) {
case IW_ENCODE_ALG_NONE:
key.len = 0;
break;
case IW_ENCODE_ALG_WEP:
if (ext->key_len > MIN_KEY_SIZE) {
key.len = MAX_KEY_SIZE;
} else if (ext->key_len > 0) {
key.len = MIN_KEY_SIZE;
} else {
return -EINVAL;
}
key_len = min (ext->key_len, key.len);
memcpy(key.key, ext->key, key_len);
break;
default:
return -EINVAL;
}
/* Send the key to the card */
set_wep_key(local, idx, key.key, key.len, perm, 1);
}
/* Read the flags */
if(encoding->flags & IW_ENCODE_DISABLED)
local->config.authType = AUTH_OPEN; // disable encryption
if(encoding->flags & IW_ENCODE_RESTRICTED)
local->config.authType = AUTH_SHAREDKEY; // Only Both
if(encoding->flags & IW_ENCODE_OPEN)
local->config.authType = AUTH_ENCRYPT; // Only Wep
/* Commit the changes to flags if needed */
if (local->config.authType != currentAuthType)
set_bit (FLAG_COMMIT, &local->flags);
return -EINPROGRESS;
}
/*------------------------------------------------------------------*/
/*
* Wireless Handler : get extended Encryption parameters
*/
static int airo_get_encodeext(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
char *extra)
{
struct airo_info *local = dev->priv;
struct iw_point *encoding = &wrqu->encoding;
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
CapabilityRid cap_rid; /* Card capability info */
int idx, max_key_len;
/* Is it supported ? */
readCapabilityRid(local, &cap_rid, 1);
if(!(cap_rid.softCap & 2)) {
return -EOPNOTSUPP;
}
readConfigRid(local, 1);
max_key_len = encoding->length - sizeof(*ext);
if (max_key_len < 0)
return -EINVAL;
idx = encoding->flags & IW_ENCODE_INDEX;
if (idx) {
if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1))
return -EINVAL;
idx--;
} else
idx = get_wep_key(local, 0xffff);
encoding->flags = idx + 1;
memset(ext, 0, sizeof(*ext));
/* Check encryption mode */
switch(local->config.authType) {
case AUTH_ENCRYPT:
encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
break;
case AUTH_SHAREDKEY:
encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
break;
default:
case AUTH_OPEN:
encoding->flags = IW_ENCODE_ALG_NONE | IW_ENCODE_DISABLED;
break;
}
/* We can't return the key, so set the proper flag and return zero */
encoding->flags |= IW_ENCODE_NOKEY;
memset(extra, 0, 16);
/* Copy the key to the user buffer */
ext->key_len = get_wep_key(local, idx);
if (ext->key_len > 16) {
ext->key_len=0;
}
return 0;
}
/*------------------------------------------------------------------*/
/*
* Wireless Handler : set extended authentication parameters
*/
static int airo_set_auth(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
struct airo_info *local = dev->priv;
struct iw_param *param = &wrqu->param;
u16 currentAuthType = local->config.authType;
switch (param->flags & IW_AUTH_INDEX) {
case IW_AUTH_WPA_VERSION:
case IW_AUTH_CIPHER_PAIRWISE:
case IW_AUTH_CIPHER_GROUP:
case IW_AUTH_KEY_MGMT:
case IW_AUTH_RX_UNENCRYPTED_EAPOL:
case IW_AUTH_PRIVACY_INVOKED:
/*
* airo does not use these parameters
*/
break;
case IW_AUTH_DROP_UNENCRYPTED:
if (param->value) {
/* Only change auth type if unencrypted */
if (currentAuthType == AUTH_OPEN)
local->config.authType = AUTH_ENCRYPT;
} else {
local->config.authType = AUTH_OPEN;
}
/* Commit the changes to flags if needed */
if (local->config.authType != currentAuthType)
set_bit (FLAG_COMMIT, &local->flags);
break;
case IW_AUTH_80211_AUTH_ALG: {
/* FIXME: What about AUTH_OPEN? This API seems to
* disallow setting our auth to AUTH_OPEN.
*/
if (param->value & IW_AUTH_ALG_SHARED_KEY) {
local->config.authType = AUTH_SHAREDKEY;
} else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
local->config.authType = AUTH_ENCRYPT;
} else
return -EINVAL;
break;
/* Commit the changes to flags if needed */
if (local->config.authType != currentAuthType)
set_bit (FLAG_COMMIT, &local->flags);
}
case IW_AUTH_WPA_ENABLED:
/* Silently accept disable of WPA */
if (param->value > 0)
return -EOPNOTSUPP;
break;
default:
return -EOPNOTSUPP;
}
return -EINPROGRESS;
}
/*------------------------------------------------------------------*/
/*
* Wireless Handler : get extended authentication parameters
*/
static int airo_get_auth(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
struct airo_info *local = dev->priv;
struct iw_param *param = &wrqu->param;
u16 currentAuthType = local->config.authType;
switch (param->flags & IW_AUTH_INDEX) {
case IW_AUTH_DROP_UNENCRYPTED:
switch (currentAuthType) {
case AUTH_SHAREDKEY:
case AUTH_ENCRYPT:
param->value = 1;
break;
default:
param->value = 0;
break;
}
break;
case IW_AUTH_80211_AUTH_ALG:
switch (currentAuthType) {
case AUTH_SHAREDKEY:
param->value = IW_AUTH_ALG_SHARED_KEY;
break;
case AUTH_ENCRYPT:
default:
param->value = IW_AUTH_ALG_OPEN_SYSTEM;
break;
}
break;
case IW_AUTH_WPA_ENABLED:
param->value = 0;
break;
default:
return -EOPNOTSUPP;
}
return 0;
}
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
/* /*
* Wireless Handler : set Tx-Power * Wireless Handler : set Tx-Power
@ -7050,6 +7268,15 @@ static const iw_handler airo_handler[] =
(iw_handler) airo_get_encode, /* SIOCGIWENCODE */ (iw_handler) airo_get_encode, /* SIOCGIWENCODE */
(iw_handler) airo_set_power, /* SIOCSIWPOWER */ (iw_handler) airo_set_power, /* SIOCSIWPOWER */
(iw_handler) airo_get_power, /* SIOCGIWPOWER */ (iw_handler) airo_get_power, /* SIOCGIWPOWER */
(iw_handler) NULL, /* -- hole -- */
(iw_handler) NULL, /* -- hole -- */
(iw_handler) NULL, /* SIOCSIWGENIE */
(iw_handler) NULL, /* SIOCGIWGENIE */
(iw_handler) airo_set_auth, /* SIOCSIWAUTH */
(iw_handler) airo_get_auth, /* SIOCGIWAUTH */
(iw_handler) airo_set_encodeext, /* SIOCSIWENCODEEXT */
(iw_handler) airo_get_encodeext, /* SIOCGIWENCODEEXT */
(iw_handler) NULL, /* SIOCSIWPMKSA */
}; };
/* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here. /* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here.
@ -7270,13 +7497,11 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {
case AIROGSTAT: ridcode = RID_STATUS; break; case AIROGSTAT: ridcode = RID_STATUS; break;
case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; case AIROGSTATSD32: ridcode = RID_STATSDELTA; break;
case AIROGSTATSC32: ridcode = RID_STATS; break; case AIROGSTATSC32: ridcode = RID_STATS; break;
#ifdef MICSUPPORT
case AIROGMICSTATS: case AIROGMICSTATS:
if (copy_to_user(comp->data, &ai->micstats, if (copy_to_user(comp->data, &ai->micstats,
min((int)comp->len,(int)sizeof(ai->micstats)))) min((int)comp->len,(int)sizeof(ai->micstats))))
return -EFAULT; return -EFAULT;
return 0; return 0;
#endif
case AIRORRID: ridcode = comp->ridnum; break; case AIRORRID: ridcode = comp->ridnum; break;
default: default:
return -EINVAL; return -EINVAL;
@ -7308,9 +7533,7 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {
static int writerids(struct net_device *dev, aironet_ioctl *comp) { static int writerids(struct net_device *dev, aironet_ioctl *comp) {
struct airo_info *ai = dev->priv; struct airo_info *ai = dev->priv;
int ridcode; int ridcode;
#ifdef MICSUPPORT
int enabled; int enabled;
#endif
Resp rsp; Resp rsp;
static int (* writer)(struct airo_info *, u16 rid, const void *, int, int); static int (* writer)(struct airo_info *, u16 rid, const void *, int, int);
unsigned char *iobuf; unsigned char *iobuf;
@ -7367,11 +7590,9 @@ static int writerids(struct net_device *dev, aironet_ioctl *comp) {
PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1); PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1);
#ifdef MICSUPPORT
enabled = ai->micstats.enabled; enabled = ai->micstats.enabled;
memset(&ai->micstats,0,sizeof(ai->micstats)); memset(&ai->micstats,0,sizeof(ai->micstats));
ai->micstats.enabled = enabled; ai->micstats.enabled = enabled;
#endif
if (copy_to_user(comp->data, iobuf, if (copy_to_user(comp->data, iobuf,
min((int)comp->len, (int)RIDSIZE))) { min((int)comp->len, (int)RIDSIZE))) {

View File

@ -167,7 +167,7 @@ that only one external action is invoked at a time.
#include "ipw2100.h" #include "ipw2100.h"
#define IPW2100_VERSION "1.1.3" #define IPW2100_VERSION "git-1.1.4"
#define DRV_NAME "ipw2100" #define DRV_NAME "ipw2100"
#define DRV_VERSION IPW2100_VERSION #define DRV_VERSION IPW2100_VERSION
@ -1672,6 +1672,18 @@ static int ipw2100_start_scan(struct ipw2100_priv *priv)
return err; return err;
} }
static const struct ieee80211_geo ipw_geos[] = {
{ /* Restricted */
"---",
.bg_channels = 14,
.bg = {{2412, 1}, {2417, 2}, {2422, 3},
{2427, 4}, {2432, 5}, {2437, 6},
{2442, 7}, {2447, 8}, {2452, 9},
{2457, 10}, {2462, 11}, {2467, 12},
{2472, 13}, {2484, 14}},
},
};
static int ipw2100_up(struct ipw2100_priv *priv, int deferred) static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
{ {
unsigned long flags; unsigned long flags;
@ -1727,6 +1739,13 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
goto exit; goto exit;
} }
/* Initialize the geo */
if (ieee80211_set_geo(priv->ieee, &ipw_geos[0])) {
printk(KERN_WARNING DRV_NAME "Could not set geo\n");
return 0;
}
priv->ieee->freq_band = IEEE80211_24GHZ_BAND;
lock = LOCK_NONE; lock = LOCK_NONE;
if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) { if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
printk(KERN_ERR DRV_NAME printk(KERN_ERR DRV_NAME
@ -3750,7 +3769,7 @@ static ssize_t store_memory(struct device *d, struct device_attribute *attr,
struct net_device *dev = priv->net_dev; struct net_device *dev = priv->net_dev;
const char *p = buf; const char *p = buf;
(void) dev; /* kill unused-var warning for debug-only code */ (void)dev; /* kill unused-var warning for debug-only code */
if (count < 1) if (count < 1)
return count; return count;
@ -4070,7 +4089,7 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
unsigned long val; unsigned long val;
char *p = buffer; char *p = buffer;
(void) dev; /* kill unused-var warning for debug-only code */ (void)dev; /* kill unused-var warning for debug-only code */
IPW_DEBUG_INFO("enter\n"); IPW_DEBUG_INFO("enter\n");
@ -5107,12 +5126,13 @@ static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
.host_command_length = 4 .host_command_length = 4
}; };
int err = 0; int err = 0;
u32 tmp = tx_power;
if (tx_power != IPW_TX_POWER_DEFAULT) if (tx_power != IPW_TX_POWER_DEFAULT)
tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
(IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
cmd.host_command_parameters[0] = tx_power; cmd.host_command_parameters[0] = tmp;
if (priv->ieee->iw_mode == IW_MODE_ADHOC) if (priv->ieee->iw_mode == IW_MODE_ADHOC)
err = ipw2100_hw_send_command(priv, &cmd); err = ipw2100_hw_send_command(priv, &cmd);
@ -5365,9 +5385,12 @@ static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
SEC_LEVEL_0, 0, 1); SEC_LEVEL_0, 0, 1);
} else { } else {
auth_mode = IPW_AUTH_OPEN; auth_mode = IPW_AUTH_OPEN;
if ((priv->ieee->sec.flags & SEC_AUTH_MODE) && if (priv->ieee->sec.flags & SEC_AUTH_MODE) {
(priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)
auth_mode = IPW_AUTH_SHARED; auth_mode = IPW_AUTH_SHARED;
else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)
auth_mode = IPW_AUTH_LEAP_CISCO_ID;
}
sec_level = SEC_LEVEL_0; sec_level = SEC_LEVEL_0;
if (priv->ieee->sec.flags & SEC_LEVEL) if (priv->ieee->sec.flags & SEC_LEVEL)
@ -5760,6 +5783,9 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
} else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
sec.auth_mode = WLAN_AUTH_OPEN; sec.auth_mode = WLAN_AUTH_OPEN;
ieee->open_wep = 1; ieee->open_wep = 1;
} else if (value & IW_AUTH_ALG_LEAP) {
sec.auth_mode = WLAN_AUTH_LEAP;
ieee->open_wep = 1;
} else } else
return -EINVAL; return -EINVAL;
@ -5771,8 +5797,8 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
return ret; return ret;
} }
void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
char *wpa_ie, int wpa_ie_len) char *wpa_ie, int wpa_ie_len)
{ {
struct ipw2100_wpa_assoc_frame frame; struct ipw2100_wpa_assoc_frame frame;

View File

@ -392,8 +392,10 @@ struct ipw2100_notification {
#define IPW_WEP104_CIPHER (1<<5) #define IPW_WEP104_CIPHER (1<<5)
#define IPW_CKIP_CIPHER (1<<6) #define IPW_CKIP_CIPHER (1<<6)
#define IPW_AUTH_OPEN 0 #define IPW_AUTH_OPEN 0
#define IPW_AUTH_SHARED 1 #define IPW_AUTH_SHARED 1
#define IPW_AUTH_LEAP 2
#define IPW_AUTH_LEAP_CISCO_ID 0x80
struct statistic { struct statistic {
int value; int value;

File diff suppressed because it is too large Load Diff

View File

@ -33,6 +33,7 @@
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
@ -46,6 +47,7 @@
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/wireless.h> #include <linux/wireless.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/jiffies.h>
#include <asm/io.h> #include <asm/io.h>
#include <net/ieee80211.h> #include <net/ieee80211.h>
@ -852,7 +854,7 @@ struct ipw_scan_request_ext {
u16 dwell_time[IPW_SCAN_TYPES]; u16 dwell_time[IPW_SCAN_TYPES];
} __attribute__ ((packed)); } __attribute__ ((packed));
extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index) static inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index)
{ {
if (index % 2) if (index % 2)
return scan->scan_type[index / 2] & 0x0F; return scan->scan_type[index / 2] & 0x0F;
@ -860,7 +862,7 @@ extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index)
return (scan->scan_type[index / 2] & 0xF0) >> 4; return (scan->scan_type[index / 2] & 0xF0) >> 4;
} }
extern inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan, static inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan,
u8 index, u8 scan_type) u8 index, u8 scan_type)
{ {
if (index % 2) if (index % 2)
@ -1120,7 +1122,7 @@ struct ipw_priv {
struct ieee80211_device *ieee; struct ieee80211_device *ieee;
spinlock_t lock; spinlock_t lock;
struct semaphore sem; struct mutex mutex;
/* basic pci-network driver stuff */ /* basic pci-network driver stuff */
struct pci_dev *pci_dev; struct pci_dev *pci_dev;
@ -1406,13 +1408,6 @@ do { if (ipw_debug_level & (level)) \
* Register bit definitions * Register bit definitions
*/ */
/* Dino control registers bits */
#define DINO_ENABLE_SYSTEM 0x80
#define DINO_ENABLE_CS 0x40
#define DINO_RXFIFO_DATA 0x01
#define DINO_CONTROL_REG 0x00200000
#define IPW_INTA_RW 0x00000008 #define IPW_INTA_RW 0x00000008
#define IPW_INTA_MASK_R 0x0000000C #define IPW_INTA_MASK_R 0x0000000C
#define IPW_INDIRECT_ADDR 0x00000010 #define IPW_INDIRECT_ADDR 0x00000010
@ -1459,6 +1454,11 @@ do { if (ipw_debug_level & (level)) \
#define IPW_DOMAIN_0_END 0x1000 #define IPW_DOMAIN_0_END 0x1000
#define CLX_MEM_BAR_SIZE 0x1000 #define CLX_MEM_BAR_SIZE 0x1000
/* Dino/baseband control registers bits */
#define DINO_ENABLE_SYSTEM 0x80 /* 1 = baseband processor on, 0 = reset */
#define DINO_ENABLE_CS 0x40 /* 1 = enable ucode load */
#define DINO_RXFIFO_DATA 0x01 /* 1 = data available */
#define IPW_BASEBAND_CONTROL_STATUS 0X00200000 #define IPW_BASEBAND_CONTROL_STATUS 0X00200000
#define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004 #define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004
#define IPW_BASEBAND_RX_FIFO_READ 0X00200004 #define IPW_BASEBAND_RX_FIFO_READ 0X00200004
@ -1567,13 +1567,18 @@ do { if (ipw_debug_level & (level)) \
#define EEPROM_BSS_CHANNELS_BG (GET_EEPROM_ADDR(0x2c,LSB)) /* 2 bytes */ #define EEPROM_BSS_CHANNELS_BG (GET_EEPROM_ADDR(0x2c,LSB)) /* 2 bytes */
#define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,LSB)) /* 2 bytes */ #define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,LSB)) /* 2 bytes */
/* NIC type as found in the one byte EEPROM_NIC_TYPE offset*/ /* NIC type as found in the one byte EEPROM_NIC_TYPE offset */
#define EEPROM_NIC_TYPE_0 0 #define EEPROM_NIC_TYPE_0 0
#define EEPROM_NIC_TYPE_1 1 #define EEPROM_NIC_TYPE_1 1
#define EEPROM_NIC_TYPE_2 2 #define EEPROM_NIC_TYPE_2 2
#define EEPROM_NIC_TYPE_3 3 #define EEPROM_NIC_TYPE_3 3
#define EEPROM_NIC_TYPE_4 4 #define EEPROM_NIC_TYPE_4 4
/* Bluetooth Coexistence capabilities as found in EEPROM_SKU_CAPABILITY */
#define EEPROM_SKU_CAP_BT_CHANNEL_SIG 0x01 /* we can tell BT our channel # */
#define EEPROM_SKU_CAP_BT_PRIORITY 0x02 /* BT can take priority over us */
#define EEPROM_SKU_CAP_BT_OOB 0x04 /* we can signal BT out-of-band */
#define FW_MEM_REG_LOWER_BOUND 0x00300000 #define FW_MEM_REG_LOWER_BOUND 0x00300000
#define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40) #define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40)
#define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04) #define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04)
@ -1658,9 +1663,10 @@ enum {
IPW_FW_ERROR_FATAL_ERROR IPW_FW_ERROR_FATAL_ERROR
}; };
#define AUTH_OPEN 0 #define AUTH_OPEN 0
#define AUTH_SHARED_KEY 1 #define AUTH_SHARED_KEY 1
#define AUTH_IGNORE 3 #define AUTH_LEAP 2
#define AUTH_IGNORE 3
#define HC_ASSOCIATE 0 #define HC_ASSOCIATE 0
#define HC_REASSOCIATE 1 #define HC_REASSOCIATE 1
@ -1860,7 +1866,7 @@ struct host_cmd {
u8 cmd; u8 cmd;
u8 len; u8 len;
u16 reserved; u16 reserved;
u32 param[TFD_CMD_IMMEDIATE_PAYLOAD_LENGTH]; u32 *param;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct ipw_cmd_log { struct ipw_cmd_log {
@ -1869,21 +1875,23 @@ struct ipw_cmd_log {
struct host_cmd cmd; struct host_cmd cmd;
}; };
#define CFG_BT_COEXISTENCE_MIN 0x00 /* SysConfig command parameters ... */
#define CFG_BT_COEXISTENCE_DEFER 0x02 /* bt_coexistence param */
#define CFG_BT_COEXISTENCE_KILL 0x04 #define CFG_BT_COEXISTENCE_SIGNAL_CHNL 0x01 /* tell BT our chnl # */
#define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 #define CFG_BT_COEXISTENCE_DEFER 0x02 /* defer our Tx if BT traffic */
#define CFG_BT_COEXISTENCE_OOB 0x10 #define CFG_BT_COEXISTENCE_KILL 0x04 /* kill our Tx if BT traffic */
#define CFG_BT_COEXISTENCE_MAX 0xFF #define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 /* multimedia extensions */
#define CFG_BT_COEXISTENCE_DEF 0x80 /* read Bt from EEPROM */ #define CFG_BT_COEXISTENCE_OOB 0x10 /* signal BT via out-of-band */
#define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x0 /* clear-to-send to self param */
#define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x1 #define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x00
#define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x01
#define CFG_CTS_TO_ITSELF_ENABLED_DEF CFG_CTS_TO_ITSELF_ENABLED_MIN #define CFG_CTS_TO_ITSELF_ENABLED_DEF CFG_CTS_TO_ITSELF_ENABLED_MIN
#define CFG_SYS_ANTENNA_BOTH 0x000 /* Antenna diversity param (h/w can select best antenna, based on signal) */
#define CFG_SYS_ANTENNA_A 0x001 #define CFG_SYS_ANTENNA_BOTH 0x00 /* NIC selects best antenna */
#define CFG_SYS_ANTENNA_B 0x003 #define CFG_SYS_ANTENNA_A 0x01 /* force antenna A */
#define CFG_SYS_ANTENNA_B 0x03 /* force antenna B */
/* /*
* The definitions below were lifted off the ipw2100 driver, which only * The definitions below were lifted off the ipw2100 driver, which only

View File

@ -55,10 +55,8 @@
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#ifdef CONFIG_NET_RADIO
#include <linux/wireless.h> #include <linux/wireless.h>
#include <net/iw_handler.h> #include <net/iw_handler.h>
#endif
#include <pcmcia/cs_types.h> #include <pcmcia/cs_types.h>
#include <pcmcia/cs.h> #include <pcmcia/cs.h>

View File

@ -112,7 +112,7 @@ static const char StripVersion[] = "1.3A-STUART.CHESHIRE";
#include <linux/ip.h> #include <linux/ip.h>
#include <linux/tcp.h> #include <linux/tcp.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/jiffies.h>
/************************************************************************/ /************************************************************************/
/* Useful structures and definitions */ /* Useful structures and definitions */
@ -1569,7 +1569,7 @@ static int strip_xmit(struct sk_buff *skb, struct net_device *dev)
del_timer(&strip_info->idle_timer); del_timer(&strip_info->idle_timer);
if (jiffies - strip_info->pps_timer > HZ) { if (time_after(jiffies, strip_info->pps_timer + HZ)) {
unsigned long t = jiffies - strip_info->pps_timer; unsigned long t = jiffies - strip_info->pps_timer;
unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t / 2) / t; unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t / 2) / t;
unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t / 2) / t; unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t / 2) / t;

View File

@ -98,11 +98,7 @@
* characteristics of the hardware. Applications such as mobile IP may * characteristics of the hardware. Applications such as mobile IP may
* take advantage of it. * take advantage of it.
* *
* You will need to enable the CONFIG_NET_RADIO define in the kernel * It might be a good idea as well to fetch the wireless tools to
* configuration to enable the wireless extensions (this is the one
* giving access to the radio network device choice).
*
* It might also be a good idea as well to fetch the wireless tools to
* configure the device and play a bit. * configure the device and play a bit.
*/ */

View File

@ -99,11 +99,7 @@
* caracteristics of the hardware in a standard way and support for * caracteristics of the hardware in a standard way and support for
* applications for taking advantage of it (like Mobile IP). * applications for taking advantage of it (like Mobile IP).
* *
* You will need to enable the CONFIG_NET_RADIO define in the kernel * It might be a good idea as well to fetch the wireless tools to
* configuration to enable the wireless extensions (this is the one
* giving access to the radio network device choice).
*
* It might also be a good idea as well to fetch the wireless tools to
* configure the device and play a bit. * configure the device and play a bit.
*/ */
@ -440,11 +436,8 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#ifdef CONFIG_NET_RADIO
#include <linux/wireless.h> /* Wireless extensions */ #include <linux/wireless.h> /* Wireless extensions */
#include <net/iw_handler.h> /* New driver API */ #include <net/iw_handler.h> /* New driver API */
#endif
/* Pcmcia headers that we need */ /* Pcmcia headers that we need */
#include <pcmcia/cs_types.h> #include <pcmcia/cs_types.h>

View File

@ -27,6 +27,7 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/zorro.h> #include <linux/zorro.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/irq.h> #include <asm/irq.h>
@ -151,7 +152,7 @@ static int __devinit zorro8390_init(struct net_device *dev,
z_writeb(z_readb(ioaddr + NE_RESET), ioaddr + NE_RESET); z_writeb(z_readb(ioaddr + NE_RESET), ioaddr + NE_RESET);
while ((z_readb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0) while ((z_readb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(KERN_WARNING " not found (no reset ack).\n"); printk(KERN_WARNING " not found (no reset ack).\n");
return -ENODEV; return -ENODEV;
} }
@ -273,7 +274,7 @@ static void zorro8390_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((z_readb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0) while ((z_readb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n",
dev->name); dev->name);
break; break;
@ -400,7 +401,7 @@ static void zorro8390_block_output(struct net_device *dev, int count,
dma_start = jiffies; dma_start = jiffies;
while ((z_readb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0) while ((z_readb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk(KERN_ERR "%s: timeout waiting for Tx RDC.\n", printk(KERN_ERR "%s: timeout waiting for Tx RDC.\n",
dev->name); dev->name);
zorro8390_reset_8390(dev); zorro8390_reset_8390(dev);

View File

@ -206,7 +206,6 @@ struct ArcProto {
extern struct ArcProto *arc_proto_map[256], *arc_proto_default, extern struct ArcProto *arc_proto_map[256], *arc_proto_default,
*arc_bcast_proto, *arc_raw_proto; *arc_bcast_proto, *arc_raw_proto;
extern struct ArcProto arc_proto_null;
/* /*
@ -334,17 +333,9 @@ void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc);
#define arcnet_dump_skb(dev,skb,desc) ; #define arcnet_dump_skb(dev,skb,desc) ;
#endif #endif
#if (ARCNET_DEBUG_MAX & D_RX) || (ARCNET_DEBUG_MAX & D_TX)
void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc,
int take_arcnet_lock);
#else
#define arcnet_dump_packet(dev, bufnum, desc,take_arcnet_lock) ;
#endif
void arcnet_unregister_proto(struct ArcProto *proto); void arcnet_unregister_proto(struct ArcProto *proto);
irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs); irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs);
struct net_device *alloc_arcdev(char *name); struct net_device *alloc_arcdev(char *name);
void arcnet_rx(struct net_device *dev, int bufnum);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _LINUX_ARCDEVICE_H */ #endif /* _LINUX_ARCDEVICE_H */

View File

@ -1214,6 +1214,7 @@ struct mv64xxx_i2c_pdata {
#define MV643XX_ETH_FORCE_BP_MODE_NO_JAM 0 #define MV643XX_ETH_FORCE_BP_MODE_NO_JAM 0
#define MV643XX_ETH_FORCE_BP_MODE_JAM_TX (1<<7) #define MV643XX_ETH_FORCE_BP_MODE_JAM_TX (1<<7)
#define MV643XX_ETH_FORCE_BP_MODE_JAM_TX_ON_RX_ERR (1<<8) #define MV643XX_ETH_FORCE_BP_MODE_JAM_TX_ON_RX_ERR (1<<8)
#define MV643XX_ETH_SERIAL_PORT_CONTROL_RESERVED (1<<9)
#define MV643XX_ETH_FORCE_LINK_FAIL 0 #define MV643XX_ETH_FORCE_LINK_FAIL 0
#define MV643XX_ETH_DO_NOT_FORCE_LINK_FAIL (1<<10) #define MV643XX_ETH_DO_NOT_FORCE_LINK_FAIL (1<<10)
#define MV643XX_ETH_RETRANSMIT_16_ATTEMPTS 0 #define MV643XX_ETH_RETRANSMIT_16_ATTEMPTS 0
@ -1243,6 +1244,8 @@ struct mv64xxx_i2c_pdata {
#define MV643XX_ETH_SET_MII_SPEED_TO_10 0 #define MV643XX_ETH_SET_MII_SPEED_TO_10 0
#define MV643XX_ETH_SET_MII_SPEED_TO_100 (1<<24) #define MV643XX_ETH_SET_MII_SPEED_TO_100 (1<<24)
#define MV643XX_ETH_MAX_RX_PACKET_MASK (0x7<<17)
#define MV643XX_ETH_PORT_SERIAL_CONTROL_DEFAULT_VALUE \ #define MV643XX_ETH_PORT_SERIAL_CONTROL_DEFAULT_VALUE \
MV643XX_ETH_DO_NOT_FORCE_LINK_PASS | \ MV643XX_ETH_DO_NOT_FORCE_LINK_PASS | \
MV643XX_ETH_ENABLE_AUTO_NEG_FOR_DUPLX | \ MV643XX_ETH_ENABLE_AUTO_NEG_FOR_DUPLX | \
@ -1285,23 +1288,15 @@ struct mv64xxx_i2c_pdata {
#define MV643XX_ETH_NAME "mv643xx_eth" #define MV643XX_ETH_NAME "mv643xx_eth"
struct mv643xx_eth_platform_data { struct mv643xx_eth_platform_data {
/*
* Non-values for mac_addr, phy_addr, port_config, etc.
* override the default value. Setting the corresponding
* force_* field, causes the default value to be overridden
* even when zero.
*/
unsigned int force_phy_addr:1;
unsigned int force_port_config:1;
unsigned int force_port_config_extend:1;
unsigned int force_port_sdma_config:1;
unsigned int force_port_serial_control:1;
int phy_addr;
char *mac_addr; /* pointer to mac address */ char *mac_addr; /* pointer to mac address */
u32 port_config; u16 force_phy_addr; /* force override if phy_addr == 0 */
u32 port_config_extend; u16 phy_addr;
u32 port_sdma_config;
u32 port_serial_control; /* If speed is 0, then speed and duplex are autonegotiated. */
int speed; /* 0, SPEED_10, SPEED_100, SPEED_1000 */
int duplex; /* DUPLEX_HALF or DUPLEX_FULL */
/* non-zero values of the following fields override defaults */
u32 tx_queue_size; u32 tx_queue_size;
u32 rx_queue_size; u32 rx_queue_size;
u32 tx_sram_addr; u32 tx_sram_addr;

View File

@ -220,6 +220,7 @@ struct ieee80211_snap_hdr {
/* Authentication algorithms */ /* Authentication algorithms */
#define WLAN_AUTH_OPEN 0 #define WLAN_AUTH_OPEN 0
#define WLAN_AUTH_SHARED_KEY 1 #define WLAN_AUTH_SHARED_KEY 1
#define WLAN_AUTH_LEAP 2
#define WLAN_AUTH_CHALLENGE_LEN 128 #define WLAN_AUTH_CHALLENGE_LEN 128
@ -299,6 +300,23 @@ enum ieee80211_reasoncode {
WLAN_REASON_CIPHER_SUITE_REJECTED = 24, WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
}; };
/* Action categories - 802.11h */
enum ieee80211_actioncategories {
WLAN_ACTION_SPECTRUM_MGMT = 0,
/* Reserved 1-127 */
/* Error 128-255 */
};
/* Action details - 802.11h */
enum ieee80211_actiondetails {
WLAN_ACTION_CATEGORY_MEASURE_REQUEST = 0,
WLAN_ACTION_CATEGORY_MEASURE_REPORT = 1,
WLAN_ACTION_CATEGORY_TPC_REQUEST = 2,
WLAN_ACTION_CATEGORY_TPC_REPORT = 3,
WLAN_ACTION_CATEGORY_CHANNEL_SWITCH = 4,
/* 5 - 255 Reserved */
};
#define IEEE80211_STATMASK_SIGNAL (1<<0) #define IEEE80211_STATMASK_SIGNAL (1<<0)
#define IEEE80211_STATMASK_RSSI (1<<1) #define IEEE80211_STATMASK_RSSI (1<<1)
#define IEEE80211_STATMASK_NOISE (1<<2) #define IEEE80211_STATMASK_NOISE (1<<2)
@ -377,6 +395,8 @@ struct ieee80211_rx_stats {
u8 mask; u8 mask;
u8 freq; u8 freq;
u16 len; u16 len;
u64 tsf;
u32 beacon_time;
}; };
/* IEEE 802.11 requires that STA supports concurrent reception of at least /* IEEE 802.11 requires that STA supports concurrent reception of at least
@ -608,6 +628,28 @@ struct ieee80211_auth {
struct ieee80211_info_element info_element[0]; struct ieee80211_info_element info_element[0];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct ieee80211_channel_switch {
u8 id;
u8 len;
u8 mode;
u8 channel;
u8 count;
} __attribute__ ((packed));
struct ieee80211_action {
struct ieee80211_hdr_3addr header;
u8 category;
u8 action;
union {
struct ieee80211_action_exchange {
u8 token;
struct ieee80211_info_element info_element[0];
} exchange;
struct ieee80211_channel_switch channel_switch;
} format;
} __attribute__ ((packed));
struct ieee80211_disassoc { struct ieee80211_disassoc {
struct ieee80211_hdr_3addr header; struct ieee80211_hdr_3addr header;
__le16 reason; __le16 reason;
@ -692,7 +734,15 @@ struct ieee80211_txb {
/* QoS structure */ /* QoS structure */
#define NETWORK_HAS_QOS_PARAMETERS (1<<3) #define NETWORK_HAS_QOS_PARAMETERS (1<<3)
#define NETWORK_HAS_QOS_INFORMATION (1<<4) #define NETWORK_HAS_QOS_INFORMATION (1<<4)
#define NETWORK_HAS_QOS_MASK (NETWORK_HAS_QOS_PARAMETERS | NETWORK_HAS_QOS_INFORMATION) #define NETWORK_HAS_QOS_MASK (NETWORK_HAS_QOS_PARAMETERS | \
NETWORK_HAS_QOS_INFORMATION)
/* 802.11h */
#define NETWORK_HAS_POWER_CONSTRAINT (1<<5)
#define NETWORK_HAS_CSA (1<<6)
#define NETWORK_HAS_QUIET (1<<7)
#define NETWORK_HAS_IBSS_DFS (1<<8)
#define NETWORK_HAS_TPC_REPORT (1<<9)
#define QOS_QUEUE_NUM 4 #define QOS_QUEUE_NUM 4
#define QOS_OUI_LEN 3 #define QOS_OUI_LEN 3
@ -748,6 +798,91 @@ struct ieee80211_tim_parameters {
/*******************************************************/ /*******************************************************/
enum { /* ieee80211_basic_report.map */
IEEE80211_BASIC_MAP_BSS = (1 << 0),
IEEE80211_BASIC_MAP_OFDM = (1 << 1),
IEEE80211_BASIC_MAP_UNIDENTIFIED = (1 << 2),
IEEE80211_BASIC_MAP_RADAR = (1 << 3),
IEEE80211_BASIC_MAP_UNMEASURED = (1 << 4),
/* Bits 5-7 are reserved */
};
struct ieee80211_basic_report {
u8 channel;
__le64 start_time;
__le16 duration;
u8 map;
} __attribute__ ((packed));
enum { /* ieee80211_measurement_request.mode */
/* Bit 0 is reserved */
IEEE80211_MEASUREMENT_ENABLE = (1 << 1),
IEEE80211_MEASUREMENT_REQUEST = (1 << 2),
IEEE80211_MEASUREMENT_REPORT = (1 << 3),
/* Bits 4-7 are reserved */
};
enum {
IEEE80211_REPORT_BASIC = 0, /* required */
IEEE80211_REPORT_CCA = 1, /* optional */
IEEE80211_REPORT_RPI = 2, /* optional */
/* 3-255 reserved */
};
struct ieee80211_measurement_params {
u8 channel;
__le64 start_time;
__le16 duration;
} __attribute__ ((packed));
struct ieee80211_measurement_request {
struct ieee80211_info_element ie;
u8 token;
u8 mode;
u8 type;
struct ieee80211_measurement_params params[0];
} __attribute__ ((packed));
struct ieee80211_measurement_report {
struct ieee80211_info_element ie;
u8 token;
u8 mode;
u8 type;
union {
struct ieee80211_basic_report basic[0];
} u;
} __attribute__ ((packed));
struct ieee80211_tpc_report {
u8 transmit_power;
u8 link_margin;
} __attribute__ ((packed));
struct ieee80211_channel_map {
u8 channel;
u8 map;
} __attribute__ ((packed));
struct ieee80211_ibss_dfs {
struct ieee80211_info_element ie;
u8 owner[ETH_ALEN];
u8 recovery_interval;
struct ieee80211_channel_map channel_map[0];
};
struct ieee80211_csa {
u8 mode;
u8 channel;
u8 count;
} __attribute__ ((packed));
struct ieee80211_quiet {
u8 count;
u8 period;
u8 duration;
u8 offset;
} __attribute__ ((packed));
struct ieee80211_network { struct ieee80211_network {
/* These entries are used to identify a unique network */ /* These entries are used to identify a unique network */
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
@ -767,7 +902,7 @@ struct ieee80211_network {
u8 rates_ex_len; u8 rates_ex_len;
unsigned long last_scanned; unsigned long last_scanned;
u8 mode; u8 mode;
u8 flags; u32 flags;
u32 last_associate; u32 last_associate;
u32 time_stamp[2]; u32 time_stamp[2];
u16 beacon_interval; u16 beacon_interval;
@ -779,6 +914,25 @@ struct ieee80211_network {
u8 rsn_ie[MAX_WPA_IE_LEN]; u8 rsn_ie[MAX_WPA_IE_LEN];
size_t rsn_ie_len; size_t rsn_ie_len;
struct ieee80211_tim_parameters tim; struct ieee80211_tim_parameters tim;
/* 802.11h info */
/* Power Constraint - mandatory if spctrm mgmt required */
u8 power_constraint;
/* TPC Report - mandatory if spctrm mgmt required */
struct ieee80211_tpc_report tpc_report;
/* IBSS DFS - mandatory if spctrm mgmt required and IBSS
* NOTE: This is variable length and so must be allocated dynamically */
struct ieee80211_ibss_dfs *ibss_dfs;
/* Channel Switch Announcement - optional if spctrm mgmt required */
struct ieee80211_csa csa;
/* Quiet - optional if spctrm mgmt required */
struct ieee80211_quiet quiet;
struct list_head list; struct list_head list;
}; };
@ -924,7 +1078,10 @@ struct ieee80211_device {
int (*handle_auth) (struct net_device * dev, int (*handle_auth) (struct net_device * dev,
struct ieee80211_auth * auth); struct ieee80211_auth * auth);
int (*handle_deauth) (struct net_device * dev, int (*handle_deauth) (struct net_device * dev,
struct ieee80211_auth * auth); struct ieee80211_deauth * auth);
int (*handle_action) (struct net_device * dev,
struct ieee80211_action * action,
struct ieee80211_rx_stats * stats);
int (*handle_disassoc) (struct net_device * dev, int (*handle_disassoc) (struct net_device * dev,
struct ieee80211_disassoc * assoc); struct ieee80211_disassoc * assoc);
int (*handle_beacon) (struct net_device * dev, int (*handle_beacon) (struct net_device * dev,
@ -1093,6 +1250,7 @@ extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, extern void ieee80211_rx_mgt(struct ieee80211_device *ieee,
struct ieee80211_hdr_4addr *header, struct ieee80211_hdr_4addr *header,
struct ieee80211_rx_stats *stats); struct ieee80211_rx_stats *stats);
extern void ieee80211_network_reset(struct ieee80211_network *network);
/* ieee80211_geo.c */ /* ieee80211_geo.c */
extern const struct ieee80211_geo *ieee80211_get_geo(struct ieee80211_device extern const struct ieee80211_geo *ieee80211_get_geo(struct ieee80211_device
@ -1105,6 +1263,11 @@ extern int ieee80211_is_valid_channel(struct ieee80211_device *ieee,
extern int ieee80211_channel_to_index(struct ieee80211_device *ieee, extern int ieee80211_channel_to_index(struct ieee80211_device *ieee,
u8 channel); u8 channel);
extern u8 ieee80211_freq_to_channel(struct ieee80211_device *ieee, u32 freq); extern u8 ieee80211_freq_to_channel(struct ieee80211_device *ieee, u32 freq);
extern u8 ieee80211_get_channel_flags(struct ieee80211_device *ieee,
u8 channel);
extern const struct ieee80211_channel *ieee80211_get_channel(struct
ieee80211_device
*ieee, u8 channel);
/* ieee80211_wx.c */ /* ieee80211_wx.c */
extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
@ -1122,6 +1285,14 @@ extern int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
extern int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee, extern int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee,
struct iw_request_info *info, struct iw_request_info *info,
union iwreq_data *wrqu, char *extra); union iwreq_data *wrqu, char *extra);
extern int ieee80211_wx_set_auth(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
char *extra);
extern int ieee80211_wx_get_auth(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
char *extra);
static inline void ieee80211_increment_scans(struct ieee80211_device *ieee) static inline void ieee80211_increment_scans(struct ieee80211_device *ieee)
{ {

View File

@ -47,7 +47,8 @@ struct ieee80211_crypto_ops {
/* deinitialize crypto context and free allocated private data */ /* deinitialize crypto context and free allocated private data */
void (*deinit) (void *priv); void (*deinit) (void *priv);
int (*build_iv) (struct sk_buff * skb, int hdr_len, void *priv); int (*build_iv) (struct sk_buff * skb, int hdr_len,
u8 *key, int keylen, void *priv);
/* encrypt/decrypt return < 0 on error or >= 0 on success. The return /* encrypt/decrypt return < 0 on error or >= 0 on success. The return
* value from decrypt_mpdu is passed as the keyidx value for * value from decrypt_mpdu is passed as the keyidx value for

View File

@ -224,6 +224,9 @@ source "net/irda/Kconfig"
source "net/bluetooth/Kconfig" source "net/bluetooth/Kconfig"
source "net/ieee80211/Kconfig" source "net/ieee80211/Kconfig"
config WIRELESS_EXT
bool
endif # if NET endif # if NET
endmenu # Networking endmenu # Networking

View File

@ -14,5 +14,5 @@ obj-$(CONFIG_XFRM) += flow.o
obj-$(CONFIG_SYSFS) += net-sysfs.o obj-$(CONFIG_SYSFS) += net-sysfs.o
obj-$(CONFIG_NET_DIVERT) += dv.o obj-$(CONFIG_NET_DIVERT) += dv.o
obj-$(CONFIG_NET_PKTGEN) += pktgen.o obj-$(CONFIG_NET_PKTGEN) += pktgen.o
obj-$(CONFIG_NET_RADIO) += wireless.o obj-$(CONFIG_WIRELESS_EXT) += wireless.o
obj-$(CONFIG_NETPOLL) += netpoll.o obj-$(CONFIG_NETPOLL) += netpoll.o

View File

@ -110,10 +110,8 @@
#include <linux/netpoll.h> #include <linux/netpoll.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/delay.h> #include <linux/delay.h>
#ifdef CONFIG_NET_RADIO #include <linux/wireless.h>
#include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
#include <net/iw_handler.h> #include <net/iw_handler.h>
#endif /* CONFIG_NET_RADIO */
#include <asm/current.h> #include <asm/current.h>
/* /*
@ -2028,7 +2026,7 @@ static struct file_operations softnet_seq_fops = {
.release = seq_release, .release = seq_release,
}; };
#ifdef WIRELESS_EXT #ifdef CONFIG_WIRELESS_EXT
extern int wireless_proc_init(void); extern int wireless_proc_init(void);
#else #else
#define wireless_proc_init() 0 #define wireless_proc_init() 0
@ -2582,7 +2580,7 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
ret = -EFAULT; ret = -EFAULT;
return ret; return ret;
} }
#ifdef WIRELESS_EXT #ifdef CONFIG_WIRELESS_EXT
/* Take care of Wireless Extensions */ /* Take care of Wireless Extensions */
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
/* If command is `set a parameter', or /* If command is `set a parameter', or
@ -2603,7 +2601,7 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
ret = -EFAULT; ret = -EFAULT;
return ret; return ret;
} }
#endif /* WIRELESS_EXT */ #endif /* CONFIG_WIRELESS_EXT */
return -EINVAL; return -EINVAL;
} }
} }

View File

@ -18,7 +18,6 @@
#include <linux/string.h> #include <linux/string.h>
#include <net/ieee80211.h> #include <net/ieee80211.h>
MODULE_AUTHOR("Jouni Malinen"); MODULE_AUTHOR("Jouni Malinen");
MODULE_DESCRIPTION("HostAP crypto"); MODULE_DESCRIPTION("HostAP crypto");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
@ -33,11 +32,11 @@ static DEFINE_SPINLOCK(ieee80211_crypto_lock);
void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, int force) void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, int force)
{ {
struct ieee80211_crypt_data *entry, *next; struct ieee80211_crypt_data *entry, *next;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&ieee->lock, flags); spin_lock_irqsave(&ieee->lock, flags);
list_for_each_entry_safe(entry, next, &ieee->crypt_deinit_list, list) { list_for_each_entry_safe(entry, next, &ieee->crypt_deinit_list, list) {
if (atomic_read(&entry->refcnt) != 0 && !force) if (atomic_read(&entry->refcnt) != 0 && !force)
continue; continue;
@ -141,9 +140,9 @@ int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops)
spin_unlock_irqrestore(&ieee80211_crypto_lock, flags); spin_unlock_irqrestore(&ieee80211_crypto_lock, flags);
return -EINVAL; return -EINVAL;
found: found:
printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm " printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm "
"'%s'\n", ops->name); "'%s'\n", ops->name);
list_del(&alg->list); list_del(&alg->list);
spin_unlock_irqrestore(&ieee80211_crypto_lock, flags); spin_unlock_irqrestore(&ieee80211_crypto_lock, flags);
kfree(alg); kfree(alg);
@ -163,7 +162,7 @@ struct ieee80211_crypto_ops *ieee80211_get_crypto_ops(const char *name)
spin_unlock_irqrestore(&ieee80211_crypto_lock, flags); spin_unlock_irqrestore(&ieee80211_crypto_lock, flags);
return NULL; return NULL;
found: found:
spin_unlock_irqrestore(&ieee80211_crypto_lock, flags); spin_unlock_irqrestore(&ieee80211_crypto_lock, flags);
return alg->ops; return alg->ops;
} }

View File

@ -190,7 +190,8 @@ static void ccmp_init_blocks(struct crypto_tfm *tfm,
ieee80211_ccmp_aes_encrypt(tfm, b0, s0); ieee80211_ccmp_aes_encrypt(tfm, b0, s0);
} }
static int ieee80211_ccmp_hdr(struct sk_buff *skb, int hdr_len, void *priv) static int ieee80211_ccmp_hdr(struct sk_buff *skb, int hdr_len,
u8 *aeskey, int keylen, void *priv)
{ {
struct ieee80211_ccmp_data *key = priv; struct ieee80211_ccmp_data *key = priv;
int i; int i;
@ -199,6 +200,9 @@ static int ieee80211_ccmp_hdr(struct sk_buff *skb, int hdr_len, void *priv)
if (skb_headroom(skb) < CCMP_HDR_LEN || skb->len < hdr_len) if (skb_headroom(skb) < CCMP_HDR_LEN || skb->len < hdr_len)
return -1; return -1;
if (aeskey != NULL && keylen >= CCMP_TK_LEN)
memcpy(aeskey, key->key, CCMP_TK_LEN);
pos = skb_push(skb, CCMP_HDR_LEN); pos = skb_push(skb, CCMP_HDR_LEN);
memmove(pos, pos + CCMP_HDR_LEN, hdr_len); memmove(pos, pos + CCMP_HDR_LEN, hdr_len);
pos += hdr_len; pos += hdr_len;
@ -238,7 +242,7 @@ static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
return -1; return -1;
data_len = skb->len - hdr_len; data_len = skb->len - hdr_len;
len = ieee80211_ccmp_hdr(skb, hdr_len, priv); len = ieee80211_ccmp_hdr(skb, hdr_len, NULL, 0, priv);
if (len < 0) if (len < 0)
return -1; return -1;

View File

@ -80,10 +80,9 @@ static void *ieee80211_tkip_init(int key_idx)
{ {
struct ieee80211_tkip_data *priv; struct ieee80211_tkip_data *priv;
priv = kmalloc(sizeof(*priv), GFP_ATOMIC); priv = kzalloc(sizeof(*priv), GFP_ATOMIC);
if (priv == NULL) if (priv == NULL)
goto fail; goto fail;
memset(priv, 0, sizeof(*priv));
priv->key_idx = key_idx; priv->key_idx = key_idx;
@ -271,34 +270,33 @@ static void tkip_mixing_phase2(u8 * WEPSeed, const u8 * TK, const u16 * TTAK,
#endif #endif
} }
static u8 *ieee80211_tkip_hdr(struct sk_buff *skb, int hdr_len, void *priv) static int ieee80211_tkip_hdr(struct sk_buff *skb, int hdr_len,
u8 * rc4key, int keylen, void *priv)
{ {
struct ieee80211_tkip_data *tkey = priv; struct ieee80211_tkip_data *tkey = priv;
int len; int len;
u8 *rc4key, *pos, *icv; u8 *pos;
struct ieee80211_hdr_4addr *hdr; struct ieee80211_hdr_4addr *hdr;
u32 crc;
hdr = (struct ieee80211_hdr_4addr *)skb->data; hdr = (struct ieee80211_hdr_4addr *)skb->data;
if (skb_headroom(skb) < 8 || skb->len < hdr_len) if (skb_headroom(skb) < 8 || skb->len < hdr_len)
return NULL; return -1;
if (rc4key == NULL || keylen < 16)
return -1;
if (!tkey->tx_phase1_done) { if (!tkey->tx_phase1_done) {
tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
tkey->tx_iv32); tkey->tx_iv32);
tkey->tx_phase1_done = 1; tkey->tx_phase1_done = 1;
} }
rc4key = kmalloc(16, GFP_ATOMIC);
if (!rc4key)
return NULL;
tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
len = skb->len - hdr_len; len = skb->len - hdr_len;
pos = skb_push(skb, 8); pos = skb_push(skb, 8);
memmove(pos, pos + 8, hdr_len); memmove(pos, pos + 8, hdr_len);
pos += hdr_len; pos += hdr_len;
icv = skb_put(skb, 4);
*pos++ = *rc4key; *pos++ = *rc4key;
*pos++ = *(rc4key + 1); *pos++ = *(rc4key + 1);
@ -309,28 +307,28 @@ static u8 *ieee80211_tkip_hdr(struct sk_buff *skb, int hdr_len, void *priv)
*pos++ = (tkey->tx_iv32 >> 16) & 0xff; *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
*pos++ = (tkey->tx_iv32 >> 24) & 0xff; *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
crc = ~crc32_le(~0, pos, len); tkey->tx_iv16++;
icv[0] = crc; if (tkey->tx_iv16 == 0) {
icv[1] = crc >> 8; tkey->tx_phase1_done = 0;
icv[2] = crc >> 16; tkey->tx_iv32++;
icv[3] = crc >> 24; }
return rc4key; return 8;
} }
static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
{ {
struct ieee80211_tkip_data *tkey = priv; struct ieee80211_tkip_data *tkey = priv;
int len; int len;
const u8 *rc4key; u8 rc4key[16], *pos, *icv;
u8 *pos; u32 crc;
struct scatterlist sg; struct scatterlist sg;
if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) { if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
if (net_ratelimit()) { if (net_ratelimit()) {
struct ieee80211_hdr_4addr *hdr = struct ieee80211_hdr_4addr *hdr =
(struct ieee80211_hdr_4addr *)skb->data; (struct ieee80211_hdr_4addr *)skb->data;
printk(KERN_DEBUG "TKIP countermeasures: dropped " printk(KERN_DEBUG ": TKIP countermeasures: dropped "
"TX packet to " MAC_FMT "\n", "TX packet to " MAC_FMT "\n",
MAC_ARG(hdr->addr1)); MAC_ARG(hdr->addr1));
} }
@ -343,22 +341,23 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
len = skb->len - hdr_len; len = skb->len - hdr_len;
pos = skb->data + hdr_len; pos = skb->data + hdr_len;
rc4key = ieee80211_tkip_hdr(skb, hdr_len, priv); if ((ieee80211_tkip_hdr(skb, hdr_len, rc4key, 16, priv)) < 0)
if (!rc4key)
return -1; return -1;
icv = skb_put(skb, 4);
crc = ~crc32_le(~0, pos, len);
icv[0] = crc;
icv[1] = crc >> 8;
icv[2] = crc >> 16;
icv[3] = crc >> 24;
crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16);
sg.page = virt_to_page(pos); sg.page = virt_to_page(pos);
sg.offset = offset_in_page(pos); sg.offset = offset_in_page(pos);
sg.length = len + 4; sg.length = len + 4;
crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4);
tkey->tx_iv16++;
if (tkey->tx_iv16 == 0) {
tkey->tx_phase1_done = 0;
tkey->tx_iv32++;
}
return 0; return 0;
} }
@ -379,7 +378,7 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) { if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
if (net_ratelimit()) { if (net_ratelimit()) {
printk(KERN_DEBUG "TKIP countermeasures: dropped " printk(KERN_DEBUG ": TKIP countermeasures: dropped "
"received packet from " MAC_FMT "\n", "received packet from " MAC_FMT "\n",
MAC_ARG(hdr->addr2)); MAC_ARG(hdr->addr2));
} }
@ -695,6 +694,7 @@ static struct ieee80211_crypto_ops ieee80211_crypt_tkip = {
.name = "TKIP", .name = "TKIP",
.init = ieee80211_tkip_init, .init = ieee80211_tkip_init,
.deinit = ieee80211_tkip_deinit, .deinit = ieee80211_tkip_deinit,
.build_iv = ieee80211_tkip_hdr,
.encrypt_mpdu = ieee80211_tkip_encrypt, .encrypt_mpdu = ieee80211_tkip_encrypt,
.decrypt_mpdu = ieee80211_tkip_decrypt, .decrypt_mpdu = ieee80211_tkip_decrypt,
.encrypt_msdu = ieee80211_michael_mic_add, .encrypt_msdu = ieee80211_michael_mic_add,

View File

@ -76,7 +76,8 @@ static void prism2_wep_deinit(void *priv)
} }
/* Add WEP IV/key info to a frame that has at least 4 bytes of headroom */ /* Add WEP IV/key info to a frame that has at least 4 bytes of headroom */
static int prism2_wep_build_iv(struct sk_buff *skb, int hdr_len, void *priv) static int prism2_wep_build_iv(struct sk_buff *skb, int hdr_len,
u8 *key, int keylen, void *priv)
{ {
struct prism2_wep_data *wep = priv; struct prism2_wep_data *wep = priv;
u32 klen, len; u32 klen, len;
@ -131,7 +132,7 @@ static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
return -1; return -1;
/* add the IV to the frame */ /* add the IV to the frame */
if (prism2_wep_build_iv(skb, hdr_len, priv)) if (prism2_wep_build_iv(skb, hdr_len, NULL, 0, priv))
return -1; return -1;
/* Copy the IV into the first 3 bytes of the key */ /* Copy the IV into the first 3 bytes of the key */

View File

@ -58,13 +58,15 @@ int ieee80211_is_valid_channel(struct ieee80211_device *ieee, u8 channel)
* this is a B only channel, we don't see it * this is a B only channel, we don't see it
* as valid. */ * as valid. */
if ((ieee->geo.bg[i].channel == channel) && if ((ieee->geo.bg[i].channel == channel) &&
!(ieee->geo.bg[i].flags & IEEE80211_CH_INVALID) &&
(!(ieee->mode & IEEE_G) || (!(ieee->mode & IEEE_G) ||
!(ieee->geo.bg[i].flags & IEEE80211_CH_B_ONLY))) !(ieee->geo.bg[i].flags & IEEE80211_CH_B_ONLY)))
return IEEE80211_24GHZ_BAND; return IEEE80211_24GHZ_BAND;
if (ieee->freq_band & IEEE80211_52GHZ_BAND) if (ieee->freq_band & IEEE80211_52GHZ_BAND)
for (i = 0; i < ieee->geo.a_channels; i++) for (i = 0; i < ieee->geo.a_channels; i++)
if (ieee->geo.a[i].channel == channel) if ((ieee->geo.a[i].channel == channel) &&
!(ieee->geo.a[i].flags & IEEE80211_CH_INVALID))
return IEEE80211_52GHZ_BAND; return IEEE80211_52GHZ_BAND;
return 0; return 0;
@ -133,6 +135,41 @@ const struct ieee80211_geo *ieee80211_get_geo(struct ieee80211_device *ieee)
return &ieee->geo; return &ieee->geo;
} }
u8 ieee80211_get_channel_flags(struct ieee80211_device * ieee, u8 channel)
{
int index = ieee80211_channel_to_index(ieee, channel);
if (index == -1)
return IEEE80211_CH_INVALID;
if (channel <= IEEE80211_24GHZ_CHANNELS)
return ieee->geo.bg[index].flags;
return ieee->geo.a[index].flags;
}
static const struct ieee80211_channel bad_channel = {
.channel = 0,
.flags = IEEE80211_CH_INVALID,
.max_power = 0,
};
const struct ieee80211_channel *ieee80211_get_channel(struct ieee80211_device
*ieee, u8 channel)
{
int index = ieee80211_channel_to_index(ieee, channel);
if (index == -1)
return &bad_channel;
if (channel <= IEEE80211_24GHZ_CHANNELS)
return &ieee->geo.bg[index];
return &ieee->geo.a[index];
}
EXPORT_SYMBOL(ieee80211_get_channel);
EXPORT_SYMBOL(ieee80211_get_channel_flags);
EXPORT_SYMBOL(ieee80211_is_valid_channel); EXPORT_SYMBOL(ieee80211_is_valid_channel);
EXPORT_SYMBOL(ieee80211_freq_to_channel); EXPORT_SYMBOL(ieee80211_freq_to_channel);
EXPORT_SYMBOL(ieee80211_channel_to_index); EXPORT_SYMBOL(ieee80211_channel_to_index);

View File

@ -82,10 +82,28 @@ static int ieee80211_networks_allocate(struct ieee80211_device *ieee)
return 0; return 0;
} }
void ieee80211_network_reset(struct ieee80211_network *network)
{
if (!network)
return;
if (network->ibss_dfs) {
kfree(network->ibss_dfs);
network->ibss_dfs = NULL;
}
}
static inline void ieee80211_networks_free(struct ieee80211_device *ieee) static inline void ieee80211_networks_free(struct ieee80211_device *ieee)
{ {
int i;
if (!ieee->networks) if (!ieee->networks)
return; return;
for (i = 0; i < MAX_NETWORK_COUNT; i++)
if (ieee->networks[i].ibss_dfs)
kfree(ieee->networks[i].ibss_dfs);
kfree(ieee->networks); kfree(ieee->networks);
ieee->networks = NULL; ieee->networks = NULL;
} }

View File

@ -369,8 +369,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
/* Put this code here so that we avoid duplicating it in all /* Put this code here so that we avoid duplicating it in all
* Rx paths. - Jean II */ * Rx paths. - Jean II */
#ifdef CONFIG_WIRELESS_EXT
#ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */
#ifdef CONFIG_NET_RADIO
/* If spy monitoring on */ /* If spy monitoring on */
if (ieee->spy_data.spy_number > 0) { if (ieee->spy_data.spy_number > 0) {
struct iw_quality wstats; struct iw_quality wstats;
@ -397,8 +397,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
/* Update spy records */ /* Update spy records */
wireless_spy_update(ieee->dev, hdr->addr2, &wstats); wireless_spy_update(ieee->dev, hdr->addr2, &wstats);
} }
#endif /* CONFIG_NET_RADIO */
#endif /* IW_WIRELESS_SPY */ #endif /* IW_WIRELESS_SPY */
#endif /* CONFIG_WIRELESS_EXT */
#ifdef NOT_YET #ifdef NOT_YET
hostap_update_rx_stats(local->ap, hdr, rx_stats); hostap_update_rx_stats(local->ap, hdr, rx_stats);
@ -574,7 +574,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
/* skb: hdr + (possibly fragmented) plaintext payload */ /* skb: hdr + (possibly fragmented) plaintext payload */
// PR: FIXME: hostap has additional conditions in the "if" below: // PR: FIXME: hostap has additional conditions in the "if" below:
// ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) && // ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) &&
if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { if ((frag != 0) || (fc & IEEE80211_FCTL_MOREFRAGS)) {
int flen; int flen;
struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr);
IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag);
@ -754,7 +754,14 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
memset(skb->cb, 0, sizeof(skb->cb)); memset(skb->cb, 0, sizeof(skb->cb));
skb->dev = dev; skb->dev = dev;
skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */ skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
netif_rx(skb); if (netif_rx(skb) == NET_RX_DROP) {
/* netif_rx always succeeds, but it might drop
* the packet. If it drops the packet, we log that
* in our stats. */
IEEE80211_DEBUG_DROP
("RX: netif_rx dropped the packet\n");
stats->rx_dropped++;
}
} }
rx_exit: rx_exit:
@ -930,6 +937,45 @@ static int ieee80211_parse_qos_info_param_IE(struct ieee80211_info_element
return rc; return rc;
} }
#ifdef CONFIG_IEEE80211_DEBUG
#define MFIE_STRING(x) case MFIE_TYPE_ ##x: return #x
static const char *get_info_element_string(u16 id)
{
switch (id) {
MFIE_STRING(SSID);
MFIE_STRING(RATES);
MFIE_STRING(FH_SET);
MFIE_STRING(DS_SET);
MFIE_STRING(CF_SET);
MFIE_STRING(TIM);
MFIE_STRING(IBSS_SET);
MFIE_STRING(COUNTRY);
MFIE_STRING(HOP_PARAMS);
MFIE_STRING(HOP_TABLE);
MFIE_STRING(REQUEST);
MFIE_STRING(CHALLENGE);
MFIE_STRING(POWER_CONSTRAINT);
MFIE_STRING(POWER_CAPABILITY);
MFIE_STRING(TPC_REQUEST);
MFIE_STRING(TPC_REPORT);
MFIE_STRING(SUPP_CHANNELS);
MFIE_STRING(CSA);
MFIE_STRING(MEASURE_REQUEST);
MFIE_STRING(MEASURE_REPORT);
MFIE_STRING(QUIET);
MFIE_STRING(IBSS_DFS);
MFIE_STRING(ERP_INFO);
MFIE_STRING(RSN);
MFIE_STRING(RATES_EX);
MFIE_STRING(GENERIC);
MFIE_STRING(QOS_PARAMETER);
default:
return "UNKNOWN";
}
}
#endif
static int ieee80211_parse_info_param(struct ieee80211_info_element static int ieee80211_parse_info_param(struct ieee80211_info_element
*info_element, u16 length, *info_element, u16 length,
struct ieee80211_network *network) struct ieee80211_network *network)
@ -1040,7 +1086,9 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element
break; break;
case MFIE_TYPE_TIM: case MFIE_TYPE_TIM:
IEEE80211_DEBUG_MGMT("MFIE_TYPE_TIM: ignored\n"); network->tim.tim_count = info_element->data[0];
network->tim.tim_period = info_element->data[1];
IEEE80211_DEBUG_MGMT("MFIE_TYPE_TIM: partially ignored\n");
break; break;
case MFIE_TYPE_ERP_INFO: case MFIE_TYPE_ERP_INFO:
@ -1091,10 +1139,49 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element
printk(KERN_ERR printk(KERN_ERR
"QoS Error need to parse QOS_PARAMETER IE\n"); "QoS Error need to parse QOS_PARAMETER IE\n");
break; break;
/* 802.11h */
case MFIE_TYPE_POWER_CONSTRAINT:
network->power_constraint = info_element->data[0];
network->flags |= NETWORK_HAS_POWER_CONSTRAINT;
break;
case MFIE_TYPE_CSA:
network->power_constraint = info_element->data[0];
network->flags |= NETWORK_HAS_CSA;
break;
case MFIE_TYPE_QUIET:
network->quiet.count = info_element->data[0];
network->quiet.period = info_element->data[1];
network->quiet.duration = info_element->data[2];
network->quiet.offset = info_element->data[3];
network->flags |= NETWORK_HAS_QUIET;
break;
case MFIE_TYPE_IBSS_DFS:
if (network->ibss_dfs)
break;
network->ibss_dfs =
kmalloc(info_element->len, GFP_ATOMIC);
if (!network->ibss_dfs)
return 1;
memcpy(network->ibss_dfs, info_element->data,
info_element->len);
network->flags |= NETWORK_HAS_IBSS_DFS;
break;
case MFIE_TYPE_TPC_REPORT:
network->tpc_report.transmit_power =
info_element->data[0];
network->tpc_report.link_margin = info_element->data[1];
network->flags |= NETWORK_HAS_TPC_REPORT;
break;
default: default:
IEEE80211_DEBUG_MGMT("unsupported IE %d\n", IEEE80211_DEBUG_MGMT
info_element->id); ("Unsupported info element: %s (%d)\n",
get_info_element_string(info_element->id),
info_element->id);
break; break;
} }
@ -1110,7 +1197,9 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element
static int ieee80211_handle_assoc_resp(struct ieee80211_device *ieee, struct ieee80211_assoc_response static int ieee80211_handle_assoc_resp(struct ieee80211_device *ieee, struct ieee80211_assoc_response
*frame, struct ieee80211_rx_stats *stats) *frame, struct ieee80211_rx_stats *stats)
{ {
struct ieee80211_network network_resp; struct ieee80211_network network_resp = {
.ibss_dfs = NULL,
};
struct ieee80211_network *network = &network_resp; struct ieee80211_network *network = &network_resp;
struct net_device *dev = ieee->dev; struct net_device *dev = ieee->dev;
@ -1253,6 +1342,9 @@ static void update_network(struct ieee80211_network *dst,
int qos_active; int qos_active;
u8 old_param; u8 old_param;
ieee80211_network_reset(dst);
dst->ibss_dfs = src->ibss_dfs;
memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats));
dst->capability = src->capability; dst->capability = src->capability;
memcpy(dst->rates, src->rates, src->rates_len); memcpy(dst->rates, src->rates, src->rates_len);
@ -1269,6 +1361,7 @@ static void update_network(struct ieee80211_network *dst,
dst->listen_interval = src->listen_interval; dst->listen_interval = src->listen_interval;
dst->atim_window = src->atim_window; dst->atim_window = src->atim_window;
dst->erp_value = src->erp_value; dst->erp_value = src->erp_value;
dst->tim = src->tim;
memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len);
dst->wpa_ie_len = src->wpa_ie_len; dst->wpa_ie_len = src->wpa_ie_len;
@ -1313,7 +1406,9 @@ static void ieee80211_process_probe_response(struct ieee80211_device
*stats) *stats)
{ {
struct net_device *dev = ieee->dev; struct net_device *dev = ieee->dev;
struct ieee80211_network network; struct ieee80211_network network = {
.ibss_dfs = NULL,
};
struct ieee80211_network *target; struct ieee80211_network *target;
struct ieee80211_network *oldest = NULL; struct ieee80211_network *oldest = NULL;
#ifdef CONFIG_IEEE80211_DEBUG #ifdef CONFIG_IEEE80211_DEBUG
@ -1388,6 +1483,7 @@ static void ieee80211_process_probe_response(struct ieee80211_device
escape_essid(target->ssid, escape_essid(target->ssid,
target->ssid_len), target->ssid_len),
MAC_ARG(target->bssid)); MAC_ARG(target->bssid));
ieee80211_network_reset(target);
} else { } else {
/* Otherwise just pull from the free list */ /* Otherwise just pull from the free list */
target = list_entry(ieee->network_free_list.next, target = list_entry(ieee->network_free_list.next,
@ -1406,6 +1502,7 @@ static void ieee80211_process_probe_response(struct ieee80211_device
"BEACON" : "PROBE RESPONSE"); "BEACON" : "PROBE RESPONSE");
#endif #endif
memcpy(target, &network, sizeof(*target)); memcpy(target, &network, sizeof(*target));
network.ibss_dfs = NULL;
list_add_tail(&target->list, &ieee->network_list); list_add_tail(&target->list, &ieee->network_list);
} else { } else {
IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n",
@ -1417,6 +1514,7 @@ static void ieee80211_process_probe_response(struct ieee80211_device
frame_ctl)) ? frame_ctl)) ?
"BEACON" : "PROBE RESPONSE"); "BEACON" : "PROBE RESPONSE");
update_network(target, &network); update_network(target, &network);
network.ibss_dfs = NULL;
} }
spin_unlock_irqrestore(&ieee->lock, flags); spin_unlock_irqrestore(&ieee->lock, flags);
@ -1501,10 +1599,43 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
header); header);
break; break;
case IEEE80211_STYPE_ACTION:
IEEE80211_DEBUG_MGMT("ACTION\n");
if (ieee->handle_action)
ieee->handle_action(ieee->dev,
(struct ieee80211_action *)
header, stats);
break;
case IEEE80211_STYPE_REASSOC_REQ:
IEEE80211_DEBUG_MGMT("received reassoc (%d)\n",
WLAN_FC_GET_STYPE(le16_to_cpu
(header->frame_ctl)));
IEEE80211_WARNING("%s: IEEE80211_REASSOC_REQ received\n",
ieee->dev->name);
if (ieee->handle_reassoc_request != NULL)
ieee->handle_reassoc_request(ieee->dev,
(struct ieee80211_reassoc_request *)
header);
break;
case IEEE80211_STYPE_ASSOC_REQ:
IEEE80211_DEBUG_MGMT("received assoc (%d)\n",
WLAN_FC_GET_STYPE(le16_to_cpu
(header->frame_ctl)));
IEEE80211_WARNING("%s: IEEE80211_ASSOC_REQ received\n",
ieee->dev->name);
if (ieee->handle_assoc_request != NULL)
ieee->handle_assoc_request(ieee->dev);
break;
case IEEE80211_STYPE_DEAUTH: case IEEE80211_STYPE_DEAUTH:
printk("DEAUTH from AP\n"); IEEE80211_DEBUG_MGMT("DEAUTH\n");
if (ieee->handle_deauth != NULL) if (ieee->handle_deauth != NULL)
ieee->handle_deauth(ieee->dev, (struct ieee80211_auth *) ieee->handle_deauth(ieee->dev,
(struct ieee80211_deauth *)
header); header);
break; break;
default: default:

View File

@ -56,7 +56,18 @@ Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | Frame | fcs |
`--------------------------------------------------| |------' `--------------------------------------------------| |------'
Total: 28 non-data bytes `----.----' Total: 28 non-data bytes `----.----'
| |
.- 'Frame data' expands to <---------------------------' .- 'Frame data' expands, if WEP enabled, to <----------'
|
V
,-----------------------.
Bytes | 4 | 0-2296 | 4 |
|-----|-----------|-----|
Desc. | IV | Encrypted | ICV |
| | Packet | |
`-----| |-----'
`-----.-----'
|
.- 'Encrypted Packet' expands to
| |
V V
,---------------------------------------------------. ,---------------------------------------------------.
@ -65,18 +76,7 @@ Bytes | 1 | 1 | 1 | 3 | 2 | 0-2304 |
Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP | Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP |
| DSAP | SSAP | | | | Packet | | DSAP | SSAP | | | | Packet |
| 0xAA | 0xAA |0x03 (UI)|0x00-00-F8| | | | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8| | |
`-----------------------------------------| | `----------------------------------------------------
Total: 8 non-data bytes `----.----'
|
.- 'IP Packet' expands, if WEP enabled, to <--'
|
V
,-----------------------.
Bytes | 4 | 0-2296 | 4 |
|-----|-----------|-----|
Desc. | IV | Encrypted | ICV |
| | IP Packet | |
`-----------------------'
Total: 8 non-data bytes Total: 8 non-data bytes
802.3 Ethernet Data Frame 802.3 Ethernet Data Frame
@ -470,7 +470,9 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev)
atomic_inc(&crypt->refcnt); atomic_inc(&crypt->refcnt);
if (crypt->ops->build_iv) if (crypt->ops->build_iv)
crypt->ops->build_iv(skb_frag, hdr_len, crypt->ops->build_iv(skb_frag, hdr_len,
crypt->priv); ieee->sec.keys[ieee->sec.active_key],
ieee->sec.key_sizes[ieee->sec.active_key],
crypt->priv);
atomic_dec(&crypt->refcnt); atomic_dec(&crypt->refcnt);
} }

View File

@ -149,9 +149,7 @@ static char *ipw2100_translate_scan(struct ieee80211_device *ieee,
iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID | iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID |
IW_QUAL_LEVEL_INVALID; IW_QUAL_LEVEL_INVALID;
iwe.u.qual.qual = 0; iwe.u.qual.qual = 0;
iwe.u.qual.level = 0;
} else { } else {
iwe.u.qual.level = network->stats.rssi;
if (ieee->perfect_rssi == ieee->worst_rssi) if (ieee->perfect_rssi == ieee->worst_rssi)
iwe.u.qual.qual = 100; iwe.u.qual.qual = 100;
else else
@ -179,6 +177,13 @@ static char *ipw2100_translate_scan(struct ieee80211_device *ieee,
iwe.u.qual.noise = network->stats.noise; iwe.u.qual.noise = network->stats.noise;
} }
if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL)) {
iwe.u.qual.updated |= IW_QUAL_LEVEL_INVALID;
iwe.u.qual.level = 0;
} else {
iwe.u.qual.level = network->stats.signal;
}
start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN); start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN);
iwe.cmd = IWEVCUSTOM; iwe.cmd = IWEVCUSTOM;
@ -229,6 +234,28 @@ static char *ipw2100_translate_scan(struct ieee80211_device *ieee,
if (iwe.u.data.length) if (iwe.u.data.length)
start = iwe_stream_add_point(start, stop, &iwe, custom); start = iwe_stream_add_point(start, stop, &iwe, custom);
/* Add spectrum management information */
iwe.cmd = -1;
p = custom;
p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Channel flags: ");
if (ieee80211_get_channel_flags(ieee, network->channel) &
IEEE80211_CH_INVALID) {
iwe.cmd = IWEVCUSTOM;
p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), "INVALID ");
}
if (ieee80211_get_channel_flags(ieee, network->channel) &
IEEE80211_CH_RADAR_DETECT) {
iwe.cmd = IWEVCUSTOM;
p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), "DFS ");
}
if (iwe.cmd == IWEVCUSTOM) {
iwe.u.data.length = p - custom;
start = iwe_stream_add_point(start, stop, &iwe, custom);
}
return start; return start;
} }
@ -734,9 +761,98 @@ int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee,
return 0; return 0;
} }
int ieee80211_wx_set_auth(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
char *extra)
{
struct ieee80211_device *ieee = netdev_priv(dev);
unsigned long flags;
int err = 0;
spin_lock_irqsave(&ieee->lock, flags);
switch (wrqu->param.flags & IW_AUTH_INDEX) {
case IW_AUTH_WPA_VERSION:
case IW_AUTH_CIPHER_PAIRWISE:
case IW_AUTH_CIPHER_GROUP:
case IW_AUTH_KEY_MGMT:
/*
* Host AP driver does not use these parameters and allows
* wpa_supplicant to control them internally.
*/
break;
case IW_AUTH_TKIP_COUNTERMEASURES:
break; /* FIXME */
case IW_AUTH_DROP_UNENCRYPTED:
ieee->drop_unencrypted = !!wrqu->param.value;
break;
case IW_AUTH_80211_AUTH_ALG:
break; /* FIXME */
case IW_AUTH_WPA_ENABLED:
ieee->privacy_invoked = ieee->wpa_enabled = !!wrqu->param.value;
break;
case IW_AUTH_RX_UNENCRYPTED_EAPOL:
ieee->ieee802_1x = !!wrqu->param.value;
break;
case IW_AUTH_PRIVACY_INVOKED:
ieee->privacy_invoked = !!wrqu->param.value;
break;
default:
err = -EOPNOTSUPP;
break;
}
spin_unlock_irqrestore(&ieee->lock, flags);
return err;
}
int ieee80211_wx_get_auth(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
char *extra)
{
struct ieee80211_device *ieee = netdev_priv(dev);
unsigned long flags;
int err = 0;
spin_lock_irqsave(&ieee->lock, flags);
switch (wrqu->param.flags & IW_AUTH_INDEX) {
case IW_AUTH_WPA_VERSION:
case IW_AUTH_CIPHER_PAIRWISE:
case IW_AUTH_CIPHER_GROUP:
case IW_AUTH_KEY_MGMT:
case IW_AUTH_TKIP_COUNTERMEASURES: /* FIXME */
case IW_AUTH_80211_AUTH_ALG: /* FIXME */
/*
* Host AP driver does not use these parameters and allows
* wpa_supplicant to control them internally.
*/
err = -EOPNOTSUPP;
break;
case IW_AUTH_DROP_UNENCRYPTED:
wrqu->param.value = ieee->drop_unencrypted;
break;
case IW_AUTH_WPA_ENABLED:
wrqu->param.value = ieee->wpa_enabled;
break;
case IW_AUTH_RX_UNENCRYPTED_EAPOL:
wrqu->param.value = ieee->ieee802_1x;
break;
default:
err = -EOPNOTSUPP;
break;
}
spin_unlock_irqrestore(&ieee->lock, flags);
return err;
}
EXPORT_SYMBOL(ieee80211_wx_set_encodeext); EXPORT_SYMBOL(ieee80211_wx_set_encodeext);
EXPORT_SYMBOL(ieee80211_wx_get_encodeext); EXPORT_SYMBOL(ieee80211_wx_get_encodeext);
EXPORT_SYMBOL(ieee80211_wx_get_scan); EXPORT_SYMBOL(ieee80211_wx_get_scan);
EXPORT_SYMBOL(ieee80211_wx_set_encode); EXPORT_SYMBOL(ieee80211_wx_set_encode);
EXPORT_SYMBOL(ieee80211_wx_get_encode); EXPORT_SYMBOL(ieee80211_wx_get_encode);
EXPORT_SYMBOL_GPL(ieee80211_wx_set_auth);
EXPORT_SYMBOL_GPL(ieee80211_wx_get_auth);

View File

@ -84,10 +84,7 @@
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/kmod.h> #include <linux/kmod.h>
#include <linux/audit.h> #include <linux/audit.h>
#include <linux/wireless.h>
#ifdef CONFIG_NET_RADIO
#include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
#endif /* CONFIG_NET_RADIO */
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/unistd.h> #include <asm/unistd.h>
@ -840,11 +837,11 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) { if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
err = dev_ioctl(cmd, argp); err = dev_ioctl(cmd, argp);
} else } else
#ifdef WIRELESS_EXT #ifdef CONFIG_WIRELESS_EXT
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
err = dev_ioctl(cmd, argp); err = dev_ioctl(cmd, argp);
} else } else
#endif /* WIRELESS_EXT */ #endif /* CONFIG_WIRELESS_EXT */
switch (cmd) { switch (cmd) {
case FIOSETOWN: case FIOSETOWN:
case SIOCSPGRP: case SIOCSPGRP: