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: (29 commits)
  tulip: fix 21142 with 10Mbps without negotiation
  drivers/net/skfp: if !capable(CAP_NET_ADMIN): inverted logic
  gianfar: Fix Wake-on-LAN support
  smsc911x: timeout reaches -1
  smsc9420: fix interrupt signalling test failures
  ucc_geth: Change uec phy id to the same format as gianfar's
  wimax: fix build issue when debugfs is disabled
  netxen: fix memory leak in drivers/net/netxen_nic_init.c
  tun: Add some missing TUN compat ioctl translations.
  ipv4: fix infinite retry loop in IP-Config
  net: update documentation ip aliases
  net: Fix OOPS in skb_seq_read().
  net: Fix frag_list handling in skb_seq_read
  netxen: revert jumbo ringsize
  ath5k: fix locking in ath5k_config
  cfg80211: print correct intersected regulatory domain
  cfg80211: Fix sanity check on 5 GHz when processing country IE
  iwlwifi: fix kernel oops when ucode DMA memory allocation failure
  rtl8187: Fix error in setting OFDM power settings for RTL8187L
  mac80211: remove Michael Wu as maintainer
  ...
This commit is contained in:
Linus Torvalds 2009-01-30 08:41:36 -08:00
commit dbeb17016e
35 changed files with 225 additions and 119 deletions

View File

@ -2,14 +2,14 @@
IP-Aliasing: IP-Aliasing:
============ ============
IP-aliases are additional IP-addresses/masks hooked up to a base IP-aliases are an obsolete way to manage multiple IP-addresses/masks
interface by adding a colon and a string when running ifconfig. per interface. Newer tools such as iproute2 support multiple
address/prefixes per interface, but aliases are still supported
for backwards compatibility.
An alias is formed by adding a colon and a string when running ifconfig.
This string is usually numeric, but this is not a must. This string is usually numeric, but this is not a must.
IP-Aliases are avail if CONFIG_INET (`standard' IPv4 networking)
is configured in the kernel.
o Alias creation. o Alias creation.
Alias creation is done by 'magic' interface naming: eg. to create a Alias creation is done by 'magic' interface naming: eg. to create a
200.1.1.1 alias for eth0 ... 200.1.1.1 alias for eth0 ...
@ -38,16 +38,3 @@ o Relationship with main device
If the base device is shut down the added aliases will be deleted If the base device is shut down the added aliases will be deleted
too. too.
Contact
-------
Please finger or e-mail me:
Juan Jose Ciarlante <jjciarla@raiz.uncu.edu.ar>
Updated by Erik Schoenfelder <schoenfr@gaertner.DE>
; local variables:
; mode: indented-text
; mode: auto-fill
; end:

View File

@ -2836,8 +2836,6 @@ S: Maintained
MAC80211 MAC80211
P: Johannes Berg P: Johannes Berg
M: johannes@sipsolutions.net M: johannes@sipsolutions.net
P: Michael Wu
M: flamingice@sourmilk.net
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
W: http://linuxwireless.org/ W: http://linuxwireless.org/
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git

View File

@ -31,7 +31,7 @@
char e1000_driver_name[] = "e1000"; char e1000_driver_name[] = "e1000";
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
#define DRV_VERSION "7.3.20-k3-NAPI" #define DRV_VERSION "7.3.21-k3-NAPI"
const char e1000_driver_version[] = DRV_VERSION; const char e1000_driver_version[] = DRV_VERSION;
static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
@ -3712,7 +3712,7 @@ static irqreturn_t e1000_intr(int irq, void *data)
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 rctl, icr = er32(ICR); u32 rctl, icr = er32(ICR);
if (unlikely(!icr)) if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags)))
return IRQ_NONE; /* Not our interrupt */ return IRQ_NONE; /* Not our interrupt */
/* IMS will not auto-mask if INT_ASSERTED is not set, and if it is /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is

View File

@ -234,6 +234,8 @@ static int gfar_mdio_probe(struct of_device *ofdev,
if (NULL == new_bus) if (NULL == new_bus)
return -ENOMEM; return -ENOMEM;
device_init_wakeup(&ofdev->dev, 1);
new_bus->name = "Gianfar MII Bus", new_bus->name = "Gianfar MII Bus",
new_bus->read = &gfar_mdio_read, new_bus->read = &gfar_mdio_read,
new_bus->write = &gfar_mdio_write, new_bus->write = &gfar_mdio_write,

View File

@ -210,7 +210,7 @@
#define MAX_CMD_DESCRIPTORS_HOST 1024 #define MAX_CMD_DESCRIPTORS_HOST 1024
#define MAX_RCV_DESCRIPTORS_1G 2048 #define MAX_RCV_DESCRIPTORS_1G 2048
#define MAX_RCV_DESCRIPTORS_10G 4096 #define MAX_RCV_DESCRIPTORS_10G 4096
#define MAX_JUMBO_RCV_DESCRIPTORS 512 #define MAX_JUMBO_RCV_DESCRIPTORS 1024
#define MAX_LRO_RCV_DESCRIPTORS 8 #define MAX_LRO_RCV_DESCRIPTORS 8
#define MAX_RCVSTATUS_DESCRIPTORS MAX_RCV_DESCRIPTORS #define MAX_RCVSTATUS_DESCRIPTORS MAX_RCV_DESCRIPTORS
#define MAX_JUMBO_RCV_DESC MAX_JUMBO_RCV_DESCRIPTORS #define MAX_JUMBO_RCV_DESC MAX_JUMBO_RCV_DESCRIPTORS

View File

@ -947,8 +947,10 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
} }
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
if (netxen_rom_fast_read(adapter, 8*i + 4*offset, &val) != 0 || if (netxen_rom_fast_read(adapter, 8*i + 4*offset, &val) != 0 ||
netxen_rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0) netxen_rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0) {
kfree(buf);
return -EIO; return -EIO;
}
buf[i].addr = addr; buf[i].addr = addr;
buf[i].data = val; buf[i].data = val;

View File

@ -438,7 +438,6 @@ static void r6040_down(struct net_device *dev)
{ {
struct r6040_private *lp = netdev_priv(dev); struct r6040_private *lp = netdev_priv(dev);
void __iomem *ioaddr = lp->base; void __iomem *ioaddr = lp->base;
struct pci_dev *pdev = lp->pdev;
int limit = 2048; int limit = 2048;
u16 *adrp; u16 *adrp;
u16 cmd; u16 cmd;

View File

@ -1003,9 +1003,9 @@ static int skfp_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break; break;
case SKFP_CLR_STATS: /* Zero out the driver statistics */ case SKFP_CLR_STATS: /* Zero out the driver statistics */
if (!capable(CAP_NET_ADMIN)) { if (!capable(CAP_NET_ADMIN)) {
memset(&lp->MacStat, 0, sizeof(lp->MacStat));
} else {
status = -EPERM; status = -EPERM;
} else {
memset(&lp->MacStat, 0, sizeof(lp->MacStat));
} }
break; break;
default: default:

View File

@ -953,7 +953,7 @@ smsc911x_rx_fastforward(struct smsc911x_data *pdata, unsigned int pktbytes)
do { do {
udelay(1); udelay(1);
val = smsc911x_reg_read(pdata, RX_DP_CTRL); val = smsc911x_reg_read(pdata, RX_DP_CTRL);
} while (timeout-- && (val & RX_DP_CTRL_RX_FFWD_)); } while (--timeout && (val & RX_DP_CTRL_RX_FFWD_));
if (unlikely(timeout == 0)) if (unlikely(timeout == 0))
SMSC_WARNING(HW, "Timed out waiting for " SMSC_WARNING(HW, "Timed out waiting for "

View File

@ -1378,6 +1378,7 @@ static int smsc9420_open(struct net_device *dev)
/* test the IRQ connection to the ISR */ /* test the IRQ connection to the ISR */
smsc_dbg(IFUP, "Testing ISR using IRQ %d", dev->irq); smsc_dbg(IFUP, "Testing ISR using IRQ %d", dev->irq);
pd->software_irq_signal = false;
spin_lock_irqsave(&pd->int_lock, flags); spin_lock_irqsave(&pd->int_lock, flags);
/* configure interrupt deassertion timer and enable interrupts */ /* configure interrupt deassertion timer and enable interrupts */
@ -1393,8 +1394,6 @@ static int smsc9420_open(struct net_device *dev)
smsc9420_pci_flush_write(pd); smsc9420_pci_flush_write(pd);
timeout = 1000; timeout = 1000;
pd->software_irq_signal = false;
smp_wmb();
while (timeout--) { while (timeout--) {
if (pd->software_irq_signal) if (pd->software_irq_signal)
break; break;

View File

@ -9,6 +9,11 @@
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html} Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
for more information on this driver. for more information on this driver.
DC21143 manual "21143 PCI/CardBus 10/100Mb/s Ethernet LAN Controller
Hardware Reference Manual" is currently available at :
http://developer.intel.com/design/network/manuals/278074.htm
Please submit bugs to http://bugzilla.kernel.org/ . Please submit bugs to http://bugzilla.kernel.org/ .
*/ */
@ -32,7 +37,11 @@ void t21142_media_task(struct work_struct *work)
int csr12 = ioread32(ioaddr + CSR12); int csr12 = ioread32(ioaddr + CSR12);
int next_tick = 60*HZ; int next_tick = 60*HZ;
int new_csr6 = 0; int new_csr6 = 0;
int csr14 = ioread32(ioaddr + CSR14);
/* CSR12[LS10,LS100] are not reliable during autonegotiation */
if ((csr14 & 0x80) && (csr12 & 0x7000) != 0x5000)
csr12 |= 6;
if (tulip_debug > 2) if (tulip_debug > 2)
printk(KERN_INFO"%s: 21143 negotiation status %8.8x, %s.\n", printk(KERN_INFO"%s: 21143 negotiation status %8.8x, %s.\n",
dev->name, csr12, medianame[dev->if_port]); dev->name, csr12, medianame[dev->if_port]);
@ -76,7 +85,7 @@ void t21142_media_task(struct work_struct *work)
new_csr6 = 0x83860000; new_csr6 = 0x83860000;
dev->if_port = 3; dev->if_port = 3;
iowrite32(0, ioaddr + CSR13); iowrite32(0, ioaddr + CSR13);
iowrite32(0x0003FF7F, ioaddr + CSR14); iowrite32(0x0003FFFF, ioaddr + CSR14);
iowrite16(8, ioaddr + CSR15); iowrite16(8, ioaddr + CSR15);
iowrite32(1, ioaddr + CSR13); iowrite32(1, ioaddr + CSR13);
} }
@ -132,10 +141,14 @@ void t21142_lnk_change(struct net_device *dev, int csr5)
struct tulip_private *tp = netdev_priv(dev); struct tulip_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->base_addr; void __iomem *ioaddr = tp->base_addr;
int csr12 = ioread32(ioaddr + CSR12); int csr12 = ioread32(ioaddr + CSR12);
int csr14 = ioread32(ioaddr + CSR14);
/* CSR12[LS10,LS100] are not reliable during autonegotiation */
if ((csr14 & 0x80) && (csr12 & 0x7000) != 0x5000)
csr12 |= 6;
if (tulip_debug > 1) if (tulip_debug > 1)
printk(KERN_INFO"%s: 21143 link status interrupt %8.8x, CSR5 %x, " printk(KERN_INFO"%s: 21143 link status interrupt %8.8x, CSR5 %x, "
"%8.8x.\n", dev->name, csr12, csr5, ioread32(ioaddr + CSR14)); "%8.8x.\n", dev->name, csr12, csr5, csr14);
/* If NWay finished and we have a negotiated partner capability. */ /* If NWay finished and we have a negotiated partner capability. */
if (tp->nway && !tp->nwayset && (csr12 & 0x7000) == 0x5000) { if (tp->nway && !tp->nwayset && (csr12 & 0x7000) == 0x5000) {
@ -143,7 +156,9 @@ void t21142_lnk_change(struct net_device *dev, int csr5)
int negotiated = tp->sym_advertise & (csr12 >> 16); int negotiated = tp->sym_advertise & (csr12 >> 16);
tp->lpar = csr12 >> 16; tp->lpar = csr12 >> 16;
tp->nwayset = 1; tp->nwayset = 1;
if (negotiated & 0x0100) dev->if_port = 5; /* If partner cannot negotiate, it is 10Mbps Half Duplex */
if (!(csr12 & 0x8000)) dev->if_port = 0;
else if (negotiated & 0x0100) dev->if_port = 5;
else if (negotiated & 0x0080) dev->if_port = 3; else if (negotiated & 0x0080) dev->if_port = 3;
else if (negotiated & 0x0040) dev->if_port = 4; else if (negotiated & 0x0040) dev->if_port = 4;
else if (negotiated & 0x0020) dev->if_port = 0; else if (negotiated & 0x0020) dev->if_port = 0;
@ -214,7 +229,7 @@ void t21142_lnk_change(struct net_device *dev, int csr5)
tp->timer.expires = RUN_AT(3*HZ); tp->timer.expires = RUN_AT(3*HZ);
add_timer(&tp->timer); add_timer(&tp->timer);
} else if (dev->if_port == 5) } else if (dev->if_port == 5)
iowrite32(ioread32(ioaddr + CSR14) & ~0x080, ioaddr + CSR14); iowrite32(csr14 & ~0x080, ioaddr + CSR14);
} else if (dev->if_port == 0 || dev->if_port == 4) { } else if (dev->if_port == 0 || dev->if_port == 4) {
if ((csr12 & 4) == 0) if ((csr12 & 4) == 0)
printk(KERN_INFO"%s: 21143 10baseT link beat good.\n", printk(KERN_INFO"%s: 21143 10baseT link beat good.\n",

View File

@ -1536,6 +1536,11 @@ static void adjust_link(struct net_device *dev)
static int init_phy(struct net_device *dev) static int init_phy(struct net_device *dev)
{ {
struct ucc_geth_private *priv = netdev_priv(dev); struct ucc_geth_private *priv = netdev_priv(dev);
struct device_node *np = priv->node;
struct device_node *phy, *mdio;
const phandle *ph;
char bus_name[MII_BUS_ID_SIZE];
const unsigned int *id;
struct phy_device *phydev; struct phy_device *phydev;
char phy_id[BUS_ID_SIZE]; char phy_id[BUS_ID_SIZE];
@ -1543,8 +1548,18 @@ static int init_phy(struct net_device *dev)
priv->oldspeed = 0; priv->oldspeed = 0;
priv->oldduplex = -1; priv->oldduplex = -1;
snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, priv->ug_info->mdio_bus, ph = of_get_property(np, "phy-handle", NULL);
priv->ug_info->phy_address); phy = of_find_node_by_phandle(*ph);
mdio = of_get_parent(phy);
id = of_get_property(phy, "reg", NULL);
of_node_put(phy);
of_node_put(mdio);
uec_mdio_bus_name(bus_name, mdio);
snprintf(phy_id, sizeof(phy_id), "%s:%02x",
bus_name, *id);
phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface); phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface);
@ -3748,6 +3763,7 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
ugeth->ug_info = ug_info; ugeth->ug_info = ug_info;
ugeth->dev = dev; ugeth->dev = dev;
ugeth->node = np;
return 0; return 0;
} }

View File

@ -1186,6 +1186,8 @@ struct ucc_geth_private {
int oldspeed; int oldspeed;
int oldduplex; int oldduplex;
int oldlink; int oldlink;
struct device_node *node;
}; };
void uec_set_ethtool_ops(struct net_device *netdev); void uec_set_ethtool_ops(struct net_device *netdev);

View File

@ -156,7 +156,7 @@ static int uec_mdio_probe(struct of_device *ofdev, const struct of_device_id *ma
if (err) if (err)
goto reg_map_fail; goto reg_map_fail;
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", res.start); uec_mdio_bus_name(new_bus->id, np);
new_bus->irq = kmalloc(32 * sizeof(int), GFP_KERNEL); new_bus->irq = kmalloc(32 * sizeof(int), GFP_KERNEL);
@ -283,3 +283,13 @@ void uec_mdio_exit(void)
{ {
of_unregister_platform_driver(&uec_mdio_driver); of_unregister_platform_driver(&uec_mdio_driver);
} }
void uec_mdio_bus_name(char *name, struct device_node *np)
{
const u32 *reg;
reg = of_get_property(np, "reg", NULL);
snprintf(name, MII_BUS_ID_SIZE, "%s@%x", np->name, reg ? *reg : 0);
}

View File

@ -97,4 +97,5 @@ int uec_mdio_read(struct mii_bus *bus, int mii_id, int regnum);
int uec_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value); int uec_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value);
int __init uec_mdio_init(void); int __init uec_mdio_init(void);
void uec_mdio_exit(void); void uec_mdio_exit(void);
void uec_mdio_bus_name(char *name, struct device_node *np);
#endif /* __UEC_MII_H */ #endif /* __UEC_MII_H */

View File

@ -287,7 +287,7 @@ static void try_fill_recv_maxbufs(struct virtnet_info *vi)
skb_put(skb, MAX_PACKET_LEN); skb_put(skb, MAX_PACKET_LEN);
hdr = skb_vnet_hdr(skb); hdr = skb_vnet_hdr(skb);
sg_init_one(sg, hdr, sizeof(*hdr)); sg_set_buf(sg, hdr, sizeof(*hdr));
if (vi->big_packets) { if (vi->big_packets) {
for (i = 0; i < MAX_SKB_FRAGS; i++) { for (i = 0; i < MAX_SKB_FRAGS; i++) {
@ -488,9 +488,9 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb)
/* Encode metadata header at front. */ /* Encode metadata header at front. */
if (vi->mergeable_rx_bufs) if (vi->mergeable_rx_bufs)
sg_init_one(sg, mhdr, sizeof(*mhdr)); sg_set_buf(sg, mhdr, sizeof(*mhdr));
else else
sg_init_one(sg, hdr, sizeof(*hdr)); sg_set_buf(sg, hdr, sizeof(*hdr));
num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1; num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1;

View File

@ -234,20 +234,6 @@ struct dentry *debugfs_create_i2400m_reset(
&fops_i2400m_reset); &fops_i2400m_reset);
} }
/*
* Debug levels control; see debug.h
*/
struct d_level D_LEVEL[] = {
D_SUBMODULE_DEFINE(control),
D_SUBMODULE_DEFINE(driver),
D_SUBMODULE_DEFINE(debugfs),
D_SUBMODULE_DEFINE(fw),
D_SUBMODULE_DEFINE(netdev),
D_SUBMODULE_DEFINE(rfkill),
D_SUBMODULE_DEFINE(rx),
D_SUBMODULE_DEFINE(tx),
};
size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
#define __debugfs_register(prefix, name, parent) \ #define __debugfs_register(prefix, name, parent) \
do { \ do { \

View File

@ -707,6 +707,22 @@ void i2400m_release(struct i2400m *i2400m)
EXPORT_SYMBOL_GPL(i2400m_release); EXPORT_SYMBOL_GPL(i2400m_release);
/*
* Debug levels control; see debug.h
*/
struct d_level D_LEVEL[] = {
D_SUBMODULE_DEFINE(control),
D_SUBMODULE_DEFINE(driver),
D_SUBMODULE_DEFINE(debugfs),
D_SUBMODULE_DEFINE(fw),
D_SUBMODULE_DEFINE(netdev),
D_SUBMODULE_DEFINE(rfkill),
D_SUBMODULE_DEFINE(rx),
D_SUBMODULE_DEFINE(tx),
};
size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
static static
int __init i2400m_driver_init(void) int __init i2400m_driver_init(void)
{ {

View File

@ -1028,6 +1028,8 @@ ath5k_setup_bands(struct ieee80211_hw *hw)
* it's done by reseting the chip. To accomplish this we must * it's done by reseting the chip. To accomplish this we must
* first cleanup any pending DMA, then restart stuff after a la * first cleanup any pending DMA, then restart stuff after a la
* ath5k_init. * ath5k_init.
*
* Called with sc->lock.
*/ */
static int static int
ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan) ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan)
@ -2814,11 +2816,17 @@ ath5k_config(struct ieee80211_hw *hw, u32 changed)
{ {
struct ath5k_softc *sc = hw->priv; struct ath5k_softc *sc = hw->priv;
struct ieee80211_conf *conf = &hw->conf; struct ieee80211_conf *conf = &hw->conf;
int ret;
mutex_lock(&sc->lock);
sc->bintval = conf->beacon_int; sc->bintval = conf->beacon_int;
sc->power_level = conf->power_level; sc->power_level = conf->power_level;
return ath5k_chan_set(sc, conf->channel); ret = ath5k_chan_set(sc, conf->channel);
mutex_unlock(&sc->lock);
return ret;
} }
static int static int

View File

@ -1719,6 +1719,10 @@ static int iwl_read_ucode(struct iwl_priv *priv)
priv->ucode_data_backup.len = data_size; priv->ucode_data_backup.len = data_size;
iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_data_backup); iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_data_backup);
if (!priv->ucode_code.v_addr || !priv->ucode_data.v_addr ||
!priv->ucode_data_backup.v_addr)
goto err_pci_alloc;
/* Initialization instructions and data */ /* Initialization instructions and data */
if (init_size && init_data_size) { if (init_size && init_data_size) {
priv->ucode_init.len = init_size; priv->ucode_init.len = init_size;

View File

@ -285,7 +285,10 @@ static void rtl8225_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
ofdm_power = priv->channels[channel - 1].hw_value >> 4; ofdm_power = priv->channels[channel - 1].hw_value >> 4;
cck_power = min(cck_power, (u8)11); cck_power = min(cck_power, (u8)11);
ofdm_power = min(ofdm_power, (u8)35); if (ofdm_power > (u8)15)
ofdm_power = 25;
else
ofdm_power += 10;
rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK, rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK,
rtl8225_tx_gain_cck_ofdm[cck_power / 6] >> 1); rtl8225_tx_gain_cck_ofdm[cck_power / 6] >> 1);
@ -536,7 +539,10 @@ static void rtl8225z2_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
cck_power += priv->txpwr_base & 0xF; cck_power += priv->txpwr_base & 0xF;
cck_power = min(cck_power, (u8)35); cck_power = min(cck_power, (u8)35);
ofdm_power = min(ofdm_power, (u8)15); if (ofdm_power > (u8)15)
ofdm_power = 25;
else
ofdm_power += 10;
ofdm_power += priv->txpwr_base >> 4; ofdm_power += priv->txpwr_base >> 4;
ofdm_power = min(ofdm_power, (u8)35); ofdm_power = min(ofdm_power, (u8)35);

View File

@ -538,6 +538,7 @@ static int dev_ifsioc(unsigned int fd, unsigned int cmd, unsigned long arg)
* cannot be fixed without breaking all existing apps. * cannot be fixed without breaking all existing apps.
*/ */
case TUNSETIFF: case TUNSETIFF:
case TUNGETIFF:
case SIOCGIFFLAGS: case SIOCGIFFLAGS:
case SIOCGIFMETRIC: case SIOCGIFMETRIC:
case SIOCGIFMTU: case SIOCGIFMTU:
@ -1982,6 +1983,11 @@ COMPATIBLE_IOCTL(TUNSETNOCSUM)
COMPATIBLE_IOCTL(TUNSETDEBUG) COMPATIBLE_IOCTL(TUNSETDEBUG)
COMPATIBLE_IOCTL(TUNSETPERSIST) COMPATIBLE_IOCTL(TUNSETPERSIST)
COMPATIBLE_IOCTL(TUNSETOWNER) COMPATIBLE_IOCTL(TUNSETOWNER)
COMPATIBLE_IOCTL(TUNSETLINK)
COMPATIBLE_IOCTL(TUNSETGROUP)
COMPATIBLE_IOCTL(TUNGETFEATURES)
COMPATIBLE_IOCTL(TUNSETOFFLOAD)
COMPATIBLE_IOCTL(TUNSETTXFILTER)
/* Big V */ /* Big V */
COMPATIBLE_IOCTL(VT_SETMODE) COMPATIBLE_IOCTL(VT_SETMODE)
COMPATIBLE_IOCTL(VT_GETMODE) COMPATIBLE_IOCTL(VT_GETMODE)
@ -2573,6 +2579,7 @@ HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc)
HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc) HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc) HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
HANDLE_IOCTL(TUNSETIFF, dev_ifsioc) HANDLE_IOCTL(TUNSETIFF, dev_ifsioc)
HANDLE_IOCTL(TUNGETIFF, dev_ifsioc)
HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl) HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl)
HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl) HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl)
HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl) HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl)

View File

@ -182,7 +182,7 @@ static inline int inet_ehash_locks_alloc(struct inet_hashinfo *hashinfo)
size = 2048; size = 2048;
if (nr_pcpus >= 32) if (nr_pcpus >= 32)
size = 4096; size = 4096;
if (sizeof(rwlock_t) != 0) { if (sizeof(spinlock_t) != 0) {
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
if (size * sizeof(spinlock_t) > PAGE_SIZE) if (size * sizeof(spinlock_t) > PAGE_SIZE)
hashinfo->ehash_locks = vmalloc(size * sizeof(spinlock_t)); hashinfo->ehash_locks = vmalloc(size * sizeof(spinlock_t));

View File

@ -2212,10 +2212,10 @@ unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
return 0; return 0;
next_skb: next_skb:
block_limit = skb_headlen(st->cur_skb); block_limit = skb_headlen(st->cur_skb) + st->stepped_offset;
if (abs_offset < block_limit) { if (abs_offset < block_limit) {
*data = st->cur_skb->data + abs_offset; *data = st->cur_skb->data + (abs_offset - st->stepped_offset);
return block_limit - abs_offset; return block_limit - abs_offset;
} }
@ -2250,13 +2250,14 @@ next_skb:
st->frag_data = NULL; st->frag_data = NULL;
} }
if (st->cur_skb->next) { if (st->root_skb == st->cur_skb &&
st->cur_skb = st->cur_skb->next; skb_shinfo(st->root_skb)->frag_list) {
st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
st->frag_idx = 0; st->frag_idx = 0;
goto next_skb; goto next_skb;
} else if (st->root_skb == st->cur_skb && } else if (st->cur_skb->next) {
skb_shinfo(st->root_skb)->frag_list) { st->cur_skb = st->cur_skb->next;
st->cur_skb = skb_shinfo(st->root_skb)->frag_list; st->frag_idx = 0;
goto next_skb; goto next_skb;
} }

View File

@ -1268,6 +1268,9 @@ __be32 __init root_nfs_parse_addr(char *name)
static int __init ip_auto_config(void) static int __init ip_auto_config(void)
{ {
__be32 addr; __be32 addr;
#ifdef IPCONFIG_DYNAMIC
int retries = CONF_OPEN_RETRIES;
#endif
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops); proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops);
@ -1304,9 +1307,6 @@ static int __init ip_auto_config(void)
#endif #endif
ic_first_dev->next) { ic_first_dev->next) {
#ifdef IPCONFIG_DYNAMIC #ifdef IPCONFIG_DYNAMIC
int retries = CONF_OPEN_RETRIES;
if (ic_dynamic() < 0) { if (ic_dynamic() < 0) {
ic_close_devs(); ic_close_devs();

View File

@ -524,7 +524,8 @@ static int tcp_splice_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
struct tcp_splice_state *tss = rd_desc->arg.data; struct tcp_splice_state *tss = rd_desc->arg.data;
int ret; int ret;
ret = skb_splice_bits(skb, offset, tss->pipe, rd_desc->count, tss->flags); ret = skb_splice_bits(skb, offset, tss->pipe, min(rd_desc->count, len),
tss->flags);
if (ret > 0) if (ret > 0)
rd_desc->count -= ret; rd_desc->count -= ret;
return ret; return ret;

View File

@ -120,8 +120,11 @@ EXPORT_SYMBOL(sysctl_udp_wmem_min);
atomic_t udp_memory_allocated; atomic_t udp_memory_allocated;
EXPORT_SYMBOL(udp_memory_allocated); EXPORT_SYMBOL(udp_memory_allocated);
#define PORTS_PER_CHAIN (65536 / UDP_HTABLE_SIZE)
static int udp_lib_lport_inuse(struct net *net, __u16 num, static int udp_lib_lport_inuse(struct net *net, __u16 num,
const struct udp_hslot *hslot, const struct udp_hslot *hslot,
unsigned long *bitmap,
struct sock *sk, struct sock *sk,
int (*saddr_comp)(const struct sock *sk1, int (*saddr_comp)(const struct sock *sk1,
const struct sock *sk2)) const struct sock *sk2))
@ -132,12 +135,17 @@ static int udp_lib_lport_inuse(struct net *net, __u16 num,
sk_nulls_for_each(sk2, node, &hslot->head) sk_nulls_for_each(sk2, node, &hslot->head)
if (net_eq(sock_net(sk2), net) && if (net_eq(sock_net(sk2), net) &&
sk2 != sk && sk2 != sk &&
sk2->sk_hash == num && (bitmap || sk2->sk_hash == num) &&
(!sk2->sk_reuse || !sk->sk_reuse) && (!sk2->sk_reuse || !sk->sk_reuse) &&
(!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if
|| sk2->sk_bound_dev_if == sk->sk_bound_dev_if) && || sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
(*saddr_comp)(sk, sk2)) (*saddr_comp)(sk, sk2)) {
return 1; if (bitmap)
__set_bit(sk2->sk_hash / UDP_HTABLE_SIZE,
bitmap);
else
return 1;
}
return 0; return 0;
} }
@ -160,32 +168,47 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
if (!snum) { if (!snum) {
int low, high, remaining; int low, high, remaining;
unsigned rand; unsigned rand;
unsigned short first; unsigned short first, last;
DECLARE_BITMAP(bitmap, PORTS_PER_CHAIN);
inet_get_local_port_range(&low, &high); inet_get_local_port_range(&low, &high);
remaining = (high - low) + 1; remaining = (high - low) + 1;
rand = net_random(); rand = net_random();
snum = first = rand % remaining + low; first = (((u64)rand * remaining) >> 32) + low;
rand |= 1; /*
for (;;) { * force rand to be an odd multiple of UDP_HTABLE_SIZE
hslot = &udptable->hash[udp_hashfn(net, snum)]; */
rand = (rand | 1) * UDP_HTABLE_SIZE;
for (last = first + UDP_HTABLE_SIZE; first != last; first++) {
hslot = &udptable->hash[udp_hashfn(net, first)];
bitmap_zero(bitmap, PORTS_PER_CHAIN);
spin_lock_bh(&hslot->lock); spin_lock_bh(&hslot->lock);
if (!udp_lib_lport_inuse(net, snum, hslot, sk, saddr_comp)) udp_lib_lport_inuse(net, snum, hslot, bitmap, sk,
break; saddr_comp);
spin_unlock_bh(&hslot->lock);
snum = first;
/*
* Iterate on all possible values of snum for this hash.
* Using steps of an odd multiple of UDP_HTABLE_SIZE
* give us randomization and full range coverage.
*/
do { do {
snum = snum + rand; if (low <= snum && snum <= high &&
} while (snum < low || snum > high); !test_bit(snum / UDP_HTABLE_SIZE, bitmap))
if (snum == first) goto found;
goto fail; snum += rand;
} while (snum != first);
spin_unlock_bh(&hslot->lock);
} }
goto fail;
} else { } else {
hslot = &udptable->hash[udp_hashfn(net, snum)]; hslot = &udptable->hash[udp_hashfn(net, snum)];
spin_lock_bh(&hslot->lock); spin_lock_bh(&hslot->lock);
if (udp_lib_lport_inuse(net, snum, hslot, sk, saddr_comp)) if (udp_lib_lport_inuse(net, snum, hslot, NULL, sk, saddr_comp))
goto fail_unlock; goto fail_unlock;
} }
found:
inet_sk(sk)->num = snum; inet_sk(sk)->num = snum;
sk->sk_hash = snum; sk->sk_hash = snum;
if (sk_unhashed(sk)) { if (sk_unhashed(sk)) {

View File

@ -4250,7 +4250,7 @@ static struct addrconf_sysctl_table
.procname = "mc_forwarding", .procname = "mc_forwarding",
.data = &ipv6_devconf.mc_forwarding, .data = &ipv6_devconf.mc_forwarding,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0444,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec,
}, },
#endif #endif

View File

@ -443,10 +443,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6)) if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6))
goto relookup_failed; goto relookup_failed;
if (ip6_dst_lookup(sk, &dst2, &fl)) if (ip6_dst_lookup(sk, &dst2, &fl2))
goto relookup_failed; goto relookup_failed;
err = xfrm_lookup(net, &dst2, &fl, sk, XFRM_LOOKUP_ICMP); err = xfrm_lookup(net, &dst2, &fl2, sk, XFRM_LOOKUP_ICMP);
switch (err) { switch (err) {
case 0: case 0:
dst_release(dst); dst_release(dst);

View File

@ -255,6 +255,7 @@ int ip6_mc_input(struct sk_buff *skb)
* IPv6 multicast router mode is now supported ;) * IPv6 multicast router mode is now supported ;)
*/ */
if (dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding && if (dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding &&
!(ipv6_addr_type(&hdr->daddr) & IPV6_ADDR_LINKLOCAL) &&
likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) { likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) {
/* /*
* Okay, we try to forward - split and duplicate * Okay, we try to forward - split and duplicate
@ -316,7 +317,6 @@ int ip6_mc_input(struct sk_buff *skb)
} }
if (skb2) { if (skb2) {
skb2->dev = skb2->dst->dev;
ip6_mr_input(skb2); ip6_mr_input(skb2);
} }
} }

View File

@ -365,7 +365,9 @@ static int pim6_rcv(struct sk_buff *skb)
pim = (struct pimreghdr *)skb_transport_header(skb); pim = (struct pimreghdr *)skb_transport_header(skb);
if (pim->type != ((PIM_VERSION << 4) | PIM_REGISTER) || if (pim->type != ((PIM_VERSION << 4) | PIM_REGISTER) ||
(pim->flags & PIM_NULL_REGISTER) || (pim->flags & PIM_NULL_REGISTER) ||
(ip_compute_csum((void *)pim, sizeof(*pim)) != 0 && (csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
sizeof(*pim), IPPROTO_PIM,
csum_partial((void *)pim, sizeof(*pim), 0)) &&
csum_fold(skb_checksum(skb, 0, skb->len, 0)))) csum_fold(skb_checksum(skb, 0, skb->len, 0))))
goto drop; goto drop;
@ -392,7 +394,7 @@ static int pim6_rcv(struct sk_buff *skb)
skb_pull(skb, (u8 *)encap - skb->data); skb_pull(skb, (u8 *)encap - skb->data);
skb_reset_network_header(skb); skb_reset_network_header(skb);
skb->dev = reg_dev; skb->dev = reg_dev;
skb->protocol = htons(ETH_P_IP); skb->protocol = htons(ETH_P_IPV6);
skb->ip_summed = 0; skb->ip_summed = 0;
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
dst_release(skb->dst); dst_release(skb->dst);
@ -481,6 +483,7 @@ static int mif6_delete(struct net *net, int vifi)
{ {
struct mif_device *v; struct mif_device *v;
struct net_device *dev; struct net_device *dev;
struct inet6_dev *in6_dev;
if (vifi < 0 || vifi >= net->ipv6.maxvif) if (vifi < 0 || vifi >= net->ipv6.maxvif)
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
@ -513,6 +516,10 @@ static int mif6_delete(struct net *net, int vifi)
dev_set_allmulti(dev, -1); dev_set_allmulti(dev, -1);
in6_dev = __in6_dev_get(dev);
if (in6_dev)
in6_dev->cnf.mc_forwarding--;
if (v->flags & MIFF_REGISTER) if (v->flags & MIFF_REGISTER)
unregister_netdevice(dev); unregister_netdevice(dev);
@ -622,6 +629,7 @@ static int mif6_add(struct net *net, struct mif6ctl *vifc, int mrtsock)
int vifi = vifc->mif6c_mifi; int vifi = vifc->mif6c_mifi;
struct mif_device *v = &net->ipv6.vif6_table[vifi]; struct mif_device *v = &net->ipv6.vif6_table[vifi];
struct net_device *dev; struct net_device *dev;
struct inet6_dev *in6_dev;
int err; int err;
/* Is vif busy ? */ /* Is vif busy ? */
@ -662,6 +670,10 @@ static int mif6_add(struct net *net, struct mif6ctl *vifc, int mrtsock)
return -EINVAL; return -EINVAL;
} }
in6_dev = __in6_dev_get(dev);
if (in6_dev)
in6_dev->cnf.mc_forwarding++;
/* /*
* Fill in the VIF structures * Fill in the VIF structures
*/ */
@ -838,8 +850,6 @@ static int ip6mr_cache_report(struct net *net, struct sk_buff *pkt, mifi_t mifi,
skb->dst = dst_clone(pkt->dst); skb->dst = dst_clone(pkt->dst);
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
skb_pull(skb, sizeof(struct ipv6hdr));
} }
if (net->ipv6.mroute6_sk == NULL) { if (net->ipv6.mroute6_sk == NULL) {
@ -1222,8 +1232,10 @@ static int ip6mr_sk_init(struct sock *sk)
rtnl_lock(); rtnl_lock();
write_lock_bh(&mrt_lock); write_lock_bh(&mrt_lock);
if (likely(net->ipv6.mroute6_sk == NULL)) if (likely(net->ipv6.mroute6_sk == NULL)) {
net->ipv6.mroute6_sk = sk; net->ipv6.mroute6_sk = sk;
net->ipv6.devconf_all->mc_forwarding++;
}
else else
err = -EADDRINUSE; err = -EADDRINUSE;
write_unlock_bh(&mrt_lock); write_unlock_bh(&mrt_lock);
@ -1242,6 +1254,7 @@ int ip6mr_sk_done(struct sock *sk)
if (sk == net->ipv6.mroute6_sk) { if (sk == net->ipv6.mroute6_sk) {
write_lock_bh(&mrt_lock); write_lock_bh(&mrt_lock);
net->ipv6.mroute6_sk = NULL; net->ipv6.mroute6_sk = NULL;
net->ipv6.devconf_all->mc_forwarding--;
write_unlock_bh(&mrt_lock); write_unlock_bh(&mrt_lock);
mroute_clean_tables(net); mroute_clean_tables(net);

View File

@ -794,7 +794,7 @@ void ip6_route_input(struct sk_buff *skb)
.proto = iph->nexthdr, .proto = iph->nexthdr,
}; };
if (rt6_need_strict(&iph->daddr)) if (rt6_need_strict(&iph->daddr) && skb->dev->type != ARPHRD_PIMREG)
flags |= RT6_LOOKUP_F_IFACE; flags |= RT6_LOOKUP_F_IFACE;
skb->dst = fib6_rule_lookup(net, &fl, flags, ip6_pol_route_input); skb->dst = fib6_rule_lookup(net, &fl, flags, ip6_pol_route_input);

View File

@ -28,17 +28,6 @@
#include "debug-levels.h" #include "debug-levels.h"
/* Debug framework control of debug levels */
struct d_level D_LEVEL[] = {
D_SUBMODULE_DEFINE(debugfs),
D_SUBMODULE_DEFINE(id_table),
D_SUBMODULE_DEFINE(op_msg),
D_SUBMODULE_DEFINE(op_reset),
D_SUBMODULE_DEFINE(op_rfkill),
D_SUBMODULE_DEFINE(stack),
};
size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
#define __debugfs_register(prefix, name, parent) \ #define __debugfs_register(prefix, name, parent) \
do { \ do { \
result = d_level_register_debugfs(prefix, name, parent); \ result = d_level_register_debugfs(prefix, name, parent); \

View File

@ -516,6 +516,19 @@ void wimax_dev_rm(struct wimax_dev *wimax_dev)
} }
EXPORT_SYMBOL_GPL(wimax_dev_rm); EXPORT_SYMBOL_GPL(wimax_dev_rm);
/* Debug framework control of debug levels */
struct d_level D_LEVEL[] = {
D_SUBMODULE_DEFINE(debugfs),
D_SUBMODULE_DEFINE(id_table),
D_SUBMODULE_DEFINE(op_msg),
D_SUBMODULE_DEFINE(op_reset),
D_SUBMODULE_DEFINE(op_rfkill),
D_SUBMODULE_DEFINE(stack),
};
size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
struct genl_family wimax_gnl_family = { struct genl_family wimax_gnl_family = {
.id = GENL_ID_GENERATE, .id = GENL_ID_GENERATE,
.name = "WiMAX", .name = "WiMAX",

View File

@ -498,6 +498,7 @@ static struct ieee80211_regdomain *country_ie_2_rd(
* calculate the number of reg rules we will need. We will need one * calculate the number of reg rules we will need. We will need one
* for each channel subband */ * for each channel subband */
while (country_ie_len >= 3) { while (country_ie_len >= 3) {
int end_channel = 0;
struct ieee80211_country_ie_triplet *triplet = struct ieee80211_country_ie_triplet *triplet =
(struct ieee80211_country_ie_triplet *) country_ie; (struct ieee80211_country_ie_triplet *) country_ie;
int cur_sub_max_channel = 0, cur_channel = 0; int cur_sub_max_channel = 0, cur_channel = 0;
@ -509,9 +510,25 @@ static struct ieee80211_regdomain *country_ie_2_rd(
continue; continue;
} }
/* 2 GHz */
if (triplet->chans.first_channel <= 14)
end_channel = triplet->chans.first_channel +
triplet->chans.num_channels;
else
/*
* 5 GHz -- For example in country IEs if the first
* channel given is 36 and the number of channels is 4
* then the individual channel numbers defined for the
* 5 GHz PHY by these parameters are: 36, 40, 44, and 48
* and not 36, 37, 38, 39.
*
* See: http://tinyurl.com/11d-clarification
*/
end_channel = triplet->chans.first_channel +
(4 * (triplet->chans.num_channels - 1));
cur_channel = triplet->chans.first_channel; cur_channel = triplet->chans.first_channel;
cur_sub_max_channel = ieee80211_channel_to_frequency( cur_sub_max_channel = end_channel;
cur_channel + triplet->chans.num_channels);
/* Basic sanity check */ /* Basic sanity check */
if (cur_sub_max_channel < cur_channel) if (cur_sub_max_channel < cur_channel)
@ -590,15 +607,6 @@ static struct ieee80211_regdomain *country_ie_2_rd(
end_channel = triplet->chans.first_channel + end_channel = triplet->chans.first_channel +
triplet->chans.num_channels; triplet->chans.num_channels;
else else
/*
* 5 GHz -- For example in country IEs if the first
* channel given is 36 and the number of channels is 4
* then the individual channel numbers defined for the
* 5 GHz PHY by these parameters are: 36, 40, 44, and 48
* and not 36, 37, 38, 39.
*
* See: http://tinyurl.com/11d-clarification
*/
end_channel = triplet->chans.first_channel + end_channel = triplet->chans.first_channel +
(4 * (triplet->chans.num_channels - 1)); (4 * (triplet->chans.num_channels - 1));
@ -1276,7 +1284,7 @@ static void reg_country_ie_process_debug(
if (intersected_rd) { if (intersected_rd) {
printk(KERN_DEBUG "cfg80211: We intersect both of these " printk(KERN_DEBUG "cfg80211: We intersect both of these "
"and get:\n"); "and get:\n");
print_regdomain_info(rd); print_regdomain_info(intersected_rd);
return; return;
} }
printk(KERN_DEBUG "cfg80211: Intersection between both failed\n"); printk(KERN_DEBUG "cfg80211: Intersection between both failed\n");