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 ...
This commit is contained in:
Коммит
391e572cd1
|
@ -743,6 +743,8 @@ P: Nick Kossifidis
|
|||
M: mickflemm@gmail.com
|
||||
P: Luis R. Rodriguez
|
||||
M: mcgrof@gmail.com
|
||||
P: Bob Copeland
|
||||
M: me@bobcopeland.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ath5k-devel@lists.ath5k.org
|
||||
S: Maintained
|
||||
|
|
|
@ -223,6 +223,8 @@ static int gfar_mdio_of_init_one(struct device_node *np)
|
|||
if (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",
|
||||
res.start&0xfffff, &res, 1);
|
||||
if (IS_ERR(mdio_dev))
|
||||
|
@ -394,6 +396,30 @@ static int __init gfar_of_init(void)
|
|||
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 =
|
||||
platform_device_add_data(gfar_dev, &gfar_data,
|
||||
sizeof(struct
|
||||
|
|
|
@ -443,8 +443,8 @@ static void bpa10x_destruct(struct hci_dev *hdev)
|
|||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
kfree(data->rx_skb[0]);
|
||||
kfree(data->rx_skb[1]);
|
||||
kfree_skb(data->rx_skb[0]);
|
||||
kfree_skb(data->rx_skb[1]);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
|
|
|
@ -644,10 +644,6 @@ This function frees the transmiter and receiver descriptor rings.
|
|||
*/
|
||||
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 */
|
||||
if(lp->rx_ring){
|
||||
pci_free_consistent(lp->pci_dev,
|
||||
|
@ -1233,7 +1229,9 @@ static int amd8111e_close(struct net_device * dev)
|
|||
|
||||
amd8111e_disable_interrupt(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);
|
||||
|
||||
|
@ -1243,6 +1241,7 @@ static int amd8111e_close(struct net_device * dev)
|
|||
|
||||
spin_unlock_irq(&lp->lock);
|
||||
free_irq(dev->irq, dev);
|
||||
amd8111e_free_ring(lp);
|
||||
|
||||
/* Update the statistics before closing */
|
||||
amd8111e_get_stats(dev);
|
||||
|
|
|
@ -1080,7 +1080,8 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add
|
|||
init_timer(&lp->check_timer);
|
||||
lp->check_timer.data = (unsigned long)dev;
|
||||
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 */
|
||||
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)
|
|||
struct net_device *dev = platform_get_drvdata(pdev);
|
||||
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);
|
||||
free_irq(dev->irq, dev);
|
||||
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,
|
|||
if (tpd != ptpd)
|
||||
memcpy(tpd, ptpd, sizeof(struct tx_packet_desc));
|
||||
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;
|
||||
|
||||
/*
|
||||
|
@ -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 >> 9) & 0x8);
|
||||
ptpd->word3 |= 1 << TPD_INS_VL_TAG_SHIFT;
|
||||
ptpd->word3 |= (vlan_tag & TPD_VL_TAGGED_MASK) <<
|
||||
TPD_VL_TAGGED_SHIFT;
|
||||
ptpd->word2 |= (vlan_tag & TPD_VLANTAG_MASK) <<
|
||||
TPD_VLANTAG_SHIFT;
|
||||
}
|
||||
|
||||
tso = atl1_tso(adapter, skb, ptpd);
|
||||
|
|
|
@ -504,7 +504,7 @@ struct rx_free_desc {
|
|||
#define TPD_PKTNT_MASK 0x0001
|
||||
#define TPD_PKTINT_SHIFT 15
|
||||
#define TPD_VLANTAG_MASK 0xFFFF
|
||||
#define TPD_VLAN_SHIFT 16
|
||||
#define TPD_VLANTAG_SHIFT 16
|
||||
|
||||
/* tpd word 3 bits 0:13 */
|
||||
#define TPD_EOP_MASK 0x0001
|
||||
|
|
|
@ -169,11 +169,14 @@ static void tlb_clear_slave(struct bonding *bond, struct slave *slave, int save_
|
|||
/* clear slave from tx_hashtbl */
|
||||
tx_hash_table = BOND_ALB_INFO(bond).tx_hashtbl;
|
||||
|
||||
index = SLAVE_TLB_INFO(slave).head;
|
||||
while (index != TLB_NULL_INDEX) {
|
||||
u32 next_index = tx_hash_table[index].next;
|
||||
tlb_init_table_entry(&tx_hash_table[index], save_load);
|
||||
index = next_index;
|
||||
/* skip this if we've already freed the tx hash table */
|
||||
if (tx_hash_table) {
|
||||
index = SLAVE_TLB_INFO(slave).head;
|
||||
while (index != TLB_NULL_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);
|
||||
|
|
|
@ -1979,6 +1979,20 @@ void bond_destroy(struct bonding *bond)
|
|||
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.
|
||||
* Must be under rtnl_lock when this function is called.
|
||||
|
@ -2376,6 +2390,9 @@ static void bond_miimon_commit(struct bonding *bond)
|
|||
continue;
|
||||
|
||||
case BOND_LINK_DOWN:
|
||||
if (slave->link_failure_count < UINT_MAX)
|
||||
slave->link_failure_count++;
|
||||
|
||||
slave->link = BOND_LINK_DOWN;
|
||||
|
||||
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP ||
|
||||
|
@ -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_dev->destructor = free_netdev;
|
||||
bond_dev->destructor = bond_destructor;
|
||||
|
||||
/* Initialize the device options */
|
||||
bond_dev->tx_queue_len = 0;
|
||||
|
@ -4589,20 +4606,6 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
|
|||
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)
|
||||
{
|
||||
write_lock_bh(&bond->lock);
|
||||
|
@ -4624,6 +4627,22 @@ static void bond_work_cancel_all(struct bonding *bond)
|
|||
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.
|
||||
* Caller must hold rtnl_lock.
|
||||
*/
|
||||
|
@ -4635,9 +4654,6 @@ static void bond_free_all(void)
|
|||
struct net_device *bond_dev = bond->dev;
|
||||
|
||||
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 */
|
||||
bond_release_all(bond_dev);
|
||||
bond_destroy(bond);
|
||||
|
|
|
@ -586,6 +586,18 @@ static void gfar_configure_serdes(struct net_device *dev)
|
|||
struct gfar_mii __iomem *regs =
|
||||
(void __iomem *)&priv->regs->gfar_mii_regs;
|
||||
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) */
|
||||
gfar_local_mdio_write(regs, tbipa, MII_TBICON, TBICON_CLK_SELECT);
|
||||
|
@ -596,6 +608,10 @@ static void gfar_configure_serdes(struct net_device *dev)
|
|||
|
||||
gfar_local_mdio_write(regs, tbipa, MII_BMCR, BMCR_ANENABLE |
|
||||
BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000);
|
||||
|
||||
done:
|
||||
if (bus)
|
||||
mutex_unlock(&bus->mdio_lock);
|
||||
}
|
||||
|
||||
static void init_registers(struct net_device *dev)
|
||||
|
|
|
@ -269,6 +269,27 @@ static struct device_driver gianfar_mdio_driver = {
|
|||
.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)
|
||||
{
|
||||
return driver_register(&gianfar_mdio_driver);
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
#ifndef __GIANFAR_MII_H
|
||||
#define __GIANFAR_MII_H
|
||||
|
||||
struct gfar_private; /* forward ref */
|
||||
|
||||
#define MIIMIND_BUSY 0x00000001
|
||||
#define MIIMIND_NOTVALID 0x00000004
|
||||
|
||||
|
@ -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 regnum, u16 value);
|
||||
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);
|
||||
void gfar_mdio_exit(void);
|
||||
#endif /* GIANFAR_PHY_H */
|
||||
|
|
|
@ -118,7 +118,6 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/device.h>
|
||||
|
|
|
@ -82,7 +82,6 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/device.h>
|
||||
|
|
|
@ -76,15 +76,6 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *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;
|
||||
|
||||
/* it's OK to use per_cpu_ptr() because BHs are off */
|
||||
|
|
|
@ -75,7 +75,7 @@
|
|||
#include "myri10ge_mcp.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_AUTHOR("Maintainer: help@myri.com");
|
||||
|
@ -1393,6 +1393,7 @@ myri10ge_tx_done(struct myri10ge_slice_state *ss, int mcp_index)
|
|||
if (tx->req == tx->done) {
|
||||
tx->queue_active = 0;
|
||||
put_be32(htonl(1), tx->send_stop);
|
||||
mmiowb();
|
||||
}
|
||||
__netif_tx_unlock(dev_queue);
|
||||
}
|
||||
|
@ -2864,6 +2865,7 @@ again:
|
|||
if ((mgp->dev->real_num_tx_queues > 1) && tx->queue_active == 0) {
|
||||
tx->queue_active = 1;
|
||||
put_be32(htonl(1), tx->send_go);
|
||||
mmiowb();
|
||||
}
|
||||
tx->pkt_start++;
|
||||
if ((avail - count) < MXGEFW_MAX_SEND_DESC) {
|
||||
|
|
|
@ -399,11 +399,11 @@ static int pppoe_rcv(struct sk_buff *skb,
|
|||
if (skb->len < len)
|
||||
goto drop;
|
||||
|
||||
po = get_item(ph->sid, eth_hdr(skb)->h_source, dev->ifindex);
|
||||
if (!po)
|
||||
if (pskb_trim_rcsum(skb, len))
|
||||
goto drop;
|
||||
|
||||
if (pskb_trim_rcsum(skb, len))
|
||||
po = get_item(ph->sid, eth_hdr(skb)->h_source, dev->ifindex);
|
||||
if (!po)
|
||||
goto drop;
|
||||
|
||||
return sk_receive_skb(sk_pppox(po), skb, 0);
|
||||
|
|
|
@ -2060,7 +2060,6 @@ static int smc_request_attrib(struct platform_device *pdev,
|
|||
struct net_device *ndev)
|
||||
{
|
||||
struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib");
|
||||
struct smc_local *lp = netdev_priv(ndev);
|
||||
|
||||
if (!res)
|
||||
return 0;
|
||||
|
@ -2075,7 +2074,6 @@ static void smc_release_attrib(struct platform_device *pdev,
|
|||
struct net_device *ndev)
|
||||
{
|
||||
struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib");
|
||||
struct smc_local *lp = netdev_priv(ndev);
|
||||
|
||||
if (res)
|
||||
release_mem_region(res->start, ATTRIB_SIZE);
|
||||
|
|
|
@ -695,7 +695,6 @@ EXPORT_SYMBOL(z8530_nop);
|
|||
* z8530_interrupt - Handle an interrupt from a Z8530
|
||||
* @irq: Interrupt number
|
||||
* @dev_id: The Z8530 device that is interrupting.
|
||||
* @regs: unused
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -2942,10 +2942,8 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
|
|||
sc->opmode != NL80211_IFTYPE_MESH_POINT &&
|
||||
test_bit(ATH_STAT_PROMISC, sc->status))
|
||||
rfilt |= AR5K_RX_FILTER_PROM;
|
||||
if (sc->opmode == NL80211_IFTYPE_STATION ||
|
||||
sc->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sc->opmode == NL80211_IFTYPE_ADHOC)
|
||||
rfilt |= AR5K_RX_FILTER_BEACON;
|
||||
}
|
||||
|
||||
/* Set filters */
|
||||
ath5k_hw_set_rx_filter(ah,rfilt);
|
||||
|
|
|
@ -339,7 +339,7 @@ static struct {
|
|||
{ ATH5K_DEBUG_BEACON, "beacon", "beacon handling" },
|
||||
{ ATH5K_DEBUG_CALIBRATE, "calib", "periodic calibration" },
|
||||
{ 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_TX, "dumptx", "print transmit skb content" },
|
||||
{ ATH5K_DEBUG_DUMPBANDS, "dumpbands", "dump bands" },
|
||||
|
|
|
@ -806,6 +806,8 @@ static const struct ath5k_ini_mode ar5212_rf5111_ini_mode_end[] = {
|
|||
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||||
{ AR5K_PHY(642),
|
||||
{ 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 } },
|
||||
{ 0xa228,
|
||||
{ 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5 } },
|
||||
{ 0xa23c,
|
||||
{ 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af } },
|
||||
};
|
||||
|
|
|
@ -537,9 +537,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
|
|||
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);
|
||||
|
||||
if (channel->hw_value == CHANNEL_G)
|
||||
|
@ -558,19 +559,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
|
|||
else
|
||||
ath5k_hw_reg_write(ah, 0x00000000, 0x994c);
|
||||
|
||||
/* Some bits are disabled here, we know nothing about
|
||||
* register 0xa228 yet, most of the times this ends up
|
||||
* with a value 0x9b5 -haven't seen any dump with
|
||||
* a different value- */
|
||||
/* Got this from decompiling binary HAL */
|
||||
data = ath5k_hw_reg_read(ah, 0xa228);
|
||||
data &= 0xfffffdff;
|
||||
ath5k_hw_reg_write(ah, data, 0xa228);
|
||||
/* Got this from legacy-hal */
|
||||
AR5K_REG_DISABLE_BITS(ah, 0xa228, 0x200);
|
||||
|
||||
data = ath5k_hw_reg_read(ah, 0xa228);
|
||||
data &= 0xfffe03ff;
|
||||
ath5k_hw_reg_write(ah, data, 0xa228);
|
||||
data = 0;
|
||||
AR5K_REG_MASKED_BITS(ah, 0xa228, 0x800, 0xfffe03ff);
|
||||
|
||||
/* Just write 0x9b5 ? */
|
||||
/* ath5k_hw_reg_write(ah, 0x000009b5, 0xa228); */
|
||||
|
|
|
@ -2090,7 +2090,6 @@ static void iwl_alive_start(struct iwl_priv *priv)
|
|||
iwl4965_error_recovery(priv);
|
||||
|
||||
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))
|
||||
iwl4965_set_mode(priv, priv->iw_mode);
|
||||
|
@ -2342,6 +2341,7 @@ static void iwl_bg_alive_start(struct work_struct *data)
|
|||
mutex_lock(&priv->mutex);
|
||||
iwl_alive_start(priv);
|
||||
mutex_unlock(&priv->mutex);
|
||||
ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
|
||||
}
|
||||
|
||||
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,
|
|||
if (ret == 0) {
|
||||
*curlevel = le16_to_cpu(cmd.curlevel);
|
||||
if (minlevel)
|
||||
*minlevel = le16_to_cpu(cmd.minlevel);
|
||||
*minlevel = cmd.minlevel;
|
||||
if (maxlevel)
|
||||
*maxlevel = le16_to_cpu(cmd.maxlevel);
|
||||
*maxlevel = cmd.maxlevel;
|
||||
}
|
||||
|
||||
lbs_deb_leave(LBS_DEB_CMD);
|
||||
|
|
|
@ -598,8 +598,8 @@ static int lbs_process_bss(struct bss_descriptor *bss,
|
|||
|
||||
switch (elem->id) {
|
||||
case MFIE_TYPE_SSID:
|
||||
bss->ssid_len = elem->len;
|
||||
memcpy(bss->ssid, elem->data, elem->len);
|
||||
bss->ssid_len = min_t(int, 32, elem->len);
|
||||
memcpy(bss->ssid, elem->data, bss->ssid_len);
|
||||
lbs_deb_scan("got SSID IE: '%s', len %u\n",
|
||||
escape_essid(bss->ssid, bss->ssid_len),
|
||||
bss->ssid_len);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
menuconfig RT2X00
|
||||
bool "Ralink driver support"
|
||||
tristate "Ralink driver support"
|
||||
depends on MAC80211 && WLAN_80211 && EXPERIMENTAL
|
||||
---help---
|
||||
This will enable the experimental support for the Ralink drivers,
|
||||
|
|
|
@ -49,7 +49,8 @@ struct gianfar_platform_data {
|
|||
u32 device_flags;
|
||||
/* board specific information */
|
||||
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;
|
||||
u8 mac_addr[6];
|
||||
phy_interface_t interface;
|
||||
|
|
|
@ -1537,7 +1537,6 @@ static inline void __netif_tx_unlock_bh(struct netdev_queue *txq)
|
|||
/**
|
||||
* netif_tx_lock - grab network device transmit lock
|
||||
* @dev: network device
|
||||
* @cpu: cpu number of lock owner
|
||||
*
|
||||
* Get network device transmit lock
|
||||
*/
|
||||
|
|
|
@ -214,6 +214,8 @@ struct pernet_operations {
|
|||
|
||||
extern int register_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 void unregister_pernet_device(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);
|
|||
|
||||
/**
|
||||
* sk_filter_release: Release a socket filter
|
||||
* @sk: socket
|
||||
* @fp: filter to remove
|
||||
*
|
||||
* Remove a filter from a socket and release its resources.
|
||||
|
|
|
@ -325,6 +325,38 @@ void unregister_pernet_subsys(struct pernet_operations *module)
|
|||
}
|
||||
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
|
||||
* @ops: pernet operations structure for the subsystem
|
||||
|
|
|
@ -449,6 +449,18 @@ void kfree_skb(struct sk_buff *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)
|
||||
{
|
||||
struct skb_shared_info *shinfo;
|
||||
|
|
|
@ -2063,9 +2063,10 @@ int cipso_v4_skbuff_setattr(struct sk_buff *skb,
|
|||
u32 opt_len;
|
||||
int len_delta;
|
||||
|
||||
buf_len = cipso_v4_genopt(buf, buf_len, doi_def, secattr);
|
||||
if (buf_len < 0)
|
||||
return buf_len;
|
||||
ret_val = cipso_v4_genopt(buf, buf_len, doi_def, secattr);
|
||||
if (ret_val < 0)
|
||||
return ret_val;
|
||||
buf_len = ret_val;
|
||||
opt_len = (buf_len + 3) & ~3;
|
||||
|
||||
/* 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,
|
|||
}
|
||||
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 rmt_port, __be32 rmt_addr,
|
||||
int dif)
|
||||
|
@ -296,7 +296,8 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk,
|
|||
sk_for_each_from(s, node) {
|
||||
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->dport != rmt_port && inet->dport) ||
|
||||
(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,
|
|||
read_lock(&udp_hash_lock);
|
||||
sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
|
||||
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) {
|
||||
struct sock *sknext = NULL;
|
||||
|
||||
do {
|
||||
struct sk_buff *skb1 = skb;
|
||||
|
||||
sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr,
|
||||
uh->source, saddr, dif);
|
||||
sknext = udp_v4_mcast_next(net, sk_next(sk), uh->dest,
|
||||
daddr, uh->source, saddr,
|
||||
dif);
|
||||
if (sknext)
|
||||
skb1 = skb_clone(skb, GFP_ATOMIC);
|
||||
|
||||
|
|
|
@ -328,7 +328,7 @@ drop:
|
|||
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 rmt_port, struct in6_addr *rmt_addr,
|
||||
int dif)
|
||||
|
@ -340,7 +340,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
|
|||
sk_for_each_from(s, node) {
|
||||
struct inet_sock *inet = inet_sk(s);
|
||||
|
||||
if (sock_net(s) != sock_net(sk))
|
||||
if (!net_eq(sock_net(s), net))
|
||||
continue;
|
||||
|
||||
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,
|
|||
read_lock(&udp_hash_lock);
|
||||
sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
|
||||
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) {
|
||||
kfree_skb(skb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
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))) {
|
||||
struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC);
|
||||
if (buff) {
|
||||
|
|
|
@ -2075,7 +2075,6 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, in
|
|||
req_size += socklen * 2;
|
||||
} else {
|
||||
size -= 2*socklen;
|
||||
socklen = 0;
|
||||
}
|
||||
rq = (void*)skb_put(skb, req_size);
|
||||
pol->sadb_x_policy_len += req_size/8;
|
||||
|
|
|
@ -335,7 +335,7 @@ static int __init nf_ct_proto_gre_init(void)
|
|||
rv = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_gre4);
|
||||
if (rv < 0)
|
||||
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)
|
||||
nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_gre4);
|
||||
return rv;
|
||||
|
@ -344,7 +344,7 @@ static int __init nf_ct_proto_gre_init(void)
|
|||
static void nf_ct_proto_gre_fini(void)
|
||||
{
|
||||
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);
|
||||
|
|
|
@ -315,6 +315,7 @@ struct netlbl_af6list *netlbl_af6list_remove(const struct in6_addr *addr,
|
|||
* Audit Helper Functions
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_AUDIT
|
||||
/**
|
||||
* netlbl_af4list_audit_addr - Audit an IPv4 address
|
||||
* @audit_buf: audit buffer
|
||||
|
@ -386,3 +387,4 @@ void netlbl_af6list_audit_addr(struct audit_buffer *audit_buf,
|
|||
}
|
||||
}
|
||||
#endif /* IPv6 */
|
||||
#endif /* CONFIG_AUDIT */
|
||||
|
|
|
@ -120,9 +120,19 @@ struct netlbl_af4list *netlbl_af4list_search(__be32 addr,
|
|||
struct netlbl_af4list *netlbl_af4list_search_exact(__be32 addr,
|
||||
__be32 mask,
|
||||
struct list_head *head);
|
||||
|
||||
#ifdef CONFIG_AUDIT
|
||||
void netlbl_af4list_audit_addr(struct audit_buffer *audit_buf,
|
||||
int src, const char *dev,
|
||||
__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)
|
||||
|
||||
|
@ -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,
|
||||
const struct in6_addr *mask,
|
||||
struct list_head *head);
|
||||
|
||||
#ifdef CONFIG_AUDIT
|
||||
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);
|
||||
#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
|
||||
|
|
|
@ -265,7 +265,7 @@ add_failure:
|
|||
static int netlbl_mgmt_listentry(struct sk_buff *skb,
|
||||
struct netlbl_dom_map *entry)
|
||||
{
|
||||
int ret_val;
|
||||
int ret_val = 0;
|
||||
struct nlattr *nla_a;
|
||||
struct nlattr *nla_b;
|
||||
struct netlbl_af4list *iter4;
|
||||
|
|
|
@ -2213,7 +2213,7 @@ static int unix_net_init(struct net *net)
|
|||
#endif
|
||||
error = 0;
|
||||
out:
|
||||
return 0;
|
||||
return error;
|
||||
}
|
||||
|
||||
static void unix_net_exit(struct net *net)
|
||||
|
|
|
@ -1251,6 +1251,8 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, struct flowi *fl,
|
|||
-EINVAL : -EAGAIN);
|
||||
xfrm_state_put(x);
|
||||
}
|
||||
else if (error == -ESRCH)
|
||||
error = -EAGAIN;
|
||||
|
||||
if (!tmpl->optional)
|
||||
goto fail;
|
||||
|
|
Загрузка…
Ссылка в новой задаче