Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Tue, 8 May 2012 03:35:40 +0000 (23:35 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 May 2012 03:35:40 +0000 (23:35 -0400)
Conflicts:
drivers/net/ethernet/intel/e1000e/param.c
drivers/net/wireless/iwlwifi/iwl-agn-rx.c
drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
drivers/net/wireless/iwlwifi/iwl-trans.h

Resolved the iwlwifi conflict with mainline using 3-way diff posted
by John Linville and Stephen Rothwell.  In 'net' we added a bug
fix to make iwlwifi report a more accurate skb->truesize but this
conflicted with RX path changes that happened meanwhile in net-next.

In e1000e a conflict arose in the validation code for settings of
adapter->itr.  'net-next' had more sophisticated logic so that
logic was used.

Signed-off-by: David S. Miller <davem@davemloft.net>
61 files changed:
1  2 
Documentation/networking/ip-sysctl.txt
MAINTAINERS
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/tg3.c
drivers/net/ethernet/dlink/dl2k.c
drivers/net/ethernet/dlink/dl2k.h
drivers/net/ethernet/intel/e1000/e1000_main.c
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/intel/e1000e/param.c
drivers/net/ethernet/intel/igb/igb_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/marvell/sky2.c
drivers/net/ethernet/sun/sungem.c
drivers/net/ethernet/ti/davinci_emac.c
drivers/net/ethernet/ti/tlan.c
drivers/net/usb/usbnet.c
drivers/net/wireless/ath/ath9k/ar5008_phy.c
drivers/net/wireless/ath/ath9k/ar9003_phy.c
drivers/net/wireless/ath/ath9k/eeprom_9287.c
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/b43/main.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
drivers/net/wireless/ipw2x00/ipw2200.c
drivers/net/wireless/iwlwifi/iwl-1000.c
drivers/net/wireless/iwlwifi/iwl-2000.c
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-6000.c
drivers/net/wireless/iwlwifi/iwl-agn-rx.c
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-mac80211.c
drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
drivers/net/wireless/iwlwifi/iwl-trans.h
drivers/net/wireless/rtlwifi/pci.c
drivers/net/wireless/ti/wl1251/main.c
drivers/net/wireless/ti/wl1251/sdio.c
drivers/staging/octeon/ethernet-tx.c
include/linux/skbuff.h
include/net/ip_vs.h
include/net/sock.h
net/bridge/br_forward.c
net/bridge/br_netfilter.c
net/ieee802154/6lowpan.c
net/ipv4/inet_diag.c
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/l2tp/l2tp_ip.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/mlme.c
net/mac80211/tx.c
net/netfilter/ipvs/ip_vs_core.c
net/netfilter/ipvs/ip_vs_ctl.c
net/netfilter/ipvs/ip_vs_ftp.c
net/netfilter/ipvs/ip_vs_lblc.c
net/netfilter/ipvs/ip_vs_lblcr.c
net/netfilter/ipvs/ip_vs_proto.c
net/sched/sch_netem.c

diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -344,53 -344,60 +344,94 @@@ void __devinit e1000e_check_options(str
  
                if (num_InterruptThrottleRate > bd) {
                        adapter->itr = InterruptThrottleRate[bd];
 -
 -                      /*
 -                       * Make sure a message is printed for non-special
 -                       * values.  And in case of an invalid option, display
 -                       * warning, use default and got through itr/itr_setting
 -                       * adjustment logic below
 -                       */
 -                      if ((adapter->itr > 4) &&
 -                          e1000_validate_option(&adapter->itr, &opt, adapter))
 -                              adapter->itr = opt.def;
 +                      switch (adapter->itr) {
 +                      case 0:
 +                              e_info("%s turned off\n", opt.name);
 +                              break;
 +                      case 1:
 +                              e_info("%s set to dynamic mode\n", opt.name);
 +                              adapter->itr_setting = adapter->itr;
 +                              adapter->itr = 20000;
 +                              break;
 +                      case 3:
 +                              e_info("%s set to dynamic conservative mode\n",
 +                                      opt.name);
 +                              adapter->itr_setting = adapter->itr;
 +                              adapter->itr = 20000;
 +                              break;
 +                      case 4:
 +                              e_info("%s set to simplified (2000-8000 ints) mode\n",
 +                                     opt.name);
 +                              adapter->itr_setting = 4;
 +                              break;
 +                      default:
 +                              /*
 +                               * Save the setting, because the dynamic bits
 +                               * change itr.
 +                               */
 +                              if (e1000_validate_option(&adapter->itr, &opt,
 +                                                        adapter) &&
 +                                  (adapter->itr == 3)) {
 +                                      /*
 +                                       * In case of invalid user value,
 +                                       * default to conservative mode.
 +                                       */
 +                                      adapter->itr_setting = adapter->itr;
 +                                      adapter->itr = 20000;
 +                              } else {
 +                                      /*
 +                                       * Clear the lower two bits because
 +                                       * they are used as control.
 +                                       */
 +                                      adapter->itr_setting =
 +                                              adapter->itr & ~3;
 +                              }
 +                              break;
 +                      }
                } else {
-                       adapter->itr_setting = opt.def;
+                       /*
+                        * If no option specified, use default value and go
+                        * through the logic below to adjust itr/itr_setting
+                        */
+                       adapter->itr = opt.def;
+                       /*
+                        * Make sure a message is printed for non-special
+                        * default values
+                        */
+                       if (adapter->itr > 40)
+                               e_info("%s set to default %d\n", opt.name,
+                                      adapter->itr);
+               }
+               adapter->itr_setting = adapter->itr;
+               switch (adapter->itr) {
+               case 0:
+                       e_info("%s turned off\n", opt.name);
+                       break;
+               case 1:
+                       e_info("%s set to dynamic mode\n", opt.name);
+                       adapter->itr = 20000;
+                       break;
+               case 3:
+                       e_info("%s set to dynamic conservative mode\n",
+                              opt.name);
                        adapter->itr = 20000;
+                       break;
+               case 4:
+                       e_info("%s set to simplified (2000-8000 ints) mode\n",
+                              opt.name);
+                       break;
+               default:
+                       /*
+                        * Save the setting, because the dynamic bits
+                        * change itr.
+                        *
+                        * Clear the lower two bits because
+                        * they are used as control.
+                        */
+                       adapter->itr_setting &= ~3;
+                       break;
                }
        }
        { /* Interrupt Mode */
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
   *
   *****************************************************************************/
  
 -#include <linux/kernel.h>
  #include <linux/module.h>
 -#include <linux/init.h>
 -#include <linux/delay.h>
 -#include <linux/skbuff.h>
 -#include <linux/netdevice.h>
 -#include <net/mac80211.h>
 -#include <linux/etherdevice.h>
 -#include <asm/unaligned.h>
  #include <linux/stringify.h>
 -
 -#include "iwl-eeprom.h"
 -#include "iwl-dev.h"
 -#include "iwl-core.h"
 -#include "iwl-io.h"
 -#include "iwl-agn.h"
 -#include "iwl-agn-hw.h"
 -#include "iwl-shared.h"
 +#include "iwl-config.h"
  #include "iwl-cfg.h"
 -#include "iwl-prph.h"
 +#include "iwl-csr.h"
 +#include "iwl-agn-hw.h"
  
  /* Highest firmware API version supported */
- #define IWL1000_UCODE_API_MAX 6
- #define IWL100_UCODE_API_MAX 6
+ #define IWL1000_UCODE_API_MAX 5
+ #define IWL100_UCODE_API_MAX 5
  
  /* Oldest version we won't warn about */
  #define IWL1000_UCODE_API_OK 5
@@@ -70,8 -330,8 +74,9 @@@ static const struct iwl_ht_params iwl50
  #define IWL_DEVICE_5000                                               \
        .fw_name_pre = IWL5000_FW_PRE,                          \
        .ucode_api_max = IWL5000_UCODE_API_MAX,                 \
+       .ucode_api_ok = IWL5000_UCODE_API_OK,                   \
        .ucode_api_min = IWL5000_UCODE_API_MIN,                 \
 +      .device_family = IWL_DEVICE_FAMILY_5000,                \
        .max_inst_size = IWLAGN_RTC_INST_SIZE,                  \
        .max_data_size = IWLAGN_RTC_DATA_SIZE,                  \
        .eeprom_ver = EEPROM_5000_EEPROM_VERSION,               \
@@@ -115,8 -376,8 +120,9 @@@ const struct iwl_cfg iwl5350_agn_cfg = 
        .name = "Intel(R) WiMAX/WiFi Link 5350 AGN",
        .fw_name_pre = IWL5000_FW_PRE,
        .ucode_api_max = IWL5000_UCODE_API_MAX,
+       .ucode_api_ok = IWL5000_UCODE_API_OK,
        .ucode_api_min = IWL5000_UCODE_API_MIN,
 +      .device_family = IWL_DEVICE_FAMILY_5000,
        .max_inst_size = IWLAGN_RTC_INST_SIZE,
        .max_data_size = IWLAGN_RTC_DATA_SIZE,
        .eeprom_ver = EEPROM_5050_EEPROM_VERSION,
  #define IWL_DEVICE_5150                                               \
        .fw_name_pre = IWL5150_FW_PRE,                          \
        .ucode_api_max = IWL5150_UCODE_API_MAX,                 \
+       .ucode_api_ok = IWL5150_UCODE_API_OK,                   \
        .ucode_api_min = IWL5150_UCODE_API_MIN,                 \
 +      .device_family = IWL_DEVICE_FAMILY_5150,                \
        .max_inst_size = IWLAGN_RTC_INST_SIZE,                  \
        .max_data_size = IWLAGN_RTC_DATA_SIZE,                  \
        .eeprom_ver = EEPROM_5050_EEPROM_VERSION,               \
@@@ -190,9 -390,8 +192,9 @@@ const struct iwl_cfg iwl6005_2agn_mow2_
  #define IWL_DEVICE_6030                                               \
        .fw_name_pre = IWL6030_FW_PRE,                          \
        .ucode_api_max = IWL6000G2_UCODE_API_MAX,               \
-       .ucode_api_ok = IWL6000G2_UCODE_API_OK,                 \
+       .ucode_api_ok = IWL6000G2B_UCODE_API_OK,                \
        .ucode_api_min = IWL6000G2_UCODE_API_MIN,               \
 +      .device_family = IWL_DEVICE_FAMILY_6030,                \
        .max_inst_size = IWL60_RTC_INST_SIZE,                   \
        .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .eeprom_ver = EEPROM_6030_EEPROM_VERSION,               \
@@@ -752,15 -787,25 +751,24 @@@ static void iwlagn_pass_packet_to_mac80
            iwlagn_set_decrypted_flag(priv, hdr, ampdu_status, stats))
                return;
  
-       skb = dev_alloc_skb(128);
+       /* Dont use dev_alloc_skb(), we'll have enough headroom once
+        * ieee80211_hdr pulled.
+        */
+       skb = alloc_skb(128, GFP_ATOMIC);
        if (!skb) {
-               IWL_ERR(priv, "dev_alloc_skb failed\n");
+               IWL_ERR(priv, "alloc_skb failed\n");
                return;
        }
 -              int offset = (void *)hdr + hdrlen - rxb_addr(rxb);
+       hdrlen = min_t(unsigned int, len, skb_tailroom(skb));
+       memcpy(skb_put(skb, hdrlen), hdr, hdrlen);
+       fraglen = len - hdrlen;
+       if (fraglen) {
++              int offset = (void *)hdr - rxb_addr(rxb) + rxb_offset(rxb);
  
-       offset = (void *)hdr - rxb_addr(rxb) + rxb_offset(rxb);
-       p = rxb_steal_page(rxb);
-       skb_add_rx_frag(skb, 0, p, offset, len, len);
+               skb_add_rx_frag(skb, 0, rxb_steal_page(rxb), offset,
+                               fraglen, rxb->truesize);
+       }
 -      iwl_update_stats(priv, false, fc, len);
  
        /*
        * Wake any queues that were stopped due to a passive channel tx
@@@ -373,89 -374,72 +373,90 @@@ static void iwl_rx_handle_rxbuf(struct 
        if (WARN_ON(!rxb))
                return;
  
 -      rxcb.truesize = PAGE_SIZE << hw_params(trans).rx_page_order;
 -      dma_unmap_page(trans->dev, rxb->page_dma,
 -                     rxcb.truesize,
 -                     DMA_FROM_DEVICE);
 -
 -      rxcb._page = rxb->page;
 -      pkt = rxb_addr(&rxcb);
 -
 -      IWL_DEBUG_RX(trans, "%s, 0x%02x\n",
 -                   get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd);
 +      dma_unmap_page(trans->dev, rxb->page_dma, max_len, DMA_FROM_DEVICE);
  
 +      while (offset + sizeof(u32) + sizeof(struct iwl_cmd_header) < max_len) {
 +              struct iwl_rx_packet *pkt;
 +              struct iwl_device_cmd *cmd;
 +              u16 sequence;
 +              bool reclaim;
 +              int index, cmd_index, err, len;
 +              struct iwl_rx_cmd_buffer rxcb = {
 +                      ._offset = offset,
 +                      ._page = rxb->page,
 +                      ._page_stolen = false,
++                      .truesize = max_len,
 +              };
  
 -      len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK;
 -      len += sizeof(u32); /* account for status word */
 -      trace_iwlwifi_dev_rx(trans->dev, pkt, len);
 +              pkt = rxb_addr(&rxcb);
  
 -      /* Reclaim a command buffer only if this packet is a response
 -       *   to a (driver-originated) command.
 -       * If the packet (e.g. Rx frame) originated from uCode,
 -       *   there is no command buffer to reclaim.
 -       * Ucode should set SEQ_RX_FRAME bit if ucode-originated,
 -       *   but apparently a few don't get set; catch them here. */
 -      reclaim = !(pkt->hdr.sequence & SEQ_RX_FRAME);
 -      if (reclaim) {
 -              int i;
 +              if (pkt->len_n_flags == cpu_to_le32(FH_RSCSR_FRAME_INVALID))
 +                      break;
  
 -              for (i = 0; i < trans_pcie->n_no_reclaim_cmds; i++) {
 -                      if (trans_pcie->no_reclaim_cmds[i] == pkt->hdr.cmd) {
 -                              reclaim = false;
 -                              break;
 +              IWL_DEBUG_RX(trans, "cmd at offset %d: %s (0x%.2x)\n",
 +                      rxcb._offset,
 +                      trans_pcie_get_cmd_string(trans_pcie, pkt->hdr.cmd),
 +                      pkt->hdr.cmd);
 +
 +              len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK;
 +              len += sizeof(u32); /* account for status word */
 +              trace_iwlwifi_dev_rx(trans->dev, pkt, len);
 +
 +              /* Reclaim a command buffer only if this packet is a response
 +               *   to a (driver-originated) command.
 +               * If the packet (e.g. Rx frame) originated from uCode,
 +               *   there is no command buffer to reclaim.
 +               * Ucode should set SEQ_RX_FRAME bit if ucode-originated,
 +               *   but apparently a few don't get set; catch them here. */
 +              reclaim = !(pkt->hdr.sequence & SEQ_RX_FRAME);
 +              if (reclaim) {
 +                      int i;
 +
 +                      for (i = 0; i < trans_pcie->n_no_reclaim_cmds; i++) {
 +                              if (trans_pcie->no_reclaim_cmds[i] ==
 +                                                      pkt->hdr.cmd) {
 +                                      reclaim = false;
 +                                      break;
 +                              }
                        }
                }
 -      }
  
 -      sequence = le16_to_cpu(pkt->hdr.sequence);
 -      index = SEQ_TO_INDEX(sequence);
 -      cmd_index = get_cmd_index(&txq->q, index);
 +              sequence = le16_to_cpu(pkt->hdr.sequence);
 +              index = SEQ_TO_INDEX(sequence);
 +              cmd_index = get_cmd_index(&txq->q, index);
  
 -      if (reclaim)
 -              cmd = txq->cmd[cmd_index];
 -      else
 -              cmd = NULL;
 +              if (reclaim)
 +                      cmd = txq->entries[cmd_index].cmd;
 +              else
 +                      cmd = NULL;
  
 -      err = iwl_op_mode_rx(trans->op_mode, &rxcb, cmd);
 +              err = iwl_op_mode_rx(trans->op_mode, &rxcb, cmd);
  
 -      /*
 -       * XXX: After here, we should always check rxcb._page
 -       * against NULL before touching it or its virtual
 -       * memory (pkt). Because some rx_handler might have
 -       * already taken or freed the pages.
 -       */
 +              /*
 +               * After here, we should always check rxcb._page_stolen,
 +               * if it is true then one of the handlers took the page.
 +               */
  
 -      if (reclaim) {
 -              /* Invoke any callbacks, transfer the buffer to caller,
 -               * and fire off the (possibly) blocking
 -               * iwl_trans_send_cmd()
 -               * as we reclaim the driver command queue */
 -              if (rxcb._page)
 -                      iwl_tx_cmd_complete(trans, &rxcb, err);
 -              else
 -                      IWL_WARN(trans, "Claim null rxb?\n");
 +              if (reclaim) {
 +                      /* Invoke any callbacks, transfer the buffer to caller,
 +                       * and fire off the (possibly) blocking
 +                       * iwl_trans_send_cmd()
 +                       * as we reclaim the driver command queue */
 +                      if (!rxcb._page_stolen)
 +                              iwl_tx_cmd_complete(trans, &rxcb, err);
 +                      else
 +                              IWL_WARN(trans, "Claim null rxb?\n");
 +              }
 +
 +              page_stolen |= rxcb._page_stolen;
 +              offset += ALIGN(len, FH_RSCSR_FRAME_ALIGN);
        }
  
 -      /* page was stolen from us */
 -      if (rxcb._page == NULL)
 +      /* page was stolen from us -- free our reference */
 +      if (page_stolen) {
 +              __free_pages(rxb->page, trans_pcie->rx_page_order);
                rxb->page = NULL;
 +      }
  
        /* Reuse the page if possible. For notification packets and
         * SKBs that fail to Rx correctly, add them back into the
@@@ -256,8 -260,7 +256,9 @@@ static inline void iwl_free_resp(struc
  
  struct iwl_rx_cmd_buffer {
        struct page *_page;
 +      int _offset;
 +      bool _page_stolen;
+       unsigned int truesize;
  };
  
  static inline void *rxb_addr(struct iwl_rx_cmd_buffer *r)
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/ipv4/tcp.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge