Commit 388f7ef7 authored by Linus Torvalds's avatar Linus Torvalds

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

parents d5eebf42 560c22fe
...@@ -812,7 +812,7 @@ config SMC91X ...@@ -812,7 +812,7 @@ config SMC91X
tristate "SMC 91C9x/91C1xxx support" tristate "SMC 91C9x/91C1xxx support"
select CRC32 select CRC32
select MII select MII
depends on NET_ETHERNET && (ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH) depends on NET_ETHERNET && (ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH || SOC_AU1X00)
help help
This is a driver for SMC's 91x series of Ethernet chipsets, This is a driver for SMC's 91x series of Ethernet chipsets,
including the SMC91C94 and the SMC91C111. Say Y if you want it including the SMC91C94 and the SMC91C111. Say Y if you want it
......
...@@ -97,6 +97,9 @@ ...@@ -97,6 +97,9 @@
* in the second (and later) nv_open call * in the second (and later) nv_open call
* 0.43: 10 Aug 2005: Add support for tx checksum. * 0.43: 10 Aug 2005: Add support for tx checksum.
* 0.44: 20 Aug 2005: Add support for scatter gather and segmentation. * 0.44: 20 Aug 2005: Add support for scatter gather and segmentation.
* 0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check
* 0.46: 20 Oct 2005: Add irq optimization modes.
* 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan.
* *
* Known bugs: * Known bugs:
* We suspect that on some hardware no TX done interrupts are generated. * We suspect that on some hardware no TX done interrupts are generated.
...@@ -108,7 +111,7 @@ ...@@ -108,7 +111,7 @@
* DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few
* superfluous timer interrupts from the nic. * superfluous timer interrupts from the nic.
*/ */
#define FORCEDETH_VERSION "0.44" #define FORCEDETH_VERSION "0.47"
#define DRV_NAME "forcedeth" #define DRV_NAME "forcedeth"
#include <linux/module.h> #include <linux/module.h>
...@@ -163,7 +166,8 @@ enum { ...@@ -163,7 +166,8 @@ enum {
#define NVREG_IRQ_LINK 0x0040 #define NVREG_IRQ_LINK 0x0040
#define NVREG_IRQ_TX_ERROR 0x0080 #define NVREG_IRQ_TX_ERROR 0x0080
#define NVREG_IRQ_TX1 0x0100 #define NVREG_IRQ_TX1 0x0100
#define NVREG_IRQMASK_WANTED 0x00df #define NVREG_IRQMASK_THROUGHPUT 0x00df
#define NVREG_IRQMASK_CPU 0x0040
#define NVREG_IRQ_UNKNOWN (~(NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR| \ #define NVREG_IRQ_UNKNOWN (~(NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR| \
NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX_ERROR| \ NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX_ERROR| \
...@@ -177,7 +181,8 @@ enum { ...@@ -177,7 +181,8 @@ enum {
* NVREG_POLL_DEFAULT=97 would result in an interval length of 1 ms * NVREG_POLL_DEFAULT=97 would result in an interval length of 1 ms
*/ */
NvRegPollingInterval = 0x00c, NvRegPollingInterval = 0x00c,
#define NVREG_POLL_DEFAULT 970 #define NVREG_POLL_DEFAULT_THROUGHPUT 970
#define NVREG_POLL_DEFAULT_CPU 13
NvRegMisc1 = 0x080, NvRegMisc1 = 0x080,
#define NVREG_MISC1_HD 0x02 #define NVREG_MISC1_HD 0x02
#define NVREG_MISC1_FORCE 0x3b0f3c #define NVREG_MISC1_FORCE 0x3b0f3c
...@@ -538,6 +543,25 @@ struct fe_priv { ...@@ -538,6 +543,25 @@ struct fe_priv {
*/ */
static int max_interrupt_work = 5; static int max_interrupt_work = 5;
/*
* Optimization can be either throuput mode or cpu mode
*
* Throughput Mode: Every tx and rx packet will generate an interrupt.
* CPU Mode: Interrupts are controlled by a timer.
*/
#define NV_OPTIMIZATION_MODE_THROUGHPUT 0
#define NV_OPTIMIZATION_MODE_CPU 1
static int optimization_mode = NV_OPTIMIZATION_MODE_THROUGHPUT;
/*
* Poll interval for timer irq
*
* This interval determines how frequent an interrupt is generated.
* The is value is determined by [(time_in_micro_secs * 100) / (2^10)]
* Min = 0, and Max = 65535
*/
static int poll_interval = -1;
static inline struct fe_priv *get_nvpriv(struct net_device *dev) static inline struct fe_priv *get_nvpriv(struct net_device *dev)
{ {
return netdev_priv(dev); return netdev_priv(dev);
...@@ -1328,6 +1352,7 @@ static void nv_rx_process(struct net_device *dev) ...@@ -1328,6 +1352,7 @@ static void nv_rx_process(struct net_device *dev)
if (!(Flags & NV_RX_DESCRIPTORVALID)) if (!(Flags & NV_RX_DESCRIPTORVALID))
goto next_pkt; goto next_pkt;
if (Flags & NV_RX_ERROR) {
if (Flags & NV_RX_MISSEDFRAME) { if (Flags & NV_RX_MISSEDFRAME) {
np->stats.rx_missed_errors++; np->stats.rx_missed_errors++;
np->stats.rx_errors++; np->stats.rx_errors++;
...@@ -1360,10 +1385,12 @@ static void nv_rx_process(struct net_device *dev) ...@@ -1360,10 +1385,12 @@ static void nv_rx_process(struct net_device *dev)
len--; len--;
} }
} }
}
} else { } else {
if (!(Flags & NV_RX2_DESCRIPTORVALID)) if (!(Flags & NV_RX2_DESCRIPTORVALID))
goto next_pkt; goto next_pkt;
if (Flags & NV_RX2_ERROR) {
if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) { if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) {
np->stats.rx_errors++; np->stats.rx_errors++;
goto next_pkt; goto next_pkt;
...@@ -1391,6 +1418,7 @@ static void nv_rx_process(struct net_device *dev) ...@@ -1391,6 +1418,7 @@ static void nv_rx_process(struct net_device *dev)
len--; len--;
} }
} }
}
Flags &= NV_RX2_CHECKSUMMASK; Flags &= NV_RX2_CHECKSUMMASK;
if (Flags == NV_RX2_CHECKSUMOK1 || if (Flags == NV_RX2_CHECKSUMOK1 ||
Flags == NV_RX2_CHECKSUMOK2 || Flags == NV_RX2_CHECKSUMOK2 ||
...@@ -1612,6 +1640,17 @@ static void nv_set_multicast(struct net_device *dev) ...@@ -1612,6 +1640,17 @@ static void nv_set_multicast(struct net_device *dev)
spin_unlock_irq(&np->lock); spin_unlock_irq(&np->lock);
} }
/**
* nv_update_linkspeed: Setup the MAC according to the link partner
* @dev: Network device to be configured
*
* The function queries the PHY and checks if there is a link partner.
* If yes, then it sets up the MAC accordingly. Otherwise, the MAC is
* set to 10 MBit HD.
*
* The function returns 0 if there is no link partner and 1 if there is
* a good link partner.
*/
static int nv_update_linkspeed(struct net_device *dev) static int nv_update_linkspeed(struct net_device *dev)
{ {
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
...@@ -1751,13 +1790,11 @@ static int nv_update_linkspeed(struct net_device *dev) ...@@ -1751,13 +1790,11 @@ static int nv_update_linkspeed(struct net_device *dev)
static void nv_linkchange(struct net_device *dev) static void nv_linkchange(struct net_device *dev)
{ {
if (nv_update_linkspeed(dev)) { if (nv_update_linkspeed(dev)) {
if (netif_carrier_ok(dev)) { if (!netif_carrier_ok(dev)) {
nv_stop_rx(dev);
} else {
netif_carrier_on(dev); netif_carrier_on(dev);
printk(KERN_INFO "%s: link up.\n", dev->name); printk(KERN_INFO "%s: link up.\n", dev->name);
}
nv_start_rx(dev); nv_start_rx(dev);
}
} else { } else {
if (netif_carrier_ok(dev)) { if (netif_carrier_ok(dev)) {
netif_carrier_off(dev); netif_carrier_off(dev);
...@@ -1799,13 +1836,10 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs) ...@@ -1799,13 +1836,10 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs)
if (!(events & np->irqmask)) if (!(events & np->irqmask))
break; break;
if (events & (NVREG_IRQ_TX1|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_ERROR|NVREG_IRQ_TX_ERR)) {
spin_lock(&np->lock); spin_lock(&np->lock);
nv_tx_done(dev); nv_tx_done(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
}
if (events & (NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF)) {
nv_rx_process(dev); nv_rx_process(dev);
if (nv_alloc_rx(dev)) { if (nv_alloc_rx(dev)) {
spin_lock(&np->lock); spin_lock(&np->lock);
...@@ -1813,7 +1847,6 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs) ...@@ -1813,7 +1847,6 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs)
mod_timer(&np->oom_kick, jiffies + OOM_REFILL); mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
spin_unlock(&np->lock); spin_unlock(&np->lock);
} }
}
if (events & NVREG_IRQ_LINK) { if (events & NVREG_IRQ_LINK) {
spin_lock(&np->lock); spin_lock(&np->lock);
...@@ -2216,7 +2249,14 @@ static int nv_open(struct net_device *dev) ...@@ -2216,7 +2249,14 @@ static int nv_open(struct net_device *dev)
writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed); writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed);
writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1); writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1);
writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2); writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2);
writel(NVREG_POLL_DEFAULT, base + NvRegPollingInterval); if (poll_interval == -1) {
if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT)
writel(NVREG_POLL_DEFAULT_THROUGHPUT, base + NvRegPollingInterval);
else
writel(NVREG_POLL_DEFAULT_CPU, base + NvRegPollingInterval);
}
else
writel(poll_interval & 0xFFFF, base + NvRegPollingInterval);
writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6); writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6);
writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID|NVREG_ADAPTCTL_RUNNING, writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID|NVREG_ADAPTCTL_RUNNING,
base + NvRegAdapterControl); base + NvRegAdapterControl);
...@@ -2501,7 +2541,11 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i ...@@ -2501,7 +2541,11 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
} else { } else {
np->tx_flags = NV_TX2_VALID; np->tx_flags = NV_TX2_VALID;
} }
np->irqmask = NVREG_IRQMASK_WANTED; if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT)
np->irqmask = NVREG_IRQMASK_THROUGHPUT;
else
np->irqmask = NVREG_IRQMASK_CPU;
if (id->driver_data & DEV_NEED_TIMERIRQ) if (id->driver_data & DEV_NEED_TIMERIRQ)
np->irqmask |= NVREG_IRQ_TIMER; np->irqmask |= NVREG_IRQ_TIMER;
if (id->driver_data & DEV_NEED_LINKTIMER) { if (id->driver_data & DEV_NEED_LINKTIMER) {
...@@ -2514,16 +2558,17 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i ...@@ -2514,16 +2558,17 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
} }
/* find a suitable phy */ /* find a suitable phy */
for (i = 1; i < 32; i++) { for (i = 1; i <= 32; i++) {
int id1, id2; int id1, id2;
int phyaddr = i & 0x1F;
spin_lock_irq(&np->lock); spin_lock_irq(&np->lock);
id1 = mii_rw(dev, i, MII_PHYSID1, MII_READ); id1 = mii_rw(dev, phyaddr, MII_PHYSID1, MII_READ);
spin_unlock_irq(&np->lock); spin_unlock_irq(&np->lock);
if (id1 < 0 || id1 == 0xffff) if (id1 < 0 || id1 == 0xffff)
continue; continue;
spin_lock_irq(&np->lock); spin_lock_irq(&np->lock);
id2 = mii_rw(dev, i, MII_PHYSID2, MII_READ); id2 = mii_rw(dev, phyaddr, MII_PHYSID2, MII_READ);
spin_unlock_irq(&np->lock); spin_unlock_irq(&np->lock);
if (id2 < 0 || id2 == 0xffff) if (id2 < 0 || id2 == 0xffff)
continue; continue;
...@@ -2531,23 +2576,19 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i ...@@ -2531,23 +2576,19 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
id1 = (id1 & PHYID1_OUI_MASK) << PHYID1_OUI_SHFT; id1 = (id1 & PHYID1_OUI_MASK) << PHYID1_OUI_SHFT;
id2 = (id2 & PHYID2_OUI_MASK) >> PHYID2_OUI_SHFT; id2 = (id2 & PHYID2_OUI_MASK) >> PHYID2_OUI_SHFT;
dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n", dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n",
pci_name(pci_dev), id1, id2, i); pci_name(pci_dev), id1, id2, phyaddr);
np->phyaddr = i; np->phyaddr = phyaddr;
np->phy_oui = id1 | id2; np->phy_oui = id1 | id2;
break; break;
} }
if (i == 32) { if (i == 33) {
/* PHY in isolate mode? No phy attached and user wants to
* test loopback? Very odd, but can be correct.
*/
printk(KERN_INFO "%s: open: Could not find a valid PHY.\n", printk(KERN_INFO "%s: open: Could not find a valid PHY.\n",
pci_name(pci_dev)); pci_name(pci_dev));
goto out_freering;
} }
if (i != 32) {
/* reset it */ /* reset it */
phy_init(dev); phy_init(dev);
}
/* set default link speed settings */ /* set default link speed settings */
np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
...@@ -2689,6 +2730,10 @@ static void __exit exit_nic(void) ...@@ -2689,6 +2730,10 @@ static void __exit exit_nic(void)
module_param(max_interrupt_work, int, 0); module_param(max_interrupt_work, int, 0);
MODULE_PARM_DESC(max_interrupt_work, "forcedeth maximum events handled per interrupt"); MODULE_PARM_DESC(max_interrupt_work, "forcedeth maximum events handled per interrupt");
module_param(optimization_mode, int, 0);
MODULE_PARM_DESC(optimization_mode, "In throughput mode (0), every tx & rx packet will generate an interrupt. In CPU mode (1), interrupts are controlled by a timer.");
module_param(poll_interval, int, 0);
MODULE_PARM_DESC(poll_interval, "Interval determines how frequent timer interrupt is generated by [(time_in_micro_secs * 100) / (2^10)]. Min is 0 and Max is 65535.");
MODULE_AUTHOR("Manfred Spraul <manfred@colorfullife.com>"); MODULE_AUTHOR("Manfred Spraul <manfred@colorfullife.com>");
MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver"); MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver");
......
...@@ -133,7 +133,7 @@ int gfar_mdio_probe(struct device *dev) ...@@ -133,7 +133,7 @@ int gfar_mdio_probe(struct device *dev)
if (NULL == dev) if (NULL == dev)
return -EINVAL; return -EINVAL;
new_bus = kmalloc(sizeof(struct mii_bus), GFP_KERNEL); new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
if (NULL == new_bus) if (NULL == new_bus)
return -ENOMEM; return -ENOMEM;
......
...@@ -72,8 +72,6 @@ static void dump_tx_desc(int dbg_lvl, struct net_device *dev, int i); ...@@ -72,8 +72,6 @@ static void dump_tx_desc(int dbg_lvl, struct net_device *dev, int i);
static void dump_rx_desc(int dbg_lvl, struct net_device *dev, int i); static void dump_rx_desc(int dbg_lvl, struct net_device *dev, int i);
static void dump_skb(int dbg_lvl, struct net_device *dev, static void dump_skb(int dbg_lvl, struct net_device *dev,
struct sk_buff *skb); struct sk_buff *skb);
static void dump_hw_addr(int dbg_lvl, struct net_device *dev,
const char* pfx, unsigned char* addr_str);
static void update_stats(struct gt96100_private *gp); static void update_stats(struct gt96100_private *gp);
static void abort(struct net_device *dev, u32 abort_bits); static void abort(struct net_device *dev, u32 abort_bits);
static void hard_stop(struct net_device *dev); static void hard_stop(struct net_device *dev);
...@@ -334,13 +332,13 @@ dump_MII(int dbg_lvl, struct net_device *dev) ...@@ -334,13 +332,13 @@ dump_MII(int dbg_lvl, struct net_device *dev)
static void static void
dump_hw_addr(int dbg_lvl, struct net_device *dev, const char* pfx, dump_hw_addr(int dbg_lvl, struct net_device *dev, const char* pfx,
unsigned char* addr_str) const char* func, unsigned char* addr_str)
{ {
int i; int i;
char buf[100], octet[5]; char buf[100], octet[5];
if (dbg_lvl <= GT96100_DEBUG) { if (dbg_lvl <= GT96100_DEBUG) {
strcpy(buf, pfx); sprintf(buf, pfx, func);
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
sprintf(octet, "%2.2x%s", sprintf(octet, "%2.2x%s",
addr_str[i], i<5 ? ":" : "\n"); addr_str[i], i<5 ? ":" : "\n");
...@@ -708,7 +706,7 @@ static int __init gt96100_probe1(struct pci_dev *pci, int port_num) ...@@ -708,7 +706,7 @@ static int __init gt96100_probe1(struct pci_dev *pci, int port_num)
info("%s found at 0x%x, irq %d\n", info("%s found at 0x%x, irq %d\n",
chip_name(gp->chip_rev), gtif->iobase, gtif->irq); chip_name(gp->chip_rev), gtif->iobase, gtif->irq);
dump_hw_addr(0, dev, "HW Address ", dev->dev_addr); dump_hw_addr(0, dev, "%s: HW Address ", __FUNCTION__, dev->dev_addr);
info("%s chip revision=%d\n", chip_name(gp->chip_rev), gp->chip_rev); info("%s chip revision=%d\n", chip_name(gp->chip_rev), gp->chip_rev);
info("%s ethernet port %d\n", chip_name(gp->chip_rev), gp->port_num); info("%s ethernet port %d\n", chip_name(gp->chip_rev), gp->port_num);
info("external PHY ID1=0x%04x, ID2=0x%04x\n", phy_id1, phy_id2); info("external PHY ID1=0x%04x, ID2=0x%04x\n", phy_id1, phy_id2);
...@@ -1488,7 +1486,7 @@ gt96100_set_rx_mode(struct net_device *dev) ...@@ -1488,7 +1486,7 @@ gt96100_set_rx_mode(struct net_device *dev)
gt96100_add_hash_entry(dev, dev->dev_addr); gt96100_add_hash_entry(dev, dev->dev_addr);
for (mcptr = dev->mc_list; mcptr; mcptr = mcptr->next) { for (mcptr = dev->mc_list; mcptr; mcptr = mcptr->next) {
dump_hw_addr(2, dev, __FUNCTION__ ": addr=", dump_hw_addr(2, dev, "%s: addr=", __FUNCTION__,
mcptr->dmi_addr); mcptr->dmi_addr);
gt96100_add_hash_entry(dev, mcptr->dmi_addr); gt96100_add_hash_entry(dev, mcptr->dmi_addr);
} }
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
#include "ibmveth.h" #include "ibmveth.h"
#define DEBUG 1 #undef DEBUG
#define ibmveth_printk(fmt, args...) \ #define ibmveth_printk(fmt, args...) \
printk(KERN_INFO "%s: " fmt, __FILE__, ## args) printk(KERN_INFO "%s: " fmt, __FILE__, ## args)
......
This diff is collapsed.
...@@ -289,6 +289,38 @@ static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l) ...@@ -289,6 +289,38 @@ static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l)
#define RPC_LSA_DEFAULT RPC_LED_TX_RX #define RPC_LSA_DEFAULT RPC_LED_TX_RX
#define RPC_LSB_DEFAULT RPC_LED_100_10 #define RPC_LSB_DEFAULT RPC_LED_100_10
#elif defined(CONFIG_SOC_AU1X00)
#include <au1xxx.h>
/* We can only do 16-bit reads and writes in the static memory space. */
#define SMC_CAN_USE_8BIT 0
#define SMC_CAN_USE_16BIT 1
#define SMC_CAN_USE_32BIT 0
#define SMC_IO_SHIFT 0
#define SMC_NOWAIT 1
#define SMC_inw(a, r) au_readw((unsigned long)((a) + (r)))
#define SMC_insw(a, r, p, l) \
do { \
unsigned long _a = (unsigned long)((a) + (r)); \
int _l = (l); \
u16 *_p = (u16 *)(p); \
while (_l-- > 0) \
*_p++ = au_readw(_a); \
} while(0)
#define SMC_outw(v, a, r) au_writew(v, (unsigned long)((a) + (r)))
#define SMC_outsw(a, r, p, l) \
do { \
unsigned long _a = (unsigned long)((a) + (r)); \
int _l = (l); \
const u16 *_p = (const u16 *)(p); \
while (_l-- > 0) \
au_writew(*_p++ , _a); \
} while(0)
#define set_irq_type(irq, type) do {} while (0)
#else #else
#define SMC_CAN_USE_8BIT 1 #define SMC_CAN_USE_8BIT 1
......
...@@ -330,7 +330,7 @@ config PCI_HERMES ...@@ -330,7 +330,7 @@ config PCI_HERMES
config ATMEL config ATMEL
tristate "Atmel at76c50x chipset 802.11b support" tristate "Atmel at76c50x chipset 802.11b support"
depends on NET_RADIO && EXPERIMENTAL depends on NET_RADIO
select FW_LOADER select FW_LOADER
select CRC32 select CRC32
---help--- ---help---
......
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
#include "atmel.h" #include "atmel.h"
#define DRIVER_MAJOR 0 #define DRIVER_MAJOR 0
#define DRIVER_MINOR 96 #define DRIVER_MINOR 98
MODULE_AUTHOR("Simon Kelley"); MODULE_AUTHOR("Simon Kelley");
MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards."); MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards.");
...@@ -1504,7 +1504,7 @@ static int atmel_read_proc(char *page, char **start, off_t off, ...@@ -1504,7 +1504,7 @@ static int atmel_read_proc(char *page, char **start, off_t off,
return len; return len;
} }
struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWType fw_type, struct net_device *init_atmel_card( unsigned short irq, unsigned long port, const AtmelFWType fw_type,
struct device *sys_dev, int (*card_present)(void *), void *card) struct device *sys_dev, int (*card_present)(void *), void *card)
{ {
struct net_device *dev; struct net_device *dev;
...@@ -1605,8 +1605,8 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT ...@@ -1605,8 +1605,8 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT
goto err_out_free; goto err_out_free;
} }
if (priv->bus_type == BUS_TYPE_PCI && if (!request_region(dev->base_addr, 32,
!request_region( dev->base_addr, 64, dev->name )) { priv->bus_type == BUS_TYPE_PCCARD ? "atmel_cs" : "atmel_pci")) {
goto err_out_irq; goto err_out_irq;
} }
...@@ -1622,15 +1622,16 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT ...@@ -1622,15 +1622,16 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT
create_proc_read_entry ("driver/atmel", 0, NULL, atmel_read_proc, priv); create_proc_read_entry ("driver/atmel", 0, NULL, atmel_read_proc, priv);
printk(KERN_INFO "%s: Atmel at76c50x wireless. Version %d.%d simon@thekelleys.org.uk\n", printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
dev->name, DRIVER_MAJOR, DRIVER_MINOR); dev->name, DRIVER_MAJOR, DRIVER_MINOR,
dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] );
SET_MODULE_OWNER(dev); SET_MODULE_OWNER(dev);
return dev; return dev;
err_out_res: err_out_res:
if (priv->bus_type == BUS_TYPE_PCI) release_region( dev->base_addr, 32);
release_region( dev->base_addr, 64 );
err_out_irq: err_out_irq:
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
err_out_free: err_out_free:
...@@ -1640,7 +1641,7 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT ...@@ -1640,7 +1641,7 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT
EXPORT_SYMBOL(init_atmel_card); EXPORT_SYMBOL(init_atmel_card);
void stop_atmel_card(struct net_device *dev, int freeres) void stop_atmel_card(struct net_device *dev)
{ {
struct atmel_private *priv = netdev_priv(dev); struct atmel_private *priv = netdev_priv(dev);
...@@ -1654,10 +1655,7 @@ void stop_atmel_card(struct net_device *dev, int freeres) ...@@ -1654,10 +1655,7 @@ void stop_atmel_card(struct net_device *dev, int freeres)
remove_proc_entry("driver/atmel", NULL); remove_proc_entry("driver/atmel", NULL);
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
kfree(priv->firmware); kfree(priv->firmware);
if (freeres) { release_region(dev->base_addr, 32);
/* PCMCIA frees this stuff, so only for PCI */
release_region(dev->base_addr, 64);
}
free_netdev(dev); free_netdev(dev);
} }
...@@ -1827,11 +1825,12 @@ static int atmel_get_encode(struct net_device *dev, ...@@ -1827,11 +1825,12 @@ static int atmel_get_encode(struct net_device *dev,
if (!priv->wep_is_on) if (!priv->wep_is_on)
dwrq->flags = IW_ENCODE_DISABLED; dwrq->flags = IW_ENCODE_DISABLED;
else if (priv->exclude_unencrypted) else {
if (priv->exclude_unencrypted)
dwrq->flags = IW_ENCODE_RESTRICTED; dwrq->flags = IW_ENCODE_RESTRICTED;
else else
dwrq->flags = IW_ENCODE_OPEN; dwrq->flags = IW_ENCODE_OPEN;
}
/* Which key do we want ? -1 -> tx index */ /* Which key do we want ? -1 -> tx index */
if (index < 0 || index >= 4) if (index < 0 || index >= 4)
index = priv->default_key; index = priv->default_key;
...@@ -2646,7 +2645,7 @@ static void handle_beacon_probe(struct atmel_private *priv, u16 capability, u8 c ...@@ -2646,7 +2645,7 @@ static void handle_beacon_probe(struct atmel_private *priv, u16 capability, u8 c
} }
static void send_authentication_request(struct atmel_private *priv, u8 *challenge, int challenge_len) static void send_authentication_request(struct atmel_private *priv, u16 system, u8 *challenge, int challenge_len)
{ {
struct ieee80211_hdr_4addr header; struct ieee80211_hdr_4addr header;
struct auth_body auth; struct auth_body auth;
...@@ -2658,14 +2657,11 @@ static void send_authentication_request(struct atmel_private *priv, u8 *challeng ...@@ -2658,14 +2657,11 @@ static void send_authentication_request(struct atmel_private *priv, u8 *challeng
memcpy(header.addr2, priv->dev->dev_addr, 6); memcpy(header.addr2, priv->dev->dev_addr, 6);
memcpy(header.addr3, priv->CurrentBSSID, 6); memcpy(header.addr3, priv->CurrentBSSID, 6);
if (priv->wep_is_on) { if (priv->wep_is_on && priv->CurrentAuthentTransactionSeqNum != 1)
auth.alg = cpu_to_le16(C80211_MGMT_AAN_SHAREDKEY);
/* no WEP for authentication frames with TrSeqNo 1 */ /* no WEP for authentication frames with TrSeqNo 1 */
if (priv->CurrentAuthentTransactionSeqNum != 1)
header.frame_ctl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); header.frame_ctl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
} else {
auth.alg = cpu_to_le16(C80211_MGMT_AAN_OPENSYSTEM); auth.alg = cpu_to_le16(system);
}
auth.status = 0; auth.status = 0;
auth.trans_seq = cpu_to_le16(priv->CurrentAuthentTransactionSeqNum); auth.trans_seq = cpu_to_le16(priv->CurrentAuthentTransactionSeqNum);
...@@ -2834,6 +2830,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) ...@@ -2834,6 +2830,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
struct auth_body *auth = (struct auth_body *)priv->rx_buf; struct auth_body *auth = (struct auth_body *)priv->rx_buf;
u16 status = le16_to_cpu(auth->status); u16 status = le16_to_cpu(auth->status);
u16 trans_seq_no = le16_to_cpu(auth->trans_seq); u16 trans_seq_no = le16_to_cpu(auth->trans_seq);
u16 system = le16_to_cpu(auth->alg);
if (status == C80211_MGMT_SC_Success && !priv->wep_is_on) { if (status == C80211_MGMT_SC_Success && !priv->wep_is_on) {
/* no WEP */ /* no WEP */
...@@ -2855,7 +2852,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) ...@@ -2855,7 +2852,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
if (trans_seq_no == 0x0002 && if (trans_seq_no == 0x0002 &&
auth->el_id == C80211_MGMT_ElementID_ChallengeText) { auth->el_id == C80211_MGMT_ElementID_ChallengeText) {
send_authentication_request(priv, auth->chall_text, auth->chall_text_len); send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len);
return; return;
} }
...@@ -2872,7 +2869,12 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) ...@@ -2872,7 +2869,12 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
} }
} }
if (status == C80211_MGMT_SC_AuthAlgNotSupported && priv->connect_to_any_BSS) { if (status == C80211_MGMT_SC_AuthAlgNotSupported) {
/* Do opensystem first, then try sharedkey */
if (system == C80211_MGMT_AAN_OPENSYSTEM) {
priv->CurrentAuthentTransactionSeqNum = 0x001;
send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0);
} else if (priv->connect_to_any_BSS) {
int bss_index; int bss_index;
priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80;
...@@ -2882,6 +2884,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) ...@@ -2882,6 +2884,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
return; return;
} }
} }
}
priv->AuthenticationRequestRetryCnt = 0; priv->AuthenticationRequestRetryCnt = 0;
...@@ -3205,7 +3208,7 @@ static void atmel_management_timer(u_long a) ...@@ -3205,7 +3208,7 @@ static void atmel_management_timer(u_long a)
priv->AuthenticationRequestRetryCnt++; priv->AuthenticationRequestRetryCnt++;
priv->CurrentAuthentTransactionSeqNum = 0x0001; priv->CurrentAuthentTransactionSeqNum = 0x0001;
mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
send_authentication_request(priv, NULL, 0); send_authentication_request(priv, C80211_MGMT_AAN_OPENSYSTEM, NULL, 0);
} }
break; break;
...@@ -3312,7 +3315,7 @@ static void atmel_command_irq(struct atmel_private *priv) ...@@ -3312,7 +3315,7 @@ static void atmel_command_irq(struct atmel_private *priv)
mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
priv->CurrentAuthentTransactionSeqNum = 0x0001; priv->CurrentAuthentTransactionSeqNum = 0x0001;
send_authentication_request(priv, NULL, 0); send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0);
} }
return; return;
} }
...@@ -3482,11 +3485,6 @@ static int probe_atmel_card(struct net_device *dev) ...@@ -3482,11 +3485,6 @@ static int probe_atmel_card(struct net_device *dev)
printk(KERN_ALERT "%s: *** Invalid MAC address. UPGRADE Firmware ****\n", dev->name); printk(KERN_ALERT "%s: *** Invalid MAC address. UPGRADE Firmware ****\n", dev->name);
memcpy(dev->dev_addr, default_mac, 6); memcpy(dev->dev_addr, default_mac, 6);
} }
printk(KERN_INFO "%s: MAC address %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
dev->name,
dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] );
} }
return rc; return rc;
......
...@@ -35,9 +35,9 @@ typedef enum { ...@@ -35,9 +35,9 @@ typedef enum {
ATMEL_FW_TYPE_506 ATMEL_FW_TYPE_506
} AtmelFWType; } AtmelFWType;
struct net_device *init_atmel_card(unsigned short, int, const AtmelFWType, struct device *, struct net_device *init_atmel_card(unsigned short, unsigned long, const AtmelFWType, struct device *,
int (*present_func)(void *), void * ); int (*present_func)(void *), void * );
void stop_atmel_card( struct net_device *, int ); void stop_atmel_card( struct net_device *);
int atmel_open( struct net_device * ); int atmel_open( struct net_device * );
#endif #endif
This diff is collapsed.
...@@ -72,7 +72,7 @@ static int __devinit atmel_pci_probe(struct pci_dev *pdev, ...@@ -72,7 +72,7 @@ static int __devinit atmel_pci_probe(struct pci_dev *pdev,
static void __devexit atmel_pci_remove(struct pci_dev *pdev) static void __devexit atmel_pci_remove(struct pci_dev *pdev)
{ {
stop_atmel_card(pci_get_drvdata(pdev), 1); stop_atmel_card(pci_get_drvdata(pdev));
} }
static int __init atmel_init_module(void) static int __init atmel_init_module(void)
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Author(s): Original Code written by * Author(s): Original Code written by
* DJ Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) * DJ Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
* Rewritten by * Rewritten by
* Frank Pavlic (pavlic@de.ibm.com) and * Frank Pavlic (fpavlic@de.ibm.com) and
* Martin Schwidefsky <schwidefsky@de.ibm.com> * Martin Schwidefsky <schwidefsky@de.ibm.com>
* *
* $Revision: 1.99 $ $Date: 2005/05/11 08:10:17 $ * $Revision: 1.99 $ $Date: 2005/05/11 08:10:17 $
...@@ -2342,6 +2342,6 @@ __exit lcs_cleanup_module(void) ...@@ -2342,6 +2342,6 @@ __exit lcs_cleanup_module(void)
module_init(lcs_init_module); module_init(lcs_init_module);
module_exit(lcs_cleanup_module); module_exit(lcs_cleanup_module);
MODULE_AUTHOR("Frank Pavlic <pavlic@de.ibm.com>"); MODULE_AUTHOR("Frank Pavlic <fpavlic@de.ibm.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/trdevice.h> #include <linux/trdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/ctype.h>
#include <net/ipv6.h> #include <net/ipv6.h>
#include <linux/in6.h> #include <linux/in6.h>
...@@ -24,7 +25,7 @@ ...@@ -24,7 +25,7 @@
#include "qeth_mpc.h" #include "qeth_mpc.h"
#define VERSION_QETH_H "$Revision: 1.142 $" #define VERSION_QETH_H "$Revision: 1.152 $"
#ifdef CONFIG_QETH_IPV6 #ifdef CONFIG_QETH_IPV6
#define QETH_VERSION_IPV6 ":IPv6" #define QETH_VERSION_IPV6 ":IPv6"
...@@ -718,8 +719,6 @@ struct qeth_reply { ...@@ -718,8 +719,6 @@ struct qeth_reply {
atomic_t refcnt; atomic_t refcnt;
}; };
#define QETH_BROADCAST_WITH_ECHO 1
#define QETH_BROADCAST_WITHOUT_ECHO 2
struct qeth_card_blkt { struct qeth_card_blkt {
int time_total; int time_total;
...@@ -727,8 +726,10 @@ struct qeth_card_blkt { ...@@ -727,8 +726,10 @@ struct qeth_card_blkt {
int inter_packet_jumbo; int inter_packet_jumbo;
}; };
#define QETH_BROADCAST_WITH_ECHO 0x01
#define QETH_BROADCAST_WITHOUT_ECHO 0x02
#define QETH_LAYER2_MAC_READ 0x01
#define QETH_LAYER2_MAC_REGISTERED 0x02
struct qeth_card_info { struct qeth_card_info {
unsigned short unit_addr2; unsigned short unit_addr2;
unsigned short cula; unsigned short cula;
...@@ -736,7 +737,7 @@ struct qeth_card_info { ...@@ -736,7 +737,7 @@ struct qeth_card_info {
__u16 func_level; __u16 func_level;
char mcl_level[QETH_MCL_LENGTH + 1]; char mcl_level[QETH_MCL_LENGTH + 1];
int guestlan; int guestlan;
int layer2_mac_registered; int mac_bits;
int portname_required; int portname_required;
int portno; int portno;
char portname[9]; char portname[9];
...@@ -749,6 +750,7 @@ struct qeth_card_info { ...@@ -749,6 +750,7 @@ struct qeth_card_info {
int unique_id; int unique_id;
struct qeth_card_blkt blkt; struct qeth_card_blkt blkt;
__u32 csum_mask; __u32 csum_mask;
enum qeth_ipa_promisc_modes promisc_mode;
}; };
struct qeth_card_options { struct qeth_card_options {
...@@ -775,6 +777,7 @@ struct qeth_card_options { ...@@ -775,6 +777,7 @@ struct qeth_card_options {
enum qeth_threads { enum qeth_threads {
QETH_SET_IP_THREAD = 1, QETH_SET_IP_THREAD = 1,
QETH_RECOVER_THREAD = 2, QETH_RECOVER_THREAD = 2,
QETH_SET_PROMISC_MODE_THREAD = 4,
}; };
struct qeth_osn_info { struct qeth_osn_info {
...@@ -1074,6 +1077,26 @@ qeth_get_qdio_q_format(struct qeth_card *card) ...@@ -1074,6 +1077,26 @@ qeth_get_qdio_q_format(struct qeth_card *card)
} }
} }
static inline int
qeth_isdigit(char * buf)
{
while (*buf) {
if (!isdigit(*buf++))
return 0;
}
return 1;
}
static inline int
qeth_isxdigit(char * buf)
{
while (*buf) {
if (!isxdigit(*buf++))
return 0;
}
return 1;
}
static inline void static inline void
qeth_ipaddr4_to_string(const __u8 *addr, char *buf) qeth_ipaddr4_to_string(const __u8 *addr, char *buf)
{ {
...@@ -1090,18 +1113,27 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr) ...@@ -1090,18 +1113,27 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr)
int i; int i;
start = buf; start = buf;
for (i = 0; i < 3; i++) { for (i = 0; i < 4; i++) {
if (!(end = strchr(start, '.'))) if (i == 3) {
return -EINVAL; end = strchr(start,0xa);
if (end)
len = end - start;
else
len = strlen(start);
}
else {
end = strchr(start, '.');
len = end - start; len = end - start;
}
if ((len <= 0) || (len > 3))
return -EINVAL;
memset(abuf, 0, 4); memset(abuf, 0, 4);
strncpy(abuf, start, len); strncpy(abuf, start, len);
if (!qeth_isdigit(abuf))
return -EINVAL;
addr[i] = simple_strtoul(abuf, &tmp, 10); addr[i] = simple_strtoul(abuf, &tmp, 10);
start = end + 1; start = end + 1;
} }
memset(abuf, 0, 4);
strcpy(abuf, start);
addr[3] = simple_strtoul(abuf, &tmp, 10);
return 0; return 0;
} }
...@@ -1128,18 +1160,27 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr) ...@@ -1128,18 +1160,27 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
tmp_addr = (u16 *)addr; tmp_addr = (u16 *)addr;
start = buf; start = buf;
for (i = 0; i < 7; i++) { for (i = 0; i < 8; i++) {
if (!(end = strchr(start, ':'))) if (i == 7) {
return -EINVAL; end = strchr(start,0xa);
if (end)
len = end - start;
else
len = strlen(start);
}
else {
end = strchr(start, ':');
len = end - start; len = end - start;
}
if ((len <= 0) || (len > 4))
return -EINVAL;
memset(abuf, 0, 5); memset(abuf, 0, 5);
strncpy(abuf, start, len); strncpy(abuf, start, len);
if (!qeth_isxdigit(abuf))
return -EINVAL;
tmp_addr[i] = simple_strtoul(abuf, &tmp, 16); tmp_addr[i] = simple_strtoul(abuf, &tmp, 16);
start = end + 1; start = end + 1;
} }
memset(abuf, 0, 5);
strcpy(abuf, start);
tmp_addr[7] = simple_strtoul(abuf, &tmp, 16);
return 0; return 0;
} }
......
This diff is collapsed.
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Linux on zSeries OSA Express and HiperSockets support * Linux on zSeries OSA Express and HiperSockets support
* *
* Copyright 2000,2003 IBM Corporation * Copyright 2000,2003 IBM Corporation
* Author(s): Frank Pavlic <pavlic@de.ibm.com> * Author(s): Frank Pavlic <fpavlic@de.ibm.com>
* Thomas Spatzier <tspat@de.ibm.com> * Thomas Spatzier <tspat@de.ibm.com>
* *
*/ */
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Copyright 2000,2003 IBM Corporation * Copyright 2000,2003 IBM Corporation
* Author(s): Utz Bacher <utz.bacher@de.ibm.com> * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
* Thomas Spatzier <tspat@de.ibm.com> * Thomas Spatzier <tspat@de.ibm.com>
* Frank Pavlic <pavlic@de.ibm.com> * Frank Pavlic <fpavlic@de.ibm.com>
* *
*/ */
#ifndef __QETH_MPC_H__ #ifndef __QETH_MPC_H__
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include <asm/qeth.h> #include <asm/qeth.h>
#define VERSION_QETH_MPC_H "$Revision: 1.43 $" #define VERSION_QETH_MPC_H "$Revision: 1.44 $"
extern const char *VERSION_QETH_MPC_C; extern const char *VERSION_QETH_MPC_C;
...@@ -217,7 +217,7 @@ enum qeth_ipa_setadp_cmd { ...@@ -217,7 +217,7 @@ enum qeth_ipa_setadp_cmd {
IPA_SETADP_SEND_OSA_MESSAGE = 0x0100, IPA_SETADP_SEND_OSA_MESSAGE = 0x0100,
IPA_SETADP_SET_SNMP_CONTROL = 0x0200, IPA_SETADP_SET_SNMP_CONTROL = 0x0200,
IPA_SETADP_READ_SNMP_PARMS = 0x0400, IPA_SETADP_READ_SNMP_PARMS = 0x0400,
IPA_SETADP_WRITE_SNMP_PARMS = 0x0800, IPA_SETADP_SET_PROMISC_MODE = 0x0800,
IPA_SETADP_QUERY_CARD_INFO = 0x1000, IPA_SETADP_QUERY_CARD_INFO = 0x1000,
}; };
enum qeth_ipa_mac_ops { enum qeth_ipa_mac_ops {
...@@ -232,9 +232,12 @@ enum qeth_ipa_addr_ops { ...@@ -232,9 +232,12 @@ enum qeth_ipa_addr_ops {
CHANGE_ADDR_ADD_ADDR = 1, CHANGE_ADDR_ADD_ADDR = 1,
CHANGE_ADDR_DEL_ADDR = 2, CHANGE_ADDR_DEL_ADDR = 2,
CHANGE_ADDR_FLUSH_ADDR_TABLE = 4, CHANGE_ADDR_FLUSH_ADDR_TABLE = 4,
}; };
enum qeth_ipa_promisc_modes {
SET_PROMISC_MODE_OFF = 0,
SET_PROMISC_MODE_ON = 1,
};
/* (SET)DELIP(M) IPA stuff ***************************************************/ /* (SET)DELIP(M) IPA stuff ***************************************************/
struct qeth_ipacmd_setdelip4 { struct qeth_ipacmd_setdelip4 {
__u8 ip_addr[4]; __u8 ip_addr[4];
......
/* /*
* *
* linux/drivers/s390/net/qeth_sys.c ($Revision: 1.55 $) * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.58 $)
* *
* Linux on zSeries OSA Express and HiperSockets support * Linux on zSeries OSA Express and HiperSockets support
* This file contains code related to sysfs. * This file contains code related to sysfs.
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Copyright 2000,2003 IBM Corporation * Copyright 2000,2003 IBM Corporation
* *
* Author(s): Thomas Spatzier <tspat@de.ibm.com> * Author(s): Thomas Spatzier <tspat@de.ibm.com>
* Frank Pavlic <pavlic@de.ibm.com> * Frank Pavlic <fpavlic@de.ibm.com>
* *
*/ */
#include <linux/list.h> #include <linux/list.h>
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "qeth_mpc.h" #include "qeth_mpc.h"
#include "qeth_fs.h" #include "qeth_fs.h"
const char *VERSION_QETH_SYS_C = "$Revision: 1.55 $"; const char *VERSION_QETH_SYS_C = "$Revision: 1.58 $";
/*****************************************************************************/ /*****************************************************************************/
/* */ /* */
...@@ -1117,7 +1117,7 @@ qeth_parse_ipatoe(const char* buf, enum qeth_prot_versions proto, ...@@ -1117,7 +1117,7 @@ qeth_parse_ipatoe(const char* buf, enum qeth_prot_versions proto,
start = buf; start = buf;
/* get address string */ /* get address string */
end = strchr(start, '/'); end = strchr(start, '/');
if (!end){ if (!end || (end-start >= 49)){
PRINT_WARN("Invalid format for ipato_addx/delx. " PRINT_WARN("Invalid format for ipato_addx/delx. "
"Use <ip addr>/<mask bits>\n"); "Use <ip addr>/<mask bits>\n");
return -EINVAL; return -EINVAL;
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Copyright 2004 IBM Corporation * Copyright 2004 IBM Corporation
* *
* Author(s): Frank Pavlic <pavlic@de.ibm.com> * Author(s): Frank Pavlic <fpavlic@de.ibm.com>
* *
* $Revision: 1.7 $ $Date: 2005/05/04 20:19:18 $ * $Revision: 1.7 $ $Date: 2005/05/04 20:19:18 $
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment