提交 caea902f 编写于 作者: D David S. Miller

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
...@@ -1542,7 +1542,8 @@ he_start(struct atm_dev *dev) ...@@ -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) ...@@ -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) ...@@ -2844,10 +2846,15 @@ he_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg)
if (copy_from_user(&reg, arg, if (copy_from_user(&reg, 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 { ...@@ -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 ...@@ -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 ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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 { ...@@ -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,24 +795,49 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, ...@@ -795,24 +795,49 @@ 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;
ring->type = type;
ring->dev = dev;
ring->mmio_base = b43_dmacontroller_base(type, controller_index);
ring->index = controller_index;
if (type == B43_DMA_64BIT)
ring->ops = &dma64_ops;
else
ring->ops = &dma32_ops;
if (for_tx) { if (for_tx) {
ring->txhdr_cache = kcalloc(nr_slots, ring->tx = 1;
ring->current_slot = -1;
} else {
if (ring->index == 0) {
ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE;
ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET;
} else if (ring->index == 3) {
ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE;
ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET;
} else
B43_WARN_ON(1);
}
spin_lock_init(&ring->lock);
#ifdef CONFIG_B43_DEBUG
ring->last_injected_overflow = jiffies;
#endif
if (for_tx) {
ring->txhdr_cache = kcalloc(ring->nr_slots,
b43_txhdr_size(dev), b43_txhdr_size(dev),
GFP_KERNEL); GFP_KERNEL);
if (!ring->txhdr_cache) if (!ring->txhdr_cache)
...@@ -828,7 +853,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, ...@@ -828,7 +853,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
b43_txhdr_size(dev), 1)) { b43_txhdr_size(dev), 1)) {
/* ugh realloc */ /* ugh realloc */
kfree(ring->txhdr_cache); kfree(ring->txhdr_cache);
ring->txhdr_cache = kcalloc(nr_slots, ring->txhdr_cache = kcalloc(ring->nr_slots,
b43_txhdr_size(dev), b43_txhdr_size(dev),
GFP_KERNEL | GFP_DMA); GFP_KERNEL | GFP_DMA);
if (!ring->txhdr_cache) if (!ring->txhdr_cache)
...@@ -853,32 +878,6 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, ...@@ -853,32 +878,6 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
DMA_TO_DEVICE); DMA_TO_DEVICE);
} }
ring->dev = dev;
ring->nr_slots = nr_slots;
ring->mmio_base = b43_dmacontroller_base(type, controller_index);
ring->index = controller_index;
if (type == B43_DMA_64BIT)
ring->ops = &dma64_ops;
else
ring->ops = &dma32_ops;
if (for_tx) {
ring->tx = 1;
ring->current_slot = -1;
} else {
if (ring->index == 0) {
ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE;
ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET;
} else if (ring->index == 3) {
ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE;
ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET;
} else
B43_WARN_ON(1);
}
spin_lock_init(&ring->lock);
#ifdef CONFIG_B43_DEBUG
ring->last_injected_overflow = jiffies;
#endif
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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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[] = { ...@@ -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); ...@@ -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 { ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册