提交 391e572c 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (33 commits)
  af_unix: netns: fix problem of return value
  IRDA: remove double inclusion of module.h
  udp: multicast packets need to check namespace
  net: add documentation for skb recycling
  key: fix setkey(8) policy set breakage
  bpa10x: free sk_buff with kfree_skb
  xfrm: do not leak ESRCH to user space
  net: Really remove all of LOOPBACK_TSO code.
  netfilter: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys()
  netns: add register_pernet_gen_subsys/unregister_pernet_gen_subsys
  net: delete excess kernel-doc notation
  pppoe: Fix socket leak.
  gianfar: Don't reset TBI<->SerDes link if it's already up
  gianfar: Fix race in TBI/SerDes configuration
  at91_ether: request/free GPIO for PHY interrupt
  amd8111e: fix dma_free_coherent context
  atl1: fix vlan tag regression
  SMC91x: delete unused local variable "lp"
  myri10ge: fix stop/go mmio ordering
  bonding: fix panic when taking bond interface down before removing module
  ...
...@@ -743,6 +743,8 @@ P: Nick Kossifidis ...@@ -743,6 +743,8 @@ P: Nick Kossifidis
M: mickflemm@gmail.com M: mickflemm@gmail.com
P: Luis R. Rodriguez P: Luis R. Rodriguez
M: mcgrof@gmail.com M: mcgrof@gmail.com
P: Bob Copeland
M: me@bobcopeland.com
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
L: ath5k-devel@lists.ath5k.org L: ath5k-devel@lists.ath5k.org
S: Maintained S: Maintained
......
...@@ -223,6 +223,8 @@ static int gfar_mdio_of_init_one(struct device_node *np) ...@@ -223,6 +223,8 @@ static int gfar_mdio_of_init_one(struct device_node *np)
if (ret) if (ret)
return ret; return ret;
/* The gianfar device will try to use the same ID created below to find
* this bus, to coordinate register access (since they share). */
mdio_dev = platform_device_register_simple("fsl-gianfar_mdio", mdio_dev = platform_device_register_simple("fsl-gianfar_mdio",
res.start&0xfffff, &res, 1); res.start&0xfffff, &res, 1);
if (IS_ERR(mdio_dev)) if (IS_ERR(mdio_dev))
...@@ -394,6 +396,30 @@ static int __init gfar_of_init(void) ...@@ -394,6 +396,30 @@ static int __init gfar_of_init(void)
of_node_put(mdio); of_node_put(mdio);
} }
/* Get MDIO bus controlled by this eTSEC, if any. Normally only
* eTSEC 1 will control an MDIO bus, not necessarily the same
* bus that its PHY is on ('mdio' above), so we can't just use
* that. What we do is look for a gianfar mdio device that has
* overlapping registers with this device. That's really the
* whole point, to find the device sharing our registers to
* coordinate access with it.
*/
for_each_compatible_node(mdio, NULL, "fsl,gianfar-mdio") {
if (of_address_to_resource(mdio, 0, &res))
continue;
if (res.start >= r[0].start && res.end <= r[0].end) {
/* Get the ID the mdio bus platform device was
* registered with. gfar_data.bus_id is
* different because it's for finding a PHY,
* while this is for finding a MII bus.
*/
gfar_data.mdio_bus = res.start&0xfffff;
of_node_put(mdio);
break;
}
}
ret = ret =
platform_device_add_data(gfar_dev, &gfar_data, platform_device_add_data(gfar_dev, &gfar_data,
sizeof(struct sizeof(struct
......
...@@ -443,8 +443,8 @@ static void bpa10x_destruct(struct hci_dev *hdev) ...@@ -443,8 +443,8 @@ static void bpa10x_destruct(struct hci_dev *hdev)
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
kfree(data->rx_skb[0]); kfree_skb(data->rx_skb[0]);
kfree(data->rx_skb[1]); kfree_skb(data->rx_skb[1]);
kfree(data); kfree(data);
} }
......
...@@ -644,10 +644,6 @@ This function frees the transmiter and receiver descriptor rings. ...@@ -644,10 +644,6 @@ This function frees the transmiter and receiver descriptor rings.
*/ */
static void amd8111e_free_ring(struct amd8111e_priv* lp) static void amd8111e_free_ring(struct amd8111e_priv* lp)
{ {
/* Free transmit and receive skbs */
amd8111e_free_skbs(lp->amd8111e_net_dev);
/* Free transmit and receive descriptor rings */ /* Free transmit and receive descriptor rings */
if(lp->rx_ring){ if(lp->rx_ring){
pci_free_consistent(lp->pci_dev, pci_free_consistent(lp->pci_dev,
...@@ -1233,7 +1229,9 @@ static int amd8111e_close(struct net_device * dev) ...@@ -1233,7 +1229,9 @@ static int amd8111e_close(struct net_device * dev)
amd8111e_disable_interrupt(lp); amd8111e_disable_interrupt(lp);
amd8111e_stop_chip(lp); amd8111e_stop_chip(lp);
amd8111e_free_ring(lp);
/* Free transmit and receive skbs */
amd8111e_free_skbs(lp->amd8111e_net_dev);
netif_carrier_off(lp->amd8111e_net_dev); netif_carrier_off(lp->amd8111e_net_dev);
...@@ -1243,6 +1241,7 @@ static int amd8111e_close(struct net_device * dev) ...@@ -1243,6 +1241,7 @@ static int amd8111e_close(struct net_device * dev)
spin_unlock_irq(&lp->lock); spin_unlock_irq(&lp->lock);
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
amd8111e_free_ring(lp);
/* Update the statistics before closing */ /* Update the statistics before closing */
amd8111e_get_stats(dev); amd8111e_get_stats(dev);
......
...@@ -1080,7 +1080,8 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add ...@@ -1080,7 +1080,8 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add
init_timer(&lp->check_timer); init_timer(&lp->check_timer);
lp->check_timer.data = (unsigned long)dev; lp->check_timer.data = (unsigned long)dev;
lp->check_timer.function = at91ether_check_link; lp->check_timer.function = at91ether_check_link;
} } else if (lp->board_data.phy_irq_pin >= 32)
gpio_request(lp->board_data.phy_irq_pin, "ethernet_phy");
/* Display ethernet banner */ /* Display ethernet banner */
printk(KERN_INFO "%s: AT91 ethernet at 0x%08x int=%d %s%s (%s)\n", printk(KERN_INFO "%s: AT91 ethernet at 0x%08x int=%d %s%s (%s)\n",
...@@ -1167,6 +1168,9 @@ static int __devexit at91ether_remove(struct platform_device *pdev) ...@@ -1167,6 +1168,9 @@ static int __devexit at91ether_remove(struct platform_device *pdev)
struct net_device *dev = platform_get_drvdata(pdev); struct net_device *dev = platform_get_drvdata(pdev);
struct at91_private *lp = netdev_priv(dev); struct at91_private *lp = netdev_priv(dev);
if (lp->board_data.phy_irq_pin >= 32)
gpio_free(lp->board_data.phy_irq_pin);
unregister_netdev(dev); unregister_netdev(dev);
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
dma_free_coherent(NULL, sizeof(struct recv_desc_bufs), lp->dlist, (dma_addr_t)lp->dlist_phys); dma_free_coherent(NULL, sizeof(struct recv_desc_bufs), lp->dlist, (dma_addr_t)lp->dlist_phys);
......
...@@ -2310,7 +2310,8 @@ static void atl1_tx_queue(struct atl1_adapter *adapter, u16 count, ...@@ -2310,7 +2310,8 @@ static void atl1_tx_queue(struct atl1_adapter *adapter, u16 count,
if (tpd != ptpd) if (tpd != ptpd)
memcpy(tpd, ptpd, sizeof(struct tx_packet_desc)); memcpy(tpd, ptpd, sizeof(struct tx_packet_desc));
tpd->buffer_addr = cpu_to_le64(buffer_info->dma); tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
tpd->word2 = (cpu_to_le16(buffer_info->length) & tpd->word2 &= ~(TPD_BUFLEN_MASK << TPD_BUFLEN_SHIFT);
tpd->word2 |= (cpu_to_le16(buffer_info->length) &
TPD_BUFLEN_MASK) << TPD_BUFLEN_SHIFT; TPD_BUFLEN_MASK) << TPD_BUFLEN_SHIFT;
/* /*
...@@ -2409,8 +2410,8 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -2409,8 +2410,8 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
vlan_tag = (vlan_tag << 4) | (vlan_tag >> 13) | vlan_tag = (vlan_tag << 4) | (vlan_tag >> 13) |
((vlan_tag >> 9) & 0x8); ((vlan_tag >> 9) & 0x8);
ptpd->word3 |= 1 << TPD_INS_VL_TAG_SHIFT; ptpd->word3 |= 1 << TPD_INS_VL_TAG_SHIFT;
ptpd->word3 |= (vlan_tag & TPD_VL_TAGGED_MASK) << ptpd->word2 |= (vlan_tag & TPD_VLANTAG_MASK) <<
TPD_VL_TAGGED_SHIFT; TPD_VLANTAG_SHIFT;
} }
tso = atl1_tso(adapter, skb, ptpd); tso = atl1_tso(adapter, skb, ptpd);
......
...@@ -504,7 +504,7 @@ struct rx_free_desc { ...@@ -504,7 +504,7 @@ struct rx_free_desc {
#define TPD_PKTNT_MASK 0x0001 #define TPD_PKTNT_MASK 0x0001
#define TPD_PKTINT_SHIFT 15 #define TPD_PKTINT_SHIFT 15
#define TPD_VLANTAG_MASK 0xFFFF #define TPD_VLANTAG_MASK 0xFFFF
#define TPD_VLAN_SHIFT 16 #define TPD_VLANTAG_SHIFT 16
/* tpd word 3 bits 0:13 */ /* tpd word 3 bits 0:13 */
#define TPD_EOP_MASK 0x0001 #define TPD_EOP_MASK 0x0001
......
...@@ -169,11 +169,14 @@ static void tlb_clear_slave(struct bonding *bond, struct slave *slave, int save_ ...@@ -169,11 +169,14 @@ static void tlb_clear_slave(struct bonding *bond, struct slave *slave, int save_
/* clear slave from tx_hashtbl */ /* clear slave from tx_hashtbl */
tx_hash_table = BOND_ALB_INFO(bond).tx_hashtbl; tx_hash_table = BOND_ALB_INFO(bond).tx_hashtbl;
index = SLAVE_TLB_INFO(slave).head; /* skip this if we've already freed the tx hash table */
while (index != TLB_NULL_INDEX) { if (tx_hash_table) {
u32 next_index = tx_hash_table[index].next; index = SLAVE_TLB_INFO(slave).head;
tlb_init_table_entry(&tx_hash_table[index], save_load); while (index != TLB_NULL_INDEX) {
index = next_index; u32 next_index = tx_hash_table[index].next;
tlb_init_table_entry(&tx_hash_table[index], save_load);
index = next_index;
}
} }
tlb_init_slave(slave); tlb_init_slave(slave);
......
...@@ -1979,6 +1979,20 @@ void bond_destroy(struct bonding *bond) ...@@ -1979,6 +1979,20 @@ void bond_destroy(struct bonding *bond)
unregister_netdevice(bond->dev); unregister_netdevice(bond->dev);
} }
static void bond_destructor(struct net_device *bond_dev)
{
struct bonding *bond = bond_dev->priv;
if (bond->wq)
destroy_workqueue(bond->wq);
netif_addr_lock_bh(bond_dev);
bond_mc_list_destroy(bond);
netif_addr_unlock_bh(bond_dev);
free_netdev(bond_dev);
}
/* /*
* First release a slave and than destroy the bond if no more slaves iare left. * First release a slave and than destroy the bond if no more slaves iare left.
* Must be under rtnl_lock when this function is called. * Must be under rtnl_lock when this function is called.
...@@ -2376,6 +2390,9 @@ static void bond_miimon_commit(struct bonding *bond) ...@@ -2376,6 +2390,9 @@ static void bond_miimon_commit(struct bonding *bond)
continue; continue;
case BOND_LINK_DOWN: case BOND_LINK_DOWN:
if (slave->link_failure_count < UINT_MAX)
slave->link_failure_count++;
slave->link = BOND_LINK_DOWN; slave->link = BOND_LINK_DOWN;
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP || if (bond->params.mode == BOND_MODE_ACTIVEBACKUP ||
...@@ -4550,7 +4567,7 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params) ...@@ -4550,7 +4567,7 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
bond_set_mode_ops(bond, bond->params.mode); bond_set_mode_ops(bond, bond->params.mode);
bond_dev->destructor = free_netdev; bond_dev->destructor = bond_destructor;
/* Initialize the device options */ /* Initialize the device options */
bond_dev->tx_queue_len = 0; bond_dev->tx_queue_len = 0;
...@@ -4589,20 +4606,6 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params) ...@@ -4589,20 +4606,6 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
return 0; return 0;
} }
/* De-initialize device specific data.
* Caller must hold rtnl_lock.
*/
static void bond_deinit(struct net_device *bond_dev)
{
struct bonding *bond = bond_dev->priv;
list_del(&bond->bond_list);
#ifdef CONFIG_PROC_FS
bond_remove_proc_entry(bond);
#endif
}
static void bond_work_cancel_all(struct bonding *bond) static void bond_work_cancel_all(struct bonding *bond)
{ {
write_lock_bh(&bond->lock); write_lock_bh(&bond->lock);
...@@ -4624,6 +4627,22 @@ static void bond_work_cancel_all(struct bonding *bond) ...@@ -4624,6 +4627,22 @@ static void bond_work_cancel_all(struct bonding *bond)
cancel_delayed_work(&bond->ad_work); cancel_delayed_work(&bond->ad_work);
} }
/* De-initialize device specific data.
* Caller must hold rtnl_lock.
*/
static void bond_deinit(struct net_device *bond_dev)
{
struct bonding *bond = bond_dev->priv;
list_del(&bond->bond_list);
bond_work_cancel_all(bond);
#ifdef CONFIG_PROC_FS
bond_remove_proc_entry(bond);
#endif
}
/* Unregister and free all bond devices. /* Unregister and free all bond devices.
* Caller must hold rtnl_lock. * Caller must hold rtnl_lock.
*/ */
...@@ -4635,9 +4654,6 @@ static void bond_free_all(void) ...@@ -4635,9 +4654,6 @@ static void bond_free_all(void)
struct net_device *bond_dev = bond->dev; struct net_device *bond_dev = bond->dev;
bond_work_cancel_all(bond); bond_work_cancel_all(bond);
netif_addr_lock_bh(bond_dev);
bond_mc_list_destroy(bond);
netif_addr_unlock_bh(bond_dev);
/* Release the bonded slaves */ /* Release the bonded slaves */
bond_release_all(bond_dev); bond_release_all(bond_dev);
bond_destroy(bond); bond_destroy(bond);
......
...@@ -586,6 +586,18 @@ static void gfar_configure_serdes(struct net_device *dev) ...@@ -586,6 +586,18 @@ static void gfar_configure_serdes(struct net_device *dev)
struct gfar_mii __iomem *regs = struct gfar_mii __iomem *regs =
(void __iomem *)&priv->regs->gfar_mii_regs; (void __iomem *)&priv->regs->gfar_mii_regs;
int tbipa = gfar_read(&priv->regs->tbipa); int tbipa = gfar_read(&priv->regs->tbipa);
struct mii_bus *bus = gfar_get_miibus(priv);
if (bus)
mutex_lock(&bus->mdio_lock);
/* If the link is already up, we must already be ok, and don't need to
* configure and reset the TBI<->SerDes link. Maybe U-Boot configured
* everything for us? Resetting it takes the link down and requires
* several seconds for it to come back.
*/
if (gfar_local_mdio_read(regs, tbipa, MII_BMSR) & BMSR_LSTATUS)
goto done;
/* Single clk mode, mii mode off(for serdes communication) */ /* Single clk mode, mii mode off(for serdes communication) */
gfar_local_mdio_write(regs, tbipa, MII_TBICON, TBICON_CLK_SELECT); gfar_local_mdio_write(regs, tbipa, MII_TBICON, TBICON_CLK_SELECT);
...@@ -596,6 +608,10 @@ static void gfar_configure_serdes(struct net_device *dev) ...@@ -596,6 +608,10 @@ static void gfar_configure_serdes(struct net_device *dev)
gfar_local_mdio_write(regs, tbipa, MII_BMCR, BMCR_ANENABLE | gfar_local_mdio_write(regs, tbipa, MII_BMCR, BMCR_ANENABLE |
BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000); BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000);
done:
if (bus)
mutex_unlock(&bus->mdio_lock);
} }
static void init_registers(struct net_device *dev) static void init_registers(struct net_device *dev)
......
...@@ -269,6 +269,27 @@ static struct device_driver gianfar_mdio_driver = { ...@@ -269,6 +269,27 @@ static struct device_driver gianfar_mdio_driver = {
.remove = gfar_mdio_remove, .remove = gfar_mdio_remove,
}; };
static int match_mdio_bus(struct device *dev, void *data)
{
const struct gfar_private *priv = data;
const struct platform_device *pdev = to_platform_device(dev);
return !strcmp(pdev->name, gianfar_mdio_driver.name) &&
pdev->id == priv->einfo->mdio_bus;
}
/* Given a gfar_priv structure, find the mii_bus controlled by this device (not
* necessarily the same as the bus the gfar's PHY is on), if one exists.
* Normally only the first gianfar controls a mii_bus. */
struct mii_bus *gfar_get_miibus(const struct gfar_private *priv)
{
/*const*/ struct device *d;
d = bus_find_device(gianfar_mdio_driver.bus, NULL, (void *)priv,
match_mdio_bus);
return d ? dev_get_drvdata(d) : NULL;
}
int __init gfar_mdio_init(void) int __init gfar_mdio_init(void)
{ {
return driver_register(&gianfar_mdio_driver); return driver_register(&gianfar_mdio_driver);
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#ifndef __GIANFAR_MII_H #ifndef __GIANFAR_MII_H
#define __GIANFAR_MII_H #define __GIANFAR_MII_H
struct gfar_private; /* forward ref */
#define MIIMIND_BUSY 0x00000001 #define MIIMIND_BUSY 0x00000001
#define MIIMIND_NOTVALID 0x00000004 #define MIIMIND_NOTVALID 0x00000004
...@@ -44,6 +46,7 @@ int gfar_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value); ...@@ -44,6 +46,7 @@ int gfar_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value);
int gfar_local_mdio_write(struct gfar_mii __iomem *regs, int mii_id, int gfar_local_mdio_write(struct gfar_mii __iomem *regs, int mii_id,
int regnum, u16 value); int regnum, u16 value);
int gfar_local_mdio_read(struct gfar_mii __iomem *regs, int mii_id, int regnum); int gfar_local_mdio_read(struct gfar_mii __iomem *regs, int mii_id, int regnum);
struct mii_bus *gfar_get_miibus(const struct gfar_private *priv);
int __init gfar_mdio_init(void); int __init gfar_mdio_init(void);
void gfar_mdio_exit(void); void gfar_mdio_exit(void);
#endif /* GIANFAR_PHY_H */ #endif /* GIANFAR_PHY_H */
...@@ -118,7 +118,6 @@ ...@@ -118,7 +118,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h>
#include <linux/kref.h> #include <linux/kref.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/device.h> #include <linux/device.h>
......
...@@ -82,7 +82,6 @@ ...@@ -82,7 +82,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h>
#include <linux/kref.h> #include <linux/kref.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/device.h> #include <linux/device.h>
......
...@@ -76,15 +76,6 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -76,15 +76,6 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
skb->protocol = eth_type_trans(skb,dev); skb->protocol = eth_type_trans(skb,dev);
#ifdef LOOPBACK_TSO
if (skb_is_gso(skb)) {
BUG_ON(skb->protocol != htons(ETH_P_IP));
BUG_ON(ip_hdr(skb)->protocol != IPPROTO_TCP);
emulate_large_send_offload(skb);
return 0;
}
#endif
dev->last_rx = jiffies; dev->last_rx = jiffies;
/* it's OK to use per_cpu_ptr() because BHs are off */ /* it's OK to use per_cpu_ptr() because BHs are off */
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
#include "myri10ge_mcp.h" #include "myri10ge_mcp.h"
#include "myri10ge_mcp_gen_header.h" #include "myri10ge_mcp_gen_header.h"
#define MYRI10GE_VERSION_STR "1.4.3-1.371" #define MYRI10GE_VERSION_STR "1.4.3-1.375"
MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); MODULE_DESCRIPTION("Myricom 10G driver (10GbE)");
MODULE_AUTHOR("Maintainer: help@myri.com"); MODULE_AUTHOR("Maintainer: help@myri.com");
...@@ -1393,6 +1393,7 @@ myri10ge_tx_done(struct myri10ge_slice_state *ss, int mcp_index) ...@@ -1393,6 +1393,7 @@ myri10ge_tx_done(struct myri10ge_slice_state *ss, int mcp_index)
if (tx->req == tx->done) { if (tx->req == tx->done) {
tx->queue_active = 0; tx->queue_active = 0;
put_be32(htonl(1), tx->send_stop); put_be32(htonl(1), tx->send_stop);
mmiowb();
} }
__netif_tx_unlock(dev_queue); __netif_tx_unlock(dev_queue);
} }
...@@ -2864,6 +2865,7 @@ static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2864,6 +2865,7 @@ static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev)
if ((mgp->dev->real_num_tx_queues > 1) && tx->queue_active == 0) { if ((mgp->dev->real_num_tx_queues > 1) && tx->queue_active == 0) {
tx->queue_active = 1; tx->queue_active = 1;
put_be32(htonl(1), tx->send_go); put_be32(htonl(1), tx->send_go);
mmiowb();
} }
tx->pkt_start++; tx->pkt_start++;
if ((avail - count) < MXGEFW_MAX_SEND_DESC) { if ((avail - count) < MXGEFW_MAX_SEND_DESC) {
......
...@@ -399,11 +399,11 @@ static int pppoe_rcv(struct sk_buff *skb, ...@@ -399,11 +399,11 @@ static int pppoe_rcv(struct sk_buff *skb,
if (skb->len < len) if (skb->len < len)
goto drop; goto drop;
po = get_item(ph->sid, eth_hdr(skb)->h_source, dev->ifindex); if (pskb_trim_rcsum(skb, len))
if (!po)
goto drop; goto drop;
if (pskb_trim_rcsum(skb, len)) po = get_item(ph->sid, eth_hdr(skb)->h_source, dev->ifindex);
if (!po)
goto drop; goto drop;
return sk_receive_skb(sk_pppox(po), skb, 0); return sk_receive_skb(sk_pppox(po), skb, 0);
......
...@@ -2060,7 +2060,6 @@ static int smc_request_attrib(struct platform_device *pdev, ...@@ -2060,7 +2060,6 @@ static int smc_request_attrib(struct platform_device *pdev,
struct net_device *ndev) struct net_device *ndev)
{ {
struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib"); struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib");
struct smc_local *lp = netdev_priv(ndev);
if (!res) if (!res)
return 0; return 0;
...@@ -2075,7 +2074,6 @@ static void smc_release_attrib(struct platform_device *pdev, ...@@ -2075,7 +2074,6 @@ static void smc_release_attrib(struct platform_device *pdev,
struct net_device *ndev) struct net_device *ndev)
{ {
struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib"); struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib");
struct smc_local *lp = netdev_priv(ndev);
if (res) if (res)
release_mem_region(res->start, ATTRIB_SIZE); release_mem_region(res->start, ATTRIB_SIZE);
......
...@@ -695,7 +695,6 @@ EXPORT_SYMBOL(z8530_nop); ...@@ -695,7 +695,6 @@ EXPORT_SYMBOL(z8530_nop);
* z8530_interrupt - Handle an interrupt from a Z8530 * z8530_interrupt - Handle an interrupt from a Z8530
* @irq: Interrupt number * @irq: Interrupt number
* @dev_id: The Z8530 device that is interrupting. * @dev_id: The Z8530 device that is interrupting.
* @regs: unused
* *
* A Z85[2]30 device has stuck its hand in the air for attention. * A Z85[2]30 device has stuck its hand in the air for attention.
* We scan both the channels on the chip for events and then call * We scan both the channels on the chip for events and then call
......
...@@ -2942,10 +2942,8 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, ...@@ -2942,10 +2942,8 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
sc->opmode != NL80211_IFTYPE_MESH_POINT && sc->opmode != NL80211_IFTYPE_MESH_POINT &&
test_bit(ATH_STAT_PROMISC, sc->status)) test_bit(ATH_STAT_PROMISC, sc->status))
rfilt |= AR5K_RX_FILTER_PROM; rfilt |= AR5K_RX_FILTER_PROM;
if (sc->opmode == NL80211_IFTYPE_STATION || if (sc->opmode == NL80211_IFTYPE_ADHOC)
sc->opmode == NL80211_IFTYPE_ADHOC) {
rfilt |= AR5K_RX_FILTER_BEACON; rfilt |= AR5K_RX_FILTER_BEACON;
}
/* Set filters */ /* Set filters */
ath5k_hw_set_rx_filter(ah,rfilt); ath5k_hw_set_rx_filter(ah,rfilt);
......
...@@ -339,7 +339,7 @@ static struct { ...@@ -339,7 +339,7 @@ static struct {
{ ATH5K_DEBUG_BEACON, "beacon", "beacon handling" }, { ATH5K_DEBUG_BEACON, "beacon", "beacon handling" },
{ ATH5K_DEBUG_CALIBRATE, "calib", "periodic calibration" }, { ATH5K_DEBUG_CALIBRATE, "calib", "periodic calibration" },
{ ATH5K_DEBUG_TXPOWER, "txpower", "transmit power setting" }, { ATH5K_DEBUG_TXPOWER, "txpower", "transmit power setting" },
{ ATH5K_DEBUG_LED, "led", "LED mamagement" }, { ATH5K_DEBUG_LED, "led", "LED management" },
{ ATH5K_DEBUG_DUMP_RX, "dumprx", "print received skb content" }, { ATH5K_DEBUG_DUMP_RX, "dumprx", "print received skb content" },
{ ATH5K_DEBUG_DUMP_TX, "dumptx", "print transmit skb content" }, { ATH5K_DEBUG_DUMP_TX, "dumptx", "print transmit skb content" },
{ ATH5K_DEBUG_DUMPBANDS, "dumpbands", "dump bands" }, { ATH5K_DEBUG_DUMPBANDS, "dumpbands", "dump bands" },
......
...@@ -806,6 +806,8 @@ static const struct ath5k_ini_mode ar5212_rf5111_ini_mode_end[] = { ...@@ -806,6 +806,8 @@ static const struct ath5k_ini_mode ar5212_rf5111_ini_mode_end[] = {
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
{ AR5K_PHY(642), { AR5K_PHY(642),
{ 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 } }, { 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 } },
{ 0xa228,
{ 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5 } },
{ 0xa23c, { 0xa23c,
{ 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af } }, { 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af } },
}; };
......
...@@ -537,9 +537,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, ...@@ -537,9 +537,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
mdelay(1); mdelay(1);
/* /*
* Write some more initial register settings * Write some more initial register settings for revised chips
*/ */
if (ah->ah_version == AR5K_AR5212) { if (ah->ah_version == AR5K_AR5212 &&
ah->ah_phy_revision > 0x41) {
ath5k_hw_reg_write(ah, 0x0002a002, 0x982c); ath5k_hw_reg_write(ah, 0x0002a002, 0x982c);
if (channel->hw_value == CHANNEL_G) if (channel->hw_value == CHANNEL_G)
...@@ -558,19 +559,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, ...@@ -558,19 +559,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
else else
ath5k_hw_reg_write(ah, 0x00000000, 0x994c); ath5k_hw_reg_write(ah, 0x00000000, 0x994c);
/* Some bits are disabled here, we know nothing about /* Got this from legacy-hal */
* register 0xa228 yet, most of the times this ends up AR5K_REG_DISABLE_BITS(ah, 0xa228, 0x200);
* with a value 0x9b5 -haven't seen any dump with
* a different value- */ AR5K_REG_MASKED_BITS(ah, 0xa228, 0x800, 0xfffe03ff);
/* Got this from decompiling binary HAL */
data = ath5k_hw_reg_read(ah, 0xa228);
data &= 0xfffffdff;
ath5k_hw_reg_write(ah, data, 0xa228);
data = ath5k_hw_reg_read(ah, 0xa228);
data &= 0xfffe03ff;
ath5k_hw_reg_write(ah, data, 0xa228);
data = 0;
/* Just write 0x9b5 ? */ /* Just write 0x9b5 ? */
/* ath5k_hw_reg_write(ah, 0x000009b5, 0xa228); */ /* ath5k_hw_reg_write(ah, 0x000009b5, 0xa228); */
......
...@@ -2090,7 +2090,6 @@ static void iwl_alive_start(struct iwl_priv *priv) ...@@ -2090,7 +2090,6 @@ static void iwl_alive_start(struct iwl_priv *priv)
iwl4965_error_recovery(priv); iwl4965_error_recovery(priv);
iwl_power_update_mode(priv, 1); iwl_power_update_mode(priv, 1);
ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
if (test_and_clear_bit(STATUS_MODE_PENDING, &priv->status)) if (test_and_clear_bit(STATUS_MODE_PENDING, &priv->status))
iwl4965_set_mode(priv, priv->iw_mode); iwl4965_set_mode(priv, priv->iw_mode);
...@@ -2342,6 +2341,7 @@ static void iwl_bg_alive_start(struct work_struct *data) ...@@ -2342,6 +2341,7 @@ static void iwl_bg_alive_start(struct work_struct *data)
mutex_lock(&priv->mutex); mutex_lock(&priv->mutex);
iwl_alive_start(priv); iwl_alive_start(priv);
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
} }
static void iwl4965_bg_rf_kill(struct work_struct *work) static void iwl4965_bg_rf_kill(struct work_struct *work)
......
...@@ -605,9 +605,9 @@ int lbs_get_tx_power(struct lbs_private *priv, s16 *curlevel, s16 *minlevel, ...@@ -605,9 +605,9 @@ int lbs_get_tx_power(struct lbs_private *priv, s16 *curlevel, s16 *minlevel,
if (ret == 0) { if (ret == 0) {
*curlevel = le16_to_cpu(cmd.curlevel); *curlevel = le16_to_cpu(cmd.curlevel);
if (minlevel) if (minlevel)
*minlevel = le16_to_cpu(cmd.minlevel); *minlevel = cmd.minlevel;
if (maxlevel) if (maxlevel)
*maxlevel = le16_to_cpu(cmd.maxlevel); *maxlevel = cmd.maxlevel;
} }
lbs_deb_leave(LBS_DEB_CMD); lbs_deb_leave(LBS_DEB_CMD);
......
...@@ -598,8 +598,8 @@ static int lbs_process_bss(struct bss_descriptor *bss, ...@@ -598,8 +598,8 @@ static int lbs_process_bss(struct bss_descriptor *bss,
switch (elem->id) { switch (elem->id) {
case MFIE_TYPE_SSID: case MFIE_TYPE_SSID:
bss->ssid_len = elem->len; bss->ssid_len = min_t(int, 32, elem->len);
memcpy(bss->ssid, elem->data, elem->len); memcpy(bss->ssid, elem->data, bss->ssid_len);
lbs_deb_scan("got SSID IE: '%s', len %u\n", lbs_deb_scan("got SSID IE: '%s', len %u\n",
escape_essid(bss->ssid, bss->ssid_len), escape_essid(bss->ssid, bss->ssid_len),
bss->ssid_len); bss->ssid_len);
......
menuconfig RT2X00 menuconfig RT2X00
bool "Ralink driver support" tristate "Ralink driver support"
depends on MAC80211 && WLAN_80211 && EXPERIMENTAL depends on MAC80211 && WLAN_80211 && EXPERIMENTAL
---help--- ---help---
This will enable the experimental support for the Ralink drivers, This will enable the experimental support for the Ralink drivers,
......
...@@ -49,7 +49,8 @@ struct gianfar_platform_data { ...@@ -49,7 +49,8 @@ struct gianfar_platform_data {
u32 device_flags; u32 device_flags;
/* board specific information */ /* board specific information */
u32 board_flags; u32 board_flags;
char bus_id[MII_BUS_ID_SIZE]; int mdio_bus; /* Bus controlled by us */
char bus_id[MII_BUS_ID_SIZE]; /* Bus PHY is on */
u32 phy_id; u32 phy_id;
u8 mac_addr[6]; u8 mac_addr[6];
phy_interface_t interface; phy_interface_t interface;
......
...@@ -1537,7 +1537,6 @@ static inline void __netif_tx_unlock_bh(struct netdev_queue *txq) ...@@ -1537,7 +1537,6 @@ static inline void __netif_tx_unlock_bh(struct netdev_queue *txq)
/** /**
* netif_tx_lock - grab network device transmit lock * netif_tx_lock - grab network device transmit lock
* @dev: network device * @dev: network device
* @cpu: cpu number of lock owner
* *
* Get network device transmit lock * Get network device transmit lock
*/ */
......
...@@ -214,6 +214,8 @@ struct pernet_operations { ...@@ -214,6 +214,8 @@ struct pernet_operations {
extern int register_pernet_subsys(struct pernet_operations *); extern int register_pernet_subsys(struct pernet_operations *);
extern void unregister_pernet_subsys(struct pernet_operations *); extern void unregister_pernet_subsys(struct pernet_operations *);
extern int register_pernet_gen_subsys(int *id, struct pernet_operations *);
extern void unregister_pernet_gen_subsys(int id, struct pernet_operations *);
extern int register_pernet_device(struct pernet_operations *); extern int register_pernet_device(struct pernet_operations *);
extern void unregister_pernet_device(struct pernet_operations *); extern void unregister_pernet_device(struct pernet_operations *);
extern int register_pernet_gen_device(int *id, struct pernet_operations *); extern int register_pernet_gen_device(int *id, struct pernet_operations *);
......
...@@ -936,7 +936,6 @@ extern void sock_init_data(struct socket *sock, struct sock *sk); ...@@ -936,7 +936,6 @@ extern void sock_init_data(struct socket *sock, struct sock *sk);
/** /**
* sk_filter_release: Release a socket filter * sk_filter_release: Release a socket filter
* @sk: socket
* @fp: filter to remove * @fp: filter to remove
* *
* Remove a filter from a socket and release its resources. * Remove a filter from a socket and release its resources.
......
...@@ -325,6 +325,38 @@ void unregister_pernet_subsys(struct pernet_operations *module) ...@@ -325,6 +325,38 @@ void unregister_pernet_subsys(struct pernet_operations *module)
} }
EXPORT_SYMBOL_GPL(unregister_pernet_subsys); EXPORT_SYMBOL_GPL(unregister_pernet_subsys);
int register_pernet_gen_subsys(int *id, struct pernet_operations *ops)
{
int rv;
mutex_lock(&net_mutex);
again:
rv = ida_get_new_above(&net_generic_ids, 1, id);
if (rv < 0) {
if (rv == -EAGAIN) {
ida_pre_get(&net_generic_ids, GFP_KERNEL);
goto again;
}
goto out;
}
rv = register_pernet_operations(first_device, ops);
if (rv < 0)
ida_remove(&net_generic_ids, *id);
mutex_unlock(&net_mutex);
out:
return rv;
}
EXPORT_SYMBOL_GPL(register_pernet_gen_subsys);
void unregister_pernet_gen_subsys(int id, struct pernet_operations *ops)
{
mutex_lock(&net_mutex);
unregister_pernet_operations(ops);
ida_remove(&net_generic_ids, id);
mutex_unlock(&net_mutex);
}
EXPORT_SYMBOL_GPL(unregister_pernet_gen_subsys);
/** /**
* register_pernet_device - register a network namespace device * register_pernet_device - register a network namespace device
* @ops: pernet operations structure for the subsystem * @ops: pernet operations structure for the subsystem
......
...@@ -449,6 +449,18 @@ void kfree_skb(struct sk_buff *skb) ...@@ -449,6 +449,18 @@ void kfree_skb(struct sk_buff *skb)
__kfree_skb(skb); __kfree_skb(skb);
} }
/**
* skb_recycle_check - check if skb can be reused for receive
* @skb: buffer
* @skb_size: minimum receive buffer size
*
* Checks that the skb passed in is not shared or cloned, and
* that it is linear and its head portion at least as large as
* skb_size so that it can be recycled as a receive buffer.
* If these conditions are met, this function does any necessary
* reference count dropping and cleans up the skbuff as if it
* just came from __alloc_skb().
*/
int skb_recycle_check(struct sk_buff *skb, int skb_size) int skb_recycle_check(struct sk_buff *skb, int skb_size)
{ {
struct skb_shared_info *shinfo; struct skb_shared_info *shinfo;
......
...@@ -2063,9 +2063,10 @@ int cipso_v4_skbuff_setattr(struct sk_buff *skb, ...@@ -2063,9 +2063,10 @@ int cipso_v4_skbuff_setattr(struct sk_buff *skb,
u32 opt_len; u32 opt_len;
int len_delta; int len_delta;
buf_len = cipso_v4_genopt(buf, buf_len, doi_def, secattr); ret_val = cipso_v4_genopt(buf, buf_len, doi_def, secattr);
if (buf_len < 0) if (ret_val < 0)
return buf_len; return ret_val;
buf_len = ret_val;
opt_len = (buf_len + 3) & ~3; opt_len = (buf_len + 3) & ~3;
/* we overwrite any existing options to ensure that we have enough /* we overwrite any existing options to ensure that we have enough
......
...@@ -284,7 +284,7 @@ struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport, ...@@ -284,7 +284,7 @@ struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
} }
EXPORT_SYMBOL_GPL(udp4_lib_lookup); EXPORT_SYMBOL_GPL(udp4_lib_lookup);
static inline struct sock *udp_v4_mcast_next(struct sock *sk, static inline struct sock *udp_v4_mcast_next(struct net *net, struct sock *sk,
__be16 loc_port, __be32 loc_addr, __be16 loc_port, __be32 loc_addr,
__be16 rmt_port, __be32 rmt_addr, __be16 rmt_port, __be32 rmt_addr,
int dif) int dif)
...@@ -296,7 +296,8 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk, ...@@ -296,7 +296,8 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk,
sk_for_each_from(s, node) { sk_for_each_from(s, node) {
struct inet_sock *inet = inet_sk(s); struct inet_sock *inet = inet_sk(s);
if (s->sk_hash != hnum || if (!net_eq(sock_net(s), net) ||
s->sk_hash != hnum ||
(inet->daddr && inet->daddr != rmt_addr) || (inet->daddr && inet->daddr != rmt_addr) ||
(inet->dport != rmt_port && inet->dport) || (inet->dport != rmt_port && inet->dport) ||
(inet->rcv_saddr && inet->rcv_saddr != loc_addr) || (inet->rcv_saddr && inet->rcv_saddr != loc_addr) ||
...@@ -1079,15 +1080,16 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, ...@@ -1079,15 +1080,16 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
read_lock(&udp_hash_lock); read_lock(&udp_hash_lock);
sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]); sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
dif = skb->dev->ifindex; dif = skb->dev->ifindex;
sk = udp_v4_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
if (sk) { if (sk) {
struct sock *sknext = NULL; struct sock *sknext = NULL;
do { do {
struct sk_buff *skb1 = skb; struct sk_buff *skb1 = skb;
sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr, sknext = udp_v4_mcast_next(net, sk_next(sk), uh->dest,
uh->source, saddr, dif); daddr, uh->source, saddr,
dif);
if (sknext) if (sknext)
skb1 = skb_clone(skb, GFP_ATOMIC); skb1 = skb_clone(skb, GFP_ATOMIC);
......
...@@ -328,7 +328,7 @@ int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb) ...@@ -328,7 +328,7 @@ int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
return -1; return -1;
} }
static struct sock *udp_v6_mcast_next(struct sock *sk, static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk,
__be16 loc_port, struct in6_addr *loc_addr, __be16 loc_port, struct in6_addr *loc_addr,
__be16 rmt_port, struct in6_addr *rmt_addr, __be16 rmt_port, struct in6_addr *rmt_addr,
int dif) int dif)
...@@ -340,7 +340,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk, ...@@ -340,7 +340,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
sk_for_each_from(s, node) { sk_for_each_from(s, node) {
struct inet_sock *inet = inet_sk(s); struct inet_sock *inet = inet_sk(s);
if (sock_net(s) != sock_net(sk)) if (!net_eq(sock_net(s), net))
continue; continue;
if (s->sk_hash == num && s->sk_family == PF_INET6) { if (s->sk_hash == num && s->sk_family == PF_INET6) {
...@@ -383,14 +383,14 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb, ...@@ -383,14 +383,14 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
read_lock(&udp_hash_lock); read_lock(&udp_hash_lock);
sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]); sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
dif = inet6_iif(skb); dif = inet6_iif(skb);
sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); sk = udp_v6_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
if (!sk) { if (!sk) {
kfree_skb(skb); kfree_skb(skb);
goto out; goto out;
} }
sk2 = sk; sk2 = sk;
while ((sk2 = udp_v6_mcast_next(sk_next(sk2), uh->dest, daddr, while ((sk2 = udp_v6_mcast_next(net, sk_next(sk2), uh->dest, daddr,
uh->source, saddr, dif))) { uh->source, saddr, dif))) {
struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC); struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC);
if (buff) { if (buff) {
......
...@@ -2075,7 +2075,6 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, in ...@@ -2075,7 +2075,6 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, in
req_size += socklen * 2; req_size += socklen * 2;
} else { } else {
size -= 2*socklen; size -= 2*socklen;
socklen = 0;
} }
rq = (void*)skb_put(skb, req_size); rq = (void*)skb_put(skb, req_size);
pol->sadb_x_policy_len += req_size/8; pol->sadb_x_policy_len += req_size/8;
......
...@@ -335,7 +335,7 @@ static int __init nf_ct_proto_gre_init(void) ...@@ -335,7 +335,7 @@ static int __init nf_ct_proto_gre_init(void)
rv = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_gre4); rv = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_gre4);
if (rv < 0) if (rv < 0)
return rv; return rv;
rv = register_pernet_gen_device(&proto_gre_net_id, &proto_gre_net_ops); rv = register_pernet_gen_subsys(&proto_gre_net_id, &proto_gre_net_ops);
if (rv < 0) if (rv < 0)
nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_gre4); nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_gre4);
return rv; return rv;
...@@ -344,7 +344,7 @@ static int __init nf_ct_proto_gre_init(void) ...@@ -344,7 +344,7 @@ static int __init nf_ct_proto_gre_init(void)
static void nf_ct_proto_gre_fini(void) static void nf_ct_proto_gre_fini(void)
{ {
nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_gre4); nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_gre4);
unregister_pernet_gen_device(proto_gre_net_id, &proto_gre_net_ops); unregister_pernet_gen_subsys(proto_gre_net_id, &proto_gre_net_ops);
} }
module_init(nf_ct_proto_gre_init); module_init(nf_ct_proto_gre_init);
......
...@@ -315,6 +315,7 @@ struct netlbl_af6list *netlbl_af6list_remove(const struct in6_addr *addr, ...@@ -315,6 +315,7 @@ struct netlbl_af6list *netlbl_af6list_remove(const struct in6_addr *addr,
* Audit Helper Functions * Audit Helper Functions
*/ */
#ifdef CONFIG_AUDIT
/** /**
* netlbl_af4list_audit_addr - Audit an IPv4 address * netlbl_af4list_audit_addr - Audit an IPv4 address
* @audit_buf: audit buffer * @audit_buf: audit buffer
...@@ -386,3 +387,4 @@ void netlbl_af6list_audit_addr(struct audit_buffer *audit_buf, ...@@ -386,3 +387,4 @@ void netlbl_af6list_audit_addr(struct audit_buffer *audit_buf,
} }
} }
#endif /* IPv6 */ #endif /* IPv6 */
#endif /* CONFIG_AUDIT */
...@@ -120,9 +120,19 @@ struct netlbl_af4list *netlbl_af4list_search(__be32 addr, ...@@ -120,9 +120,19 @@ struct netlbl_af4list *netlbl_af4list_search(__be32 addr,
struct netlbl_af4list *netlbl_af4list_search_exact(__be32 addr, struct netlbl_af4list *netlbl_af4list_search_exact(__be32 addr,
__be32 mask, __be32 mask,
struct list_head *head); struct list_head *head);
#ifdef CONFIG_AUDIT
void netlbl_af4list_audit_addr(struct audit_buffer *audit_buf, void netlbl_af4list_audit_addr(struct audit_buffer *audit_buf,
int src, const char *dev, int src, const char *dev,
__be32 addr, __be32 mask); __be32 addr, __be32 mask);
#else
static inline void netlbl_af4list_audit_addr(struct audit_buffer *audit_buf,
int src, const char *dev,
__be32 addr, __be32 mask)
{
return;
}
#endif
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
...@@ -179,11 +189,23 @@ struct netlbl_af6list *netlbl_af6list_search(const struct in6_addr *addr, ...@@ -179,11 +189,23 @@ struct netlbl_af6list *netlbl_af6list_search(const struct in6_addr *addr,
struct netlbl_af6list *netlbl_af6list_search_exact(const struct in6_addr *addr, struct netlbl_af6list *netlbl_af6list_search_exact(const struct in6_addr *addr,
const struct in6_addr *mask, const struct in6_addr *mask,
struct list_head *head); struct list_head *head);
#ifdef CONFIG_AUDIT
void netlbl_af6list_audit_addr(struct audit_buffer *audit_buf, void netlbl_af6list_audit_addr(struct audit_buffer *audit_buf,
int src, int src,
const char *dev, const char *dev,
const struct in6_addr *addr, const struct in6_addr *addr,
const struct in6_addr *mask); const struct in6_addr *mask);
#else
static inline void netlbl_af6list_audit_addr(struct audit_buffer *audit_buf,
int src,
const char *dev,
const struct in6_addr *addr,
const struct in6_addr *mask)
{
return;
}
#endif
#endif /* IPV6 */ #endif /* IPV6 */
#endif #endif
...@@ -265,7 +265,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info, ...@@ -265,7 +265,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
static int netlbl_mgmt_listentry(struct sk_buff *skb, static int netlbl_mgmt_listentry(struct sk_buff *skb,
struct netlbl_dom_map *entry) struct netlbl_dom_map *entry)
{ {
int ret_val; int ret_val = 0;
struct nlattr *nla_a; struct nlattr *nla_a;
struct nlattr *nla_b; struct nlattr *nla_b;
struct netlbl_af4list *iter4; struct netlbl_af4list *iter4;
......
...@@ -2213,7 +2213,7 @@ static int unix_net_init(struct net *net) ...@@ -2213,7 +2213,7 @@ static int unix_net_init(struct net *net)
#endif #endif
error = 0; error = 0;
out: out:
return 0; return error;
} }
static void unix_net_exit(struct net *net) static void unix_net_exit(struct net *net)
......
...@@ -1251,6 +1251,8 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, struct flowi *fl, ...@@ -1251,6 +1251,8 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, struct flowi *fl,
-EINVAL : -EAGAIN); -EINVAL : -EAGAIN);
xfrm_state_put(x); xfrm_state_put(x);
} }
else if (error == -ESRCH)
error = -EAGAIN;
if (!tmpl->optional) if (!tmpl->optional)
goto fail; goto fail;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册