Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50753817 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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

parents eeb059e0 6967bd81
Loading
Loading
Loading
Loading
+26 −12
Original line number Diff line number Diff line
@@ -586,6 +586,7 @@ struct rtl8139_private {
	dma_addr_t tx_bufs_dma;
	signed char phys[4];		/* MII device addresses. */
	char twistie, twist_row, twist_col;	/* Twister tune state. */
	unsigned int watchdog_fired : 1;
	unsigned int default_port : 4;	/* Last dev->if_port value. */
	unsigned int have_thread : 1;
	spinlock_t lock;
@@ -638,6 +639,7 @@ static void rtl8139_set_rx_mode (struct net_device *dev);
static void __set_rx_mode (struct net_device *dev);
static void rtl8139_hw_start (struct net_device *dev);
static void rtl8139_thread (void *_data);
static void rtl8139_tx_timeout_task(void *_data);
static struct ethtool_ops rtl8139_ethtool_ops;

/* write MMIO register, with flush */
@@ -1598,13 +1600,14 @@ static void rtl8139_thread (void *_data)
{
	struct net_device *dev = _data;
	struct rtl8139_private *tp = netdev_priv(dev);
	unsigned long thr_delay;
	unsigned long thr_delay = next_tick;

	if (rtnl_shlock_nowait() == 0) {
	if (tp->watchdog_fired) {
		tp->watchdog_fired = 0;
		rtl8139_tx_timeout_task(_data);
	} else if (rtnl_shlock_nowait() == 0) {
		rtl8139_thread_iter (dev, tp, tp->mmio_addr);
		rtnl_unlock ();

		thr_delay = next_tick;
	} else {
		/* unlikely race.  mitigate with fast poll. */
		thr_delay = HZ / 2;
@@ -1631,7 +1634,8 @@ static void rtl8139_stop_thread(struct rtl8139_private *tp)
	if (tp->have_thread) {
		cancel_rearming_delayed_work(&tp->thread);
		tp->have_thread = 0;
	}
	} else
		flush_scheduled_work();
}

static inline void rtl8139_tx_clear (struct rtl8139_private *tp)
@@ -1642,14 +1646,13 @@ static inline void rtl8139_tx_clear (struct rtl8139_private *tp)
	/* XXX account for unsent Tx packets in tp->stats.tx_dropped */
}


static void rtl8139_tx_timeout (struct net_device *dev)
static void rtl8139_tx_timeout_task (void *_data)
{
	struct net_device *dev = _data;
	struct rtl8139_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	int i;
	u8 tmp8;
	unsigned long flags;

	printk (KERN_DEBUG "%s: Transmit timeout, status %2.2x %4.4x %4.4x "
		"media %2.2x.\n", dev->name, RTL_R8 (ChipCmd),
@@ -1670,23 +1673,34 @@ static void rtl8139_tx_timeout (struct net_device *dev)
	if (tmp8 & CmdTxEnb)
		RTL_W8 (ChipCmd, CmdRxEnb);

	spin_lock(&tp->rx_lock);
	spin_lock_bh(&tp->rx_lock);
	/* Disable interrupts by clearing the interrupt mask. */
	RTL_W16 (IntrMask, 0x0000);

	/* Stop a shared interrupt from scavenging while we are. */
	spin_lock_irqsave (&tp->lock, flags);
	spin_lock_irq(&tp->lock);
	rtl8139_tx_clear (tp);
	spin_unlock_irqrestore (&tp->lock, flags);
	spin_unlock_irq(&tp->lock);

	/* ...and finally, reset everything */
	if (netif_running(dev)) {
		rtl8139_hw_start (dev);
		netif_wake_queue (dev);
	}
	spin_unlock(&tp->rx_lock);
	spin_unlock_bh(&tp->rx_lock);
}

static void rtl8139_tx_timeout (struct net_device *dev)
{
	struct rtl8139_private *tp = netdev_priv(dev);

	if (!tp->have_thread) {
		INIT_WORK(&tp->thread, rtl8139_tx_timeout_task, dev);
		schedule_delayed_work(&tp->thread, next_tick);
	} else
		tp->watchdog_fired = 1;

}

static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev)
{
+1 −6
Original line number Diff line number Diff line
@@ -4,9 +4,9 @@
#

menu "Network device support"
	depends on NET

config NETDEVICES
	depends on NET
	default y if UML
	bool "Network device support"
	---help---
@@ -24,9 +24,6 @@ config NETDEVICES

	  If unsure, say Y.

# All the following symbols are dependent on NETDEVICES - do not repeat
# that for each of the symbols.
if NETDEVICES

config IFB
	tristate "Intermediate Functional Block support"
@@ -2718,8 +2715,6 @@ config NETCONSOLE
	If you want to log kernel messages over the network, enable this.
	See <file:Documentation/networking/netconsole.txt> for details.

endif #NETDEVICES

config NETPOLL
	def_bool NETCONSOLE

+14 −1
Original line number Diff line number Diff line
@@ -1145,7 +1145,8 @@ int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev)
}

#define BOND_INTERSECT_FEATURES \
	(NETIF_F_SG|NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM)
	(NETIF_F_SG|NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM|\
	NETIF_F_TSO|NETIF_F_UFO)

/* 
 * Compute the common dev->feature set available to all slaves.  Some
@@ -1168,6 +1169,16 @@ static int bond_compute_features(struct bonding *bond)
			  NETIF_F_HW_CSUM)))
		features &= ~NETIF_F_SG;

	/* 
	 * features will include NETIF_F_TSO (NETIF_F_UFO) iff all 
	 * slave devices support NETIF_F_TSO (NETIF_F_UFO), which 
	 * implies that all slaves also support scatter-gather 
	 * (NETIF_F_SG), which implies that features also includes 
	 * NETIF_F_SG. So no need to check whether we have an  
	 * illegal combination of NETIF_F_{TSO,UFO} and 
	 * !NETIF_F_SG 
	 */

	features |= (bond_dev->features & ~BOND_INTERSECT_FEATURES);
	bond_dev->features = features;

@@ -4080,6 +4091,8 @@ static void bond_ethtool_get_drvinfo(struct net_device *bond_dev,

static struct ethtool_ops bond_ethtool_ops = {
	.get_tx_csum		= ethtool_op_get_tx_csum,
	.get_tso		= ethtool_op_get_tso,
	.get_ufo		= ethtool_op_get_ufo,
	.get_sg			= ethtool_op_get_sg,
	.get_drvinfo		= bond_ethtool_get_drvinfo,
};
+3 −3
Original line number Diff line number Diff line
@@ -260,7 +260,7 @@ static ssize_t bonding_store_slaves(struct class_device *cd, const char *buffer,
	char *ifname;
	int i, res, found, ret = count;
	struct slave *slave;
	struct net_device *dev = 0;
	struct net_device *dev = NULL;
	struct bonding *bond = to_bond(cd);

	/* Quick sanity check -- is the bond interface up? */
@@ -995,7 +995,7 @@ static ssize_t bonding_store_primary(struct class_device *cd, const char *buf, s
			printk(KERN_INFO DRV_NAME
			       ": %s: Setting primary slave to None.\n",
			       bond->dev->name);
			bond->primary_slave = 0;
			bond->primary_slave = NULL;
				bond_select_active_slave(bond);
		} else {
			printk(KERN_INFO DRV_NAME
@@ -1123,7 +1123,7 @@ static ssize_t bonding_store_active_slave(struct class_device *cd, const char *b
			printk(KERN_INFO DRV_NAME
			       ": %s: Setting active slave to None.\n",
			       bond->dev->name);
			bond->primary_slave = 0;
			bond->primary_slave = NULL;
				bond_select_active_slave(bond);
		} else {
			printk(KERN_INFO DRV_NAME
+0 −2
Original line number Diff line number Diff line
@@ -2752,8 +2752,6 @@ static int e100_resume(struct pci_dev *pdev)
	retval = pci_enable_wake(pdev, 0, 0);
	if (retval)
		DPRINTK(PROBE,ERR, "Error clearing wake events\n");
	if(e100_hw_init(nic))
		DPRINTK(HW, ERR, "e100_hw_init failed\n");

	netif_device_attach(netdev);
	if(netif_running(netdev))
Loading