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

Conflicts:

	net/mac80211/rc80211_pid_algo.c
This commit is contained in:
David S. Miller 2008-03-05 12:26:41 -08:00
commit 255333c1db
34 changed files with 115 additions and 131 deletions

View file

@ -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/ W: http://e1000.sourceforge.net/
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/
S: Supported S: Supported
INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT

View file

@ -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.

View file

@ -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;

View file

@ -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); e100_down(nic);
del_timer_sync(&nic->watchdog);
netif_carrier_off(nic->netdev);
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); e100_suspend(pdev, PMSG_SUSPEND);
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);
} }
/* ------------------ PCI Error Recovery infrastructure -------------- */ /* ------------------ PCI Error Recovery infrastructure -------------- */

View file

@ -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"))));

View file

@ -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.

View file

@ -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)

View file

@ -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.

View file

@ -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 */ switch (phydev->interface) {
err = phy_write(phydev, MII_DM9161_SCR, MII_DM9161_SCR_INIT); 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;

View file

@ -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 @@ static void pppol2tp_tunnel_closeall(struct pppol2tp_tunnel *tunnel)
/* 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);

View file

@ -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;

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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(priv->cur_cmd->cmdbuf->command);
curcmd = le16_to_cpu(resp->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;

View file

@ -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; entry = (void *)wrap->data + le16_to_cpu(wrap->len);
i += 2;
i += le16_to_cpu(entry->len)*2; /* verify that at least the entry length/code fits */
while (i < len) { 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) {

View file

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

View file

@ -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++) memcpy(ndis_key.KeyRSC, ext->rx_seq, 6);
ndis_key.KeyRSC |=
cpu_to_le64(ext->rx_seq[i] << (i * 8));
ndis_key.KeyIndex |= cpu_to_le32(1 << 29); ndis_key.KeyIndex |= cpu_to_le32(1 << 29);
} }

View file

@ -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);

View file

@ -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 */ /* check rx_flags again with the lock held */
if (npinfo->rx_np && __netpoll_rx(skb)) 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);

View file

@ -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);
} }

View file

@ -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);

View file

@ -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);

View file

@ -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);
} }

View file

@ -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

View file

@ -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;

View file

@ -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.

View file

@ -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,

View file

@ -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

View file

@ -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); ent = proc_create("ircomm", 0, proc_irda, &ircomm_proc_fops);
if (ent) if (!ent) {
ent->proc_fops = &ircomm_proc_fops; printk(KERN_ERR "ircomm_init: can't create /proc entry!\n");
return -ENODEV;
}
} }
#endif /* CONFIG_PROC_FS */ #endif /* CONFIG_PROC_FS */

View file

@ -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 */

View file

@ -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++) { for (i = 0; i < ARRAY_SIZE(irda_dirs); i++)
d = create_proc_entry(irda_dirs[i].name, 0, proc_irda); d = proc_create(irda_dirs[i].name, 0, proc_irda,
if (d) irda_dirs[i].fops);
d->proc_fops = irda_dirs[i].fops;
}
} }
/* /*

View file

@ -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

View file

@ -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;
} }