aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-03-01 17:57:40 -0500
committerDavid S. Miller <davem@davemloft.net>2012-03-01 17:57:40 -0500
commitb4017c5368f992fb8fb3a2545a0977082c6664e4 (patch)
treeb18fee77164297141c988965a9846225f8d8b3d3
parent97767a87f3be8834192dc3fc9412aaccf708d87f (diff)
parent413708bbaf5c85c4c8a264145f7d6c3afcd97f99 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/broadcom/tg3.c Conflicts in the statistics regression bug fix from 'net', but happily Matt Carlson originally posted the fix against 'net-next' so I used that to resolve this. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c43
-rw-r--r--drivers/net/ethernet/cisco/enic/enic.h2
-rw-r--r--drivers/net/ethernet/cisco/enic/enic_main.c2
-rw-r--r--drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c15
-rw-r--r--drivers/net/wireless/ath/ath9k/ar5008_phy.c25
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9002_hw.c19
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h1
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/ampdu.c12
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-sta.c10
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c3
-rw-r--r--include/linux/tcp.h3
-rw-r--r--include/net/tcp.h5
-rw-r--r--net/bridge/netfilter/ebtables.c10
-rw-r--r--net/ipv4/tcp_input.c18
-rw-r--r--net/mac80211/iface.c3
-rw-r--r--net/mac80211/rate.c2
16 files changed, 88 insertions, 85 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index 97dcccdb9eb2..76f33d5c7272 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -8001,10 +8001,8 @@ static int tg3_chip_reset(struct tg3 *tp)
8001 return 0; 8001 return 0;
8002} 8002}
8003 8003
8004static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *, 8004static void tg3_get_nstats(struct tg3 *, struct rtnl_link_stats64 *);
8005 struct rtnl_link_stats64 *); 8005static void tg3_get_estats(struct tg3 *, struct tg3_ethtool_stats *);
8006static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *,
8007 struct tg3_ethtool_stats *);
8008 8006
8009/* tp->lock is held. */ 8007/* tp->lock is held. */
8010static int tg3_halt(struct tg3 *tp, int kind, int silent) 8008static int tg3_halt(struct tg3 *tp, int kind, int silent)
@@ -8025,7 +8023,7 @@ static int tg3_halt(struct tg3 *tp, int kind, int silent)
8025 8023
8026 if (tp->hw_stats) { 8024 if (tp->hw_stats) {
8027 /* Save the stats across chip resets... */ 8025 /* Save the stats across chip resets... */
8028 tg3_get_stats64(tp->dev, &tp->net_stats_prev), 8026 tg3_get_nstats(tp, &tp->net_stats_prev);
8029 tg3_get_estats(tp, &tp->estats_prev); 8027 tg3_get_estats(tp, &tp->estats_prev);
8030 8028
8031 /* And make sure the next sample is new data */ 8029 /* And make sure the next sample is new data */
@@ -10125,7 +10123,7 @@ static inline u64 get_stat64(tg3_stat64_t *val)
10125 return ((u64)val->high << 32) | ((u64)val->low); 10123 return ((u64)val->high << 32) | ((u64)val->low);
10126} 10124}
10127 10125
10128static u64 calc_crc_errors(struct tg3 *tp) 10126static u64 tg3_calc_crc_errors(struct tg3 *tp)
10129{ 10127{
10130 struct tg3_hw_stats *hw_stats = tp->hw_stats; 10128 struct tg3_hw_stats *hw_stats = tp->hw_stats;
10131 10129
@@ -10134,14 +10132,12 @@ static u64 calc_crc_errors(struct tg3 *tp)
10134 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) { 10132 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
10135 u32 val; 10133 u32 val;
10136 10134
10137 spin_lock_bh(&tp->lock);
10138 if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) { 10135 if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) {
10139 tg3_writephy(tp, MII_TG3_TEST1, 10136 tg3_writephy(tp, MII_TG3_TEST1,
10140 val | MII_TG3_TEST1_CRC_EN); 10137 val | MII_TG3_TEST1_CRC_EN);
10141 tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val); 10138 tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val);
10142 } else 10139 } else
10143 val = 0; 10140 val = 0;
10144 spin_unlock_bh(&tp->lock);
10145 10141
10146 tp->phy_crc_errors += val; 10142 tp->phy_crc_errors += val;
10147 10143
@@ -10155,8 +10151,7 @@ static u64 calc_crc_errors(struct tg3 *tp)
10155 estats->member = old_estats->member + \ 10151 estats->member = old_estats->member + \
10156 get_stat64(&hw_stats->member) 10152 get_stat64(&hw_stats->member)
10157 10153
10158static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp, 10154static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats)
10159 struct tg3_ethtool_stats *estats)
10160{ 10155{
10161 struct tg3_ethtool_stats *old_estats = &tp->estats_prev; 10156 struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
10162 struct tg3_hw_stats *hw_stats = tp->hw_stats; 10157 struct tg3_hw_stats *hw_stats = tp->hw_stats;
@@ -10238,20 +10233,13 @@ static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp,
10238 ESTAT_ADD(nic_tx_threshold_hit); 10233 ESTAT_ADD(nic_tx_threshold_hit);
10239 10234
10240 ESTAT_ADD(mbuf_lwm_thresh_hit); 10235 ESTAT_ADD(mbuf_lwm_thresh_hit);
10241
10242 return estats;
10243} 10236}
10244 10237
10245static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, 10238static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats)
10246 struct rtnl_link_stats64 *stats)
10247{ 10239{
10248 struct tg3 *tp = netdev_priv(dev);
10249 struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev; 10240 struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev;
10250 struct tg3_hw_stats *hw_stats = tp->hw_stats; 10241 struct tg3_hw_stats *hw_stats = tp->hw_stats;
10251 10242
10252 if (!hw_stats)
10253 return old_stats;
10254
10255 stats->rx_packets = old_stats->rx_packets + 10243 stats->rx_packets = old_stats->rx_packets +
10256 get_stat64(&hw_stats->rx_ucast_packets) + 10244 get_stat64(&hw_stats->rx_ucast_packets) +
10257 get_stat64(&hw_stats->rx_mcast_packets) + 10245 get_stat64(&hw_stats->rx_mcast_packets) +
@@ -10294,15 +10282,13 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
10294 get_stat64(&hw_stats->tx_carrier_sense_errors); 10282 get_stat64(&hw_stats->tx_carrier_sense_errors);
10295 10283
10296 stats->rx_crc_errors = old_stats->rx_crc_errors + 10284 stats->rx_crc_errors = old_stats->rx_crc_errors +
10297 calc_crc_errors(tp); 10285 tg3_calc_crc_errors(tp);
10298 10286
10299 stats->rx_missed_errors = old_stats->rx_missed_errors + 10287 stats->rx_missed_errors = old_stats->rx_missed_errors +
10300 get_stat64(&hw_stats->rx_discards); 10288 get_stat64(&hw_stats->rx_discards);
10301 10289
10302 stats->rx_dropped = tp->rx_dropped; 10290 stats->rx_dropped = tp->rx_dropped;
10303 stats->tx_dropped = tp->tx_dropped; 10291 stats->tx_dropped = tp->tx_dropped;
10304
10305 return stats;
10306} 10292}
10307 10293
10308static int tg3_get_regs_len(struct net_device *dev) 10294static int tg3_get_regs_len(struct net_device *dev)
@@ -12213,6 +12199,21 @@ static const struct ethtool_ops tg3_ethtool_ops = {
12213 .set_rxfh_indir = tg3_set_rxfh_indir, 12199 .set_rxfh_indir = tg3_set_rxfh_indir,
12214}; 12200};
12215 12201
12202static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
12203 struct rtnl_link_stats64 *stats)
12204{
12205 struct tg3 *tp = netdev_priv(dev);
12206
12207 if (!tp->hw_stats)
12208 return &tp->net_stats_prev;
12209
12210 spin_lock_bh(&tp->lock);
12211 tg3_get_nstats(tp, stats);
12212 spin_unlock_bh(&tp->lock);
12213
12214 return stats;
12215}
12216
12216static void tg3_set_rx_mode(struct net_device *dev) 12217static void tg3_set_rx_mode(struct net_device *dev)
12217{ 12218{
12218 struct tg3 *tp = netdev_priv(dev); 12219 struct tg3 *tp = netdev_priv(dev);
diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/cisco/enic/enic.h
index 99998c606d3e..cf1fb4b9a4ad 100644
--- a/drivers/net/ethernet/cisco/enic/enic.h
+++ b/drivers/net/ethernet/cisco/enic/enic.h
@@ -94,7 +94,7 @@ struct enic {
94 u32 rx_coalesce_usecs; 94 u32 rx_coalesce_usecs;
95 u32 tx_coalesce_usecs; 95 u32 tx_coalesce_usecs;
96#ifdef CONFIG_PCI_IOV 96#ifdef CONFIG_PCI_IOV
97 u32 num_vfs; 97 u16 num_vfs;
98#endif 98#endif
99 struct enic_port_profile *pp; 99 struct enic_port_profile *pp;
100 100
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c
index e27ec1d3778d..9080ed651666 100644
--- a/drivers/net/ethernet/cisco/enic/enic_main.c
+++ b/drivers/net/ethernet/cisco/enic/enic_main.c
@@ -2390,7 +2390,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
2390 pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); 2390 pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV);
2391 if (pos) { 2391 if (pos) {
2392 pci_read_config_word(pdev, pos + PCI_SRIOV_TOTAL_VF, 2392 pci_read_config_word(pdev, pos + PCI_SRIOV_TOTAL_VF,
2393 (u16 *)&enic->num_vfs); 2393 &enic->num_vfs);
2394 if (enic->num_vfs) { 2394 if (enic->num_vfs) {
2395 err = pci_enable_sriov(pdev, enic->num_vfs); 2395 err = pci_enable_sriov(pdev, enic->num_vfs);
2396 if (err) { 2396 if (err) {
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c
index 9cb5f912e489..29e23bec809c 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c
@@ -321,10 +321,10 @@ static void pch_gbe_check_copper_options(struct pch_gbe_adapter *adapter)
321 pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n"); 321 pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n");
322 hw->phy.autoneg_advertised = opt.def; 322 hw->phy.autoneg_advertised = opt.def;
323 } else { 323 } else {
324 hw->phy.autoneg_advertised = AutoNeg; 324 int tmp = AutoNeg;
325 pch_gbe_validate_option( 325
326 (int *)(&hw->phy.autoneg_advertised), 326 pch_gbe_validate_option(&tmp, &opt, adapter);
327 &opt, adapter); 327 hw->phy.autoneg_advertised = tmp;
328 } 328 }
329 } 329 }
330 330
@@ -495,9 +495,10 @@ void pch_gbe_check_options(struct pch_gbe_adapter *adapter)
495 .arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list), 495 .arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list),
496 .p = fc_list } } 496 .p = fc_list } }
497 }; 497 };
498 hw->mac.fc = FlowControl; 498 int tmp = FlowControl;
499 pch_gbe_validate_option((int *)(&hw->mac.fc), 499
500 &opt, adapter); 500 pch_gbe_validate_option(&tmp, &opt, adapter);
501 hw->mac.fc = tmp;
501 } 502 }
502 503
503 pch_gbe_check_copper_options(adapter); 504 pch_gbe_check_copper_options(adapter);
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
index f901a17f76ba..86a891f93fc9 100644
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
@@ -489,8 +489,6 @@ static int ar5008_hw_rf_alloc_ext_banks(struct ath_hw *ah)
489 ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows); 489 ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows);
490 ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows); 490 ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows);
491 ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows); 491 ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows);
492 ATH_ALLOC_BANK(ah->addac5416_21,
493 ah->iniAddac.ia_rows * ah->iniAddac.ia_columns);
494 ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows); 492 ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows);
495 493
496 return 0; 494 return 0;
@@ -519,7 +517,6 @@ static void ar5008_hw_rf_free_ext_banks(struct ath_hw *ah)
519 ATH_FREE_BANK(ah->analogBank6Data); 517 ATH_FREE_BANK(ah->analogBank6Data);
520 ATH_FREE_BANK(ah->analogBank6TPCData); 518 ATH_FREE_BANK(ah->analogBank6TPCData);
521 ATH_FREE_BANK(ah->analogBank7Data); 519 ATH_FREE_BANK(ah->analogBank7Data);
522 ATH_FREE_BANK(ah->addac5416_21);
523 ATH_FREE_BANK(ah->bank6Temp); 520 ATH_FREE_BANK(ah->bank6Temp);
524 521
525#undef ATH_FREE_BANK 522#undef ATH_FREE_BANK
@@ -805,27 +802,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
805 if (ah->eep_ops->set_addac) 802 if (ah->eep_ops->set_addac)
806 ah->eep_ops->set_addac(ah, chan); 803 ah->eep_ops->set_addac(ah, chan);
807 804
808 if (AR_SREV_5416_22_OR_LATER(ah)) { 805 REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites);
809 REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites);
810 } else {
811 struct ar5416IniArray temp;
812 u32 addacSize =
813 sizeof(u32) * ah->iniAddac.ia_rows *
814 ah->iniAddac.ia_columns;
815
816 /* For AR5416 2.0/2.1 */
817 memcpy(ah->addac5416_21,
818 ah->iniAddac.ia_array, addacSize);
819
820 /* override CLKDRV value at [row, column] = [31, 1] */
821 (ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0;
822
823 temp.ia_array = ah->addac5416_21;
824 temp.ia_columns = ah->iniAddac.ia_columns;
825 temp.ia_rows = ah->iniAddac.ia_rows;
826 REG_WRITE_ARRAY(&temp, 1, regWrites);
827 }
828
829 REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); 806 REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC);
830 807
831 ENABLE_REGWRITE_BUFFER(ah); 808 ENABLE_REGWRITE_BUFFER(ah);
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
index 11f192a1ceb7..d190411ac8f5 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
@@ -180,6 +180,25 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
180 INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac, 180 INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac,
181 ARRAY_SIZE(ar5416Addac), 2); 181 ARRAY_SIZE(ar5416Addac), 2);
182 } 182 }
183
184 /* iniAddac needs to be modified for these chips */
185 if (AR_SREV_9160(ah) || !AR_SREV_5416_22_OR_LATER(ah)) {
186 struct ar5416IniArray *addac = &ah->iniAddac;
187 u32 size = sizeof(u32) * addac->ia_rows * addac->ia_columns;
188 u32 *data;
189
190 data = kmalloc(size, GFP_KERNEL);
191 if (!data)
192 return;
193
194 memcpy(data, addac->ia_array, size);
195 addac->ia_array = data;
196
197 if (!AR_SREV_5416_22_OR_LATER(ah)) {
198 /* override CLKDRV value */
199 INI_RA(addac, 31,1) = 0;
200 }
201 }
183} 202}
184 203
185/* Support for Japan ch.14 (2484) spread */ 204/* Support for Japan ch.14 (2484) spread */
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 6a29004a71b0..c8261d4fc780 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -940,7 +940,6 @@ struct ath_hw {
940 u32 *analogBank6Data; 940 u32 *analogBank6Data;
941 u32 *analogBank6TPCData; 941 u32 *analogBank6TPCData;
942 u32 *analogBank7Data; 942 u32 *analogBank7Data;
943 u32 *addac5416_21;
944 u32 *bank6Temp; 943 u32 *bank6Temp;
945 944
946 u8 txpower_limit; 945 u8 txpower_limit;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c
index d89dcb14cb6d..dbee69620a90 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c
@@ -1051,17 +1051,13 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
1051 } 1051 }
1052 /* either retransmit or send bar if ack not recd */ 1052 /* either retransmit or send bar if ack not recd */
1053 if (!ack_recd) { 1053 if (!ack_recd) {
1054 struct ieee80211_tx_rate *txrate = 1054 if (retry && (ini->txretry[index] < (int)retry_limit)) {
1055 tx_info->status.rates;
1056 if (retry && (txrate[0].count < (int)retry_limit)) {
1057 ini->txretry[index]++; 1055 ini->txretry[index]++;
1058 ini->tx_in_transit--; 1056 ini->tx_in_transit--;
1059 /* 1057 /*
1060 * Use high prededence for retransmit to 1058 * Use high prededence for retransmit to
1061 * give some punch 1059 * give some punch
1062 */ 1060 */
1063 /* brcms_c_txq_enq(wlc, scb, p,
1064 * BRCMS_PRIO_TO_PREC(tid)); */
1065 brcms_c_txq_enq(wlc, scb, p, 1061 brcms_c_txq_enq(wlc, scb, p,
1066 BRCMS_PRIO_TO_HI_PREC(tid)); 1062 BRCMS_PRIO_TO_HI_PREC(tid));
1067 } else { 1063 } else {
@@ -1074,9 +1070,9 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
1074 IEEE80211_TX_STAT_AMPDU_NO_BACK; 1070 IEEE80211_TX_STAT_AMPDU_NO_BACK;
1075 skb_pull(p, D11_PHY_HDR_LEN); 1071 skb_pull(p, D11_PHY_HDR_LEN);
1076 skb_pull(p, D11_TXH_LEN); 1072 skb_pull(p, D11_TXH_LEN);
1077 wiphy_err(wiphy, "%s: BA Timeout, seq %d, in_" 1073 BCMMSG(wiphy,
1078 "transit %d\n", "AMPDU status", seq, 1074 "BA Timeout, seq %d, in_transit %d\n",
1079 ini->tx_in_transit); 1075 seq, ini->tx_in_transit);
1080 ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw, 1076 ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw,
1081 p); 1077 p);
1082 } 1078 }
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
index d6aab00272b9..f1298cd6a19a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
@@ -1190,6 +1190,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
1190 unsigned long flags; 1190 unsigned long flags;
1191 struct iwl_addsta_cmd sta_cmd; 1191 struct iwl_addsta_cmd sta_cmd;
1192 u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta); 1192 u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta);
1193 __le16 key_flags;
1193 1194
1194 /* if station isn't there, neither is the key */ 1195 /* if station isn't there, neither is the key */
1195 if (sta_id == IWL_INVALID_STATION) 1196 if (sta_id == IWL_INVALID_STATION)
@@ -1215,7 +1216,14 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
1215 IWL_ERR(priv, "offset %d not used in uCode key table.\n", 1216 IWL_ERR(priv, "offset %d not used in uCode key table.\n",
1216 keyconf->hw_key_idx); 1217 keyconf->hw_key_idx);
1217 1218
1218 sta_cmd.key.key_flags = STA_KEY_FLG_NO_ENC | STA_KEY_FLG_INVALID; 1219 key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
1220 key_flags |= STA_KEY_FLG_MAP_KEY_MSK | STA_KEY_FLG_NO_ENC |
1221 STA_KEY_FLG_INVALID;
1222
1223 if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE))
1224 key_flags |= STA_KEY_MULTICAST_MSK;
1225
1226 sta_cmd.key.key_flags = key_flags;
1219 sta_cmd.key.key_offset = WEP_INVALID_OFFSET; 1227 sta_cmd.key.key_offset = WEP_INVALID_OFFSET;
1220 sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; 1228 sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
1221 sta_cmd.mode = STA_CONTROL_MODIFY_MSK; 1229 sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index bae5b01299ea..d62e64fe0b92 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -1232,7 +1232,8 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
1232 cancel_work_sync(&rt2x00dev->rxdone_work); 1232 cancel_work_sync(&rt2x00dev->rxdone_work);
1233 cancel_work_sync(&rt2x00dev->txdone_work); 1233 cancel_work_sync(&rt2x00dev->txdone_work);
1234 } 1234 }
1235 destroy_workqueue(rt2x00dev->workqueue); 1235 if (rt2x00dev->workqueue)
1236 destroy_workqueue(rt2x00dev->workqueue);
1236 1237
1237 /* 1238 /*
1238 * Free the tx status fifo. 1239 * Free the tx status fifo.
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 115389e9b945..b6c62d294380 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -412,7 +412,8 @@ struct tcp_sock {
412 412
413 struct tcp_sack_block recv_sack_cache[4]; 413 struct tcp_sack_block recv_sack_cache[4];
414 414
415 struct sk_buff *highest_sack; /* highest skb with SACK received 415 struct sk_buff *highest_sack; /* skb just after the highest
416 * skb with SACKed bit set
416 * (validity guaranteed only if 417 * (validity guaranteed only if
417 * sacked_out > 0) 418 * sacked_out > 0)
418 */ 419 */
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 6b2acfce4cfd..8607e6aad42b 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -1362,8 +1362,9 @@ static inline void tcp_push_pending_frames(struct sock *sk)
1362 } 1362 }
1363} 1363}
1364 1364
1365/* Start sequence of the highest skb with SACKed bit, valid only if 1365/* Start sequence of the skb just after the highest skb with SACKed
1366 * sacked > 0 or when the caller has ensured validity by itself. 1366 * bit, valid only if sacked_out > 0 or when the caller has ensured
1367 * validity by itself.
1367 */ 1368 */
1368static inline u32 tcp_highest_sack_seq(struct tcp_sock *tp) 1369static inline u32 tcp_highest_sack_seq(struct tcp_sock *tp)
1369{ 1370{
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index 5864cc491369..8aa4ad0e06af 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -1893,10 +1893,7 @@ static int compat_mtw_from_user(struct compat_ebt_entry_mwt *mwt,
1893 1893
1894 switch (compat_mwt) { 1894 switch (compat_mwt) {
1895 case EBT_COMPAT_MATCH: 1895 case EBT_COMPAT_MATCH:
1896 match = try_then_request_module(xt_find_match(NFPROTO_BRIDGE, 1896 match = xt_request_find_match(NFPROTO_BRIDGE, name, 0);
1897 name, 0), "ebt_%s", name);
1898 if (match == NULL)
1899 return -ENOENT;
1900 if (IS_ERR(match)) 1897 if (IS_ERR(match))
1901 return PTR_ERR(match); 1898 return PTR_ERR(match);
1902 1899
@@ -1915,10 +1912,7 @@ static int compat_mtw_from_user(struct compat_ebt_entry_mwt *mwt,
1915 break; 1912 break;
1916 case EBT_COMPAT_WATCHER: /* fallthrough */ 1913 case EBT_COMPAT_WATCHER: /* fallthrough */
1917 case EBT_COMPAT_TARGET: 1914 case EBT_COMPAT_TARGET:
1918 wt = try_then_request_module(xt_find_target(NFPROTO_BRIDGE, 1915 wt = xt_request_find_target(NFPROTO_BRIDGE, name, 0);
1919 name, 0), "ebt_%s", name);
1920 if (wt == NULL)
1921 return -ENOENT;
1922 if (IS_ERR(wt)) 1916 if (IS_ERR(wt))
1923 return PTR_ERR(wt); 1917 return PTR_ERR(wt);
1924 off = xt_compat_target_offset(wt); 1918 off = xt_compat_target_offset(wt);
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 53c8ce4046b2..ee42d42b2f45 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1403,8 +1403,16 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
1403 1403
1404 BUG_ON(!pcount); 1404 BUG_ON(!pcount);
1405 1405
1406 /* Adjust hint for FACK. Non-FACK is handled in tcp_sacktag_one(). */ 1406 /* Adjust counters and hints for the newly sacked sequence
1407 if (tcp_is_fack(tp) && (skb == tp->lost_skb_hint)) 1407 * range but discard the return value since prev is already
1408 * marked. We must tag the range first because the seq
1409 * advancement below implicitly advances
1410 * tcp_highest_sack_seq() when skb is highest_sack.
1411 */
1412 tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked,
1413 start_seq, end_seq, dup_sack, pcount);
1414
1415 if (skb == tp->lost_skb_hint)
1408 tp->lost_cnt_hint += pcount; 1416 tp->lost_cnt_hint += pcount;
1409 1417
1410 TCP_SKB_CB(prev)->end_seq += shifted; 1418 TCP_SKB_CB(prev)->end_seq += shifted;
@@ -1430,12 +1438,6 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
1430 skb_shinfo(skb)->gso_type = 0; 1438 skb_shinfo(skb)->gso_type = 0;
1431 } 1439 }
1432 1440
1433 /* Adjust counters and hints for the newly sacked sequence range but
1434 * discard the return value since prev is already marked.
1435 */
1436 tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked,
1437 start_seq, end_seq, dup_sack, pcount);
1438
1439 /* Difference in this won't matter, both ACKed by the same cumul. ACK */ 1441 /* Difference in this won't matter, both ACKed by the same cumul. ACK */
1440 TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); 1442 TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS);
1441 1443
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 6b3cd65d1e07..daa50ea15f46 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -1342,6 +1342,9 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
1342 hw_roc = true; 1342 hw_roc = true;
1343 1343
1344 list_for_each_entry(sdata, &local->interfaces, list) { 1344 list_for_each_entry(sdata, &local->interfaces, list) {
1345 if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
1346 sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
1347 continue;
1345 if (sdata->old_idle == sdata->vif.bss_conf.idle) 1348 if (sdata->old_idle == sdata->vif.bss_conf.idle)
1346 continue; 1349 continue;
1347 if (!ieee80211_sdata_running(sdata)) 1350 if (!ieee80211_sdata_running(sdata))
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c
index 111fba38be82..b4f7600a3e36 100644
--- a/net/mac80211/rate.c
+++ b/net/mac80211/rate.c
@@ -447,7 +447,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
447 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { 447 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
448 info->control.rates[i].idx = -1; 448 info->control.rates[i].idx = -1;
449 info->control.rates[i].flags = 0; 449 info->control.rates[i].flags = 0;
450 info->control.rates[i].count = 1; 450 info->control.rates[i].count = 0;
451 } 451 }
452 452
453 if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) 453 if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)