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
@ -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,7 +866,8 @@ 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) {
|
||||||
|
if (net_ratelimit())
|
||||||
dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
|
dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
@ -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[] = {
|
|||||||
/* 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
|
|||||||
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)
|
|||||||
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)
|
|||||||
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;
|
|
||||||
if (p1 >= i)
|
|
||||||
memcpy(skb_push(skb, i), header, 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
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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,
|
|||||||
/*
|
/*
|
||||||
* 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,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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 @@ err_release_regions:
|
|||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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 = {
|
|||||||
.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)
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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 @@ link_up:
|
|||||||
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)
|
|||||||
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
|
|||||||
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,
|
|||||||
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,
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#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)
|
|||||||
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 {
|
|||||||
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,6 +3728,7 @@ 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.
|
||||||
*/
|
*/
|
||||||
|
if (hw->mac.ops.setup_sfp)
|
||||||
hw->mac.ops.setup_sfp(hw);
|
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);
|
||||||
@ -5968,6 +5969,7 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work)
|
|||||||
unregister_netdev(adapter->netdev);
|
unregister_netdev(adapter->netdev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (hw->mac.ops.setup_sfp)
|
||||||
hw->mac.ops.setup_sfp(hw);
|
hw->mac.ops.setup_sfp(hw);
|
||||||
|
|
||||||
if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
|
if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
|
||||||
|
@ -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;
|
|||||||
#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;
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
||||||
} else {
|
* the new_skb is newly allocated,
|
||||||
/* [Header:14][padding:2][payload] */
|
* and data is copied to new_skb.*/
|
||||||
skb_padding_flag = 1;
|
new_skb = netdev_alloc_skb(netdev,
|
||||||
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);
|
length + NET_IP_ALIGN);
|
||||||
if (new_skb) {
|
if (!new_skb) {
|
||||||
if (!skb_padding_flag) {
|
|
||||||
skb_reserve(new_skb,
|
|
||||||
NET_IP_ALIGN);
|
|
||||||
}
|
|
||||||
memcpy(new_skb->data, skb->data,
|
|
||||||
length);
|
|
||||||
/* save the skb
|
|
||||||
* in buffer_info as good */
|
|
||||||
skb = new_skb;
|
|
||||||
} else if (!skb_padding_flag) {
|
|
||||||
/* dorrop error */
|
/* dorrop error */
|
||||||
pr_err("New skb allocation Error\n");
|
pr_err("New skb allocation "
|
||||||
|
"Error\n");
|
||||||
goto dorrop;
|
goto dorrop;
|
||||||
}
|
}
|
||||||
|
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||||
|
memcpy(new_skb->data, skb->data,
|
||||||
|
length);
|
||||||
|
skb = new_skb;
|
||||||
} else {
|
} else {
|
||||||
|
/* DMA buffer is used as SKB as it is.*/
|
||||||
buffer_info->skb = NULL;
|
buffer_info->skb = NULL;
|
||||||
}
|
}
|
||||||
if (skb_padding_flag) {
|
} else {
|
||||||
memcpy(&tmp_packet[0], &skb->data[0], ETH_HLEN);
|
/* [Header:14][padding:2][payload] */
|
||||||
memcpy(&skb->data[NET_IP_ALIGN], &tmp_packet[0],
|
/* The length includes padding length */
|
||||||
ETH_HLEN);
|
length = length - PCH_GBE_DMA_PADDING;
|
||||||
skb_reserve(skb, NET_IP_ALIGN);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* The length includes FCS length */
|
||||||
|
length = length - ETH_FCS_LEN;
|
||||||
/* 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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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 @@ exit:
|
|||||||
|
|
||||||
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 @@ fail_halt:
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
#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(¤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,
|
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 = {
|
|||||||
.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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 {
|
|||||||
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
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
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,
|
|||||||
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);
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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
|
|||||||
.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 = {
|
|||||||
.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 = {
|
|||||||
.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)
|
|||||||
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,
|
|||||||
|
|
||||||
/* 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,
|
|||||||
#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)
|
|||||||
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);
|
||||||
|
|
||||||
|
if (likely(xdst))
|
||||||
xdst->flo.ops = &xfrm_bundle_fc_ops;
|
xdst->flo.ops = &xfrm_bundle_fc_ops;
|
||||||
|
else
|
||||||
|
xdst = ERR_PTR(-ENOBUFS);
|
||||||
|
|
||||||
return xdst;
|
return xdst;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user