Commit 9f6d98c2 authored by David S. Miller's avatar David S. Miller

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Conflicts:
	drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c

The bnx2x gso_type setting bug fix in 'net' conflicted with
changes in 'net-next' that broke the gso_* setting logic
out into a seperate function, which also fixes the bug in
question.  Thus, use the 'net-next' version.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents db98f081 9c10f411
...@@ -1399,6 +1399,7 @@ static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring, ...@@ -1399,6 +1399,7 @@ static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring,
/* set gso_size to avoid messing up TCP MSS */ /* set gso_size to avoid messing up TCP MSS */
skb_shinfo(skb)->gso_size = DIV_ROUND_UP((skb->len - hdr_len), skb_shinfo(skb)->gso_size = DIV_ROUND_UP((skb->len - hdr_len),
IXGBE_CB(skb)->append_cnt); IXGBE_CB(skb)->append_cnt);
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
} }
static void ixgbe_update_rsc_stats(struct ixgbe_ring *rx_ring, static void ixgbe_update_rsc_stats(struct ixgbe_ring *rx_ring,
......
...@@ -1043,8 +1043,13 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter, ...@@ -1043,8 +1043,13 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter,
th->seq = htonl(seq_number); th->seq = htonl(seq_number);
length = skb->len; length = skb->len;
if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP) if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP) {
skb_shinfo(skb)->gso_size = qlcnic_get_lro_sts_mss(sts_data1); skb_shinfo(skb)->gso_size = qlcnic_get_lro_sts_mss(sts_data1);
if (skb->protocol == htons(ETH_P_IPV6))
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
else
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
}
if (vid != 0xffff) if (vid != 0xffff)
__vlan_hwaccel_put_tag(skb, vid); __vlan_hwaccel_put_tag(skb, vid);
......
...@@ -450,7 +450,6 @@ enum rtl8168_registers { ...@@ -450,7 +450,6 @@ enum rtl8168_registers {
#define PWM_EN (1 << 22) #define PWM_EN (1 << 22)
#define RXDV_GATED_EN (1 << 19) #define RXDV_GATED_EN (1 << 19)
#define EARLY_TALLY_EN (1 << 16) #define EARLY_TALLY_EN (1 << 16)
#define FORCE_CLK (1 << 15) /* force clock request */
}; };
enum rtl_register_content { enum rtl_register_content {
...@@ -514,7 +513,6 @@ enum rtl_register_content { ...@@ -514,7 +513,6 @@ enum rtl_register_content {
PMEnable = (1 << 0), /* Power Management Enable */ PMEnable = (1 << 0), /* Power Management Enable */
/* Config2 register p. 25 */ /* Config2 register p. 25 */
ClkReqEn = (1 << 7), /* Clock Request Enable */
MSIEnable = (1 << 5), /* 8169 only. Reserved in the 8168. */ MSIEnable = (1 << 5), /* 8169 only. Reserved in the 8168. */
PCI_Clock_66MHz = 0x01, PCI_Clock_66MHz = 0x01,
PCI_Clock_33MHz = 0x00, PCI_Clock_33MHz = 0x00,
...@@ -535,7 +533,6 @@ enum rtl_register_content { ...@@ -535,7 +533,6 @@ enum rtl_register_content {
Spi_en = (1 << 3), Spi_en = (1 << 3),
LanWake = (1 << 1), /* LanWake enable/disable */ LanWake = (1 << 1), /* LanWake enable/disable */
PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */ PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */
ASPM_en = (1 << 0), /* ASPM enable */
/* TBICSR p.28 */ /* TBICSR p.28 */
TBIReset = 0x80000000, TBIReset = 0x80000000,
...@@ -684,7 +681,6 @@ enum features { ...@@ -684,7 +681,6 @@ enum features {
RTL_FEATURE_WOL = (1 << 0), RTL_FEATURE_WOL = (1 << 0),
RTL_FEATURE_MSI = (1 << 1), RTL_FEATURE_MSI = (1 << 1),
RTL_FEATURE_GMII = (1 << 2), RTL_FEATURE_GMII = (1 << 2),
RTL_FEATURE_FW_LOADED = (1 << 3),
}; };
struct rtl8169_counters { struct rtl8169_counters {
...@@ -2388,10 +2384,8 @@ static void rtl_apply_firmware(struct rtl8169_private *tp) ...@@ -2388,10 +2384,8 @@ static void rtl_apply_firmware(struct rtl8169_private *tp)
struct rtl_fw *rtl_fw = tp->rtl_fw; struct rtl_fw *rtl_fw = tp->rtl_fw;
/* TODO: release firmware once rtl_phy_write_fw signals failures. */ /* TODO: release firmware once rtl_phy_write_fw signals failures. */
if (!IS_ERR_OR_NULL(rtl_fw)) { if (!IS_ERR_OR_NULL(rtl_fw))
rtl_phy_write_fw(tp, rtl_fw); rtl_phy_write_fw(tp, rtl_fw);
tp->features |= RTL_FEATURE_FW_LOADED;
}
} }
static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
...@@ -2402,31 +2396,6 @@ static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) ...@@ -2402,31 +2396,6 @@ static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
rtl_apply_firmware(tp); rtl_apply_firmware(tp);
} }
static void r810x_aldps_disable(struct rtl8169_private *tp)
{
rtl_writephy(tp, 0x1f, 0x0000);
rtl_writephy(tp, 0x18, 0x0310);
msleep(100);
}
static void r810x_aldps_enable(struct rtl8169_private *tp)
{
if (!(tp->features & RTL_FEATURE_FW_LOADED))
return;
rtl_writephy(tp, 0x1f, 0x0000);
rtl_writephy(tp, 0x18, 0x8310);
}
static void r8168_aldps_enable_1(struct rtl8169_private *tp)
{
if (!(tp->features & RTL_FEATURE_FW_LOADED))
return;
rtl_writephy(tp, 0x1f, 0x0000);
rtl_w1w0_phy(tp, 0x15, 0x1000, 0x0000);
}
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp) static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
{ {
static const struct phy_reg phy_reg_init[] = { static const struct phy_reg phy_reg_init[] = {
...@@ -3217,8 +3186,6 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp) ...@@ -3217,8 +3186,6 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400); rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
rtl_writephy(tp, 0x1f, 0x0000); rtl_writephy(tp, 0x1f, 0x0000);
r8168_aldps_enable_1(tp);
/* Broken BIOS workaround: feed GigaMAC registers with MAC address. */ /* Broken BIOS workaround: feed GigaMAC registers with MAC address. */
rtl_rar_exgmac_set(tp, tp->dev->dev_addr); rtl_rar_exgmac_set(tp, tp->dev->dev_addr);
} }
...@@ -3293,8 +3260,6 @@ static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp) ...@@ -3293,8 +3260,6 @@ static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp)
rtl_writephy(tp, 0x05, 0x8b85); rtl_writephy(tp, 0x05, 0x8b85);
rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000); rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000);
rtl_writephy(tp, 0x1f, 0x0000); rtl_writephy(tp, 0x1f, 0x0000);
r8168_aldps_enable_1(tp);
} }
static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp) static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
...@@ -3302,8 +3267,6 @@ static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp) ...@@ -3302,8 +3267,6 @@ static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
rtl_apply_firmware(tp); rtl_apply_firmware(tp);
rtl8168f_hw_phy_config(tp); rtl8168f_hw_phy_config(tp);
r8168_aldps_enable_1(tp);
} }
static void rtl8411_hw_phy_config(struct rtl8169_private *tp) static void rtl8411_hw_phy_config(struct rtl8169_private *tp)
...@@ -3401,8 +3364,6 @@ static void rtl8411_hw_phy_config(struct rtl8169_private *tp) ...@@ -3401,8 +3364,6 @@ static void rtl8411_hw_phy_config(struct rtl8169_private *tp)
rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001); rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001);
rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400); rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
rtl_writephy(tp, 0x1f, 0x0000); rtl_writephy(tp, 0x1f, 0x0000);
r8168_aldps_enable_1(tp);
} }
static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp) static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp)
...@@ -3488,19 +3449,21 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp) ...@@ -3488,19 +3449,21 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
}; };
/* Disable ALDPS before ram code */ /* Disable ALDPS before ram code */
r810x_aldps_disable(tp); rtl_writephy(tp, 0x1f, 0x0000);
rtl_writephy(tp, 0x18, 0x0310);
msleep(100);
rtl_apply_firmware(tp); rtl_apply_firmware(tp);
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
r810x_aldps_enable(tp);
} }
static void rtl8402_hw_phy_config(struct rtl8169_private *tp) static void rtl8402_hw_phy_config(struct rtl8169_private *tp)
{ {
/* Disable ALDPS before setting firmware */ /* Disable ALDPS before setting firmware */
r810x_aldps_disable(tp); rtl_writephy(tp, 0x1f, 0x0000);
rtl_writephy(tp, 0x18, 0x0310);
msleep(20);
rtl_apply_firmware(tp); rtl_apply_firmware(tp);
...@@ -3510,8 +3473,6 @@ static void rtl8402_hw_phy_config(struct rtl8169_private *tp) ...@@ -3510,8 +3473,6 @@ static void rtl8402_hw_phy_config(struct rtl8169_private *tp)
rtl_writephy(tp, 0x10, 0x401f); rtl_writephy(tp, 0x10, 0x401f);
rtl_writephy(tp, 0x19, 0x7030); rtl_writephy(tp, 0x19, 0x7030);
rtl_writephy(tp, 0x1f, 0x0000); rtl_writephy(tp, 0x1f, 0x0000);
r810x_aldps_enable(tp);
} }
static void rtl8106e_hw_phy_config(struct rtl8169_private *tp) static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
...@@ -3524,7 +3485,9 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp) ...@@ -3524,7 +3485,9 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
}; };
/* Disable ALDPS before ram code */ /* Disable ALDPS before ram code */
r810x_aldps_disable(tp); rtl_writephy(tp, 0x1f, 0x0000);
rtl_writephy(tp, 0x18, 0x0310);
msleep(100);
rtl_apply_firmware(tp); rtl_apply_firmware(tp);
...@@ -3532,8 +3495,6 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp) ...@@ -3532,8 +3495,6 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
r810x_aldps_enable(tp);
} }
static void rtl_hw_phy_config(struct net_device *dev) static void rtl_hw_phy_config(struct net_device *dev)
...@@ -5050,6 +5011,8 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp) ...@@ -5050,6 +5011,8 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
RTL_W8(MaxTxPacketSize, EarlySize); RTL_W8(MaxTxPacketSize, EarlySize);
rtl_disable_clock_request(pdev);
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
...@@ -5058,8 +5021,7 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp) ...@@ -5058,8 +5021,7 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
RTL_W32(MISC, RTL_R32(MISC) | PWM_EN); RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en); RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
} }
static void rtl_hw_start_8168f(struct rtl8169_private *tp) static void rtl_hw_start_8168f(struct rtl8169_private *tp)
...@@ -5084,12 +5046,13 @@ static void rtl_hw_start_8168f(struct rtl8169_private *tp) ...@@ -5084,12 +5046,13 @@ static void rtl_hw_start_8168f(struct rtl8169_private *tp)
RTL_W8(MaxTxPacketSize, EarlySize); RTL_W8(MaxTxPacketSize, EarlySize);
rtl_disable_clock_request(pdev);
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
RTL_W32(MISC, RTL_R32(MISC) | PWM_EN | FORCE_CLK); RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en); RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
} }
static void rtl_hw_start_8168f_1(struct rtl8169_private *tp) static void rtl_hw_start_8168f_1(struct rtl8169_private *tp)
...@@ -5146,10 +5109,8 @@ static void rtl_hw_start_8168g_1(struct rtl8169_private *tp) ...@@ -5146,10 +5109,8 @@ static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)
rtl_w1w0_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC); rtl_w1w0_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
RTL_W32(MISC, (RTL_R32(MISC) | FORCE_CLK) & ~RXDV_GATED_EN); RTL_W32(MISC, RTL_R32(MISC) & ~RXDV_GATED_EN);
RTL_W8(MaxTxPacketSize, EarlySize); RTL_W8(MaxTxPacketSize, EarlySize);
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
...@@ -5365,9 +5326,6 @@ static void rtl_hw_start_8105e_1(struct rtl8169_private *tp) ...@@ -5365,9 +5326,6 @@ static void rtl_hw_start_8105e_1(struct rtl8169_private *tp)
RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET); RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK);
rtl_ephy_init(tp, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1)); rtl_ephy_init(tp, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
} }
...@@ -5393,9 +5351,6 @@ static void rtl_hw_start_8402(struct rtl8169_private *tp) ...@@ -5393,9 +5351,6 @@ static void rtl_hw_start_8402(struct rtl8169_private *tp)
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO); RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK);
rtl_ephy_init(tp, e_info_8402, ARRAY_SIZE(e_info_8402)); rtl_ephy_init(tp, e_info_8402, ARRAY_SIZE(e_info_8402));
...@@ -5417,10 +5372,7 @@ static void rtl_hw_start_8106(struct rtl8169_private *tp) ...@@ -5417,10 +5372,7 @@ static void rtl_hw_start_8106(struct rtl8169_private *tp)
/* Force LAN exit from ASPM if Rx/Tx are not idle */ /* Force LAN exit from ASPM if Rx/Tx are not idle */
RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800); RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
RTL_W32(MISC, RTL_W32(MISC, (RTL_R32(MISC) | DISABLE_LAN_EN) & ~EARLY_TALLY_EN);
(RTL_R32(MISC) | DISABLE_LAN_EN | FORCE_CLK) & ~EARLY_TALLY_EN);
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET); RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN); RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN);
} }
......
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
#undef STMMAC_XMIT_DEBUG #undef STMMAC_XMIT_DEBUG
/*#define STMMAC_XMIT_DEBUG*/ /*#define STMMAC_XMIT_DEBUG*/
#ifdef STMMAC_TX_DEBUG #ifdef STMMAC_XMIT_DEBUG
#define TX_DBG(fmt, args...) printk(fmt, ## args) #define TX_DBG(fmt, args...) printk(fmt, ## args)
#else #else
#define TX_DBG(fmt, args...) do { } while (0) #define TX_DBG(fmt, args...) do { } while (0)
......
...@@ -188,8 +188,6 @@ int stmmac_mdio_register(struct net_device *ndev) ...@@ -188,8 +188,6 @@ int stmmac_mdio_register(struct net_device *ndev)
goto bus_register_fail; goto bus_register_fail;
} }
priv->mii = new_bus;
found = 0; found = 0;
for (addr = 0; addr < PHY_MAX_ADDR; addr++) { for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
struct phy_device *phydev = new_bus->phy_map[addr]; struct phy_device *phydev = new_bus->phy_map[addr];
...@@ -237,8 +235,14 @@ int stmmac_mdio_register(struct net_device *ndev) ...@@ -237,8 +235,14 @@ int stmmac_mdio_register(struct net_device *ndev)
} }
} }
if (!found) if (!found) {
pr_warning("%s: No PHY found\n", ndev->name); pr_warning("%s: No PHY found\n", ndev->name);
mdiobus_unregister(new_bus);
mdiobus_free(new_bus);
return -ENODEV;
}
priv->mii = new_bus;
return 0; return 0;
......
...@@ -411,6 +411,7 @@ static const struct usb_device_id products[] = { ...@@ -411,6 +411,7 @@ static const struct usb_device_id products[] = {
}, },
/* 3. Combined interface devices matching on interface number */ /* 3. Combined interface devices matching on interface number */
{QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
{QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */
{QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, {QMI_FIXED_INTF(0x19d2, 0x0002, 1)},
{QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, {QMI_FIXED_INTF(0x19d2, 0x0012, 1)},
......
...@@ -334,20 +334,20 @@ struct mwl8k_sta { ...@@ -334,20 +334,20 @@ struct mwl8k_sta {
#define MWL8K_STA(_sta) ((struct mwl8k_sta *)&((_sta)->drv_priv)) #define MWL8K_STA(_sta) ((struct mwl8k_sta *)&((_sta)->drv_priv))
static const struct ieee80211_channel mwl8k_channels_24[] = { static const struct ieee80211_channel mwl8k_channels_24[] = {
{ .center_freq = 2412, .hw_value = 1, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2412, .hw_value = 1, },
{ .center_freq = 2417, .hw_value = 2, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2417, .hw_value = 2, },
{ .center_freq = 2422, .hw_value = 3, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2422, .hw_value = 3, },
{ .center_freq = 2427, .hw_value = 4, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2427, .hw_value = 4, },
{ .center_freq = 2432, .hw_value = 5, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2432, .hw_value = 5, },
{ .center_freq = 2437, .hw_value = 6, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2437, .hw_value = 6, },
{ .center_freq = 2442, .hw_value = 7, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2442, .hw_value = 7, },
{ .center_freq = 2447, .hw_value = 8, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2447, .hw_value = 8, },
{ .center_freq = 2452, .hw_value = 9, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2452, .hw_value = 9, },
{ .center_freq = 2457, .hw_value = 10, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2457, .hw_value = 10, },
{ .center_freq = 2462, .hw_value = 11, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2462, .hw_value = 11, },
{ .center_freq = 2467, .hw_value = 12, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2467, .hw_value = 12, },
{ .center_freq = 2472, .hw_value = 13, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2472, .hw_value = 13, },
{ .center_freq = 2484, .hw_value = 14, }, { .band = IEEE80211_BAND_2GHZ, .center_freq = 2484, .hw_value = 14, },
}; };
static const struct ieee80211_rate mwl8k_rates_24[] = { static const struct ieee80211_rate mwl8k_rates_24[] = {
...@@ -368,10 +368,10 @@ static const struct ieee80211_rate mwl8k_rates_24[] = { ...@@ -368,10 +368,10 @@ static const struct ieee80211_rate mwl8k_rates_24[] = {
}; };
static const struct ieee80211_channel mwl8k_channels_50[] = { static const struct ieee80211_channel mwl8k_channels_50[] = {
{ .center_freq = 5180, .hw_value = 36, }, { .band = IEEE80211_BAND_5GHZ, .center_freq = 5180, .hw_value = 36, },
{ .center_freq = 5200, .hw_value = 40, }, { .band = IEEE80211_BAND_5GHZ, .center_freq = 5200, .hw_value = 40, },
{ .center_freq = 5220, .hw_value = 44, }, { .band = IEEE80211_BAND_5GHZ, .center_freq = 5220, .hw_value = 44, },
{ .center_freq = 5240, .hw_value = 48, }, { .band = IEEE80211_BAND_5GHZ, .center_freq = 5240, .hw_value = 48, },
}; };
static const struct ieee80211_rate mwl8k_rates_50[] = { static const struct ieee80211_rate mwl8k_rates_50[] = {
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/llc.h> #include <linux/llc.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/pkt_sched.h>
#include <net/net_namespace.h> #include <net/net_namespace.h>
#include <net/llc.h> #include <net/llc.h>
#include <net/llc_pdu.h> #include <net/llc_pdu.h>
...@@ -40,6 +41,7 @@ static void br_send_bpdu(struct net_bridge_port *p, ...@@ -40,6 +41,7 @@ static void br_send_bpdu(struct net_bridge_port *p,
skb->dev = p->dev; skb->dev = p->dev;
skb->protocol = htons(ETH_P_802_2); skb->protocol = htons(ETH_P_802_2);
skb->priority = TC_PRIO_CONTROL;
skb_reserve(skb, LLC_RESERVE); skb_reserve(skb, LLC_RESERVE);
memcpy(__skb_put(skb, length), data, length); memcpy(__skb_put(skb, length), data, length);
......
...@@ -187,7 +187,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, ...@@ -187,7 +187,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags,
skb_queue_walk(queue, skb) { skb_queue_walk(queue, skb) {
*peeked = skb->peeked; *peeked = skb->peeked;
if (flags & MSG_PEEK) { if (flags & MSG_PEEK) {
if (*off >= skb->len) { if (*off >= skb->len && skb->len) {
*off -= skb->len; *off -= skb->len;
continue; continue;
} }
......
...@@ -928,24 +928,25 @@ static void parp_redo(struct sk_buff *skb) ...@@ -928,24 +928,25 @@ static void parp_redo(struct sk_buff *skb)
static int arp_rcv(struct sk_buff *skb, struct net_device *dev, static int arp_rcv(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt, struct net_device *orig_dev) struct packet_type *pt, struct net_device *orig_dev)
{ {
struct arphdr *arp; const struct arphdr *arp;
if (dev->flags & IFF_NOARP ||
skb->pkt_type == PACKET_OTHERHOST ||
skb->pkt_type == PACKET_LOOPBACK)
goto freeskb;
skb = skb_share_check(skb, GFP_ATOMIC);
if (!skb)
goto out_of_mem;
/* ARP header, plus 2 device addresses, plus 2 IP addresses. */ /* ARP header, plus 2 device addresses, plus 2 IP addresses. */
if (!pskb_may_pull(skb, arp_hdr_len(dev))) if (!pskb_may_pull(skb, arp_hdr_len(dev)))
goto freeskb; goto freeskb;
arp = arp_hdr(skb); arp = arp_hdr(skb);
if (arp->ar_hln != dev->addr_len || if (arp->ar_hln != dev->addr_len || arp->ar_pln != 4)
dev->flags & IFF_NOARP ||
skb->pkt_type == PACKET_OTHERHOST ||
skb->pkt_type == PACKET_LOOPBACK ||
arp->ar_pln != 4)
goto freeskb; goto freeskb;
skb = skb_share_check(skb, GFP_ATOMIC);
if (skb == NULL)
goto out_of_mem;
memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
return NF_HOOK(NFPROTO_ARP, NF_ARP_IN, skb, dev, NULL, arp_process); return NF_HOOK(NFPROTO_ARP, NF_ARP_IN, skb, dev, NULL, arp_process);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/ipv6.h> #include <linux/ipv6.h>
#include <net/ipv6.h>
#include <linux/netfilter.h> #include <linux/netfilter.h>
#include <linux/netfilter_ipv6.h> #include <linux/netfilter_ipv6.h>
#include <linux/netfilter_ipv6/ip6t_NPT.h> #include <linux/netfilter_ipv6/ip6t_NPT.h>
...@@ -18,11 +19,20 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par) ...@@ -18,11 +19,20 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par)
{ {
struct ip6t_npt_tginfo *npt = par->targinfo; struct ip6t_npt_tginfo *npt = par->targinfo;
__wsum src_sum = 0, dst_sum = 0; __wsum src_sum = 0, dst_sum = 0;
struct in6_addr pfx;
unsigned int i; unsigned int i;
if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64) if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64)
return -EINVAL; return -EINVAL;
/* Ensure that LSB of prefix is zero */
ipv6_addr_prefix(&pfx, &npt->src_pfx.in6, npt->src_pfx_len);
if (!ipv6_addr_equal(&pfx, &npt->src_pfx.in6))
return -EINVAL;
ipv6_addr_prefix(&pfx, &npt->dst_pfx.in6, npt->dst_pfx_len);
if (!ipv6_addr_equal(&pfx, &npt->dst_pfx.in6))
return -EINVAL;
for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) { for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) {
src_sum = csum_add(src_sum, src_sum = csum_add(src_sum,
(__force __wsum)npt->src_pfx.in6.s6_addr16[i]); (__force __wsum)npt->src_pfx.in6.s6_addr16[i]);
...@@ -30,7 +40,7 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par) ...@@ -30,7 +40,7 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par)
(__force __wsum)npt->dst_pfx.in6.s6_addr16[i]); (__force __wsum)npt->dst_pfx.in6.s6_addr16[i]);
} }
npt->adjustment = (__force __sum16) csum_sub(src_sum, dst_sum); npt->adjustment = ~csum_fold(csum_sub(src_sum, dst_sum));
return 0; return 0;
} }
...@@ -51,7 +61,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt, ...@@ -51,7 +61,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
idx = i / 32; idx = i / 32;
addr->s6_addr32[idx] &= mask; addr->s6_addr32[idx] &= mask;
addr->s6_addr32[idx] |= npt->dst_pfx.in6.s6_addr32[idx]; addr->s6_addr32[idx] |= ~mask & npt->dst_pfx.in6.s6_addr32[idx];
} }
if (pfx_len <= 48) if (pfx_len <= 48)
...@@ -66,8 +76,8 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt, ...@@ -66,8 +76,8 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
return false; return false;
} }
sum = (__force __sum16) csum_add((__force __wsum)addr->s6_addr16[idx], sum = ~csum_fold(csum_add(csum_unfold((__force __sum16)addr->s6_addr16[idx]),
npt->adjustment); csum_unfold(npt->adjustment)));
if (sum == CSUM_MANGLED_0) if (sum == CSUM_MANGLED_0)
sum = 0; sum = 0;
*(__force __sum16 *)&addr->s6_addr16[idx] = sum; *(__force __sum16 *)&addr->s6_addr16[idx] = sum;
......
...@@ -2058,7 +2058,8 @@ static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev, ...@@ -2058,7 +2058,8 @@ static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
{ {
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
memcpy(sdata->vif.bss_conf.mcast_rate, rate, sizeof(rate)); memcpy(sdata->vif.bss_conf.mcast_rate, rate,
sizeof(int) * IEEE80211_NUM_BANDS);
return 0; return 0;
} }
......
...@@ -3422,6 +3422,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, ...@@ -3422,6 +3422,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
ret = 0; ret = 0;
out:
while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
IEEE80211_CHAN_DISABLED)) { IEEE80211_CHAN_DISABLED)) {
if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) { if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) {
...@@ -3430,14 +3431,13 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, ...@@ -3430,14 +3431,13 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
goto out; goto out;
} }
ret = chandef_downgrade(chandef); ret |= chandef_downgrade(chandef);
} }
if (chandef->width != vht_chandef.width) if (chandef->width != vht_chandef.width)
sdata_info(sdata, sdata_info(sdata,
"local regulatory prevented using AP HT/VHT configuration, downgraded\n"); "capabilities/regulatory prevented using AP HT/VHT configuration, downgraded\n");
out:
WARN_ON_ONCE(!cfg80211_chandef_valid(chandef)); WARN_ON_ONCE(!cfg80211_chandef_valid(chandef));
return ret; return ret;
} }
...@@ -3551,8 +3551,11 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, ...@@ -3551,8 +3551,11 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
*/ */
ret = ieee80211_vif_use_channel(sdata, &chandef, ret = ieee80211_vif_use_channel(sdata, &chandef,
IEEE80211_CHANCTX_SHARED); IEEE80211_CHANCTX_SHARED);
while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT) while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT) {
ifmgd->flags |= chandef_downgrade(&chandef); ifmgd->flags |= chandef_downgrade(&chandef);
ret = ieee80211_vif_use_channel(sdata, &chandef,
IEEE80211_CHANCTX_SHARED);
}
return ret; return ret;
} }
......
...@@ -61,14 +61,27 @@ sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, ...@@ -61,14 +61,27 @@ sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
return 1; return 1;
} }
static void sctp_nat_csum(struct sk_buff *skb, sctp_sctphdr_t *sctph,
unsigned int sctphoff)
{
__u32 crc32;
struct sk_buff *iter;
crc32 = sctp_start_cksum((__u8 *)sctph, skb_headlen(skb) - sctphoff);
skb_walk_frags(skb, iter)
crc32 = sctp_update_cksum((u8 *) iter->data,
skb_headlen(iter), crc32);
sctph->checksum = sctp_end_cksum(crc32);
skb->ip_summed = CHECKSUM_UNNECESSARY;
}
static int static int
sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
struct ip_vs_conn *cp, struct ip_vs_iphdr *iph) struct ip_vs_conn *cp, struct ip_vs_iphdr *iph)
{ {
sctp_sctphdr_t *sctph; sctp_sctphdr_t *sctph;
unsigned int sctphoff = iph->len; unsigned int sctphoff = iph->len;
struct sk_buff *iter;
__be32 crc32;
#ifdef CONFIG_IP_VS_IPV6 #ifdef CONFIG_IP_VS_IPV6
if (cp->af == AF_INET6 && iph->fragoffs) if (cp->af == AF_INET6 && iph->fragoffs)
...@@ -92,13 +105,7 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, ...@@ -92,13 +105,7 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
sctph = (void *) skb_network_header(skb) + sctphoff; sctph = (void *) skb_network_header(skb) + sctphoff;
sctph->source = cp->vport; sctph->source = cp->vport;
/* Calculate the checksum */ sctp_nat_csum(skb, sctph, sctphoff);
crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff);
skb_walk_frags(skb, iter)
crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter),
crc32);
crc32 = sctp_end_cksum(crc32);
sctph->checksum = crc32;
return 1; return 1;
} }
...@@ -109,8 +116,6 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, ...@@ -109,8 +116,6 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
{ {
sctp_sctphdr_t *sctph; sctp_sctphdr_t *sctph;
unsigned int sctphoff = iph->len; unsigned int sctphoff = iph->len;
struct sk_buff *iter;
__be32 crc32;
#ifdef CONFIG_IP_VS_IPV6 #ifdef CONFIG_IP_VS_IPV6
if (cp->af == AF_INET6 && iph->fragoffs) if (cp->af == AF_INET6 && iph->fragoffs)
...@@ -134,13 +139,7 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, ...@@ -134,13 +139,7 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
sctph = (void *) skb_network_header(skb) + sctphoff; sctph = (void *) skb_network_header(skb) + sctphoff;
sctph->dest = cp->dport; sctph->dest = cp->dport;
/* Calculate the checksum */ sctp_nat_csum(skb, sctph, sctphoff);
crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff);
skb_walk_frags(skb, iter)
crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter),
crc32);
crc32 = sctp_end_cksum(crc32);
sctph->checksum = crc32;
return 1; return 1;
} }
......
...@@ -1795,6 +1795,8 @@ int start_sync_thread(struct net *net, int state, char *mcast_ifn, __u8 syncid) ...@@ -1795,6 +1795,8 @@ int start_sync_thread(struct net *net, int state, char *mcast_ifn, __u8 syncid)
GFP_KERNEL); GFP_KERNEL);
if (!tinfo->buf) if (!tinfo->buf)
goto outtinfo; goto outtinfo;
} else {
tinfo->buf = NULL;
} }
tinfo->id = id; tinfo->id = id;
......
...@@ -1135,9 +1135,9 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg, ...@@ -1135,9 +1135,9 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg,
memset(&opt, 0, sizeof(opt)); memset(&opt, 0, sizeof(opt));
opt.rate.rate = cl->rate.rate_bps >> 3; opt.rate.rate = cl->rate.rate_bps >> 3;
opt.buffer = cl->buffer; opt.buffer = PSCHED_NS2TICKS(cl->buffer);
opt.ceil.rate = cl->ceil.rate_bps >> 3; opt.ceil.rate = cl->ceil.rate_bps >> 3;
opt.cbuffer = cl->cbuffer; opt.cbuffer = PSCHED_NS2TICKS(cl->cbuffer);
opt.quantum = cl->quantum; opt.quantum = cl->quantum;
opt.prio = cl->prio; opt.prio = cl->prio;
opt.level = cl->level; opt.level = cl->level;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment