You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'upstream-davem' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
This commit is contained in:
@@ -69,12 +69,6 @@
|
||||
device to be used as both a tty interface and as a synchronous
|
||||
controller is a project for Linux post the 2.4 release
|
||||
</para>
|
||||
<para>
|
||||
The support code handles most common card configurations and
|
||||
supports running both Cisco HDLC and Synchronous PPP. With extra
|
||||
glue the frame relay and X.25 protocols can also be used with this
|
||||
driver.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="Driver_Modes">
|
||||
@@ -179,35 +173,27 @@
|
||||
<para>
|
||||
If you wish to use the network interface facilities of the driver,
|
||||
then you need to attach a network device to each channel that is
|
||||
present and in use. In addition to use the SyncPPP and Cisco HDLC
|
||||
present and in use. In addition to use the generic HDLC
|
||||
you need to follow some additional plumbing rules. They may seem
|
||||
complex but a look at the example hostess_sv11 driver should
|
||||
reassure you.
|
||||
</para>
|
||||
<para>
|
||||
The network device used for each channel should be pointed to by
|
||||
the netdevice field of each channel. The dev-> priv field of the
|
||||
the netdevice field of each channel. The hdlc-> priv field of the
|
||||
network device points to your private data - you will need to be
|
||||
able to find your ppp device from this. In addition to use the
|
||||
sync ppp layer the private data must start with a void * pointer
|
||||
to the syncppp structures.
|
||||
able to find your private data from this.
|
||||
</para>
|
||||
<para>
|
||||
The way most drivers approach this particular problem is to
|
||||
create a structure holding the Z8530 device definition and
|
||||
put that and the syncppp pointer into the private field of
|
||||
the network device. The network device fields of the channels
|
||||
then point back to the network devices. The ppp_device can also
|
||||
be put in the private structure conveniently.
|
||||
put that into the private field of the network device. The
|
||||
network device fields of the channels then point back to the
|
||||
network devices.
|
||||
</para>
|
||||
<para>
|
||||
If you wish to use the synchronous ppp then you need to attach
|
||||
the syncppp layer to the network device. You should do this before
|
||||
you register the network device. The
|
||||
<function>sppp_attach</function> requires that the first void *
|
||||
pointer in your private data is pointing to an empty struct
|
||||
ppp_device. The function fills in the initial data for the
|
||||
ppp/hdlc layer.
|
||||
If you wish to use the generic HDLC then you need to register
|
||||
the HDLC device.
|
||||
</para>
|
||||
<para>
|
||||
Before you register your network device you will also need to
|
||||
@@ -314,10 +300,10 @@
|
||||
buffer in sk_buff format and queues it for transmission. The
|
||||
caller must provide the entire packet with the exception of the
|
||||
bitstuffing and CRC. This is normally done by the caller via
|
||||
the syncppp interface layer. It returns 0 if the buffer has been
|
||||
queued and non zero values for queue full. If the function accepts
|
||||
the buffer it becomes property of the Z8530 layer and the caller
|
||||
should not free it.
|
||||
the generic HDLC interface layer. It returns 0 if the buffer has been
|
||||
queued and non zero values for queue full. If the function accepts
|
||||
the buffer it becomes property of the Z8530 layer and the caller
|
||||
should not free it.
|
||||
</para>
|
||||
<para>
|
||||
The function <function>z8530_get_stats</function> returns a pointer
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#ifndef __ASM_SH_ETH_H__
|
||||
#define __ASM_SH_ETH_H__
|
||||
|
||||
enum {EDMAC_LITTLE_ENDIAN, EDMAC_BIG_ENDIAN};
|
||||
|
||||
struct sh_eth_plat_data {
|
||||
int phy;
|
||||
int edmac_endian;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -232,7 +232,6 @@ typedef struct _mgslpc_info {
|
||||
|
||||
/* SPPP/Cisco HDLC device parts */
|
||||
int netcount;
|
||||
int dosyncppp;
|
||||
spinlock_t netlock;
|
||||
|
||||
#if SYNCLINK_GENERIC_HDLC
|
||||
@@ -459,13 +458,11 @@ static int ttymajor=0;
|
||||
|
||||
static int debug_level = 0;
|
||||
static int maxframe[MAX_DEVICE_COUNT] = {0,};
|
||||
static int dosyncppp[MAX_DEVICE_COUNT] = {1,1,1,1};
|
||||
|
||||
module_param(break_on_load, bool, 0);
|
||||
module_param(ttymajor, int, 0);
|
||||
module_param(debug_level, int, 0);
|
||||
module_param_array(maxframe, int, NULL, 0);
|
||||
module_param_array(dosyncppp, int, NULL, 0);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -2915,7 +2912,6 @@ static void mgslpc_add_device(MGSLPC_INFO *info)
|
||||
if (info->line < MAX_DEVICE_COUNT) {
|
||||
if (maxframe[info->line])
|
||||
info->max_frame_size = maxframe[info->line];
|
||||
info->dosyncppp = dosyncppp[info->line];
|
||||
}
|
||||
|
||||
mgslpc_device_count++;
|
||||
|
||||
@@ -304,7 +304,6 @@ struct mgsl_struct {
|
||||
|
||||
/* generic HDLC device parts */
|
||||
int netcount;
|
||||
int dosyncppp;
|
||||
spinlock_t netlock;
|
||||
|
||||
#if SYNCLINK_GENERIC_HDLC
|
||||
@@ -868,7 +867,6 @@ static int irq[MAX_ISA_DEVICES];
|
||||
static int dma[MAX_ISA_DEVICES];
|
||||
static int debug_level;
|
||||
static int maxframe[MAX_TOTAL_DEVICES];
|
||||
static int dosyncppp[MAX_TOTAL_DEVICES];
|
||||
static int txdmabufs[MAX_TOTAL_DEVICES];
|
||||
static int txholdbufs[MAX_TOTAL_DEVICES];
|
||||
|
||||
@@ -879,7 +877,6 @@ module_param_array(irq, int, NULL, 0);
|
||||
module_param_array(dma, int, NULL, 0);
|
||||
module_param(debug_level, int, 0);
|
||||
module_param_array(maxframe, int, NULL, 0);
|
||||
module_param_array(dosyncppp, int, NULL, 0);
|
||||
module_param_array(txdmabufs, int, NULL, 0);
|
||||
module_param_array(txholdbufs, int, NULL, 0);
|
||||
|
||||
@@ -4258,7 +4255,6 @@ static void mgsl_add_device( struct mgsl_struct *info )
|
||||
if (info->line < MAX_TOTAL_DEVICES) {
|
||||
if (maxframe[info->line])
|
||||
info->max_frame_size = maxframe[info->line];
|
||||
info->dosyncppp = dosyncppp[info->line];
|
||||
|
||||
if (txdmabufs[info->line]) {
|
||||
info->num_tx_dma_buffers = txdmabufs[info->line];
|
||||
|
||||
@@ -128,17 +128,14 @@ static int slgt_device_count;
|
||||
static int ttymajor;
|
||||
static int debug_level;
|
||||
static int maxframe[MAX_DEVICES];
|
||||
static int dosyncppp[MAX_DEVICES];
|
||||
|
||||
module_param(ttymajor, int, 0);
|
||||
module_param(debug_level, int, 0);
|
||||
module_param_array(maxframe, int, NULL, 0);
|
||||
module_param_array(dosyncppp, int, NULL, 0);
|
||||
|
||||
MODULE_PARM_DESC(ttymajor, "TTY major device number override: 0=auto assigned");
|
||||
MODULE_PARM_DESC(debug_level, "Debug syslog output: 0=disabled, 1 to 5=increasing detail");
|
||||
MODULE_PARM_DESC(maxframe, "Maximum frame size used by device (4096 to 65535)");
|
||||
MODULE_PARM_DESC(dosyncppp, "Enable synchronous net device, 0=disable 1=enable");
|
||||
|
||||
/*
|
||||
* tty support and callbacks
|
||||
@@ -349,7 +346,6 @@ struct slgt_info {
|
||||
/* SPPP/Cisco HDLC device parts */
|
||||
|
||||
int netcount;
|
||||
int dosyncppp;
|
||||
spinlock_t netlock;
|
||||
#if SYNCLINK_GENERIC_HDLC
|
||||
struct net_device *netdev;
|
||||
@@ -3405,7 +3401,6 @@ static void add_device(struct slgt_info *info)
|
||||
if (info->line < MAX_DEVICES) {
|
||||
if (maxframe[info->line])
|
||||
info->max_frame_size = maxframe[info->line];
|
||||
info->dosyncppp = dosyncppp[info->line];
|
||||
}
|
||||
|
||||
slgt_device_count++;
|
||||
|
||||
@@ -270,7 +270,6 @@ typedef struct _synclinkmp_info {
|
||||
|
||||
/* SPPP/Cisco HDLC device parts */
|
||||
int netcount;
|
||||
int dosyncppp;
|
||||
spinlock_t netlock;
|
||||
|
||||
#if SYNCLINK_GENERIC_HDLC
|
||||
@@ -469,13 +468,11 @@ static int ttymajor = 0;
|
||||
*/
|
||||
static int debug_level = 0;
|
||||
static int maxframe[MAX_DEVICES] = {0,};
|
||||
static int dosyncppp[MAX_DEVICES] = {0,};
|
||||
|
||||
module_param(break_on_load, bool, 0);
|
||||
module_param(ttymajor, int, 0);
|
||||
module_param(debug_level, int, 0);
|
||||
module_param_array(maxframe, int, NULL, 0);
|
||||
module_param_array(dosyncppp, int, NULL, 0);
|
||||
|
||||
static char *driver_name = "SyncLink MultiPort driver";
|
||||
static char *driver_version = "$Revision: 4.38 $";
|
||||
@@ -3752,7 +3749,6 @@ static void add_device(SLMP_INFO *info)
|
||||
if (info->line < MAX_DEVICES) {
|
||||
if (maxframe[info->line])
|
||||
info->max_frame_size = maxframe[info->line];
|
||||
info->dosyncppp = dosyncppp[info->line];
|
||||
}
|
||||
|
||||
synclinkmp_device_count++;
|
||||
|
||||
+1
-3
@@ -640,10 +640,8 @@ static int init586(struct net_device *dev)
|
||||
cfg_cmd->time_low = 0x00;
|
||||
cfg_cmd->time_high = 0xf2;
|
||||
cfg_cmd->promisc = 0;
|
||||
if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC)) {
|
||||
if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC))
|
||||
cfg_cmd->promisc = 1;
|
||||
dev->flags |= IFF_PROMISC;
|
||||
}
|
||||
cfg_cmd->carr_coll = 0x00;
|
||||
|
||||
p->scb->cbl_offset = make16(cfg_cmd);
|
||||
|
||||
+3
-6
@@ -1521,14 +1521,11 @@ static void do_mc32_set_multicast_list(struct net_device *dev, int retry)
|
||||
struct mc32_local *lp = netdev_priv(dev);
|
||||
u16 filt = (1<<2); /* Save Bad Packets, for stats purposes */
|
||||
|
||||
if (dev->flags&IFF_PROMISC)
|
||||
if ((dev->flags&IFF_PROMISC) ||
|
||||
(dev->flags&IFF_ALLMULTI) ||
|
||||
dev->mc_count > 10)
|
||||
/* Enable promiscuous mode */
|
||||
filt |= 1;
|
||||
else if((dev->flags&IFF_ALLMULTI) || dev->mc_count > 10)
|
||||
{
|
||||
dev->flags|=IFF_PROMISC;
|
||||
filt |= 1;
|
||||
}
|
||||
else if(dev->mc_count)
|
||||
{
|
||||
unsigned char block[62];
|
||||
|
||||
+8
-6
@@ -1692,12 +1692,14 @@ vortex_open(struct net_device *dev)
|
||||
vp->rx_ring[i].next = cpu_to_le32(vp->rx_ring_dma + sizeof(struct boom_rx_desc) * (i+1));
|
||||
vp->rx_ring[i].status = 0; /* Clear complete bit. */
|
||||
vp->rx_ring[i].length = cpu_to_le32(PKT_BUF_SZ | LAST_FRAG);
|
||||
skb = dev_alloc_skb(PKT_BUF_SZ);
|
||||
|
||||
skb = __netdev_alloc_skb(dev, PKT_BUF_SZ + NET_IP_ALIGN,
|
||||
GFP_KERNEL);
|
||||
vp->rx_skbuff[i] = skb;
|
||||
if (skb == NULL)
|
||||
break; /* Bad news! */
|
||||
skb->dev = dev; /* Mark as being used by this device. */
|
||||
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
|
||||
|
||||
skb_reserve(skb, NET_IP_ALIGN); /* Align IP on 16 byte boundaries */
|
||||
vp->rx_ring[i].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, PKT_BUF_SZ, PCI_DMA_FROMDEVICE));
|
||||
}
|
||||
if (i != RX_RING_SIZE) {
|
||||
@@ -2538,7 +2540,7 @@ boomerang_rx(struct net_device *dev)
|
||||
struct sk_buff *skb;
|
||||
entry = vp->dirty_rx % RX_RING_SIZE;
|
||||
if (vp->rx_skbuff[entry] == NULL) {
|
||||
skb = dev_alloc_skb(PKT_BUF_SZ);
|
||||
skb = netdev_alloc_skb(dev, PKT_BUF_SZ + NET_IP_ALIGN);
|
||||
if (skb == NULL) {
|
||||
static unsigned long last_jif;
|
||||
if (time_after(jiffies, last_jif + 10 * HZ)) {
|
||||
@@ -2549,8 +2551,8 @@ boomerang_rx(struct net_device *dev)
|
||||
mod_timer(&vp->rx_oom_timer, RUN_AT(HZ * 1));
|
||||
break; /* Bad news! */
|
||||
}
|
||||
skb->dev = dev; /* Mark as being used by this device. */
|
||||
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
|
||||
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
vp->rx_ring[entry].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, PKT_BUF_SZ, PCI_DMA_FROMDEVICE));
|
||||
vp->rx_skbuff[entry] = skb;
|
||||
}
|
||||
|
||||
+5
-8
@@ -9,42 +9,39 @@ int ei_open(struct net_device *dev)
|
||||
{
|
||||
return __ei_open(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(ei_open);
|
||||
|
||||
int ei_close(struct net_device *dev)
|
||||
{
|
||||
return __ei_close(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(ei_close);
|
||||
|
||||
irqreturn_t ei_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
return __ei_interrupt(irq, dev_id);
|
||||
}
|
||||
EXPORT_SYMBOL(ei_interrupt);
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
void ei_poll(struct net_device *dev)
|
||||
{
|
||||
__ei_poll(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(ei_poll);
|
||||
#endif
|
||||
|
||||
struct net_device *__alloc_ei_netdev(int size)
|
||||
{
|
||||
return ____alloc_ei_netdev(size);
|
||||
}
|
||||
EXPORT_SYMBOL(__alloc_ei_netdev);
|
||||
|
||||
void NS8390_init(struct net_device *dev, int startp)
|
||||
{
|
||||
__NS8390_init(dev, startp);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(ei_open);
|
||||
EXPORT_SYMBOL(ei_close);
|
||||
EXPORT_SYMBOL(ei_interrupt);
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
EXPORT_SYMBOL(ei_poll);
|
||||
#endif
|
||||
EXPORT_SYMBOL(NS8390_init);
|
||||
EXPORT_SYMBOL(__alloc_ei_netdev);
|
||||
|
||||
#if defined(MODULE)
|
||||
|
||||
|
||||
+8
-11
@@ -4,9 +4,9 @@ static const char version[] =
|
||||
"8390p.c:v1.10cvs 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
|
||||
|
||||
#define ei_inb(_p) inb(_p)
|
||||
#define ei_outb(_v,_p) outb(_v,_p)
|
||||
#define ei_outb(_v, _p) outb(_v, _p)
|
||||
#define ei_inb_p(_p) inb_p(_p)
|
||||
#define ei_outb_p(_v,_p) outb_p(_v,_p)
|
||||
#define ei_outb_p(_v, _p) outb_p(_v, _p)
|
||||
|
||||
#include "lib8390.c"
|
||||
|
||||
@@ -14,42 +14,39 @@ int eip_open(struct net_device *dev)
|
||||
{
|
||||
return __ei_open(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(eip_open);
|
||||
|
||||
int eip_close(struct net_device *dev)
|
||||
{
|
||||
return __ei_close(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(eip_close);
|
||||
|
||||
irqreturn_t eip_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
return __ei_interrupt(irq, dev_id);
|
||||
}
|
||||
EXPORT_SYMBOL(eip_interrupt);
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
void eip_poll(struct net_device *dev)
|
||||
{
|
||||
__ei_poll(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(eip_poll);
|
||||
#endif
|
||||
|
||||
struct net_device *__alloc_eip_netdev(int size)
|
||||
{
|
||||
return ____alloc_ei_netdev(size);
|
||||
}
|
||||
EXPORT_SYMBOL(__alloc_eip_netdev);
|
||||
|
||||
void NS8390p_init(struct net_device *dev, int startp)
|
||||
{
|
||||
return __NS8390_init(dev, startp);
|
||||
__NS8390_init(dev, startp);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(eip_open);
|
||||
EXPORT_SYMBOL(eip_close);
|
||||
EXPORT_SYMBOL(eip_interrupt);
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
EXPORT_SYMBOL(eip_poll);
|
||||
#endif
|
||||
EXPORT_SYMBOL(NS8390p_init);
|
||||
EXPORT_SYMBOL(__alloc_eip_netdev);
|
||||
|
||||
#if defined(MODULE)
|
||||
|
||||
|
||||
+3
-2
@@ -510,14 +510,15 @@ config STNIC
|
||||
config SH_ETH
|
||||
tristate "Renesas SuperH Ethernet support"
|
||||
depends on SUPERH && \
|
||||
(CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712 || CPU_SUBTYPE_SH7763)
|
||||
(CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712 || CPU_SUBTYPE_SH7763 || \
|
||||
CPU_SUBTYPE_SH7619)
|
||||
select CRC32
|
||||
select MII
|
||||
select MDIO_BITBANG
|
||||
select PHYLIB
|
||||
help
|
||||
Renesas SuperH Ethernet device driver.
|
||||
This driver support SH7710, SH7712 and SH7763.
|
||||
This driver support SH7710, SH7712, SH7763 and SH7619.
|
||||
|
||||
config SUNLANCE
|
||||
tristate "Sun LANCE support"
|
||||
|
||||
+11
-8
@@ -1790,6 +1790,17 @@ static void atl1_rx_checksum(struct atl1_adapter *adapter,
|
||||
{
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
/*
|
||||
* The L1 hardware contains a bug that erroneously sets the
|
||||
* PACKET_FLAG_ERR and ERR_FLAG_L4_CHKSUM bits whenever a
|
||||
* fragmented IP packet is received, even though the packet
|
||||
* is perfectly valid and its checksum is correct. There's
|
||||
* no way to distinguish between one of these good packets
|
||||
* and a packet that actually contains a TCP/UDP checksum
|
||||
* error, so all we can do is allow it to be handed up to
|
||||
* the higher layers and let it be sorted out there.
|
||||
*/
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
if (unlikely(rrd->pkt_flg & PACKET_FLAG_ERR)) {
|
||||
@@ -1816,14 +1827,6 @@ static void atl1_rx_checksum(struct atl1_adapter *adapter,
|
||||
return;
|
||||
}
|
||||
|
||||
/* IPv4, but hardware thinks its checksum is wrong */
|
||||
if (netif_msg_rx_err(adapter))
|
||||
dev_printk(KERN_DEBUG, &pdev->dev,
|
||||
"hw csum wrong, pkt_flag:%x, err_flag:%x\n",
|
||||
rrd->pkt_flg, rrd->err_flg);
|
||||
skb->ip_summed = CHECKSUM_COMPLETE;
|
||||
skb->csum = htons(rrd->xsz.xsum_sz.rx_chksum);
|
||||
adapter->hw_csum_err++;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+2
-7
@@ -854,14 +854,9 @@ static void set_rx_mode_8002(struct net_device *dev)
|
||||
struct net_local *lp = netdev_priv(dev);
|
||||
long ioaddr = dev->base_addr;
|
||||
|
||||
if ( dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) {
|
||||
/* We must make the kernel realise we had to move
|
||||
* into promisc mode or we start all out war on
|
||||
* the cable. - AC
|
||||
*/
|
||||
dev->flags|=IFF_PROMISC;
|
||||
if (dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC)))
|
||||
lp->addr_mode = CMR2h_PROMISC;
|
||||
} else
|
||||
else
|
||||
lp->addr_mode = CMR2h_Normal;
|
||||
write_reg_high(ioaddr, CMR2, lp->addr_mode);
|
||||
}
|
||||
|
||||
@@ -2107,6 +2107,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
|
||||
aggregator = __get_first_agg(port);
|
||||
ad_agg_selection_logic(aggregator);
|
||||
}
|
||||
bond_3ad_set_carrier(bond);
|
||||
}
|
||||
|
||||
// for each port run the state machines
|
||||
|
||||
+173
-223
@@ -2223,272 +2223,217 @@ static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *in
|
||||
|
||||
/*-------------------------------- Monitoring -------------------------------*/
|
||||
|
||||
/*
|
||||
* if !have_locks, return nonzero if a failover is necessary. if
|
||||
* have_locks, do whatever failover activities are needed.
|
||||
*
|
||||
* This is to separate the inspection and failover steps for locking
|
||||
* purposes; failover requires rtnl, but acquiring it for every
|
||||
* inspection is undesirable, so a wrapper first does inspection, and
|
||||
* the acquires the necessary locks and calls again to perform
|
||||
* failover if needed. Since all locks are dropped, a complete
|
||||
* restart is needed between calls.
|
||||
*/
|
||||
static int __bond_mii_monitor(struct bonding *bond, int have_locks)
|
||||
|
||||
static int bond_miimon_inspect(struct bonding *bond)
|
||||
{
|
||||
struct slave *slave, *oldcurrent;
|
||||
int do_failover = 0;
|
||||
int i;
|
||||
|
||||
if (bond->slave_cnt == 0)
|
||||
goto out;
|
||||
|
||||
/* we will try to read the link status of each of our slaves, and
|
||||
* set their IFF_RUNNING flag appropriately. For each slave not
|
||||
* supporting MII status, we won't do anything so that a user-space
|
||||
* program could monitor the link itself if needed.
|
||||
*/
|
||||
|
||||
read_lock(&bond->curr_slave_lock);
|
||||
oldcurrent = bond->curr_active_slave;
|
||||
read_unlock(&bond->curr_slave_lock);
|
||||
struct slave *slave;
|
||||
int i, link_state, commit = 0;
|
||||
|
||||
bond_for_each_slave(bond, slave, i) {
|
||||
struct net_device *slave_dev = slave->dev;
|
||||
int link_state;
|
||||
u16 old_speed = slave->speed;
|
||||
u8 old_duplex = slave->duplex;
|
||||
slave->new_link = BOND_LINK_NOCHANGE;
|
||||
|
||||
link_state = bond_check_dev_link(bond, slave_dev, 0);
|
||||
link_state = bond_check_dev_link(bond, slave->dev, 0);
|
||||
|
||||
switch (slave->link) {
|
||||
case BOND_LINK_UP: /* the link was up */
|
||||
if (link_state == BMSR_LSTATUS) {
|
||||
if (!oldcurrent) {
|
||||
if (!have_locks)
|
||||
return 1;
|
||||
do_failover = 1;
|
||||
}
|
||||
break;
|
||||
} else { /* link going down */
|
||||
slave->link = BOND_LINK_FAIL;
|
||||
slave->delay = bond->params.downdelay;
|
||||
case BOND_LINK_UP:
|
||||
if (link_state)
|
||||
continue;
|
||||
|
||||
if (slave->link_failure_count < UINT_MAX) {
|
||||
slave->link_failure_count++;
|
||||
}
|
||||
|
||||
if (bond->params.downdelay) {
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status down for %s "
|
||||
"interface %s, disabling it in "
|
||||
"%d ms.\n",
|
||||
bond->dev->name,
|
||||
IS_UP(slave_dev)
|
||||
? ((bond->params.mode == BOND_MODE_ACTIVEBACKUP)
|
||||
? ((slave == oldcurrent)
|
||||
? "active " : "backup ")
|
||||
: "")
|
||||
: "idle ",
|
||||
slave_dev->name,
|
||||
bond->params.downdelay * bond->params.miimon);
|
||||
}
|
||||
slave->link = BOND_LINK_FAIL;
|
||||
slave->delay = bond->params.downdelay;
|
||||
if (slave->delay) {
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status down for %s"
|
||||
"interface %s, disabling it in %d ms.\n",
|
||||
bond->dev->name,
|
||||
(bond->params.mode ==
|
||||
BOND_MODE_ACTIVEBACKUP) ?
|
||||
((slave->state == BOND_STATE_ACTIVE) ?
|
||||
"active " : "backup ") : "",
|
||||
slave->dev->name,
|
||||
bond->params.downdelay * bond->params.miimon);
|
||||
}
|
||||
/* no break ! fall through the BOND_LINK_FAIL test to
|
||||
ensure proper action to be taken
|
||||
*/
|
||||
case BOND_LINK_FAIL: /* the link has just gone down */
|
||||
if (link_state != BMSR_LSTATUS) {
|
||||
/* link stays down */
|
||||
if (slave->delay <= 0) {
|
||||
if (!have_locks)
|
||||
return 1;
|
||||
|
||||
/* link down for too long time */
|
||||
slave->link = BOND_LINK_DOWN;
|
||||
|
||||
/* in active/backup mode, we must
|
||||
* completely disable this interface
|
||||
*/
|
||||
if ((bond->params.mode == BOND_MODE_ACTIVEBACKUP) ||
|
||||
(bond->params.mode == BOND_MODE_8023AD)) {
|
||||
bond_set_slave_inactive_flags(slave);
|
||||
}
|
||||
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status definitely "
|
||||
"down for interface %s, "
|
||||
"disabling it\n",
|
||||
bond->dev->name,
|
||||
slave_dev->name);
|
||||
|
||||
/* notify ad that the link status has changed */
|
||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
||||
bond_3ad_handle_link_change(slave, BOND_LINK_DOWN);
|
||||
}
|
||||
|
||||
if ((bond->params.mode == BOND_MODE_TLB) ||
|
||||
(bond->params.mode == BOND_MODE_ALB)) {
|
||||
bond_alb_handle_link_change(bond, slave, BOND_LINK_DOWN);
|
||||
}
|
||||
|
||||
if (slave == oldcurrent) {
|
||||
do_failover = 1;
|
||||
}
|
||||
} else {
|
||||
slave->delay--;
|
||||
}
|
||||
} else {
|
||||
/* link up again */
|
||||
slave->link = BOND_LINK_UP;
|
||||
/*FALLTHRU*/
|
||||
case BOND_LINK_FAIL:
|
||||
if (link_state) {
|
||||
/*
|
||||
* recovered before downdelay expired
|
||||
*/
|
||||
slave->link = BOND_LINK_UP;
|
||||
slave->jiffies = jiffies;
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status up again after %d "
|
||||
"ms for interface %s.\n",
|
||||
bond->dev->name,
|
||||
(bond->params.downdelay - slave->delay) * bond->params.miimon,
|
||||
slave_dev->name);
|
||||
(bond->params.downdelay - slave->delay) *
|
||||
bond->params.miimon,
|
||||
slave->dev->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (slave->delay <= 0) {
|
||||
slave->new_link = BOND_LINK_DOWN;
|
||||
commit++;
|
||||
continue;
|
||||
}
|
||||
|
||||
slave->delay--;
|
||||
break;
|
||||
case BOND_LINK_DOWN: /* the link was down */
|
||||
if (link_state != BMSR_LSTATUS) {
|
||||
/* the link stays down, nothing more to do */
|
||||
break;
|
||||
} else { /* link going up */
|
||||
slave->link = BOND_LINK_BACK;
|
||||
slave->delay = bond->params.updelay;
|
||||
|
||||
if (bond->params.updelay) {
|
||||
/* if updelay == 0, no need to
|
||||
advertise about a 0 ms delay */
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status up for "
|
||||
"interface %s, enabling it "
|
||||
"in %d ms.\n",
|
||||
bond->dev->name,
|
||||
slave_dev->name,
|
||||
bond->params.updelay * bond->params.miimon);
|
||||
}
|
||||
case BOND_LINK_DOWN:
|
||||
if (!link_state)
|
||||
continue;
|
||||
|
||||
slave->link = BOND_LINK_BACK;
|
||||
slave->delay = bond->params.updelay;
|
||||
|
||||
if (slave->delay) {
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status up for "
|
||||
"interface %s, enabling it in %d ms.\n",
|
||||
bond->dev->name, slave->dev->name,
|
||||
bond->params.updelay *
|
||||
bond->params.miimon);
|
||||
}
|
||||
/* no break ! fall through the BOND_LINK_BACK state in
|
||||
case there's something to do.
|
||||
*/
|
||||
case BOND_LINK_BACK: /* the link has just come back */
|
||||
if (link_state != BMSR_LSTATUS) {
|
||||
/* link down again */
|
||||
slave->link = BOND_LINK_DOWN;
|
||||
|
||||
/*FALLTHRU*/
|
||||
case BOND_LINK_BACK:
|
||||
if (!link_state) {
|
||||
slave->link = BOND_LINK_DOWN;
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status down again after %d "
|
||||
"ms for interface %s.\n",
|
||||
bond->dev->name,
|
||||
(bond->params.updelay - slave->delay) * bond->params.miimon,
|
||||
slave_dev->name);
|
||||
} else {
|
||||
/* link stays up */
|
||||
if (slave->delay == 0) {
|
||||
if (!have_locks)
|
||||
return 1;
|
||||
(bond->params.updelay - slave->delay) *
|
||||
bond->params.miimon,
|
||||
slave->dev->name);
|
||||
|
||||
/* now the link has been up for long time enough */
|
||||
slave->link = BOND_LINK_UP;
|
||||
slave->jiffies = jiffies;
|
||||
|
||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
||||
/* prevent it from being the active one */
|
||||
slave->state = BOND_STATE_BACKUP;
|
||||
} else if (bond->params.mode != BOND_MODE_ACTIVEBACKUP) {
|
||||
/* make it immediately active */
|
||||
slave->state = BOND_STATE_ACTIVE;
|
||||
} else if (slave != bond->primary_slave) {
|
||||
/* prevent it from being the active one */
|
||||
slave->state = BOND_STATE_BACKUP;
|
||||
}
|
||||
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status definitely "
|
||||
"up for interface %s.\n",
|
||||
bond->dev->name,
|
||||
slave_dev->name);
|
||||
|
||||
/* notify ad that the link status has changed */
|
||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
||||
bond_3ad_handle_link_change(slave, BOND_LINK_UP);
|
||||
}
|
||||
|
||||
if ((bond->params.mode == BOND_MODE_TLB) ||
|
||||
(bond->params.mode == BOND_MODE_ALB)) {
|
||||
bond_alb_handle_link_change(bond, slave, BOND_LINK_UP);
|
||||
}
|
||||
|
||||
if ((!oldcurrent) ||
|
||||
(slave == bond->primary_slave)) {
|
||||
do_failover = 1;
|
||||
}
|
||||
} else {
|
||||
slave->delay--;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (slave->delay <= 0) {
|
||||
slave->new_link = BOND_LINK_UP;
|
||||
commit++;
|
||||
continue;
|
||||
}
|
||||
|
||||
slave->delay--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return commit;
|
||||
}
|
||||
|
||||
static void bond_miimon_commit(struct bonding *bond)
|
||||
{
|
||||
struct slave *slave;
|
||||
int i;
|
||||
|
||||
bond_for_each_slave(bond, slave, i) {
|
||||
switch (slave->new_link) {
|
||||
case BOND_LINK_NOCHANGE:
|
||||
continue;
|
||||
|
||||
case BOND_LINK_UP:
|
||||
slave->link = BOND_LINK_UP;
|
||||
slave->jiffies = jiffies;
|
||||
|
||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
||||
/* prevent it from being the active one */
|
||||
slave->state = BOND_STATE_BACKUP;
|
||||
} else if (bond->params.mode != BOND_MODE_ACTIVEBACKUP) {
|
||||
/* make it immediately active */
|
||||
slave->state = BOND_STATE_ACTIVE;
|
||||
} else if (slave != bond->primary_slave) {
|
||||
/* prevent it from being the active one */
|
||||
slave->state = BOND_STATE_BACKUP;
|
||||
}
|
||||
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status definitely "
|
||||
"up for interface %s.\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
|
||||
/* notify ad that the link status has changed */
|
||||
if (bond->params.mode == BOND_MODE_8023AD)
|
||||
bond_3ad_handle_link_change(slave, BOND_LINK_UP);
|
||||
|
||||
if ((bond->params.mode == BOND_MODE_TLB) ||
|
||||
(bond->params.mode == BOND_MODE_ALB))
|
||||
bond_alb_handle_link_change(bond, slave,
|
||||
BOND_LINK_UP);
|
||||
|
||||
if (!bond->curr_active_slave ||
|
||||
(slave == bond->primary_slave))
|
||||
goto do_failover;
|
||||
|
||||
continue;
|
||||
|
||||
case BOND_LINK_DOWN:
|
||||
slave->link = BOND_LINK_DOWN;
|
||||
|
||||
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP ||
|
||||
bond->params.mode == BOND_MODE_8023AD)
|
||||
bond_set_slave_inactive_flags(slave);
|
||||
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: link status definitely down for "
|
||||
"interface %s, disabling it\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
|
||||
if (bond->params.mode == BOND_MODE_8023AD)
|
||||
bond_3ad_handle_link_change(slave,
|
||||
BOND_LINK_DOWN);
|
||||
|
||||
if (bond->params.mode == BOND_MODE_TLB ||
|
||||
bond->params.mode == BOND_MODE_ALB)
|
||||
bond_alb_handle_link_change(bond, slave,
|
||||
BOND_LINK_DOWN);
|
||||
|
||||
if (slave == bond->curr_active_slave)
|
||||
goto do_failover;
|
||||
|
||||
continue;
|
||||
|
||||
default:
|
||||
/* Should not happen */
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": %s: Error: %s Illegal value (link=%d)\n",
|
||||
bond->dev->name,
|
||||
slave->dev->name,
|
||||
slave->link);
|
||||
goto out;
|
||||
} /* end of switch (slave->link) */
|
||||
": %s: invalid new link %d on slave %s\n",
|
||||
bond->dev->name, slave->new_link,
|
||||
slave->dev->name);
|
||||
slave->new_link = BOND_LINK_NOCHANGE;
|
||||
|
||||
bond_update_speed_duplex(slave);
|
||||
|
||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
||||
if (old_speed != slave->speed) {
|
||||
bond_3ad_adapter_speed_changed(slave);
|
||||
}
|
||||
|
||||
if (old_duplex != slave->duplex) {
|
||||
bond_3ad_adapter_duplex_changed(slave);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
} /* end of for */
|
||||
|
||||
if (do_failover) {
|
||||
do_failover:
|
||||
ASSERT_RTNL();
|
||||
|
||||
write_lock_bh(&bond->curr_slave_lock);
|
||||
|
||||
bond_select_active_slave(bond);
|
||||
|
||||
write_unlock_bh(&bond->curr_slave_lock);
|
||||
}
|
||||
|
||||
} else
|
||||
bond_set_carrier(bond);
|
||||
|
||||
out:
|
||||
return 0;
|
||||
bond_set_carrier(bond);
|
||||
}
|
||||
|
||||
/*
|
||||
* bond_mii_monitor
|
||||
*
|
||||
* Really a wrapper that splits the mii monitor into two phases: an
|
||||
* inspection, then (if inspection indicates something needs to be
|
||||
* done) an acquisition of appropriate locks followed by another pass
|
||||
* to implement whatever link state changes are indicated.
|
||||
* inspection, then (if inspection indicates something needs to be done)
|
||||
* an acquisition of appropriate locks followed by a commit phase to
|
||||
* implement whatever link state changes are indicated.
|
||||
*/
|
||||
void bond_mii_monitor(struct work_struct *work)
|
||||
{
|
||||
struct bonding *bond = container_of(work, struct bonding,
|
||||
mii_work.work);
|
||||
unsigned long delay;
|
||||
|
||||
read_lock(&bond->lock);
|
||||
if (bond->kill_timers) {
|
||||
read_unlock(&bond->lock);
|
||||
return;
|
||||
}
|
||||
if (bond->kill_timers)
|
||||
goto out;
|
||||
|
||||
if (bond->slave_cnt == 0)
|
||||
goto re_arm;
|
||||
|
||||
if (bond->send_grat_arp) {
|
||||
read_lock(&bond->curr_slave_lock);
|
||||
@@ -2496,19 +2441,24 @@ void bond_mii_monitor(struct work_struct *work)
|
||||
read_unlock(&bond->curr_slave_lock);
|
||||
}
|
||||
|
||||
if (__bond_mii_monitor(bond, 0)) {
|
||||
if (bond_miimon_inspect(bond)) {
|
||||
read_unlock(&bond->lock);
|
||||
rtnl_lock();
|
||||
read_lock(&bond->lock);
|
||||
__bond_mii_monitor(bond, 1);
|
||||
|
||||
bond_miimon_commit(bond);
|
||||
|
||||
read_unlock(&bond->lock);
|
||||
rtnl_unlock(); /* might sleep, hold no other locks */
|
||||
read_lock(&bond->lock);
|
||||
}
|
||||
|
||||
delay = msecs_to_jiffies(bond->params.miimon);
|
||||
re_arm:
|
||||
if (bond->params.miimon)
|
||||
queue_delayed_work(bond->wq, &bond->mii_work,
|
||||
msecs_to_jiffies(bond->params.miimon));
|
||||
out:
|
||||
read_unlock(&bond->lock);
|
||||
queue_delayed_work(bond->wq, &bond->mii_work, delay);
|
||||
}
|
||||
|
||||
static __be32 bond_glean_dev_ip(struct net_device *dev)
|
||||
|
||||
@@ -350,9 +350,6 @@ static ssize_t bonding_store_slaves(struct device *d,
|
||||
if (dev) {
|
||||
printk(KERN_INFO DRV_NAME ": %s: Removing slave %s\n",
|
||||
bond->dev->name, dev->name);
|
||||
if (bond->setup_by_slave)
|
||||
res = bond_release_and_destroy(bond->dev, dev);
|
||||
else
|
||||
res = bond_release(bond->dev, dev);
|
||||
if (res) {
|
||||
ret = res;
|
||||
|
||||
@@ -488,13 +488,6 @@ static void de620_set_multicast_list(struct net_device *dev)
|
||||
{
|
||||
if (dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
|
||||
{ /* Enable promiscuous mode */
|
||||
/*
|
||||
* We must make the kernel realise we had to move
|
||||
* into promisc mode or we start all out war on
|
||||
* the cable. - AC
|
||||
*/
|
||||
dev->flags|=IFF_PROMISC;
|
||||
|
||||
de620_set_register(dev, W_TCR, (TCR_DEF & ~RXPBM) | RXALL);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -1374,6 +1374,11 @@ dm9000_probe(struct platform_device *pdev)
|
||||
for (i = 0; i < 6; i += 2)
|
||||
dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);
|
||||
|
||||
if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
|
||||
mac_src = "platform data";
|
||||
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
|
||||
}
|
||||
|
||||
if (!is_valid_ether_addr(ndev->dev_addr)) {
|
||||
/* try reading from mac */
|
||||
|
||||
|
||||
+14
-17
@@ -41,24 +41,25 @@
|
||||
|
||||
struct e1000_info;
|
||||
|
||||
#define ndev_printk(level, netdev, format, arg...) \
|
||||
printk(level "%s: " format, (netdev)->name, ## arg)
|
||||
#define e_printk(level, adapter, format, arg...) \
|
||||
printk(level "%s: %s: " format, pci_name(adapter->pdev), \
|
||||
adapter->netdev->name, ## arg)
|
||||
|
||||
#ifdef DEBUG
|
||||
#define ndev_dbg(netdev, format, arg...) \
|
||||
ndev_printk(KERN_DEBUG , netdev, format, ## arg)
|
||||
#define e_dbg(format, arg...) \
|
||||
e_printk(KERN_DEBUG , adapter, format, ## arg)
|
||||
#else
|
||||
#define ndev_dbg(netdev, format, arg...) do { (void)(netdev); } while (0)
|
||||
#define e_dbg(format, arg...) do { (void)(adapter); } while (0)
|
||||
#endif
|
||||
|
||||
#define ndev_err(netdev, format, arg...) \
|
||||
ndev_printk(KERN_ERR , netdev, format, ## arg)
|
||||
#define ndev_info(netdev, format, arg...) \
|
||||
ndev_printk(KERN_INFO , netdev, format, ## arg)
|
||||
#define ndev_warn(netdev, format, arg...) \
|
||||
ndev_printk(KERN_WARNING , netdev, format, ## arg)
|
||||
#define ndev_notice(netdev, format, arg...) \
|
||||
ndev_printk(KERN_NOTICE , netdev, format, ## arg)
|
||||
#define e_err(format, arg...) \
|
||||
e_printk(KERN_ERR, adapter, format, ## arg)
|
||||
#define e_info(format, arg...) \
|
||||
e_printk(KERN_INFO, adapter, format, ## arg)
|
||||
#define e_warn(format, arg...) \
|
||||
e_printk(KERN_WARNING, adapter, format, ## arg)
|
||||
#define e_notice(format, arg...) \
|
||||
e_printk(KERN_NOTICE, adapter, format, ## arg)
|
||||
|
||||
|
||||
/* Tx/Rx descriptor defines */
|
||||
@@ -283,10 +284,6 @@ struct e1000_adapter {
|
||||
unsigned long led_status;
|
||||
|
||||
unsigned int flags;
|
||||
|
||||
/* for ioport free */
|
||||
int bars;
|
||||
int need_ioport;
|
||||
};
|
||||
|
||||
struct e1000_info {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user