提交 4c3021da 编写于 作者: L Linus Torvalds

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.
  ...
...@@ -4,6 +4,8 @@ obj- := dummy.o ...@@ -4,6 +4,8 @@ obj- := dummy.o
# List of programs to build # List of programs to build
hostprogs-y := ifenslave hostprogs-y := ifenslave
HOSTCFLAGS_ifenslave.o += -I$(objtree)/usr/include
# Tell kbuild to always build the programs # Tell kbuild to always build the programs
always := $(hostprogs-y) always := $(hostprogs-y)
......
...@@ -866,8 +866,9 @@ static int popen(struct atm_vcc *vcc) ...@@ -866,8 +866,9 @@ static int popen(struct atm_vcc *vcc)
} }
skb = alloc_skb(sizeof(*header), GFP_ATOMIC); skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
if (!skb && net_ratelimit()) { if (!skb) {
dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n"); if (net_ratelimit())
dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
return -ENOMEM; return -ENOMEM;
} }
header = (void *)skb_put(skb, sizeof(*header)); header = (void *)skb_put(skb, sizeof(*header));
......
...@@ -39,6 +39,8 @@ static struct usb_device_id ath3k_table[] = { ...@@ -39,6 +39,8 @@ static struct usb_device_id ath3k_table[] = {
/* Atheros AR3011 with sflash firmware*/ /* Atheros AR3011 with sflash firmware*/
{ USB_DEVICE(0x0CF3, 0x3002) }, { USB_DEVICE(0x0CF3, 0x3002) },
/* Atheros AR9285 Malbec with sflash firmware */
{ USB_DEVICE(0x03F0, 0x311D) },
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
......
...@@ -102,6 +102,9 @@ static struct usb_device_id blacklist_table[] = { ...@@ -102,6 +102,9 @@ static struct usb_device_id blacklist_table[] = {
/* Atheros 3011 with sflash firmware */ /* Atheros 3011 with sflash firmware */
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
/* Atheros AR9285 Malbec with sflash firmware */
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
/* Broadcom BCM2035 */ /* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
......
...@@ -1247,10 +1247,10 @@ static void ...@@ -1247,10 +1247,10 @@ static void
l2_pull_iqueue(struct FsmInst *fi, int event, void *arg) l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
{ {
struct PStack *st = fi->userdata; struct PStack *st = fi->userdata;
struct sk_buff *skb, *oskb; struct sk_buff *skb;
struct Layer2 *l2 = &st->l2; struct Layer2 *l2 = &st->l2;
u_char header[MAX_HEADER_LEN]; u_char header[MAX_HEADER_LEN];
int i; int i, hdr_space_needed;
int unsigned p1; int unsigned p1;
u_long flags; u_long flags;
...@@ -1261,6 +1261,16 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg) ...@@ -1261,6 +1261,16 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
if (!skb) if (!skb)
return; 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); spin_lock_irqsave(&l2->lock, flags);
if(test_bit(FLG_MOD128, &l2->flag)) if(test_bit(FLG_MOD128, &l2->flag))
p1 = (l2->vs - l2->va) % 128; p1 = (l2->vs - l2->va) % 128;
...@@ -1285,19 +1295,7 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg) ...@@ -1285,19 +1295,7 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
l2->vs = (l2->vs + 1) % 8; l2->vs = (l2->vs + 1) % 8;
} }
spin_unlock_irqrestore(&l2->lock, flags); spin_unlock_irqrestore(&l2->lock, flags);
p1 = skb->data - skb->head; memcpy(skb_push(skb, i), header, i);
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);
}
st->l2.l2l1(st, PH_PULL | INDICATION, skb); st->l2.l2l1(st, PH_PULL | INDICATION, skb);
test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag); test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
if (!test_and_set_bit(FLG_T200_RUN, &st->l2.flag)) { if (!test_and_set_bit(FLG_T200_RUN, &st->l2.flag)) {
......
...@@ -18,7 +18,7 @@ config CAN_SOFTING ...@@ -18,7 +18,7 @@ config CAN_SOFTING
config CAN_SOFTING_CS config CAN_SOFTING_CS
tristate "Softing Gmbh CAN pcmcia cards" tristate "Softing Gmbh CAN pcmcia cards"
depends on PCMCIA depends on PCMCIA
select CAN_SOFTING depends on CAN_SOFTING
---help--- ---help---
Support for PCMCIA cards from Softing Gmbh & some cards Support for PCMCIA cards from Softing Gmbh & some cards
from Vector Gmbh. from Vector Gmbh.
......
...@@ -2040,7 +2040,7 @@ static int __devinit setup_debugfs(struct adapter *adapter) ...@@ -2040,7 +2040,7 @@ static int __devinit setup_debugfs(struct adapter *adapter)
{ {
int i; int i;
BUG_ON(adapter->debugfs_root == NULL); BUG_ON(IS_ERR_OR_NULL(adapter->debugfs_root));
/* /*
* Debugfs support is best effort. * Debugfs support is best effort.
...@@ -2061,7 +2061,7 @@ static int __devinit setup_debugfs(struct adapter *adapter) ...@@ -2061,7 +2061,7 @@ static int __devinit setup_debugfs(struct adapter *adapter)
*/ */
static void cleanup_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 * 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, ...@@ -2488,17 +2488,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
struct port_info *pi; struct port_info *pi;
struct net_device *netdev; 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 * Print our driver banner the first time we're called to initialize a
* device. * device.
...@@ -2711,11 +2700,11 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev, ...@@ -2711,11 +2700,11 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
/* /*
* Set up our debugfs entries. * Set up our debugfs entries.
*/ */
if (cxgb4vf_debugfs_root) { if (!IS_ERR_OR_NULL(cxgb4vf_debugfs_root)) {
adapter->debugfs_root = adapter->debugfs_root =
debugfs_create_dir(pci_name(pdev), debugfs_create_dir(pci_name(pdev),
cxgb4vf_debugfs_root); cxgb4vf_debugfs_root);
if (adapter->debugfs_root == NULL) if (IS_ERR_OR_NULL(adapter->debugfs_root))
dev_warn(&pdev->dev, "could not create debugfs" dev_warn(&pdev->dev, "could not create debugfs"
" directory"); " directory");
else else
...@@ -2770,7 +2759,7 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev, ...@@ -2770,7 +2759,7 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
*/ */
err_free_debugfs: err_free_debugfs:
if (adapter->debugfs_root) { if (!IS_ERR_OR_NULL(adapter->debugfs_root)) {
cleanup_debugfs(adapter); cleanup_debugfs(adapter);
debugfs_remove_recursive(adapter->debugfs_root); debugfs_remove_recursive(adapter->debugfs_root);
} }
...@@ -2802,7 +2791,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev, ...@@ -2802,7 +2791,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
err_disable_device: err_disable_device:
pci_disable_device(pdev); pci_disable_device(pdev);
err_out:
return err; return err;
} }
...@@ -2840,7 +2828,7 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev) ...@@ -2840,7 +2828,7 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
/* /*
* Tear down our debugfs entries. * Tear down our debugfs entries.
*/ */
if (adapter->debugfs_root) { if (!IS_ERR_OR_NULL(adapter->debugfs_root)) {
cleanup_debugfs(adapter); cleanup_debugfs(adapter);
debugfs_remove_recursive(adapter->debugfs_root); debugfs_remove_recursive(adapter->debugfs_root);
} }
...@@ -2873,6 +2861,46 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev) ...@@ -2873,6 +2861,46 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
pci_release_regions(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. * PCI Device registration data structures.
*/ */
...@@ -2906,6 +2934,7 @@ static struct pci_driver cxgb4vf_driver = { ...@@ -2906,6 +2934,7 @@ static struct pci_driver cxgb4vf_driver = {
.id_table = cxgb4vf_pci_tbl, .id_table = cxgb4vf_pci_tbl,
.probe = cxgb4vf_pci_probe, .probe = cxgb4vf_pci_probe,
.remove = __devexit_p(cxgb4vf_pci_remove), .remove = __devexit_p(cxgb4vf_pci_remove),
.shutdown = __devexit_p(cxgb4vf_pci_shutdown),
}; };
/* /*
...@@ -2915,14 +2944,25 @@ static int __init cxgb4vf_module_init(void) ...@@ -2915,14 +2944,25 @@ static int __init cxgb4vf_module_init(void)
{ {
int ret; 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 */ /* Debugfs support is optional, just warn if this fails */
cxgb4vf_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL); 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" printk(KERN_WARNING KBUILD_MODNAME ": could not create"
" debugfs entry, continuing\n"); " debugfs entry, continuing\n");
ret = pci_register_driver(&cxgb4vf_driver); ret = pci_register_driver(&cxgb4vf_driver);
if (ret < 0) if (ret < 0 && !IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
debugfs_remove(cxgb4vf_debugfs_root); debugfs_remove(cxgb4vf_debugfs_root);
return ret; return ret;
} }
......
...@@ -171,7 +171,7 @@ int t4vf_wr_mbox_core(struct adapter *adapter, const void *cmd, int size, ...@@ -171,7 +171,7 @@ int t4vf_wr_mbox_core(struct adapter *adapter, const void *cmd, int size,
delay_idx = 0; delay_idx = 0;
ms = delay[0]; ms = delay[0];
for (i = 0; i < 500; i += ms) { for (i = 0; i < FW_CMD_MAX_TIMEOUT; i += ms) {
if (sleep_ok) { if (sleep_ok) {
ms = delay[delay_idx]; ms = delay[delay_idx];
if (delay_idx < ARRAY_SIZE(delay) - 1) if (delay_idx < ARRAY_SIZE(delay) - 1)
......
...@@ -937,6 +937,9 @@ static void e1000_print_hw_hang(struct work_struct *work) ...@@ -937,6 +937,9 @@ static void e1000_print_hw_hang(struct work_struct *work)
u16 phy_status, phy_1000t_status, phy_ext_status; u16 phy_status, phy_1000t_status, phy_ext_status;
u16 pci_status; u16 pci_status;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1e_rphy(hw, PHY_STATUS, &phy_status); e1e_rphy(hw, PHY_STATUS, &phy_status);
e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status); e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status); e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
...@@ -1506,6 +1509,9 @@ static void e1000e_downshift_workaround(struct work_struct *work) ...@@ -1506,6 +1509,9 @@ static void e1000e_downshift_workaround(struct work_struct *work)
struct e1000_adapter *adapter = container_of(work, struct e1000_adapter *adapter = container_of(work,
struct e1000_adapter, downshift_task); struct e1000_adapter, downshift_task);
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1000e_gig_downshift_workaround_ich8lan(&adapter->hw); e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
} }
...@@ -3338,6 +3344,21 @@ int e1000e_up(struct e1000_adapter *adapter) ...@@ -3338,6 +3344,21 @@ int e1000e_up(struct e1000_adapter *adapter)
return 0; 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) void e1000e_down(struct e1000_adapter *adapter)
{ {
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
...@@ -3377,6 +3398,9 @@ void e1000e_down(struct e1000_adapter *adapter) ...@@ -3377,6 +3398,9 @@ void e1000e_down(struct e1000_adapter *adapter)
if (!pci_channel_offline(adapter->pdev)) if (!pci_channel_offline(adapter->pdev))
e1000e_reset(adapter); e1000e_reset(adapter);
e1000e_flush_descriptors(adapter);
e1000_clean_tx_ring(adapter); e1000_clean_tx_ring(adapter);
e1000_clean_rx_ring(adapter); e1000_clean_rx_ring(adapter);
...@@ -3765,6 +3789,10 @@ static void e1000e_update_phy_task(struct work_struct *work) ...@@ -3765,6 +3789,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
{ {
struct e1000_adapter *adapter = container_of(work, struct e1000_adapter *adapter = container_of(work,
struct e1000_adapter, update_phy_task); struct e1000_adapter, update_phy_task);
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1000_get_phy_info(&adapter->hw); e1000_get_phy_info(&adapter->hw);
} }
...@@ -3775,6 +3803,10 @@ static void e1000e_update_phy_task(struct work_struct *work) ...@@ -3775,6 +3803,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
static void e1000_update_phy_info(unsigned long data) static void e1000_update_phy_info(unsigned long data)
{ {
struct e1000_adapter *adapter = (struct e1000_adapter *) data; struct e1000_adapter *adapter = (struct e1000_adapter *) data;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
schedule_work(&adapter->update_phy_task); schedule_work(&adapter->update_phy_task);
} }
...@@ -4149,6 +4181,9 @@ static void e1000_watchdog_task(struct work_struct *work) ...@@ -4149,6 +4181,9 @@ static void e1000_watchdog_task(struct work_struct *work)
u32 link, tctl; u32 link, tctl;
int tx_pending = 0; int tx_pending = 0;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
link = e1000e_has_link(adapter); link = e1000e_has_link(adapter);
if ((netif_carrier_ok(netdev)) && link) { if ((netif_carrier_ok(netdev)) && link) {
/* Cancel scheduled suspend requests. */ /* Cancel scheduled suspend requests. */
...@@ -4337,19 +4372,12 @@ static void e1000_watchdog_task(struct work_struct *work) ...@@ -4337,19 +4372,12 @@ static void e1000_watchdog_task(struct work_struct *work)
else else
ew32(ICS, E1000_ICS_RXDMT0); 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 */ /* Force detection of hung controller every watchdog period */
adapter->detect_tx_hung = 1; 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 * With 82571 controllers, LAA may be overwritten due to controller
* reset from the other port. Set the appropriate LAA in RAR[0] * 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) ...@@ -4887,6 +4915,10 @@ static void e1000_reset_task(struct work_struct *work)
struct e1000_adapter *adapter; struct e1000_adapter *adapter;
adapter = container_of(work, struct e1000_adapter, reset_task); 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) && if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
(adapter->flags & FLAG_RX_RESTART_NOW))) { (adapter->flags & FLAG_RX_RESTART_NOW))) {
e1000e_dump(adapter); e1000e_dump(adapter);
......
...@@ -5645,6 +5645,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i ...@@ -5645,6 +5645,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
goto out_error; goto out_error;
} }
netif_carrier_off(dev);
dev_info(&pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, addr %pM\n", 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); 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, ...@@ -159,7 +159,7 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
struct scatterlist *sg; struct scatterlist *sg;
unsigned int i, j, dmacount; unsigned int i, j, dmacount;
unsigned int len; unsigned int len;
static const unsigned int bufflen = 4096; static const unsigned int bufflen = IXGBE_FCBUFF_MIN;
unsigned int firstoff = 0; unsigned int firstoff = 0;
unsigned int lastsize; unsigned int lastsize;
unsigned int thisoff = 0; unsigned int thisoff = 0;
...@@ -254,6 +254,24 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid, ...@@ -254,6 +254,24 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
/* only the last buffer may have non-full bufflen */ /* only the last buffer may have non-full bufflen */
lastsize = thisoff + thislen; 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 = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT);
fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT); fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT);
fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT); fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT);
...@@ -532,6 +550,24 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter) ...@@ -532,6 +550,24 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
e_err(drv, "failed to allocated FCoE DDP pool\n"); e_err(drv, "failed to allocated FCoE DDP pool\n");
spin_lock_init(&fcoe->lock); 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 */ /* Enable L2 eth type filter for FCoE */
...@@ -581,6 +617,14 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter) ...@@ -581,6 +617,14 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
} }
} }
#endif #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) ...@@ -600,6 +644,11 @@ void ixgbe_cleanup_fcoe(struct ixgbe_adapter *adapter)
if (fcoe->pool) { if (fcoe->pool) {
for (i = 0; i < IXGBE_FCOE_DDP_MAX; i++) for (i = 0; i < IXGBE_FCOE_DDP_MAX; i++)
ixgbe_fcoe_ddp_put(adapter->netdev, 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); pci_pool_destroy(fcoe->pool);
fcoe->pool = NULL; fcoe->pool = NULL;
} }
......
...@@ -70,6 +70,8 @@ struct ixgbe_fcoe { ...@@ -70,6 +70,8 @@ struct ixgbe_fcoe {
spinlock_t lock; spinlock_t lock;
struct pci_pool *pool; struct pci_pool *pool;
struct ixgbe_fcoe_ddp ddp[IXGBE_FCOE_DDP_MAX]; 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 */ #endif /* _IXGBE_FCOE_H */
...@@ -3728,7 +3728,8 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter) ...@@ -3728,7 +3728,8 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter)
* We need to try and force an autonegotiation * We need to try and force an autonegotiation
* session, then bring up link. * 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)) if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
schedule_work(&adapter->multispeed_fiber_task); schedule_work(&adapter->multispeed_fiber_task);
} else { } else {
...@@ -5968,7 +5969,8 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work) ...@@ -5968,7 +5969,8 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work)
unregister_netdev(adapter->netdev); unregister_netdev(adapter->netdev);
return; 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)) if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
/* This will also work for DA Twinax connections */ /* This will also work for DA Twinax connections */
......
...@@ -73,7 +73,7 @@ struct pch_gbe_regs { ...@@ -73,7 +73,7 @@ struct pch_gbe_regs {
struct pch_gbe_regs_mac_adr mac_adr[16]; struct pch_gbe_regs_mac_adr mac_adr[16];
u32 ADDR_MASK; u32 ADDR_MASK;
u32 MIIM; u32 MIIM;
u32 reserve2; u32 MAC_ADDR_LOAD;
u32 RGMII_ST; u32 RGMII_ST;
u32 RGMII_CTRL; u32 RGMII_CTRL;
u32 reserve3[3]; u32 reserve3[3];
......
...@@ -29,6 +29,7 @@ const char pch_driver_version[] = DRV_VERSION; ...@@ -29,6 +29,7 @@ const char pch_driver_version[] = DRV_VERSION;
#define PCH_GBE_SHORT_PKT 64 #define PCH_GBE_SHORT_PKT 64
#define DSC_INIT16 0xC000 #define DSC_INIT16 0xC000
#define PCH_GBE_DMA_ALIGN 0 #define PCH_GBE_DMA_ALIGN 0
#define PCH_GBE_DMA_PADDING 2
#define PCH_GBE_WATCHDOG_PERIOD (1 * HZ) /* watchdog time */ #define PCH_GBE_WATCHDOG_PERIOD (1 * HZ) /* watchdog time */
#define PCH_GBE_COPYBREAK_DEFAULT 256 #define PCH_GBE_COPYBREAK_DEFAULT 256
#define PCH_GBE_PCI_BAR 1 #define PCH_GBE_PCI_BAR 1
...@@ -88,6 +89,12 @@ static unsigned int copybreak __read_mostly = PCH_GBE_COPYBREAK_DEFAULT; ...@@ -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 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, static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
int data); 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 * pch_gbe_mac_read_mac_addr - Read MAC address
* @hw: Pointer to the HW structure * @hw: Pointer to the HW structure
...@@ -1365,16 +1372,13 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter, ...@@ -1365,16 +1372,13 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
struct pch_gbe_buffer *buffer_info; struct pch_gbe_buffer *buffer_info;
struct pch_gbe_rx_desc *rx_desc; struct pch_gbe_rx_desc *rx_desc;
u32 length; u32 length;
unsigned char tmp_packet[ETH_HLEN];
unsigned int i; unsigned int i;
unsigned int cleaned_count = 0; unsigned int cleaned_count = 0;
bool cleaned = false; bool cleaned = false;
struct sk_buff *skb; struct sk_buff *skb, *new_skb;
u8 dma_status; u8 dma_status;
u16 gbec_status; u16 gbec_status;
u32 tcp_ip_status; u32 tcp_ip_status;
u8 skb_copy_flag = 0;
u8 skb_padding_flag = 0;
i = rx_ring->next_to_clean; i = rx_ring->next_to_clean;
...@@ -1418,55 +1422,70 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter, ...@@ -1418,55 +1422,70 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
pr_err("Receive CRC Error\n"); pr_err("Receive CRC Error\n");
} else { } else {
/* get receive length */ /* get receive length */
/* length convert[-3], padding[-2] */ /* length convert[-3] */
length = (rx_desc->rx_words_eob) - 3 - 2; length = (rx_desc->rx_words_eob) - 3;
/* Decide the data conversion method */ /* Decide the data conversion method */
if (!adapter->rx_csum) { if (!adapter->rx_csum) {
/* [Header:14][payload] */ /* [Header:14][payload] */
skb_padding_flag = 0; if (NET_IP_ALIGN) {
skb_copy_flag = 1; /* 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);
skb = new_skb;
} else {
/* DMA buffer is used as SKB as it is.*/
buffer_info->skb = NULL;
}
} else { } else {
/* [Header:14][padding:2][payload] */ /* [Header:14][padding:2][payload] */
skb_padding_flag = 1; /* The length includes padding length */
if (length < copybreak) length = length - PCH_GBE_DMA_PADDING;
skb_copy_flag = 1; if ((length < copybreak) ||
else (NET_IP_ALIGN != PCH_GBE_DMA_PADDING)) {
skb_copy_flag = 0; /* Because alignment differs,
} * the new_skb is newly allocated,
* and data is copied to new_skb.
/* Data conversion */ * Padding data is deleted
if (skb_copy_flag) { /* recycle skb */ * at the time of a copy.*/
struct sk_buff *new_skb; new_skb = netdev_alloc_skb(netdev,
new_skb = length + NET_IP_ALIGN);
netdev_alloc_skb(netdev, if (!new_skb) {
length + NET_IP_ALIGN); /* dorrop error */
if (new_skb) { pr_err("New skb allocation "
if (!skb_padding_flag) { "Error\n");
skb_reserve(new_skb, goto dorrop;
NET_IP_ALIGN);
} }
skb_reserve(new_skb, NET_IP_ALIGN);
memcpy(new_skb->data, skb->data, memcpy(new_skb->data, skb->data,
length); ETH_HLEN);
/* save the skb memcpy(&new_skb->data[ETH_HLEN],
* in buffer_info as good */ &skb->data[ETH_HLEN +
PCH_GBE_DMA_PADDING],
length - ETH_HLEN);
skb = new_skb; skb = new_skb;
} else if (!skb_padding_flag) { } else {
/* dorrop error */ /* Padding data is deleted
pr_err("New skb allocation Error\n"); * by moving header data.*/
goto dorrop; memmove(&skb->data[PCH_GBE_DMA_PADDING],
&skb->data[0], ETH_HLEN);
skb_reserve(skb, NET_IP_ALIGN);
buffer_info->skb = NULL;
} }
} else {
buffer_info->skb = NULL;
} }
if (skb_padding_flag) { /* The length includes FCS length */
memcpy(&tmp_packet[0], &skb->data[0], ETH_HLEN); length = length - ETH_FCS_LEN;
memcpy(&skb->data[NET_IP_ALIGN], &tmp_packet[0],
ETH_HLEN);
skb_reserve(skb, NET_IP_ALIGN);
}
/* update status of driver */ /* update status of driver */
adapter->stats.rx_bytes += length; adapter->stats.rx_bytes += length;
adapter->stats.rx_packets++; adapter->stats.rx_packets++;
...@@ -2318,6 +2337,7 @@ static int pch_gbe_probe(struct pci_dev *pdev, ...@@ -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; netdev->features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_GRO;
pch_gbe_set_ethtool_ops(netdev); pch_gbe_set_ethtool_ops(netdev);
pch_gbe_mac_load_mac_addr(&adapter->hw);
pch_gbe_mac_reset_hw(&adapter->hw); pch_gbe_mac_reset_hw(&adapter->hw);
/* setup the private structure */ /* setup the private structure */
......
...@@ -3190,6 +3190,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -3190,6 +3190,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (pci_dev_run_wake(pdev)) if (pci_dev_run_wake(pdev))
pm_runtime_put_noidle(&pdev->dev); pm_runtime_put_noidle(&pdev->dev);
netif_carrier_off(dev);
out: out:
return rc; return rc;
......
...@@ -1560,8 +1560,10 @@ static int stmmac_mac_device_setup(struct net_device *dev) ...@@ -1560,8 +1560,10 @@ static int stmmac_mac_device_setup(struct net_device *dev)
priv->hw = device; priv->hw = device;
if (device_can_wakeup(priv->device)) if (device_can_wakeup(priv->device)) {
priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */ priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */
enable_irq_wake(dev->irq);
}
return 0; return 0;
} }
......
...@@ -11158,7 +11158,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -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) if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
break; /* We have no PHY */ 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; return -EAGAIN;
spin_lock_bh(&tp->lock); spin_lock_bh(&tp->lock);
...@@ -11174,7 +11176,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -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) if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
break; /* We have no PHY */ 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; return -EAGAIN;
spin_lock_bh(&tp->lock); spin_lock_bh(&tp->lock);
......
...@@ -2628,15 +2628,15 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface, ...@@ -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) 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) {
if (tiocmget->urb) { usb_free_urb(tiocmget->urb);
usb_free_urb(tiocmget->urb); tiocmget->urb = NULL;
tiocmget->urb = NULL;
}
serial->tiocmget = NULL; serial->tiocmget = NULL;
kfree(tiocmget); kfree(tiocmget);
} }
} }
......
...@@ -931,8 +931,10 @@ kevent (struct work_struct *work) ...@@ -931,8 +931,10 @@ kevent (struct work_struct *work)
if (urb != NULL) { if (urb != NULL) {
clear_bit (EVENT_RX_MEMORY, &dev->flags); clear_bit (EVENT_RX_MEMORY, &dev->flags);
status = usb_autopm_get_interface(dev->intf); status = usb_autopm_get_interface(dev->intf);
if (status < 0) if (status < 0) {
usb_free_urb(urb);
goto fail_lowmem; goto fail_lowmem;
}
if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK) if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK)
resched = 0; resched = 0;
usb_autopm_put_interface(dev->intf); usb_autopm_put_interface(dev->intf);
......
...@@ -402,72 +402,6 @@ static void iwl3945_accumulative_statistics(struct iwl_priv *priv, ...@@ -402,72 +402,6 @@ static void iwl3945_accumulative_statistics(struct iwl_priv *priv,
} }
#endif #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(&current_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, void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
struct iwl_rx_mem_buffer *rxb) struct iwl_rx_mem_buffer *rxb)
{ {
...@@ -2734,7 +2668,6 @@ static struct iwl_lib_ops iwl3945_lib = { ...@@ -2734,7 +2668,6 @@ static struct iwl_lib_ops iwl3945_lib = {
.isr_ops = { .isr_ops = {
.isr = iwl_isr_legacy, .isr = iwl_isr_legacy,
}, },
.check_plcp_health = iwl3945_good_plcp_health,
.debugfs_ops = { .debugfs_ops = {
.rx_stats_read = iwl3945_ucode_rx_stats_read, .rx_stats_read = iwl3945_ucode_rx_stats_read,
......
...@@ -859,6 +859,7 @@ static void __l2cap_sock_close(struct sock *sk, int reason) ...@@ -859,6 +859,7 @@ static void __l2cap_sock_close(struct sock *sk, int reason)
result = L2CAP_CR_SEC_BLOCK; result = L2CAP_CR_SEC_BLOCK;
else else
result = L2CAP_CR_BAD_PSM; result = L2CAP_CR_BAD_PSM;
sk->sk_state = BT_DISCONN;
rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
......
...@@ -80,7 +80,7 @@ int br_handle_frame_finish(struct sk_buff *skb) ...@@ -80,7 +80,7 @@ int br_handle_frame_finish(struct sk_buff *skb)
if (is_multicast_ether_addr(dest)) { if (is_multicast_ether_addr(dest)) {
mdst = br_mdb_get(br, skb); mdst = br_mdb_get(br, skb);
if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(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)) br_multicast_is_router(br))
skb2 = skb; skb2 = skb;
br_multicast_forward(mdst, skb, skb2); br_multicast_forward(mdst, skb, skb2);
......
...@@ -232,8 +232,7 @@ static void br_multicast_group_expired(unsigned long data) ...@@ -232,8 +232,7 @@ static void br_multicast_group_expired(unsigned long data)
if (!netif_running(br->dev) || timer_pending(&mp->timer)) if (!netif_running(br->dev) || timer_pending(&mp->timer))
goto out; goto out;
if (!hlist_unhashed(&mp->mglist)) mp->mglist = false;
hlist_del_init(&mp->mglist);
if (mp->ports) if (mp->ports)
goto out; goto out;
...@@ -276,7 +275,7 @@ static void br_multicast_del_pg(struct net_bridge *br, ...@@ -276,7 +275,7 @@ static void br_multicast_del_pg(struct net_bridge *br,
del_timer(&p->query_timer); del_timer(&p->query_timer);
call_rcu_bh(&p->rcu, br_multicast_free_pg); 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)) netif_running(br->dev))
mod_timer(&mp->timer, jiffies); mod_timer(&mp->timer, jiffies);
...@@ -528,7 +527,7 @@ static void br_multicast_group_query_expired(unsigned long data) ...@@ -528,7 +527,7 @@ static void br_multicast_group_query_expired(unsigned long data)
struct net_bridge *br = mp->br; struct net_bridge *br = mp->br;
spin_lock(&br->multicast_lock); 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) mp->queries_sent >= br->multicast_last_member_count)
goto out; goto out;
...@@ -719,7 +718,7 @@ static int br_multicast_add_group(struct net_bridge *br, ...@@ -719,7 +718,7 @@ static int br_multicast_add_group(struct net_bridge *br,
goto err; goto err;
if (!port) { if (!port) {
hlist_add_head(&mp->mglist, &br->mglist); mp->mglist = true;
mod_timer(&mp->timer, now + br->multicast_membership_interval); mod_timer(&mp->timer, now + br->multicast_membership_interval);
goto out; goto out;
} }
...@@ -1165,7 +1164,7 @@ static int br_ip4_multicast_query(struct net_bridge *br, ...@@ -1165,7 +1164,7 @@ static int br_ip4_multicast_query(struct net_bridge *br,
max_delay *= br->multicast_last_member_count; max_delay *= br->multicast_last_member_count;
if (!hlist_unhashed(&mp->mglist) && if (mp->mglist &&
(timer_pending(&mp->timer) ? (timer_pending(&mp->timer) ?
time_after(mp->timer.expires, now + max_delay) : time_after(mp->timer.expires, now + max_delay) :
try_to_del_timer_sync(&mp->timer) >= 0)) try_to_del_timer_sync(&mp->timer) >= 0))
...@@ -1177,7 +1176,7 @@ static int br_ip4_multicast_query(struct net_bridge *br, ...@@ -1177,7 +1176,7 @@ static int br_ip4_multicast_query(struct net_bridge *br,
if (timer_pending(&p->timer) ? if (timer_pending(&p->timer) ?
time_after(p->timer.expires, now + max_delay) : time_after(p->timer.expires, now + max_delay) :
try_to_del_timer_sync(&p->timer) >= 0) try_to_del_timer_sync(&p->timer) >= 0)
mod_timer(&mp->timer, now + max_delay); mod_timer(&p->timer, now + max_delay);
} }
out: out:
...@@ -1236,7 +1235,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, ...@@ -1236,7 +1235,7 @@ static int br_ip6_multicast_query(struct net_bridge *br,
goto out; goto out;
max_delay *= br->multicast_last_member_count; max_delay *= br->multicast_last_member_count;
if (!hlist_unhashed(&mp->mglist) && if (mp->mglist &&
(timer_pending(&mp->timer) ? (timer_pending(&mp->timer) ?
time_after(mp->timer.expires, now + max_delay) : time_after(mp->timer.expires, now + max_delay) :
try_to_del_timer_sync(&mp->timer) >= 0)) try_to_del_timer_sync(&mp->timer) >= 0))
...@@ -1248,7 +1247,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, ...@@ -1248,7 +1247,7 @@ static int br_ip6_multicast_query(struct net_bridge *br,
if (timer_pending(&p->timer) ? if (timer_pending(&p->timer) ?
time_after(p->timer.expires, now + max_delay) : time_after(p->timer.expires, now + max_delay) :
try_to_del_timer_sync(&p->timer) >= 0) try_to_del_timer_sync(&p->timer) >= 0)
mod_timer(&mp->timer, now + max_delay); mod_timer(&p->timer, now + max_delay);
} }
out: out:
...@@ -1283,7 +1282,7 @@ static void br_multicast_leave_group(struct net_bridge *br, ...@@ -1283,7 +1282,7 @@ static void br_multicast_leave_group(struct net_bridge *br,
br->multicast_last_member_interval; br->multicast_last_member_interval;
if (!port) { if (!port) {
if (!hlist_unhashed(&mp->mglist) && if (mp->mglist &&
(timer_pending(&mp->timer) ? (timer_pending(&mp->timer) ?
time_after(mp->timer.expires, time) : time_after(mp->timer.expires, time) :
try_to_del_timer_sync(&mp->timer) >= 0)) { try_to_del_timer_sync(&mp->timer) >= 0)) {
......
...@@ -84,13 +84,13 @@ struct net_bridge_port_group { ...@@ -84,13 +84,13 @@ struct net_bridge_port_group {
struct net_bridge_mdb_entry struct net_bridge_mdb_entry
{ {
struct hlist_node hlist[2]; struct hlist_node hlist[2];
struct hlist_node mglist;
struct net_bridge *br; struct net_bridge *br;
struct net_bridge_port_group __rcu *ports; struct net_bridge_port_group __rcu *ports;
struct rcu_head rcu; struct rcu_head rcu;
struct timer_list timer; struct timer_list timer;
struct timer_list query_timer; struct timer_list query_timer;
struct br_ip addr; struct br_ip addr;
bool mglist;
u32 queries_sent; u32 queries_sent;
}; };
...@@ -238,7 +238,6 @@ struct net_bridge ...@@ -238,7 +238,6 @@ struct net_bridge
spinlock_t multicast_lock; spinlock_t multicast_lock;
struct net_bridge_mdb_htable __rcu *mdb; struct net_bridge_mdb_htable __rcu *mdb;
struct hlist_head router_list; struct hlist_head router_list;
struct hlist_head mglist;
struct timer_list multicast_router_timer; struct timer_list multicast_router_timer;
struct timer_list multicast_querier_timer; struct timer_list multicast_querier_timer;
......
...@@ -1280,10 +1280,13 @@ static int __dev_close_many(struct list_head *head) ...@@ -1280,10 +1280,13 @@ static int __dev_close_many(struct list_head *head)
static int __dev_close(struct net_device *dev) static int __dev_close(struct net_device *dev)
{ {
int retval;
LIST_HEAD(single); LIST_HEAD(single);
list_add(&dev->unreg_list, &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) int dev_close_many(struct list_head *head)
...@@ -1325,7 +1328,7 @@ int dev_close(struct net_device *dev) ...@@ -1325,7 +1328,7 @@ int dev_close(struct net_device *dev)
list_add(&dev->unreg_list, &single); list_add(&dev->unreg_list, &single);
dev_close_many(&single); dev_close_many(&single);
list_del(&single);
return 0; return 0;
} }
EXPORT_SYMBOL(dev_close); EXPORT_SYMBOL(dev_close);
...@@ -5063,6 +5066,7 @@ static void rollback_registered(struct net_device *dev) ...@@ -5063,6 +5066,7 @@ static void rollback_registered(struct net_device *dev)
list_add(&dev->unreg_list, &single); list_add(&dev->unreg_list, &single);
rollback_registered_many(&single); rollback_registered_many(&single);
list_del(&single);
} }
unsigned long netdev_fix_features(unsigned long features, const char *name) 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) ...@@ -6216,6 +6220,7 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list)
} }
} }
unregister_netdevice_many(&dev_kill_list); unregister_netdevice_many(&dev_kill_list);
list_del(&dev_kill_list);
rtnl_unlock(); rtnl_unlock();
} }
......
...@@ -626,6 +626,9 @@ static int dcbnl_getapp(struct net_device *netdev, struct nlattr **tb, ...@@ -626,6 +626,9 @@ static int dcbnl_getapp(struct net_device *netdev, struct nlattr **tb,
dcb->cmd = DCB_CMD_GAPP; dcb->cmd = DCB_CMD_GAPP;
app_nest = nla_nest_start(dcbnl_skb, DCB_ATTR_APP); 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); ret = nla_put_u8(dcbnl_skb, DCB_APP_ATTR_IDTYPE, idtype);
if (ret) if (ret)
goto out_cancel; goto out_cancel;
...@@ -1613,6 +1616,10 @@ EXPORT_SYMBOL(dcb_getapp); ...@@ -1613,6 +1616,10 @@ EXPORT_SYMBOL(dcb_getapp);
u8 dcb_setapp(struct net_device *dev, struct dcb_app *new) u8 dcb_setapp(struct net_device *dev, struct dcb_app *new)
{ {
struct dcb_app_type *itr; 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); spin_lock(&dcb_lock);
/* Search for existing match and replace */ /* Search for existing match and replace */
...@@ -1644,7 +1651,7 @@ u8 dcb_setapp(struct net_device *dev, struct dcb_app *new) ...@@ -1644,7 +1651,7 @@ u8 dcb_setapp(struct net_device *dev, struct dcb_app *new)
} }
out: out:
spin_unlock(&dcb_lock); spin_unlock(&dcb_lock);
call_dcbevent_notifiers(DCB_APP_EVENT, new); call_dcbevent_notifiers(DCB_APP_EVENT, &event);
return 0; return 0;
} }
EXPORT_SYMBOL(dcb_setapp); EXPORT_SYMBOL(dcb_setapp);
......
...@@ -1030,6 +1030,21 @@ static inline bool inetdev_valid_mtu(unsigned mtu) ...@@ -1030,6 +1030,21 @@ static inline bool inetdev_valid_mtu(unsigned mtu)
return mtu >= 68; 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 */ /* Called only under RTNL semaphore */
static int inetdev_event(struct notifier_block *this, unsigned long event, 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, ...@@ -1082,18 +1097,13 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,
} }
ip_mc_up(in_dev); ip_mc_up(in_dev);
/* fall through */ /* fall through */
case NETDEV_NOTIFY_PEERS:
case NETDEV_CHANGEADDR: 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 */ /* Send gratuitous ARP to notify of link change */
if (IN_DEV_ARP_NOTIFY(in_dev)) { inetdev_send_gratuitous_arp(dev, 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);
}
break; break;
case NETDEV_DOWN: case NETDEV_DOWN:
ip_mc_down(in_dev); ip_mc_down(in_dev);
......
...@@ -775,6 +775,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -775,6 +775,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
.fl4_dst = dst, .fl4_dst = dst,
.fl4_src = tiph->saddr, .fl4_src = tiph->saddr,
.fl4_tos = RT_TOS(tos), .fl4_tos = RT_TOS(tos),
.proto = IPPROTO_GRE,
.fl_gre_key = tunnel->parms.o_key .fl_gre_key = tunnel->parms.o_key
}; };
if (ip_route_output_key(dev_net(dev), &rt, &fl)) { if (ip_route_output_key(dev_net(dev), &rt, &fl)) {
......
...@@ -2722,6 +2722,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = { ...@@ -2722,6 +2722,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
.destroy = ipv4_dst_destroy, .destroy = ipv4_dst_destroy,
.check = ipv4_blackhole_dst_check, .check = ipv4_blackhole_dst_check,
.default_mtu = ipv4_blackhole_default_mtu, .default_mtu = ipv4_blackhole_default_mtu,
.default_advmss = ipv4_default_advmss,
.update_pmtu = ipv4_rt_blackhole_update_pmtu, .update_pmtu = ipv4_rt_blackhole_update_pmtu,
}; };
......
...@@ -128,6 +128,7 @@ static struct dst_ops ip6_dst_blackhole_ops = { ...@@ -128,6 +128,7 @@ static struct dst_ops ip6_dst_blackhole_ops = {
.destroy = ip6_dst_destroy, .destroy = ip6_dst_destroy,
.check = ip6_dst_check, .check = ip6_dst_check,
.default_mtu = ip6_blackhole_default_mtu, .default_mtu = ip6_blackhole_default_mtu,
.default_advmss = ip6_default_advmss,
.update_pmtu = ip6_rt_blackhole_update_pmtu, .update_pmtu = ip6_rt_blackhole_update_pmtu,
}; };
......
...@@ -1210,7 +1210,9 @@ int ieee80211_reconfig(struct ieee80211_local *local) ...@@ -1210,7 +1210,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
switch (sdata->vif.type) { switch (sdata->vif.type) {
case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_STATION:
changed |= BSS_CHANGED_ASSOC; changed |= BSS_CHANGED_ASSOC;
mutex_lock(&sdata->u.mgd.mtx);
ieee80211_bss_info_change_notify(sdata, changed); ieee80211_bss_info_change_notify(sdata, changed);
mutex_unlock(&sdata->u.mgd.mtx);
break; break;
case NL80211_IFTYPE_ADHOC: case NL80211_IFTYPE_ADHOC:
changed |= BSS_CHANGED_IBSS; changed |= BSS_CHANGED_IBSS;
......
...@@ -133,6 +133,7 @@ unsigned int nf_iterate(struct list_head *head, ...@@ -133,6 +133,7 @@ unsigned int nf_iterate(struct list_head *head,
/* Optimization: we don't need to hold module /* Optimization: we don't need to hold module
reference here, since function can't sleep. --RR */ reference here, since function can't sleep. --RR */
repeat:
verdict = elem->hook(hook, skb, indev, outdev, okfn); verdict = elem->hook(hook, skb, indev, outdev, okfn);
if (verdict != NF_ACCEPT) { if (verdict != NF_ACCEPT) {
#ifdef CONFIG_NETFILTER_DEBUG #ifdef CONFIG_NETFILTER_DEBUG
...@@ -145,7 +146,7 @@ unsigned int nf_iterate(struct list_head *head, ...@@ -145,7 +146,7 @@ unsigned int nf_iterate(struct list_head *head,
#endif #endif
if (verdict != NF_REPEAT) if (verdict != NF_REPEAT)
return verdict; return verdict;
*i = (*i)->prev; goto repeat;
} }
} }
return NF_ACCEPT; return NF_ACCEPT;
......
...@@ -1340,10 +1340,13 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family) ...@@ -1340,10 +1340,13 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)
default: default:
BUG(); BUG();
} }
xdst = dst_alloc(dst_ops) ?: ERR_PTR(-ENOBUFS); xdst = dst_alloc(dst_ops);
xfrm_policy_put_afinfo(afinfo); 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; return xdst;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册