Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/wireless/rt2x00/Kconfig drivers/net/wireless/rt2x00/rt2x00usb.c net/sctp/protocol.c
This commit is contained in:
commit
caea902f72
23 changed files with 251 additions and 180 deletions
|
@ -1542,7 +1542,8 @@ he_start(struct atm_dev *dev)
|
||||||
/* initialize framer */
|
/* initialize framer */
|
||||||
|
|
||||||
#ifdef CONFIG_ATM_HE_USE_SUNI
|
#ifdef CONFIG_ATM_HE_USE_SUNI
|
||||||
suni_init(he_dev->atm_dev);
|
if (he_isMM(he_dev))
|
||||||
|
suni_init(he_dev->atm_dev);
|
||||||
if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start)
|
if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start)
|
||||||
he_dev->atm_dev->phy->start(he_dev->atm_dev);
|
he_dev->atm_dev->phy->start(he_dev->atm_dev);
|
||||||
#endif /* CONFIG_ATM_HE_USE_SUNI */
|
#endif /* CONFIG_ATM_HE_USE_SUNI */
|
||||||
|
@ -1554,6 +1555,7 @@ he_start(struct atm_dev *dev)
|
||||||
val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM);
|
val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM);
|
||||||
val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT);
|
val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT);
|
||||||
he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM);
|
he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM);
|
||||||
|
he_phy_put(he_dev->atm_dev, SUNI_TACP_IUCHP_CLP, SUNI_TACP_IUCHP);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 5.1.12 enable transmit and receive */
|
/* 5.1.12 enable transmit and receive */
|
||||||
|
@ -2844,10 +2846,15 @@ he_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg)
|
||||||
if (copy_from_user(®, arg,
|
if (copy_from_user(®, arg,
|
||||||
sizeof(struct he_ioctl_reg)))
|
sizeof(struct he_ioctl_reg)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
spin_lock_irqsave(&he_dev->global_lock, flags);
|
spin_lock_irqsave(&he_dev->global_lock, flags);
|
||||||
switch (reg.type) {
|
switch (reg.type) {
|
||||||
case HE_REGTYPE_PCI:
|
case HE_REGTYPE_PCI:
|
||||||
|
if (reg.addr < 0 || reg.addr >= HE_REGMAP_SIZE) {
|
||||||
|
err = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
reg.val = he_readl(he_dev, reg.addr);
|
reg.val = he_readl(he_dev, reg.addr);
|
||||||
break;
|
break;
|
||||||
case HE_REGTYPE_RCM:
|
case HE_REGTYPE_RCM:
|
||||||
|
|
|
@ -267,13 +267,7 @@ struct he_dev {
|
||||||
|
|
||||||
char prod_id[30];
|
char prod_id[30];
|
||||||
char mac_addr[6];
|
char mac_addr[6];
|
||||||
int media; /*
|
int media;
|
||||||
* 0x26 = HE155 MM
|
|
||||||
* 0x27 = HE622 MM
|
|
||||||
* 0x46 = HE155 SM
|
|
||||||
* 0x47 = HE622 SM
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int vcibits, vpibits;
|
unsigned int vcibits, vpibits;
|
||||||
unsigned int cells_per_row;
|
unsigned int cells_per_row;
|
||||||
|
@ -392,6 +386,7 @@ struct he_vcc
|
||||||
#define HE_DEV(dev) ((struct he_dev *) (dev)->dev_data)
|
#define HE_DEV(dev) ((struct he_dev *) (dev)->dev_data)
|
||||||
|
|
||||||
#define he_is622(dev) ((dev)->media & 0x1)
|
#define he_is622(dev) ((dev)->media & 0x1)
|
||||||
|
#define he_isMM(dev) ((dev)->media & 0x20)
|
||||||
|
|
||||||
#define HE_REGMAP_SIZE 0x100000
|
#define HE_REGMAP_SIZE 0x100000
|
||||||
|
|
||||||
|
@ -876,8 +871,8 @@ struct he_vcc
|
||||||
#define M_SN 0x3a /* integer */
|
#define M_SN 0x3a /* integer */
|
||||||
#define MEDIA 0x3e /* integer */
|
#define MEDIA 0x3e /* integer */
|
||||||
#define HE155MM 0x26
|
#define HE155MM 0x26
|
||||||
#define HE155SM 0x27
|
#define HE622MM 0x27
|
||||||
#define HE622MM 0x46
|
#define HE155SM 0x46
|
||||||
#define HE622SM 0x47
|
#define HE622SM 0x47
|
||||||
#define MAC_ADDR 0x42 /* char[] */
|
#define MAC_ADDR 0x42 /* char[] */
|
||||||
|
|
||||||
|
|
|
@ -2562,17 +2562,11 @@ static int __devinit ia_start(struct atm_dev *dev)
|
||||||
error = suni_init(dev);
|
error = suni_init(dev);
|
||||||
if (error)
|
if (error)
|
||||||
goto err_free_rx;
|
goto err_free_rx;
|
||||||
/*
|
if (dev->phy->start) {
|
||||||
* Enable interrupt on loss of signal
|
error = dev->phy->start(dev);
|
||||||
* SUNI_RSOP_CIE - 0x10
|
if (error)
|
||||||
* SUNI_RSOP_CIE_LOSE - 0x04
|
goto err_free_rx;
|
||||||
*/
|
}
|
||||||
ia_phy_put(dev, ia_phy_get(dev, 0x10) | 0x04, 0x10);
|
|
||||||
#ifndef MODULE
|
|
||||||
error = dev->phy->start(dev);
|
|
||||||
if (error)
|
|
||||||
goto err_free_rx;
|
|
||||||
#endif
|
|
||||||
/* Get iadev->carrier_detect status */
|
/* Get iadev->carrier_detect status */
|
||||||
IaFrontEndIntr(iadev);
|
IaFrontEndIntr(iadev);
|
||||||
}
|
}
|
||||||
|
@ -3198,6 +3192,8 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
|
||||||
IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev,
|
IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev,
|
||||||
iadev->LineRate);)
|
iadev->LineRate);)
|
||||||
|
|
||||||
|
pci_set_drvdata(pdev, dev);
|
||||||
|
|
||||||
ia_dev[iadev_count] = iadev;
|
ia_dev[iadev_count] = iadev;
|
||||||
_ia_dev[iadev_count] = dev;
|
_ia_dev[iadev_count] = dev;
|
||||||
iadev_count++;
|
iadev_count++;
|
||||||
|
@ -3219,8 +3215,6 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
|
||||||
iadev->next_board = ia_boards;
|
iadev->next_board = ia_boards;
|
||||||
ia_boards = dev;
|
ia_boards = dev;
|
||||||
|
|
||||||
pci_set_drvdata(pdev, dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_out_deregister_dev:
|
err_out_deregister_dev:
|
||||||
|
@ -3238,9 +3232,14 @@ static void __devexit ia_remove_one(struct pci_dev *pdev)
|
||||||
struct atm_dev *dev = pci_get_drvdata(pdev);
|
struct atm_dev *dev = pci_get_drvdata(pdev);
|
||||||
IADEV *iadev = INPH_IA_DEV(dev);
|
IADEV *iadev = INPH_IA_DEV(dev);
|
||||||
|
|
||||||
ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10);
|
/* Disable phy interrupts */
|
||||||
|
ia_phy_put(dev, ia_phy_get(dev, SUNI_RSOP_CIE) & ~(SUNI_RSOP_CIE_LOSE),
|
||||||
|
SUNI_RSOP_CIE);
|
||||||
udelay(1);
|
udelay(1);
|
||||||
|
|
||||||
|
if (dev->phy && dev->phy->stop)
|
||||||
|
dev->phy->stop(dev);
|
||||||
|
|
||||||
/* De-register device */
|
/* De-register device */
|
||||||
free_irq(iadev->irq, dev);
|
free_irq(iadev->irq, dev);
|
||||||
iadev_count--;
|
iadev_count--;
|
||||||
|
|
|
@ -649,7 +649,6 @@ struct b43_pio {
|
||||||
|
|
||||||
/* Context information for a noise calculation (Link Quality). */
|
/* Context information for a noise calculation (Link Quality). */
|
||||||
struct b43_noise_calculation {
|
struct b43_noise_calculation {
|
||||||
u8 channel_at_start;
|
|
||||||
bool calculation_running;
|
bool calculation_running;
|
||||||
u8 nr_samples;
|
u8 nr_samples;
|
||||||
s8 samples[8][4];
|
s8 samples[8][4];
|
||||||
|
|
|
@ -795,66 +795,23 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
||||||
{
|
{
|
||||||
struct b43_dmaring *ring;
|
struct b43_dmaring *ring;
|
||||||
int err;
|
int err;
|
||||||
int nr_slots;
|
|
||||||
dma_addr_t dma_test;
|
dma_addr_t dma_test;
|
||||||
|
|
||||||
ring = kzalloc(sizeof(*ring), GFP_KERNEL);
|
ring = kzalloc(sizeof(*ring), GFP_KERNEL);
|
||||||
if (!ring)
|
if (!ring)
|
||||||
goto out;
|
goto out;
|
||||||
ring->type = type;
|
|
||||||
|
|
||||||
nr_slots = B43_RXRING_SLOTS;
|
ring->nr_slots = B43_RXRING_SLOTS;
|
||||||
if (for_tx)
|
if (for_tx)
|
||||||
nr_slots = B43_TXRING_SLOTS;
|
ring->nr_slots = B43_TXRING_SLOTS;
|
||||||
|
|
||||||
ring->meta = kcalloc(nr_slots, sizeof(struct b43_dmadesc_meta),
|
ring->meta = kcalloc(ring->nr_slots, sizeof(struct b43_dmadesc_meta),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!ring->meta)
|
if (!ring->meta)
|
||||||
goto err_kfree_ring;
|
goto err_kfree_ring;
|
||||||
if (for_tx) {
|
|
||||||
ring->txhdr_cache = kcalloc(nr_slots,
|
|
||||||
b43_txhdr_size(dev),
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!ring->txhdr_cache)
|
|
||||||
goto err_kfree_meta;
|
|
||||||
|
|
||||||
/* test for ability to dma to txhdr_cache */
|
|
||||||
dma_test = dma_map_single(dev->dev->dma_dev,
|
|
||||||
ring->txhdr_cache,
|
|
||||||
b43_txhdr_size(dev),
|
|
||||||
DMA_TO_DEVICE);
|
|
||||||
|
|
||||||
if (b43_dma_mapping_error(ring, dma_test,
|
|
||||||
b43_txhdr_size(dev), 1)) {
|
|
||||||
/* ugh realloc */
|
|
||||||
kfree(ring->txhdr_cache);
|
|
||||||
ring->txhdr_cache = kcalloc(nr_slots,
|
|
||||||
b43_txhdr_size(dev),
|
|
||||||
GFP_KERNEL | GFP_DMA);
|
|
||||||
if (!ring->txhdr_cache)
|
|
||||||
goto err_kfree_meta;
|
|
||||||
|
|
||||||
dma_test = dma_map_single(dev->dev->dma_dev,
|
|
||||||
ring->txhdr_cache,
|
|
||||||
b43_txhdr_size(dev),
|
|
||||||
DMA_TO_DEVICE);
|
|
||||||
|
|
||||||
if (b43_dma_mapping_error(ring, dma_test,
|
|
||||||
b43_txhdr_size(dev), 1)) {
|
|
||||||
|
|
||||||
b43err(dev->wl,
|
|
||||||
"TXHDR DMA allocation failed\n");
|
|
||||||
goto err_kfree_txhdr_cache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dma_unmap_single(dev->dev->dma_dev,
|
|
||||||
dma_test, b43_txhdr_size(dev),
|
|
||||||
DMA_TO_DEVICE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
ring->type = type;
|
||||||
ring->dev = dev;
|
ring->dev = dev;
|
||||||
ring->nr_slots = nr_slots;
|
|
||||||
ring->mmio_base = b43_dmacontroller_base(type, controller_index);
|
ring->mmio_base = b43_dmacontroller_base(type, controller_index);
|
||||||
ring->index = controller_index;
|
ring->index = controller_index;
|
||||||
if (type == B43_DMA_64BIT)
|
if (type == B43_DMA_64BIT)
|
||||||
|
@ -879,6 +836,48 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
||||||
ring->last_injected_overflow = jiffies;
|
ring->last_injected_overflow = jiffies;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (for_tx) {
|
||||||
|
ring->txhdr_cache = kcalloc(ring->nr_slots,
|
||||||
|
b43_txhdr_size(dev),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!ring->txhdr_cache)
|
||||||
|
goto err_kfree_meta;
|
||||||
|
|
||||||
|
/* test for ability to dma to txhdr_cache */
|
||||||
|
dma_test = dma_map_single(dev->dev->dma_dev,
|
||||||
|
ring->txhdr_cache,
|
||||||
|
b43_txhdr_size(dev),
|
||||||
|
DMA_TO_DEVICE);
|
||||||
|
|
||||||
|
if (b43_dma_mapping_error(ring, dma_test,
|
||||||
|
b43_txhdr_size(dev), 1)) {
|
||||||
|
/* ugh realloc */
|
||||||
|
kfree(ring->txhdr_cache);
|
||||||
|
ring->txhdr_cache = kcalloc(ring->nr_slots,
|
||||||
|
b43_txhdr_size(dev),
|
||||||
|
GFP_KERNEL | GFP_DMA);
|
||||||
|
if (!ring->txhdr_cache)
|
||||||
|
goto err_kfree_meta;
|
||||||
|
|
||||||
|
dma_test = dma_map_single(dev->dev->dma_dev,
|
||||||
|
ring->txhdr_cache,
|
||||||
|
b43_txhdr_size(dev),
|
||||||
|
DMA_TO_DEVICE);
|
||||||
|
|
||||||
|
if (b43_dma_mapping_error(ring, dma_test,
|
||||||
|
b43_txhdr_size(dev), 1)) {
|
||||||
|
|
||||||
|
b43err(dev->wl,
|
||||||
|
"TXHDR DMA allocation failed\n");
|
||||||
|
goto err_kfree_txhdr_cache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dma_unmap_single(dev->dev->dma_dev,
|
||||||
|
dma_test, b43_txhdr_size(dev),
|
||||||
|
DMA_TO_DEVICE);
|
||||||
|
}
|
||||||
|
|
||||||
err = alloc_ringmemory(ring);
|
err = alloc_ringmemory(ring);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_kfree_txhdr_cache;
|
goto err_kfree_txhdr_cache;
|
||||||
|
|
|
@ -1145,7 +1145,6 @@ static void b43_generate_noise_sample(struct b43_wldev *dev)
|
||||||
b43_jssi_write(dev, 0x7F7F7F7F);
|
b43_jssi_write(dev, 0x7F7F7F7F);
|
||||||
b43_write32(dev, B43_MMIO_MACCMD,
|
b43_write32(dev, B43_MMIO_MACCMD,
|
||||||
b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE);
|
b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE);
|
||||||
B43_WARN_ON(dev->noisecalc.channel_at_start != dev->phy.channel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void b43_calculate_link_quality(struct b43_wldev *dev)
|
static void b43_calculate_link_quality(struct b43_wldev *dev)
|
||||||
|
@ -1154,7 +1153,6 @@ static void b43_calculate_link_quality(struct b43_wldev *dev)
|
||||||
|
|
||||||
if (dev->noisecalc.calculation_running)
|
if (dev->noisecalc.calculation_running)
|
||||||
return;
|
return;
|
||||||
dev->noisecalc.channel_at_start = dev->phy.channel;
|
|
||||||
dev->noisecalc.calculation_running = 1;
|
dev->noisecalc.calculation_running = 1;
|
||||||
dev->noisecalc.nr_samples = 0;
|
dev->noisecalc.nr_samples = 0;
|
||||||
|
|
||||||
|
@ -1171,9 +1169,16 @@ static void handle_irq_noise(struct b43_wldev *dev)
|
||||||
|
|
||||||
/* Bottom half of Link Quality calculation. */
|
/* Bottom half of Link Quality calculation. */
|
||||||
|
|
||||||
|
/* Possible race condition: It might be possible that the user
|
||||||
|
* changed to a different channel in the meantime since we
|
||||||
|
* started the calculation. We ignore that fact, since it's
|
||||||
|
* not really that much of a problem. The background noise is
|
||||||
|
* an estimation only anyway. Slightly wrong results will get damped
|
||||||
|
* by the averaging of the 8 sample rounds. Additionally the
|
||||||
|
* value is shortlived. So it will be replaced by the next noise
|
||||||
|
* calculation round soon. */
|
||||||
|
|
||||||
B43_WARN_ON(!dev->noisecalc.calculation_running);
|
B43_WARN_ON(!dev->noisecalc.calculation_running);
|
||||||
if (dev->noisecalc.channel_at_start != phy->channel)
|
|
||||||
goto drop_calculation;
|
|
||||||
*((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev));
|
*((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev));
|
||||||
if (noise[0] == 0x7F || noise[1] == 0x7F ||
|
if (noise[0] == 0x7F || noise[1] == 0x7F ||
|
||||||
noise[2] == 0x7F || noise[3] == 0x7F)
|
noise[2] == 0x7F || noise[3] == 0x7F)
|
||||||
|
@ -1214,11 +1219,10 @@ static void handle_irq_noise(struct b43_wldev *dev)
|
||||||
average -= 48;
|
average -= 48;
|
||||||
|
|
||||||
dev->stats.link_noise = average;
|
dev->stats.link_noise = average;
|
||||||
drop_calculation:
|
|
||||||
dev->noisecalc.calculation_running = 0;
|
dev->noisecalc.calculation_running = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
generate_new:
|
generate_new:
|
||||||
b43_generate_noise_sample(dev);
|
b43_generate_noise_sample(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,12 +36,13 @@ config RT2X00_LIB_FIRMWARE
|
||||||
config RT2X00_LIB_RFKILL
|
config RT2X00_LIB_RFKILL
|
||||||
boolean
|
boolean
|
||||||
depends on RT2X00_LIB
|
depends on RT2X00_LIB
|
||||||
|
depends on INPUT
|
||||||
select RFKILL
|
select RFKILL
|
||||||
select INPUT_POLLDEV
|
select INPUT_POLLDEV
|
||||||
|
|
||||||
config RT2X00_LIB_LEDS
|
config RT2X00_LIB_LEDS
|
||||||
boolean
|
boolean
|
||||||
depends on RT2X00_LIB
|
depends on RT2X00_LIB && NEW_LEDS
|
||||||
|
|
||||||
config RT2400PCI
|
config RT2400PCI
|
||||||
tristate "Ralink rt2400 (PCI/PCMCIA) support"
|
tristate "Ralink rt2400 (PCI/PCMCIA) support"
|
||||||
|
@ -56,7 +57,7 @@ config RT2400PCI
|
||||||
|
|
||||||
config RT2400PCI_RFKILL
|
config RT2400PCI_RFKILL
|
||||||
bool "Ralink rt2400 rfkill support"
|
bool "Ralink rt2400 rfkill support"
|
||||||
depends on RT2400PCI
|
depends on RT2400PCI && INPUT
|
||||||
select RT2X00_LIB_RFKILL
|
select RT2X00_LIB_RFKILL
|
||||||
---help---
|
---help---
|
||||||
This adds support for integrated rt2400 hardware that features a
|
This adds support for integrated rt2400 hardware that features a
|
||||||
|
@ -65,7 +66,7 @@ config RT2400PCI_RFKILL
|
||||||
|
|
||||||
config RT2400PCI_LEDS
|
config RT2400PCI_LEDS
|
||||||
bool "Ralink rt2400 leds support"
|
bool "Ralink rt2400 leds support"
|
||||||
depends on RT2400PCI
|
depends on RT2400PCI && NEW_LEDS
|
||||||
select LEDS_CLASS
|
select LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
|
@ -84,7 +85,7 @@ config RT2500PCI
|
||||||
|
|
||||||
config RT2500PCI_RFKILL
|
config RT2500PCI_RFKILL
|
||||||
bool "Ralink rt2500 rfkill support"
|
bool "Ralink rt2500 rfkill support"
|
||||||
depends on RT2500PCI
|
depends on RT2500PCI && INPUT
|
||||||
select RT2X00_LIB_RFKILL
|
select RT2X00_LIB_RFKILL
|
||||||
---help---
|
---help---
|
||||||
This adds support for integrated rt2500 hardware that features a
|
This adds support for integrated rt2500 hardware that features a
|
||||||
|
@ -93,7 +94,7 @@ config RT2500PCI_RFKILL
|
||||||
|
|
||||||
config RT2500PCI_LEDS
|
config RT2500PCI_LEDS
|
||||||
bool "Ralink rt2500 leds support"
|
bool "Ralink rt2500 leds support"
|
||||||
depends on RT2500PCI
|
depends on RT2500PCI && NEW_LEDS
|
||||||
select LEDS_CLASS
|
select LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
|
@ -114,7 +115,7 @@ config RT61PCI
|
||||||
|
|
||||||
config RT61PCI_RFKILL
|
config RT61PCI_RFKILL
|
||||||
bool "Ralink rt2501/rt61 rfkill support"
|
bool "Ralink rt2501/rt61 rfkill support"
|
||||||
depends on RT61PCI
|
depends on RT61PCI && INPUT
|
||||||
select RT2X00_LIB_RFKILL
|
select RT2X00_LIB_RFKILL
|
||||||
---help---
|
---help---
|
||||||
This adds support for integrated rt61 hardware that features a
|
This adds support for integrated rt61 hardware that features a
|
||||||
|
@ -123,7 +124,7 @@ config RT61PCI_RFKILL
|
||||||
|
|
||||||
config RT61PCI_LEDS
|
config RT61PCI_LEDS
|
||||||
bool "Ralink rt2501/rt61 leds support"
|
bool "Ralink rt2501/rt61 leds support"
|
||||||
depends on RT61PCI
|
depends on RT61PCI && NEW_LEDS
|
||||||
select LEDS_CLASS
|
select LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
|
@ -141,7 +142,7 @@ config RT2500USB
|
||||||
|
|
||||||
config RT2500USB_LEDS
|
config RT2500USB_LEDS
|
||||||
bool "Ralink rt2500 leds support"
|
bool "Ralink rt2500 leds support"
|
||||||
depends on RT2500USB
|
depends on RT2500USB && NEW_LEDS
|
||||||
select LEDS_CLASS
|
select LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
|
@ -161,7 +162,7 @@ config RT73USB
|
||||||
|
|
||||||
config RT73USB_LEDS
|
config RT73USB_LEDS
|
||||||
bool "Ralink rt2501/rt73 leds support"
|
bool "Ralink rt2501/rt73 leds support"
|
||||||
depends on RT73USB
|
depends on RT73USB && NEW_LEDS
|
||||||
select LEDS_CLASS
|
select LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
|
|
|
@ -357,8 +357,7 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
|
||||||
if (pci_set_mwi(pci_dev))
|
if (pci_set_mwi(pci_dev))
|
||||||
ERROR_PROBE("MWI not available.\n");
|
ERROR_PROBE("MWI not available.\n");
|
||||||
|
|
||||||
if (pci_set_dma_mask(pci_dev, DMA_64BIT_MASK) &&
|
if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) {
|
||||||
pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) {
|
|
||||||
ERROR_PROBE("PCI DMA not supported.\n");
|
ERROR_PROBE("PCI DMA not supported.\n");
|
||||||
retval = -EIO;
|
retval = -EIO;
|
||||||
goto exit_disable_device;
|
goto exit_disable_device;
|
||||||
|
|
|
@ -345,8 +345,11 @@ void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kill guardian urb.
|
* Kill guardian urb (if required by driver).
|
||||||
*/
|
*/
|
||||||
|
if (!test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags))
|
||||||
|
return;
|
||||||
|
|
||||||
for (i = 0; i < rt2x00dev->bcn->limit; i++) {
|
for (i = 0; i < rt2x00dev->bcn->limit; i++) {
|
||||||
bcn_priv = rt2x00dev->bcn->entries[i].priv_data;
|
bcn_priv = rt2x00dev->bcn->entries[i].priv_data;
|
||||||
if (bcn_priv->guardian_urb)
|
if (bcn_priv->guardian_urb)
|
||||||
|
|
|
@ -2114,6 +2114,7 @@ static struct usb_device_id rt73usb_device_table[] = {
|
||||||
/* D-Link */
|
/* D-Link */
|
||||||
{ USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
|
{ USB_DEVICE(0x07d1, 0x3c06), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* Gemtek */
|
/* Gemtek */
|
||||||
{ USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
|
|
|
@ -1168,15 +1168,21 @@ EXPORT_SYMBOL(ssb_dma_translation);
|
||||||
int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask)
|
int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask)
|
||||||
{
|
{
|
||||||
struct device *dma_dev = ssb_dev->dma_dev;
|
struct device *dma_dev = ssb_dev->dma_dev;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
#ifdef CONFIG_SSB_PCIHOST
|
#ifdef CONFIG_SSB_PCIHOST
|
||||||
if (ssb_dev->bus->bustype == SSB_BUSTYPE_PCI)
|
if (ssb_dev->bus->bustype == SSB_BUSTYPE_PCI) {
|
||||||
return dma_set_mask(dma_dev, mask);
|
err = pci_set_dma_mask(ssb_dev->bus->host_pci, mask);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = pci_set_consistent_dma_mask(ssb_dev->bus->host_pci, mask);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
dma_dev->coherent_dma_mask = mask;
|
dma_dev->coherent_dma_mask = mask;
|
||||||
dma_dev->dma_mask = &dma_dev->coherent_dma_mask;
|
dma_dev->dma_mask = &dma_dev->coherent_dma_mask;
|
||||||
|
|
||||||
return 0;
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ssb_dma_set_mask);
|
EXPORT_SYMBOL(ssb_dma_set_mask);
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ struct ip_tunnel_prl {
|
||||||
__u16 __reserved;
|
__u16 __reserved;
|
||||||
__u32 datalen;
|
__u32 datalen;
|
||||||
__u32 __reserved2;
|
__u32 __reserved2;
|
||||||
void __user *data;
|
/* data follows */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* PRL flags */
|
/* PRL flags */
|
||||||
|
|
|
@ -188,10 +188,13 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct br2684_dev *brdev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else { /* e_vc */
|
||||||
skb_push(skb, 2);
|
if (brdev->payload == p_bridged) {
|
||||||
if (brdev->payload == p_bridged)
|
skb_push(skb, 2);
|
||||||
memset(skb->data, 0, 2);
|
memset(skb->data, 0, 2);
|
||||||
|
} else { /* p_routed */
|
||||||
|
skb_pull(skb, ETH_HLEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
skb_debug(skb);
|
skb_debug(skb);
|
||||||
|
|
||||||
|
@ -377,11 +380,8 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb)
|
||||||
(skb->data + 6, ethertype_ipv4,
|
(skb->data + 6, ethertype_ipv4,
|
||||||
sizeof(ethertype_ipv4)) == 0)
|
sizeof(ethertype_ipv4)) == 0)
|
||||||
skb->protocol = __constant_htons(ETH_P_IP);
|
skb->protocol = __constant_htons(ETH_P_IP);
|
||||||
else {
|
else
|
||||||
brdev->stats.rx_errors++;
|
goto error;
|
||||||
dev_kfree_skb(skb);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
skb_pull(skb, sizeof(llc_oui_ipv4));
|
skb_pull(skb, sizeof(llc_oui_ipv4));
|
||||||
skb_reset_network_header(skb);
|
skb_reset_network_header(skb);
|
||||||
skb->pkt_type = PACKET_HOST;
|
skb->pkt_type = PACKET_HOST;
|
||||||
|
@ -394,44 +394,56 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb)
|
||||||
(memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) {
|
(memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) {
|
||||||
skb_pull(skb, sizeof(llc_oui_pid_pad));
|
skb_pull(skb, sizeof(llc_oui_pid_pad));
|
||||||
skb->protocol = eth_type_trans(skb, net_dev);
|
skb->protocol = eth_type_trans(skb, net_dev);
|
||||||
} else {
|
} else
|
||||||
brdev->stats.rx_errors++;
|
goto error;
|
||||||
dev_kfree_skb(skb);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else { /* e_vc */
|
||||||
/* first 2 chars should be 0 */
|
if (brdev->payload == p_routed) {
|
||||||
if (*((u16 *) (skb->data)) != 0) {
|
struct iphdr *iph;
|
||||||
brdev->stats.rx_errors++;
|
|
||||||
dev_kfree_skb(skb);
|
skb_reset_network_header(skb);
|
||||||
return;
|
iph = ip_hdr(skb);
|
||||||
|
if (iph->version == 4)
|
||||||
|
skb->protocol = __constant_htons(ETH_P_IP);
|
||||||
|
else if (iph->version == 6)
|
||||||
|
skb->protocol = __constant_htons(ETH_P_IPV6);
|
||||||
|
else
|
||||||
|
goto error;
|
||||||
|
skb->pkt_type = PACKET_HOST;
|
||||||
|
} else { /* p_bridged */
|
||||||
|
/* first 2 chars should be 0 */
|
||||||
|
if (*((u16 *) (skb->data)) != 0)
|
||||||
|
goto error;
|
||||||
|
skb_pull(skb, BR2684_PAD_LEN);
|
||||||
|
skb->protocol = eth_type_trans(skb, net_dev);
|
||||||
}
|
}
|
||||||
skb_pull(skb, BR2684_PAD_LEN + ETH_HLEN); /* pad, dstmac, srcmac, ethtype */
|
|
||||||
skb->protocol = eth_type_trans(skb, net_dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ATM_BR2684_IPFILTER
|
#ifdef CONFIG_ATM_BR2684_IPFILTER
|
||||||
if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) {
|
if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb)))
|
||||||
brdev->stats.rx_dropped++;
|
goto dropped;
|
||||||
dev_kfree_skb(skb);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_ATM_BR2684_IPFILTER */
|
#endif /* CONFIG_ATM_BR2684_IPFILTER */
|
||||||
skb->dev = net_dev;
|
skb->dev = net_dev;
|
||||||
ATM_SKB(skb)->vcc = atmvcc; /* needed ? */
|
ATM_SKB(skb)->vcc = atmvcc; /* needed ? */
|
||||||
pr_debug("received packet's protocol: %x\n", ntohs(skb->protocol));
|
pr_debug("received packet's protocol: %x\n", ntohs(skb->protocol));
|
||||||
skb_debug(skb);
|
skb_debug(skb);
|
||||||
if (unlikely(!(net_dev->flags & IFF_UP))) {
|
/* sigh, interface is down? */
|
||||||
/* sigh, interface is down */
|
if (unlikely(!(net_dev->flags & IFF_UP)))
|
||||||
brdev->stats.rx_dropped++;
|
goto dropped;
|
||||||
dev_kfree_skb(skb);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
brdev->stats.rx_packets++;
|
brdev->stats.rx_packets++;
|
||||||
brdev->stats.rx_bytes += skb->len;
|
brdev->stats.rx_bytes += skb->len;
|
||||||
memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data));
|
memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data));
|
||||||
netif_rx(skb);
|
netif_rx(skb);
|
||||||
|
return;
|
||||||
|
|
||||||
|
dropped:
|
||||||
|
brdev->stats.rx_dropped++;
|
||||||
|
goto free_skb;
|
||||||
|
error:
|
||||||
|
brdev->stats.rx_errors++;
|
||||||
|
free_skb:
|
||||||
|
dev_kfree_skb(skb);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -518,9 +530,9 @@ static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg)
|
||||||
struct sk_buff *next = skb->next;
|
struct sk_buff *next = skb->next;
|
||||||
|
|
||||||
skb->next = skb->prev = NULL;
|
skb->next = skb->prev = NULL;
|
||||||
|
br2684_push(atmvcc, skb);
|
||||||
BRPRIV(skb->dev)->stats.rx_bytes -= skb->len;
|
BRPRIV(skb->dev)->stats.rx_bytes -= skb->len;
|
||||||
BRPRIV(skb->dev)->stats.rx_packets--;
|
BRPRIV(skb->dev)->stats.rx_packets--;
|
||||||
br2684_push(atmvcc, skb);
|
|
||||||
|
|
||||||
skb = next;
|
skb = next;
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,6 +119,7 @@
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
#include <linux/if_arp.h>
|
#include <linux/if_arp.h>
|
||||||
|
#include <linux/if_vlan.h>
|
||||||
|
|
||||||
#include "net-sysfs.h"
|
#include "net-sysfs.h"
|
||||||
|
|
||||||
|
@ -1362,6 +1363,29 @@ void netif_device_attach(struct net_device *dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(netif_device_attach);
|
EXPORT_SYMBOL(netif_device_attach);
|
||||||
|
|
||||||
|
static bool can_checksum_protocol(unsigned long features, __be16 protocol)
|
||||||
|
{
|
||||||
|
return ((features & NETIF_F_GEN_CSUM) ||
|
||||||
|
((features & NETIF_F_IP_CSUM) &&
|
||||||
|
protocol == htons(ETH_P_IP)) ||
|
||||||
|
((features & NETIF_F_IPV6_CSUM) &&
|
||||||
|
protocol == htons(ETH_P_IPV6)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
if (can_checksum_protocol(dev->features, skb->protocol))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (skb->protocol == htons(ETH_P_8021Q)) {
|
||||||
|
struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
|
||||||
|
if (can_checksum_protocol(dev->features & dev->vlan_features,
|
||||||
|
veh->h_vlan_encapsulated_proto))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Invalidate hardware checksum when packet is to be mangled, and
|
* Invalidate hardware checksum when packet is to be mangled, and
|
||||||
|
@ -1640,14 +1664,8 @@ int dev_queue_xmit(struct sk_buff *skb)
|
||||||
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||||
skb_set_transport_header(skb, skb->csum_start -
|
skb_set_transport_header(skb, skb->csum_start -
|
||||||
skb_headroom(skb));
|
skb_headroom(skb));
|
||||||
|
if (!dev_can_checksum(dev, skb) && skb_checksum_help(skb))
|
||||||
if (!(dev->features & NETIF_F_GEN_CSUM) &&
|
goto out_kfree_skb;
|
||||||
!((dev->features & NETIF_F_IP_CSUM) &&
|
|
||||||
skb->protocol == htons(ETH_P_IP)) &&
|
|
||||||
!((dev->features & NETIF_F_IPV6_CSUM) &&
|
|
||||||
skb->protocol == htons(ETH_P_IPV6)))
|
|
||||||
if (skb_checksum_help(skb))
|
|
||||||
goto out_kfree_skb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gso:
|
gso:
|
||||||
|
|
|
@ -468,9 +468,9 @@ void inet_csk_reqsk_queue_prune(struct sock *parent,
|
||||||
reqp=&lopt->syn_table[i];
|
reqp=&lopt->syn_table[i];
|
||||||
while ((req = *reqp) != NULL) {
|
while ((req = *reqp) != NULL) {
|
||||||
if (time_after_eq(now, req->expires)) {
|
if (time_after_eq(now, req->expires)) {
|
||||||
if ((req->retrans < (inet_rsk(req)->acked ? max_retries : thresh)) &&
|
if ((req->retrans < thresh ||
|
||||||
(inet_rsk(req)->acked ||
|
(inet_rsk(req)->acked && req->retrans < max_retries))
|
||||||
!req->rsk_ops->rtx_syn_ack(parent, req))) {
|
&& !req->rsk_ops->rtx_syn_ack(parent, req)) {
|
||||||
unsigned long timeo;
|
unsigned long timeo;
|
||||||
|
|
||||||
if (req->retrans++ == 0)
|
if (req->retrans++ == 0)
|
||||||
|
|
|
@ -931,7 +931,7 @@ static void raw_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
|
||||||
srcp = inet->num;
|
srcp = inet->num;
|
||||||
|
|
||||||
seq_printf(seq, "%4d: %08X:%04X %08X:%04X"
|
seq_printf(seq, "%4d: %08X:%04X %08X:%04X"
|
||||||
" %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d",
|
" %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d\n",
|
||||||
i, src, srcp, dest, destp, sp->sk_state,
|
i, src, srcp, dest, destp, sp->sk_state,
|
||||||
atomic_read(&sp->sk_wmem_alloc),
|
atomic_read(&sp->sk_wmem_alloc),
|
||||||
atomic_read(&sp->sk_rmem_alloc),
|
atomic_read(&sp->sk_rmem_alloc),
|
||||||
|
|
|
@ -83,10 +83,6 @@
|
||||||
int sysctl_tcp_tw_reuse __read_mostly;
|
int sysctl_tcp_tw_reuse __read_mostly;
|
||||||
int sysctl_tcp_low_latency __read_mostly;
|
int sysctl_tcp_low_latency __read_mostly;
|
||||||
|
|
||||||
/* Check TCP sequence numbers in ICMP packets. */
|
|
||||||
#define ICMP_MIN_LENGTH 8
|
|
||||||
|
|
||||||
void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb);
|
|
||||||
|
|
||||||
#ifdef CONFIG_TCP_MD5SIG
|
#ifdef CONFIG_TCP_MD5SIG
|
||||||
static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk,
|
static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk,
|
||||||
|
|
|
@ -220,15 +220,18 @@ __ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipip6_tunnel_get_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
|
static int ipip6_tunnel_get_prl(struct ip_tunnel *t,
|
||||||
|
struct ip_tunnel_prl __user *a)
|
||||||
{
|
{
|
||||||
struct ip_tunnel_prl *kp;
|
struct ip_tunnel_prl kprl, *kp;
|
||||||
struct ip_tunnel_prl_entry *prl;
|
struct ip_tunnel_prl_entry *prl;
|
||||||
unsigned int cmax, c = 0, ca, len;
|
unsigned int cmax, c = 0, ca, len;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
cmax = a->datalen / sizeof(*a);
|
if (copy_from_user(&kprl, a, sizeof(kprl)))
|
||||||
if (cmax > 1 && a->addr != htonl(INADDR_ANY))
|
return -EFAULT;
|
||||||
|
cmax = kprl.datalen / sizeof(kprl);
|
||||||
|
if (cmax > 1 && kprl.addr != htonl(INADDR_ANY))
|
||||||
cmax = 1;
|
cmax = 1;
|
||||||
|
|
||||||
/* For simple GET or for root users,
|
/* For simple GET or for root users,
|
||||||
|
@ -259,26 +262,25 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
|
||||||
for (prl = t->prl; prl; prl = prl->next) {
|
for (prl = t->prl; prl; prl = prl->next) {
|
||||||
if (c > cmax)
|
if (c > cmax)
|
||||||
break;
|
break;
|
||||||
if (a->addr != htonl(INADDR_ANY) && prl->addr != a->addr)
|
if (kprl.addr != htonl(INADDR_ANY) && prl->addr != kprl.addr)
|
||||||
continue;
|
continue;
|
||||||
kp[c].addr = prl->addr;
|
kp[c].addr = prl->addr;
|
||||||
kp[c].flags = prl->flags;
|
kp[c].flags = prl->flags;
|
||||||
c++;
|
c++;
|
||||||
if (a->addr != htonl(INADDR_ANY))
|
if (kprl.addr != htonl(INADDR_ANY))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
read_unlock(&ipip6_lock);
|
read_unlock(&ipip6_lock);
|
||||||
|
|
||||||
len = sizeof(*kp) * c;
|
len = sizeof(*kp) * c;
|
||||||
ret = len ? copy_to_user(a->data, kp, len) : 0;
|
ret = 0;
|
||||||
|
if ((len && copy_to_user(a + 1, kp, len)) || put_user(len, &a->datalen))
|
||||||
|
ret = -EFAULT;
|
||||||
|
|
||||||
kfree(kp);
|
kfree(kp);
|
||||||
if (ret)
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
a->datalen = len;
|
return ret;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -871,11 +873,20 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCGETPRL:
|
case SIOCGETPRL:
|
||||||
|
err = -EINVAL;
|
||||||
|
if (dev == sitn->fb_tunnel_dev)
|
||||||
|
goto done;
|
||||||
|
err = -ENOENT;
|
||||||
|
if (!(t = netdev_priv(dev)))
|
||||||
|
goto done;
|
||||||
|
err = ipip6_tunnel_get_prl(t, ifr->ifr_ifru.ifru_data);
|
||||||
|
break;
|
||||||
|
|
||||||
case SIOCADDPRL:
|
case SIOCADDPRL:
|
||||||
case SIOCDELPRL:
|
case SIOCDELPRL:
|
||||||
case SIOCCHGPRL:
|
case SIOCCHGPRL:
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
if (cmd != SIOCGETPRL && !capable(CAP_NET_ADMIN))
|
if (!capable(CAP_NET_ADMIN))
|
||||||
goto done;
|
goto done;
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
if (dev == sitn->fb_tunnel_dev)
|
if (dev == sitn->fb_tunnel_dev)
|
||||||
|
@ -888,12 +899,6 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SIOCGETPRL:
|
|
||||||
err = ipip6_tunnel_get_prl(t, &prl);
|
|
||||||
if (!err && copy_to_user(ifr->ifr_ifru.ifru_data,
|
|
||||||
&prl, sizeof(prl)))
|
|
||||||
err = -EFAULT;
|
|
||||||
break;
|
|
||||||
case SIOCDELPRL:
|
case SIOCDELPRL:
|
||||||
err = ipip6_tunnel_del_prl(t, &prl);
|
err = ipip6_tunnel_del_prl(t, &prl);
|
||||||
break;
|
break;
|
||||||
|
@ -902,8 +907,7 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||||
err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL);
|
err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (cmd != SIOCGETPRL)
|
netdev_state_change(dev);
|
||||||
netdev_state_change(dev);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -508,7 +508,8 @@ static int ieee80211_ioctl_giwap(struct net_device *dev,
|
||||||
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
|
if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
|
||||||
sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
|
sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
|
||||||
if (sdata->u.sta.state == IEEE80211_ASSOCIATED) {
|
if (sdata->u.sta.state == IEEE80211_ASSOCIATED ||
|
||||||
|
sdata->u.sta.state == IEEE80211_IBSS_JOINED) {
|
||||||
ap_addr->sa_family = ARPHRD_ETHER;
|
ap_addr->sa_family = ARPHRD_ETHER;
|
||||||
memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN);
|
memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -637,7 +637,7 @@ int ieee80211_ht_agg_queue_add(struct ieee80211_local *local,
|
||||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||||
if (net_ratelimit())
|
if (net_ratelimit())
|
||||||
printk(KERN_DEBUG "allocated aggregation queue"
|
printk(KERN_DEBUG "allocated aggregation queue"
|
||||||
" %d tid %d addr %s pool=0x%lX",
|
" %d tid %d addr %s pool=0x%lX\n",
|
||||||
i, tid, print_mac(mac, sta->addr),
|
i, tid, print_mac(mac, sta->addr),
|
||||||
q->qdisc_pool[0]);
|
q->qdisc_pool[0]);
|
||||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
* and many others. thanks.
|
* and many others. thanks.
|
||||||
*/
|
*/
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
@ -51,13 +52,17 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define HTB_HSIZE 16 /* classid hash size */
|
#define HTB_HSIZE 16 /* classid hash size */
|
||||||
#define HTB_HYSTERESIS 1 /* whether to use mode hysteresis for speedup */
|
static int htb_hysteresis __read_mostly = 0; /* whether to use mode hysteresis for speedup */
|
||||||
#define HTB_VER 0x30011 /* major must be matched with number suplied by TC as version */
|
#define HTB_VER 0x30011 /* major must be matched with number suplied by TC as version */
|
||||||
|
|
||||||
#if HTB_VER >> 16 != TC_HTB_PROTOVER
|
#if HTB_VER >> 16 != TC_HTB_PROTOVER
|
||||||
#error "Mismatched sch_htb.c and pkt_sch.h"
|
#error "Mismatched sch_htb.c and pkt_sch.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Module parameter and sysfs export */
|
||||||
|
module_param (htb_hysteresis, int, 0640);
|
||||||
|
MODULE_PARM_DESC(htb_hysteresis, "Hysteresis mode, less CPU load, less accurate");
|
||||||
|
|
||||||
/* used internaly to keep status of single class */
|
/* used internaly to keep status of single class */
|
||||||
enum htb_cmode {
|
enum htb_cmode {
|
||||||
HTB_CANT_SEND, /* class can't send and can't borrow */
|
HTB_CANT_SEND, /* class can't send and can't borrow */
|
||||||
|
@ -460,19 +465,21 @@ static void htb_deactivate_prios(struct htb_sched *q, struct htb_class *cl)
|
||||||
htb_remove_class_from_row(q, cl, mask);
|
htb_remove_class_from_row(q, cl, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HTB_HYSTERESIS
|
|
||||||
static inline long htb_lowater(const struct htb_class *cl)
|
static inline long htb_lowater(const struct htb_class *cl)
|
||||||
{
|
{
|
||||||
return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0;
|
if (htb_hysteresis)
|
||||||
|
return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
static inline long htb_hiwater(const struct htb_class *cl)
|
static inline long htb_hiwater(const struct htb_class *cl)
|
||||||
{
|
{
|
||||||
return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0;
|
if (htb_hysteresis)
|
||||||
|
return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define htb_lowater(cl) (0)
|
|
||||||
#define htb_hiwater(cl) (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* htb_class_mode - computes and returns current class mode
|
* htb_class_mode - computes and returns current class mode
|
||||||
|
|
|
@ -476,6 +476,15 @@ static void sctp_association_destroy(struct sctp_association *asoc)
|
||||||
void sctp_assoc_set_primary(struct sctp_association *asoc,
|
void sctp_assoc_set_primary(struct sctp_association *asoc,
|
||||||
struct sctp_transport *transport)
|
struct sctp_transport *transport)
|
||||||
{
|
{
|
||||||
|
int changeover = 0;
|
||||||
|
|
||||||
|
/* it's a changeover only if we already have a primary path
|
||||||
|
* that we are changing
|
||||||
|
*/
|
||||||
|
if (asoc->peer.primary_path != NULL &&
|
||||||
|
asoc->peer.primary_path != transport)
|
||||||
|
changeover = 1 ;
|
||||||
|
|
||||||
asoc->peer.primary_path = transport;
|
asoc->peer.primary_path = transport;
|
||||||
|
|
||||||
/* Set a default msg_name for events. */
|
/* Set a default msg_name for events. */
|
||||||
|
@ -501,12 +510,12 @@ void sctp_assoc_set_primary(struct sctp_association *asoc,
|
||||||
* double switch to the same destination address.
|
* double switch to the same destination address.
|
||||||
*/
|
*/
|
||||||
if (transport->cacc.changeover_active)
|
if (transport->cacc.changeover_active)
|
||||||
transport->cacc.cycling_changeover = 1;
|
transport->cacc.cycling_changeover = changeover;
|
||||||
|
|
||||||
/* 2) The sender MUST set CHANGEOVER_ACTIVE to indicate that
|
/* 2) The sender MUST set CHANGEOVER_ACTIVE to indicate that
|
||||||
* a changeover has occurred.
|
* a changeover has occurred.
|
||||||
*/
|
*/
|
||||||
transport->cacc.changeover_active = 1;
|
transport->cacc.changeover_active = changeover;
|
||||||
|
|
||||||
/* 3) The sender MUST store the next TSN to be sent in
|
/* 3) The sender MUST store the next TSN to be sent in
|
||||||
* next_tsn_at_change.
|
* next_tsn_at_change.
|
||||||
|
|
|
@ -108,16 +108,27 @@ static __init int sctp_proc_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sctp_snmp_proc_init())
|
if (sctp_snmp_proc_init())
|
||||||
goto out_nomem;
|
goto out_snmp_proc_init;
|
||||||
if (sctp_eps_proc_init())
|
if (sctp_eps_proc_init())
|
||||||
goto out_nomem;
|
goto out_eps_proc_init;
|
||||||
if (sctp_assocs_proc_init())
|
if (sctp_assocs_proc_init())
|
||||||
goto out_nomem;
|
goto out_assocs_proc_init;
|
||||||
if (sctp_remaddr_proc_init())
|
if (sctp_remaddr_proc_init())
|
||||||
goto out_nomem;
|
goto out_remaddr_proc_init;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_remaddr_proc_init:
|
||||||
|
sctp_remaddr_proc_exit();
|
||||||
|
out_assocs_proc_init:
|
||||||
|
sctp_eps_proc_exit();
|
||||||
|
out_eps_proc_init:
|
||||||
|
sctp_snmp_proc_exit();
|
||||||
|
out_snmp_proc_init:
|
||||||
|
if (proc_net_sctp) {
|
||||||
|
proc_net_sctp = NULL;
|
||||||
|
remove_proc_entry("sctp", init_net.proc_net);
|
||||||
|
}
|
||||||
out_nomem:
|
out_nomem:
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue