]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Sun, 25 Nov 2012 17:49:17 +0000 (12:49 -0500)
committerDavid S. Miller <davem@davemloft.net>
Sun, 25 Nov 2012 17:49:17 +0000 (12:49 -0500)
Conflicts:
drivers/net/wireless/iwlwifi/pcie/tx.c

Minor iwlwifi conflict in TX queue disabling between 'net', which
removed a bogus warning, and 'net-next' which added some status
register poking code.

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
MAINTAINERS
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/mwifiex/cmdevt.c
drivers/nfc/pn533.c
net/core/net-sysfs.c
net/ipv4/route.c
net/mac80211/ibss.c
net/nfc/llcp/llcp.c

diff --combined MAINTAINERS
index a9c794cb671ea6953a134f3e12cca15830ef7c17,9386a63ea8f63b653b683379ea54c7bd91eb72ec..ec6ab3ae4aa3b711e68bc775092a864c762beb92
@@@ -526,17 -526,17 +526,17 @@@ F:      drivers/video/geode
  F:    arch/x86/include/asm/geode.h
  
  AMD IOMMU (AMD-VI)
- M:    Joerg Roedel <joerg.roedel@amd.com>
+ M:    Joerg Roedel <joro@8bytes.org>
  L:    iommu@lists.linux-foundation.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
- S:    Supported
+ S:    Maintained
  F:    drivers/iommu/amd_iommu*.[ch]
  F:    include/linux/amd-iommu.h
  
  AMD MICROCODE UPDATE SUPPORT
- M:    Andreas Herrmann <andreas.herrmann3@amd.com>
+ M:    Andreas Herrmann <herrmann.der.user@googlemail.com>
  L:    amd64-microcode@amd64.org
- S:    Supported
+ S:    Maintained
  F:    arch/x86/kernel/microcode_amd.c
  
  AMS (Apple Motion Sensor) DRIVER
@@@ -841,6 -841,14 +841,14 @@@ T:       git git://git.kernel.org/pub/scm/lin
  F:    arch/arm/mach-sa1100/jornada720.c
  F:    arch/arm/mach-sa1100/include/mach/jornada720.h
  
+ ARM/IGEP MACHINE SUPPORT
+ M:    Enric Balletbo i Serra <eballetbo@gmail.com>
+ M:    Javier Martinez Canillas <javier@dowhile0.org>
+ L:    linux-omap@vger.kernel.org
+ L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+ S:    Maintained
+ F:    arch/arm/mach-omap2/board-igep0020.c
  ARM/INCOME PXA270 SUPPORT
  M:    Marek Vasut <marek.vasut@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2708,10 -2716,10 +2716,10 @@@ F:   include/linux/edac.
  
  EDAC-AMD64
  M:    Doug Thompson <dougthompson@xmission.com>
- M:    Borislav Petkov <borislav.petkov@amd.com>
+ M:    Borislav Petkov <bp@alien8.de>
  L:    linux-edac@vger.kernel.org
  W:    bluesmoke.sourceforge.net
- S:    Supported
+ S:    Maintained
  F:    drivers/edac/amd64_edac*
  
  EDAC-E752X
@@@ -3753,7 -3761,7 +3761,7 @@@ S:      Maintaine
  F:    drivers/platform/x86/ideapad-laptop.c
  
  IDE/ATAPI DRIVERS
- M:    Borislav Petkov <petkovbb@gmail.com>
+ M:    Borislav Petkov <bp@alien8.de>
  L:    linux-ide@vger.kernel.org
  S:    Maintained
  F:    Documentation/cdrom/ide-cd
@@@ -3928,9 -3936,7 +3936,9 @@@ M:      Greg Rose <gregory.v.rose@intel.com
  M:    Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
  M:    Alex Duyck <alexander.h.duyck@intel.com>
  M:    John Ronciak <john.ronciak@intel.com>
 +M:    Tushar Dave <tushar.n.dave@intel.com>
  L:    e1000-devel@lists.sourceforge.net
 +W:    http://www.intel.com/support/feedback.htm
  W:    http://e1000.sourceforge.net/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next.git
@@@ -4282,8 -4288,8 +4290,8 @@@ F:      include/linux/lockd
  F:    include/linux/sunrpc/
  
  KERNEL VIRTUAL MACHINE (KVM)
- M:    Avi Kivity <avi@redhat.com>
  M:    Marcelo Tosatti <mtosatti@redhat.com>
+ M:    Gleb Natapov <gleb@redhat.com>
  L:    kvm@vger.kernel.org
  W:    http://kvm.qumranet.com
  S:    Supported
@@@ -5415,7 -5421,7 +5423,7 @@@ S:      Maintaine
  F:    sound/drivers/opl4/
  
  OPROFILE
- M:    Robert Richter <robert.richter@amd.com>
+ M:    Robert Richter <rric@kernel.org>
  L:    oprofile-list@lists.sf.net
  S:    Maintained
  F:    arch/*/include/asm/oprofile*.h
@@@ -6417,7 -6423,6 +6425,7 @@@ F:      drivers/scsi/st
  SCTP PROTOCOL
  M:    Vlad Yasevich <vyasevich@gmail.com>
  M:    Sridhar Samudrala <sri@us.ibm.com>
 +M:    Neil Horman <nhorman@tuxdriver.com>
  L:    linux-sctp@vger.kernel.org
  W:    http://lksctp.sourceforge.net
  S:    Maintained
@@@ -7567,12 -7572,6 +7575,12 @@@ S:    Maintaine
  F:    Documentation/usb/acm.txt
  F:    drivers/usb/class/cdc-acm.*
  
 +USB AR5523 WIRELESS DRIVER
 +M:    Pontus Fuchs <pontus.fuchs@gmail.com>
 +L:    linux-wireless@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/wireless/ath/ar5523/
 +
  USB ATTACHED SCSI
  M:    Matthew Wilcox <willy@linux.intel.com>
  M:    Sarah Sharp <sarah.a.sharp@linux.intel.com>
@@@ -8207,7 -8206,7 +8215,7 @@@ F:      drivers/platform/x8
  
  X86 MCE INFRASTRUCTURE
  M:    Tony Luck <tony.luck@intel.com>
- M:    Borislav Petkov <bp@amd64.org>
+ M:    Borislav Petkov <bp@alien8.de>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
  F:    arch/x86/kernel/cpu/mcheck/*
index 3519fed58c36ab939c7d8657a26b36c1ce0c7e2d,01611b33a93de82c8b735b2e1c3e115a9b8e807f..54b8c1f19d39aeb256e947fc2703fa0475a5f6e3
@@@ -791,9 -791,10 +791,9 @@@ void bnx2x_panic_dump(struct bnx2x *bp
  
                /* host sb data */
  
 -#ifdef BCM_CNIC
                if (IS_FCOE_FP(fp))
                        continue;
 -#endif
 +
                BNX2X_ERR("     run indexes (");
                for (j = 0; j < HC_SB_MAX_SM; j++)
                        pr_cont("0x%x%s",
  #ifdef BNX2X_STOP_ON_ERROR
        /* Rings */
        /* Rx */
 -      for_each_rx_queue(bp, i) {
 +      for_each_valid_rx_queue(bp, i) {
                struct bnx2x_fastpath *fp = &bp->fp[i];
  
                start = RX_BD(le16_to_cpu(*fp->rx_cons_sb) - 10);
        }
  
        /* Tx */
 -      for_each_tx_queue(bp, i) {
 +      for_each_valid_tx_queue(bp, i) {
                struct bnx2x_fastpath *fp = &bp->fp[i];
                for_each_cos_in_tx_queue(fp, cos) {
                        struct bnx2x_fp_txdata *txdata = fp->txdata_ptr[cos];
@@@ -1482,7 -1483,7 +1482,7 @@@ static void bnx2x_igu_int_disable(struc
                BNX2X_ERR("BUG! proper val not read from IGU!\n");
  }
  
 -void bnx2x_int_disable(struct bnx2x *bp)
 +static void bnx2x_int_disable(struct bnx2x *bp)
  {
        if (bp->common.int_block == INT_BLOCK_HC)
                bnx2x_hc_int_disable(bp);
@@@ -1503,8 -1504,9 +1503,8 @@@ void bnx2x_int_disable_sync(struct bnx2
        if (msix) {
                synchronize_irq(bp->msix_table[0].vector);
                offset = 1;
 -#ifdef BCM_CNIC
 -              offset++;
 -#endif
 +              if (CNIC_SUPPORT(bp))
 +                      offset++;
                for_each_eth_queue(bp, i)
                        synchronize_irq(bp->msix_table[offset++].vector);
        } else
@@@ -1586,8 -1588,9 +1586,8 @@@ static bool bnx2x_trylock_leader_lock(s
        return bnx2x_trylock_hw_lock(bp, bnx2x_get_leader_lock_resource(bp));
  }
  
 -#ifdef BCM_CNIC
  static void bnx2x_cnic_cfc_comp(struct bnx2x *bp, int cid, u8 err);
 -#endif
 +
  
  void bnx2x_sp_event(struct bnx2x_fastpath *fp, union eth_rx_cqe *rr_cqe)
  {
@@@ -1717,7 -1720,7 +1717,7 @@@ irqreturn_t bnx2x_interrupt(int irq, vo
        for_each_eth_queue(bp, i) {
                struct bnx2x_fastpath *fp = &bp->fp[i];
  
 -              mask = 0x2 << (fp->index + CNIC_PRESENT);
 +              mask = 0x2 << (fp->index + CNIC_SUPPORT(bp));
                if (status & mask) {
                        /* Handle Rx or Tx according to SB id */
                        prefetch(fp->rx_cons_sb);
                }
        }
  
 -#ifdef BCM_CNIC
 -      mask = 0x2;
 -      if (status & (mask | 0x1)) {
 -              struct cnic_ops *c_ops = NULL;
 +      if (CNIC_SUPPORT(bp)) {
 +              mask = 0x2;
 +              if (status & (mask | 0x1)) {
 +                      struct cnic_ops *c_ops = NULL;
  
 -              if (likely(bp->state == BNX2X_STATE_OPEN)) {
 -                      rcu_read_lock();
 -                      c_ops = rcu_dereference(bp->cnic_ops);
 -                      if (c_ops)
 -                              c_ops->cnic_handler(bp->cnic_data, NULL);
 -                      rcu_read_unlock();
 -              }
 +                      if (likely(bp->state == BNX2X_STATE_OPEN)) {
 +                              rcu_read_lock();
 +                              c_ops = rcu_dereference(bp->cnic_ops);
 +                              if (c_ops)
 +                                      c_ops->cnic_handler(bp->cnic_data,
 +                                                          NULL);
 +                              rcu_read_unlock();
 +                      }
  
 -              status &= ~mask;
 +                      status &= ~mask;
 +              }
        }
 -#endif
  
        if (unlikely(status & 0x1)) {
                queue_delayed_work(bnx2x_wq, &bp->sp_task, 0);
@@@ -3073,13 -3075,11 +3073,13 @@@ static void bnx2x_drv_info_ether_stat(s
  
  static void bnx2x_drv_info_fcoe_stat(struct bnx2x *bp)
  {
 -#ifdef BCM_CNIC
        struct bnx2x_dcbx_app_params *app = &bp->dcbx_port_params.app;
        struct fcoe_stats_info *fcoe_stat =
                &bp->slowpath->drv_info_to_mcp.fcoe_stat;
  
 +      if (!CNIC_LOADED(bp))
 +              return;
 +
        memcpy(fcoe_stat->mac_local + MAC_LEADING_ZERO_CNT,
               bp->fip_mac, ETH_ALEN);
  
  
        /* ask L5 driver to add data to the struct */
        bnx2x_cnic_notify(bp, CNIC_CTL_FCOE_STATS_GET_CMD);
 -#endif
  }
  
  static void bnx2x_drv_info_iscsi_stat(struct bnx2x *bp)
  {
 -#ifdef BCM_CNIC
        struct bnx2x_dcbx_app_params *app = &bp->dcbx_port_params.app;
        struct iscsi_stats_info *iscsi_stat =
                &bp->slowpath->drv_info_to_mcp.iscsi_stat;
  
 +      if (!CNIC_LOADED(bp))
 +              return;
 +
        memcpy(iscsi_stat->mac_local + MAC_LEADING_ZERO_CNT,
               bp->cnic_eth_dev.iscsi_mac, ETH_ALEN);
  
  
        /* ask L5 driver to add data to the struct */
        bnx2x_cnic_notify(bp, CNIC_CTL_ISCSI_STATS_GET_CMD);
 -#endif
  }
  
  /* called due to MCP event (on pmf):
@@@ -4572,6 -4572,7 +4572,6 @@@ static void bnx2x_update_eq_prod(struc
        mmiowb(); /* keep prod updates ordered */
  }
  
 -#ifdef BCM_CNIC
  static int  bnx2x_cnic_handle_cfc_del(struct bnx2x *bp, u32 cid,
                                      union event_ring_elem *elem)
  {
        bnx2x_cnic_cfc_comp(bp, cid, err);
        return 0;
  }
 -#endif
  
  static void bnx2x_handle_mcast_eqe(struct bnx2x *bp)
  {
@@@ -4633,9 -4635,11 +4633,9 @@@ static void bnx2x_handle_classification
        switch (elem->message.data.eth_event.echo >> BNX2X_SWCID_SHIFT) {
        case BNX2X_FILTER_MAC_PENDING:
                DP(BNX2X_MSG_SP, "Got SETUP_MAC completions\n");
 -#ifdef BCM_CNIC
 -              if (cid == BNX2X_ISCSI_ETH_CID(bp))
 +              if (CNIC_LOADED(bp) && (cid == BNX2X_ISCSI_ETH_CID(bp)))
                        vlan_mac_obj = &bp->iscsi_l2_mac_obj;
                else
 -#endif
                        vlan_mac_obj = &bp->sp_objs[cid].mac_obj;
  
                break;
  
  }
  
 -#ifdef BCM_CNIC
  static void bnx2x_set_iscsi_eth_rx_mode(struct bnx2x *bp, bool start);
 -#endif
  
  static void bnx2x_handle_rx_mode_eqe(struct bnx2x *bp)
  {
        /* Send rx_mode command again if was requested */
        if (test_and_clear_bit(BNX2X_FILTER_RX_MODE_SCHED, &bp->sp_state))
                bnx2x_set_storm_rx_mode(bp);
 -#ifdef BCM_CNIC
        else if (test_and_clear_bit(BNX2X_FILTER_ISCSI_ETH_START_SCHED,
                                    &bp->sp_state))
                bnx2x_set_iscsi_eth_rx_mode(bp, true);
        else if (test_and_clear_bit(BNX2X_FILTER_ISCSI_ETH_STOP_SCHED,
                                    &bp->sp_state))
                bnx2x_set_iscsi_eth_rx_mode(bp, false);
 -#endif
  
        netif_addr_unlock_bh(bp->dev);
  }
@@@ -4739,6 -4747,7 +4739,6 @@@ static void bnx2x_after_function_update
                                  q);
        }
  
 -#ifdef BCM_CNIC
        if (!NO_FCOE(bp)) {
                fp = &bp->fp[FCOE_IDX(bp)];
                queue_params.q_obj = &bnx2x_sp_obj(bp, fp).q_obj;
                bnx2x_link_report(bp);
                bnx2x_fw_command(bp, DRV_MSG_CODE_AFEX_VIFSET_ACK, 0);
        }
 -#else
 -      /* If no FCoE ring - ACK MCP now */
 -      bnx2x_link_report(bp);
 -      bnx2x_fw_command(bp, DRV_MSG_CODE_AFEX_VIFSET_ACK, 0);
 -#endif /* BCM_CNIC */
  }
  
  static struct bnx2x_queue_sp_obj *bnx2x_cid_to_q_obj(
        struct bnx2x *bp, u32 cid)
  {
        DP(BNX2X_MSG_SP, "retrieving fp from cid %d\n", cid);
 -#ifdef BCM_CNIC
 -      if (cid == BNX2X_FCOE_ETH_CID(bp))
 +
 +      if (CNIC_LOADED(bp) && (cid == BNX2X_FCOE_ETH_CID(bp)))
                return &bnx2x_fcoe_sp_obj(bp, q_obj);
        else
 -#endif
                return &bp->sp_objs[CID_TO_FP(cid, bp)].q_obj;
  }
  
@@@ -4778,7 -4793,6 +4778,7 @@@ static void bnx2x_eq_int(struct bnx2x *
  {
        u16 hw_cons, sw_cons, sw_prod;
        union event_ring_elem *elem;
 +      u8 echo;
        u32 cid;
        u8 opcode;
        int spqe_cnt = 0;
                         */
                        DP(BNX2X_MSG_SP,
                           "got delete ramrod for MULTI[%d]\n", cid);
 -#ifdef BCM_CNIC
 -                      if (!bnx2x_cnic_handle_cfc_del(bp, cid, elem))
 +
 +                      if (CNIC_LOADED(bp) &&
 +                          !bnx2x_cnic_handle_cfc_del(bp, cid, elem))
                                goto next_spqe;
 -#endif
 +
                        q_obj = bnx2x_cid_to_q_obj(bp, cid);
  
                        if (q_obj->complete_cmd(bp, q_obj, BNX2X_Q_CMD_CFC_DEL))
                                break;
                        bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_RELEASED);
                        goto next_spqe;
 +
                case EVENT_RING_OPCODE_FUNCTION_UPDATE:
 -                      DP(BNX2X_MSG_SP | BNX2X_MSG_MCP,
 -                         "AFEX: ramrod completed FUNCTION_UPDATE\n");
 -                      f_obj->complete_cmd(bp, f_obj, BNX2X_F_CMD_AFEX_UPDATE);
 +                      echo = elem->message.data.function_update_event.echo;
 +                      if (echo == SWITCH_UPDATE) {
 +                              DP(BNX2X_MSG_SP | NETIF_MSG_IFUP,
 +                                 "got FUNC_SWITCH_UPDATE ramrod\n");
 +                              if (f_obj->complete_cmd(
 +                                      bp, f_obj, BNX2X_F_CMD_SWITCH_UPDATE))
 +                                      break;
  
 -                      /* We will perform the Queues update from sp_rtnl task
 -                       * as all Queue SP operations should run under
 -                       * rtnl_lock.
 -                       */
 -                      smp_mb__before_clear_bit();
 -                      set_bit(BNX2X_SP_RTNL_AFEX_F_UPDATE,
 -                              &bp->sp_rtnl_state);
 -                      smp_mb__after_clear_bit();
 +                      } else {
 +                              DP(BNX2X_MSG_SP | BNX2X_MSG_MCP,
 +                                 "AFEX: ramrod completed FUNCTION_UPDATE\n");
 +                              f_obj->complete_cmd(bp, f_obj,
 +                                                  BNX2X_F_CMD_AFEX_UPDATE);
 +
 +                              /* We will perform the Queues update from
 +                               * sp_rtnl task as all Queue SP operations
 +                               * should run under rtnl_lock.
 +                               */
 +                              smp_mb__before_clear_bit();
 +                              set_bit(BNX2X_SP_RTNL_AFEX_F_UPDATE,
 +                                      &bp->sp_rtnl_state);
 +                              smp_mb__after_clear_bit();
 +
 +                              schedule_delayed_work(&bp->sp_rtnl_task, 0);
 +                      }
  
 -                      schedule_delayed_work(&bp->sp_rtnl_task, 0);
                        goto next_spqe;
  
                case EVENT_RING_OPCODE_AFEX_VIF_LISTS:
@@@ -4999,10 -4999,11 +4999,10 @@@ static void bnx2x_sp_task(struct work_s
  
        /* SP events: STAT_QUERY and others */
        if (status & BNX2X_DEF_SB_IDX) {
 -#ifdef BCM_CNIC
                struct bnx2x_fastpath *fp = bnx2x_fcoe_fp(bp);
  
 -              if ((!NO_FCOE(bp)) &&
 -                      (bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) {
 +              if (FCOE_INIT(bp) &&
 +                  (bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) {
                        /*
                         * Prevent local bottom-halves from running as
                         * we are going to change the local NAPI list.
                        napi_schedule(&bnx2x_fcoe(bp, napi));
                        local_bh_enable();
                }
 -#endif
 +
                /* Handle EQ completions */
                bnx2x_eq_int(bp);
  
@@@ -5049,7 -5050,8 +5049,7 @@@ irqreturn_t bnx2x_msix_sp_int(int irq, 
                return IRQ_HANDLED;
  #endif
  
 -#ifdef BCM_CNIC
 -      {
 +      if (CNIC_LOADED(bp)) {
                struct cnic_ops *c_ops;
  
                rcu_read_lock();
                        c_ops->cnic_handler(bp->cnic_data, NULL);
                rcu_read_unlock();
        }
 -#endif
 +
        queue_delayed_work(bnx2x_wq, &bp->sp_task, 0);
  
        return IRQ_HANDLED;
@@@ -5496,10 -5498,12 +5496,10 @@@ void bnx2x_set_storm_rx_mode(struct bnx
        unsigned long rx_mode_flags = 0, ramrod_flags = 0;
        unsigned long rx_accept_flags = 0, tx_accept_flags = 0;
  
 -#ifdef BCM_CNIC
        if (!NO_FCOE(bp))
  
                /* Configure rx_mode of FCoE Queue */
                __set_bit(BNX2X_RX_MODE_FCOE_ETH, &rx_mode_flags);
 -#endif
  
        switch (bp->rx_mode) {
        case BNX2X_RX_MODE_NONE:
@@@ -5620,12 -5624,12 +5620,12 @@@ static void bnx2x_init_internal(struct 
  
  static inline u8 bnx2x_fp_igu_sb_id(struct bnx2x_fastpath *fp)
  {
 -      return fp->bp->igu_base_sb + fp->index + CNIC_PRESENT;
 +      return fp->bp->igu_base_sb + fp->index + CNIC_SUPPORT(fp->bp);
  }
  
  static inline u8 bnx2x_fp_fw_sb_id(struct bnx2x_fastpath *fp)
  {
 -      return fp->bp->base_fw_ndsb + fp->index + CNIC_PRESENT;
 +      return fp->bp->base_fw_ndsb + fp->index + CNIC_SUPPORT(fp->bp);
  }
  
  static u8 bnx2x_fp_cl_id(struct bnx2x_fastpath *fp)
@@@ -5716,25 -5720,23 +5716,25 @@@ static void bnx2x_init_tx_ring_one(stru
        txdata->tx_pkt = 0;
  }
  
 +static void bnx2x_init_tx_rings_cnic(struct bnx2x *bp)
 +{
 +      int i;
 +
 +      for_each_tx_queue_cnic(bp, i)
 +              bnx2x_init_tx_ring_one(bp->fp[i].txdata_ptr[0]);
 +}
  static void bnx2x_init_tx_rings(struct bnx2x *bp)
  {
        int i;
        u8 cos;
  
 -      for_each_tx_queue(bp, i)
 +      for_each_eth_queue(bp, i)
                for_each_cos_in_tx_queue(&bp->fp[i], cos)
                        bnx2x_init_tx_ring_one(bp->fp[i].txdata_ptr[cos]);
  }
  
 -void bnx2x_nic_init(struct bnx2x *bp, u32 load_code)
 +void bnx2x_nic_init_cnic(struct bnx2x *bp)
  {
 -      int i;
 -
 -      for_each_eth_queue(bp, i)
 -              bnx2x_init_eth_fp(bp, i);
 -#ifdef BCM_CNIC
        if (!NO_FCOE(bp))
                bnx2x_init_fcoe_fp(bp);
  
                      BNX2X_VF_ID_INVALID, false,
                      bnx2x_cnic_fw_sb_id(bp), bnx2x_cnic_igu_sb_id(bp));
  
 -#endif
 +      /* ensure status block indices were read */
 +      rmb();
 +      bnx2x_init_rx_rings_cnic(bp);
 +      bnx2x_init_tx_rings_cnic(bp);
 +
 +      /* flush all */
 +      mb();
 +      mmiowb();
 +}
  
 +void bnx2x_nic_init(struct bnx2x *bp, u32 load_code)
 +{
 +      int i;
 +
 +      for_each_eth_queue(bp, i)
 +              bnx2x_init_eth_fp(bp, i);
        /* Initialize MOD_ABS interrupts */
        bnx2x_init_mod_abs_int(bp, &bp->link_vars, bp->common.chip_id,
                               bp->common.shmem_base, bp->common.shmem2_base,
@@@ -6043,9 -6031,10 +6043,9 @@@ static int bnx2x_int_mem_test(struct bn
        msleep(50);
        bnx2x_init_block(bp, BLOCK_BRB1, PHASE_COMMON);
        bnx2x_init_block(bp, BLOCK_PRS, PHASE_COMMON);
 -#ifndef BCM_CNIC
 -      /* set NIC mode */
 -      REG_WR(bp, PRS_REG_NIC_MODE, 1);
 -#endif
 +      if (!CNIC_SUPPORT(bp))
 +              /* set NIC mode */
 +              REG_WR(bp, PRS_REG_NIC_MODE, 1);
  
        /* Enable inputs of parser neighbor blocks */
        REG_WR(bp, TSDM_REG_ENABLE_IN1, 0x7fffffff);
@@@ -6533,8 -6522,9 +6533,8 @@@ static int bnx2x_init_hw_common(struct 
        REG_WR(bp, QM_REG_SOFT_RESET, 1);
        REG_WR(bp, QM_REG_SOFT_RESET, 0);
  
 -#ifdef BCM_CNIC
 -      bnx2x_init_block(bp, BLOCK_TM, PHASE_COMMON);
 -#endif
 +      if (CNIC_SUPPORT(bp))
 +              bnx2x_init_block(bp, BLOCK_TM, PHASE_COMMON);
  
        bnx2x_init_block(bp, BLOCK_DORQ, PHASE_COMMON);
        REG_WR(bp, DORQ_REG_DPM_CID_OFST, BNX2X_DB_SHIFT);
  
        bnx2x_init_block(bp, BLOCK_SRC, PHASE_COMMON);
  
 -#ifdef BCM_CNIC
 -      REG_WR(bp, SRC_REG_KEYSEARCH_0, 0x63285672);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_1, 0x24b8f2cc);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_2, 0x223aef9b);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_3, 0x26001e3a);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_4, 0x7ae91116);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_5, 0x5ce5230b);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_6, 0x298d8adf);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_7, 0x6eb0ff09);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_8, 0x1830f82f);
 -      REG_WR(bp, SRC_REG_KEYSEARCH_9, 0x01e46be7);
 -#endif
 +      if (CNIC_SUPPORT(bp)) {
 +              REG_WR(bp, SRC_REG_KEYSEARCH_0, 0x63285672);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_1, 0x24b8f2cc);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_2, 0x223aef9b);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_3, 0x26001e3a);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_4, 0x7ae91116);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_5, 0x5ce5230b);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_6, 0x298d8adf);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_7, 0x6eb0ff09);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_8, 0x1830f82f);
 +              REG_WR(bp, SRC_REG_KEYSEARCH_9, 0x01e46be7);
 +      }
        REG_WR(bp, SRC_REG_SOFT_RST, 0);
  
        if (sizeof(union cdu_context) != 1024)
@@@ -6796,11 -6786,11 +6796,11 @@@ static int bnx2x_init_hw_port(struct bn
        /* QM cid (connection) count */
        bnx2x_qm_init_cid_count(bp, bp->qm_cid_count, INITOP_SET);
  
 -#ifdef BCM_CNIC
 -      bnx2x_init_block(bp, BLOCK_TM, init_phase);
 -      REG_WR(bp, TM_REG_LIN0_SCAN_TIME + port*4, 20);
 -      REG_WR(bp, TM_REG_LIN0_MAX_ACTIVE_CID + port*4, 31);
 -#endif
 +      if (CNIC_SUPPORT(bp)) {
 +              bnx2x_init_block(bp, BLOCK_TM, init_phase);
 +              REG_WR(bp, TM_REG_LIN0_SCAN_TIME + port*4, 20);
 +              REG_WR(bp, TM_REG_LIN0_MAX_ACTIVE_CID + port*4, 31);
 +      }
  
        bnx2x_init_block(bp, BLOCK_DORQ, init_phase);
  
                REG_WR(bp, PBF_REG_INIT_P0 + port*4, 0);
        }
  
 -#ifdef BCM_CNIC
 -      bnx2x_init_block(bp, BLOCK_SRC, init_phase);
 -#endif
 +      if (CNIC_SUPPORT(bp))
 +              bnx2x_init_block(bp, BLOCK_SRC, init_phase);
 +
        bnx2x_init_block(bp, BLOCK_CDU, init_phase);
        bnx2x_init_block(bp, BLOCK_CFC, init_phase);
  
@@@ -7050,130 -7040,6 +7050,130 @@@ static void bnx2x_clear_func_ilt(struc
                bnx2x_ilt_wr(bp, i, 0);
  }
  
 +
 +static void bnx2x_init_searcher(struct bnx2x *bp)
 +{
 +      int port = BP_PORT(bp);
 +      bnx2x_src_init_t2(bp, bp->t2, bp->t2_mapping, SRC_CONN_NUM);
 +      /* T1 hash bits value determines the T1 number of entries */
 +      REG_WR(bp, SRC_REG_NUMBER_HASH_BITS0 + port*4, SRC_HASH_BITS);
 +}
 +
 +static inline int bnx2x_func_switch_update(struct bnx2x *bp, int suspend)
 +{
 +      int rc;
 +      struct bnx2x_func_state_params func_params = {NULL};
 +      struct bnx2x_func_switch_update_params *switch_update_params =
 +              &func_params.params.switch_update;
 +
 +      /* Prepare parameters for function state transitions */
 +      __set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
 +      __set_bit(RAMROD_RETRY, &func_params.ramrod_flags);
 +
 +      func_params.f_obj = &bp->func_obj;
 +      func_params.cmd = BNX2X_F_CMD_SWITCH_UPDATE;
 +
 +      /* Function parameters */
 +      switch_update_params->suspend = suspend;
 +
 +      rc = bnx2x_func_state_change(bp, &func_params);
 +
 +      return rc;
 +}
 +
 +static int bnx2x_reset_nic_mode(struct bnx2x *bp)
 +{
 +      int rc, i, port = BP_PORT(bp);
 +      int vlan_en = 0, mac_en[NUM_MACS];
 +
 +
 +      /* Close input from network */
 +      if (bp->mf_mode == SINGLE_FUNCTION) {
 +              bnx2x_set_rx_filter(&bp->link_params, 0);
 +      } else {
 +              vlan_en = REG_RD(bp, port ? NIG_REG_LLH1_FUNC_EN :
 +                                 NIG_REG_LLH0_FUNC_EN);
 +              REG_WR(bp, port ? NIG_REG_LLH1_FUNC_EN :
 +                        NIG_REG_LLH0_FUNC_EN, 0);
 +              for (i = 0; i < NUM_MACS; i++) {
 +                      mac_en[i] = REG_RD(bp, port ?
 +                                           (NIG_REG_LLH1_FUNC_MEM_ENABLE +
 +                                            4 * i) :
 +                                           (NIG_REG_LLH0_FUNC_MEM_ENABLE +
 +                                            4 * i));
 +                      REG_WR(bp, port ? (NIG_REG_LLH1_FUNC_MEM_ENABLE +
 +                                            4 * i) :
 +                                (NIG_REG_LLH0_FUNC_MEM_ENABLE + 4 * i), 0);
 +              }
 +      }
 +
 +      /* Close BMC to host */
 +      REG_WR(bp, port ? NIG_REG_P0_TX_MNG_HOST_ENABLE :
 +             NIG_REG_P1_TX_MNG_HOST_ENABLE, 0);
 +
 +      /* Suspend Tx switching to the PF. Completion of this ramrod
 +       * further guarantees that all the packets of that PF / child
 +       * VFs in BRB were processed by the Parser, so it is safe to
 +       * change the NIC_MODE register.
 +       */
 +      rc = bnx2x_func_switch_update(bp, 1);
 +      if (rc) {
 +              BNX2X_ERR("Can't suspend tx-switching!\n");
 +              return rc;
 +      }
 +
 +      /* Change NIC_MODE register */
 +      REG_WR(bp, PRS_REG_NIC_MODE, 0);
 +
 +      /* Open input from network */
 +      if (bp->mf_mode == SINGLE_FUNCTION) {
 +              bnx2x_set_rx_filter(&bp->link_params, 1);
 +      } else {
 +              REG_WR(bp, port ? NIG_REG_LLH1_FUNC_EN :
 +                        NIG_REG_LLH0_FUNC_EN, vlan_en);
 +              for (i = 0; i < NUM_MACS; i++) {
 +                      REG_WR(bp, port ? (NIG_REG_LLH1_FUNC_MEM_ENABLE +
 +                                            4 * i) :
 +                                (NIG_REG_LLH0_FUNC_MEM_ENABLE + 4 * i),
 +                                mac_en[i]);
 +              }
 +      }
 +
 +      /* Enable BMC to host */
 +      REG_WR(bp, port ? NIG_REG_P0_TX_MNG_HOST_ENABLE :
 +             NIG_REG_P1_TX_MNG_HOST_ENABLE, 1);
 +
 +      /* Resume Tx switching to the PF */
 +      rc = bnx2x_func_switch_update(bp, 0);
 +      if (rc) {
 +              BNX2X_ERR("Can't resume tx-switching!\n");
 +              return rc;
 +      }
 +
 +      DP(NETIF_MSG_IFUP, "NIC MODE disabled\n");
 +      return 0;
 +}
 +
 +int bnx2x_init_hw_func_cnic(struct bnx2x *bp)
 +{
 +      int rc;
 +
 +      bnx2x_ilt_init_op_cnic(bp, INITOP_SET);
 +
 +      if (CONFIGURE_NIC_MODE(bp)) {
 +              /* Configrue searcher as part of function hw init */
 +              bnx2x_init_searcher(bp);
 +
 +              /* Reset NIC mode */
 +              rc = bnx2x_reset_nic_mode(bp);
 +              if (rc)
 +                      BNX2X_ERR("Can't change NIC mode!\n");
 +              return rc;
 +      }
 +
 +      return 0;
 +}
 +
  static int bnx2x_init_hw_func(struct bnx2x *bp)
  {
        int port = BP_PORT(bp);
        }
        bnx2x_ilt_init_op(bp, INITOP_SET);
  
 -#ifdef BCM_CNIC
 -      bnx2x_src_init_t2(bp, bp->t2, bp->t2_mapping, SRC_CONN_NUM);
 -
 -      /* T1 hash bits value determines the T1 number of entries */
 -      REG_WR(bp, SRC_REG_NUMBER_HASH_BITS0 + port*4, SRC_HASH_BITS);
 -#endif
 +      if (!CONFIGURE_NIC_MODE(bp)) {
 +              bnx2x_init_searcher(bp);
 +              REG_WR(bp, PRS_REG_NIC_MODE, 0);
 +              DP(NETIF_MSG_IFUP, "NIC MODE disabled\n");
 +      } else {
 +              /* Set NIC mode */
 +              REG_WR(bp, PRS_REG_NIC_MODE, 1);
 +              DP(NETIF_MSG_IFUP, "NIC MODE configrued\n");
  
 -#ifndef BCM_CNIC
 -      /* set NIC mode */
 -      REG_WR(bp, PRS_REG_NIC_MODE, 1);
 -#endif  /* BCM_CNIC */
 +      }
  
        if (!CHIP_IS_E1x(bp)) {
                u32 pf_conf = IGU_PF_CONF_FUNC_EN;
  }
  
  
 +void bnx2x_free_mem_cnic(struct bnx2x *bp)
 +{
 +      bnx2x_ilt_mem_op_cnic(bp, ILT_MEMOP_FREE);
 +
 +      if (!CHIP_IS_E1x(bp))
 +              BNX2X_PCI_FREE(bp->cnic_sb.e2_sb, bp->cnic_sb_mapping,
 +                             sizeof(struct host_hc_status_block_e2));
 +      else
 +              BNX2X_PCI_FREE(bp->cnic_sb.e1x_sb, bp->cnic_sb_mapping,
 +                             sizeof(struct host_hc_status_block_e1x));
 +
 +      BNX2X_PCI_FREE(bp->t2, bp->t2_mapping, SRC_T2_SZ);
 +}
 +
  void bnx2x_free_mem(struct bnx2x *bp)
  {
        int i;
  
        BNX2X_FREE(bp->ilt->lines);
  
 -#ifdef BCM_CNIC
 -      if (!CHIP_IS_E1x(bp))
 -              BNX2X_PCI_FREE(bp->cnic_sb.e2_sb, bp->cnic_sb_mapping,
 -                             sizeof(struct host_hc_status_block_e2));
 -      else
 -              BNX2X_PCI_FREE(bp->cnic_sb.e1x_sb, bp->cnic_sb_mapping,
 -                             sizeof(struct host_hc_status_block_e1x));
 -
 -      BNX2X_PCI_FREE(bp->t2, bp->t2_mapping, SRC_T2_SZ);
 -#endif
 -
        BNX2X_PCI_FREE(bp->spq, bp->spq_mapping, BCM_PAGE_SIZE);
  
        BNX2X_PCI_FREE(bp->eq_ring, bp->eq_mapping,
@@@ -7581,44 -7445,24 +7581,44 @@@ alloc_mem_err
        return -ENOMEM;
  }
  
 -
 -int bnx2x_alloc_mem(struct bnx2x *bp)
 +int bnx2x_alloc_mem_cnic(struct bnx2x *bp)
  {
 -      int i, allocated, context_size;
 -
 -#ifdef BCM_CNIC
        if (!CHIP_IS_E1x(bp))
                /* size = the status block + ramrod buffers */
                BNX2X_PCI_ALLOC(bp->cnic_sb.e2_sb, &bp->cnic_sb_mapping,
                                sizeof(struct host_hc_status_block_e2));
        else
 -              BNX2X_PCI_ALLOC(bp->cnic_sb.e1x_sb, &bp->cnic_sb_mapping,
 -                              sizeof(struct host_hc_status_block_e1x));
 +              BNX2X_PCI_ALLOC(bp->cnic_sb.e1x_sb,
 +                              &bp->cnic_sb_mapping,
 +                              sizeof(struct
 +                                     host_hc_status_block_e1x));
  
 -      /* allocate searcher T2 table */
 -      BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ);
 -#endif
 +      if (CONFIGURE_NIC_MODE(bp))
 +              /* allocate searcher T2 table, as it wan't allocated before */
 +              BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ);
 +
 +      /* write address to which L5 should insert its values */
 +      bp->cnic_eth_dev.addr_drv_info_to_mcp =
 +              &bp->slowpath->drv_info_to_mcp;
 +
 +      if (bnx2x_ilt_mem_op_cnic(bp, ILT_MEMOP_ALLOC))
 +              goto alloc_mem_err;
 +
 +      return 0;
 +
 +alloc_mem_err:
 +      bnx2x_free_mem_cnic(bp);
 +      BNX2X_ERR("Can't allocate memory\n");
 +      return -ENOMEM;
 +}
 +
 +int bnx2x_alloc_mem(struct bnx2x *bp)
 +{
 +      int i, allocated, context_size;
  
 +      if (!CONFIGURE_NIC_MODE(bp))
 +              /* allocate searcher T2 table */
 +              BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ);
  
        BNX2X_PCI_ALLOC(bp->def_status_blk, &bp->def_status_blk_mapping,
                        sizeof(struct host_sp_status_block));
        BNX2X_PCI_ALLOC(bp->slowpath, &bp->slowpath_mapping,
                        sizeof(struct bnx2x_slowpath));
  
 -#ifdef BCM_CNIC
 -      /* write address to which L5 should insert its values */
 -      bp->cnic_eth_dev.addr_drv_info_to_mcp = &bp->slowpath->drv_info_to_mcp;
 -#endif
 -
        /* Allocated memory for FW statistics  */
        if (bnx2x_alloc_fw_stats_mem(bp))
                goto alloc_mem_err;
@@@ -7747,12 -7596,14 +7747,12 @@@ int bnx2x_set_eth_mac(struct bnx2x *bp
  {
        unsigned long ramrod_flags = 0;
  
 -#ifdef BCM_CNIC
        if (is_zero_ether_addr(bp->dev->dev_addr) &&
            (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp))) {
                DP(NETIF_MSG_IFUP | NETIF_MSG_IFDOWN,
                   "Ignoring Zero MAC for STORAGE SD mode\n");
                return 0;
        }
 -#endif
  
        DP(NETIF_MSG_IFUP, "Adding Eth MAC\n");
  
@@@ -7781,8 -7632,7 +7781,8 @@@ void bnx2x_set_int_mode(struct bnx2x *b
                bnx2x_enable_msi(bp);
                /* falling through... */
        case INT_MODE_INTx:
 -              bp->num_queues = 1 + NON_ETH_CONTEXT_USE;
 +              bp->num_ethernet_queues = 1;
 +              bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues;
                BNX2X_DEV_INFO("set number of queues to 1\n");
                break;
        default:
                    bp->flags & USING_SINGLE_MSIX_FLAG) {
                        /* failed to enable multiple MSI-X */
                        BNX2X_DEV_INFO("Failed to enable multiple MSI-X (%d), set number of queues to %d\n",
 -                                     bp->num_queues, 1 + NON_ETH_CONTEXT_USE);
 +                                     bp->num_queues,
 +                                     1 + bp->num_cnic_queues);
  
 -                      bp->num_queues = 1 + NON_ETH_CONTEXT_USE;
 +                      bp->num_queues = 1 + bp->num_cnic_queues;
  
                        /* Try to enable MSI */
                        if (!(bp->flags & USING_SINGLE_MSIX_FLAG) &&
@@@ -7830,9 -7679,9 +7830,9 @@@ void bnx2x_ilt_set_info(struct bnx2x *b
        ilt_client->flags = ILT_CLIENT_SKIP_MEM;
        ilt_client->start = line;
        line += bnx2x_cid_ilt_lines(bp);
 -#ifdef BCM_CNIC
 -      line += CNIC_ILT_LINES;
 -#endif
 +
 +      if (CNIC_SUPPORT(bp))
 +              line += CNIC_ILT_LINES;
        ilt_client->end = line - 1;
  
        DP(NETIF_MSG_IFUP, "ilt client[CDU]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n",
                   ilog2(ilt_client->page_size >> 12));
  
        }
 -      /* SRC */
 -      ilt_client = &ilt->clients[ILT_CLIENT_SRC];
 -#ifdef BCM_CNIC
 -      ilt_client->client_num = ILT_CLIENT_SRC;
 -      ilt_client->page_size = SRC_ILT_PAGE_SZ;
 -      ilt_client->flags = 0;
 -      ilt_client->start = line;
 -      line += SRC_ILT_LINES;
 -      ilt_client->end = line - 1;
  
 -      DP(NETIF_MSG_IFUP,
 -         "ilt client[SRC]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n",
 -         ilt_client->start,
 -         ilt_client->end,
 -         ilt_client->page_size,
 -         ilt_client->flags,
 -         ilog2(ilt_client->page_size >> 12));
 +      if (CNIC_SUPPORT(bp)) {
 +              /* SRC */
 +              ilt_client = &ilt->clients[ILT_CLIENT_SRC];
 +              ilt_client->client_num = ILT_CLIENT_SRC;
 +              ilt_client->page_size = SRC_ILT_PAGE_SZ;
 +              ilt_client->flags = 0;
 +              ilt_client->start = line;
 +              line += SRC_ILT_LINES;
 +              ilt_client->end = line - 1;
  
 -#else
 -      ilt_client->flags = (ILT_CLIENT_SKIP_INIT | ILT_CLIENT_SKIP_MEM);
 -#endif
 +              DP(NETIF_MSG_IFUP,
 +                 "ilt client[SRC]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n",
 +                 ilt_client->start,
 +                 ilt_client->end,
 +                 ilt_client->page_size,
 +                 ilt_client->flags,
 +                 ilog2(ilt_client->page_size >> 12));
  
 -      /* TM */
 -      ilt_client = &ilt->clients[ILT_CLIENT_TM];
 -#ifdef BCM_CNIC
 -      ilt_client->client_num = ILT_CLIENT_TM;
 -      ilt_client->page_size = TM_ILT_PAGE_SZ;
 -      ilt_client->flags = 0;
 -      ilt_client->start = line;
 -      line += TM_ILT_LINES;
 -      ilt_client->end = line - 1;
 +              /* TM */
 +              ilt_client = &ilt->clients[ILT_CLIENT_TM];
 +              ilt_client->client_num = ILT_CLIENT_TM;
 +              ilt_client->page_size = TM_ILT_PAGE_SZ;
 +              ilt_client->flags = 0;
 +              ilt_client->start = line;
 +              line += TM_ILT_LINES;
 +              ilt_client->end = line - 1;
  
 -      DP(NETIF_MSG_IFUP,
 -         "ilt client[TM]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n",
 -         ilt_client->start,
 -         ilt_client->end,
 -         ilt_client->page_size,
 -         ilt_client->flags,
 -         ilog2(ilt_client->page_size >> 12));
 +              DP(NETIF_MSG_IFUP,
 +                 "ilt client[TM]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n",
 +                 ilt_client->start,
 +                 ilt_client->end,
 +                 ilt_client->page_size,
 +                 ilt_client->flags,
 +                 ilog2(ilt_client->page_size >> 12));
 +      }
  
 -#else
 -      ilt_client->flags = (ILT_CLIENT_SKIP_INIT | ILT_CLIENT_SKIP_MEM);
 -#endif
        BUG_ON(line > ILT_MAX_LINES);
  }
  
@@@ -7968,7 -7823,7 +7968,7 @@@ static void bnx2x_pf_q_prep_init(struc
        }
  }
  
 -int bnx2x_setup_tx_only(struct bnx2x *bp, struct bnx2x_fastpath *fp,
 +static int bnx2x_setup_tx_only(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                        struct bnx2x_queue_state_params *q_params,
                        struct bnx2x_queue_setup_tx_only_params *tx_only_params,
                        int tx_index, bool leading)
@@@ -8069,9 -7924,6 +8069,9 @@@ int bnx2x_setup_queue(struct bnx2x *bp
        /* Set the command */
        q_params.cmd = BNX2X_Q_CMD_SETUP;
  
 +      if (IS_FCOE_FP(fp))
 +              bp->fcoe_init = true;
 +
        /* Change the state to SETUP */
        rc = bnx2x_queue_state_change(bp, &q_params);
        if (rc) {
@@@ -8185,12 -8037,12 +8185,12 @@@ static void bnx2x_reset_func(struct bnx
                           SB_DISABLED);
        }
  
 -#ifdef BCM_CNIC
 -      /* CNIC SB */
 -      REG_WR8(bp, BAR_CSTRORM_INTMEM +
 -              CSTORM_STATUS_BLOCK_DATA_STATE_OFFSET(bnx2x_cnic_fw_sb_id(bp)),
 -              SB_DISABLED);
 -#endif
 +      if (CNIC_LOADED(bp))
 +              /* CNIC SB */
 +              REG_WR8(bp, BAR_CSTRORM_INTMEM +
 +                      CSTORM_STATUS_BLOCK_DATA_STATE_OFFSET
 +                      (bnx2x_cnic_fw_sb_id(bp)), SB_DISABLED);
 +
        /* SP SB */
        REG_WR8(bp, BAR_CSTRORM_INTMEM +
                   CSTORM_SP_STATUS_BLOCK_DATA_STATE_OFFSET(func),
                REG_WR(bp, IGU_REG_TRAILING_EDGE_LATCH, 0);
        }
  
 -#ifdef BCM_CNIC
 -      /* Disable Timer scan */
 -      REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0);
 -      /*
 -       * Wait for at least 10ms and up to 2 second for the timers scan to
 -       * complete
 -       */
 -      for (i = 0; i < 200; i++) {
 -              msleep(10);
 -              if (!REG_RD(bp, TM_REG_LIN0_SCAN_ON + port*4))
 -                      break;
 +      if (CNIC_LOADED(bp)) {
 +              /* Disable Timer scan */
 +              REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0);
 +              /*
 +               * Wait for at least 10ms and up to 2 second for the timers
 +               * scan to complete
 +               */
 +              for (i = 0; i < 200; i++) {
 +                      msleep(10);
 +                      if (!REG_RD(bp, TM_REG_LIN0_SCAN_ON + port*4))
 +                              break;
 +              }
        }
 -#endif
        /* Clear ILT */
        bnx2x_clear_func_ilt(bp, func);
  
@@@ -8557,24 -8409,13 +8557,24 @@@ void bnx2x_chip_cleanup(struct bnx2x *b
        /* Close multi and leading connections
         * Completions for ramrods are collected in a synchronous way
         */
 -      for_each_queue(bp, i)
 +      for_each_eth_queue(bp, i)
                if (bnx2x_stop_queue(bp, i))
  #ifdef BNX2X_STOP_ON_ERROR
                        return;
  #else
                        goto unload_error;
  #endif
 +
 +      if (CNIC_LOADED(bp)) {
 +              for_each_cnic_queue(bp, i)
 +                      if (bnx2x_stop_queue(bp, i))
 +#ifdef BNX2X_STOP_ON_ERROR
 +                              return;
 +#else
 +                              goto unload_error;
 +#endif
 +      }
 +
        /* If SP settings didn't get completed so far - something
         * very wrong has happen.
         */
@@@ -8596,8 -8437,6 +8596,8 @@@ unload_error
        bnx2x_netif_stop(bp, 1);
        /* Delete all NAPI objects */
        bnx2x_del_all_napi(bp);
 +      if (CNIC_LOADED(bp))
 +              bnx2x_del_all_napi_cnic(bp);
  
        /* Release IRQs */
        bnx2x_free_irq(bp);
@@@ -9011,7 -8850,7 +9011,7 @@@ static int bnx2x_process_kill(struct bn
        return 0;
  }
  
 -int bnx2x_leader_reset(struct bnx2x *bp)
 +static int bnx2x_leader_reset(struct bnx2x *bp)
  {
        int rc = 0;
        bool global = bnx2x_reset_is_global(bp);
@@@ -9706,10 -9545,13 +9706,13 @@@ static int __devinit bnx2x_prev_unload_
   */
  static void __devinit bnx2x_prev_interrupted_dmae(struct bnx2x *bp)
  {
-       u32 val = REG_RD(bp, PGLUE_B_REG_PGLUE_B_INT_STS);
-       if (val & PGLUE_B_PGLUE_B_INT_STS_REG_WAS_ERROR_ATTN) {
-               BNX2X_ERR("was error bit was found to be set in pglueb upon startup. Clearing");
-               REG_WR(bp, PGLUE_B_REG_WAS_ERROR_PF_7_0_CLR, 1 << BP_FUNC(bp));
+       if (!CHIP_IS_E1x(bp)) {
+               u32 val = REG_RD(bp, PGLUE_B_REG_PGLUE_B_INT_STS);
+               if (val & PGLUE_B_PGLUE_B_INT_STS_REG_WAS_ERROR_ATTN) {
+                       BNX2X_ERR("was error bit was found to be set in pglueb upon startup. Clearing");
+                       REG_WR(bp, PGLUE_B_REG_WAS_ERROR_PF_7_0_CLR,
+                              1 << BP_FUNC(bp));
+               }
        }
  }
  
@@@ -10385,15 -10227,12 +10388,15 @@@ static void __devinit bnx2x_get_port_hw
  void bnx2x_get_iscsi_info(struct bnx2x *bp)
  {
        u32 no_flags = NO_ISCSI_FLAG;
 -#ifdef BCM_CNIC
        int port = BP_PORT(bp);
 -
        u32 max_iscsi_conn = FW_ENCODE_32BIT_PATTERN ^ SHMEM_RD(bp,
                                drv_lic_key[port].max_iscsi_conn);
  
 +      if (!CNIC_SUPPORT(bp)) {
 +              bp->flags |= no_flags;
 +              return;
 +      }
 +
        /* Get the number of maximum allowed iSCSI connections */
        bp->cnic_eth_dev.max_iscsi_conn =
                (max_iscsi_conn & BNX2X_MAX_ISCSI_INIT_CONN_MASK) >>
         */
        if (!bp->cnic_eth_dev.max_iscsi_conn)
                bp->flags |= no_flags;
 -#else
 -      bp->flags |= no_flags;
 -#endif
 +
  }
  
 -#ifdef BCM_CNIC
  static void __devinit bnx2x_get_ext_wwn_info(struct bnx2x *bp, int func)
  {
        /* Port info */
        bp->cnic_eth_dev.fcoe_wwn_node_name_lo =
                MF_CFG_RD(bp, func_ext_config[func].fcoe_wwn_node_name_lower);
  }
 -#endif
  static void __devinit bnx2x_get_fcoe_info(struct bnx2x *bp)
  {
 -#ifdef BCM_CNIC
        int port = BP_PORT(bp);
        int func = BP_ABS_FUNC(bp);
 -
        u32 max_fcoe_conn = FW_ENCODE_32BIT_PATTERN ^ SHMEM_RD(bp,
                                drv_lic_key[port].max_fcoe_conn);
  
 +      if (!CNIC_SUPPORT(bp)) {
 +              bp->flags |= NO_FCOE_FLAG;
 +              return;
 +      }
 +
        /* Get the number of maximum allowed FCoE connections */
        bp->cnic_eth_dev.max_fcoe_conn =
                (max_fcoe_conn & BNX2X_MAX_FCOE_INIT_CONN_MASK) >>
         */
        if (!bp->cnic_eth_dev.max_fcoe_conn)
                bp->flags |= NO_FCOE_FLAG;
 -#else
 -      bp->flags |= NO_FCOE_FLAG;
 -#endif
  }
  
  static void __devinit bnx2x_get_cnic_info(struct bnx2x *bp)
        bnx2x_get_fcoe_info(bp);
  }
  
 -static void __devinit bnx2x_get_mac_hwinfo(struct bnx2x *bp)
 +static void __devinit bnx2x_get_cnic_mac_hwinfo(struct bnx2x *bp)
  {
        u32 val, val2;
        int func = BP_ABS_FUNC(bp);
        int port = BP_PORT(bp);
 -#ifdef BCM_CNIC
        u8 *iscsi_mac = bp->cnic_eth_dev.iscsi_mac;
        u8 *fip_mac = bp->fip_mac;
 -#endif
  
 -      /* Zero primary MAC configuration */
 -      memset(bp->dev->dev_addr, 0, ETH_ALEN);
 -
 -      if (BP_NOMCP(bp)) {
 -              BNX2X_ERROR("warning: random MAC workaround active\n");
 -              eth_hw_addr_random(bp->dev);
 -      } else if (IS_MF(bp)) {
 -              val2 = MF_CFG_RD(bp, func_mf_config[func].mac_upper);
 -              val = MF_CFG_RD(bp, func_mf_config[func].mac_lower);
 -              if ((val2 != FUNC_MF_CFG_UPPERMAC_DEFAULT) &&
 -                  (val != FUNC_MF_CFG_LOWERMAC_DEFAULT))
 -                      bnx2x_set_mac_buf(bp->dev->dev_addr, val, val2);
 -
 -#ifdef BCM_CNIC
 -              /*
 -               * iSCSI and FCoE NPAR MACs: if there is no either iSCSI or
 +      if (IS_MF(bp)) {
 +              /* iSCSI and FCoE NPAR MACs: if there is no either iSCSI or
                 * FCoE MAC then the appropriate feature should be disabled.
 -               *
 -               * In non SD mode features configuration comes from
 -               * struct func_ext_config.
 +               * In non SD mode features configuration comes from struct
 +               * func_ext_config.
                 */
 -              if (!IS_MF_SD(bp)) {
 +              if (!IS_MF_SD(bp) && !CHIP_IS_E1x(bp)) {
                        u32 cfg = MF_CFG_RD(bp, func_ext_config[func].func_cfg);
                        if (cfg & MACP_FUNC_CFG_FLAGS_ISCSI_OFFLOAD) {
                                val2 = MF_CFG_RD(bp, func_ext_config[func].
 -                                                   iscsi_mac_addr_upper);
 +                                               iscsi_mac_addr_upper);
                                val = MF_CFG_RD(bp, func_ext_config[func].
 -                                                  iscsi_mac_addr_lower);
 +                                              iscsi_mac_addr_lower);
                                bnx2x_set_mac_buf(iscsi_mac, val, val2);
 -                              BNX2X_DEV_INFO("Read iSCSI MAC: %pM\n",
 -                                             iscsi_mac);
 -                      } else
 +                              BNX2X_DEV_INFO
 +                                      ("Read iSCSI MAC: %pM\n", iscsi_mac);
 +                      } else {
                                bp->flags |= NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG;
 +                      }
  
                        if (cfg & MACP_FUNC_CFG_FLAGS_FCOE_OFFLOAD) {
                                val2 = MF_CFG_RD(bp, func_ext_config[func].
 -                                                   fcoe_mac_addr_upper);
 +                                               fcoe_mac_addr_upper);
                                val = MF_CFG_RD(bp, func_ext_config[func].
 -                                                  fcoe_mac_addr_lower);
 +                                              fcoe_mac_addr_lower);
                                bnx2x_set_mac_buf(fip_mac, val, val2);
 -                              BNX2X_DEV_INFO("Read FCoE L2 MAC: %pM\n",
 -                                             fip_mac);
 -
 -                      } else
 +                              BNX2X_DEV_INFO
 +                                      ("Read FCoE L2 MAC: %pM\n", fip_mac);
 +                      } else {
                                bp->flags |= NO_FCOE_FLAG;
 +                      }
  
                        bp->mf_ext_config = cfg;
  
                } else { /* SD MODE */
 -                      if (IS_MF_STORAGE_SD(bp)) {
 -                              if (BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp)) {
 -                                      /* use primary mac as iscsi mac */
 -                                      memcpy(iscsi_mac, bp->dev->dev_addr,
 -                                             ETH_ALEN);
 -
 -                                      BNX2X_DEV_INFO("SD ISCSI MODE\n");
 -                                      BNX2X_DEV_INFO("Read iSCSI MAC: %pM\n",
 -                                                     iscsi_mac);
 -                              } else { /* FCoE */
 -                                      memcpy(fip_mac, bp->dev->dev_addr,
 -                                             ETH_ALEN);
 -                                      BNX2X_DEV_INFO("SD FCoE MODE\n");
 -                                      BNX2X_DEV_INFO("Read FIP MAC: %pM\n",
 -                                                     fip_mac);
 -                              }
 -                              /* Zero primary MAC configuration */
 -                              memset(bp->dev->dev_addr, 0, ETH_ALEN);
 +                      if (BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp)) {
 +                              /* use primary mac as iscsi mac */
 +                              memcpy(iscsi_mac, bp->dev->dev_addr, ETH_ALEN);
 +
 +                              BNX2X_DEV_INFO("SD ISCSI MODE\n");
 +                              BNX2X_DEV_INFO
 +                                      ("Read iSCSI MAC: %pM\n", iscsi_mac);
 +                      } else if (BNX2X_IS_MF_SD_PROTOCOL_FCOE(bp)) {
 +                              /* use primary mac as fip mac */
 +                              memcpy(fip_mac, bp->dev->dev_addr, ETH_ALEN);
 +                              BNX2X_DEV_INFO("SD FCoE MODE\n");
 +                              BNX2X_DEV_INFO
 +                                      ("Read FIP MAC: %pM\n", fip_mac);
                        }
                }
  
 +              if (IS_MF_STORAGE_SD(bp))
 +                      /* Zero primary MAC configuration */
 +                      memset(bp->dev->dev_addr, 0, ETH_ALEN);
 +
                if (IS_MF_FCOE_AFEX(bp))
                        /* use FIP MAC as primary MAC */
                        memcpy(bp->dev->dev_addr, fip_mac, ETH_ALEN);
  
 -#endif
        } else {
 -              /* in SF read MACs from port configuration */
 -              val2 = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_upper);
 -              val = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_lower);
 -              bnx2x_set_mac_buf(bp->dev->dev_addr, val, val2);
 -
 -#ifdef BCM_CNIC
                val2 = SHMEM_RD(bp, dev_info.port_hw_config[port].
 -                                  iscsi_mac_upper);
 +                              iscsi_mac_upper);
                val = SHMEM_RD(bp, dev_info.port_hw_config[port].
 -                                 iscsi_mac_lower);
 +                             iscsi_mac_lower);
                bnx2x_set_mac_buf(iscsi_mac, val, val2);
  
                val2 = SHMEM_RD(bp, dev_info.port_hw_config[port].
 -                                  fcoe_fip_mac_upper);
 +                              fcoe_fip_mac_upper);
                val = SHMEM_RD(bp, dev_info.port_hw_config[port].
 -                                 fcoe_fip_mac_lower);
 +                             fcoe_fip_mac_lower);
                bnx2x_set_mac_buf(fip_mac, val, val2);
 -#endif
        }
  
 -      memcpy(bp->link_params.mac_addr, bp->dev->dev_addr, ETH_ALEN);
 -      memcpy(bp->dev->perm_addr, bp->dev->dev_addr, ETH_ALEN);
 -
 -#ifdef BCM_CNIC
 -      /* Disable iSCSI if MAC configuration is
 -       * invalid.
 -       */
 +      /* Disable iSCSI OOO if MAC configuration is invalid. */
        if (!is_valid_ether_addr(iscsi_mac)) {
 -              bp->flags |= NO_ISCSI_FLAG;
 +              bp->flags |= NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG;
                memset(iscsi_mac, 0, ETH_ALEN);
        }
  
 -      /* Disable FCoE if MAC configuration is
 -       * invalid.
 -       */
 +      /* Disable FCoE if MAC configuration is invalid. */
        if (!is_valid_ether_addr(fip_mac)) {
                bp->flags |= NO_FCOE_FLAG;
                memset(bp->fip_mac, 0, ETH_ALEN);
        }
 -#endif
 +}
 +
 +static void __devinit bnx2x_get_mac_hwinfo(struct bnx2x *bp)
 +{
 +      u32 val, val2;
 +      int func = BP_ABS_FUNC(bp);
 +      int port = BP_PORT(bp);
 +
 +      /* Zero primary MAC configuration */
 +      memset(bp->dev->dev_addr, 0, ETH_ALEN);
 +
 +      if (BP_NOMCP(bp)) {
 +              BNX2X_ERROR("warning: random MAC workaround active\n");
 +              eth_hw_addr_random(bp->dev);
 +      } else if (IS_MF(bp)) {
 +              val2 = MF_CFG_RD(bp, func_mf_config[func].mac_upper);
 +              val = MF_CFG_RD(bp, func_mf_config[func].mac_lower);
 +              if ((val2 != FUNC_MF_CFG_UPPERMAC_DEFAULT) &&
 +                  (val != FUNC_MF_CFG_LOWERMAC_DEFAULT))
 +                      bnx2x_set_mac_buf(bp->dev->dev_addr, val, val2);
 +
 +              if (CNIC_SUPPORT(bp))
 +                      bnx2x_get_cnic_mac_hwinfo(bp);
 +      } else {
 +              /* in SF read MACs from port configuration */
 +              val2 = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_upper);
 +              val = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_lower);
 +              bnx2x_set_mac_buf(bp->dev->dev_addr, val, val2);
 +
 +              if (CNIC_SUPPORT(bp))
 +                      bnx2x_get_cnic_mac_hwinfo(bp);
 +      }
 +
 +      memcpy(bp->link_params.mac_addr, bp->dev->dev_addr, ETH_ALEN);
 +      memcpy(bp->dev->perm_addr, bp->dev->dev_addr, ETH_ALEN);
  
        if (!bnx2x_is_valid_ether_addr(bp, bp->dev->dev_addr))
                dev_err(&bp->pdev->dev,
@@@ -10998,7 -10840,9 +11001,7 @@@ static int __devinit bnx2x_init_bp(stru
        mutex_init(&bp->port.phy_mutex);
        mutex_init(&bp->fw_mb_mutex);
        spin_lock_init(&bp->stats_lock);
 -#ifdef BCM_CNIC
 -      mutex_init(&bp->cnic_mutex);
 -#endif
 +
  
        INIT_DELAYED_WORK(&bp->sp_task, bnx2x_sp_task);
        INIT_DELAYED_WORK(&bp->sp_rtnl_task, bnx2x_sp_rtnl_task);
                dev_err(&bp->pdev->dev, "MCP disabled, must load devices in order!\n");
  
        bp->disable_tpa = disable_tpa;
 -
 -#ifdef BCM_CNIC
        bp->disable_tpa |= IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp);
 -#endif
  
        /* Set TPA flags */
        if (bp->disable_tpa) {
        bnx2x_dcbx_set_state(bp, true, BNX2X_DCBX_ENABLED_ON_NEG_ON);
        bnx2x_dcbx_init_params(bp);
  
 -#ifdef BCM_CNIC
        if (CHIP_IS_E1x(bp))
                bp->cnic_base_cl_id = FP_SB_MAX_E1x;
        else
                bp->cnic_base_cl_id = FP_SB_MAX_E2;
 -#endif
  
        /* multiple tx priority */
        if (CHIP_IS_E1x(bp))
        if (CHIP_IS_E3B0(bp))
                bp->max_cos = BNX2X_MULTI_TX_COS_E3B0;
  
 +      /* We need at least one default status block for slow-path events,
 +       * second status block for the L2 queue, and a third status block for
 +       * CNIC if supproted.
 +       */
 +      if (CNIC_SUPPORT(bp))
 +              bp->min_msix_vec_cnt = 3;
 +      else
 +              bp->min_msix_vec_cnt = 2;
 +      BNX2X_DEV_INFO("bp->min_msix_vec_cnt %d", bp->min_msix_vec_cnt);
 +
        return rc;
  }
  
@@@ -11329,9 -11168,11 +11332,9 @@@ void bnx2x_set_rx_mode(struct net_devic
        }
  
        bp->rx_mode = rx_mode;
 -#ifdef BCM_CNIC
        /* handle ISCSI SD mode */
        if (IS_MF_ISCSI_SD(bp))
                bp->rx_mode = BNX2X_RX_MODE_NONE;
 -#endif
  
        /* Schedule the rx_mode command */
        if (test_bit(BNX2X_FILTER_RX_MODE_PENDING, &bp->sp_state)) {
@@@ -11443,7 -11284,7 +11446,7 @@@ static const struct net_device_ops bnx2
  #endif
        .ndo_setup_tc           = bnx2x_setup_tc,
  
 -#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC)
 +#ifdef NETDEV_FCOE_WWNN
        .ndo_fcoe_get_wwn       = bnx2x_fcoe_get_wwn,
  #endif
  };
@@@ -11909,8 -11750,9 +11912,8 @@@ static int bnx2x_set_qm_cid_count(struc
  {
        int cid_count = BNX2X_L2_MAX_CID(bp);
  
 -#ifdef BCM_CNIC
 -      cid_count += CNIC_CID_MAX;
 -#endif
 +      if (CNIC_SUPPORT(bp))
 +              cid_count += CNIC_CID_MAX;
        return roundup(cid_count, QM_CID_ROUND);
  }
  
   * @dev:      pci device
   *
   */
 -static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev)
 +static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev,
 +                                   int cnic_cnt)
  {
        int pos;
        u16 control;
         * one fast path queue: one FP queue + SB for CNIC
         */
        if (!pos)
 -              return 1 + CNIC_PRESENT;
 +              return 1 + cnic_cnt;
  
        /*
         * The value in the PCI configuration space is the index of the last
@@@ -11953,7 -11794,6 +11956,7 @@@ static int __devinit bnx2x_init_one(str
        int pcie_width, pcie_speed;
        int rc, max_non_def_sbs;
        int rx_count, tx_count, rss_count, doorbell_size;
 +      int cnic_cnt;
        /*
         * An estimated maximum supported CoS number according to the chip
         * version.
                return -ENODEV;
        }
  
 -      max_non_def_sbs = bnx2x_get_num_non_def_sbs(pdev);
 +      cnic_cnt = 1;
 +      max_non_def_sbs = bnx2x_get_num_non_def_sbs(pdev, cnic_cnt);
  
        WARN_ON(!max_non_def_sbs);
  
        /* Maximum number of RSS queues: one IGU SB goes to CNIC */
 -      rss_count = max_non_def_sbs - CNIC_PRESENT;
 +      rss_count = max_non_def_sbs - cnic_cnt;
  
        /* Maximum number of netdev Rx queues: RSS + FCoE L2 */
 -      rx_count = rss_count + FCOE_PRESENT;
 +      rx_count = rss_count + cnic_cnt;
  
        /*
         * Maximum number of netdev Tx queues:
         * Maximum TSS queues * Maximum supported number of CoS  + FCoE L2
         */
 -      tx_count = rss_count * max_cos_est + FCOE_PRESENT;
 +      tx_count = rss_count * max_cos_est + cnic_cnt;
  
        /* dev zeroed in init_etherdev */
        dev = alloc_etherdev_mqs(sizeof(*bp), tx_count, rx_count);
  
        bp->igu_sb_cnt = max_non_def_sbs;
        bp->msg_enable = debug;
 +      bp->cnic_support = cnic_cnt;
 +
        pci_set_drvdata(pdev, dev);
  
        rc = bnx2x_init_dev(pdev, dev, ent->driver_data);
                return rc;
        }
  
 +      BNX2X_DEV_INFO("Cnic support is %s\n", CNIC_SUPPORT(bp) ? "on" : "off");
        BNX2X_DEV_INFO("max_non_def_sbs %d\n", max_non_def_sbs);
  
        BNX2X_DEV_INFO("Allocated netdev with %d tx and %d rx queues\n",
        /* calc qm_cid_count */
        bp->qm_cid_count = bnx2x_set_qm_cid_count(bp);
  
 -#ifdef BCM_CNIC
 -      /* disable FCOE L2 queue for E1x */
 +      /* disable FCOE L2 queue for E1x*/
        if (CHIP_IS_E1x(bp))
                bp->flags |= NO_FCOE_FLAG;
 +
        /* disable FCOE for 57840 device, until FW supports it */
        switch (ent->driver_data) {
        case BCM57840_O:
        case BCM57840_MF:
                bp->flags |= NO_FCOE_FLAG;
        }
 -#endif
 -
  
        /* Set bp->num_queues for MSI-X mode*/
        bnx2x_set_num_queues(bp);
                goto init_one_exit;
        }
  
 -#ifdef BCM_CNIC
 +
        if (!NO_FCOE(bp)) {
                /* Add storage MAC address */
                rtnl_lock();
                dev_addr_add(bp->dev, bp->fip_mac, NETDEV_HW_ADDR_T_SAN);
                rtnl_unlock();
        }
 -#endif
  
        bnx2x_get_pcie_width_speed(bp, &pcie_width, &pcie_speed);
  
@@@ -12145,12 -11984,14 +12148,12 @@@ static void __devexit bnx2x_remove_one(
        }
        bp = netdev_priv(dev);
  
 -#ifdef BCM_CNIC
        /* Delete storage MAC address */
        if (!NO_FCOE(bp)) {
                rtnl_lock();
                dev_addr_del(bp->dev, bp->fip_mac, NETDEV_HW_ADDR_T_SAN);
                rtnl_unlock();
        }
 -#endif
  
  #ifdef BCM_DCBNL
        /* Delete app tlvs from dcbnl */
@@@ -12198,17 -12039,15 +12201,17 @@@ static int bnx2x_eeh_nic_unload(struct 
  
        bp->rx_mode = BNX2X_RX_MODE_NONE;
  
 -#ifdef BCM_CNIC
 -      bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD);
 -#endif
 +      if (CNIC_LOADED(bp))
 +              bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD);
 +
        /* Stop Tx */
        bnx2x_tx_disable(bp);
  
        bnx2x_netif_stop(bp, 0);
        /* Delete all NAPI objects */
        bnx2x_del_all_napi(bp);
 +      if (CNIC_LOADED(bp))
 +              bnx2x_del_all_napi_cnic(bp);
  
        del_timer_sync(&bp->timer);
  
@@@ -12399,6 -12238,7 +12402,6 @@@ void bnx2x_notify_link_changed(struct b
  module_init(bnx2x_init);
  module_exit(bnx2x_cleanup);
  
 -#ifdef BCM_CNIC
  /**
   * bnx2x_set_iscsi_eth_mac_addr - set iSCSI MAC(s).
   *
@@@ -12851,31 -12691,12 +12854,31 @@@ static int bnx2x_register_cnic(struct n
  {
        struct bnx2x *bp = netdev_priv(dev);
        struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
 +      int rc;
 +
 +      DP(NETIF_MSG_IFUP, "Register_cnic called\n");
  
        if (ops == NULL) {
                BNX2X_ERR("NULL ops received\n");
                return -EINVAL;
        }
  
 +      if (!CNIC_SUPPORT(bp)) {
 +              BNX2X_ERR("Can't register CNIC when not supported\n");
 +              return -EOPNOTSUPP;
 +      }
 +
 +      if (!CNIC_LOADED(bp)) {
 +              rc = bnx2x_load_cnic(bp);
 +              if (rc) {
 +                      BNX2X_ERR("CNIC-related load failed\n");
 +                      return rc;
 +              }
 +
 +      }
 +
 +      bp->cnic_enabled = true;
 +
        bp->cnic_kwq = kzalloc(PAGE_SIZE, GFP_KERNEL);
        if (!bp->cnic_kwq)
                return -ENOMEM;
@@@ -12967,4 -12788,5 +12970,4 @@@ struct cnic_eth_dev *bnx2x_cnic_probe(s
  }
  EXPORT_SYMBOL(bnx2x_cnic_probe);
  
 -#endif /* BCM_CNIC */
  
index 71cd9f0c96af35e7b643c91d7b0b380685802db6,1829b445d0b01852ea11111692174c766b3c7e55..741e73dece351be33052c0e292526827b51840c8
@@@ -1456,7 -1456,7 +1456,7 @@@ static bool ath9k_hw_set_reset_reg(stru
        switch (type) {
        case ATH9K_RESET_POWER_ON:
                ret = ath9k_hw_set_reset_power_on(ah);
-               if (!ret)
+               if (ret)
                        ah->reset_power_on = true;
                break;
        case ATH9K_RESET_WARM:
@@@ -2153,6 -2153,9 +2153,6 @@@ static bool ath9k_hw_set_power_awake(st
                    AR_RTC_FORCE_WAKE_EN);
        udelay(50);
  
 -      if (ath9k_hw_mci_is_enabled(ah))
 -              ar9003_mci_set_power_awake(ah);
 -
        for (i = POWER_UP_TIME / 50; i > 0; i--) {
                val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M;
                if (val == AR_RTC_STATUS_ON)
                return false;
        }
  
 +      if (ath9k_hw_mci_is_enabled(ah))
 +              ar9003_mci_set_power_awake(ah);
 +
        REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
  
        return true;
index da6c49177fccacfc2043d113d4101fb6af0dcbaa,ae9010ed58debd4a8dc5001e03cbe866b2c9a8a2..be52a0a8d645b322643e4d83b07c2be7f5d3adc6
@@@ -890,9 -890,6 +890,6 @@@ mwifiex_cmd_timeout_func(unsigned long 
                return;
        }
        cmd_node = adapter->curr_cmd;
-       if (cmd_node->wait_q_enabled)
-               adapter->cmd_wait_q.status = -ETIMEDOUT;
        if (cmd_node) {
                adapter->dbg.timeout_cmd_id =
                        adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index];
  
                dev_err(adapter->dev, "last_cmd_index = %d\n",
                        adapter->dbg.last_cmd_index);
 -              print_hex_dump_bytes("last_cmd_id: ", DUMP_PREFIX_OFFSET,
 -                                   adapter->dbg.last_cmd_id, DBG_CMD_NUM);
 -              print_hex_dump_bytes("last_cmd_act: ", DUMP_PREFIX_OFFSET,
 -                                   adapter->dbg.last_cmd_act, DBG_CMD_NUM);
 +              dev_err(adapter->dev, "last_cmd_id: %*ph\n",
 +                      (int)sizeof(adapter->dbg.last_cmd_id),
 +                      adapter->dbg.last_cmd_id);
 +              dev_err(adapter->dev, "last_cmd_act: %*ph\n",
 +                      (int)sizeof(adapter->dbg.last_cmd_act),
 +                      adapter->dbg.last_cmd_act);
  
                dev_err(adapter->dev, "last_cmd_resp_index = %d\n",
                        adapter->dbg.last_cmd_resp_index);
 -              print_hex_dump_bytes("last_cmd_resp_id: ", DUMP_PREFIX_OFFSET,
 -                                   adapter->dbg.last_cmd_resp_id,
 -                                   DBG_CMD_NUM);
 +              dev_err(adapter->dev, "last_cmd_resp_id: %*ph\n",
 +                      (int)sizeof(adapter->dbg.last_cmd_resp_id),
 +                      adapter->dbg.last_cmd_resp_id);
  
                dev_err(adapter->dev, "last_event_index = %d\n",
                        adapter->dbg.last_event_index);
 -              print_hex_dump_bytes("last_event: ", DUMP_PREFIX_OFFSET,
 -                                   adapter->dbg.last_event, DBG_CMD_NUM);
 +              dev_err(adapter->dev, "last_event: %*ph\n",
 +                      (int)sizeof(adapter->dbg.last_event),
 +                      adapter->dbg.last_event);
  
                dev_err(adapter->dev, "data_sent=%d cmd_sent=%d\n",
                        adapter->data_sent, adapter->cmd_sent);
  
                dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n",
                        adapter->ps_mode, adapter->ps_state);
+               if (cmd_node->wait_q_enabled) {
+                       adapter->cmd_wait_q.status = -ETIMEDOUT;
+                       wake_up_interruptible(&adapter->cmd_wait_q.wait);
+                       mwifiex_cancel_pending_ioctl(adapter);
+                       /* reset cmd_sent flag to unblock new commands */
+                       adapter->cmd_sent = false;
+               }
        }
        if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING)
                mwifiex_init_fw_complete(adapter);
diff --combined drivers/nfc/pn533.c
index 18e279d3e836abc559d00809080a51b55302e766,30ae18a03a9ccc650a195547086866a66646cd98..ada681b01a17be24ecfa93b8c0ddf518c32c5c1c
@@@ -84,10 -84,6 +84,10 @@@ MODULE_DEVICE_TABLE(usb, pn533_table)
  #define PN533_LISTEN_TIME 2
  
  /* frame definitions */
 +#define PN533_NORMAL_FRAME_MAX_LEN 262  /* 6   (PREAMBLE, SOF, LEN, LCS, TFI)
 +                                         254 (DATA)
 +                                         2   (DCS, postamble) */
 +
  #define PN533_FRAME_TAIL_SIZE 2
  #define PN533_FRAME_SIZE(f) (sizeof(struct pn533_frame) + f->datalen + \
                                PN533_FRAME_TAIL_SIZE)
@@@ -702,13 -698,14 +702,14 @@@ static void pn533_wq_cmd(struct work_st
  
        cmd = list_first_entry(&dev->cmd_queue, struct pn533_cmd, queue);
  
+       list_del(&cmd->queue);
        mutex_unlock(&dev->cmd_lock);
  
        __pn533_send_cmd_frame_async(dev, cmd->out_frame, cmd->in_frame,
                                     cmd->in_frame_len, cmd->cmd_complete,
                                     cmd->arg, cmd->flags);
  
-       list_del(&cmd->queue);
        kfree(cmd);
  }
  
@@@ -1169,7 -1166,8 +1170,7 @@@ static void pn533_poll_create_mod_list(
                pn533_poll_add_mod(dev, PN533_LISTEN_MOD);
  }
  
 -static int pn533_start_poll_complete(struct pn533 *dev, void *arg,
 -                                   u8 *params, int params_len)
 +static int pn533_start_poll_complete(struct pn533 *dev, u8 *params, int params_len)
  {
        struct pn533_poll_response *resp;
        int rc;
@@@ -1307,7 -1305,8 +1308,7 @@@ static void pn533_wq_tg_get_data(struc
  }
  
  #define ATR_REQ_GB_OFFSET 17
 -static int pn533_init_target_complete(struct pn533 *dev, void *arg,
 -                                    u8 *params, int params_len)
 +static int pn533_init_target_complete(struct pn533 *dev, u8 *params, int params_len)
  {
        struct pn533_cmd_init_target_response *resp;
        u8 frame, comm_mode = NFC_COMM_PASSIVE, *gb;
@@@ -1404,9 -1403,9 +1405,9 @@@ static int pn533_poll_complete(struct p
        if (cur_mod->len == 0) {
                del_timer(&dev->listen_timer);
  
 -              return pn533_init_target_complete(dev, arg, params, params_len);
 +              return pn533_init_target_complete(dev, params, params_len);
        } else {
 -              rc = pn533_start_poll_complete(dev, arg, params, params_len);
 +              rc = pn533_start_poll_complete(dev, params, params_len);
                if (!rc)
                        return rc;
        }
@@@ -1680,11 -1679,14 +1681,14 @@@ static void pn533_deactivate_target(str
  static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg,
                                                u8 *params, int params_len)
  {
-       struct pn533_cmd_jump_dep *cmd;
        struct pn533_cmd_jump_dep_response *resp;
        struct nfc_target nfc_target;
        u8 target_gt_len;
        int rc;
+       struct pn533_cmd_jump_dep *cmd = (struct pn533_cmd_jump_dep *)arg;
+       u8 active = cmd->active;
+       kfree(arg);
  
        if (params_len == -ENOENT) {
                nfc_dev_dbg(&dev->interface->dev, "");
        }
  
        resp = (struct pn533_cmd_jump_dep_response *) params;
-       cmd = (struct pn533_cmd_jump_dep *) arg;
        rc = resp->status & PN533_CMD_RET_MASK;
        if (rc != PN533_CMD_RET_SUCCESS) {
                nfc_dev_err(&dev->interface->dev,
        if (rc == 0)
                rc = nfc_dep_link_is_up(dev->nfc_dev,
                                                dev->nfc_dev->targets[0].idx,
-                                               !cmd->active, NFC_RF_INITIATOR);
+                                               !active, NFC_RF_INITIATOR);
  
        return 0;
  }
@@@ -1821,12 -1822,8 +1824,8 @@@ static int pn533_dep_link_up(struct nfc
        rc = pn533_send_cmd_frame_async(dev, dev->out_frame, dev->in_frame,
                                dev->in_maxlen, pn533_in_dep_link_up_complete,
                                cmd, GFP_KERNEL);
-       if (rc)
-               goto out;
- out:
-       kfree(cmd);
+       if (rc < 0)
+               kfree(cmd);
  
        return rc;
  }
@@@ -2080,8 -2077,12 +2079,12 @@@ error
  static int pn533_tm_send_complete(struct pn533 *dev, void *arg,
                                  u8 *params, int params_len)
  {
+       struct sk_buff *skb_out = arg;
        nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
  
+       dev_kfree_skb(skb_out);
        if (params_len < 0) {
                nfc_dev_err(&dev->interface->dev,
                            "Error %d when sending data",
@@@ -2119,7 -2120,7 +2122,7 @@@ static int pn533_tm_send(struct nfc_de
  
        rc = pn533_send_cmd_frame_async(dev, out_frame, dev->in_frame,
                                        dev->in_maxlen, pn533_tm_send_complete,
-                                       NULL, GFP_KERNEL);
+                                       skb, GFP_KERNEL);
        if (rc) {
                nfc_dev_err(&dev->interface->dev,
                            "Error %d when trying to send data", rc);
@@@ -2375,9 -2376,9 +2378,9 @@@ static int pn533_probe(struct usb_inter
                goto error;
        }
  
 -      dev->in_frame = kmalloc(dev->in_maxlen, GFP_KERNEL);
 +      dev->in_frame = kmalloc(PN533_NORMAL_FRAME_MAX_LEN, GFP_KERNEL);
        dev->in_urb = usb_alloc_urb(0, GFP_KERNEL);
 -      dev->out_frame = kmalloc(dev->out_maxlen, GFP_KERNEL);
 +      dev->out_frame = kmalloc(PN533_NORMAL_FRAME_MAX_LEN, GFP_KERNEL);
        dev->out_urb = usb_alloc_urb(0, GFP_KERNEL);
  
        if (!dev->in_frame || !dev->out_frame ||
diff --combined net/core/net-sysfs.c
index 1f8a13ce42e29e83666376c9bf2826cd4ade129e,017a8bacfb2773483c97c8fa3b162e03f09f454a..334efd5d67a9efe9706fcd0feca4f0afc3621f2e
  #include <net/sock.h>
  #include <net/net_namespace.h>
  #include <linux/rtnetlink.h>
 -#include <linux/wireless.h>
  #include <linux/vmalloc.h>
  #include <linux/export.h>
  #include <linux/jiffies.h>
 -#include <net/wext.h>
  
  #include "net-sysfs.h"
  
@@@ -71,12 -73,11 +71,12 @@@ static ssize_t netdev_store(struct devi
                            const char *buf, size_t len,
                            int (*set)(struct net_device *, unsigned long))
  {
 -      struct net_device *net = to_net_dev(dev);
 +      struct net_device *netdev = to_net_dev(dev);
 +      struct net *net = dev_net(netdev);
        unsigned long new;
        int ret = -EINVAL;
  
 -      if (!capable(CAP_NET_ADMIN))
 +      if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
                return -EPERM;
  
        ret = kstrtoul(buf, 0, &new);
@@@ -86,8 -87,8 +86,8 @@@
        if (!rtnl_trylock())
                return restart_syscall();
  
 -      if (dev_isalive(net)) {
 -              if ((ret = (*set)(net, new)) == 0)
 +      if (dev_isalive(netdev)) {
 +              if ((ret = (*set)(netdev, new)) == 0)
                        ret = len;
        }
        rtnl_unlock();
@@@ -263,9 -264,6 +263,9 @@@ static ssize_t store_tx_queue_len(struc
                                  struct device_attribute *attr,
                                  const char *buf, size_t len)
  {
 +      if (!capable(CAP_NET_ADMIN))
 +              return -EPERM;
 +
        return netdev_store(dev, attr, buf, len, change_tx_queue_len);
  }
  
@@@ -273,11 -271,10 +273,11 @@@ static ssize_t store_ifalias(struct dev
                             const char *buf, size_t len)
  {
        struct net_device *netdev = to_net_dev(dev);
 +      struct net *net = dev_net(netdev);
        size_t count = len;
        ssize_t ret;
  
 -      if (!capable(CAP_NET_ADMIN))
 +      if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
                return -EPERM;
  
        /* ignore trailing newline */
@@@ -432,6 -429,17 +432,17 @@@ static struct attribute_group netstat_g
        .name  = "statistics",
        .attrs  = netstat_attrs,
  };
+ #if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
+ static struct attribute *wireless_attrs[] = {
+       NULL
+ };
+ static struct attribute_group wireless_group = {
+       .name = "wireless",
+       .attrs = wireless_attrs,
+ };
+ #endif
  #endif /* CONFIG_SYSFS */
  
  #ifdef CONFIG_RPS
@@@ -1412,6 -1420,15 +1423,15 @@@ int netdev_register_kobject(struct net_
                groups++;
  
        *groups++ = &netstat_group;
+ #if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
+       if (net->ieee80211_ptr)
+               *groups++ = &wireless_group;
+ #if IS_ENABLED(CONFIG_WIRELESS_EXT)
+       else if (net->wireless_handlers)
+               *groups++ = &wireless_group;
+ #endif
+ #endif
  #endif /* CONFIG_SYSFS */
  
        error = device_add(dev);
diff --combined net/ipv4/route.c
index 5b58788db863c439b0bdc82d45e07efa70308e85,df251424d816b460ae268f21d337c57e64452fc6..baa9b289d7ab4b0a3780872ed1d05d62b9293665
@@@ -1785,6 -1785,7 +1785,7 @@@ static struct rtable *__mkroute_output(
        if (dev_out->flags & IFF_LOOPBACK)
                flags |= RTCF_LOCAL;
  
+       do_cache = true;
        if (type == RTN_BROADCAST) {
                flags |= RTCF_BROADCAST | RTCF_LOCAL;
                fi = NULL;
                if (!ip_check_mc_rcu(in_dev, fl4->daddr, fl4->saddr,
                                     fl4->flowi4_proto))
                        flags &= ~RTCF_LOCAL;
+               else
+                       do_cache = false;
                /* If multicast route do not exist use
                 * default one, but do not gateway in this case.
                 * Yes, it is hack.
        }
  
        fnhe = NULL;
-       do_cache = fi != NULL;
-       if (fi) {
+       do_cache &= fi != NULL;
+       if (do_cache) {
                struct rtable __rcu **prth;
                struct fib_nh *nh = &FIB_RES_NH(*res);
  
@@@ -2493,10 -2496,6 +2496,10 @@@ static __net_init int sysctl_route_net_
                tbl = kmemdup(tbl, sizeof(ipv4_route_flush_table), GFP_KERNEL);
                if (tbl == NULL)
                        goto err_dup;
 +
 +              /* Don't export sysctls to unprivileged users */
 +              if (net->user_ns != &init_user_ns)
 +                      tbl[0].procname = NULL;
        }
        tbl[0].extra1 = net;
  
@@@ -2601,7 -2600,7 +2604,7 @@@ int __init ip_rt_init(void
                pr_err("Unable to create route proc files\n");
  #ifdef CONFIG_XFRM
        xfrm_init();
-       xfrm4_init(ip_rt_max_size);
+       xfrm4_init();
  #endif
        rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL, NULL);
  
diff --combined net/mac80211/ibss.c
index c7386b2b767e0ea3e14826827bc59f4cdffe957a,c21e33d1abd0d945ba041182dff52ad3f9ed4dc6..67774b053535c2f50696d5274baba2b0efa6c919
@@@ -26,6 -26,7 +26,6 @@@
  #include "rate.h"
  
  #define IEEE80211_SCAN_INTERVAL (2 * HZ)
 -#define IEEE80211_SCAN_INTERVAL_SLOW (15 * HZ)
  #define IEEE80211_IBSS_JOIN_TIMEOUT (7 * HZ)
  
  #define IEEE80211_IBSS_MERGE_INTERVAL (30 * HZ)
@@@ -38,8 -39,7 +38,8 @@@ static void __ieee80211_sta_join_ibss(s
                                      const u8 *bssid, const int beacon_int,
                                      struct ieee80211_channel *chan,
                                      const u32 basic_rates,
 -                                    const u16 capability, u64 tsf)
 +                                    const u16 capability, u64 tsf,
 +                                    bool creator)
  {
        struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
        struct ieee80211_local *local = sdata->local;
        /* if merging, indicate to driver that we leave the old IBSS */
        if (sdata->vif.bss_conf.ibss_joined) {
                sdata->vif.bss_conf.ibss_joined = false;
 +              sdata->vif.bss_conf.ibss_creator = false;
                netif_carrier_off(sdata->dev);
                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IBSS);
        }
  
 -      memcpy(ifibss->bssid, bssid, ETH_ALEN);
 -
        sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
  
 -      local->oper_channel = chan;
        channel_type = ifibss->channel_type;
        if (!cfg80211_can_beacon_sec_chan(local->hw.wiphy, chan, channel_type))
                channel_type = NL80211_CHAN_HT20;
 -      if (!ieee80211_set_channel_type(local, sdata, channel_type)) {
 -              /* can only fail due to HT40+/- mismatch */
 -              channel_type = NL80211_CHAN_HT20;
 -              WARN_ON(!ieee80211_set_channel_type(local, sdata,
 -                                                  NL80211_CHAN_HT20));
 +
 +      ieee80211_vif_release_channel(sdata);
 +      if (ieee80211_vif_use_channel(sdata, chan, channel_type,
 +                                    ifibss->fixed_channel ?
 +                                      IEEE80211_CHANCTX_SHARED :
 +                                      IEEE80211_CHANCTX_EXCLUSIVE)) {
 +              sdata_info(sdata, "Failed to join IBSS, no channel context\n");
 +              return;
        }
 -      ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
 +
 +      memcpy(ifibss->bssid, bssid, ETH_ALEN);
  
        sband = local->hw.wiphy->bands[chan->band];
  
        bss_change |= BSS_CHANGED_HT;
        bss_change |= BSS_CHANGED_IBSS;
        sdata->vif.bss_conf.ibss_joined = true;
 +      sdata->vif.bss_conf.ibss_creator = creator;
        ieee80211_bss_info_change_notify(sdata, bss_change);
  
        ieee80211_sta_def_wmm_params(sdata, sband->n_bitrates, supp_rates);
@@@ -252,8 -249,7 +252,8 @@@ static void ieee80211_sta_join_ibss(str
                                  cbss->channel,
                                  basic_rates,
                                  cbss->capability,
 -                                cbss->tsf);
 +                                cbss->tsf,
 +                                false);
  }
  
  static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta,
                ibss_dbg(sdata,
                         "TX Auth SA=%pM DA=%pM BSSID=%pM (auth_transaction=1)\n",
                         sdata->vif.addr, addr, sdata->u.ibss.bssid);
 -              ieee80211_send_auth(sdata, 1, WLAN_AUTH_OPEN, NULL, 0,
 +              ieee80211_send_auth(sdata, 1, WLAN_AUTH_OPEN, 0, NULL, 0,
                                    addr, sdata->u.ibss.bssid, NULL, 0, 0);
        }
        return sta;
@@@ -298,8 -294,7 +298,8 @@@ ieee80211_ibss_add_sta(struct ieee80211
        struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
        struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
 -      int band = local->oper_channel->band;
 +      struct ieee80211_chanctx_conf *chanctx_conf;
 +      int band;
  
        /*
         * XXX: Consider removing the least recently used entry and
                return NULL;
        }
  
 +      rcu_read_lock();
 +      chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 +      if (WARN_ON_ONCE(!chanctx_conf))
 +              return NULL;
 +      band = chanctx_conf->channel->band;
 +      rcu_read_unlock();
 +
        sta = sta_info_alloc(sdata, addr, GFP_KERNEL);
        if (!sta) {
                rcu_read_lock();
@@@ -401,7 -389,7 +401,7 @@@ static void ieee80211_rx_mgmt_auth_ibss
         * However, try to reply to authentication attempts if someone
         * has actually implemented this.
         */
 -      ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0,
 +      ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, 0, NULL, 0,
                            mgmt->sa, sdata->u.ibss.bssid, NULL, 0, 0);
  }
  
@@@ -529,8 -517,7 +529,8 @@@ static void ieee80211_rx_bss_info(struc
                goto put_bss;
  
        /* different channel */
 -      if (cbss->channel != local->oper_channel)
 +      if (sdata->u.ibss.fixed_channel &&
 +          sdata->u.ibss.channel != cbss->channel)
                goto put_bss;
  
        /* different SSID */
@@@ -605,8 -592,7 +605,8 @@@ void ieee80211_ibss_rx_no_sta(struct ie
        struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
        struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
 -      int band = local->oper_channel->band;
 +      struct ieee80211_chanctx_conf *chanctx_conf;
 +      int band;
  
        /*
         * XXX: Consider removing the least recently used entry and
        if (!ether_addr_equal(bssid, sdata->u.ibss.bssid))
                return;
  
 +      rcu_read_lock();
 +      chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 +      if (WARN_ON_ONCE(!chanctx_conf)) {
 +              rcu_read_unlock();
 +              return;
 +      }
 +      band = chanctx_conf->channel->band;
 +      rcu_read_unlock();
 +
        sta = sta_info_alloc(sdata, addr, GFP_ATOMIC);
        if (!sta)
                return;
@@@ -738,7 -715,7 +738,7 @@@ static void ieee80211_sta_create_ibss(s
  
        __ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
                                  ifibss->channel, ifibss->basic_rates,
 -                                capability, 0);
 +                                capability, 0, true);
  }
  
  /*
@@@ -807,8 -784,18 +807,8 @@@ static void ieee80211_sta_find_ibss(str
                int interval = IEEE80211_SCAN_INTERVAL;
  
                if (time_after(jiffies, ifibss->ibss_join_req +
 -                             IEEE80211_IBSS_JOIN_TIMEOUT)) {
 -                      if (!(local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS)) {
 -                              ieee80211_sta_create_ibss(sdata);
 -                              return;
 -                      }
 -                      sdata_info(sdata, "IBSS not allowed on %d MHz\n",
 -                                 local->oper_channel->center_freq);
 -
 -                      /* No IBSS found - decrease scan interval and continue
 -                       * scanning. */
 -                      interval = IEEE80211_SCAN_INTERVAL_SLOW;
 -              }
 +                             IEEE80211_IBSS_JOIN_TIMEOUT))
 +                      ieee80211_sta_create_ibss(sdata);
  
                mod_timer(&ifibss->timer,
                          round_jiffies(jiffies + interval));
@@@ -1099,6 -1086,17 +1099,6 @@@ int ieee80211_ibss_join(struct ieee8021
        sdata->u.ibss.channel_type = params->channel_type;
        sdata->u.ibss.fixed_channel = params->channel_fixed;
  
 -      /* fix ourselves to that channel now already */
 -      if (params->channel_fixed) {
 -              sdata->local->oper_channel = params->channel;
 -              if (!ieee80211_set_channel_type(sdata->local, sdata,
 -                                             params->channel_type)) {
 -                      mutex_unlock(&sdata->u.ibss.mtx);
 -                      kfree_skb(skb);
 -                      return -EINVAL;
 -              }
 -      }
 -
        if (params->ie) {
                sdata->u.ibss.ie = kmemdup(params->ie, params->ie_len,
                                           GFP_KERNEL);
        changed |= BSS_CHANGED_HT;
        ieee80211_bss_info_change_notify(sdata, changed);
  
 +      sdata->smps_mode = IEEE80211_SMPS_OFF;
 +      sdata->needed_rx_chains = sdata->local->rx_chains;
 +
        ieee80211_queue_work(&sdata->local->hw, &sdata->work);
  
        return 0;
@@@ -1156,10 -1151,6 +1156,6 @@@ int ieee80211_ibss_leave(struct ieee802
  
        mutex_lock(&sdata->u.ibss.mtx);
  
-       sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
-       memset(sdata->u.ibss.bssid, 0, ETH_ALEN);
-       sdata->u.ibss.ssid_len = 0;
        active_ibss = ieee80211_sta_active_ibss(sdata);
  
        if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) {
                }
        }
  
+       ifibss->state = IEEE80211_IBSS_MLME_SEARCH;
+       memset(ifibss->bssid, 0, ETH_ALEN);
+       ifibss->ssid_len = 0;
        sta_info_flush(sdata->local, sdata);
  
        spin_lock_bh(&ifibss->incomplete_lock);
                                        lockdep_is_held(&sdata->u.ibss.mtx));
        RCU_INIT_POINTER(sdata->u.ibss.presp, NULL);
        sdata->vif.bss_conf.ibss_joined = false;
 +      sdata->vif.bss_conf.ibss_creator = false;
        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
                                                BSS_CHANGED_IBSS);
        synchronize_rcu();
diff --combined net/nfc/llcp/llcp.c
index f6804532047a2467b85b7ec252459362a1f2e16d,9e8f4b2801f6099ebd5afcff20d2b5ef19e16589..2e9ddf34c099a3bc6767687d562e2112f16e7972
@@@ -45,38 -45,12 +45,38 @@@ void nfc_llcp_sock_unlink(struct llcp_s
        write_unlock(&l->lock);
  }
  
 +static void nfc_llcp_socket_purge(struct nfc_llcp_sock *sock)
 +{
 +      struct nfc_llcp_local *local = sock->local;
 +      struct sk_buff *s, *tmp;
 +
 +      pr_debug("%p\n", &sock->sk);
 +
 +      skb_queue_purge(&sock->tx_queue);
 +      skb_queue_purge(&sock->tx_pending_queue);
 +      skb_queue_purge(&sock->tx_backlog_queue);
 +
 +      if (local == NULL)
 +              return;
 +
 +      /* Search for local pending SKBs that are related to this socket */
 +      skb_queue_walk_safe(&local->tx_queue, s, tmp) {
 +              if (s->sk != &sock->sk)
 +                      continue;
 +
 +              skb_unlink(s, &local->tx_queue);
 +              kfree_skb(s);
 +      }
 +}
 +
  static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen)
  {
        struct sock *sk;
        struct hlist_node *node, *tmp;
        struct nfc_llcp_sock *llcp_sock;
  
 +      skb_queue_purge(&local->tx_queue);
 +
        write_lock(&local->sockets.lock);
  
        sk_for_each_safe(sk, node, tmp, &local->sockets.head) {
@@@ -84,8 -58,6 +84,8 @@@
  
                bh_lock_sock(sk);
  
 +              nfc_llcp_socket_purge(llcp_sock);
 +
                if (sk->sk_state == LLCP_CONNECTED)
                        nfc_put_device(llcp_sock->dev);
  
@@@ -93,8 -65,7 +93,8 @@@
                        struct nfc_llcp_sock *lsk, *n;
                        struct sock *accept_sk;
  
 -                      list_for_each_entry_safe(lsk, n, &llcp_sock->accept_queue,
 +                      list_for_each_entry_safe(lsk, n,
 +                                               &llcp_sock->accept_queue,
                                                 accept_queue) {
                                accept_sk = &lsk->sk;
                                bh_lock_sock(accept_sk);
                        }
                }
  
 +              /*
 +               * If we have a connection less socket bound, we keep it alive
 +               * if the device is still present.
 +               */
 +              if (sk->sk_state == LLCP_BOUND && sk->sk_type == SOCK_DGRAM &&
 +                  listen == true) {
 +                      bh_unlock_sock(sk);
 +                      continue;
 +              }
 +
                sk->sk_state = LLCP_CLOSED;
  
                bh_unlock_sock(sk);
@@@ -173,7 -134,7 +173,7 @@@ static struct nfc_llcp_sock *nfc_llcp_s
  {
        struct sock *sk;
        struct hlist_node *node;
 -      struct nfc_llcp_sock *llcp_sock;
 +      struct nfc_llcp_sock *llcp_sock, *tmp_sock;
  
        pr_debug("ssap dsap %d %d\n", ssap, dsap);
  
        llcp_sock = NULL;
  
        sk_for_each(sk, node, &local->sockets.head) {
 -              llcp_sock = nfc_llcp_sock(sk);
 +              tmp_sock = nfc_llcp_sock(sk);
  
 -              if (llcp_sock->ssap == ssap && llcp_sock->dsap == dsap)
 +              if (tmp_sock->ssap == ssap && tmp_sock->dsap == dsap) {
 +                      llcp_sock = tmp_sock;
                        break;
 +              }
        }
  
        read_unlock(&local->sockets.lock);
@@@ -290,12 -249,7 +290,12 @@@ struct nfc_llcp_sock *nfc_llcp_sock_fro
  
                pr_debug("llcp sock %p\n", tmp_sock);
  
 -              if (tmp_sock->sk.sk_state != LLCP_LISTEN)
 +              if (tmp_sock->sk.sk_type == SOCK_STREAM &&
 +                  tmp_sock->sk.sk_state != LLCP_LISTEN)
 +                      continue;
 +
 +              if (tmp_sock->sk.sk_type == SOCK_DGRAM &&
 +                  tmp_sock->sk.sk_state != LLCP_BOUND)
                        continue;
  
                if (tmp_sock->service_name == NULL ||
@@@ -467,9 -421,10 +467,9 @@@ static u8 nfc_llcp_reserve_sdp_ssap(str
  static int nfc_llcp_build_gb(struct nfc_llcp_local *local)
  {
        u8 *gb_cur, *version_tlv, version, version_length;
 -      u8 *lto_tlv, lto, lto_length;
 +      u8 *lto_tlv, lto_length;
        u8 *wks_tlv, wks_length;
        u8 *miux_tlv, miux_length;
 -      __be16 miux;
        u8 gb_len = 0;
        int ret = 0;
  
                                         1, &version_length);
        gb_len += version_length;
  
 -      /* 1500 ms */
 -      lto = 150;
 -      lto_tlv = nfc_llcp_build_tlv(LLCP_TLV_LTO, &lto, 1, &lto_length);
 +      lto_tlv = nfc_llcp_build_tlv(LLCP_TLV_LTO, &local->lto, 1, &lto_length);
        gb_len += lto_length;
  
        pr_debug("Local wks 0x%lx\n", local->local_wks);
                                     &wks_length);
        gb_len += wks_length;
  
 -      miux = cpu_to_be16(LLCP_MAX_MIUX);
 -      miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
 +      miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&local->miux, 0,
                                      &miux_length);
        gb_len += miux_length;
  
@@@ -652,10 -610,7 +652,10 @@@ static void nfc_llcp_tx_work(struct wor
        if (skb != NULL) {
                sk = skb->sk;
                llcp_sock = nfc_llcp_sock(sk);
 -              if (llcp_sock != NULL) {
 +
 +              if (llcp_sock == NULL && nfc_llcp_ptype(skb) == LLCP_PDU_I) {
 +                      nfc_llcp_send_symm(local->dev);
 +              } else {
                        int ret;
  
                        pr_debug("Sending pending skb\n");
                                skb_queue_tail(&llcp_sock->tx_pending_queue,
                                               skb);
                        }
 -              } else {
 -                      nfc_llcp_send_symm(local->dev);
                }
        } else {
                nfc_llcp_send_symm(local->dev);
@@@ -747,39 -704,6 +747,39 @@@ static u8 *nfc_llcp_connect_sn(struct s
        return NULL;
  }
  
 +static void nfc_llcp_recv_ui(struct nfc_llcp_local *local,
 +                           struct sk_buff *skb)
 +{
 +      struct nfc_llcp_sock *llcp_sock;
 +      struct nfc_llcp_ui_cb *ui_cb;
 +      u8 dsap, ssap;
 +
 +      dsap = nfc_llcp_dsap(skb);
 +      ssap = nfc_llcp_ssap(skb);
 +
 +      ui_cb = nfc_llcp_ui_skb_cb(skb);
 +      ui_cb->dsap = dsap;
 +      ui_cb->ssap = ssap;
 +
 +      printk("%s %d %d\n", __func__, dsap, ssap);
 +
 +      pr_debug("%d %d\n", dsap, ssap);
 +
 +      /* We're looking for a bound socket, not a client one */
 +      llcp_sock = nfc_llcp_sock_get(local, dsap, LLCP_SAP_SDP);
 +      if (llcp_sock == NULL || llcp_sock->sk.sk_type != SOCK_DGRAM)
 +              return;
 +
 +      /* There is no sequence with UI frames */
 +      skb_pull(skb, LLCP_HEADER_SIZE);
 +      if (sock_queue_rcv_skb(&llcp_sock->sk, skb)) {
 +              pr_err("receive queue is full\n");
 +              skb_queue_head(&llcp_sock->tx_backlog_queue, skb);
 +      }
 +
 +      nfc_llcp_sock_put(llcp_sock);
 +}
 +
  static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,
                                  struct sk_buff *skb)
  {
  fail:
        /* Send DM */
        nfc_llcp_send_dm(local, dsap, ssap, reason);
 -
 -      return;
 -
  }
  
  int nfc_llcp_queue_i_frames(struct nfc_llcp_sock *sock)
@@@ -1026,9 -953,6 +1026,9 @@@ static void nfc_llcp_recv_disc(struct n
  
        sk = &llcp_sock->sk;
        lock_sock(sk);
 +
 +      nfc_llcp_socket_purge(llcp_sock);
 +
        if (sk->sk_state == LLCP_CLOSED) {
                release_sock(sk);
                nfc_llcp_sock_put(llcp_sock);
@@@ -1103,7 -1027,7 +1103,7 @@@ static void nfc_llcp_recv_dm(struct nfc
        }
  
        if (llcp_sock == NULL) {
 -              pr_err("Invalid DM\n");
 +              pr_debug("Already closed\n");
                return;
        }
  
        sk->sk_state_change(sk);
  
        nfc_llcp_sock_put(llcp_sock);
 +}
  
 -      return;
 +static void nfc_llcp_recv_snl(struct nfc_llcp_local *local,
 +                            struct sk_buff *skb)
 +{
 +      struct nfc_llcp_sock *llcp_sock;
 +      u8 dsap, ssap, *tlv, type, length, tid, sap;
 +      u16 tlv_len, offset;
 +      char *service_name;
 +      size_t service_name_len;
 +
 +      dsap = nfc_llcp_dsap(skb);
 +      ssap = nfc_llcp_ssap(skb);
 +
 +      pr_debug("%d %d\n", dsap, ssap);
 +
 +      if (dsap != LLCP_SAP_SDP || ssap != LLCP_SAP_SDP) {
 +              pr_err("Wrong SNL SAP\n");
 +              return;
 +      }
 +
 +      tlv = &skb->data[LLCP_HEADER_SIZE];
 +      tlv_len = skb->len - LLCP_HEADER_SIZE;
 +      offset = 0;
 +
 +      while (offset < tlv_len) {
 +              type = tlv[0];
 +              length = tlv[1];
 +
 +              switch (type) {
 +              case LLCP_TLV_SDREQ:
 +                      tid = tlv[2];
 +                      service_name = (char *) &tlv[3];
 +                      service_name_len = length - 1;
 +
 +                      pr_debug("Looking for %.16s\n", service_name);
 +
 +                      if (service_name_len == strlen("urn:nfc:sn:sdp") &&
 +                          !strncmp(service_name, "urn:nfc:sn:sdp",
 +                                   service_name_len)) {
 +                              sap = 1;
 +                              goto send_snl;
 +                      }
 +
 +                      llcp_sock = nfc_llcp_sock_from_sn(local, service_name,
 +                                                        service_name_len);
 +                      if (!llcp_sock) {
 +                              sap = 0;
 +                              goto send_snl;
 +                      }
 +
 +                      /*
 +                       * We found a socket but its ssap has not been reserved
 +                       * yet. We need to assign it for good and send a reply.
 +                       * The ssap will be freed when the socket is closed.
 +                       */
 +                      if (llcp_sock->ssap == LLCP_SDP_UNBOUND) {
 +                              atomic_t *client_count;
 +
 +                              sap = nfc_llcp_reserve_sdp_ssap(local);
 +
 +                              pr_debug("Reserving %d\n", sap);
 +
 +                              if (sap == LLCP_SAP_MAX) {
 +                                      sap = 0;
 +                                      goto send_snl;
 +                              }
 +
 +                              client_count =
 +                                      &local->local_sdp_cnt[sap -
 +                                                            LLCP_WKS_NUM_SAP];
 +
 +                              atomic_inc(client_count);
 +
 +                              llcp_sock->ssap = sap;
 +                              llcp_sock->reserved_ssap = sap;
 +                      } else {
 +                              sap = llcp_sock->ssap;
 +                      }
 +
 +                      pr_debug("%p %d\n", llcp_sock, sap);
 +
 +send_snl:
 +                      nfc_llcp_send_snl(local, tid, sap);
 +                      break;
 +
 +              default:
 +                      pr_err("Invalid SNL tlv value 0x%x\n", type);
 +                      break;
 +              }
 +
 +              offset += length + 2;
 +              tlv += length + 2;
 +      }
  }
  
  static void nfc_llcp_rx_work(struct work_struct *work)
                pr_debug("SYMM\n");
                break;
  
 +      case LLCP_PDU_UI:
 +              pr_debug("UI\n");
 +              nfc_llcp_recv_ui(local, skb);
 +              break;
 +
        case LLCP_PDU_CONNECT:
                pr_debug("CONNECT\n");
                nfc_llcp_recv_connect(local, skb);
                nfc_llcp_recv_dm(local, skb);
                break;
  
 +      case LLCP_PDU_SNL:
 +              pr_debug("SNL\n");
 +              nfc_llcp_recv_snl(local, skb);
 +              break;
 +
        case LLCP_PDU_I:
        case LLCP_PDU_RR:
        case LLCP_PDU_RNR:
        schedule_work(&local->tx_work);
        kfree_skb(local->rx_pending);
        local->rx_pending = NULL;
 -
 -      return;
  }
  
  void nfc_llcp_recv(void *data, struct sk_buff *skb, int err)
        local->rx_pending = skb_get(skb);
        del_timer(&local->link_timer);
        schedule_work(&local->rx_work);
 -
 -      return;
  }
  
  int nfc_llcp_data_received(struct nfc_dev *dev, struct sk_buff *skb)
@@@ -1379,16 -1205,12 +1379,16 @@@ int nfc_llcp_register_device(struct nfc
        rwlock_init(&local->connecting_sockets.lock);
        rwlock_init(&local->raw_sockets.lock);
  
 +      local->lto = 150; /* 1500 ms */
 +      local->rw = LLCP_MAX_RW;
 +      local->miux = cpu_to_be16(LLCP_MAX_MIUX);
 +
        nfc_llcp_build_gb(local);
  
        local->remote_miu = LLCP_DEFAULT_MIU;
        local->remote_lto = LLCP_DEFAULT_LTO;
  
-       list_add(&llcp_devices, &local->list);
+       list_add(&local->list, &llcp_devices);
  
        return 0;
  }