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: (37 commits) net: deinit automatic LIST_HEAD net: dont leave active on stack LIST_HEAD net: provide default_advmss() methods to blackhole dst_ops tg3: Restrict phy ioctl access drivers/net: Call netif_carrier_off at the end of the probe ixgbe: work around for DDP last buffer size ixgbe: fix panic due to uninitialised pointer e1000e: flush all writebacks before unload e1000e: check down flag in tasks isdn: hisax: Use l2headersize() instead of dup (and buggy) func. arp_notify: unconditionally send gratuitous ARP for NETDEV_NOTIFY_PEERS. cxgb4vf: Use defined Mailbox Timeout cxgb4vf: Quiesce Virtual Interfaces on shutdown ... cxgb4vf: Behave properly when CONFIG_DEBUG_FS isn't defined ... cxgb4vf: Check driver parameters in the right place ... pch_gbe: Fix the MAC Address load issue. iwlwifi: Delete iwl3945_good_plcp_health. net/can/softing: make CAN_SOFTING_CS depend on CAN_SOFTING netfilter: nf_iterate: fix incorrect RCU usage pch_gbe: Fix the issue that the receiving data is not normal. ...
This commit is contained in:
commit
4c3021da45
34 changed files with 328 additions and 202 deletions
|
@ -4,6 +4,8 @@ obj- := dummy.o
|
|||
# List of programs to build
|
||||
hostprogs-y := ifenslave
|
||||
|
||||
HOSTCFLAGS_ifenslave.o += -I$(objtree)/usr/include
|
||||
|
||||
# Tell kbuild to always build the programs
|
||||
always := $(hostprogs-y)
|
||||
|
||||
|
|
|
@ -866,8 +866,9 @@ static int popen(struct atm_vcc *vcc)
|
|||
}
|
||||
|
||||
skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
|
||||
if (!skb && net_ratelimit()) {
|
||||
dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
|
||||
if (!skb) {
|
||||
if (net_ratelimit())
|
||||
dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
header = (void *)skb_put(skb, sizeof(*header));
|
||||
|
|
|
@ -39,6 +39,8 @@ static struct usb_device_id ath3k_table[] = {
|
|||
/* Atheros AR3011 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0CF3, 0x3002) },
|
||||
|
||||
/* Atheros AR9285 Malbec with sflash firmware */
|
||||
{ USB_DEVICE(0x03F0, 0x311D) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
|
@ -102,6 +102,9 @@ static struct usb_device_id blacklist_table[] = {
|
|||
/* Atheros 3011 with sflash firmware */
|
||||
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Atheros AR9285 Malbec with sflash firmware */
|
||||
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Broadcom BCM2035 */
|
||||
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
|
|
@ -1247,10 +1247,10 @@ static void
|
|||
l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
|
||||
{
|
||||
struct PStack *st = fi->userdata;
|
||||
struct sk_buff *skb, *oskb;
|
||||
struct sk_buff *skb;
|
||||
struct Layer2 *l2 = &st->l2;
|
||||
u_char header[MAX_HEADER_LEN];
|
||||
int i;
|
||||
int i, hdr_space_needed;
|
||||
int unsigned p1;
|
||||
u_long flags;
|
||||
|
||||
|
@ -1261,6 +1261,16 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
|
|||
if (!skb)
|
||||
return;
|
||||
|
||||
hdr_space_needed = l2headersize(l2, 0);
|
||||
if (hdr_space_needed > skb_headroom(skb)) {
|
||||
struct sk_buff *orig_skb = skb;
|
||||
|
||||
skb = skb_realloc_headroom(skb, hdr_space_needed);
|
||||
if (!skb) {
|
||||
dev_kfree_skb(orig_skb);
|
||||
return;
|
||||
}
|
||||
}
|
||||
spin_lock_irqsave(&l2->lock, flags);
|
||||
if(test_bit(FLG_MOD128, &l2->flag))
|
||||
p1 = (l2->vs - l2->va) % 128;
|
||||
|
@ -1285,19 +1295,7 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
|
|||
l2->vs = (l2->vs + 1) % 8;
|
||||
}
|
||||
spin_unlock_irqrestore(&l2->lock, flags);
|
||||
p1 = skb->data - skb->head;
|
||||
if (p1 >= i)
|
||||
memcpy(skb_push(skb, i), header, i);
|
||||
else {
|
||||
printk(KERN_WARNING
|
||||
"isdl2 pull_iqueue skb header(%d/%d) too short\n", i, p1);
|
||||
oskb = skb;
|
||||
skb = alloc_skb(oskb->len + i, GFP_ATOMIC);
|
||||
memcpy(skb_put(skb, i), header, i);
|
||||
skb_copy_from_linear_data(oskb,
|
||||
skb_put(skb, oskb->len), oskb->len);
|
||||
dev_kfree_skb(oskb);
|
||||
}
|
||||
memcpy(skb_push(skb, i), header, i);
|
||||
st->l2.l2l1(st, PH_PULL | INDICATION, skb);
|
||||
test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
|
||||
if (!test_and_set_bit(FLG_T200_RUN, &st->l2.flag)) {
|
||||
|
|
|
@ -18,7 +18,7 @@ config CAN_SOFTING
|
|||
config CAN_SOFTING_CS
|
||||
tristate "Softing Gmbh CAN pcmcia cards"
|
||||
depends on PCMCIA
|
||||
select CAN_SOFTING
|
||||
depends on CAN_SOFTING
|
||||
---help---
|
||||
Support for PCMCIA cards from Softing Gmbh & some cards
|
||||
from Vector Gmbh.
|
||||
|
|
|
@ -2040,7 +2040,7 @@ static int __devinit setup_debugfs(struct adapter *adapter)
|
|||
{
|
||||
int i;
|
||||
|
||||
BUG_ON(adapter->debugfs_root == NULL);
|
||||
BUG_ON(IS_ERR_OR_NULL(adapter->debugfs_root));
|
||||
|
||||
/*
|
||||
* Debugfs support is best effort.
|
||||
|
@ -2061,7 +2061,7 @@ static int __devinit setup_debugfs(struct adapter *adapter)
|
|||
*/
|
||||
static void cleanup_debugfs(struct adapter *adapter)
|
||||
{
|
||||
BUG_ON(adapter->debugfs_root == NULL);
|
||||
BUG_ON(IS_ERR_OR_NULL(adapter->debugfs_root));
|
||||
|
||||
/*
|
||||
* Unlike our sister routine cleanup_proc(), we don't need to remove
|
||||
|
@ -2488,17 +2488,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
|
|||
struct port_info *pi;
|
||||
struct net_device *netdev;
|
||||
|
||||
/*
|
||||
* Vet our module parameters.
|
||||
*/
|
||||
if (msi != MSI_MSIX && msi != MSI_MSI) {
|
||||
dev_err(&pdev->dev, "bad module parameter msi=%d; must be %d"
|
||||
" (MSI-X or MSI) or %d (MSI)\n", msi, MSI_MSIX,
|
||||
MSI_MSI);
|
||||
err = -EINVAL;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Print our driver banner the first time we're called to initialize a
|
||||
* device.
|
||||
|
@ -2711,11 +2700,11 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
|
|||
/*
|
||||
* Set up our debugfs entries.
|
||||
*/
|
||||
if (cxgb4vf_debugfs_root) {
|
||||
if (!IS_ERR_OR_NULL(cxgb4vf_debugfs_root)) {
|
||||
adapter->debugfs_root =
|
||||
debugfs_create_dir(pci_name(pdev),
|
||||
cxgb4vf_debugfs_root);
|
||||
if (adapter->debugfs_root == NULL)
|
||||
if (IS_ERR_OR_NULL(adapter->debugfs_root))
|
||||
dev_warn(&pdev->dev, "could not create debugfs"
|
||||
" directory");
|
||||
else
|
||||
|
@ -2770,7 +2759,7 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
|
|||
*/
|
||||
|
||||
err_free_debugfs:
|
||||
if (adapter->debugfs_root) {
|
||||
if (!IS_ERR_OR_NULL(adapter->debugfs_root)) {
|
||||
cleanup_debugfs(adapter);
|
||||
debugfs_remove_recursive(adapter->debugfs_root);
|
||||
}
|
||||
|
@ -2802,7 +2791,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
|
|||
err_disable_device:
|
||||
pci_disable_device(pdev);
|
||||
|
||||
err_out:
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -2840,7 +2828,7 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
|
|||
/*
|
||||
* Tear down our debugfs entries.
|
||||
*/
|
||||
if (adapter->debugfs_root) {
|
||||
if (!IS_ERR_OR_NULL(adapter->debugfs_root)) {
|
||||
cleanup_debugfs(adapter);
|
||||
debugfs_remove_recursive(adapter->debugfs_root);
|
||||
}
|
||||
|
@ -2873,6 +2861,46 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
|
|||
pci_release_regions(pdev);
|
||||
}
|
||||
|
||||
/*
|
||||
* "Shutdown" quiesce the device, stopping Ingress Packet and Interrupt
|
||||
* delivery.
|
||||
*/
|
||||
static void __devexit cxgb4vf_pci_shutdown(struct pci_dev *pdev)
|
||||
{
|
||||
struct adapter *adapter;
|
||||
int pidx;
|
||||
|
||||
adapter = pci_get_drvdata(pdev);
|
||||
if (!adapter)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Disable all Virtual Interfaces. This will shut down the
|
||||
* delivery of all ingress packets into the chip for these
|
||||
* Virtual Interfaces.
|
||||
*/
|
||||
for_each_port(adapter, pidx) {
|
||||
struct net_device *netdev;
|
||||
struct port_info *pi;
|
||||
|
||||
if (!test_bit(pidx, &adapter->registered_device_map))
|
||||
continue;
|
||||
|
||||
netdev = adapter->port[pidx];
|
||||
if (!netdev)
|
||||
continue;
|
||||
|
||||
pi = netdev_priv(netdev);
|
||||
t4vf_enable_vi(adapter, pi->viid, false, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Free up all Queues which will prevent further DMA and
|
||||
* Interrupts allowing various internal pathways to drain.
|
||||
*/
|
||||
t4vf_free_sge_resources(adapter);
|
||||
}
|
||||
|
||||
/*
|
||||
* PCI Device registration data structures.
|
||||
*/
|
||||
|
@ -2906,6 +2934,7 @@ static struct pci_driver cxgb4vf_driver = {
|
|||
.id_table = cxgb4vf_pci_tbl,
|
||||
.probe = cxgb4vf_pci_probe,
|
||||
.remove = __devexit_p(cxgb4vf_pci_remove),
|
||||
.shutdown = __devexit_p(cxgb4vf_pci_shutdown),
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -2915,14 +2944,25 @@ static int __init cxgb4vf_module_init(void)
|
|||
{
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Vet our module parameters.
|
||||
*/
|
||||
if (msi != MSI_MSIX && msi != MSI_MSI) {
|
||||
printk(KERN_WARNING KBUILD_MODNAME
|
||||
": bad module parameter msi=%d; must be %d"
|
||||
" (MSI-X or MSI) or %d (MSI)\n",
|
||||
msi, MSI_MSIX, MSI_MSI);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Debugfs support is optional, just warn if this fails */
|
||||
cxgb4vf_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL);
|
||||
if (!cxgb4vf_debugfs_root)
|
||||
if (IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
|
||||
printk(KERN_WARNING KBUILD_MODNAME ": could not create"
|
||||
" debugfs entry, continuing\n");
|
||||
|
||||
ret = pci_register_driver(&cxgb4vf_driver);
|
||||
if (ret < 0)
|
||||
if (ret < 0 && !IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
|
||||
debugfs_remove(cxgb4vf_debugfs_root);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -171,7 +171,7 @@ int t4vf_wr_mbox_core(struct adapter *adapter, const void *cmd, int size,
|
|||
delay_idx = 0;
|
||||
ms = delay[0];
|
||||
|
||||
for (i = 0; i < 500; i += ms) {
|
||||
for (i = 0; i < FW_CMD_MAX_TIMEOUT; i += ms) {
|
||||
if (sleep_ok) {
|
||||
ms = delay[delay_idx];
|
||||
if (delay_idx < ARRAY_SIZE(delay) - 1)
|
||||
|
|
|
@ -937,6 +937,9 @@ static void e1000_print_hw_hang(struct work_struct *work)
|
|||
u16 phy_status, phy_1000t_status, phy_ext_status;
|
||||
u16 pci_status;
|
||||
|
||||
if (test_bit(__E1000_DOWN, &adapter->state))
|
||||
return;
|
||||
|
||||
e1e_rphy(hw, PHY_STATUS, &phy_status);
|
||||
e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
|
||||
e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
|
||||
|
@ -1506,6 +1509,9 @@ static void e1000e_downshift_workaround(struct work_struct *work)
|
|||
struct e1000_adapter *adapter = container_of(work,
|
||||
struct e1000_adapter, downshift_task);
|
||||
|
||||
if (test_bit(__E1000_DOWN, &adapter->state))
|
||||
return;
|
||||
|
||||
e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
|
||||
}
|
||||
|
||||
|
@ -3338,6 +3344,21 @@ int e1000e_up(struct e1000_adapter *adapter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
|
||||
{
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
|
||||
if (!(adapter->flags2 & FLAG2_DMA_BURST))
|
||||
return;
|
||||
|
||||
/* flush pending descriptor writebacks to memory */
|
||||
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
||||
ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
|
||||
|
||||
/* execute the writes immediately */
|
||||
e1e_flush();
|
||||
}
|
||||
|
||||
void e1000e_down(struct e1000_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
|
@ -3377,6 +3398,9 @@ void e1000e_down(struct e1000_adapter *adapter)
|
|||
|
||||
if (!pci_channel_offline(adapter->pdev))
|
||||
e1000e_reset(adapter);
|
||||
|
||||
e1000e_flush_descriptors(adapter);
|
||||
|
||||
e1000_clean_tx_ring(adapter);
|
||||
e1000_clean_rx_ring(adapter);
|
||||
|
||||
|
@ -3765,6 +3789,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
|
|||
{
|
||||
struct e1000_adapter *adapter = container_of(work,
|
||||
struct e1000_adapter, update_phy_task);
|
||||
|
||||
if (test_bit(__E1000_DOWN, &adapter->state))
|
||||
return;
|
||||
|
||||
e1000_get_phy_info(&adapter->hw);
|
||||
}
|
||||
|
||||
|
@ -3775,6 +3803,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
|
|||
static void e1000_update_phy_info(unsigned long data)
|
||||
{
|
||||
struct e1000_adapter *adapter = (struct e1000_adapter *) data;
|
||||
|
||||
if (test_bit(__E1000_DOWN, &adapter->state))
|
||||
return;
|
||||
|
||||
schedule_work(&adapter->update_phy_task);
|
||||
}
|
||||
|
||||
|
@ -4149,6 +4181,9 @@ static void e1000_watchdog_task(struct work_struct *work)
|
|||
u32 link, tctl;
|
||||
int tx_pending = 0;
|
||||
|
||||
if (test_bit(__E1000_DOWN, &adapter->state))
|
||||
return;
|
||||
|
||||
link = e1000e_has_link(adapter);
|
||||
if ((netif_carrier_ok(netdev)) && link) {
|
||||
/* Cancel scheduled suspend requests. */
|
||||
|
@ -4337,19 +4372,12 @@ static void e1000_watchdog_task(struct work_struct *work)
|
|||
else
|
||||
ew32(ICS, E1000_ICS_RXDMT0);
|
||||
|
||||
/* flush pending descriptors to memory before detecting Tx hang */
|
||||
e1000e_flush_descriptors(adapter);
|
||||
|
||||
/* Force detection of hung controller every watchdog period */
|
||||
adapter->detect_tx_hung = 1;
|
||||
|
||||
/* flush partial descriptors to memory before detecting Tx hang */
|
||||
if (adapter->flags2 & FLAG2_DMA_BURST) {
|
||||
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
||||
ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
|
||||
/*
|
||||
* no need to flush the writes because the timeout code does
|
||||
* an er32 first thing
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* With 82571 controllers, LAA may be overwritten due to controller
|
||||
* reset from the other port. Set the appropriate LAA in RAR[0]
|
||||
|
@ -4887,6 +4915,10 @@ static void e1000_reset_task(struct work_struct *work)
|
|||
struct e1000_adapter *adapter;
|
||||
adapter = container_of(work, struct e1000_adapter, reset_task);
|
||||
|
||||
/* don't run the task if already down */
|
||||
if (test_bit(__E1000_DOWN, &adapter->state))
|
||||
return;
|
||||
|
||||
if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
|
||||
(adapter->flags & FLAG_RX_RESTART_NOW))) {
|
||||
e1000e_dump(adapter);
|
||||
|
|
|
@ -5645,6 +5645,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
goto out_error;
|
||||
}
|
||||
|
||||
netif_carrier_off(dev);
|
||||
|
||||
dev_info(&pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, addr %pM\n",
|
||||
dev->name, np->phy_oui, np->phyaddr, dev->dev_addr);
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
|
|||
struct scatterlist *sg;
|
||||
unsigned int i, j, dmacount;
|
||||
unsigned int len;
|
||||
static const unsigned int bufflen = 4096;
|
||||
static const unsigned int bufflen = IXGBE_FCBUFF_MIN;
|
||||
unsigned int firstoff = 0;
|
||||
unsigned int lastsize;
|
||||
unsigned int thisoff = 0;
|
||||
|
@ -254,6 +254,24 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
|
|||
/* only the last buffer may have non-full bufflen */
|
||||
lastsize = thisoff + thislen;
|
||||
|
||||
/*
|
||||
* lastsize can not be buffer len.
|
||||
* If it is then adding another buffer with lastsize = 1.
|
||||
*/
|
||||
if (lastsize == bufflen) {
|
||||
if (j >= IXGBE_BUFFCNT_MAX) {
|
||||
e_err(drv, "xid=%x:%d,%d,%d:addr=%llx "
|
||||
"not enough user buffers. We need an extra "
|
||||
"buffer because lastsize is bufflen.\n",
|
||||
xid, i, j, dmacount, (u64)addr);
|
||||
goto out_noddp_free;
|
||||
}
|
||||
|
||||
ddp->udl[j] = (u64)(fcoe->extra_ddp_buffer_dma);
|
||||
j++;
|
||||
lastsize = 1;
|
||||
}
|
||||
|
||||
fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT);
|
||||
fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT);
|
||||
fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT);
|
||||
|
@ -532,6 +550,24 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
|
|||
e_err(drv, "failed to allocated FCoE DDP pool\n");
|
||||
|
||||
spin_lock_init(&fcoe->lock);
|
||||
|
||||
/* Extra buffer to be shared by all DDPs for HW work around */
|
||||
fcoe->extra_ddp_buffer = kmalloc(IXGBE_FCBUFF_MIN, GFP_ATOMIC);
|
||||
if (fcoe->extra_ddp_buffer == NULL) {
|
||||
e_err(drv, "failed to allocated extra DDP buffer\n");
|
||||
goto out_extra_ddp_buffer_alloc;
|
||||
}
|
||||
|
||||
fcoe->extra_ddp_buffer_dma =
|
||||
dma_map_single(&adapter->pdev->dev,
|
||||
fcoe->extra_ddp_buffer,
|
||||
IXGBE_FCBUFF_MIN,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(&adapter->pdev->dev,
|
||||
fcoe->extra_ddp_buffer_dma)) {
|
||||
e_err(drv, "failed to map extra DDP buffer\n");
|
||||
goto out_extra_ddp_buffer_dma;
|
||||
}
|
||||
}
|
||||
|
||||
/* Enable L2 eth type filter for FCoE */
|
||||
|
@ -581,6 +617,14 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return;
|
||||
|
||||
out_extra_ddp_buffer_dma:
|
||||
kfree(fcoe->extra_ddp_buffer);
|
||||
out_extra_ddp_buffer_alloc:
|
||||
pci_pool_destroy(fcoe->pool);
|
||||
fcoe->pool = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -600,6 +644,11 @@ void ixgbe_cleanup_fcoe(struct ixgbe_adapter *adapter)
|
|||
if (fcoe->pool) {
|
||||
for (i = 0; i < IXGBE_FCOE_DDP_MAX; i++)
|
||||
ixgbe_fcoe_ddp_put(adapter->netdev, i);
|
||||
dma_unmap_single(&adapter->pdev->dev,
|
||||
fcoe->extra_ddp_buffer_dma,
|
||||
IXGBE_FCBUFF_MIN,
|
||||
DMA_FROM_DEVICE);
|
||||
kfree(fcoe->extra_ddp_buffer);
|
||||
pci_pool_destroy(fcoe->pool);
|
||||
fcoe->pool = NULL;
|
||||
}
|
||||
|
|
|
@ -70,6 +70,8 @@ struct ixgbe_fcoe {
|
|||
spinlock_t lock;
|
||||
struct pci_pool *pool;
|
||||
struct ixgbe_fcoe_ddp ddp[IXGBE_FCOE_DDP_MAX];
|
||||
unsigned char *extra_ddp_buffer;
|
||||
dma_addr_t extra_ddp_buffer_dma;
|
||||
};
|
||||
|
||||
#endif /* _IXGBE_FCOE_H */
|
||||
|
|
|
@ -3728,7 +3728,8 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter)
|
|||
* We need to try and force an autonegotiation
|
||||
* session, then bring up link.
|
||||
*/
|
||||
hw->mac.ops.setup_sfp(hw);
|
||||
if (hw->mac.ops.setup_sfp)
|
||||
hw->mac.ops.setup_sfp(hw);
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
|
||||
schedule_work(&adapter->multispeed_fiber_task);
|
||||
} else {
|
||||
|
@ -5968,7 +5969,8 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work)
|
|||
unregister_netdev(adapter->netdev);
|
||||
return;
|
||||
}
|
||||
hw->mac.ops.setup_sfp(hw);
|
||||
if (hw->mac.ops.setup_sfp)
|
||||
hw->mac.ops.setup_sfp(hw);
|
||||
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
|
||||
/* This will also work for DA Twinax connections */
|
||||
|
|
|
@ -73,7 +73,7 @@ struct pch_gbe_regs {
|
|||
struct pch_gbe_regs_mac_adr mac_adr[16];
|
||||
u32 ADDR_MASK;
|
||||
u32 MIIM;
|
||||
u32 reserve2;
|
||||
u32 MAC_ADDR_LOAD;
|
||||
u32 RGMII_ST;
|
||||
u32 RGMII_CTRL;
|
||||
u32 reserve3[3];
|
||||
|
|
|
@ -29,6 +29,7 @@ const char pch_driver_version[] = DRV_VERSION;
|
|||
#define PCH_GBE_SHORT_PKT 64
|
||||
#define DSC_INIT16 0xC000
|
||||
#define PCH_GBE_DMA_ALIGN 0
|
||||
#define PCH_GBE_DMA_PADDING 2
|
||||
#define PCH_GBE_WATCHDOG_PERIOD (1 * HZ) /* watchdog time */
|
||||
#define PCH_GBE_COPYBREAK_DEFAULT 256
|
||||
#define PCH_GBE_PCI_BAR 1
|
||||
|
@ -88,6 +89,12 @@ static unsigned int copybreak __read_mostly = PCH_GBE_COPYBREAK_DEFAULT;
|
|||
static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg);
|
||||
static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
|
||||
int data);
|
||||
|
||||
inline void pch_gbe_mac_load_mac_addr(struct pch_gbe_hw *hw)
|
||||
{
|
||||
iowrite32(0x01, &hw->reg->MAC_ADDR_LOAD);
|
||||
}
|
||||
|
||||
/**
|
||||
* pch_gbe_mac_read_mac_addr - Read MAC address
|
||||
* @hw: Pointer to the HW structure
|
||||
|
@ -1365,16 +1372,13 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
|
|||
struct pch_gbe_buffer *buffer_info;
|
||||
struct pch_gbe_rx_desc *rx_desc;
|
||||
u32 length;
|
||||
unsigned char tmp_packet[ETH_HLEN];
|
||||
unsigned int i;
|
||||
unsigned int cleaned_count = 0;
|
||||
bool cleaned = false;
|
||||
struct sk_buff *skb;
|
||||
struct sk_buff *skb, *new_skb;
|
||||
u8 dma_status;
|
||||
u16 gbec_status;
|
||||
u32 tcp_ip_status;
|
||||
u8 skb_copy_flag = 0;
|
||||
u8 skb_padding_flag = 0;
|
||||
|
||||
i = rx_ring->next_to_clean;
|
||||
|
||||
|
@ -1418,55 +1422,70 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
|
|||
pr_err("Receive CRC Error\n");
|
||||
} else {
|
||||
/* get receive length */
|
||||
/* length convert[-3], padding[-2] */
|
||||
length = (rx_desc->rx_words_eob) - 3 - 2;
|
||||
/* length convert[-3] */
|
||||
length = (rx_desc->rx_words_eob) - 3;
|
||||
|
||||
/* Decide the data conversion method */
|
||||
if (!adapter->rx_csum) {
|
||||
/* [Header:14][payload] */
|
||||
skb_padding_flag = 0;
|
||||
skb_copy_flag = 1;
|
||||
} else {
|
||||
/* [Header:14][padding:2][payload] */
|
||||
skb_padding_flag = 1;
|
||||
if (length < copybreak)
|
||||
skb_copy_flag = 1;
|
||||
else
|
||||
skb_copy_flag = 0;
|
||||
}
|
||||
|
||||
/* Data conversion */
|
||||
if (skb_copy_flag) { /* recycle skb */
|
||||
struct sk_buff *new_skb;
|
||||
new_skb =
|
||||
netdev_alloc_skb(netdev,
|
||||
length + NET_IP_ALIGN);
|
||||
if (new_skb) {
|
||||
if (!skb_padding_flag) {
|
||||
skb_reserve(new_skb,
|
||||
NET_IP_ALIGN);
|
||||
if (NET_IP_ALIGN) {
|
||||
/* Because alignment differs,
|
||||
* the new_skb is newly allocated,
|
||||
* and data is copied to new_skb.*/
|
||||
new_skb = netdev_alloc_skb(netdev,
|
||||
length + NET_IP_ALIGN);
|
||||
if (!new_skb) {
|
||||
/* dorrop error */
|
||||
pr_err("New skb allocation "
|
||||
"Error\n");
|
||||
goto dorrop;
|
||||
}
|
||||
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||
memcpy(new_skb->data, skb->data,
|
||||
length);
|
||||
/* save the skb
|
||||
* in buffer_info as good */
|
||||
length);
|
||||
skb = new_skb;
|
||||
} else if (!skb_padding_flag) {
|
||||
/* dorrop error */
|
||||
pr_err("New skb allocation Error\n");
|
||||
goto dorrop;
|
||||
} else {
|
||||
/* DMA buffer is used as SKB as it is.*/
|
||||
buffer_info->skb = NULL;
|
||||
}
|
||||
} else {
|
||||
buffer_info->skb = NULL;
|
||||
/* [Header:14][padding:2][payload] */
|
||||
/* The length includes padding length */
|
||||
length = length - PCH_GBE_DMA_PADDING;
|
||||
if ((length < copybreak) ||
|
||||
(NET_IP_ALIGN != PCH_GBE_DMA_PADDING)) {
|
||||
/* Because alignment differs,
|
||||
* the new_skb is newly allocated,
|
||||
* and data is copied to new_skb.
|
||||
* Padding data is deleted
|
||||
* at the time of a copy.*/
|
||||
new_skb = netdev_alloc_skb(netdev,
|
||||
length + NET_IP_ALIGN);
|
||||
if (!new_skb) {
|
||||
/* dorrop error */
|
||||
pr_err("New skb allocation "
|
||||
"Error\n");
|
||||
goto dorrop;
|
||||
}
|
||||
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||
memcpy(new_skb->data, skb->data,
|
||||
ETH_HLEN);
|
||||
memcpy(&new_skb->data[ETH_HLEN],
|
||||
&skb->data[ETH_HLEN +
|
||||
PCH_GBE_DMA_PADDING],
|
||||
length - ETH_HLEN);
|
||||
skb = new_skb;
|
||||
} else {
|
||||
/* Padding data is deleted
|
||||
* by moving header data.*/
|
||||
memmove(&skb->data[PCH_GBE_DMA_PADDING],
|
||||
&skb->data[0], ETH_HLEN);
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
buffer_info->skb = NULL;
|
||||
}
|
||||
}
|
||||
if (skb_padding_flag) {
|
||||
memcpy(&tmp_packet[0], &skb->data[0], ETH_HLEN);
|
||||
memcpy(&skb->data[NET_IP_ALIGN], &tmp_packet[0],
|
||||
ETH_HLEN);
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
|
||||
}
|
||||
|
||||
/* The length includes FCS length */
|
||||
length = length - ETH_FCS_LEN;
|
||||
/* update status of driver */
|
||||
adapter->stats.rx_bytes += length;
|
||||
adapter->stats.rx_packets++;
|
||||
|
@ -2318,6 +2337,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
|
|||
netdev->features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_GRO;
|
||||
pch_gbe_set_ethtool_ops(netdev);
|
||||
|
||||
pch_gbe_mac_load_mac_addr(&adapter->hw);
|
||||
pch_gbe_mac_reset_hw(&adapter->hw);
|
||||
|
||||
/* setup the private structure */
|
||||
|
|
|
@ -3190,6 +3190,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
if (pci_dev_run_wake(pdev))
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
|
||||
netif_carrier_off(dev);
|
||||
|
||||
out:
|
||||
return rc;
|
||||
|
||||
|
|
|
@ -1560,8 +1560,10 @@ static int stmmac_mac_device_setup(struct net_device *dev)
|
|||
|
||||
priv->hw = device;
|
||||
|
||||
if (device_can_wakeup(priv->device))
|
||||
if (device_can_wakeup(priv->device)) {
|
||||
priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */
|
||||
enable_irq_wake(dev->irq);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -11158,7 +11158,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
|
||||
break; /* We have no PHY */
|
||||
|
||||
if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)
|
||||
if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) ||
|
||||
((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) &&
|
||||
!netif_running(dev)))
|
||||
return -EAGAIN;
|
||||
|
||||
spin_lock_bh(&tp->lock);
|
||||
|
@ -11174,7 +11176,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
|
||||
break; /* We have no PHY */
|
||||
|
||||
if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)
|
||||
if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) ||
|
||||
((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) &&
|
||||
!netif_running(dev)))
|
||||
return -EAGAIN;
|
||||
|
||||
spin_lock_bh(&tp->lock);
|
||||
|
|
|
@ -2628,15 +2628,15 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
|
|||
|
||||
static void hso_free_tiomget(struct hso_serial *serial)
|
||||
{
|
||||
struct hso_tiocmget *tiocmget = serial->tiocmget;
|
||||
struct hso_tiocmget *tiocmget;
|
||||
if (!serial)
|
||||
return;
|
||||
tiocmget = serial->tiocmget;
|
||||
if (tiocmget) {
|
||||
if (tiocmget->urb) {
|
||||
usb_free_urb(tiocmget->urb);
|
||||
tiocmget->urb = NULL;
|
||||
}
|
||||
usb_free_urb(tiocmget->urb);
|
||||
tiocmget->urb = NULL;
|
||||
serial->tiocmget = NULL;
|
||||
kfree(tiocmget);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -931,8 +931,10 @@ kevent (struct work_struct *work)
|
|||
if (urb != NULL) {
|
||||
clear_bit (EVENT_RX_MEMORY, &dev->flags);
|
||||
status = usb_autopm_get_interface(dev->intf);
|
||||
if (status < 0)
|
||||
if (status < 0) {
|
||||
usb_free_urb(urb);
|
||||
goto fail_lowmem;
|
||||
}
|
||||
if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK)
|
||||
resched = 0;
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
|
|
|
@ -402,72 +402,6 @@ static void iwl3945_accumulative_statistics(struct iwl_priv *priv,
|
|||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* iwl3945_good_plcp_health - checks for plcp error.
|
||||
*
|
||||
* When the plcp error is exceeding the thresholds, reset the radio
|
||||
* to improve the throughput.
|
||||
*/
|
||||
static bool iwl3945_good_plcp_health(struct iwl_priv *priv,
|
||||
struct iwl_rx_packet *pkt)
|
||||
{
|
||||
bool rc = true;
|
||||
struct iwl3945_notif_statistics current_stat;
|
||||
int combined_plcp_delta;
|
||||
unsigned int plcp_msec;
|
||||
unsigned long plcp_received_jiffies;
|
||||
|
||||
if (priv->cfg->base_params->plcp_delta_threshold ==
|
||||
IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE) {
|
||||
IWL_DEBUG_RADIO(priv, "plcp_err check disabled\n");
|
||||
return rc;
|
||||
}
|
||||
memcpy(¤t_stat, pkt->u.raw, sizeof(struct
|
||||
iwl3945_notif_statistics));
|
||||
/*
|
||||
* check for plcp_err and trigger radio reset if it exceeds
|
||||
* the plcp error threshold plcp_delta.
|
||||
*/
|
||||
plcp_received_jiffies = jiffies;
|
||||
plcp_msec = jiffies_to_msecs((long) plcp_received_jiffies -
|
||||
(long) priv->plcp_jiffies);
|
||||
priv->plcp_jiffies = plcp_received_jiffies;
|
||||
/*
|
||||
* check to make sure plcp_msec is not 0 to prevent division
|
||||
* by zero.
|
||||
*/
|
||||
if (plcp_msec) {
|
||||
combined_plcp_delta =
|
||||
(le32_to_cpu(current_stat.rx.ofdm.plcp_err) -
|
||||
le32_to_cpu(priv->_3945.statistics.rx.ofdm.plcp_err));
|
||||
|
||||
if ((combined_plcp_delta > 0) &&
|
||||
((combined_plcp_delta * 100) / plcp_msec) >
|
||||
priv->cfg->base_params->plcp_delta_threshold) {
|
||||
/*
|
||||
* if plcp_err exceed the threshold, the following
|
||||
* data is printed in csv format:
|
||||
* Text: plcp_err exceeded %d,
|
||||
* Received ofdm.plcp_err,
|
||||
* Current ofdm.plcp_err,
|
||||
* combined_plcp_delta,
|
||||
* plcp_msec
|
||||
*/
|
||||
IWL_DEBUG_RADIO(priv, "plcp_err exceeded %u, "
|
||||
"%u, %d, %u mSecs\n",
|
||||
priv->cfg->base_params->plcp_delta_threshold,
|
||||
le32_to_cpu(current_stat.rx.ofdm.plcp_err),
|
||||
combined_plcp_delta, plcp_msec);
|
||||
/*
|
||||
* Reset the RF radio due to the high plcp
|
||||
* error rate
|
||||
*/
|
||||
rc = false;
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
|
||||
struct iwl_rx_mem_buffer *rxb)
|
||||
{
|
||||
|
@ -2734,7 +2668,6 @@ static struct iwl_lib_ops iwl3945_lib = {
|
|||
.isr_ops = {
|
||||
.isr = iwl_isr_legacy,
|
||||
},
|
||||
.check_plcp_health = iwl3945_good_plcp_health,
|
||||
|
||||
.debugfs_ops = {
|
||||
.rx_stats_read = iwl3945_ucode_rx_stats_read,
|
||||
|
|
|
@ -859,6 +859,7 @@ static void __l2cap_sock_close(struct sock *sk, int reason)
|
|||
result = L2CAP_CR_SEC_BLOCK;
|
||||
else
|
||||
result = L2CAP_CR_BAD_PSM;
|
||||
sk->sk_state = BT_DISCONN;
|
||||
|
||||
rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
||||
rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
|
||||
|
|
|
@ -80,7 +80,7 @@ int br_handle_frame_finish(struct sk_buff *skb)
|
|||
if (is_multicast_ether_addr(dest)) {
|
||||
mdst = br_mdb_get(br, skb);
|
||||
if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) {
|
||||
if ((mdst && !hlist_unhashed(&mdst->mglist)) ||
|
||||
if ((mdst && mdst->mglist) ||
|
||||
br_multicast_is_router(br))
|
||||
skb2 = skb;
|
||||
br_multicast_forward(mdst, skb, skb2);
|
||||
|
|
|
@ -232,8 +232,7 @@ static void br_multicast_group_expired(unsigned long data)
|
|||
if (!netif_running(br->dev) || timer_pending(&mp->timer))
|
||||
goto out;
|
||||
|
||||
if (!hlist_unhashed(&mp->mglist))
|
||||
hlist_del_init(&mp->mglist);
|
||||
mp->mglist = false;
|
||||
|
||||
if (mp->ports)
|
||||
goto out;
|
||||
|
@ -276,7 +275,7 @@ static void br_multicast_del_pg(struct net_bridge *br,
|
|||
del_timer(&p->query_timer);
|
||||
call_rcu_bh(&p->rcu, br_multicast_free_pg);
|
||||
|
||||
if (!mp->ports && hlist_unhashed(&mp->mglist) &&
|
||||
if (!mp->ports && !mp->mglist &&
|
||||
netif_running(br->dev))
|
||||
mod_timer(&mp->timer, jiffies);
|
||||
|
||||
|
@ -528,7 +527,7 @@ static void br_multicast_group_query_expired(unsigned long data)
|
|||
struct net_bridge *br = mp->br;
|
||||
|
||||
spin_lock(&br->multicast_lock);
|
||||
if (!netif_running(br->dev) || hlist_unhashed(&mp->mglist) ||
|
||||
if (!netif_running(br->dev) || !mp->mglist ||
|
||||
mp->queries_sent >= br->multicast_last_member_count)
|
||||
goto out;
|
||||
|
||||
|
@ -719,7 +718,7 @@ static int br_multicast_add_group(struct net_bridge *br,
|
|||
goto err;
|
||||
|
||||
if (!port) {
|
||||
hlist_add_head(&mp->mglist, &br->mglist);
|
||||
mp->mglist = true;
|
||||
mod_timer(&mp->timer, now + br->multicast_membership_interval);
|
||||
goto out;
|
||||
}
|
||||
|
@ -1165,7 +1164,7 @@ static int br_ip4_multicast_query(struct net_bridge *br,
|
|||
|
||||
max_delay *= br->multicast_last_member_count;
|
||||
|
||||
if (!hlist_unhashed(&mp->mglist) &&
|
||||
if (mp->mglist &&
|
||||
(timer_pending(&mp->timer) ?
|
||||
time_after(mp->timer.expires, now + max_delay) :
|
||||
try_to_del_timer_sync(&mp->timer) >= 0))
|
||||
|
@ -1177,7 +1176,7 @@ static int br_ip4_multicast_query(struct net_bridge *br,
|
|||
if (timer_pending(&p->timer) ?
|
||||
time_after(p->timer.expires, now + max_delay) :
|
||||
try_to_del_timer_sync(&p->timer) >= 0)
|
||||
mod_timer(&mp->timer, now + max_delay);
|
||||
mod_timer(&p->timer, now + max_delay);
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -1236,7 +1235,7 @@ static int br_ip6_multicast_query(struct net_bridge *br,
|
|||
goto out;
|
||||
|
||||
max_delay *= br->multicast_last_member_count;
|
||||
if (!hlist_unhashed(&mp->mglist) &&
|
||||
if (mp->mglist &&
|
||||
(timer_pending(&mp->timer) ?
|
||||
time_after(mp->timer.expires, now + max_delay) :
|
||||
try_to_del_timer_sync(&mp->timer) >= 0))
|
||||
|
@ -1248,7 +1247,7 @@ static int br_ip6_multicast_query(struct net_bridge *br,
|
|||
if (timer_pending(&p->timer) ?
|
||||
time_after(p->timer.expires, now + max_delay) :
|
||||
try_to_del_timer_sync(&p->timer) >= 0)
|
||||
mod_timer(&mp->timer, now + max_delay);
|
||||
mod_timer(&p->timer, now + max_delay);
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -1283,7 +1282,7 @@ static void br_multicast_leave_group(struct net_bridge *br,
|
|||
br->multicast_last_member_interval;
|
||||
|
||||
if (!port) {
|
||||
if (!hlist_unhashed(&mp->mglist) &&
|
||||
if (mp->mglist &&
|
||||
(timer_pending(&mp->timer) ?
|
||||
time_after(mp->timer.expires, time) :
|
||||
try_to_del_timer_sync(&mp->timer) >= 0)) {
|
||||
|
|
|
@ -84,13 +84,13 @@ struct net_bridge_port_group {
|
|||
struct net_bridge_mdb_entry
|
||||
{
|
||||
struct hlist_node hlist[2];
|
||||
struct hlist_node mglist;
|
||||
struct net_bridge *br;
|
||||
struct net_bridge_port_group __rcu *ports;
|
||||
struct rcu_head rcu;
|
||||
struct timer_list timer;
|
||||
struct timer_list query_timer;
|
||||
struct br_ip addr;
|
||||
bool mglist;
|
||||
u32 queries_sent;
|
||||
};
|
||||
|
||||
|
@ -238,7 +238,6 @@ struct net_bridge
|
|||
spinlock_t multicast_lock;
|
||||
struct net_bridge_mdb_htable __rcu *mdb;
|
||||
struct hlist_head router_list;
|
||||
struct hlist_head mglist;
|
||||
|
||||
struct timer_list multicast_router_timer;
|
||||
struct timer_list multicast_querier_timer;
|
||||
|
|
|
@ -1280,10 +1280,13 @@ static int __dev_close_many(struct list_head *head)
|
|||
|
||||
static int __dev_close(struct net_device *dev)
|
||||
{
|
||||
int retval;
|
||||
LIST_HEAD(single);
|
||||
|
||||
list_add(&dev->unreg_list, &single);
|
||||
return __dev_close_many(&single);
|
||||
retval = __dev_close_many(&single);
|
||||
list_del(&single);
|
||||
return retval;
|
||||
}
|
||||
|
||||
int dev_close_many(struct list_head *head)
|
||||
|
@ -1325,7 +1328,7 @@ int dev_close(struct net_device *dev)
|
|||
|
||||
list_add(&dev->unreg_list, &single);
|
||||
dev_close_many(&single);
|
||||
|
||||
list_del(&single);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dev_close);
|
||||
|
@ -5063,6 +5066,7 @@ static void rollback_registered(struct net_device *dev)
|
|||
|
||||
list_add(&dev->unreg_list, &single);
|
||||
rollback_registered_many(&single);
|
||||
list_del(&single);
|
||||
}
|
||||
|
||||
unsigned long netdev_fix_features(unsigned long features, const char *name)
|
||||
|
@ -6216,6 +6220,7 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list)
|
|||
}
|
||||
}
|
||||
unregister_netdevice_many(&dev_kill_list);
|
||||
list_del(&dev_kill_list);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
|
|
|
@ -626,6 +626,9 @@ static int dcbnl_getapp(struct net_device *netdev, struct nlattr **tb,
|
|||
dcb->cmd = DCB_CMD_GAPP;
|
||||
|
||||
app_nest = nla_nest_start(dcbnl_skb, DCB_ATTR_APP);
|
||||
if (!app_nest)
|
||||
goto out_cancel;
|
||||
|
||||
ret = nla_put_u8(dcbnl_skb, DCB_APP_ATTR_IDTYPE, idtype);
|
||||
if (ret)
|
||||
goto out_cancel;
|
||||
|
@ -1613,6 +1616,10 @@ EXPORT_SYMBOL(dcb_getapp);
|
|||
u8 dcb_setapp(struct net_device *dev, struct dcb_app *new)
|
||||
{
|
||||
struct dcb_app_type *itr;
|
||||
struct dcb_app_type event;
|
||||
|
||||
memcpy(&event.name, dev->name, sizeof(event.name));
|
||||
memcpy(&event.app, new, sizeof(event.app));
|
||||
|
||||
spin_lock(&dcb_lock);
|
||||
/* Search for existing match and replace */
|
||||
|
@ -1644,7 +1651,7 @@ u8 dcb_setapp(struct net_device *dev, struct dcb_app *new)
|
|||
}
|
||||
out:
|
||||
spin_unlock(&dcb_lock);
|
||||
call_dcbevent_notifiers(DCB_APP_EVENT, new);
|
||||
call_dcbevent_notifiers(DCB_APP_EVENT, &event);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dcb_setapp);
|
||||
|
|
|
@ -1030,6 +1030,21 @@ static inline bool inetdev_valid_mtu(unsigned mtu)
|
|||
return mtu >= 68;
|
||||
}
|
||||
|
||||
static void inetdev_send_gratuitous_arp(struct net_device *dev,
|
||||
struct in_device *in_dev)
|
||||
|
||||
{
|
||||
struct in_ifaddr *ifa = in_dev->ifa_list;
|
||||
|
||||
if (!ifa)
|
||||
return;
|
||||
|
||||
arp_send(ARPOP_REQUEST, ETH_P_ARP,
|
||||
ifa->ifa_address, dev,
|
||||
ifa->ifa_address, NULL,
|
||||
dev->dev_addr, NULL);
|
||||
}
|
||||
|
||||
/* Called only under RTNL semaphore */
|
||||
|
||||
static int inetdev_event(struct notifier_block *this, unsigned long event,
|
||||
|
@ -1082,18 +1097,13 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,
|
|||
}
|
||||
ip_mc_up(in_dev);
|
||||
/* fall through */
|
||||
case NETDEV_NOTIFY_PEERS:
|
||||
case NETDEV_CHANGEADDR:
|
||||
if (!IN_DEV_ARP_NOTIFY(in_dev))
|
||||
break;
|
||||
/* fall through */
|
||||
case NETDEV_NOTIFY_PEERS:
|
||||
/* Send gratuitous ARP to notify of link change */
|
||||
if (IN_DEV_ARP_NOTIFY(in_dev)) {
|
||||
struct in_ifaddr *ifa = in_dev->ifa_list;
|
||||
|
||||
if (ifa)
|
||||
arp_send(ARPOP_REQUEST, ETH_P_ARP,
|
||||
ifa->ifa_address, dev,
|
||||
ifa->ifa_address, NULL,
|
||||
dev->dev_addr, NULL);
|
||||
}
|
||||
inetdev_send_gratuitous_arp(dev, in_dev);
|
||||
break;
|
||||
case NETDEV_DOWN:
|
||||
ip_mc_down(in_dev);
|
||||
|
|
|
@ -775,6 +775,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
|
|||
.fl4_dst = dst,
|
||||
.fl4_src = tiph->saddr,
|
||||
.fl4_tos = RT_TOS(tos),
|
||||
.proto = IPPROTO_GRE,
|
||||
.fl_gre_key = tunnel->parms.o_key
|
||||
};
|
||||
if (ip_route_output_key(dev_net(dev), &rt, &fl)) {
|
||||
|
|
|
@ -2722,6 +2722,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
|
|||
.destroy = ipv4_dst_destroy,
|
||||
.check = ipv4_blackhole_dst_check,
|
||||
.default_mtu = ipv4_blackhole_default_mtu,
|
||||
.default_advmss = ipv4_default_advmss,
|
||||
.update_pmtu = ipv4_rt_blackhole_update_pmtu,
|
||||
};
|
||||
|
||||
|
|
|
@ -128,6 +128,7 @@ static struct dst_ops ip6_dst_blackhole_ops = {
|
|||
.destroy = ip6_dst_destroy,
|
||||
.check = ip6_dst_check,
|
||||
.default_mtu = ip6_blackhole_default_mtu,
|
||||
.default_advmss = ip6_default_advmss,
|
||||
.update_pmtu = ip6_rt_blackhole_update_pmtu,
|
||||
};
|
||||
|
||||
|
|
|
@ -1210,7 +1210,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
changed |= BSS_CHANGED_ASSOC;
|
||||
mutex_lock(&sdata->u.mgd.mtx);
|
||||
ieee80211_bss_info_change_notify(sdata, changed);
|
||||
mutex_unlock(&sdata->u.mgd.mtx);
|
||||
break;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
changed |= BSS_CHANGED_IBSS;
|
||||
|
|
|
@ -133,6 +133,7 @@ unsigned int nf_iterate(struct list_head *head,
|
|||
|
||||
/* Optimization: we don't need to hold module
|
||||
reference here, since function can't sleep. --RR */
|
||||
repeat:
|
||||
verdict = elem->hook(hook, skb, indev, outdev, okfn);
|
||||
if (verdict != NF_ACCEPT) {
|
||||
#ifdef CONFIG_NETFILTER_DEBUG
|
||||
|
@ -145,7 +146,7 @@ unsigned int nf_iterate(struct list_head *head,
|
|||
#endif
|
||||
if (verdict != NF_REPEAT)
|
||||
return verdict;
|
||||
*i = (*i)->prev;
|
||||
goto repeat;
|
||||
}
|
||||
}
|
||||
return NF_ACCEPT;
|
||||
|
|
|
@ -1340,10 +1340,13 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)
|
|||
default:
|
||||
BUG();
|
||||
}
|
||||
xdst = dst_alloc(dst_ops) ?: ERR_PTR(-ENOBUFS);
|
||||
xdst = dst_alloc(dst_ops);
|
||||
xfrm_policy_put_afinfo(afinfo);
|
||||
|
||||
xdst->flo.ops = &xfrm_bundle_fc_ops;
|
||||
if (likely(xdst))
|
||||
xdst->flo.ops = &xfrm_bundle_fc_ops;
|
||||
else
|
||||
xdst = ERR_PTR(-ENOBUFS);
|
||||
|
||||
return xdst;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue