Просмотр исходного кода

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

Conflicts:

	net/mac80211/rc80211_pid_algo.c
David S. Miller 17 лет назад
Родитель
Сommit
255333c1db

+ 4 - 28
MAINTAINERS

@@ -2039,43 +2039,19 @@ M:	kernel@wantstofly.org
 L:	netdev@vger.kernel.org
 L:	netdev@vger.kernel.org
 S:	Maintained
 S:	Maintained
 
 
-INTEL PRO/100 ETHERNET SUPPORT
+INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/ixgb/ixgbe)
 P:	Auke Kok
 P:	Auke Kok
 M:	auke-jan.h.kok@intel.com
 M:	auke-jan.h.kok@intel.com
 P:	Jesse Brandeburg
 P:	Jesse Brandeburg
 M:	jesse.brandeburg@intel.com
 M:	jesse.brandeburg@intel.com
 P:	Jeff Kirsher
 P:	Jeff Kirsher
 M:	jeffrey.t.kirsher@intel.com
 M:	jeffrey.t.kirsher@intel.com
+P:	Bruce Allan
+M:	bruce.w.allan@intel.com
 P:	John Ronciak
 P:	John Ronciak
 M:	john.ronciak@intel.com
 M:	john.ronciak@intel.com
 L:	e1000-devel@lists.sourceforge.net
 L:	e1000-devel@lists.sourceforge.net
-W:	http://sourceforge.net/projects/e1000/
-S:	Supported
-
-INTEL PRO/1000 GIGABIT ETHERNET SUPPORT
-P:	Auke Kok
-M:	auke-jan.h.kok@intel.com
-P:	Jesse Brandeburg
-M:	jesse.brandeburg@intel.com
-P:	Jeff Kirsher
-M:	jeffrey.t.kirsher@intel.com
-P:	John Ronciak
-M:	john.ronciak@intel.com
-L:	e1000-devel@lists.sourceforge.net
-W:	http://sourceforge.net/projects/e1000/
-S:	Supported
-
-INTEL PRO/10GbE SUPPORT
-P:	Ayyappan Veeraiyan
-M:	ayyappan.veeraiyan@intel.com
-P:	Auke Kok
-M:	auke-jan.h.kok@intel.com
-P:	Jesse Brandeburg
-M:	jesse.brandeburg@intel.com
-P:	John Ronciak
-M:	john.ronciak@intel.com
-L:	e1000-devel@lists.sourceforge.net
-W:	http://sourceforge.net/projects/e1000/
+W:	http://e1000.sourceforge.net/
 S:	Supported
 S:	Supported
 
 
 INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
 INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT

+ 1 - 1
drivers/net/Kconfig

@@ -2519,7 +2519,7 @@ config CHELSIO_T3
 
 
 config EHEA
 config EHEA
 	tristate "eHEA Ethernet support"
 	tristate "eHEA Ethernet support"
-	depends on IBMEBUS && INET
+	depends on IBMEBUS && INET && SPARSEMEM
 	select INET_LRO
 	select INET_LRO
 	---help---
 	---help---
 	  This driver supports the IBM pSeries eHEA ethernet adapter.
 	  This driver supports the IBM pSeries eHEA ethernet adapter.

+ 2 - 3
drivers/net/atarilance.c

@@ -336,8 +336,6 @@ struct lance_addr {
 
 
 /***************************** Prototypes *****************************/
 /***************************** Prototypes *****************************/
 
 
-static int addr_accessible( volatile void *regp, int wordflag, int
-                            writeflag );
 static unsigned long lance_probe1( struct net_device *dev, struct lance_addr
 static unsigned long lance_probe1( struct net_device *dev, struct lance_addr
                                    *init_rec );
                                    *init_rec );
 static int lance_open( struct net_device *dev );
 static int lance_open( struct net_device *dev );
@@ -406,7 +404,8 @@ struct net_device * __init atarilance_probe(int unit)
 
 
 /* Derived from hwreg_present() in atari/config.c: */
 /* Derived from hwreg_present() in atari/config.c: */
 
 
-static int __init addr_accessible( volatile void *regp, int wordflag, int writeflag )
+static noinline int __init addr_accessible(volatile void *regp, int wordflag,
+					   int writeflag)
 {
 {
 	int		ret;
 	int		ret;
 	long	flags;
 	long	flags;

+ 3 - 26
drivers/net/e100.c

@@ -2782,16 +2782,13 @@ static void __devexit e100_remove(struct pci_dev *pdev)
 	}
 	}
 }
 }
 
 
-#ifdef CONFIG_PM
 static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
 static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
 {
 {
 	struct net_device *netdev = pci_get_drvdata(pdev);
 	struct net_device *netdev = pci_get_drvdata(pdev);
 	struct nic *nic = netdev_priv(netdev);
 	struct nic *nic = netdev_priv(netdev);
 
 
 	if (netif_running(netdev))
 	if (netif_running(netdev))
-		napi_disable(&nic->napi);
-	del_timer_sync(&nic->watchdog);
-	netif_carrier_off(nic->netdev);
+		e100_down(nic);
 	netif_device_detach(netdev);
 	netif_device_detach(netdev);
 
 
 	pci_save_state(pdev);
 	pci_save_state(pdev);
@@ -2804,14 +2801,13 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
 		pci_enable_wake(pdev, PCI_D3cold, 0);
 		pci_enable_wake(pdev, PCI_D3cold, 0);
 	}
 	}
 
 
-	free_irq(pdev->irq, netdev);
-
 	pci_disable_device(pdev);
 	pci_disable_device(pdev);
 	pci_set_power_state(pdev, PCI_D3hot);
 	pci_set_power_state(pdev, PCI_D3hot);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
+#ifdef CONFIG_PM
 static int e100_resume(struct pci_dev *pdev)
 static int e100_resume(struct pci_dev *pdev)
 {
 {
 	struct net_device *netdev = pci_get_drvdata(pdev);
 	struct net_device *netdev = pci_get_drvdata(pdev);
@@ -2832,26 +2828,7 @@ static int e100_resume(struct pci_dev *pdev)
 
 
 static void e100_shutdown(struct pci_dev *pdev)
 static void e100_shutdown(struct pci_dev *pdev)
 {
 {
-	struct net_device *netdev = pci_get_drvdata(pdev);
-	struct nic *nic = netdev_priv(netdev);
-
-	if (netif_running(netdev))
-		napi_disable(&nic->napi);
-	del_timer_sync(&nic->watchdog);
-	netif_carrier_off(nic->netdev);
-
-	if ((nic->flags & wol_magic) | e100_asf(nic)) {
-		pci_enable_wake(pdev, PCI_D3hot, 1);
-		pci_enable_wake(pdev, PCI_D3cold, 1);
-	} else {
-		pci_enable_wake(pdev, PCI_D3hot, 0);
-		pci_enable_wake(pdev, PCI_D3cold, 0);
-	}
-
-	free_irq(pdev->irq, netdev);
-
-	pci_disable_device(pdev);
-	pci_set_power_state(pdev, PCI_D3hot);
+	e100_suspend(pdev, PMSG_SUSPEND);
 }
 }
 
 
 /* ------------------ PCI Error Recovery infrastructure  -------------- */
 /* ------------------ PCI Error Recovery infrastructure  -------------- */

+ 1 - 1
drivers/net/ixgbe/ixgbe_main.c

@@ -2133,7 +2133,7 @@ static void ixgbe_watchdog(unsigned long data)
 				(link_speed == IXGBE_LINK_SPEED_10GB_FULL ?
 				(link_speed == IXGBE_LINK_SPEED_10GB_FULL ?
 				 "10 Gbps" :
 				 "10 Gbps" :
 				 (link_speed == IXGBE_LINK_SPEED_1GB_FULL ?
 				 (link_speed == IXGBE_LINK_SPEED_1GB_FULL ?
-				  "1 Gpbs" : "unknown speed")),
+				  "1 Gbps" : "unknown speed")),
 				((FLOW_RX && FLOW_TX) ? "RX/TX" :
 				((FLOW_RX && FLOW_TX) ? "RX/TX" :
 				 (FLOW_RX ? "RX" :
 				 (FLOW_RX ? "RX" :
 				 (FLOW_TX ? "TX" : "None"))));
 				 (FLOW_TX ? "TX" : "None"))));

+ 1 - 0
drivers/net/mv643xx_eth.c

@@ -2104,6 +2104,7 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR(	"Rabeeh Khoury, Assaf Hoffman, Matthew Dharm, Manish Lachwani"
 MODULE_AUTHOR(	"Rabeeh Khoury, Assaf Hoffman, Matthew Dharm, Manish Lachwani"
 		" and Dale Farnsworth");
 		" and Dale Farnsworth");
 MODULE_DESCRIPTION("Ethernet driver for Marvell MV643XX");
 MODULE_DESCRIPTION("Ethernet driver for Marvell MV643XX");
+MODULE_ALIAS("platform:mv643xx_eth");
 
 
 /*
 /*
  * The second part is the low level driver of the gigE ethernet ports.
  * The second part is the low level driver of the gigE ethernet ports.

+ 1 - 1
drivers/net/pcmcia/axnet_cs.c

@@ -1268,7 +1268,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id)
 		}
 		}
 	}
 	}
     
     
-	if (interrupts && ei_debug) 
+	if (interrupts && ei_debug > 3) 
 	{
 	{
 		handled = 1;
 		handled = 1;
 		if (nr_serviced >= MAX_SERVICE) 
 		if (nr_serviced >= MAX_SERVICE) 

+ 1 - 0
drivers/net/phy/Kconfig

@@ -67,6 +67,7 @@ config REALTEK_PHY
 
 
 config FIXED_PHY
 config FIXED_PHY
 	bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
 	bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
+	depends on PHYLIB=y
 	---help---
 	---help---
 	  Adds the platform "fixed" MDIO Bus to cover the boards that use
 	  Adds the platform "fixed" MDIO Bus to cover the boards that use
 	  PHYs that are not connected to the real MDIO bus.
 	  PHYs that are not connected to the real MDIO bus.

+ 14 - 3
drivers/net/phy/davicom.c

@@ -37,6 +37,7 @@
 
 
 #define MII_DM9161_SCR		0x10
 #define MII_DM9161_SCR		0x10
 #define MII_DM9161_SCR_INIT	0x0610
 #define MII_DM9161_SCR_INIT	0x0610
+#define MII_DM9161_SCR_RMII	0x0100
 
 
 /* DM9161 Interrupt Register */
 /* DM9161 Interrupt Register */
 #define MII_DM9161_INTR	0x15
 #define MII_DM9161_INTR	0x15
@@ -103,7 +104,7 @@ static int dm9161_config_aneg(struct phy_device *phydev)
 
 
 static int dm9161_config_init(struct phy_device *phydev)
 static int dm9161_config_init(struct phy_device *phydev)
 {
 {
-	int err;
+	int err, temp;
 
 
 	/* Isolate the PHY */
 	/* Isolate the PHY */
 	err = phy_write(phydev, MII_BMCR, BMCR_ISOLATE);
 	err = phy_write(phydev, MII_BMCR, BMCR_ISOLATE);
@@ -111,9 +112,19 @@ static int dm9161_config_init(struct phy_device *phydev)
 	if (err < 0)
 	if (err < 0)
 		return err;
 		return err;
 
 
-	/* Do not bypass the scrambler/descrambler */
-	err = phy_write(phydev, MII_DM9161_SCR, MII_DM9161_SCR_INIT);
+	switch (phydev->interface) {
+	case PHY_INTERFACE_MODE_MII:
+		temp = MII_DM9161_SCR_INIT;
+		break;
+	case PHY_INTERFACE_MODE_RMII:
+		temp =  MII_DM9161_SCR_INIT | MII_DM9161_SCR_RMII;
+		break;
+	default:
+		return -EINVAL;
+	}
 
 
+	/* Do not bypass the scrambler/descrambler */
+	err = phy_write(phydev, MII_DM9161_SCR, temp);
 	if (err < 0)
 	if (err < 0)
 		return err;
 		return err;
 
 

+ 7 - 1
drivers/net/pppol2tp.c

@@ -455,6 +455,7 @@ static void pppol2tp_recv_dequeue(struct pppol2tp_session *session)
 			       skb_queue_len(&session->reorder_q));
 			       skb_queue_len(&session->reorder_q));
 			__skb_unlink(skb, &session->reorder_q);
 			__skb_unlink(skb, &session->reorder_q);
 			kfree_skb(skb);
 			kfree_skb(skb);
+			sock_put(session->sock);
 			continue;
 			continue;
 		}
 		}
 
 
@@ -1110,6 +1111,8 @@ static void pppol2tp_tunnel_closeall(struct pppol2tp_tunnel *tunnel)
 	for (hash = 0; hash < PPPOL2TP_HASH_SIZE; hash++) {
 	for (hash = 0; hash < PPPOL2TP_HASH_SIZE; hash++) {
 again:
 again:
 		hlist_for_each_safe(walk, tmp, &tunnel->session_hlist[hash]) {
 		hlist_for_each_safe(walk, tmp, &tunnel->session_hlist[hash]) {
+			struct sk_buff *skb;
+
 			session = hlist_entry(walk, struct pppol2tp_session, hlist);
 			session = hlist_entry(walk, struct pppol2tp_session, hlist);
 
 
 			sk = session->sock;
 			sk = session->sock;
@@ -1138,7 +1141,10 @@ again:
 			/* Purge any queued data */
 			/* Purge any queued data */
 			skb_queue_purge(&sk->sk_receive_queue);
 			skb_queue_purge(&sk->sk_receive_queue);
 			skb_queue_purge(&sk->sk_write_queue);
 			skb_queue_purge(&sk->sk_write_queue);
-			skb_queue_purge(&session->reorder_q);
+			while ((skb = skb_dequeue(&session->reorder_q))) {
+				kfree_skb(skb);
+				sock_put(sk);
+			}
 
 
 			release_sock(sk);
 			release_sock(sk);
 			sock_put(sk);
 			sock_put(sk);

+ 1 - 1
drivers/net/s2io.c

@@ -1088,7 +1088,7 @@ static int s2io_print_pci_mode(struct s2io_nic *nic)
  *  '-1' on failure
  *  '-1' on failure
  */
  */
 
 
-int init_tti(struct s2io_nic *nic, int link)
+static int init_tti(struct s2io_nic *nic, int link)
 {
 {
 	struct XENA_dev_config __iomem *bar0 = nic->bar0;
 	struct XENA_dev_config __iomem *bar0 = nic->bar0;
 	register u64 val64 = 0;
 	register u64 val64 = 0;

+ 2 - 1
drivers/net/tulip/de2104x.c

@@ -910,7 +910,8 @@ 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);
 
 
-	BUG_ON(de_is_running(de));
+	if (de_is_running(de))
+		printk(KERN_WARNING "%s: chip is running while changing media!\n", de->dev->name);
 
 
 	if (de->de21040)
 	if (de->de21040)
 		dw32(CSR11, FULL_DUPLEX_MAGIC);
 		dw32(CSR11, FULL_DUPLEX_MAGIC);

+ 5 - 1
drivers/net/tun.c

@@ -663,7 +663,11 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
 	case SIOCSIFHWADDR:
 	case SIOCSIFHWADDR:
 	{
 	{
 		/* try to set the actual net device's hw address */
 		/* try to set the actual net device's hw address */
-		int ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr);
+		int ret;
+
+		rtnl_lock();
+		ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr);
+		rtnl_unlock();
 
 
 		if (ret == 0) {
 		if (ret == 0) {
 			/** Set the character device's hardware address. This is used when
 			/** Set the character device's hardware address. This is used when

+ 1 - 1
drivers/net/wireless/b43legacy/main.c

@@ -3870,7 +3870,7 @@ static void b43legacy_print_driverinfo(void)
 #ifdef CONFIG_B43LEGACY_DMA
 #ifdef CONFIG_B43LEGACY_DMA
 	feat_dma = "D";
 	feat_dma = "D";
 #endif
 #endif
-	printk(KERN_INFO "Broadcom 43xx driver loaded "
+	printk(KERN_INFO "Broadcom 43xx-legacy driver loaded "
 	       "[ Features: %s%s%s%s%s, Firmware-ID: "
 	       "[ Features: %s%s%s%s%s, Firmware-ID: "
 	       B43legacy_SUPPORTED_FIRMWARE_ID " ]\n",
 	       B43legacy_SUPPORTED_FIRMWARE_ID " ]\n",
 	       feat_pci, feat_leds, feat_rfkill, feat_pio, feat_dma);
 	       feat_pci, feat_leds, feat_rfkill, feat_pio, feat_dma);

+ 3 - 5
drivers/net/wireless/libertas/cmdresp.c

@@ -562,9 +562,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
 	}
 	}
 
 
 	resp = (void *)priv->upld_buf;
 	resp = (void *)priv->upld_buf;
-
-	curcmd = le16_to_cpu(resp->command);
-
+	curcmd = le16_to_cpu(priv->cur_cmd->cmdbuf->command);
 	respcmd = le16_to_cpu(resp->command);
 	respcmd = le16_to_cpu(resp->command);
 	result = le16_to_cpu(resp->result);
 	result = le16_to_cpu(resp->result);
 
 
@@ -572,9 +570,9 @@ int lbs_process_rx_command(struct lbs_private *priv)
 		     respcmd, le16_to_cpu(resp->seqnum), priv->upld_len, jiffies);
 		     respcmd, le16_to_cpu(resp->seqnum), priv->upld_len, jiffies);
 	lbs_deb_hex(LBS_DEB_CMD, "CMD_RESP", (void *) resp, priv->upld_len);
 	lbs_deb_hex(LBS_DEB_CMD, "CMD_RESP", (void *) resp, priv->upld_len);
 
 
-	if (resp->seqnum != resp->seqnum) {
+	if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) {
 		lbs_pr_info("Received CMD_RESP with invalid sequence %d (expected %d)\n",
 		lbs_pr_info("Received CMD_RESP with invalid sequence %d (expected %d)\n",
-			    le16_to_cpu(resp->seqnum), le16_to_cpu(resp->seqnum));
+			    le16_to_cpu(resp->seqnum), le16_to_cpu(priv->cur_cmd->cmdbuf->seqnum));
 		spin_unlock_irqrestore(&priv->driver_lock, flags);
 		spin_unlock_irqrestore(&priv->driver_lock, flags);
 		ret = -1;
 		ret = -1;
 		goto done;
 		goto done;

+ 12 - 8
drivers/net/wireless/p54common.c

@@ -206,18 +206,23 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
 	struct p54_common *priv = dev->priv;
 	struct p54_common *priv = dev->priv;
 	struct eeprom_pda_wrap *wrap = NULL;
 	struct eeprom_pda_wrap *wrap = NULL;
 	struct pda_entry *entry;
 	struct pda_entry *entry;
-	int i = 0;
 	unsigned int data_len, entry_len;
 	unsigned int data_len, entry_len;
 	void *tmp;
 	void *tmp;
 	int err;
 	int err;
+	u8 *end = (u8 *)eeprom + len;
 
 
 	wrap = (struct eeprom_pda_wrap *) eeprom;
 	wrap = (struct eeprom_pda_wrap *) eeprom;
-	entry = (void *)wrap->data + wrap->len;
-	i += 2;
-	i += le16_to_cpu(entry->len)*2;
-	while (i < len) {
+	entry = (void *)wrap->data + le16_to_cpu(wrap->len);
+
+	/* verify that at least the entry length/code fits */
+	while ((u8 *)entry <= end - sizeof(*entry)) {
 		entry_len = le16_to_cpu(entry->len);
 		entry_len = le16_to_cpu(entry->len);
 		data_len = ((entry_len - 1) << 1);
 		data_len = ((entry_len - 1) << 1);
+
+		/* abort if entry exceeds whole structure */
+		if ((u8 *)entry + sizeof(*entry) + data_len > end)
+			break;
+
 		switch (le16_to_cpu(entry->code)) {
 		switch (le16_to_cpu(entry->code)) {
 		case PDR_MAC_ADDRESS:
 		case PDR_MAC_ADDRESS:
 			SET_IEEE80211_PERM_ADDR(dev, entry->data);
 			SET_IEEE80211_PERM_ADDR(dev, entry->data);
@@ -289,7 +294,8 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
 			priv->version = *(u8 *)(entry->data + 1);
 			priv->version = *(u8 *)(entry->data + 1);
 			break;
 			break;
 		case PDR_END:
 		case PDR_END:
-			i = len;
+			/* make it overrun */
+			entry_len = len;
 			break;
 			break;
 		default:
 		default:
 			printk(KERN_INFO "p54: unknown eeprom code : 0x%x\n",
 			printk(KERN_INFO "p54: unknown eeprom code : 0x%x\n",
@@ -298,8 +304,6 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
 		}
 		}
 
 
 		entry = (void *)entry + (entry_len + 1)*2;
 		entry = (void *)entry + (entry_len + 1)*2;
-		i += 2;
-		i += entry_len*2;
 	}
 	}
 
 
 	if (!priv->iq_autocal || !priv->output_limit || !priv->curve_data) {
 	if (!priv->iq_autocal || !priv->output_limit || !priv->curve_data) {

+ 4 - 4
drivers/net/wireless/p54common.h

@@ -53,10 +53,10 @@ struct pda_entry {
 } __attribute__ ((packed));
 } __attribute__ ((packed));
 
 
 struct eeprom_pda_wrap {
 struct eeprom_pda_wrap {
-	u32 magic;
-	u16 pad;
-	u16 len;
-	u32 arm_opcode;
+	__le32 magic;
+	__le16 pad;
+	__le16 len;
+	__le32 arm_opcode;
 	u8 data[0];
 	u8 data[0];
 } __attribute__ ((packed));
 } __attribute__ ((packed));
 
 

+ 3 - 5
drivers/net/wireless/rndis_wlan.c

@@ -260,7 +260,7 @@ struct NDIS_802_11_KEY {
 	__le32 KeyLength;
 	__le32 KeyLength;
 	u8 Bssid[6];
 	u8 Bssid[6];
 	u8 Padding[6];
 	u8 Padding[6];
-	__le64 KeyRSC;
+	u8 KeyRSC[8];
 	u8 KeyMaterial[32];
 	u8 KeyMaterial[32];
 } __attribute__((packed));
 } __attribute__((packed));
 
 
@@ -1508,7 +1508,7 @@ static int rndis_iw_set_encode_ext(struct net_device *dev,
 	struct usbnet *usbdev = dev->priv;
 	struct usbnet *usbdev = dev->priv;
 	struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev);
 	struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev);
 	struct NDIS_802_11_KEY ndis_key;
 	struct NDIS_802_11_KEY ndis_key;
-	int i, keyidx, ret;
+	int keyidx, ret;
 	u8 *addr;
 	u8 *addr;
 
 
 	keyidx = wrqu->encoding.flags & IW_ENCODE_INDEX;
 	keyidx = wrqu->encoding.flags & IW_ENCODE_INDEX;
@@ -1543,9 +1543,7 @@ static int rndis_iw_set_encode_ext(struct net_device *dev,
 	ndis_key.KeyIndex = cpu_to_le32(keyidx);
 	ndis_key.KeyIndex = cpu_to_le32(keyidx);
 
 
 	if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {
 	if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {
-		for (i = 0; i < 6; i++)
-			ndis_key.KeyRSC |=
-				cpu_to_le64(ext->rx_seq[i] << (i * 8));
+		memcpy(ndis_key.KeyRSC, ext->rx_seq, 6);
 		ndis_key.KeyIndex |= cpu_to_le32(1 << 29);
 		ndis_key.KeyIndex |= cpu_to_le32(1 << 29);
 	}
 	}
 
 

+ 4 - 1
drivers/ssb/driver_pcicore.c

@@ -111,7 +111,10 @@ static void __init ssb_fixup_pcibridge(struct pci_dev *dev)
 
 
 	/* Enable PCI bridge bus mastering and memory space */
 	/* Enable PCI bridge bus mastering and memory space */
 	pci_set_master(dev);
 	pci_set_master(dev);
-	pcibios_enable_device(dev, ~0);
+	if (pcibios_enable_device(dev, ~0) < 0) {
+		ssb_printk(KERN_ERR "PCI: SSB bridge enable failed\n");
+		return;
+	}
 
 
 	/* Enable PCI bridge BAR1 prefetch and burst */
 	/* Enable PCI bridge BAR1 prefetch and burst */
 	pci_write_config_dword(dev, SSB_BAR1_CONTROL, 3);
 	pci_write_config_dword(dev, SSB_BAR1_CONTROL, 3);

+ 4 - 3
include/linux/netpoll.h

@@ -25,6 +25,7 @@ struct netpoll {
 
 
 struct netpoll_info {
 struct netpoll_info {
 	atomic_t refcnt;
 	atomic_t refcnt;
+	int rx_flags;
 	spinlock_t rx_lock;
 	spinlock_t rx_lock;
 	struct netpoll *rx_np; /* netpoll that registered an rx_hook */
 	struct netpoll *rx_np; /* netpoll that registered an rx_hook */
 	struct sk_buff_head arp_tx; /* list of arp requests to reply to */
 	struct sk_buff_head arp_tx; /* list of arp requests to reply to */
@@ -50,12 +51,12 @@ static inline int netpoll_rx(struct sk_buff *skb)
 	unsigned long flags;
 	unsigned long flags;
 	int ret = 0;
 	int ret = 0;
 
 
-	if (!npinfo || !npinfo->rx_np)
+	if (!npinfo || (!npinfo->rx_np && !npinfo->rx_flags))
 		return 0;
 		return 0;
 
 
 	spin_lock_irqsave(&npinfo->rx_lock, flags);
 	spin_lock_irqsave(&npinfo->rx_lock, flags);
-	/* check rx_np again with the lock held */
-	if (npinfo->rx_np && __netpoll_rx(skb))
+	/* check rx_flags again with the lock held */
+	if (npinfo->rx_flags && __netpoll_rx(skb))
 		ret = 1;
 		ret = 1;
 	spin_unlock_irqrestore(&npinfo->rx_lock, flags);
 	spin_unlock_irqrestore(&npinfo->rx_lock, flags);
 
 

+ 2 - 1
include/net/inet_sock.h

@@ -175,7 +175,8 @@ extern void build_ehash_secret(void);
 static inline unsigned int inet_ehashfn(const __be32 laddr, const __u16 lport,
 static inline unsigned int inet_ehashfn(const __be32 laddr, const __u16 lport,
 					const __be32 faddr, const __be16 fport)
 					const __be32 faddr, const __be16 fport)
 {
 {
-	return jhash_2words((__force __u32) laddr ^ (__force __u32) faddr,
+	return jhash_3words((__force __u32) laddr,
+			    (__force __u32) faddr,
 			    ((__u32) lport) << 16 | (__force __u32)fport,
 			    ((__u32) lport) << 16 | (__force __u32)fport,
 			    inet_ehash_secret);
 			    inet_ehash_secret);
 }
 }

+ 2 - 1
net/bluetooth/l2cap.c

@@ -417,7 +417,8 @@ static void l2cap_conn_del(struct hci_conn *hcon, int err)
 		l2cap_sock_kill(sk);
 		l2cap_sock_kill(sk);
 	}
 	}
 
 
-	del_timer_sync(&conn->info_timer);
+	if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
+		del_timer_sync(&conn->info_timer);
 
 
 	hcon->l2cap_data = NULL;
 	hcon->l2cap_data = NULL;
 	kfree(conn);
 	kfree(conn);

+ 1 - 1
net/core/neighbour.c

@@ -839,7 +839,7 @@ static void neigh_timer_handler(unsigned long arg)
 		struct sk_buff *skb = skb_peek(&neigh->arp_queue);
 		struct sk_buff *skb = skb_peek(&neigh->arp_queue);
 		/* keep skb alive even if arp_queue overflows */
 		/* keep skb alive even if arp_queue overflows */
 		if (skb)
 		if (skb)
-			skb_get(skb);
+			skb = skb_copy(skb, GFP_ATOMIC);
 		write_unlock(&neigh->lock);
 		write_unlock(&neigh->lock);
 		neigh->ops->solicit(neigh, skb);
 		neigh->ops->solicit(neigh, skb);
 		atomic_inc(&neigh->probes);
 		atomic_inc(&neigh->probes);

+ 8 - 4
net/core/netpoll.c

@@ -39,6 +39,8 @@ static struct sk_buff_head skb_pool;
 static atomic_t trapped;
 static atomic_t trapped;
 
 
 #define USEC_PER_POLL	50
 #define USEC_PER_POLL	50
+#define NETPOLL_RX_ENABLED  1
+#define NETPOLL_RX_DROP     2
 
 
 #define MAX_SKB_SIZE \
 #define MAX_SKB_SIZE \
 		(MAX_UDP_CHUNK + sizeof(struct udphdr) + \
 		(MAX_UDP_CHUNK + sizeof(struct udphdr) + \
@@ -126,11 +128,13 @@ static int poll_one_napi(struct netpoll_info *npinfo,
 	if (!test_bit(NAPI_STATE_SCHED, &napi->state))
 	if (!test_bit(NAPI_STATE_SCHED, &napi->state))
 		return budget;
 		return budget;
 
 
+	npinfo->rx_flags |= NETPOLL_RX_DROP;
 	atomic_inc(&trapped);
 	atomic_inc(&trapped);
 
 
 	work = napi->poll(napi, budget);
 	work = napi->poll(napi, budget);
 
 
 	atomic_dec(&trapped);
 	atomic_dec(&trapped);
+	npinfo->rx_flags &= ~NETPOLL_RX_DROP;
 
 
 	return budget - work;
 	return budget - work;
 }
 }
@@ -470,7 +474,7 @@ int __netpoll_rx(struct sk_buff *skb)
 	if (skb->dev->type != ARPHRD_ETHER)
 	if (skb->dev->type != ARPHRD_ETHER)
 		goto out;
 		goto out;
 
 
-	/* if receive ARP during middle of NAPI poll, then queue */
+	/* check if netpoll clients need ARP */
 	if (skb->protocol == htons(ETH_P_ARP) &&
 	if (skb->protocol == htons(ETH_P_ARP) &&
 	    atomic_read(&trapped)) {
 	    atomic_read(&trapped)) {
 		skb_queue_tail(&npi->arp_tx, skb);
 		skb_queue_tail(&npi->arp_tx, skb);
@@ -532,9 +536,6 @@ int __netpoll_rx(struct sk_buff *skb)
 	return 1;
 	return 1;
 
 
 out:
 out:
-	/* If packet received while already in poll then just
-	 * silently drop.
-	 */
 	if (atomic_read(&trapped)) {
 	if (atomic_read(&trapped)) {
 		kfree_skb(skb);
 		kfree_skb(skb);
 		return 1;
 		return 1;
@@ -673,6 +674,7 @@ int netpoll_setup(struct netpoll *np)
 			goto release;
 			goto release;
 		}
 		}
 
 
+		npinfo->rx_flags = 0;
 		npinfo->rx_np = NULL;
 		npinfo->rx_np = NULL;
 
 
 		spin_lock_init(&npinfo->rx_lock);
 		spin_lock_init(&npinfo->rx_lock);
@@ -754,6 +756,7 @@ int netpoll_setup(struct netpoll *np)
 
 
 	if (np->rx_hook) {
 	if (np->rx_hook) {
 		spin_lock_irqsave(&npinfo->rx_lock, flags);
 		spin_lock_irqsave(&npinfo->rx_lock, flags);
+		npinfo->rx_flags |= NETPOLL_RX_ENABLED;
 		npinfo->rx_np = np;
 		npinfo->rx_np = np;
 		spin_unlock_irqrestore(&npinfo->rx_lock, flags);
 		spin_unlock_irqrestore(&npinfo->rx_lock, flags);
 	}
 	}
@@ -795,6 +798,7 @@ void netpoll_cleanup(struct netpoll *np)
 			if (npinfo->rx_np == np) {
 			if (npinfo->rx_np == np) {
 				spin_lock_irqsave(&npinfo->rx_lock, flags);
 				spin_lock_irqsave(&npinfo->rx_lock, flags);
 				npinfo->rx_np = NULL;
 				npinfo->rx_np = NULL;
+				npinfo->rx_flags &= ~NETPOLL_RX_ENABLED;
 				spin_unlock_irqrestore(&npinfo->rx_lock, flags);
 				spin_unlock_irqrestore(&npinfo->rx_lock, flags);
 			}
 			}
 
 

+ 1 - 1
net/ipv4/Kconfig

@@ -343,7 +343,7 @@ config INET_ESP
 	tristate "IP: ESP transformation"
 	tristate "IP: ESP transformation"
 	select XFRM
 	select XFRM
 	select CRYPTO
 	select CRYPTO
-	select CRYPTO_AEAD
+	select CRYPTO_AUTHENC
 	select CRYPTO_HMAC
 	select CRYPTO_HMAC
 	select CRYPTO_MD5
 	select CRYPTO_MD5
 	select CRYPTO_CBC
 	select CRYPTO_CBC

+ 2 - 2
net/ipv4/ipconfig.c

@@ -750,9 +750,9 @@ static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_d
 		printk("Unknown ARP type 0x%04x for device %s\n", dev->type, dev->name);
 		printk("Unknown ARP type 0x%04x for device %s\n", dev->type, dev->name);
 		b->htype = dev->type; /* can cause undefined behavior */
 		b->htype = dev->type; /* can cause undefined behavior */
 	}
 	}
+
+	/* server_ip and your_ip address are both already zero per RFC2131 */
 	b->hlen = dev->addr_len;
 	b->hlen = dev->addr_len;
-	b->your_ip = NONE;
-	b->server_ip = NONE;
 	memcpy(b->hw_addr, dev->dev_addr, dev->addr_len);
 	memcpy(b->hw_addr, dev->dev_addr, dev->addr_len);
 	b->secs = htons(jiffies_diff / HZ);
 	b->secs = htons(jiffies_diff / HZ);
 	b->xid = d->xid;
 	b->xid = d->xid;

+ 3 - 2
net/ipv4/tcp_bic.c

@@ -1,12 +1,13 @@
 /*
 /*
  * Binary Increase Congestion control for TCP
  * Binary Increase Congestion control for TCP
- *
+ * Home page:
+ *      http://netsrv.csc.ncsu.edu/twiki/bin/view/Main/BIC
  * This is from the implementation of BICTCP in
  * This is from the implementation of BICTCP in
  * Lison-Xu, Kahaled Harfoush, and Injong Rhee.
  * Lison-Xu, Kahaled Harfoush, and Injong Rhee.
  *  "Binary Increase Congestion Control for Fast, Long Distance
  *  "Binary Increase Congestion Control for Fast, Long Distance
  *  Networks" in InfoComm 2004
  *  Networks" in InfoComm 2004
  * Available from:
  * Available from:
- *  http://www.csc.ncsu.edu/faculty/rhee/export/bitcp.pdf
+ *  http://netsrv.csc.ncsu.edu/export/bitcp.pdf
  *
  *
  * Unless BIC is enabled and congestion window is large
  * Unless BIC is enabled and congestion window is large
  * this behaves the same as the original Reno.
  * this behaves the same as the original Reno.

+ 9 - 5
net/ipv4/tcp_input.c

@@ -1367,7 +1367,7 @@ static struct sk_buff *tcp_sacktag_walk(struct sk_buff *skb, struct sock *sk,
  * a normal way
  * a normal way
  */
  */
 static struct sk_buff *tcp_sacktag_skip(struct sk_buff *skb, struct sock *sk,
 static struct sk_buff *tcp_sacktag_skip(struct sk_buff *skb, struct sock *sk,
-					u32 skip_to_seq)
+					u32 skip_to_seq, int *fack_count)
 {
 {
 	tcp_for_write_queue_from(skb, sk) {
 	tcp_for_write_queue_from(skb, sk) {
 		if (skb == tcp_send_head(sk))
 		if (skb == tcp_send_head(sk))
@@ -1375,6 +1375,8 @@ static struct sk_buff *tcp_sacktag_skip(struct sk_buff *skb, struct sock *sk,
 
 
 		if (!before(TCP_SKB_CB(skb)->end_seq, skip_to_seq))
 		if (!before(TCP_SKB_CB(skb)->end_seq, skip_to_seq))
 			break;
 			break;
+
+		*fack_count += tcp_skb_pcount(skb);
 	}
 	}
 	return skb;
 	return skb;
 }
 }
@@ -1390,7 +1392,7 @@ static struct sk_buff *tcp_maybe_skipping_dsack(struct sk_buff *skb,
 		return skb;
 		return skb;
 
 
 	if (before(next_dup->start_seq, skip_to_seq)) {
 	if (before(next_dup->start_seq, skip_to_seq)) {
-		skb = tcp_sacktag_skip(skb, sk, next_dup->start_seq);
+		skb = tcp_sacktag_skip(skb, sk, next_dup->start_seq, fack_count);
 		tcp_sacktag_walk(skb, sk, NULL,
 		tcp_sacktag_walk(skb, sk, NULL,
 				 next_dup->start_seq, next_dup->end_seq,
 				 next_dup->start_seq, next_dup->end_seq,
 				 1, fack_count, reord, flag);
 				 1, fack_count, reord, flag);
@@ -1537,7 +1539,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb,
 
 
 			/* Head todo? */
 			/* Head todo? */
 			if (before(start_seq, cache->start_seq)) {
 			if (before(start_seq, cache->start_seq)) {
-				skb = tcp_sacktag_skip(skb, sk, start_seq);
+				skb = tcp_sacktag_skip(skb, sk, start_seq,
+						       &fack_count);
 				skb = tcp_sacktag_walk(skb, sk, next_dup,
 				skb = tcp_sacktag_walk(skb, sk, next_dup,
 						       start_seq,
 						       start_seq,
 						       cache->start_seq,
 						       cache->start_seq,
@@ -1565,7 +1568,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb,
 				goto walk;
 				goto walk;
 			}
 			}
 
 
-			skb = tcp_sacktag_skip(skb, sk, cache->end_seq);
+			skb = tcp_sacktag_skip(skb, sk, cache->end_seq,
+					       &fack_count);
 			/* Check overlap against next cached too (past this one already) */
 			/* Check overlap against next cached too (past this one already) */
 			cache++;
 			cache++;
 			continue;
 			continue;
@@ -1577,7 +1581,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb,
 				break;
 				break;
 			fack_count = tp->fackets_out;
 			fack_count = tp->fackets_out;
 		}
 		}
-		skb = tcp_sacktag_skip(skb, sk, start_seq);
+		skb = tcp_sacktag_skip(skb, sk, start_seq, &fack_count);
 
 
 walk:
 walk:
 		skb = tcp_sacktag_walk(skb, sk, next_dup, start_seq, end_seq,
 		skb = tcp_sacktag_walk(skb, sk, next_dup, start_seq, end_seq,

+ 1 - 1
net/ipv6/Kconfig

@@ -85,7 +85,7 @@ config INET6_ESP
 	depends on IPV6
 	depends on IPV6
 	select XFRM
 	select XFRM
 	select CRYPTO
 	select CRYPTO
-	select CRYPTO_AEAD
+	select CRYPTO_AUTHENC
 	select CRYPTO_HMAC
 	select CRYPTO_HMAC
 	select CRYPTO_MD5
 	select CRYPTO_MD5
 	select CRYPTO_CBC
 	select CRYPTO_CBC

+ 5 - 3
net/irda/ircomm/ircomm_core.c

@@ -76,9 +76,11 @@ static int __init ircomm_init(void)
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
 	{ struct proc_dir_entry *ent;
 	{ struct proc_dir_entry *ent;
-	ent = create_proc_entry("ircomm", 0, proc_irda);
-	if (ent)
-		ent->proc_fops = &ircomm_proc_fops;
+	ent = proc_create("ircomm", 0, proc_irda, &ircomm_proc_fops);
+	if (!ent) {
+		printk(KERN_ERR "ircomm_init: can't create /proc entry!\n");
+		return -ENODEV;
+	}
 	}
 	}
 #endif /* CONFIG_PROC_FS */
 #endif /* CONFIG_PROC_FS */
 
 

+ 1 - 3
net/irda/irlan/irlan_common.c

@@ -128,13 +128,11 @@ static int __init irlan_init(void)
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
 	{ struct proc_dir_entry *proc;
 	{ struct proc_dir_entry *proc;
-	proc = create_proc_entry("irlan", 0, proc_irda);
+	proc = proc_create("irlan", 0, proc_irda, &irlan_fops);
 	if (!proc) {
 	if (!proc) {
 		printk(KERN_ERR "irlan_init: can't create /proc entry!\n");
 		printk(KERN_ERR "irlan_init: can't create /proc entry!\n");
 		return -ENODEV;
 		return -ENODEV;
 	}
 	}
-
-	proc->proc_fops = &irlan_fops;
 	}
 	}
 #endif /* CONFIG_PROC_FS */
 #endif /* CONFIG_PROC_FS */
 
 

+ 3 - 5
net/irda/irproc.c

@@ -72,11 +72,9 @@ void __init irda_proc_register(void)
 		return;
 		return;
 	proc_irda->owner = THIS_MODULE;
 	proc_irda->owner = THIS_MODULE;
 
 
-	for (i=0; i<ARRAY_SIZE(irda_dirs); i++) {
-		d = create_proc_entry(irda_dirs[i].name, 0, proc_irda);
-		if (d)
-			d->proc_fops = irda_dirs[i].fops;
-	}
+	for (i = 0; i < ARRAY_SIZE(irda_dirs); i++)
+		d = proc_create(irda_dirs[i].name, 0, proc_irda,
+				irda_dirs[i].fops);
 }
 }
 
 
 /*
 /*

+ 0 - 2
net/iucv/iucv.c

@@ -621,7 +621,6 @@ static int iucv_sever_pathid(u16 pathid, u8 userdata[16])
 	return iucv_call_b2f0(IUCV_SEVER, parm);
 	return iucv_call_b2f0(IUCV_SEVER, parm);
 }
 }
 
 
-#ifdef CONFIG_SMP
 /**
 /**
  * __iucv_cleanup_queue
  * __iucv_cleanup_queue
  * @dummy: unused dummy argument
  * @dummy: unused dummy argument
@@ -632,7 +631,6 @@ static int iucv_sever_pathid(u16 pathid, u8 userdata[16])
 static void __iucv_cleanup_queue(void *dummy)
 static void __iucv_cleanup_queue(void *dummy)
 {
 {
 }
 }
-#endif
 
 
 /**
 /**
  * iucv_cleanup_queue
  * iucv_cleanup_queue

+ 3 - 6
net/sctp/proc.c

@@ -256,12 +256,10 @@ int __init sctp_eps_proc_init(void)
 {
 {
 	struct proc_dir_entry *p;
 	struct proc_dir_entry *p;
 
 
-	p = create_proc_entry("eps", S_IRUGO, proc_net_sctp);
+	p = proc_create("eps", S_IRUGO, proc_net_sctp, &sctp_eps_seq_fops);
 	if (!p)
 	if (!p)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	p->proc_fops = &sctp_eps_seq_fops;
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -375,12 +373,11 @@ int __init sctp_assocs_proc_init(void)
 {
 {
 	struct proc_dir_entry *p;
 	struct proc_dir_entry *p;
 
 
-	p = create_proc_entry("assocs", S_IRUGO, proc_net_sctp);
+	p = proc_create("assocs", S_IRUGO, proc_net_sctp,
+			&sctp_assocs_seq_fops);
 	if (!p)
 	if (!p)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	p->proc_fops = &sctp_assocs_seq_fops;
-
 	return 0;
 	return 0;
 }
 }