mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-14 04:41:26 +00:00
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: (23 commits) net: fix tiny output corruption of /proc/net/snmp6 atl2: don't request irq on resume if netif running ipv6: use seq_release_private for ip6mr.c /proc entries pkt_sched: fix missing check for packet overrun in qdisc_dump_stab() smc911x: Fix printf format typo in smc911x driver. asix: Fix asix-based cards connecting to 10/100Mbs LAN. mv643xx_eth: fix recycle check bound mv643xx_eth: fix the order of mdiobus_{unregister, free}() calls sh: sh_eth: Update to change of mii_bus TPROXY: supply a struct flowi->flags argument in inet_sk_rebuild_header() TPROXY: fill struct flowi->flags in udp_sendmsg() net: ipg.c fix bracing on endian swapping phylib: Fix auto-negotiation restart avoidance net: jme.c rxdesc.flags is __le16, other missing endian swaps phylib: fix phy name example in documentation net: Do not fire linkwatch events until the device is registered. phonet: fix compilation with gcc-3.4 ixgbe: fix compilation with gcc-3.4 pktgen: fix multiple queue warning net: fix ip_mr_init() error path ...
This commit is contained in:
commit
4dd61d92d7
@ -96,7 +96,7 @@ Letting the PHY Abstraction Layer do Everything
|
|||||||
static void adjust_link(struct net_device *dev);
|
static void adjust_link(struct net_device *dev);
|
||||||
|
|
||||||
Next, you need to know the device name of the PHY connected to this device.
|
Next, you need to know the device name of the PHY connected to this device.
|
||||||
The name will look something like, "phy0:0", where the first number is the
|
The name will look something like, "0:00", where the first number is the
|
||||||
bus id, and the second is the PHY's address on that bus. Typically,
|
bus id, and the second is the PHY's address on that bus. Typically,
|
||||||
the bus is responsible for making its ID unique.
|
the bus is responsible for making its ID unique.
|
||||||
|
|
||||||
|
@ -1690,9 +1690,11 @@ static int atl2_resume(struct pci_dev *pdev)
|
|||||||
|
|
||||||
ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0);
|
ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0);
|
||||||
|
|
||||||
err = atl2_request_irq(adapter);
|
if (netif_running(netdev)) {
|
||||||
if (netif_running(netdev) && err)
|
err = atl2_request_irq(adapter);
|
||||||
return err;
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
atl2_reset_hw(&adapter->hw);
|
atl2_reset_hw(&adapter->hw);
|
||||||
|
|
||||||
|
@ -1112,7 +1112,7 @@ static void ipg_nic_rx_free_skb(struct net_device *dev)
|
|||||||
struct ipg_rx *rxfd = sp->rxd + entry;
|
struct ipg_rx *rxfd = sp->rxd + entry;
|
||||||
|
|
||||||
pci_unmap_single(sp->pdev,
|
pci_unmap_single(sp->pdev,
|
||||||
le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN),
|
le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN,
|
||||||
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
||||||
dev_kfree_skb_irq(sp->rx_buff[entry]);
|
dev_kfree_skb_irq(sp->rx_buff[entry]);
|
||||||
sp->rx_buff[entry] = NULL;
|
sp->rx_buff[entry] = NULL;
|
||||||
@ -1179,7 +1179,7 @@ static int ipg_nic_rx_check_error(struct net_device *dev)
|
|||||||
*/
|
*/
|
||||||
if (sp->rx_buff[entry]) {
|
if (sp->rx_buff[entry]) {
|
||||||
pci_unmap_single(sp->pdev,
|
pci_unmap_single(sp->pdev,
|
||||||
le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN),
|
le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN,
|
||||||
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
||||||
|
|
||||||
dev_kfree_skb_irq(sp->rx_buff[entry]);
|
dev_kfree_skb_irq(sp->rx_buff[entry]);
|
||||||
@ -1246,7 +1246,7 @@ static void ipg_nic_rx_with_start(struct net_device *dev,
|
|||||||
if (jumbo->found_start)
|
if (jumbo->found_start)
|
||||||
dev_kfree_skb_irq(jumbo->skb);
|
dev_kfree_skb_irq(jumbo->skb);
|
||||||
|
|
||||||
pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN),
|
pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN,
|
||||||
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
||||||
|
|
||||||
skb_put(skb, sp->rxfrag_size);
|
skb_put(skb, sp->rxfrag_size);
|
||||||
@ -1349,7 +1349,7 @@ static int ipg_nic_rx_jumbo(struct net_device *dev)
|
|||||||
unsigned int entry = curr % IPG_RFDLIST_LENGTH;
|
unsigned int entry = curr % IPG_RFDLIST_LENGTH;
|
||||||
struct ipg_rx *rxfd = sp->rxd + entry;
|
struct ipg_rx *rxfd = sp->rxd + entry;
|
||||||
|
|
||||||
if (!(rxfd->rfs & le64_to_cpu(IPG_RFS_RFDDONE)))
|
if (!(rxfd->rfs & cpu_to_le64(IPG_RFS_RFDDONE)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (ipg_nic_rx_check_frame_type(dev)) {
|
switch (ipg_nic_rx_check_frame_type(dev)) {
|
||||||
|
@ -1287,7 +1287,34 @@ static void ixgbe_set_itr(struct ixgbe_adapter *adapter)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter);
|
/**
|
||||||
|
* ixgbe_irq_disable - Mask off interrupt generation on the NIC
|
||||||
|
* @adapter: board private structure
|
||||||
|
**/
|
||||||
|
static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter)
|
||||||
|
{
|
||||||
|
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
|
||||||
|
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||||
|
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < adapter->num_msix_vectors; i++)
|
||||||
|
synchronize_irq(adapter->msix_entries[i].vector);
|
||||||
|
} else {
|
||||||
|
synchronize_irq(adapter->pdev->irq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ixgbe_irq_enable - Enable default interrupt generation settings
|
||||||
|
* @adapter: board private structure
|
||||||
|
**/
|
||||||
|
static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter)
|
||||||
|
{
|
||||||
|
u32 mask;
|
||||||
|
mask = IXGBE_EIMS_ENABLE_MASK;
|
||||||
|
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask);
|
||||||
|
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ixgbe_intr - legacy mode Interrupt Handler
|
* ixgbe_intr - legacy mode Interrupt Handler
|
||||||
@ -1393,35 +1420,6 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* ixgbe_irq_disable - Mask off interrupt generation on the NIC
|
|
||||||
* @adapter: board private structure
|
|
||||||
**/
|
|
||||||
static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter)
|
|
||||||
{
|
|
||||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
|
|
||||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
|
||||||
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < adapter->num_msix_vectors; i++)
|
|
||||||
synchronize_irq(adapter->msix_entries[i].vector);
|
|
||||||
} else {
|
|
||||||
synchronize_irq(adapter->pdev->irq);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ixgbe_irq_enable - Enable default interrupt generation settings
|
|
||||||
* @adapter: board private structure
|
|
||||||
**/
|
|
||||||
static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter)
|
|
||||||
{
|
|
||||||
u32 mask;
|
|
||||||
mask = IXGBE_EIMS_ENABLE_MASK;
|
|
||||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask);
|
|
||||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts
|
* ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts
|
||||||
*
|
*
|
||||||
|
@ -912,23 +912,23 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx)
|
|||||||
skb_put(skb, framesize);
|
skb_put(skb, framesize);
|
||||||
skb->protocol = eth_type_trans(skb, jme->dev);
|
skb->protocol = eth_type_trans(skb, jme->dev);
|
||||||
|
|
||||||
if (jme_rxsum_ok(jme, rxdesc->descwb.flags))
|
if (jme_rxsum_ok(jme, le16_to_cpu(rxdesc->descwb.flags)))
|
||||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||||
else
|
else
|
||||||
skb->ip_summed = CHECKSUM_NONE;
|
skb->ip_summed = CHECKSUM_NONE;
|
||||||
|
|
||||||
if (rxdesc->descwb.flags & RXWBFLAG_TAGON) {
|
if (rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_TAGON)) {
|
||||||
if (jme->vlgrp) {
|
if (jme->vlgrp) {
|
||||||
jme->jme_vlan_rx(skb, jme->vlgrp,
|
jme->jme_vlan_rx(skb, jme->vlgrp,
|
||||||
le32_to_cpu(rxdesc->descwb.vlan));
|
le16_to_cpu(rxdesc->descwb.vlan));
|
||||||
NET_STAT(jme).rx_bytes += 4;
|
NET_STAT(jme).rx_bytes += 4;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
jme->jme_rx(skb);
|
jme->jme_rx(skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((le16_to_cpu(rxdesc->descwb.flags) & RXWBFLAG_DEST) ==
|
if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_DEST)) ==
|
||||||
RXWBFLAG_DEST_MUL)
|
cpu_to_le16(RXWBFLAG_DEST_MUL))
|
||||||
++(NET_STAT(jme).multicast);
|
++(NET_STAT(jme).multicast);
|
||||||
|
|
||||||
jme->dev->last_rx = jiffies;
|
jme->dev->last_rx = jiffies;
|
||||||
@ -961,7 +961,7 @@ jme_process_receive(struct jme_adapter *jme, int limit)
|
|||||||
rxdesc = rxring->desc;
|
rxdesc = rxring->desc;
|
||||||
rxdesc += i;
|
rxdesc += i;
|
||||||
|
|
||||||
if ((rxdesc->descwb.flags & RXWBFLAG_OWN) ||
|
if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) ||
|
||||||
!(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL))
|
!(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -1763,10 +1763,9 @@ jme_expand_header(struct jme_adapter *jme, struct sk_buff *skb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
jme_tx_tso(struct sk_buff *skb,
|
jme_tx_tso(struct sk_buff *skb, __le16 *mss, u8 *flags)
|
||||||
u16 *mss, u8 *flags)
|
|
||||||
{
|
{
|
||||||
*mss = skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT;
|
*mss = cpu_to_le16(skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT);
|
||||||
if (*mss) {
|
if (*mss) {
|
||||||
*flags |= TXFLAG_LSEN;
|
*flags |= TXFLAG_LSEN;
|
||||||
|
|
||||||
@ -1826,11 +1825,11 @@ jme_tx_csum(struct jme_adapter *jme, struct sk_buff *skb, u8 *flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
jme_tx_vlan(struct sk_buff *skb, u16 *vlan, u8 *flags)
|
jme_tx_vlan(struct sk_buff *skb, __le16 *vlan, u8 *flags)
|
||||||
{
|
{
|
||||||
if (vlan_tx_tag_present(skb)) {
|
if (vlan_tx_tag_present(skb)) {
|
||||||
*flags |= TXFLAG_TAGON;
|
*flags |= TXFLAG_TAGON;
|
||||||
*vlan = vlan_tx_tag_get(skb);
|
*vlan = cpu_to_le16(vlan_tx_tag_get(skb));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -899,7 +899,8 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
|
|||||||
if (skb != NULL) {
|
if (skb != NULL) {
|
||||||
if (skb_queue_len(&mp->rx_recycle) <
|
if (skb_queue_len(&mp->rx_recycle) <
|
||||||
mp->default_rx_ring_size &&
|
mp->default_rx_ring_size &&
|
||||||
skb_recycle_check(skb, mp->skb_size))
|
skb_recycle_check(skb, mp->skb_size +
|
||||||
|
dma_get_cache_alignment() - 1))
|
||||||
__skb_queue_head(&mp->rx_recycle, skb);
|
__skb_queue_head(&mp->rx_recycle, skb);
|
||||||
else
|
else
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
@ -2435,8 +2436,8 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev)
|
|||||||
struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data;
|
struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data;
|
||||||
|
|
||||||
if (pd == NULL || pd->shared_smi == NULL) {
|
if (pd == NULL || pd->shared_smi == NULL) {
|
||||||
mdiobus_free(msp->smi_bus);
|
|
||||||
mdiobus_unregister(msp->smi_bus);
|
mdiobus_unregister(msp->smi_bus);
|
||||||
|
mdiobus_free(msp->smi_bus);
|
||||||
}
|
}
|
||||||
if (msp->err_interrupt != NO_IRQ)
|
if (msp->err_interrupt != NO_IRQ)
|
||||||
free_irq(msp->err_interrupt, msp);
|
free_irq(msp->err_interrupt, msp);
|
||||||
|
@ -564,20 +564,32 @@ EXPORT_SYMBOL(genphy_restart_aneg);
|
|||||||
*/
|
*/
|
||||||
int genphy_config_aneg(struct phy_device *phydev)
|
int genphy_config_aneg(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result;
|
||||||
|
|
||||||
if (AUTONEG_ENABLE == phydev->autoneg) {
|
if (AUTONEG_ENABLE != phydev->autoneg)
|
||||||
int result = genphy_config_advert(phydev);
|
return genphy_setup_forced(phydev);
|
||||||
|
|
||||||
if (result < 0) /* error */
|
result = genphy_config_advert(phydev);
|
||||||
return result;
|
|
||||||
|
|
||||||
/* Only restart aneg if we are advertising something different
|
if (result < 0) /* error */
|
||||||
* than we were before. */
|
return result;
|
||||||
if (result > 0)
|
|
||||||
result = genphy_restart_aneg(phydev);
|
if (result == 0) {
|
||||||
} else
|
/* Advertisment hasn't changed, but maybe aneg was never on to
|
||||||
result = genphy_setup_forced(phydev);
|
* begin with? Or maybe phy was isolated? */
|
||||||
|
int ctl = phy_read(phydev, MII_BMCR);
|
||||||
|
|
||||||
|
if (ctl < 0)
|
||||||
|
return ctl;
|
||||||
|
|
||||||
|
if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
|
||||||
|
result = 1; /* do restart aneg */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only restart aneg if we are advertising something different
|
||||||
|
* than we were before. */
|
||||||
|
if (result > 0)
|
||||||
|
result = genphy_restart_aneg(phydev);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -927,7 +927,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
|||||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||||
struct sh_eth_txdesc *txdesc;
|
struct sh_eth_txdesc *txdesc;
|
||||||
u32 entry;
|
u32 entry;
|
||||||
int flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&mdp->lock, flags);
|
spin_lock_irqsave(&mdp->lock, flags);
|
||||||
if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) {
|
if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) {
|
||||||
@ -1141,7 +1141,7 @@ static int sh_mdio_init(struct net_device *ndev, int id)
|
|||||||
/* Hook up MII support for ethtool */
|
/* Hook up MII support for ethtool */
|
||||||
mdp->mii_bus->name = "sh_mii";
|
mdp->mii_bus->name = "sh_mii";
|
||||||
mdp->mii_bus->parent = &ndev->dev;
|
mdp->mii_bus->parent = &ndev->dev;
|
||||||
mdp->mii_bus->id[0] = id;
|
snprintf(mdp->mii_bus->id, MII_BUS_ID_SIZE, "%x", id);
|
||||||
|
|
||||||
/* PHY IRQ */
|
/* PHY IRQ */
|
||||||
mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
|
mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
|
||||||
|
@ -1813,7 +1813,7 @@ static int __init smc911x_probe(struct net_device *dev)
|
|||||||
val = SMC_GET_BYTE_TEST(lp);
|
val = SMC_GET_BYTE_TEST(lp);
|
||||||
DBG(SMC_DEBUG_MISC, "%s: endian probe returned 0x%04x\n", CARDNAME, val);
|
DBG(SMC_DEBUG_MISC, "%s: endian probe returned 0x%04x\n", CARDNAME, val);
|
||||||
if (val != 0x87654321) {
|
if (val != 0x87654321) {
|
||||||
printk(KERN_ERR "Invalid chip endian 0x08%x\n",val);
|
printk(KERN_ERR "Invalid chip endian 0x%08x\n",val);
|
||||||
retval = -ENODEV;
|
retval = -ENODEV;
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
@ -1102,12 +1102,14 @@ static int ax88178_link_reset(struct usbnet *dev)
|
|||||||
mode = AX88178_MEDIUM_DEFAULT;
|
mode = AX88178_MEDIUM_DEFAULT;
|
||||||
|
|
||||||
if (ecmd.speed == SPEED_1000)
|
if (ecmd.speed == SPEED_1000)
|
||||||
mode |= AX_MEDIUM_GM | AX_MEDIUM_ENCK;
|
mode |= AX_MEDIUM_GM;
|
||||||
else if (ecmd.speed == SPEED_100)
|
else if (ecmd.speed == SPEED_100)
|
||||||
mode |= AX_MEDIUM_PS;
|
mode |= AX_MEDIUM_PS;
|
||||||
else
|
else
|
||||||
mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM);
|
mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM);
|
||||||
|
|
||||||
|
mode |= AX_MEDIUM_ENCK;
|
||||||
|
|
||||||
if (ecmd.duplex == DUPLEX_FULL)
|
if (ecmd.duplex == DUPLEX_FULL)
|
||||||
mode |= AX_MEDIUM_FD;
|
mode |= AX_MEDIUM_FD;
|
||||||
else
|
else
|
||||||
|
@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv)
|
|||||||
|
|
||||||
rxq->queue[i] = NULL;
|
rxq->queue[i] = NULL;
|
||||||
|
|
||||||
pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr,
|
pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr,
|
||||||
priv->hw_params.rx_buf_size,
|
priv->hw_params.rx_buf_size,
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
pkt = (struct iwl_rx_packet *)rxb->skb->data;
|
pkt = (struct iwl_rx_packet *)rxb->skb->data;
|
||||||
@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv)
|
|||||||
rxb->skb = NULL;
|
rxb->skb = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_unmap_single(priv->pci_dev, rxb->dma_addr,
|
pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
|
||||||
priv->hw_params.rx_buf_size,
|
priv->hw_params.rx_buf_size + 256,
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
spin_lock_irqsave(&rxq->lock, flags);
|
spin_lock_irqsave(&rxq->lock, flags);
|
||||||
list_add_tail(&rxb->list, &priv->rxq.rx_used);
|
list_add_tail(&rxb->list, &priv->rxq.rx_used);
|
||||||
@ -2341,7 +2341,6 @@ static void iwl_bg_alive_start(struct work_struct *data)
|
|||||||
mutex_lock(&priv->mutex);
|
mutex_lock(&priv->mutex);
|
||||||
iwl_alive_start(priv);
|
iwl_alive_start(priv);
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iwl4965_bg_rf_kill(struct work_struct *work)
|
static void iwl4965_bg_rf_kill(struct work_struct *work)
|
||||||
|
@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg;
|
|||||||
#define DEFAULT_LONG_RETRY_LIMIT 4U
|
#define DEFAULT_LONG_RETRY_LIMIT 4U
|
||||||
|
|
||||||
struct iwl_rx_mem_buffer {
|
struct iwl_rx_mem_buffer {
|
||||||
dma_addr_t dma_addr;
|
dma_addr_t real_dma_addr;
|
||||||
|
dma_addr_t aligned_dma_addr;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
};
|
};
|
||||||
|
@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv)
|
|||||||
list_del(element);
|
list_del(element);
|
||||||
|
|
||||||
/* Point to Rx buffer via next RBD in circular buffer */
|
/* Point to Rx buffer via next RBD in circular buffer */
|
||||||
rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr);
|
rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr);
|
||||||
rxq->queue[rxq->write] = rxb;
|
rxq->queue[rxq->write] = rxb;
|
||||||
rxq->write = (rxq->write + 1) & RX_QUEUE_MASK;
|
rxq->write = (rxq->write + 1) & RX_QUEUE_MASK;
|
||||||
rxq->free_count--;
|
rxq->free_count--;
|
||||||
@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv)
|
|||||||
rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
|
rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
|
||||||
|
|
||||||
/* Alloc a new receive buffer */
|
/* Alloc a new receive buffer */
|
||||||
rxb->skb = alloc_skb(priv->hw_params.rx_buf_size,
|
rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
|
||||||
__GFP_NOWARN | GFP_ATOMIC);
|
__GFP_NOWARN | GFP_ATOMIC);
|
||||||
if (!rxb->skb) {
|
if (!rxb->skb) {
|
||||||
if (net_ratelimit())
|
if (net_ratelimit())
|
||||||
@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv)
|
|||||||
list_del(element);
|
list_del(element);
|
||||||
|
|
||||||
/* Get physical address of RB/SKB */
|
/* Get physical address of RB/SKB */
|
||||||
rxb->dma_addr =
|
rxb->real_dma_addr = pci_map_single(
|
||||||
pci_map_single(priv->pci_dev, rxb->skb->data,
|
priv->pci_dev,
|
||||||
priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE);
|
rxb->skb->data,
|
||||||
|
priv->hw_params.rx_buf_size + 256,
|
||||||
|
PCI_DMA_FROMDEVICE);
|
||||||
|
/* dma address must be no more than 36 bits */
|
||||||
|
BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36));
|
||||||
|
/* and also 256 byte aligned! */
|
||||||
|
rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256);
|
||||||
|
skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr);
|
||||||
|
|
||||||
list_add_tail(&rxb->list, &rxq->rx_free);
|
list_add_tail(&rxb->list, &rxq->rx_free);
|
||||||
rxq->free_count++;
|
rxq->free_count++;
|
||||||
}
|
}
|
||||||
@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
|
|||||||
for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
|
for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
|
||||||
if (rxq->pool[i].skb != NULL) {
|
if (rxq->pool[i].skb != NULL) {
|
||||||
pci_unmap_single(priv->pci_dev,
|
pci_unmap_single(priv->pci_dev,
|
||||||
rxq->pool[i].dma_addr,
|
rxq->pool[i].real_dma_addr,
|
||||||
priv->hw_params.rx_buf_size,
|
priv->hw_params.rx_buf_size + 256,
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
dev_kfree_skb(rxq->pool[i].skb);
|
dev_kfree_skb(rxq->pool[i].skb);
|
||||||
}
|
}
|
||||||
@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
|
|||||||
* to an SKB, so we need to unmap and free potential storage */
|
* to an SKB, so we need to unmap and free potential storage */
|
||||||
if (rxq->pool[i].skb != NULL) {
|
if (rxq->pool[i].skb != NULL) {
|
||||||
pci_unmap_single(priv->pci_dev,
|
pci_unmap_single(priv->pci_dev,
|
||||||
rxq->pool[i].dma_addr,
|
rxq->pool[i].real_dma_addr,
|
||||||
priv->hw_params.rx_buf_size,
|
priv->hw_params.rx_buf_size + 256,
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
priv->alloc_rxb_skb--;
|
priv->alloc_rxb_skb--;
|
||||||
dev_kfree_skb(rxq->pool[i].skb);
|
dev_kfree_skb(rxq->pool[i].skb);
|
||||||
|
@ -6012,7 +6012,6 @@ static void iwl3945_bg_alive_start(struct work_struct *data)
|
|||||||
mutex_lock(&priv->mutex);
|
mutex_lock(&priv->mutex);
|
||||||
iwl3945_alive_start(priv);
|
iwl3945_alive_start(priv);
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iwl3945_bg_rf_kill(struct work_struct *work)
|
static void iwl3945_bg_rf_kill(struct work_struct *work)
|
||||||
|
@ -331,7 +331,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
|
|||||||
/* Fill the receive configuration URB and initialise the Rx call back */
|
/* Fill the receive configuration URB and initialise the Rx call back */
|
||||||
usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
|
usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
|
||||||
usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
|
usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
|
||||||
(void *) (skb->tail),
|
skb_tail_pointer(skb),
|
||||||
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp);
|
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp);
|
||||||
|
|
||||||
cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
|
cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
|
||||||
|
@ -73,14 +73,6 @@
|
|||||||
* not do so then mac80211 may add this under certain circumstances.
|
* not do so then mac80211 may add this under certain circumstances.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* enum ieee80211_notification_type - Low level driver notification
|
|
||||||
* @IEEE80211_NOTIFY_RE_ASSOC: start the re-association sequence
|
|
||||||
*/
|
|
||||||
enum ieee80211_notification_types {
|
|
||||||
IEEE80211_NOTIFY_RE_ASSOC,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct ieee80211_ht_bss_info - describing BSS's HT characteristics
|
* struct ieee80211_ht_bss_info - describing BSS's HT characteristics
|
||||||
*
|
*
|
||||||
@ -1797,18 +1789,6 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid);
|
|||||||
void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
|
void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
|
||||||
u16 tid);
|
u16 tid);
|
||||||
|
|
||||||
/**
|
|
||||||
* ieee80211_notify_mac - low level driver notification
|
|
||||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
|
||||||
* @notif_type: enum ieee80211_notification_types
|
|
||||||
*
|
|
||||||
* This function must be called by low level driver to inform mac80211 of
|
|
||||||
* low level driver status change or force mac80211 to re-assoc for low
|
|
||||||
* level driver internal error that require re-assoc.
|
|
||||||
*/
|
|
||||||
void ieee80211_notify_mac(struct ieee80211_hw *hw,
|
|
||||||
enum ieee80211_notification_types notif_type);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ieee80211_find_sta - find a station
|
* ieee80211_find_sta - find a station
|
||||||
*
|
*
|
||||||
|
@ -1973,13 +1973,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
|
|||||||
|
|
||||||
/* make sure that we don't pick a non-existing transmit queue */
|
/* make sure that we don't pick a non-existing transmit queue */
|
||||||
ntxq = pkt_dev->odev->real_num_tx_queues;
|
ntxq = pkt_dev->odev->real_num_tx_queues;
|
||||||
if (ntxq > num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) {
|
|
||||||
printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU "
|
|
||||||
"disabled because CPU count (%d) exceeds number "
|
|
||||||
"of tx queues (%d) on %s\n", num_online_cpus(), ntxq,
|
|
||||||
pkt_dev->odev->name);
|
|
||||||
pkt_dev->flags &= ~F_QUEUE_MAP_CPU;
|
|
||||||
}
|
|
||||||
if (ntxq <= pkt_dev->queue_map_min) {
|
if (ntxq <= pkt_dev->queue_map_min) {
|
||||||
printk(KERN_WARNING "pktgen: WARNING: Requested "
|
printk(KERN_WARNING "pktgen: WARNING: Requested "
|
||||||
"queue_map_min (zero-based) (%d) exceeds valid range "
|
"queue_map_min (zero-based) (%d) exceeds valid range "
|
||||||
@ -2202,6 +2196,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev)
|
|||||||
}
|
}
|
||||||
pkt_dev->cur_queue_map = t;
|
pkt_dev->cur_queue_map = t;
|
||||||
}
|
}
|
||||||
|
pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Increment/randomize headers according to flags and current values
|
/* Increment/randomize headers according to flags and current values
|
||||||
|
@ -1117,6 +1117,7 @@ int inet_sk_rebuild_header(struct sock *sk)
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
.proto = sk->sk_protocol,
|
.proto = sk->sk_protocol,
|
||||||
|
.flags = inet_sk_flowi_flags(sk),
|
||||||
.uli_u = {
|
.uli_u = {
|
||||||
.ports = {
|
.ports = {
|
||||||
.sport = inet->sport,
|
.sport = inet->sport,
|
||||||
|
@ -1945,13 +1945,14 @@ int __init ip_mr_init(void)
|
|||||||
goto proc_cache_fail;
|
goto proc_cache_fail;
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
reg_notif_fail:
|
|
||||||
kmem_cache_destroy(mrt_cachep);
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
proc_vif_fail:
|
|
||||||
unregister_netdevice_notifier(&ip_mr_notifier);
|
|
||||||
proc_cache_fail:
|
proc_cache_fail:
|
||||||
proc_net_remove(&init_net, "ip_mr_vif");
|
proc_net_remove(&init_net, "ip_mr_vif");
|
||||||
|
proc_vif_fail:
|
||||||
|
unregister_netdevice_notifier(&ip_mr_notifier);
|
||||||
#endif
|
#endif
|
||||||
|
reg_notif_fail:
|
||||||
|
del_timer(&ipmr_expire_timer);
|
||||||
|
kmem_cache_destroy(mrt_cachep);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -633,6 +633,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|||||||
.saddr = saddr,
|
.saddr = saddr,
|
||||||
.tos = tos } },
|
.tos = tos } },
|
||||||
.proto = sk->sk_protocol,
|
.proto = sk->sk_protocol,
|
||||||
|
.flags = inet_sk_flowi_flags(sk),
|
||||||
.uli_u = { .ports =
|
.uli_u = { .ports =
|
||||||
{ .sport = inet->sport,
|
{ .sport = inet->sport,
|
||||||
.dport = dport } } };
|
.dport = dport } } };
|
||||||
|
@ -224,7 +224,7 @@ static struct file_operations ip6mr_vif_fops = {
|
|||||||
.open = ip6mr_vif_open,
|
.open = ip6mr_vif_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = seq_release,
|
.release = seq_release_private,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos)
|
static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos)
|
||||||
@ -338,7 +338,7 @@ static struct file_operations ip6mr_mfc_fops = {
|
|||||||
.open = ipmr_mfc_open,
|
.open = ipmr_mfc_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = seq_release,
|
.release = seq_release_private,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ static struct snmp_mib snmp6_udplite6_list[] = {
|
|||||||
|
|
||||||
static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
|
static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
|
||||||
{
|
{
|
||||||
static char name[32];
|
char name[32];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* print by name -- deprecated items */
|
/* print by name -- deprecated items */
|
||||||
@ -144,7 +144,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
|
|||||||
p = icmp6type2name[icmptype];
|
p = icmp6type2name[icmptype];
|
||||||
if (!p) /* don't print un-named types here */
|
if (!p) /* don't print un-named types here */
|
||||||
continue;
|
continue;
|
||||||
(void) snprintf(name, sizeof(name)-1, "Icmp6%s%s",
|
snprintf(name, sizeof(name), "Icmp6%s%s",
|
||||||
i & 0x100 ? "Out" : "In", p);
|
i & 0x100 ? "Out" : "In", p);
|
||||||
seq_printf(seq, "%-32s\t%lu\n", name,
|
seq_printf(seq, "%-32s\t%lu\n", name,
|
||||||
snmp_fold_field(mib, i));
|
snmp_fold_field(mib, i));
|
||||||
@ -157,7 +157,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
|
|||||||
val = snmp_fold_field(mib, i);
|
val = snmp_fold_field(mib, i);
|
||||||
if (!val)
|
if (!val)
|
||||||
continue;
|
continue;
|
||||||
(void) snprintf(name, sizeof(name)-1, "Icmp6%sType%u",
|
snprintf(name, sizeof(name), "Icmp6%sType%u",
|
||||||
i & 0x100 ? "Out" : "In", i & 0xff);
|
i & 0x100 ? "Out" : "In", i & 0xff);
|
||||||
seq_printf(seq, "%-32s\t%lu\n", name, val);
|
seq_printf(seq, "%-32s\t%lu\n", name, val);
|
||||||
}
|
}
|
||||||
|
@ -2560,25 +2560,3 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local)
|
|||||||
ieee80211_restart_sta_timer(sdata);
|
ieee80211_restart_sta_timer(sdata);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* driver notification call */
|
|
||||||
void ieee80211_notify_mac(struct ieee80211_hw *hw,
|
|
||||||
enum ieee80211_notification_types notif_type)
|
|
||||||
{
|
|
||||||
struct ieee80211_local *local = hw_to_local(hw);
|
|
||||||
struct ieee80211_sub_if_data *sdata;
|
|
||||||
|
|
||||||
switch (notif_type) {
|
|
||||||
case IEEE80211_NOTIFY_RE_ASSOC:
|
|
||||||
rtnl_lock();
|
|
||||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
|
||||||
if (sdata->vif.type != NL80211_IFTYPE_STATION)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ieee80211_sta_req_auth(sdata, &sdata->u.sta);
|
|
||||||
}
|
|
||||||
rtnl_unlock();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(ieee80211_notify_mac);
|
|
||||||
|
@ -33,9 +33,30 @@
|
|||||||
#include <net/phonet/phonet.h>
|
#include <net/phonet/phonet.h>
|
||||||
#include <net/phonet/pn_dev.h>
|
#include <net/phonet/pn_dev.h>
|
||||||
|
|
||||||
static struct net_proto_family phonet_proto_family;
|
/* Transport protocol registration */
|
||||||
static struct phonet_protocol *phonet_proto_get(int protocol);
|
static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly;
|
||||||
static inline void phonet_proto_put(struct phonet_protocol *pp);
|
static DEFINE_SPINLOCK(proto_tab_lock);
|
||||||
|
|
||||||
|
static struct phonet_protocol *phonet_proto_get(int protocol)
|
||||||
|
{
|
||||||
|
struct phonet_protocol *pp;
|
||||||
|
|
||||||
|
if (protocol >= PHONET_NPROTO)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
spin_lock(&proto_tab_lock);
|
||||||
|
pp = proto_tab[protocol];
|
||||||
|
if (pp && !try_module_get(pp->prot->owner))
|
||||||
|
pp = NULL;
|
||||||
|
spin_unlock(&proto_tab_lock);
|
||||||
|
|
||||||
|
return pp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void phonet_proto_put(struct phonet_protocol *pp)
|
||||||
|
{
|
||||||
|
module_put(pp->prot->owner);
|
||||||
|
}
|
||||||
|
|
||||||
/* protocol family functions */
|
/* protocol family functions */
|
||||||
|
|
||||||
@ -375,10 +396,6 @@ static struct packet_type phonet_packet_type = {
|
|||||||
.func = phonet_rcv,
|
.func = phonet_rcv,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Transport protocol registration */
|
|
||||||
static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly;
|
|
||||||
static DEFINE_SPINLOCK(proto_tab_lock);
|
|
||||||
|
|
||||||
int __init_or_module phonet_proto_register(int protocol,
|
int __init_or_module phonet_proto_register(int protocol,
|
||||||
struct phonet_protocol *pp)
|
struct phonet_protocol *pp)
|
||||||
{
|
{
|
||||||
@ -412,27 +429,6 @@ void phonet_proto_unregister(int protocol, struct phonet_protocol *pp)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(phonet_proto_unregister);
|
EXPORT_SYMBOL(phonet_proto_unregister);
|
||||||
|
|
||||||
static struct phonet_protocol *phonet_proto_get(int protocol)
|
|
||||||
{
|
|
||||||
struct phonet_protocol *pp;
|
|
||||||
|
|
||||||
if (protocol >= PHONET_NPROTO)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
spin_lock(&proto_tab_lock);
|
|
||||||
pp = proto_tab[protocol];
|
|
||||||
if (pp && !try_module_get(pp->prot->owner))
|
|
||||||
pp = NULL;
|
|
||||||
spin_unlock(&proto_tab_lock);
|
|
||||||
|
|
||||||
return pp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void phonet_proto_put(struct phonet_protocol *pp)
|
|
||||||
{
|
|
||||||
module_put(pp->prot->owner);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Module registration */
|
/* Module registration */
|
||||||
static int __init phonet_init(void)
|
static int __init phonet_init(void)
|
||||||
{
|
{
|
||||||
|
@ -417,6 +417,8 @@ static int qdisc_dump_stab(struct sk_buff *skb, struct qdisc_size_table *stab)
|
|||||||
struct nlattr *nest;
|
struct nlattr *nest;
|
||||||
|
|
||||||
nest = nla_nest_start(skb, TCA_STAB);
|
nest = nla_nest_start(skb, TCA_STAB);
|
||||||
|
if (nest == NULL)
|
||||||
|
goto nla_put_failure;
|
||||||
NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts);
|
NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts);
|
||||||
nla_nest_end(skb, nest);
|
nla_nest_end(skb, nest);
|
||||||
|
|
||||||
|
@ -270,6 +270,8 @@ static void dev_watchdog_down(struct net_device *dev)
|
|||||||
void netif_carrier_on(struct net_device *dev)
|
void netif_carrier_on(struct net_device *dev)
|
||||||
{
|
{
|
||||||
if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
|
if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
|
||||||
|
if (dev->reg_state == NETREG_UNINITIALIZED)
|
||||||
|
return;
|
||||||
linkwatch_fire_event(dev);
|
linkwatch_fire_event(dev);
|
||||||
if (netif_running(dev))
|
if (netif_running(dev))
|
||||||
__netdev_watchdog_up(dev);
|
__netdev_watchdog_up(dev);
|
||||||
@ -285,8 +287,11 @@ EXPORT_SYMBOL(netif_carrier_on);
|
|||||||
*/
|
*/
|
||||||
void netif_carrier_off(struct net_device *dev)
|
void netif_carrier_off(struct net_device *dev)
|
||||||
{
|
{
|
||||||
if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state))
|
if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
|
||||||
|
if (dev->reg_state == NETREG_UNINITIALIZED)
|
||||||
|
return;
|
||||||
linkwatch_fire_event(dev);
|
linkwatch_fire_event(dev);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(netif_carrier_off);
|
EXPORT_SYMBOL(netif_carrier_off);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user