From 292547b77b52be6ec0d61e1774058cad2526fd73 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Sun, 4 Nov 2012 17:11:45 +0100 Subject: [PATCH] --- yaml --- r: 340694 b: refs/heads/master c: 5b246574430f808e5b98ef40b8058bf5ac1df02d h: refs/heads/master v: v3 --- [refs] | 2 +- .../Documentation/networking/packet_mmap.txt | 13 - .../net/ethernet/broadcom/bnx2x/bnx2x.h | 132 +-- .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 460 +++------- .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | 87 +- .../net/ethernet/broadcom/bnx2x/bnx2x_dcb.c | 8 +- .../ethernet/broadcom/bnx2x/bnx2x_ethtool.c | 4 +- .../net/ethernet/broadcom/bnx2x/bnx2x_hsi.h | 21 +- .../ethernet/broadcom/bnx2x/bnx2x_init_ops.h | 29 +- .../net/ethernet/broadcom/bnx2x/bnx2x_link.c | 2 +- .../net/ethernet/broadcom/bnx2x/bnx2x_link.h | 3 +- .../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 837 +++++++----------- .../net/ethernet/broadcom/bnx2x/bnx2x_reg.h | 16 - .../net/ethernet/broadcom/bnx2x/bnx2x_sp.c | 59 +- .../net/ethernet/broadcom/bnx2x/bnx2x_sp.h | 12 - .../drivers/net/ethernet/cadence/at91_ether.c | 289 ++++-- trunk/drivers/net/ethernet/cadence/macb.c | 54 +- trunk/drivers/net/ethernet/cadence/macb.h | 10 +- trunk/drivers/net/ethernet/emulex/benet/be.h | 33 +- .../net/ethernet/emulex/benet/be_cmds.c | 17 +- .../net/ethernet/emulex/benet/be_cmds.h | 27 + .../drivers/net/ethernet/emulex/benet/be_hw.h | 17 +- .../net/ethernet/emulex/benet/be_main.c | 280 +++--- .../net/ethernet/emulex/benet/be_roce.c | 5 +- trunk/drivers/net/ethernet/freescale/Kconfig | 4 +- .../drivers/net/ethernet/freescale/fec_ptp.c | 14 +- .../net/ethernet/mellanox/mlx4/en_netdev.c | 2 +- .../net/ethernet/mellanox/mlx4/mlx4_en.h | 2 +- trunk/drivers/net/ethernet/micrel/ksz884x.c | 13 +- trunk/include/uapi/linux/if_packet.h | 1 - trunk/net/batman-adv/bat_iv_ogm.c | 8 +- trunk/net/batman-adv/icmp_socket.c | 4 +- trunk/net/batman-adv/translation-table.c | 20 +- trunk/net/batman-adv/vis.c | 9 +- trunk/net/ipv6/ndisc.c | 2 +- trunk/net/packet/af_packet.c | 46 +- trunk/net/packet/internal.h | 1 - 37 files changed, 1107 insertions(+), 1436 deletions(-) diff --git a/[refs] b/[refs] index 919d58dfa1a9..ef73b26a6286 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b20b6d972624ff024023012e38a067cb5086270e +refs/heads/master: 5b246574430f808e5b98ef40b8058bf5ac1df02d diff --git a/trunk/Documentation/networking/packet_mmap.txt b/trunk/Documentation/networking/packet_mmap.txt index 7cd879eba5dc..1c08a4b0981f 100644 --- a/trunk/Documentation/networking/packet_mmap.txt +++ b/trunk/Documentation/networking/packet_mmap.txt @@ -163,19 +163,6 @@ As capture, each frame contains two parts: A complete tutorial is available at: http://wiki.gnu-log.net/ -By default, the user should put data at : - frame base + TPACKET_HDRLEN - sizeof(struct sockaddr_ll) - -So, whatever you choose for the socket mode (SOCK_DGRAM or SOCK_RAW), -the beginning of the user data will be at : - frame base + TPACKET_ALIGN(sizeof(struct tpacket_hdr)) - -If you wish to put user data at a custom offset from the beginning of -the frame (for payload alignment with SOCK_RAW mode for instance) you -can set tp_net (with SOCK_DGRAM) or tp_mac (with SOCK_RAW). In order -to make this work it must be enabled previously with setsockopt() -and the PACKET_TX_HAS_OFF option. - -------------------------------------------------------------------------------- + PACKET_MMAP settings -------------------------------------------------------------------------------- diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index de121ccd675e..72897c47b8c8 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h @@ -34,10 +34,18 @@ #include "bnx2x_hsi.h" +#if defined(CONFIG_CNIC) || defined(CONFIG_CNIC_MODULE) +#define BCM_CNIC 1 #include "../cnic_if.h" +#endif - -#define BNX2X_MIN_MSIX_VEC_CNT(bp) ((bp)->min_msix_vec_cnt) +#ifdef BCM_CNIC +#define BNX2X_MIN_MSIX_VEC_CNT 3 +#define BNX2X_MSIX_VEC_FP_START 2 +#else +#define BNX2X_MIN_MSIX_VEC_CNT 2 +#define BNX2X_MSIX_VEC_FP_START 1 +#endif #include @@ -248,10 +256,15 @@ enum { /* FCoE L2 */ #define BNX2X_FCOE_ETH_CID(bp) (BNX2X_CNIC_START_ETH_CID(bp) + 1) -#define CNIC_SUPPORT(bp) ((bp)->cnic_support) -#define CNIC_ENABLED(bp) ((bp)->cnic_enabled) -#define CNIC_LOADED(bp) ((bp)->cnic_loaded) -#define FCOE_INIT(bp) ((bp)->fcoe_init) +/** Additional rings budgeting */ +#ifdef BCM_CNIC +#define CNIC_PRESENT 1 +#define FCOE_PRESENT 1 +#else +#define CNIC_PRESENT 0 +#define FCOE_PRESENT 0 +#endif /* BCM_CNIC */ +#define NON_ETH_CONTEXT_USE (FCOE_PRESENT) #define AEU_IN_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR \ AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR @@ -284,7 +297,9 @@ enum { OOO_TXQ_IDX_OFFSET, }; #define MAX_ETH_TXQ_IDX(bp) (BNX2X_NUM_NON_CNIC_QUEUES(bp) * (bp)->max_cos) +#ifdef BCM_CNIC #define FCOE_TXQ_IDX(bp) (MAX_ETH_TXQ_IDX(bp) + FCOE_TXQ_IDX_OFFSET) +#endif /* fast path */ /* @@ -570,9 +585,15 @@ struct bnx2x_fastpath { ->var) -#define IS_ETH_FP(fp) ((fp)->index < BNX2X_NUM_ETH_QUEUES((fp)->bp)) -#define IS_FCOE_FP(fp) ((fp)->index == FCOE_IDX((fp)->bp)) -#define IS_FCOE_IDX(idx) ((idx) == FCOE_IDX(bp)) +#define IS_ETH_FP(fp) (fp->index < \ + BNX2X_NUM_ETH_QUEUES(fp->bp)) +#ifdef BCM_CNIC +#define IS_FCOE_FP(fp) (fp->index == FCOE_IDX(fp->bp)) +#define IS_FCOE_IDX(idx) ((idx) == FCOE_IDX(bp)) +#else +#define IS_FCOE_FP(fp) false +#define IS_FCOE_IDX(idx) false +#endif /* MC hsi */ @@ -865,18 +886,6 @@ struct bnx2x_common { (CHIP_REV(bp) == CHIP_REV_Bx)) #define CHIP_IS_E3A0(bp) (CHIP_IS_E3(bp) && \ (CHIP_REV(bp) == CHIP_REV_Ax)) -/* This define is used in two main places: - * 1. In the early stages of nic_load, to know if to configrue Parser / Searcher - * to nic-only mode or to offload mode. Offload mode is configured if either the - * chip is E1x (where MIC_MODE register is not applicable), or if cnic already - * registered for this port (which means that the user wants storage services). - * 2. During cnic-related load, to know if offload mode is already configured in - * the HW or needs to be configrued. - * Since the transition from nic-mode to offload-mode in HW causes traffic - * coruption, nic-mode is configured only in ports on which storage services - * where never requested. - */ -#define CONFIGURE_NIC_MODE(bp) (!CHIP_IS_E1x(bp) && !CNIC_ENABLED(bp)) int flash_size; #define BNX2X_NVRAM_1MB_SIZE 0x20000 /* 1M bit in bytes */ @@ -994,15 +1003,18 @@ union cdu_context { #define CDU_ILT_PAGE_SZ (8192 << CDU_ILT_PAGE_SZ_HW) /* 32K */ #define ILT_PAGE_CIDS (CDU_ILT_PAGE_SZ / sizeof(union cdu_context)) +#ifdef BCM_CNIC #define CNIC_ISCSI_CID_MAX 256 #define CNIC_FCOE_CID_MAX 2048 #define CNIC_CID_MAX (CNIC_ISCSI_CID_MAX + CNIC_FCOE_CID_MAX) #define CNIC_ILT_LINES DIV_ROUND_UP(CNIC_CID_MAX, ILT_PAGE_CIDS) +#endif #define QM_ILT_PAGE_SZ_HW 0 #define QM_ILT_PAGE_SZ (4096 << QM_ILT_PAGE_SZ_HW) /* 4K */ #define QM_CID_ROUND 1024 +#ifdef BCM_CNIC /* TM (timers) host DB constants */ #define TM_ILT_PAGE_SZ_HW 0 #define TM_ILT_PAGE_SZ (4096 << TM_ILT_PAGE_SZ_HW) /* 4K */ @@ -1020,6 +1032,8 @@ union cdu_context { #define SRC_T2_SZ SRC_ILT_SZ #define SRC_ILT_LINES DIV_ROUND_UP(SRC_ILT_SZ, SRC_ILT_PAGE_SZ) +#endif + #define MAX_DMAE_C 8 /* DMA memory not used in fastpath */ @@ -1213,6 +1227,7 @@ struct bnx2x { struct bnx2x_sp_objs *sp_objs; struct bnx2x_fp_stats *fp_stats; struct bnx2x_fp_txdata *bnx2x_txq; + int bnx2x_txq_size; void __iomem *regview; void __iomem *doorbells; u16 db_size; @@ -1335,15 +1350,6 @@ struct bnx2x { #define NO_ISCSI_OOO(bp) ((bp)->flags & NO_ISCSI_OOO_FLAG) #define NO_FCOE(bp) ((bp)->flags & NO_FCOE_FLAG) - u8 cnic_support; - bool cnic_enabled; - bool cnic_loaded; - - /* Flag that indicates that we can start looking for FCoE L2 queue - * completions in the default status block. - */ - bool fcoe_init; - int pm_cap; int mrrs; @@ -1414,8 +1420,6 @@ struct bnx2x { #define BNX2X_MAX_COS 3 #define BNX2X_MAX_TX_COS 2 int num_queues; - uint num_ethernet_queues; - uint num_cnic_queues; int num_napi_queues; int disable_tpa; @@ -1429,7 +1433,6 @@ struct bnx2x { u8 igu_dsb_id; u8 igu_base_sb; u8 igu_sb_cnt; - u8 min_msix_vec_cnt; dma_addr_t def_status_blk_mapping; @@ -1475,16 +1478,16 @@ struct bnx2x { * Maximum supported number of RSS queues: number of IGU SBs minus one that goes * to CNIC. */ -#define BNX2X_MAX_RSS_COUNT(bp) ((bp)->igu_sb_cnt - CNIC_SUPPORT(bp)) +#define BNX2X_MAX_RSS_COUNT(bp) ((bp)->igu_sb_cnt - CNIC_PRESENT) /* * Maximum CID count that might be required by the bnx2x: * Max RSS * Max_Tx_Multi_Cos + FCoE + iSCSI */ #define BNX2X_L2_CID_COUNT(bp) (BNX2X_NUM_ETH_QUEUES(bp) * BNX2X_MULTI_TX_COS \ - + 2 * CNIC_SUPPORT(bp)) + + NON_ETH_CONTEXT_USE + CNIC_PRESENT) #define BNX2X_L2_MAX_CID(bp) (BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS \ - + 2 * CNIC_SUPPORT(bp)) + + NON_ETH_CONTEXT_USE + CNIC_PRESENT) #define L2_ILT_LINES(bp) (DIV_ROUND_UP(BNX2X_L2_CID_COUNT(bp),\ ILT_PAGE_CIDS)) @@ -1492,6 +1495,9 @@ struct bnx2x { int dropless_fc; +#ifdef BCM_CNIC + u32 cnic_flags; +#define BNX2X_CNIC_FLAG_MAC_SET 1 void *t2; dma_addr_t t2_mapping; struct cnic_ops __rcu *cnic_ops; @@ -1512,6 +1518,7 @@ struct bnx2x { /* Start index of the "special" (CNIC related) L2 cleints */ u8 cnic_base_cl_id; +#endif int dmae_ready; /* used to synchronize dmae accesses */ @@ -1640,9 +1647,9 @@ struct bnx2x { /* Tx queues may be less or equal to Rx queues */ extern int num_queues; #define BNX2X_NUM_QUEUES(bp) (bp->num_queues) -#define BNX2X_NUM_ETH_QUEUES(bp) ((bp)->num_ethernet_queues) +#define BNX2X_NUM_ETH_QUEUES(bp) (BNX2X_NUM_QUEUES(bp) - NON_ETH_CONTEXT_USE) #define BNX2X_NUM_NON_CNIC_QUEUES(bp) (BNX2X_NUM_QUEUES(bp) - \ - (bp)->num_cnic_queues) + NON_ETH_CONTEXT_USE) #define BNX2X_NUM_RX_QUEUES(bp) BNX2X_NUM_QUEUES(bp) #define is_multi(bp) (BNX2X_NUM_QUEUES(bp) > 1) @@ -1682,13 +1689,6 @@ struct bnx2x_func_init_params { u16 spq_prod; /* valid iff FUNC_FLG_SPQ */ }; -#define for_each_cnic_queue(bp, var) \ - for ((var) = BNX2X_NUM_ETH_QUEUES(bp); (var) < BNX2X_NUM_QUEUES(bp); \ - (var)++) \ - if (skip_queue(bp, var)) \ - continue; \ - else - #define for_each_eth_queue(bp, var) \ for ((var) = 0; (var) < BNX2X_NUM_ETH_QUEUES(bp); (var)++) @@ -1702,22 +1702,6 @@ struct bnx2x_func_init_params { else /* Skip forwarding FP */ -#define for_each_valid_rx_queue(bp, var) \ - for ((var) = 0; \ - (var) < (CNIC_LOADED(bp) ? BNX2X_NUM_QUEUES(bp) : \ - BNX2X_NUM_ETH_QUEUES(bp)); \ - (var)++) \ - if (skip_rx_queue(bp, var)) \ - continue; \ - else - -#define for_each_rx_queue_cnic(bp, var) \ - for ((var) = BNX2X_NUM_ETH_QUEUES(bp); (var) < BNX2X_NUM_QUEUES(bp); \ - (var)++) \ - if (skip_rx_queue(bp, var)) \ - continue; \ - else - #define for_each_rx_queue(bp, var) \ for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \ if (skip_rx_queue(bp, var)) \ @@ -1725,22 +1709,6 @@ struct bnx2x_func_init_params { else /* Skip OOO FP */ -#define for_each_valid_tx_queue(bp, var) \ - for ((var) = 0; \ - (var) < (CNIC_LOADED(bp) ? BNX2X_NUM_QUEUES(bp) : \ - BNX2X_NUM_ETH_QUEUES(bp)); \ - (var)++) \ - if (skip_tx_queue(bp, var)) \ - continue; \ - else - -#define for_each_tx_queue_cnic(bp, var) \ - for ((var) = BNX2X_NUM_ETH_QUEUES(bp); (var) < BNX2X_NUM_QUEUES(bp); \ - (var)++) \ - if (skip_tx_queue(bp, var)) \ - continue; \ - else - #define for_each_tx_queue(bp, var) \ for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \ if (skip_tx_queue(bp, var)) \ @@ -2211,6 +2179,7 @@ void bnx2x_notify_link_changed(struct bnx2x *bp); #define BNX2X_MF_SD_PROTOCOL(bp) \ ((bp)->mf_config[BP_VN(bp)] & FUNC_MF_CFG_PROTOCOL_MASK) +#ifdef BCM_CNIC #define BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp) \ (BNX2X_MF_SD_PROTOCOL(bp) == FUNC_MF_CFG_PROTOCOL_ISCSI) @@ -2227,12 +2196,9 @@ void bnx2x_notify_link_changed(struct bnx2x *bp); #define IS_MF_STORAGE_SD(bp) (IS_MF_SD(bp) && \ (BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp) || \ BNX2X_IS_MF_SD_PROTOCOL_FCOE(bp))) +#else +#define IS_MF_FCOE_AFEX(bp) false +#endif -enum { - SWITCH_UPDATE, - AFEX_UPDATE, -}; - -#define NUM_MACS 8 #endif /* bnx2x.h */ diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 54d522da1aa7..4833b6a9031c 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c @@ -1152,25 +1152,6 @@ static void bnx2x_free_tpa_pool(struct bnx2x *bp, } } -void bnx2x_init_rx_rings_cnic(struct bnx2x *bp) -{ - int j; - - for_each_rx_queue_cnic(bp, j) { - struct bnx2x_fastpath *fp = &bp->fp[j]; - - fp->rx_bd_cons = 0; - - /* Activate BD ring */ - /* Warning! - * this will generate an interrupt (to the TSTORM) - * must only be done after chip is initialized - */ - bnx2x_update_rx_prod(bp, fp, fp->rx_bd_prod, fp->rx_comp_prod, - fp->rx_sge_prod); - } -} - void bnx2x_init_rx_rings(struct bnx2x *bp) { int func = BP_FUNC(bp); @@ -1178,7 +1159,7 @@ void bnx2x_init_rx_rings(struct bnx2x *bp) int i, j; /* Allocate TPA resources */ - for_each_eth_queue(bp, j) { + for_each_rx_queue(bp, j) { struct bnx2x_fastpath *fp = &bp->fp[j]; DP(NETIF_MSG_IFUP, @@ -1236,7 +1217,7 @@ void bnx2x_init_rx_rings(struct bnx2x *bp) } } - for_each_eth_queue(bp, j) { + for_each_rx_queue(bp, j) { struct bnx2x_fastpath *fp = &bp->fp[j]; fp->rx_bd_cons = 0; @@ -1263,45 +1244,29 @@ void bnx2x_init_rx_rings(struct bnx2x *bp) } } -static void bnx2x_free_tx_skbs_queue(struct bnx2x_fastpath *fp) +static void bnx2x_free_tx_skbs(struct bnx2x *bp) { + int i; u8 cos; - struct bnx2x *bp = fp->bp; - for_each_cos_in_tx_queue(fp, cos) { - struct bnx2x_fp_txdata *txdata = fp->txdata_ptr[cos]; - unsigned pkts_compl = 0, bytes_compl = 0; + for_each_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]; + unsigned pkts_compl = 0, bytes_compl = 0; - u16 sw_prod = txdata->tx_pkt_prod; - u16 sw_cons = txdata->tx_pkt_cons; + u16 sw_prod = txdata->tx_pkt_prod; + u16 sw_cons = txdata->tx_pkt_cons; - while (sw_cons != sw_prod) { - bnx2x_free_tx_pkt(bp, txdata, TX_BD(sw_cons), - &pkts_compl, &bytes_compl); - sw_cons++; + while (sw_cons != sw_prod) { + bnx2x_free_tx_pkt(bp, txdata, TX_BD(sw_cons), + &pkts_compl, &bytes_compl); + sw_cons++; + } + netdev_tx_reset_queue( + netdev_get_tx_queue(bp->dev, + txdata->txq_index)); } - - netdev_tx_reset_queue( - netdev_get_tx_queue(bp->dev, - txdata->txq_index)); - } -} - -static void bnx2x_free_tx_skbs_cnic(struct bnx2x *bp) -{ - int i; - - for_each_tx_queue_cnic(bp, i) { - bnx2x_free_tx_skbs_queue(&bp->fp[i]); - } -} - -static void bnx2x_free_tx_skbs(struct bnx2x *bp) -{ - int i; - - for_each_eth_queue(bp, i) { - bnx2x_free_tx_skbs_queue(&bp->fp[i]); } } @@ -1329,20 +1294,11 @@ static void bnx2x_free_rx_bds(struct bnx2x_fastpath *fp) } } -static void bnx2x_free_rx_skbs_cnic(struct bnx2x *bp) -{ - int j; - - for_each_rx_queue_cnic(bp, j) { - bnx2x_free_rx_bds(&bp->fp[j]); - } -} - static void bnx2x_free_rx_skbs(struct bnx2x *bp) { int j; - for_each_eth_queue(bp, j) { + for_each_rx_queue(bp, j) { struct bnx2x_fastpath *fp = &bp->fp[j]; bnx2x_free_rx_bds(fp); @@ -1352,12 +1308,6 @@ static void bnx2x_free_rx_skbs(struct bnx2x *bp) } } -void bnx2x_free_skbs_cnic(struct bnx2x *bp) -{ - bnx2x_free_tx_skbs_cnic(bp); - bnx2x_free_rx_skbs_cnic(bp); -} - void bnx2x_free_skbs(struct bnx2x *bp) { bnx2x_free_tx_skbs(bp); @@ -1397,12 +1347,11 @@ static void bnx2x_free_msix_irqs(struct bnx2x *bp, int nvecs) DP(NETIF_MSG_IFDOWN, "released sp irq (%d)\n", bp->msix_table[offset].vector); offset++; - - if (CNIC_SUPPORT(bp)) { - if (nvecs == offset) - return; - offset++; - } +#ifdef BCM_CNIC + if (nvecs == offset) + return; + offset++; +#endif for_each_eth_queue(bp, i) { if (nvecs == offset) @@ -1419,7 +1368,7 @@ void bnx2x_free_irq(struct bnx2x *bp) if (bp->flags & USING_MSIX_FLAG && !(bp->flags & USING_SINGLE_MSIX_FLAG)) bnx2x_free_msix_irqs(bp, BNX2X_NUM_ETH_QUEUES(bp) + - CNIC_SUPPORT(bp) + 1); + CNIC_PRESENT + 1); else free_irq(bp->dev->irq, bp->dev); } @@ -1433,14 +1382,12 @@ int bnx2x_enable_msix(struct bnx2x *bp) bp->msix_table[0].entry); msix_vec++; - /* Cnic requires an msix vector for itself */ - if (CNIC_SUPPORT(bp)) { - bp->msix_table[msix_vec].entry = msix_vec; - BNX2X_DEV_INFO("msix_table[%d].entry = %d (CNIC)\n", - msix_vec, bp->msix_table[msix_vec].entry); - msix_vec++; - } - +#ifdef BCM_CNIC + bp->msix_table[msix_vec].entry = msix_vec; + BNX2X_DEV_INFO("msix_table[%d].entry = %d (CNIC)\n", + bp->msix_table[msix_vec].entry, bp->msix_table[msix_vec].entry); + msix_vec++; +#endif /* We need separate vectors for ETH queues only (not FCoE) */ for_each_eth_queue(bp, i) { bp->msix_table[msix_vec].entry = msix_vec; @@ -1449,7 +1396,7 @@ int bnx2x_enable_msix(struct bnx2x *bp) msix_vec++; } - req_cnt = BNX2X_NUM_ETH_QUEUES(bp) + CNIC_SUPPORT(bp) + 1; + req_cnt = BNX2X_NUM_ETH_QUEUES(bp) + CNIC_PRESENT + 1; rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], req_cnt); @@ -1457,7 +1404,7 @@ int bnx2x_enable_msix(struct bnx2x *bp) * reconfigure number of tx/rx queues according to available * MSI-X vectors */ - if (rc >= BNX2X_MIN_MSIX_VEC_CNT(bp)) { + if (rc >= BNX2X_MIN_MSIX_VEC_CNT) { /* how less vectors we will have? */ int diff = req_cnt - rc; @@ -1472,8 +1419,7 @@ int bnx2x_enable_msix(struct bnx2x *bp) /* * decrease number of queues by number of unallocated entries */ - bp->num_ethernet_queues -= diff; - bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; + bp->num_queues -= diff; BNX2X_DEV_INFO("New queue configuration set: %d\n", bp->num_queues); @@ -1489,9 +1435,6 @@ int bnx2x_enable_msix(struct bnx2x *bp) BNX2X_DEV_INFO("Using single MSI-X vector\n"); bp->flags |= USING_SINGLE_MSIX_FLAG; - BNX2X_DEV_INFO("set number of queues to 1\n"); - bp->num_ethernet_queues = 1; - bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; } else if (rc < 0) { BNX2X_DEV_INFO("MSI-X is not attainable rc %d\n", rc); goto no_msix; @@ -1521,9 +1464,9 @@ static int bnx2x_req_msix_irqs(struct bnx2x *bp) return -EBUSY; } - if (CNIC_SUPPORT(bp)) - offset++; - +#ifdef BCM_CNIC + offset++; +#endif for_each_eth_queue(bp, i) { struct bnx2x_fastpath *fp = &bp->fp[i]; snprintf(fp->name, sizeof(fp->name), "%s-fp-%d", @@ -1542,7 +1485,7 @@ static int bnx2x_req_msix_irqs(struct bnx2x *bp) } i = BNX2X_NUM_ETH_QUEUES(bp); - offset = 1 + CNIC_SUPPORT(bp); + offset = 1 + CNIC_PRESENT; netdev_info(bp->dev, "using MSI-X IRQs: sp %d fp[%d] %d ... fp[%d] %d\n", bp->msix_table[0].vector, 0, bp->msix_table[offset].vector, @@ -1613,35 +1556,19 @@ static int bnx2x_setup_irqs(struct bnx2x *bp) return 0; } -static void bnx2x_napi_enable_cnic(struct bnx2x *bp) -{ - int i; - - for_each_rx_queue_cnic(bp, i) - napi_enable(&bnx2x_fp(bp, i, napi)); -} - static void bnx2x_napi_enable(struct bnx2x *bp) { int i; - for_each_eth_queue(bp, i) + for_each_rx_queue(bp, i) napi_enable(&bnx2x_fp(bp, i, napi)); } -static void bnx2x_napi_disable_cnic(struct bnx2x *bp) -{ - int i; - - for_each_rx_queue_cnic(bp, i) - napi_disable(&bnx2x_fp(bp, i, napi)); -} - static void bnx2x_napi_disable(struct bnx2x *bp) { int i; - for_each_eth_queue(bp, i) + for_each_rx_queue(bp, i) napi_disable(&bnx2x_fp(bp, i, napi)); } @@ -1649,8 +1576,6 @@ void bnx2x_netif_start(struct bnx2x *bp) { if (netif_running(bp->dev)) { bnx2x_napi_enable(bp); - if (CNIC_LOADED(bp)) - bnx2x_napi_enable_cnic(bp); bnx2x_int_enable(bp); if (bp->state == BNX2X_STATE_OPEN) netif_tx_wake_all_queues(bp->dev); @@ -1661,15 +1586,14 @@ void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw) { bnx2x_int_disable_sync(bp, disable_hw); bnx2x_napi_disable(bp); - if (CNIC_LOADED(bp)) - bnx2x_napi_disable_cnic(bp); } u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb) { struct bnx2x *bp = netdev_priv(dev); - if (CNIC_LOADED(bp) && !NO_FCOE(bp)) { +#ifdef BCM_CNIC + if (!NO_FCOE(bp)) { struct ethhdr *hdr = (struct ethhdr *)skb->data; u16 ether_type = ntohs(hdr->h_proto); @@ -1685,7 +1609,7 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb) if ((ether_type == ETH_P_FCOE) || (ether_type == ETH_P_FIP)) return bnx2x_fcoe_tx(bp, txq_index); } - +#endif /* select a non-FCoE queue */ return __skb_tx_hash(dev, skb, BNX2X_NUM_ETH_QUEUES(bp)); } @@ -1694,15 +1618,15 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb) void bnx2x_set_num_queues(struct bnx2x *bp) { /* RSS queues */ - bp->num_ethernet_queues = bnx2x_calc_num_queues(bp); + bp->num_queues = bnx2x_calc_num_queues(bp); +#ifdef BCM_CNIC /* override in STORAGE SD modes */ if (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp)) - bp->num_ethernet_queues = 1; - + bp->num_queues = 1; +#endif /* Add special queues */ - bp->num_cnic_queues = CNIC_SUPPORT(bp); /* For FCOE */ - bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; + bp->num_queues += NON_ETH_CONTEXT_USE; BNX2X_DEV_INFO("set number of queues to %d\n", bp->num_queues); } @@ -1729,18 +1653,20 @@ void bnx2x_set_num_queues(struct bnx2x *bp) * bnx2x_setup_tc() takes care of the proper TC mappings so that __skb_tx_hash() * will return a proper Tx index if TC is enabled (netdev->num_tc > 0). */ -static int bnx2x_set_real_num_queues(struct bnx2x *bp, int include_cnic) +static int bnx2x_set_real_num_queues(struct bnx2x *bp) { int rc, tx, rx; tx = BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos; - rx = BNX2X_NUM_ETH_QUEUES(bp); + rx = BNX2X_NUM_QUEUES(bp) - NON_ETH_CONTEXT_USE; /* account for fcoe queue */ - if (include_cnic && !NO_FCOE(bp)) { - rx++; - tx++; +#ifdef BCM_CNIC + if (!NO_FCOE(bp)) { + rx += FCOE_PRESENT; + tx += FCOE_PRESENT; } +#endif rc = netif_set_real_num_tx_queues(bp->dev, tx); if (rc) { @@ -1933,26 +1859,14 @@ static void bnx2x_squeeze_objects(struct bnx2x *bp) (bp)->state = BNX2X_STATE_ERROR; \ goto label; \ } while (0) - -#define LOAD_ERROR_EXIT_CNIC(bp, label) \ - do { \ - bp->cnic_loaded = false; \ - goto label; \ - } while (0) -#else /*BNX2X_STOP_ON_ERROR*/ +#else #define LOAD_ERROR_EXIT(bp, label) \ do { \ (bp)->state = BNX2X_STATE_ERROR; \ (bp)->panic = 1; \ return -EBUSY; \ } while (0) -#define LOAD_ERROR_EXIT_CNIC(bp, label) \ - do { \ - bp->cnic_loaded = false; \ - (bp)->panic = 1; \ - return -EBUSY; \ - } while (0) -#endif /*BNX2X_STOP_ON_ERROR*/ +#endif bool bnx2x_test_firmware_version(struct bnx2x *bp, bool is_err) { @@ -2045,8 +1959,10 @@ static void bnx2x_bz_fp(struct bnx2x *bp, int index) fp->max_cos = 1; /* Init txdata pointers */ +#ifdef BCM_CNIC if (IS_FCOE_FP(fp)) fp->txdata_ptr[0] = &bp->bnx2x_txq[FCOE_TXQ_IDX(bp)]; +#endif if (IS_ETH_FP(fp)) for_each_cos_in_tx_queue(fp, cos) fp->txdata_ptr[cos] = &bp->bnx2x_txq[cos * @@ -2064,95 +1980,11 @@ static void bnx2x_bz_fp(struct bnx2x *bp, int index) else if (bp->flags & GRO_ENABLE_FLAG) fp->mode = TPA_MODE_GRO; +#ifdef BCM_CNIC /* We don't want TPA on an FCoE L2 ring */ if (IS_FCOE_FP(fp)) fp->disable_tpa = 1; -} - -int bnx2x_load_cnic(struct bnx2x *bp) -{ - int i, rc, port = BP_PORT(bp); - - DP(NETIF_MSG_IFUP, "Starting CNIC-related load\n"); - - mutex_init(&bp->cnic_mutex); - - rc = bnx2x_alloc_mem_cnic(bp); - if (rc) { - BNX2X_ERR("Unable to allocate bp memory for cnic\n"); - LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0); - } - - rc = bnx2x_alloc_fp_mem_cnic(bp); - if (rc) { - BNX2X_ERR("Unable to allocate memory for cnic fps\n"); - LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0); - } - - /* Update the number of queues with the cnic queues */ - rc = bnx2x_set_real_num_queues(bp, 1); - if (rc) { - BNX2X_ERR("Unable to set real_num_queues including cnic\n"); - LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0); - } - - /* Add all CNIC NAPI objects */ - bnx2x_add_all_napi_cnic(bp); - DP(NETIF_MSG_IFUP, "cnic napi added\n"); - bnx2x_napi_enable_cnic(bp); - - rc = bnx2x_init_hw_func_cnic(bp); - if (rc) - LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic1); - - bnx2x_nic_init_cnic(bp); - - /* Enable Timer scan */ - REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 1); - - for_each_cnic_queue(bp, i) { - rc = bnx2x_setup_queue(bp, &bp->fp[i], 0); - if (rc) { - BNX2X_ERR("Queue setup failed\n"); - LOAD_ERROR_EXIT(bp, load_error_cnic2); - } - } - - /* Initialize Rx filter. */ - netif_addr_lock_bh(bp->dev); - bnx2x_set_rx_mode(bp->dev); - netif_addr_unlock_bh(bp->dev); - - /* re-read iscsi info */ - bnx2x_get_iscsi_info(bp); - bnx2x_setup_cnic_irq_info(bp); - bnx2x_setup_cnic_info(bp); - bp->cnic_loaded = true; - if (bp->state == BNX2X_STATE_OPEN) - bnx2x_cnic_notify(bp, CNIC_CTL_START_CMD); - - - DP(NETIF_MSG_IFUP, "Ending successfully CNIC-related load\n"); - - return 0; - -#ifndef BNX2X_STOP_ON_ERROR -load_error_cnic2: - /* Disable Timer scan */ - REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0); - -load_error_cnic1: - bnx2x_napi_disable_cnic(bp); - /* Update the number of queues without the cnic queues */ - rc = bnx2x_set_real_num_queues(bp, 0); - if (rc) - BNX2X_ERR("Unable to set real_num_queues not including cnic\n"); -load_error_cnic0: - BNX2X_ERR("CNIC-related load failed\n"); - bnx2x_free_fp_mem_cnic(bp); - bnx2x_free_mem_cnic(bp); - return rc; -#endif /* ! BNX2X_STOP_ON_ERROR */ +#endif } @@ -2163,10 +1995,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) u32 load_code; int i, rc; - DP(NETIF_MSG_IFUP, "Starting NIC load\n"); - DP(NETIF_MSG_IFUP, - "CNIC is %s\n", CNIC_ENABLED(bp) ? "enabled" : "disabled"); - #ifdef BNX2X_STOP_ON_ERROR if (unlikely(bp->panic)) { BNX2X_ERR("Can't load NIC when there is panic\n"); @@ -2194,11 +2022,9 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) DP(NETIF_MSG_IFUP, "num queues: %d", bp->num_queues); for_each_queue(bp, i) bnx2x_bz_fp(bp, i); - memset(bp->bnx2x_txq, 0, (BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS + - bp->num_cnic_queues) * - sizeof(struct bnx2x_fp_txdata)); + memset(bp->bnx2x_txq, 0, bp->bnx2x_txq_size * + sizeof(struct bnx2x_fp_txdata)); - bp->fcoe_init = false; /* Set the receive queues buffer size */ bnx2x_set_rx_buf_size(bp); @@ -2208,9 +2034,9 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) /* As long as bnx2x_alloc_mem() may possibly update * bp->num_queues, bnx2x_set_real_num_queues() should always - * come after it. At this stage cnic queues are not counted. + * come after it. */ - rc = bnx2x_set_real_num_queues(bp, 0); + rc = bnx2x_set_real_num_queues(bp); if (rc) { BNX2X_ERR("Unable to set real_num_queues\n"); LOAD_ERROR_EXIT(bp, load_error0); @@ -2224,7 +2050,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) /* Add all NAPI objects */ bnx2x_add_all_napi(bp); - DP(NETIF_MSG_IFUP, "napi added\n"); bnx2x_napi_enable(bp); /* set pf load just before approaching the MCP */ @@ -2366,18 +2191,23 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) LOAD_ERROR_EXIT(bp, load_error3); } - for_each_nondefault_eth_queue(bp, i) { +#ifdef BCM_CNIC + /* Enable Timer scan */ + REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 1); +#endif + + for_each_nondefault_queue(bp, i) { rc = bnx2x_setup_queue(bp, &bp->fp[i], 0); if (rc) { BNX2X_ERR("Queue setup failed\n"); - LOAD_ERROR_EXIT(bp, load_error3); + LOAD_ERROR_EXIT(bp, load_error4); } } rc = bnx2x_init_rss_pf(bp); if (rc) { BNX2X_ERR("PF RSS init failed\n"); - LOAD_ERROR_EXIT(bp, load_error3); + LOAD_ERROR_EXIT(bp, load_error4); } /* Now when Clients are configured we are ready to work */ @@ -2387,7 +2217,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) rc = bnx2x_set_eth_mac(bp, true); if (rc) { BNX2X_ERR("Setting Ethernet MAC failed\n"); - LOAD_ERROR_EXIT(bp, load_error3); + LOAD_ERROR_EXIT(bp, load_error4); } if (bp->pending_max) { @@ -2434,8 +2264,14 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) /* start the timer */ mod_timer(&bp->timer, jiffies + bp->current_interval); - if (CNIC_ENABLED(bp)) - bnx2x_load_cnic(bp); +#ifdef BCM_CNIC + /* re-read iscsi info */ + bnx2x_get_iscsi_info(bp); + bnx2x_setup_cnic_irq_info(bp); + bnx2x_setup_cnic_info(bp); + if (bp->state == BNX2X_STATE_OPEN) + bnx2x_cnic_notify(bp, CNIC_CTL_START_CMD); +#endif /* mark driver is loaded in shmem2 */ if (SHMEM2_HAS(bp, drv_capabilities_flag)) { @@ -2457,11 +2293,14 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) if (bp->port.pmf && (bp->state != BNX2X_STATE_DIAG)) bnx2x_dcbx_init(bp, false); - DP(NETIF_MSG_IFUP, "Ending successfully NIC load\n"); - return 0; #ifndef BNX2X_STOP_ON_ERROR +load_error4: +#ifdef BCM_CNIC + /* Disable Timer scan */ + REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0); +#endif load_error3: bnx2x_int_disable_sync(bp, 1); @@ -2499,8 +2338,6 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) int i; bool global = false; - DP(NETIF_MSG_IFUP, "Starting NIC unload\n"); - /* mark driver is unloaded in shmem2 */ if (SHMEM2_HAS(bp, drv_capabilities_flag)) { u32 val; @@ -2536,13 +2373,14 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) bp->state = BNX2X_STATE_CLOSING_WAIT4_HALT; smp_mb(); - if (CNIC_LOADED(bp)) - bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); - /* Stop Tx */ bnx2x_tx_disable(bp); netdev_reset_tc(bp->dev); +#ifdef BCM_CNIC + bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); +#endif + bp->rx_mode = BNX2X_RX_MODE_NONE; del_timer_sync(&bp->timer); @@ -2576,8 +2414,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) 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); @@ -2598,19 +2435,12 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) /* Free SKBs, SGEs, TPA pool and driver internals */ bnx2x_free_skbs(bp); - if (CNIC_LOADED(bp)) - bnx2x_free_skbs_cnic(bp); for_each_rx_queue(bp, i) bnx2x_free_rx_sge_range(bp, bp->fp + i, NUM_RX_SGE); - if (CNIC_LOADED(bp)) { - bnx2x_free_fp_mem_cnic(bp); - bnx2x_free_mem_cnic(bp); - } bnx2x_free_mem(bp); bp->state = BNX2X_STATE_CLOSED; - bp->cnic_loaded = false; /* Check if there are pending parity attentions. If there are - set * RECOVERY_IN_PROGRESS. @@ -2630,8 +2460,6 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) if (!bnx2x_clear_pf_load(bp) && bnx2x_reset_is_done(bp, BP_PATH(bp))) bnx2x_disable_close_the_gate(bp); - DP(NETIF_MSG_IFUP, "Ending NIC unload\n"); - return 0; } @@ -2722,7 +2550,7 @@ int bnx2x_poll(struct napi_struct *napi, int budget) /* Fall out from the NAPI loop if needed */ if (!(bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) { - +#ifdef BCM_CNIC /* No need to update SB for FCoE L2 ring as long as * it's connected to the default SB and the SB * has been updated when NAPI was scheduled. @@ -2731,6 +2559,8 @@ int bnx2x_poll(struct napi_struct *napi, int budget) napi_complete(napi); break; } +#endif + bnx2x_update_fpsb_idx(fp); /* bnx2x_has_rx_work() reads the status block, * thus we need to ensure that status block indices @@ -3110,7 +2940,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) txq_index = skb_get_queue_mapping(skb); txq = netdev_get_tx_queue(dev, txq_index); - BUG_ON(txq_index >= MAX_ETH_TXQ_IDX(bp) + (CNIC_LOADED(bp) ? 1 : 0)); + BUG_ON(txq_index >= MAX_ETH_TXQ_IDX(bp) + FCOE_PRESENT); txdata = &bp->bnx2x_txq[txq_index]; @@ -3509,11 +3339,13 @@ int bnx2x_change_mac_addr(struct net_device *dev, void *p) return -EINVAL; } +#ifdef BCM_CNIC if ((IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp)) && !is_zero_ether_addr(addr->sa_data)) { BNX2X_ERR("Can't configure non-zero address on iSCSI or FCoE functions in MF-SD mode\n"); return -EINVAL; } +#endif if (netif_running(dev)) { rc = bnx2x_set_eth_mac(bp, false); @@ -3537,11 +3369,13 @@ static void bnx2x_free_fp_mem_at(struct bnx2x *bp, int fp_index) u8 cos; /* Common */ - +#ifdef BCM_CNIC if (IS_FCOE_IDX(fp_index)) { memset(sb, 0, sizeof(union host_hc_status_block)); fp->status_blk_mapping = 0; + } else { +#endif /* status blocks */ if (!CHIP_IS_E1x(bp)) BNX2X_PCI_FREE(sb->e2_sb, @@ -3553,8 +3387,9 @@ static void bnx2x_free_fp_mem_at(struct bnx2x *bp, int fp_index) bnx2x_fp(bp, fp_index, status_blk_mapping), sizeof(struct host_hc_status_block_e1x)); +#ifdef BCM_CNIC } - +#endif /* Rx */ if (!skip_rx_queue(bp, fp_index)) { bnx2x_free_rx_bds(fp); @@ -3596,17 +3431,10 @@ static void bnx2x_free_fp_mem_at(struct bnx2x *bp, int fp_index) /* end of fastpath */ } -void bnx2x_free_fp_mem_cnic(struct bnx2x *bp) -{ - int i; - for_each_cnic_queue(bp, i) - bnx2x_free_fp_mem_at(bp, i); -} - void bnx2x_free_fp_mem(struct bnx2x *bp) { int i; - for_each_eth_queue(bp, i) + for_each_queue(bp, i) bnx2x_free_fp_mem_at(bp, i); } @@ -3691,11 +3519,14 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index) u8 cos; int rx_ring_size = 0; +#ifdef BCM_CNIC if (!bp->rx_ring_size && (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp))) { rx_ring_size = MIN_RX_SIZE_NONTPA; bp->rx_ring_size = rx_ring_size; - } else if (!bp->rx_ring_size) { + } else +#endif + if (!bp->rx_ring_size) { rx_ring_size = MAX_RX_AVAIL/BNX2X_NUM_RX_QUEUES(bp); if (CHIP_IS_E3(bp)) { @@ -3719,8 +3550,9 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index) /* Common */ sb = &bnx2x_fp(bp, index, status_blk); - +#ifdef BCM_CNIC if (!IS_FCOE_IDX(index)) { +#endif /* status blocks */ if (!CHIP_IS_E1x(bp)) BNX2X_PCI_ALLOC(sb->e2_sb, @@ -3730,7 +3562,9 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index) BNX2X_PCI_ALLOC(sb->e1x_sb, &bnx2x_fp(bp, index, status_blk_mapping), sizeof(struct host_hc_status_block_e1x)); +#ifdef BCM_CNIC } +#endif /* FCoE Queue uses Default SB and doesn't ACK the SB, thus no need to * set shortcuts for it. @@ -3807,31 +3641,31 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index) return 0; } -int bnx2x_alloc_fp_mem_cnic(struct bnx2x *bp) -{ - if (!NO_FCOE(bp)) - /* FCoE */ - if (bnx2x_alloc_fp_mem_at(bp, FCOE_IDX(bp))) - /* we will fail load process instead of mark - * NO_FCOE_FLAG - */ - return -ENOMEM; - - return 0; -} - int bnx2x_alloc_fp_mem(struct bnx2x *bp) { int i; - /* 1. Allocate FP for leading - fatal if error - * 2. Allocate RSS - fix number of queues if error + /** + * 1. Allocate FP for leading - fatal if error + * 2. {CNIC} Allocate FCoE FP - fatal if error + * 3. {CNIC} Allocate OOO + FWD - disable OOO if error + * 4. Allocate RSS - fix number of queues if error */ /* leading */ if (bnx2x_alloc_fp_mem_at(bp, 0)) return -ENOMEM; +#ifdef BCM_CNIC + if (!NO_FCOE(bp)) + /* FCoE */ + if (bnx2x_alloc_fp_mem_at(bp, FCOE_IDX(bp))) + /* we will fail load process instead of mark + * NO_FCOE_FLAG + */ + return -ENOMEM; +#endif + /* RSS */ for_each_nondefault_eth_queue(bp, i) if (bnx2x_alloc_fp_mem_at(bp, i)) @@ -3842,17 +3676,17 @@ int bnx2x_alloc_fp_mem(struct bnx2x *bp) int delta = BNX2X_NUM_ETH_QUEUES(bp) - i; WARN_ON(delta < 0); - if (CNIC_SUPPORT(bp)) - /* move non eth FPs next to last eth FP - * must be done in that order - * FCOE_IDX < FWD_IDX < OOO_IDX - */ +#ifdef BCM_CNIC + /** + * move non eth FPs next to last eth FP + * must be done in that order + * FCOE_IDX < FWD_IDX < OOO_IDX + */ - /* move FCoE fp even NO_FCOE_FLAG is on */ - bnx2x_move_fp(bp, FCOE_IDX(bp), FCOE_IDX(bp) - delta); - bp->num_ethernet_queues -= delta; - bp->num_queues = bp->num_ethernet_queues + - bp->num_cnic_queues; + /* move FCoE fp even NO_FCOE_FLAG is on */ + bnx2x_move_fp(bp, FCOE_IDX(bp), FCOE_IDX(bp) - delta); +#endif + bp->num_queues -= delta; BNX2X_ERR("Adjusted num of queues from %d to %d\n", bp->num_queues + delta, bp->num_queues); } @@ -3877,7 +3711,7 @@ int __devinit bnx2x_alloc_mem_bp(struct bnx2x *bp) struct msix_entry *tbl; struct bnx2x_ilt *ilt; int msix_table_size = 0; - int fp_array_size, txq_array_size; + int fp_array_size; int i; /* @@ -3887,7 +3721,7 @@ int __devinit bnx2x_alloc_mem_bp(struct bnx2x *bp) msix_table_size = bp->igu_sb_cnt + 1; /* fp array: RSS plus CNIC related L2 queues */ - fp_array_size = BNX2X_MAX_RSS_COUNT(bp) + CNIC_SUPPORT(bp); + fp_array_size = BNX2X_MAX_RSS_COUNT(bp) + NON_ETH_CONTEXT_USE; BNX2X_DEV_INFO("fp_array_size %d", fp_array_size); fp = kcalloc(fp_array_size, sizeof(*fp), GFP_KERNEL); @@ -3916,12 +3750,12 @@ int __devinit bnx2x_alloc_mem_bp(struct bnx2x *bp) goto alloc_err; /* Allocate memory for the transmission queues array */ - txq_array_size = - BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS + CNIC_SUPPORT(bp); - BNX2X_DEV_INFO("txq_array_size %d", txq_array_size); - - bp->bnx2x_txq = kcalloc(txq_array_size, sizeof(struct bnx2x_fp_txdata), - GFP_KERNEL); + bp->bnx2x_txq_size = BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS; +#ifdef BCM_CNIC + bp->bnx2x_txq_size++; +#endif + bp->bnx2x_txq = kcalloc(bp->bnx2x_txq_size, + sizeof(struct bnx2x_fp_txdata), GFP_KERNEL); if (!bp->bnx2x_txq) goto alloc_err; @@ -4004,7 +3838,7 @@ int bnx2x_get_link_cfg_idx(struct bnx2x *bp) return LINK_CONFIG_IDX(sel_phy_idx); } -#ifdef NETDEV_FCOE_WWNN +#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC) int bnx2x_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type) { struct bnx2x *bp = netdev_priv(dev); diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h index ad280740b134..9c5ea6c5b4c7 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h @@ -238,6 +238,7 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance); * @dev_instance: private instance */ irqreturn_t bnx2x_interrupt(int irq, void *dev_instance); +#ifdef BCM_CNIC /** * bnx2x_cnic_notify - send command to cnic driver @@ -261,6 +262,8 @@ void bnx2x_setup_cnic_irq_info(struct bnx2x *bp); */ void bnx2x_setup_cnic_info(struct bnx2x *bp); +#endif + /** * bnx2x_int_enable - enable HW interrupts. * @@ -279,23 +282,11 @@ void bnx2x_int_enable(struct bnx2x *bp); */ void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw); -/** - * bnx2x_nic_init_cnic - init driver internals for cnic. - * - * @bp: driver handle - * @load_code: COMMON, PORT or FUNCTION - * - * Initializes: - * - rings - * - status blocks - * - etc. - */ -void bnx2x_nic_init_cnic(struct bnx2x *bp); - /** * bnx2x_nic_init - init driver internals. * * @bp: driver handle + * @load_code: COMMON, PORT or FUNCTION * * Initializes: * - rings @@ -303,12 +294,7 @@ void bnx2x_nic_init_cnic(struct bnx2x *bp); * - etc. */ void bnx2x_nic_init(struct bnx2x *bp, u32 load_code); -/** - * bnx2x_alloc_mem_cnic - allocate driver's memory for cnic. - * - * @bp: driver handle - */ -int bnx2x_alloc_mem_cnic(struct bnx2x *bp); + /** * bnx2x_alloc_mem - allocate driver's memory. * @@ -316,12 +302,6 @@ int bnx2x_alloc_mem_cnic(struct bnx2x *bp); */ int bnx2x_alloc_mem(struct bnx2x *bp); -/** - * bnx2x_free_mem_cnic - release driver's memory for cnic. - * - * @bp: driver handle - */ -void bnx2x_free_mem_cnic(struct bnx2x *bp); /** * bnx2x_free_mem - release driver's memory. * @@ -427,7 +407,6 @@ bool bnx2x_reset_is_done(struct bnx2x *bp, int engine); void bnx2x_set_reset_in_progress(struct bnx2x *bp); void bnx2x_set_reset_global(struct bnx2x *bp); void bnx2x_disable_close_the_gate(struct bnx2x *bp); -int bnx2x_init_hw_func_cnic(struct bnx2x *bp); /** * bnx2x_sp_event - handle ramrods completion. @@ -444,14 +423,6 @@ void bnx2x_sp_event(struct bnx2x_fastpath *fp, union eth_rx_cqe *rr_cqe); */ void bnx2x_ilt_set_info(struct bnx2x *bp); -/** - * bnx2x_ilt_set_cnic_info - prepare ILT configurations for SRC - * and TM. - * - * @bp: driver handle - */ -void bnx2x_ilt_set_info_cnic(struct bnx2x *bp); - /** * bnx2x_dcbx_init - initialize dcbx protocol. * @@ -520,17 +491,12 @@ int bnx2x_resume(struct pci_dev *pdev); /* Release IRQ vectors */ void bnx2x_free_irq(struct bnx2x *bp); -void bnx2x_free_fp_mem_cnic(struct bnx2x *bp); void bnx2x_free_fp_mem(struct bnx2x *bp); -int bnx2x_alloc_fp_mem_cnic(struct bnx2x *bp); int bnx2x_alloc_fp_mem(struct bnx2x *bp); void bnx2x_init_rx_rings(struct bnx2x *bp); -void bnx2x_init_rx_rings_cnic(struct bnx2x *bp); -void bnx2x_free_skbs_cnic(struct bnx2x *bp); void bnx2x_free_skbs(struct bnx2x *bp); void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw); void bnx2x_netif_start(struct bnx2x *bp); -int bnx2x_load_cnic(struct bnx2x *bp); /** * bnx2x_enable_msix - set msix configuration. @@ -581,7 +547,7 @@ void bnx2x_free_mem_bp(struct bnx2x *bp); */ int bnx2x_change_mtu(struct net_device *dev, int new_mtu); -#ifdef NETDEV_FCOE_WWNN +#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC) /** * bnx2x_fcoe_get_wwn - return the requested WWN value for this port * @@ -827,39 +793,23 @@ static inline void bnx2x_free_rx_sge(struct bnx2x *bp, sge->addr_lo = 0; } -static inline void bnx2x_add_all_napi_cnic(struct bnx2x *bp) -{ - int i; - - /* Add NAPI objects */ - for_each_rx_queue_cnic(bp, i) - netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi), - bnx2x_poll, BNX2X_NAPI_WEIGHT); -} - static inline void bnx2x_add_all_napi(struct bnx2x *bp) { int i; + bp->num_napi_queues = bp->num_queues; + /* Add NAPI objects */ - for_each_eth_queue(bp, i) + for_each_rx_queue(bp, i) netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi), bnx2x_poll, BNX2X_NAPI_WEIGHT); } -static inline void bnx2x_del_all_napi_cnic(struct bnx2x *bp) -{ - int i; - - for_each_rx_queue_cnic(bp, i) - netif_napi_del(&bnx2x_fp(bp, i, napi)); -} - static inline void bnx2x_del_all_napi(struct bnx2x *bp) { int i; - for_each_eth_queue(bp, i) + for_each_rx_queue(bp, i) netif_napi_del(&bnx2x_fp(bp, i, napi)); } @@ -1029,9 +979,11 @@ static inline u8 bnx2x_stats_id(struct bnx2x_fastpath *fp) { struct bnx2x *bp = fp->bp; if (!CHIP_IS_E1x(bp)) { +#ifdef BCM_CNIC /* there are special statistics counters for FCoE 136..140 */ if (IS_FCOE_FP(fp)) return bp->cnic_base_cl_id + (bp->pf_num >> 1); +#endif return fp->cl_id; } return fp->cl_id + BP_PORT(bp) * FP_SB_MAX_E1x; @@ -1150,6 +1102,7 @@ static inline void bnx2x_init_txdata(struct bnx2x *bp, txdata->cid, txdata->txq_index); } +#ifdef BCM_CNIC static inline u8 bnx2x_cnic_eth_cl_id(struct bnx2x *bp, u8 cl_idx) { return bp->cnic_base_cl_id + cl_idx + @@ -1209,6 +1162,7 @@ static inline void bnx2x_init_fcoe_fp(struct bnx2x *bp) fp->index, bp, fp->status_blk.e2_sb, fp->cl_id, fp->fw_sb_id, fp->igu_sb_id); } +#endif static inline int bnx2x_clean_tx_queue(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata) @@ -1326,7 +1280,7 @@ static inline bool bnx2x_mtu_allows_gro(int mtu) */ return mtu <= SGE_PAGE_SIZE && (U_ETH_SGL_SIZE * fpp) <= MAX_SKB_FRAGS; } - +#ifdef BCM_CNIC /** * bnx2x_get_iscsi_info - update iSCSI params according to licensing info. * @@ -1334,6 +1288,7 @@ static inline bool bnx2x_mtu_allows_gro(int mtu) * */ void bnx2x_get_iscsi_info(struct bnx2x *bp); +#endif /** * bnx2x_link_sync_notify - send notification to other functions. @@ -1385,11 +1340,13 @@ static inline void bnx2x_update_drv_flags(struct bnx2x *bp, u32 flags, u32 set) static inline bool bnx2x_is_valid_ether_addr(struct bnx2x *bp, u8 *addr) { - if (is_valid_ether_addr(addr) || - (is_zero_ether_addr(addr) && - (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp)))) + if (is_valid_ether_addr(addr)) return true; - +#ifdef BCM_CNIC + if (is_zero_ether_addr(addr) && + (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp))) + return true; +#endif return false; } diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c index cba4a16ab86a..2245c3895409 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c @@ -1908,10 +1908,10 @@ static void bnx2x_dcbnl_get_perm_hw_addr(struct net_device *netdev, /* first the HW mac address */ memcpy(perm_addr, netdev->dev_addr, netdev->addr_len); - if (CNIC_LOADED(bp)) - /* second SAN address */ - memcpy(perm_addr+netdev->addr_len, bp->fip_mac, - netdev->addr_len); +#ifdef BCM_CNIC + /* second SAN address */ + memcpy(perm_addr+netdev->addr_len, bp->fip_mac, netdev->addr_len); +#endif } static void bnx2x_dcbnl_set_pg_tccfg_tx(struct net_device *netdev, int prio, diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c index ec3f9e5187df..c65295dded39 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c @@ -2901,9 +2901,7 @@ static void bnx2x_get_channels(struct net_device *dev, static void bnx2x_change_num_queues(struct bnx2x *bp, int num_rss) { bnx2x_disable_msi(bp); - bp->num_ethernet_queues = num_rss; - bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; - BNX2X_DEV_INFO("set number of queues to %d\n", bp->num_queues); + BNX2X_NUM_QUEUES(bp) = num_rss + NON_ETH_CONTEXT_USE; bnx2x_set_int_mode(bp); } diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h index 7eaa74b78a5b..18704929e642 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h @@ -4845,17 +4845,9 @@ struct vif_list_event_data { __le32 reserved2; }; -/* function update event data */ -struct function_update_event_data { - u8 echo; - u8 reserved; - __le16 reserved0; - __le32 reserved1; - __le32 reserved2; -}; - - -/* union for all event ring message types */ +/* + * union for all event ring message types + */ union event_data { struct vf_pf_event_data vf_pf_event; struct eth_event_data eth_event; @@ -4863,7 +4855,6 @@ union event_data { struct vf_flr_event_data vf_flr_event; struct malicious_vf_event_data malicious_vf_event; struct vif_list_event_data vif_list_event; - struct function_update_event_data function_update_event; }; @@ -4993,10 +4984,8 @@ struct function_update_data { u8 allowed_priorities; u8 network_cos_mode; u8 lb_mode_en; - u8 tx_switch_suspend_change_flg; - u8 tx_switch_suspend; - u8 echo; - __le16 reserved1; + u8 reserved0; + __le32 reserved1; }; diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h index d755acfe7a40..fe66d902dc62 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h @@ -648,25 +648,15 @@ static int bnx2x_ilt_client_mem_op(struct bnx2x *bp, int cli_num, return rc; } -static int bnx2x_ilt_mem_op_cnic(struct bnx2x *bp, u8 memop) -{ - int rc = 0; - - if (CONFIGURE_NIC_MODE(bp)) - rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_SRC, memop); - if (!rc) - rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_TM, memop); - - return rc; -} - static int bnx2x_ilt_mem_op(struct bnx2x *bp, u8 memop) { int rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_CDU, memop); if (!rc) rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_QM, memop); - if (!rc && CNIC_SUPPORT(bp) && !CONFIGURE_NIC_MODE(bp)) + if (!rc) rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_SRC, memop); + if (!rc) + rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_TM, memop); return rc; } @@ -791,19 +781,12 @@ static void bnx2x_ilt_client_id_init_op(struct bnx2x *bp, bnx2x_ilt_client_init_op(bp, ilt_cli, initop); } -static void bnx2x_ilt_init_op_cnic(struct bnx2x *bp, u8 initop) -{ - if (CONFIGURE_NIC_MODE(bp)) - bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_SRC, initop); - bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_TM, initop); -} - static void bnx2x_ilt_init_op(struct bnx2x *bp, u8 initop) { bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_CDU, initop); bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_QM, initop); - if (CNIC_SUPPORT(bp) && !CONFIGURE_NIC_MODE(bp)) - bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_SRC, initop); + bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_SRC, initop); + bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_TM, initop); } static void bnx2x_ilt_init_client_psz(struct bnx2x *bp, int cli_num, @@ -907,6 +890,7 @@ static void bnx2x_qm_init_ptr_table(struct bnx2x *bp, int qm_cid_count, /**************************************************************************** * SRC initializations ****************************************************************************/ +#ifdef BCM_CNIC /* called during init func stage */ static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2, dma_addr_t t2_mapping, int src_cid_count) @@ -931,4 +915,5 @@ static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2, U64_HI((u64)t2_mapping + (src_cid_count-1) * sizeof(struct src_ent))); } +#endif #endif /* BNX2X_INIT_OPS_H */ diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index a2b94650c271..e2e45ee5df33 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c @@ -11998,7 +11998,7 @@ void bnx2x_init_xgxs_loopback(struct link_params *params, bnx2x_set_led(params, vars, LED_MODE_OPER, vars->line_speed); } -void bnx2x_set_rx_filter(struct link_params *params, u8 en) +static void bnx2x_set_rx_filter(struct link_params *params, u8 en) { struct bnx2x *bp = params->bp; u8 val = en * 0x1F; diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h index ba981ced628b..9165b89a4b19 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h @@ -432,8 +432,7 @@ int bnx2x_phy_probe(struct link_params *params); u8 bnx2x_fan_failure_det_req(struct bnx2x *bp, u32 shmem_base, u32 shmem2_base, u8 port); -/* Open / close the gate between the NIG and the BRB */ -void bnx2x_set_rx_filter(struct link_params *params, u8 en); + /* DCBX structs */ diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 0546cf4f762e..d5648fc666bd 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c @@ -791,9 +791,10 @@ 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", @@ -858,7 +859,7 @@ void bnx2x_panic_dump(struct bnx2x *bp) #ifdef BNX2X_STOP_ON_ERROR /* Rings */ /* Rx */ - for_each_valid_rx_queue(bp, i) { + for_each_rx_queue(bp, i) { struct bnx2x_fastpath *fp = &bp->fp[i]; start = RX_BD(le16_to_cpu(*fp->rx_cons_sb) - 10); @@ -892,7 +893,7 @@ void bnx2x_panic_dump(struct bnx2x *bp) } /* Tx */ - for_each_valid_tx_queue(bp, i) { + for_each_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]; @@ -1503,8 +1504,9 @@ void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw) if (msix) { synchronize_irq(bp->msix_table[0].vector); offset = 1; - if (CNIC_SUPPORT(bp)) - offset++; +#ifdef BCM_CNIC + offset++; +#endif for_each_eth_queue(bp, i) synchronize_irq(bp->msix_table[offset++].vector); } else @@ -1586,8 +1588,9 @@ static bool bnx2x_trylock_leader_lock(struct bnx2x *bp) 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 @@ irqreturn_t bnx2x_interrupt(int irq, void *dev_instance) for_each_eth_queue(bp, i) { struct bnx2x_fastpath *fp = &bp->fp[i]; - mask = 0x2 << (fp->index + CNIC_SUPPORT(bp)); + mask = 0x2 << (fp->index + CNIC_PRESENT); if (status & mask) { /* Handle Rx or Tx according to SB id */ prefetch(fp->rx_cons_sb); @@ -1729,23 +1732,22 @@ irqreturn_t bnx2x_interrupt(int irq, void *dev_instance) } } - if (CNIC_SUPPORT(bp)) { - mask = 0x2; - if (status & (mask | 0x1)) { - struct cnic_ops *c_ops = NULL; +#ifdef BCM_CNIC + 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(); - } - - status &= ~mask; + 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; } +#endif if (unlikely(status & 0x1)) { queue_delayed_work(bnx2x_wq, &bp->sp_task, 0); @@ -3073,13 +3075,11 @@ static void bnx2x_drv_info_ether_stat(struct bnx2x *bp) 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); @@ -3162,17 +3162,16 @@ static void bnx2x_drv_info_fcoe_stat(struct bnx2x *bp) /* 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); @@ -3181,6 +3180,7 @@ static void bnx2x_drv_info_iscsi_stat(struct bnx2x *bp) /* 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 @@ static void bnx2x_update_eq_prod(struct bnx2x *bp, u16 prod) 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) { @@ -4593,6 +4594,7 @@ static int bnx2x_cnic_handle_cfc_del(struct bnx2x *bp, u32 cid, bnx2x_cnic_cfc_comp(bp, cid, err); return 0; } +#endif static void bnx2x_handle_mcast_eqe(struct bnx2x *bp) { @@ -4633,9 +4635,11 @@ static void bnx2x_handle_classification_eqe(struct bnx2x *bp, switch (elem->message.data.eth_event.echo >> BNX2X_SWCID_SHIFT) { case BNX2X_FILTER_MAC_PENDING: DP(BNX2X_MSG_SP, "Got SETUP_MAC completions\n"); - if (CNIC_LOADED(bp) && (cid == BNX2X_ISCSI_ETH_CID(bp))) +#ifdef BCM_CNIC + if (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; @@ -4661,7 +4665,9 @@ static void bnx2x_handle_classification_eqe(struct bnx2x *bp, } +#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) { @@ -4672,12 +4678,14 @@ 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 @@ static void bnx2x_after_function_update(struct bnx2x *bp) 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; @@ -4761,16 +4770,22 @@ static void bnx2x_after_function_update(struct bnx2x *bp) 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); - - if (CNIC_LOADED(bp) && (cid == BNX2X_FCOE_ETH_CID(bp))) +#ifdef BCM_CNIC + if (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 @@ static void bnx2x_eq_int(struct bnx2x *bp) { u16 hw_cons, sw_cons, sw_prod; union event_ring_elem *elem; - u8 echo; u32 cid; u8 opcode; int spqe_cnt = 0; @@ -4833,11 +4847,10 @@ static void bnx2x_eq_int(struct bnx2x *bp) */ DP(BNX2X_MSG_SP, "got delete ramrod for MULTI[%d]\n", cid); - - if (CNIC_LOADED(bp) && - !bnx2x_cnic_handle_cfc_del(bp, cid, elem)) +#ifdef BCM_CNIC + if (!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)) @@ -4862,34 +4875,21 @@ static void bnx2x_eq_int(struct bnx2x *bp) break; bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_RELEASED); goto next_spqe; - case EVENT_RING_OPCODE_FUNCTION_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; - - } 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(); + 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); - schedule_delayed_work(&bp->sp_rtnl_task, 0); - } + /* 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); goto next_spqe; case EVENT_RING_OPCODE_AFEX_VIF_LISTS: @@ -4999,10 +4999,11 @@ static void bnx2x_sp_task(struct work_struct *work) /* SP events: STAT_QUERY and others */ if (status & BNX2X_DEF_SB_IDX) { +#ifdef BCM_CNIC struct bnx2x_fastpath *fp = bnx2x_fcoe_fp(bp); - if (FCOE_INIT(bp) && - (bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) { + if ((!NO_FCOE(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. @@ -5011,7 +5012,7 @@ static void bnx2x_sp_task(struct work_struct *work) napi_schedule(&bnx2x_fcoe(bp, napi)); local_bh_enable(); } - +#endif /* Handle EQ completions */ bnx2x_eq_int(bp); @@ -5049,7 +5050,8 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance) return IRQ_HANDLED; #endif - if (CNIC_LOADED(bp)) { +#ifdef BCM_CNIC + { struct cnic_ops *c_ops; rcu_read_lock(); @@ -5058,7 +5060,7 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance) 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 @@ void bnx2x_set_storm_rx_mode(struct bnx2x *bp) 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 @@ static void bnx2x_init_internal(struct bnx2x *bp, u32 load_code) static inline u8 bnx2x_fp_igu_sb_id(struct bnx2x_fastpath *fp) { - return fp->bp->igu_base_sb + fp->index + CNIC_SUPPORT(fp->bp); + return fp->bp->igu_base_sb + fp->index + CNIC_PRESENT; } static inline u8 bnx2x_fp_fw_sb_id(struct bnx2x_fastpath *fp) { - return fp->bp->base_fw_ndsb + fp->index + CNIC_SUPPORT(fp->bp); + return fp->bp->base_fw_ndsb + fp->index + CNIC_PRESENT; } static u8 bnx2x_fp_cl_id(struct bnx2x_fastpath *fp) @@ -5716,25 +5720,23 @@ static void bnx2x_init_tx_ring_one(struct bnx2x_fp_txdata *txdata) 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_eth_queue(bp, i) + for_each_tx_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_cnic(struct bnx2x *bp) +void bnx2x_nic_init(struct bnx2x *bp, u32 load_code) { + 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); @@ -5742,22 +5744,8 @@ void bnx2x_nic_init_cnic(struct bnx2x *bp) BNX2X_VF_ID_INVALID, false, bnx2x_cnic_fw_sb_id(bp), bnx2x_cnic_igu_sb_id(bp)); - /* 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; +#endif - 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 @@ static int bnx2x_int_mem_test(struct bnx2x *bp) msleep(50); bnx2x_init_block(bp, BLOCK_BRB1, PHASE_COMMON); bnx2x_init_block(bp, BLOCK_PRS, PHASE_COMMON); - if (!CNIC_SUPPORT(bp)) - /* set NIC mode */ - REG_WR(bp, PRS_REG_NIC_MODE, 1); +#ifndef BCM_CNIC + /* set NIC mode */ + REG_WR(bp, PRS_REG_NIC_MODE, 1); +#endif /* Enable inputs of parser neighbor blocks */ REG_WR(bp, TSDM_REG_ENABLE_IN1, 0x7fffffff); @@ -6533,8 +6522,9 @@ static int bnx2x_init_hw_common(struct bnx2x *bp) REG_WR(bp, QM_REG_SOFT_RESET, 1); REG_WR(bp, QM_REG_SOFT_RESET, 0); - if (CNIC_SUPPORT(bp)) - bnx2x_init_block(bp, BLOCK_TM, PHASE_COMMON); +#ifdef BCM_CNIC + bnx2x_init_block(bp, BLOCK_TM, PHASE_COMMON); +#endif bnx2x_init_block(bp, BLOCK_DORQ, PHASE_COMMON); REG_WR(bp, DORQ_REG_DPM_CID_OFST, BNX2X_DB_SHIFT); @@ -6621,18 +6611,18 @@ static int bnx2x_init_hw_common(struct bnx2x *bp) bnx2x_init_block(bp, BLOCK_SRC, PHASE_COMMON); - 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); - } +#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 REG_WR(bp, SRC_REG_SOFT_RST, 0); if (sizeof(union cdu_context) != 1024) @@ -6796,11 +6786,11 @@ static int bnx2x_init_hw_port(struct bnx2x *bp) /* QM cid (connection) count */ bnx2x_qm_init_cid_count(bp, bp->qm_cid_count, INITOP_SET); - 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); - } +#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 bnx2x_init_block(bp, BLOCK_DORQ, init_phase); @@ -6886,9 +6876,9 @@ static int bnx2x_init_hw_port(struct bnx2x *bp) REG_WR(bp, PBF_REG_INIT_P0 + port*4, 0); } - if (CNIC_SUPPORT(bp)) - bnx2x_init_block(bp, BLOCK_SRC, init_phase); - +#ifdef BCM_CNIC + bnx2x_init_block(bp, BLOCK_SRC, init_phase); +#endif bnx2x_init_block(bp, BLOCK_CDU, init_phase); bnx2x_init_block(bp, BLOCK_CFC, init_phase); @@ -7049,130 +7039,6 @@ static void bnx2x_clear_func_ilt(struct bnx2x *bp, u32 func) bnx2x_ilt_wr(bp, i, 0); } - -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; -} - -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); @@ -7215,16 +7081,17 @@ static int bnx2x_init_hw_func(struct bnx2x *bp) } bnx2x_ilt_init_op(bp, INITOP_SET); - 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"); +#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 + +#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; @@ -7475,20 +7342,6 @@ static int bnx2x_init_hw_func(struct bnx2x *bp) } -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; @@ -7513,6 +7366,17 @@ void bnx2x_free_mem(struct bnx2x *bp) 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, @@ -7580,44 +7444,24 @@ static int bnx2x_alloc_fw_stats_mem(struct bnx2x *bp) return -ENOMEM; } -int bnx2x_alloc_mem_cnic(struct bnx2x *bp) + +int bnx2x_alloc_mem(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)); - - 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; + BNX2X_PCI_ALLOC(bp->cnic_sb.e1x_sb, &bp->cnic_sb_mapping, + sizeof(struct host_hc_status_block_e1x)); - 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; + /* 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 */ - 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)); @@ -7625,6 +7469,11 @@ int bnx2x_alloc_mem(struct bnx2x *bp) 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; @@ -7746,12 +7595,14 @@ int bnx2x_set_eth_mac(struct bnx2x *bp, bool set) { 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"); @@ -7780,8 +7631,7 @@ void bnx2x_set_int_mode(struct bnx2x *bp) bnx2x_enable_msi(bp); /* falling through... */ case INT_MODE_INTx: - bp->num_ethernet_queues = 1; - bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; + bp->num_queues = 1 + NON_ETH_CONTEXT_USE; BNX2X_DEV_INFO("set number of queues to 1\n"); break; default: @@ -7793,10 +7643,9 @@ void bnx2x_set_int_mode(struct bnx2x *bp) 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 + bp->num_cnic_queues); + bp->num_queues, 1 + NON_ETH_CONTEXT_USE); - bp->num_queues = 1 + bp->num_cnic_queues; + bp->num_queues = 1 + NON_ETH_CONTEXT_USE; /* Try to enable MSI */ if (!(bp->flags & USING_SINGLE_MSIX_FLAG) && @@ -7829,9 +7678,9 @@ void bnx2x_ilt_set_info(struct bnx2x *bp) ilt_client->flags = ILT_CLIENT_SKIP_MEM; ilt_client->start = line; line += bnx2x_cid_ilt_lines(bp); - - if (CNIC_SUPPORT(bp)) - line += CNIC_ILT_LINES; +#ifdef BCM_CNIC + line += CNIC_ILT_LINES; +#endif 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", @@ -7864,43 +7713,49 @@ void bnx2x_ilt_set_info(struct bnx2x *bp) 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; - 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; + 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)); - 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)); +#else + ilt_client->flags = (ILT_CLIENT_SKIP_INIT | ILT_CLIENT_SKIP_MEM); +#endif - /* 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; + /* 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; - 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); } @@ -8068,9 +7923,6 @@ int bnx2x_setup_queue(struct bnx2x *bp, struct bnx2x_fastpath *fp, /* 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) { @@ -8184,12 +8036,12 @@ static void bnx2x_reset_func(struct bnx2x *bp) SB_DISABLED); } - 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); - +#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 /* SP SB */ REG_WR8(bp, BAR_CSTRORM_INTMEM + CSTORM_SP_STATUS_BLOCK_DATA_STATE_OFFSET(func), @@ -8208,19 +8060,19 @@ static void bnx2x_reset_func(struct bnx2x *bp) REG_WR(bp, IGU_REG_TRAILING_EDGE_LATCH, 0); } - 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; - } +#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; } +#endif /* Clear ILT */ bnx2x_clear_func_ilt(bp, func); @@ -8556,24 +8408,13 @@ void bnx2x_chip_cleanup(struct bnx2x *bp, int unload_mode, bool keep_link) /* Close multi and leading connections * Completions for ramrods are collected in a synchronous way */ - for_each_eth_queue(bp, i) + for_each_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. */ @@ -8595,8 +8436,6 @@ void bnx2x_chip_cleanup(struct bnx2x *bp, int unload_mode, bool keep_link) 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); @@ -10384,15 +10223,12 @@ static void __devinit bnx2x_get_port_hwinfo(struct bnx2x *bp) 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) >> @@ -10407,9 +10243,12 @@ void bnx2x_get_iscsi_info(struct bnx2x *bp) */ 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 */ @@ -10424,18 +10263,16 @@ static void __devinit bnx2x_get_ext_wwn_info(struct bnx2x *bp, int func) 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) >> @@ -10481,6 +10318,9 @@ static void __devinit bnx2x_get_fcoe_info(struct bnx2x *bp) */ 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) @@ -10494,133 +10334,132 @@ static void __devinit bnx2x_get_cnic_info(struct bnx2x *bp) bnx2x_get_fcoe_info(bp); } -static void __devinit bnx2x_get_cnic_mac_hwinfo(struct bnx2x *bp) +static void __devinit bnx2x_get_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 - if (IS_MF(bp)) { - /* iSCSI and FCoE NPAR MACs: if there is no either iSCSI or + /* 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 * 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) && !CHIP_IS_E1x(bp)) { + if (!IS_MF_SD(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 (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)) { + 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 (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 } - /* Disable iSCSI OOO if MAC configuration is invalid. */ + 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. + */ if (!is_valid_ether_addr(iscsi_mac)) { - bp->flags |= NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG; + bp->flags |= 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); } -} - -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); +#endif if (!bnx2x_is_valid_ether_addr(bp, bp->dev->dev_addr)) dev_err(&bp->pdev->dev, @@ -10997,7 +10836,9 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) 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); @@ -11035,7 +10876,10 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) 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) { @@ -11069,10 +10913,12 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) 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)) @@ -11082,16 +10928,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *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; } @@ -11328,9 +11164,11 @@ void bnx2x_set_rx_mode(struct net_device *dev) } 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)) { @@ -11442,7 +11280,7 @@ static const struct net_device_ops bnx2x_netdev_ops = { #endif .ndo_setup_tc = bnx2x_setup_tc, -#ifdef NETDEV_FCOE_WWNN +#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC) .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn, #endif }; @@ -11908,8 +11746,9 @@ static int bnx2x_set_qm_cid_count(struct bnx2x *bp) { int cid_count = BNX2X_L2_MAX_CID(bp); - if (CNIC_SUPPORT(bp)) - cid_count += CNIC_CID_MAX; +#ifdef BCM_CNIC + cid_count += CNIC_CID_MAX; +#endif return roundup(cid_count, QM_CID_ROUND); } @@ -11919,8 +11758,7 @@ static int bnx2x_set_qm_cid_count(struct bnx2x *bp) * @dev: pci device * */ -static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev, - int cnic_cnt) +static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev) { int pos; u16 control; @@ -11932,7 +11770,7 @@ static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev, * one fast path queue: one FP queue + SB for CNIC */ if (!pos) - return 1 + cnic_cnt; + return 1 + CNIC_PRESENT; /* * The value in the PCI configuration space is the index of the last @@ -11952,7 +11790,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, 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. @@ -11996,22 +11833,21 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, return -ENODEV; } - cnic_cnt = 1; - max_non_def_sbs = bnx2x_get_num_non_def_sbs(pdev, cnic_cnt); + max_non_def_sbs = bnx2x_get_num_non_def_sbs(pdev); WARN_ON(!max_non_def_sbs); /* Maximum number of RSS queues: one IGU SB goes to CNIC */ - rss_count = max_non_def_sbs - cnic_cnt; + rss_count = max_non_def_sbs - CNIC_PRESENT; /* Maximum number of netdev Rx queues: RSS + FCoE L2 */ - rx_count = rss_count + cnic_cnt; + rx_count = rss_count + FCOE_PRESENT; /* * Maximum number of netdev Tx queues: * Maximum TSS queues * Maximum supported number of CoS + FCoE L2 */ - tx_count = rss_count * max_cos_est + cnic_cnt; + tx_count = rss_count * max_cos_est + FCOE_PRESENT; /* dev zeroed in init_etherdev */ dev = alloc_etherdev_mqs(sizeof(*bp), tx_count, rx_count); @@ -12022,8 +11858,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, 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); @@ -12032,7 +11866,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, 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", @@ -12065,10 +11898,14 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, /* calc qm_cid_count */ bp->qm_cid_count = bnx2x_set_qm_cid_count(bp); - /* disable FCOE L2 queue for E1x*/ +#ifdef BCM_CNIC + /* disable FCOE L2 queue for E1x */ if (CHIP_IS_E1x(bp)) bp->flags |= NO_FCOE_FLAG; +#endif + + /* Set bp->num_queues for MSI-X mode*/ bnx2x_set_num_queues(bp); @@ -12083,13 +11920,14 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, 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); @@ -12134,12 +11972,14 @@ static void __devexit bnx2x_remove_one(struct pci_dev *pdev) } 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 */ @@ -12187,17 +12027,15 @@ static int bnx2x_eeh_nic_unload(struct bnx2x *bp) bp->rx_mode = BNX2X_RX_MODE_NONE; - if (CNIC_LOADED(bp)) - bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); - +#ifdef BCM_CNIC + bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); +#endif /* 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); @@ -12388,6 +12226,7 @@ void bnx2x_notify_link_changed(struct bnx2x *bp) module_init(bnx2x_init); module_exit(bnx2x_cleanup); +#ifdef BCM_CNIC /** * bnx2x_set_iscsi_eth_mac_addr - set iSCSI MAC(s). * @@ -12840,31 +12679,12 @@ static int bnx2x_register_cnic(struct net_device *dev, struct cnic_ops *ops, { 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; @@ -12956,4 +12776,5 @@ struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *dev) } EXPORT_SYMBOL(bnx2x_cnic_probe); +#endif /* BCM_CNIC */ diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h index 7d93adb57f31..1b1999d34c71 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h @@ -2107,7 +2107,6 @@ #define NIG_REG_LLH1_ERROR_MASK 0x10090 /* [RW 8] event id for llh1 */ #define NIG_REG_LLH1_EVENT_ID 0x10088 -#define NIG_REG_LLH1_FUNC_EN 0x16104 #define NIG_REG_LLH1_FUNC_MEM 0x161c0 #define NIG_REG_LLH1_FUNC_MEM_ENABLE 0x16160 #define NIG_REG_LLH1_FUNC_MEM_SIZE 16 @@ -2303,15 +2302,6 @@ * set to 0x345678021. This is a new register (with 2_) added in E3 B0 to * accommodate the 9 input clients to ETS arbiter. */ #define NIG_REG_P0_TX_ARB_PRIORITY_CLIENT2_MSB 0x18684 -/* [RW 1] MCP-to-host path enable. Set this bit to enable the routing of MCP - * packets to BRB LB interface to forward the packet to the host. All - * packets from MCP are forwarded to the network when this bit is cleared - - * regardless of the configured destination in tx_mng_destination register. - * When MCP-to-host paths for both ports 0 and 1 are disabled - the arbiter - * for BRB LB interface is bypassed and PBF LB traffic is always selected to - * send to BRB LB. - */ -#define NIG_REG_P0_TX_MNG_HOST_ENABLE 0x182f4 #define NIG_REG_P1_HWPFC_ENABLE 0x181d0 #define NIG_REG_P1_MAC_IN_EN 0x185c0 /* [RW 1] Output enable for TX MAC interface */ @@ -2428,12 +2418,6 @@ #define NIG_REG_P1_TX_ARB_PRIORITY_CLIENT2_MSB 0x186e4 /* [R 1] TX FIFO for transmitting data to MAC is empty. */ #define NIG_REG_P1_TX_MACFIFO_EMPTY 0x18594 -/* [RW 1] MCP-to-host path enable. Set this bit to enable the routing of MCP - * packets to BRB LB interface to forward the packet to the host. All - * packets from MCP are forwarded to the network when this bit is cleared - - * regardless of the configured destination in tx_mng_destination register. - */ -#define NIG_REG_P1_TX_MNG_HOST_ENABLE 0x182f8 /* [R 1] FIFO empty status of the MCP TX FIFO used for storing MCP packets forwarded to the host. */ #define NIG_REG_P1_TX_MNG_HOST_FIFO_EMPTY 0x182b8 diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index b8b4b749daab..614981c02264 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c @@ -5350,24 +5350,12 @@ static int bnx2x_func_chk_transition(struct bnx2x *bp, else if ((cmd == BNX2X_F_CMD_AFEX_VIFLISTS) && (!test_bit(BNX2X_F_CMD_STOP, &o->pending))) next_state = BNX2X_F_STATE_STARTED; - - /* Switch_update ramrod can be sent in either started or - * tx_stopped state, and it doesn't change the state. - */ - else if ((cmd == BNX2X_F_CMD_SWITCH_UPDATE) && - (!test_bit(BNX2X_F_CMD_STOP, &o->pending))) - next_state = BNX2X_F_STATE_STARTED; - else if (cmd == BNX2X_F_CMD_TX_STOP) next_state = BNX2X_F_STATE_TX_STOPPED; break; case BNX2X_F_STATE_TX_STOPPED: - if ((cmd == BNX2X_F_CMD_SWITCH_UPDATE) && - (!test_bit(BNX2X_F_CMD_STOP, &o->pending))) - next_state = BNX2X_F_STATE_TX_STOPPED; - - else if (cmd == BNX2X_F_CMD_TX_START) + if (cmd == BNX2X_F_CMD_TX_START) next_state = BNX2X_F_STATE_STARTED; break; @@ -5649,28 +5637,6 @@ static inline int bnx2x_func_send_start(struct bnx2x *bp, U64_LO(data_mapping), NONE_CONNECTION_TYPE); } -static inline int bnx2x_func_send_switch_update(struct bnx2x *bp, - struct bnx2x_func_state_params *params) -{ - struct bnx2x_func_sp_obj *o = params->f_obj; - struct function_update_data *rdata = - (struct function_update_data *)o->rdata; - dma_addr_t data_mapping = o->rdata_mapping; - struct bnx2x_func_switch_update_params *switch_update_params = - ¶ms->params.switch_update; - - memset(rdata, 0, sizeof(*rdata)); - - /* Fill the ramrod data with provided parameters */ - rdata->tx_switch_suspend_change_flg = 1; - rdata->tx_switch_suspend = switch_update_params->suspend; - rdata->echo = SWITCH_UPDATE; - - return bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE, 0, - U64_HI(data_mapping), - U64_LO(data_mapping), NONE_CONNECTION_TYPE); -} - static inline int bnx2x_func_send_afex_update(struct bnx2x *bp, struct bnx2x_func_state_params *params) { @@ -5691,7 +5657,6 @@ static inline int bnx2x_func_send_afex_update(struct bnx2x *bp, cpu_to_le16(afex_update_params->afex_default_vlan); rdata->allowed_priorities_change_flg = 1; rdata->allowed_priorities = afex_update_params->allowed_priorities; - rdata->echo = AFEX_UPDATE; /* No need for an explicit memory barrier here as long we would * need to ensure the ordering of writing to the SPQ element @@ -5808,8 +5773,6 @@ static int bnx2x_func_send_cmd(struct bnx2x *bp, return bnx2x_func_send_tx_stop(bp, params); case BNX2X_F_CMD_TX_START: return bnx2x_func_send_tx_start(bp, params); - case BNX2X_F_CMD_SWITCH_UPDATE: - return bnx2x_func_send_switch_update(bp, params); default: BNX2X_ERR("Unknown command: %d\n", params->cmd); return -EINVAL; @@ -5855,30 +5818,16 @@ int bnx2x_func_state_change(struct bnx2x *bp, struct bnx2x_func_state_params *params) { struct bnx2x_func_sp_obj *o = params->f_obj; - int rc, cnt = 300; + int rc; enum bnx2x_func_cmd cmd = params->cmd; unsigned long *pending = &o->pending; mutex_lock(&o->one_pending_mutex); /* Check that the requested transition is legal */ - rc = o->check_transition(bp, o, params); - if ((rc == -EBUSY) && - (test_bit(RAMROD_RETRY, ¶ms->ramrod_flags))) { - while ((rc == -EBUSY) && (--cnt > 0)) { - mutex_unlock(&o->one_pending_mutex); - msleep(10); - mutex_lock(&o->one_pending_mutex); - rc = o->check_transition(bp, o, params); - } - if (rc == -EBUSY) { - mutex_unlock(&o->one_pending_mutex); - BNX2X_ERR("timeout waiting for previous ramrod completion\n"); - return rc; - } - } else if (rc) { + if (o->check_transition(bp, o, params)) { mutex_unlock(&o->one_pending_mutex); - return rc; + return -EINVAL; } /* Set "pending" bit */ diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h index adbd91b1bdfc..acf2fe4ca608 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h @@ -40,12 +40,6 @@ enum { * pending commands list. */ RAMROD_CONT, - /* If there is another pending ramrod, wait until it finishes and - * re-try to submit this one. This flag can be set only in sleepable - * context, and should not be set from the context that completes the - * ramrods as deadlock will occur. - */ - RAMROD_RETRY, }; typedef enum { @@ -1067,7 +1061,6 @@ enum bnx2x_func_cmd { BNX2X_F_CMD_AFEX_VIFLISTS, BNX2X_F_CMD_TX_STOP, BNX2X_F_CMD_TX_START, - BNX2X_F_CMD_SWITCH_UPDATE, BNX2X_F_CMD_MAX, }; @@ -1110,10 +1103,6 @@ struct bnx2x_func_start_params { u8 network_cos_mode; }; -struct bnx2x_func_switch_update_params { - u8 suspend; -}; - struct bnx2x_func_afex_update_params { u16 vif_id; u16 afex_default_vlan; @@ -1147,7 +1136,6 @@ struct bnx2x_func_state_params { struct bnx2x_func_hw_init_params hw_init; struct bnx2x_func_hw_reset_params hw_reset; struct bnx2x_func_start_params start; - struct bnx2x_func_switch_update_params switch_update; struct bnx2x_func_afex_update_params afex_update; struct bnx2x_func_afex_viflists_params afex_viflists; struct bnx2x_func_tx_start_params tx_start; diff --git a/trunk/drivers/net/ethernet/cadence/at91_ether.c b/trunk/drivers/net/ethernet/cadence/at91_ether.c index e7a476cff6c5..6eb928ea276d 100644 --- a/trunk/drivers/net/ethernet/cadence/at91_ether.c +++ b/trunk/drivers/net/ethernet/cadence/at91_ether.c @@ -6,6 +6,11 @@ * Based on an earlier Atmel EMAC macrocell driver by Atmel and Lineo Inc. * Initial version by Rick Bronson 01/11/2003 * + * Intel LXT971A PHY support by Christopher Bahns & David Knickerbocker + * (Polaroid Corporation) + * + * Realtek RTL8201(B)L PHY support by Roman Avramenko + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version @@ -33,24 +38,132 @@ #include "macb.h" +#define DRV_NAME "at91_ether" +#define DRV_VERSION "1.0" + /* 1518 rounded up */ #define MAX_RBUFF_SZ 0x600 /* max number of receive buffers */ #define MAX_RX_DESCR 9 -/* Initialize and start the Receiver and Transmit subsystems */ +/* ......................... ADDRESS MANAGEMENT ........................ */ + +/* + * NOTE: Your bootloader must always set the MAC address correctly before + * booting into Linux. + * + * - It must always set the MAC address after reset, even if it doesn't + * happen to access the Ethernet while it's booting. Some versions of + * U-Boot on the AT91RM9200-DK do not do this. + * + * - Likewise it must store the addresses in the correct byte order. + * MicroMonitor (uMon) on the CSB337 does this incorrectly (and + * continues to do so, for bug-compatibility). + */ + +static short __init unpack_mac_address(struct net_device *dev, unsigned int hi, unsigned int lo) +{ + struct macb *lp = netdev_priv(dev); + char addr[6]; + + if (lp->board_data.rev_eth_addr) { + addr[5] = (lo & 0xff); /* The CSB337 bootloader stores the MAC the wrong-way around */ + addr[4] = (lo & 0xff00) >> 8; + addr[3] = (lo & 0xff0000) >> 16; + addr[2] = (lo & 0xff000000) >> 24; + addr[1] = (hi & 0xff); + addr[0] = (hi & 0xff00) >> 8; + } + else { + addr[0] = (lo & 0xff); + addr[1] = (lo & 0xff00) >> 8; + addr[2] = (lo & 0xff0000) >> 16; + addr[3] = (lo & 0xff000000) >> 24; + addr[4] = (hi & 0xff); + addr[5] = (hi & 0xff00) >> 8; + } + + if (is_valid_ether_addr(addr)) { + memcpy(dev->dev_addr, &addr, 6); + return 1; + } + return 0; +} + +/* + * Set the ethernet MAC address in dev->dev_addr + */ +static void __init get_mac_address(struct net_device *dev) +{ + struct macb *lp = netdev_priv(dev); + + /* Check Specific-Address 1 */ + if (unpack_mac_address(dev, macb_readl(lp, SA1T), macb_readl(lp, SA1B))) + return; + /* Check Specific-Address 2 */ + if (unpack_mac_address(dev, macb_readl(lp, SA2T), macb_readl(lp, SA2B))) + return; + /* Check Specific-Address 3 */ + if (unpack_mac_address(dev, macb_readl(lp, SA3T), macb_readl(lp, SA3B))) + return; + /* Check Specific-Address 4 */ + if (unpack_mac_address(dev, macb_readl(lp, SA4T), macb_readl(lp, SA4B))) + return; + + printk(KERN_ERR "at91_ether: Your bootloader did not configure a MAC address.\n"); +} + +/* + * Program the hardware MAC address from dev->dev_addr. + */ +static void update_mac_address(struct net_device *dev) +{ + struct macb *lp = netdev_priv(dev); + + macb_writel(lp, SA1B, (dev->dev_addr[3] << 24) | (dev->dev_addr[2] << 16) + | (dev->dev_addr[1] << 8) | (dev->dev_addr[0])); + macb_writel(lp, SA1T, (dev->dev_addr[5] << 8) | (dev->dev_addr[4])); + + macb_writel(lp, SA2B, 0); + macb_writel(lp, SA2T, 0); +} + +/* + * Store the new hardware address in dev->dev_addr, and update the MAC. + */ +static int set_mac_address(struct net_device *dev, void* addr) +{ + struct sockaddr *address = addr; + + if (!is_valid_ether_addr(address->sa_data)) + return -EADDRNOTAVAIL; + + memcpy(dev->dev_addr, address->sa_data, dev->addr_len); + update_mac_address(dev); + + printk("%s: Setting MAC address to %pM\n", dev->name, + dev->dev_addr); + + return 0; +} + +/* ................................ MAC ................................ */ + +/* + * Initialize and start the Receiver and Transmit subsystems + */ static int at91ether_start(struct net_device *dev) { struct macb *lp = netdev_priv(dev); + unsigned long ctl; dma_addr_t addr; - u32 ctl; int i; lp->rx_ring = dma_alloc_coherent(&lp->pdev->dev, MAX_RX_DESCR * sizeof(struct macb_dma_desc), &lp->rx_ring_dma, GFP_KERNEL); if (!lp->rx_ring) { - netdev_err(dev, "unable to alloc rx ring DMA buffer\n"); + netdev_err(lp->dev, "unable to alloc rx ring DMA buffer\n"); return -ENOMEM; } @@ -58,7 +171,7 @@ static int at91ether_start(struct net_device *dev) MAX_RX_DESCR * MAX_RBUFF_SZ, &lp->rx_buffers_dma, GFP_KERNEL); if (!lp->rx_buffers) { - netdev_err(dev, "unable to alloc rx data DMA buffer\n"); + netdev_err(lp->dev, "unable to alloc rx data DMA buffer\n"); dma_free_coherent(&lp->pdev->dev, MAX_RX_DESCR * sizeof(struct macb_dma_desc), @@ -90,11 +203,13 @@ static int at91ether_start(struct net_device *dev) return 0; } -/* Open the ethernet interface */ +/* + * Open the ethernet interface + */ static int at91ether_open(struct net_device *dev) { struct macb *lp = netdev_priv(dev); - u32 ctl; + unsigned long ctl; int ret; if (!is_valid_ether_addr(dev->dev_addr)) @@ -104,20 +219,17 @@ static int at91ether_open(struct net_device *dev) ctl = macb_readl(lp, NCR); macb_writel(lp, NCR, ctl | MACB_BIT(CLRSTAT)); - macb_set_hwaddr(lp); + /* Update the MAC address (incase user has changed it) */ + update_mac_address(dev); ret = at91ether_start(dev); if (ret) return ret; /* Enable MAC interrupts */ - macb_writel(lp, IER, MACB_BIT(RCOMP) | - MACB_BIT(RXUBR) | - MACB_BIT(ISR_TUND) | - MACB_BIT(ISR_RLE) | - MACB_BIT(TCOMP) | - MACB_BIT(ISR_ROVR) | - MACB_BIT(HRESP)); + macb_writel(lp, IER, MACB_BIT(RCOMP) | MACB_BIT(RXUBR) + | MACB_BIT(ISR_TUND) | MACB_BIT(ISR_RLE) | MACB_BIT(TCOMP) + | MACB_BIT(ISR_ROVR) | MACB_BIT(HRESP)); /* schedule a link state check */ phy_start(lp->phy_dev); @@ -127,24 +239,23 @@ static int at91ether_open(struct net_device *dev) return 0; } -/* Close the interface */ +/* + * Close the interface + */ static int at91ether_close(struct net_device *dev) { struct macb *lp = netdev_priv(dev); - u32 ctl; + unsigned long ctl; /* Disable Receiver and Transmitter */ ctl = macb_readl(lp, NCR); macb_writel(lp, NCR, ctl & ~(MACB_BIT(TE) | MACB_BIT(RE))); /* Disable MAC interrupts */ - macb_writel(lp, IDR, MACB_BIT(RCOMP) | - MACB_BIT(RXUBR) | - MACB_BIT(ISR_TUND) | - MACB_BIT(ISR_RLE) | - MACB_BIT(TCOMP) | - MACB_BIT(ISR_ROVR) | - MACB_BIT(HRESP)); + macb_writel(lp, IDR, MACB_BIT(RCOMP) | MACB_BIT(RXUBR) + | MACB_BIT(ISR_TUND) | MACB_BIT(ISR_RLE) + | MACB_BIT(TCOMP) | MACB_BIT(ISR_ROVR) + | MACB_BIT(HRESP)); netif_stop_queue(dev); @@ -161,7 +272,9 @@ static int at91ether_close(struct net_device *dev) return 0; } -/* Transmit packet */ +/* + * Transmit packet. + */ static int at91ether_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct macb *lp = netdev_priv(dev); @@ -172,8 +285,8 @@ static int at91ether_start_xmit(struct sk_buff *skb, struct net_device *dev) /* Store packet information (to free when Tx completed) */ lp->skb = skb; lp->skb_length = skb->len; - lp->skb_physaddr = dma_map_single(NULL, skb->data, skb->len, - DMA_TO_DEVICE); + lp->skb_physaddr = dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE); + dev->stats.tx_bytes += skb->len; /* Set address of the data in the Transmit Address register */ macb_writel(lp, TAR, lp->skb_physaddr); @@ -181,14 +294,52 @@ static int at91ether_start_xmit(struct sk_buff *skb, struct net_device *dev) macb_writel(lp, TCR, skb->len); } else { - netdev_err(dev, "%s called, but device is busy!\n", __func__); - return NETDEV_TX_BUSY; + printk(KERN_ERR "at91_ether.c: at91ether_start_xmit() called, but device is busy!\n"); + return NETDEV_TX_BUSY; /* if we return anything but zero, dev.c:1055 calls kfree_skb(skb) + on this skb, he also reports -ENETDOWN and printk's, so either + we free and return(0) or don't free and return 1 */ } return NETDEV_TX_OK; } -/* Extract received frame from buffer descriptors and sent to upper layers. +/* + * Update the current statistics from the internal statistics registers. + */ +static struct net_device_stats *at91ether_stats(struct net_device *dev) +{ + struct macb *lp = netdev_priv(dev); + int ale, lenerr, seqe, lcol, ecol; + + if (netif_running(dev)) { + dev->stats.rx_packets += macb_readl(lp, FRO); /* Good frames received */ + ale = macb_readl(lp, ALE); + dev->stats.rx_frame_errors += ale; /* Alignment errors */ + lenerr = macb_readl(lp, ELE) + macb_readl(lp, USF); + dev->stats.rx_length_errors += lenerr; /* Excessive Length or Undersize Frame error */ + seqe = macb_readl(lp, FCSE); + dev->stats.rx_crc_errors += seqe; /* CRC error */ + dev->stats.rx_fifo_errors += macb_readl(lp, RRE);/* Receive buffer not available */ + dev->stats.rx_errors += (ale + lenerr + seqe + + macb_readl(lp, RSE) + macb_readl(lp, RJA)); + + dev->stats.tx_packets += macb_readl(lp, FTO); /* Frames successfully transmitted */ + dev->stats.tx_fifo_errors += macb_readl(lp, TUND); /* Transmit FIFO underruns */ + dev->stats.tx_carrier_errors += macb_readl(lp, CSE); /* Carrier Sense errors */ + dev->stats.tx_heartbeat_errors += macb_readl(lp, STE);/* Heartbeat error */ + + lcol = macb_readl(lp, LCOL); + ecol = macb_readl(lp, EXCOL); + dev->stats.tx_window_errors += lcol; /* Late collisions */ + dev->stats.tx_aborted_errors += ecol; /* 16 collisions */ + + dev->stats.collisions += (macb_readl(lp, SCF) + macb_readl(lp, MCF) + lcol + ecol); + } + return &dev->stats; +} + +/* + * Extract received frame from buffer descriptors and sent to upper layers. * (Called from interrupt context) */ static void at91ether_rx(struct net_device *dev) @@ -207,16 +358,15 @@ static void at91ether_rx(struct net_device *dev) memcpy(skb_put(skb, pktlen), p_recv, pktlen); skb->protocol = eth_type_trans(skb, dev); - lp->stats.rx_packets++; - lp->stats.rx_bytes += pktlen; + dev->stats.rx_bytes += pktlen; netif_rx(skb); } else { - lp->stats.rx_dropped++; + dev->stats.rx_dropped += 1; netdev_notice(dev, "Memory squeeze, dropping packet.\n"); } if (lp->rx_ring[lp->rx_tail].ctrl & MACB_BIT(RX_MHASH_MATCH)) - lp->stats.multicast++; + dev->stats.multicast++; /* reset ownership bit */ lp->rx_ring[lp->rx_tail].addr &= ~MACB_BIT(RX_USED); @@ -229,39 +379,36 @@ static void at91ether_rx(struct net_device *dev) } } -/* MAC interrupt handler */ +/* + * MAC interrupt handler + */ static irqreturn_t at91ether_interrupt(int irq, void *dev_id) { - struct net_device *dev = dev_id; + struct net_device *dev = (struct net_device *) dev_id; struct macb *lp = netdev_priv(dev); - u32 intstatus, ctl; + unsigned long intstatus, ctl; /* MAC Interrupt Status register indicates what interrupts are pending. - * It is automatically cleared once read. - */ + It is automatically cleared once read. */ intstatus = macb_readl(lp, ISR); - /* Receive complete */ - if (intstatus & MACB_BIT(RCOMP)) + if (intstatus & MACB_BIT(RCOMP)) /* Receive complete */ at91ether_rx(dev); - /* Transmit complete */ - if (intstatus & MACB_BIT(TCOMP)) { - /* The TCOM bit is set even if the transmission failed */ + if (intstatus & MACB_BIT(TCOMP)) { /* Transmit complete */ + /* The TCOM bit is set even if the transmission failed. */ if (intstatus & (MACB_BIT(ISR_TUND) | MACB_BIT(ISR_RLE))) - lp->stats.tx_errors++; + dev->stats.tx_errors += 1; if (lp->skb) { dev_kfree_skb_irq(lp->skb); lp->skb = NULL; dma_unmap_single(NULL, lp->skb_physaddr, lp->skb_length, DMA_TO_DEVICE); - lp->stats.tx_packets++; - lp->stats.tx_bytes += lp->skb_length; } netif_wake_queue(dev); } - /* Work-around for EMAC Errata section 41.3.1 */ + /* Work-around for Errata #11 */ if (intstatus & MACB_BIT(RXUBR)) { ctl = macb_readl(lp, NCR); macb_writel(lp, NCR, ctl & ~MACB_BIT(RE)); @@ -269,7 +416,7 @@ static irqreturn_t at91ether_interrupt(int irq, void *dev_id) } if (intstatus & MACB_BIT(ISR_ROVR)) - netdev_err(dev, "ROVR error\n"); + printk("%s: ROVR error\n", dev->name); return IRQ_HANDLED; } @@ -289,9 +436,9 @@ static const struct net_device_ops at91ether_netdev_ops = { .ndo_open = at91ether_open, .ndo_stop = at91ether_close, .ndo_start_xmit = at91ether_start_xmit, - .ndo_get_stats = macb_get_stats, + .ndo_get_stats = at91ether_stats, .ndo_set_rx_mode = macb_set_rx_mode, - .ndo_set_mac_address = eth_mac_addr, + .ndo_set_mac_address = set_mac_address, .ndo_do_ioctl = macb_ioctl, .ndo_validate_addr = eth_validate_addr, .ndo_change_mtu = eth_change_mtu, @@ -344,17 +491,18 @@ static int at91ether_get_hwaddr_dt(struct macb *bp) } #endif -/* Detect MAC & PHY and perform ethernet interface initialization */ +/* + * Detect MAC & PHY and perform ethernet interface initialization + */ static int __init at91ether_probe(struct platform_device *pdev) { struct macb_platform_data *board_data = pdev->dev.platform_data; struct resource *regs; struct net_device *dev; struct phy_device *phydev; - struct pinctrl *pinctrl; struct macb *lp; int res; - u32 reg; + struct pinctrl *pinctrl; regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!regs) @@ -376,10 +524,11 @@ static int __init at91ether_probe(struct platform_device *pdev) lp = netdev_priv(dev); lp->pdev = pdev; lp->dev = dev; + if (board_data) + lp->board_data = *board_data; spin_lock_init(&lp->lock); - /* physical base address */ - dev->base_addr = regs->start; + dev->base_addr = regs->start; /* physical base address */ lp->regs = devm_ioremap(&pdev->dev, regs->start, resource_size(regs)); if (!lp->regs) { res = -ENOMEM; @@ -408,7 +557,9 @@ static int __init at91ether_probe(struct platform_device *pdev) res = at91ether_get_hwaddr_dt(lp); if (res < 0) - macb_get_hwaddr(lp); + get_mac_address(dev); /* Get ethernet address and store it in dev->dev_addr */ + + update_mac_address(dev); /* Program ethernet address into MAC */ res = at91ether_get_phy_mode_dt(pdev); if (res < 0) { @@ -422,11 +573,10 @@ static int __init at91ether_probe(struct platform_device *pdev) macb_writel(lp, NCR, 0); - reg = MACB_BF(CLK, MACB_CLK_DIV32) | MACB_BIT(BIG); if (lp->phy_interface == PHY_INTERFACE_MODE_RMII) - reg |= MACB_BIT(RM9200_RMII); - - macb_writel(lp, NCFGR, reg); + macb_writel(lp, NCFGR, MACB_BF(CLK, MACB_CLK_DIV32) | MACB_BIT(BIG) | MACB_BIT(RM9200_RMII)); + else + macb_writel(lp, NCFGR, MACB_BF(CLK, MACB_CLK_DIV32) | MACB_BIT(BIG)); /* Register the network interface */ res = register_netdev(dev); @@ -436,17 +586,18 @@ static int __init at91ether_probe(struct platform_device *pdev) if (macb_mii_init(lp) != 0) goto err_out_unregister_netdev; - /* will be enabled in open() */ - netif_carrier_off(dev); + netif_carrier_off(dev); /* will be enabled in open() */ phydev = lp->phy_dev; netdev_info(dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n", - phydev->drv->name, dev_name(&phydev->dev), - phydev->irq); + phydev->drv->name, dev_name(&phydev->dev), phydev->irq); /* Display ethernet banner */ - netdev_info(dev, "AT91 ethernet at 0x%08lx int=%d (%pM)\n", - dev->base_addr, dev->irq, dev->dev_addr); + printk(KERN_INFO "%s: AT91 ethernet at 0x%08x int=%d %s%s (%pM)\n", + dev->name, (uint) dev->base_addr, dev->irq, + macb_readl(lp, NCFGR) & MACB_BIT(SPD) ? "100-" : "10-", + macb_readl(lp, NCFGR) & MACB_BIT(FD) ? "FullDuplex" : "HalfDuplex", + dev->dev_addr); return 0; @@ -479,6 +630,7 @@ static int __devexit at91ether_remove(struct platform_device *pdev) } #ifdef CONFIG_PM + static int at91ether_suspend(struct platform_device *pdev, pm_message_t mesg) { struct net_device *net_dev = platform_get_drvdata(pdev); @@ -506,6 +658,7 @@ static int at91ether_resume(struct platform_device *pdev) } return 0; } + #else #define at91ether_suspend NULL #define at91ether_resume NULL @@ -516,7 +669,7 @@ static struct platform_driver at91ether_driver = { .suspend = at91ether_suspend, .resume = at91ether_resume, .driver = { - .name = "at91_ether", + .name = DRV_NAME, .owner = THIS_MODULE, .of_match_table = of_match_ptr(at91ether_dt_ids), }, @@ -538,4 +691,4 @@ module_exit(at91ether_exit) MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("AT91RM9200 EMAC Ethernet driver"); MODULE_AUTHOR("Andrew Victor"); -MODULE_ALIAS("platform:at91_ether"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/trunk/drivers/net/ethernet/cadence/macb.c b/trunk/drivers/net/ethernet/cadence/macb.c index 1fac769989ad..13c3c332f58d 100644 --- a/trunk/drivers/net/ethernet/cadence/macb.c +++ b/trunk/drivers/net/ethernet/cadence/macb.c @@ -98,7 +98,7 @@ static void *macb_rx_buffer(struct macb *bp, unsigned int index) return bp->rx_buffers + RX_BUFFER_SIZE * macb_rx_ring_wrap(index); } -void macb_set_hwaddr(struct macb *bp) +static void __macb_set_hwaddr(struct macb *bp) { u32 bottom; u16 top; @@ -108,49 +108,30 @@ void macb_set_hwaddr(struct macb *bp) top = cpu_to_le16(*((u16 *)(bp->dev->dev_addr + 4))); macb_or_gem_writel(bp, SA1T, top); } -EXPORT_SYMBOL_GPL(macb_set_hwaddr); -void macb_get_hwaddr(struct macb *bp) +static void __init macb_get_hwaddr(struct macb *bp) { - struct macb_platform_data *pdata; u32 bottom; u16 top; u8 addr[6]; - int i; - pdata = bp->pdev->dev.platform_data; + bottom = macb_or_gem_readl(bp, SA1B); + top = macb_or_gem_readl(bp, SA1T); - /* Check all 4 address register for vaild address */ - for (i = 0; i < 4; i++) { - bottom = macb_or_gem_readl(bp, SA1B + i * 8); - top = macb_or_gem_readl(bp, SA1T + i * 8); - - if (pdata && pdata->rev_eth_addr) { - addr[5] = bottom & 0xff; - addr[4] = (bottom >> 8) & 0xff; - addr[3] = (bottom >> 16) & 0xff; - addr[2] = (bottom >> 24) & 0xff; - addr[1] = top & 0xff; - addr[0] = (top & 0xff00) >> 8; - } else { - addr[0] = bottom & 0xff; - addr[1] = (bottom >> 8) & 0xff; - addr[2] = (bottom >> 16) & 0xff; - addr[3] = (bottom >> 24) & 0xff; - addr[4] = top & 0xff; - addr[5] = (top >> 8) & 0xff; - } + addr[0] = bottom & 0xff; + addr[1] = (bottom >> 8) & 0xff; + addr[2] = (bottom >> 16) & 0xff; + addr[3] = (bottom >> 24) & 0xff; + addr[4] = top & 0xff; + addr[5] = (top >> 8) & 0xff; - if (is_valid_ether_addr(addr)) { - memcpy(bp->dev->dev_addr, addr, sizeof(addr)); - return; - } + if (is_valid_ether_addr(addr)) { + memcpy(bp->dev->dev_addr, addr, sizeof(addr)); + } else { + netdev_info(bp->dev, "invalid hw address, using random\n"); + eth_hw_addr_random(bp->dev); } - - netdev_info(bp->dev, "invalid hw address, using random\n"); - eth_hw_addr_random(bp->dev); } -EXPORT_SYMBOL_GPL(macb_get_hwaddr); static int macb_mdio_read(struct mii_bus *bus, int mii_id, int regnum) { @@ -1037,7 +1018,7 @@ static void macb_init_hw(struct macb *bp) u32 config; macb_reset_hw(bp); - macb_set_hwaddr(bp); + __macb_set_hwaddr(bp); config = macb_mdc_clk_div(bp); config |= MACB_BF(RBOF, NET_IP_ALIGN); /* Make eth data aligned */ @@ -1292,7 +1273,7 @@ static struct net_device_stats *gem_get_stats(struct macb *bp) return nstat; } -struct net_device_stats *macb_get_stats(struct net_device *dev) +static struct net_device_stats *macb_get_stats(struct net_device *dev) { struct macb *bp = netdev_priv(dev); struct net_device_stats *nstat = &bp->stats; @@ -1338,7 +1319,6 @@ struct net_device_stats *macb_get_stats(struct net_device *dev) return nstat; } -EXPORT_SYMBOL_GPL(macb_get_stats); static int macb_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { diff --git a/trunk/drivers/net/ethernet/cadence/macb.h b/trunk/drivers/net/ethernet/cadence/macb.h index 864e38042b2d..4235ab871ab4 100644 --- a/trunk/drivers/net/ethernet/cadence/macb.h +++ b/trunk/drivers/net/ethernet/cadence/macb.h @@ -557,7 +557,12 @@ struct macb { phy_interface_t phy_interface; - /* AT91RM9200 transmit */ + /* at91_private */ + struct macb_platform_data board_data; /* board-specific + * configuration (shared with + * macb for common data */ + + /* Transmit */ struct sk_buff *skb; /* holds skb until xmit interrupt completes */ dma_addr_t skb_physaddr; /* phys addr from pci_map_single */ int skb_length; /* saved skb length for pci_unmap_single */ @@ -567,10 +572,7 @@ extern const struct ethtool_ops macb_ethtool_ops; int macb_mii_init(struct macb *bp); int macb_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); -struct net_device_stats *macb_get_stats(struct net_device *dev); void macb_set_rx_mode(struct net_device *dev); -void macb_set_hwaddr(struct macb *bp); -void macb_get_hwaddr(struct macb *bp); static inline bool macb_is_gem(struct macb *bp) { diff --git a/trunk/drivers/net/ethernet/emulex/benet/be.h b/trunk/drivers/net/ethernet/emulex/benet/be.h index abf26c7c1d19..f920a6521ce7 100644 --- a/trunk/drivers/net/ethernet/emulex/benet/be.h +++ b/trunk/drivers/net/ethernet/emulex/benet/be.h @@ -348,6 +348,7 @@ struct be_adapter { struct pci_dev *pdev; struct net_device *netdev; + u8 __iomem *csr; u8 __iomem *db; /* Door Bell */ struct mutex mbox_lock; /* For serializing mbox cmds to BE card */ @@ -375,7 +376,9 @@ struct be_adapter { struct be_rx_obj rx_obj[MAX_RX_QS]; u32 big_page_size; /* Compounded page size shared by rx wrbs */ + u8 eq_next_idx; struct be_drv_stats drv_stats; + u16 vlans_added; u8 vlan_tag[VLAN_N_VID]; u8 vlan_prio_bmap; /* Available Priority BitMap */ @@ -407,8 +410,10 @@ struct be_adapter { u32 rx_fc; /* Rx flow control */ u32 tx_fc; /* Tx flow control */ bool stats_cmd_sent; + u8 generation; /* BladeEngine ASIC generation */ u32 if_type; struct { + u8 __iomem *base; /* Door Bell */ u32 size; u32 total_size; u64 io_addr; @@ -453,25 +458,23 @@ struct be_adapter { for (i = 0, vf_cfg = &adapter->vf_cfg[i]; i < adapter->num_vfs; \ i++, vf_cfg++) +/* BladeEngine Generation numbers */ +#define BE_GEN2 2 +#define BE_GEN3 3 +#define SH_HW 4 + #define ON 1 #define OFF 0 - -#define lancer_chip(adapter) (adapter->pdev->device == OC_DEVICE_ID3 || \ - adapter->pdev->device == OC_DEVICE_ID4) +#define lancer_chip(adapter) ((adapter->pdev->device == OC_DEVICE_ID3) || \ + (adapter->pdev->device == OC_DEVICE_ID4)) #define skyhawk_chip(adapter) (adapter->pdev->device == OC_DEVICE_ID5 || \ adapter->pdev->device == OC_DEVICE_ID6) -#define BE3_chip(adapter) (adapter->pdev->device == BE_DEVICE_ID2 || \ - adapter->pdev->device == OC_DEVICE_ID2) - -#define BE2_chip(adapter) (adapter->pdev->device == BE_DEVICE_ID1 || \ - adapter->pdev->device == OC_DEVICE_ID1) -#define BEx_chip(adapter) (BE3_chip(adapter) || BE2_chip(adapter)) - -#define be_roce_supported(adapter) (skyhawk_chip(adapter) && \ - (adapter->function_mode & RDMA_ENABLED)) +#define be_roce_supported(adapter) ((adapter->if_type == SLI_INTF_TYPE_3 || \ + adapter->sli_family == SKYHAWK_SLI_FAMILY) && \ + (adapter->function_mode & RDMA_ENABLED)) extern const struct ethtool_ops be_ethtool_ops; @@ -646,6 +649,12 @@ static inline bool be_is_wol_excluded(struct be_adapter *adapter) } } +static inline bool be_type_2_3(struct be_adapter *adapter) +{ + return (adapter->if_type == SLI_INTF_TYPE_2 || + adapter->if_type == SLI_INTF_TYPE_3) ? true : false; +} + extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, u16 num_popped); extern void be_link_status_update(struct be_adapter *adapter, u8 link_status); diff --git a/trunk/drivers/net/ethernet/emulex/benet/be_cmds.c b/trunk/drivers/net/ethernet/emulex/benet/be_cmds.c index f2875aa47661..7ea1ea4ff242 100644 --- a/trunk/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/trunk/drivers/net/ethernet/emulex/benet/be_cmds.c @@ -468,13 +468,14 @@ static int be_mbox_notify_wait(struct be_adapter *adapter) static int be_POST_stage_get(struct be_adapter *adapter, u16 *stage) { u32 sem; - u32 reg = skyhawk_chip(adapter) ? SLIPORT_SEMAPHORE_OFFSET_SH : - SLIPORT_SEMAPHORE_OFFSET_BE; - pci_read_config_dword(adapter->pdev, reg, &sem); - *stage = sem & POST_STAGE_MASK; + if (lancer_chip(adapter)) + sem = ioread32(adapter->db + MPU_EP_SEMAPHORE_IF_TYPE2_OFFSET); + else + sem = ioread32(adapter->csr + MPU_EP_SEMAPHORE_OFFSET); - if ((sem >> POST_ERR_SHIFT) & POST_ERR_MASK) + *stage = sem & EP_SEMAPHORE_POST_STAGE_MASK; + if ((sem >> EP_SEMAPHORE_POST_ERR_SHIFT) & EP_SEMAPHORE_POST_ERR_MASK) return -1; else return 0; @@ -1361,8 +1362,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd) be_wrb_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb, nonemb_cmd); - /* version 1 of the cmd is not supported only by BE2 */ - if (!BE2_chip(adapter)) + if (adapter->generation == BE_GEN3) hdr->version = 1; be_mcc_notify(adapter); @@ -1452,8 +1452,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed, be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL); - /* version 1 of the cmd is not supported only by BE2 */ - if (!BE2_chip(adapter)) + if (adapter->generation == BE_GEN3 || lancer_chip(adapter)) req->hdr.version = 1; req->hdr.domain = dom; diff --git a/trunk/drivers/net/ethernet/emulex/benet/be_cmds.h b/trunk/drivers/net/ethernet/emulex/benet/be_cmds.h index d6552e19ffee..06fc22738b9d 100644 --- a/trunk/drivers/net/ethernet/emulex/benet/be_cmds.h +++ b/trunk/drivers/net/ethernet/emulex/benet/be_cmds.h @@ -1656,6 +1656,33 @@ struct be_cmd_resp_get_stats_v1 { struct be_hw_stats_v1 hw_stats; }; +static inline void *hw_stats_from_cmd(struct be_adapter *adapter) +{ + if (adapter->generation == BE_GEN3) { + struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va; + + return &cmd->hw_stats; + } else { + struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va; + + return &cmd->hw_stats; + } +} + +static inline void *be_erx_stats_from_cmd(struct be_adapter *adapter) +{ + if (adapter->generation == BE_GEN3) { + struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); + + return &hw_stats->erx; + } else { + struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); + + return &hw_stats->erx; + } +} + + /************** get fat capabilites *******************/ #define MAX_MODULES 27 #define MAX_MODES 4 diff --git a/trunk/drivers/net/ethernet/emulex/benet/be_hw.h b/trunk/drivers/net/ethernet/emulex/benet/be_hw.h index 541d4530d5bf..4ccbc36874e9 100644 --- a/trunk/drivers/net/ethernet/emulex/benet/be_hw.h +++ b/trunk/drivers/net/ethernet/emulex/benet/be_hw.h @@ -31,12 +31,12 @@ #define MPU_EP_CONTROL 0 -/********** MPU semphore: used for SH & BE *************/ -#define SLIPORT_SEMAPHORE_OFFSET_BE 0x7c -#define SLIPORT_SEMAPHORE_OFFSET_SH 0x94 -#define POST_STAGE_MASK 0x0000FFFF -#define POST_ERR_MASK 0x1 -#define POST_ERR_SHIFT 31 +/********** MPU semphore ******************/ +#define MPU_EP_SEMAPHORE_OFFSET 0xac +#define MPU_EP_SEMAPHORE_IF_TYPE2_OFFSET 0x400 +#define EP_SEMAPHORE_POST_STAGE_MASK 0x0000FFFF +#define EP_SEMAPHORE_POST_ERR_MASK 0x1 +#define EP_SEMAPHORE_POST_ERR_SHIFT 31 /* MPU semphore POST stage values */ #define POST_STAGE_AWAITING_HOST_RDY 0x1 /* FW awaiting goahead from host */ @@ -105,6 +105,11 @@ #define SLI_INTF_TYPE_2 2 #define SLI_INTF_TYPE_3 3 +/* SLI family */ +#define BE_SLI_FAMILY 0x0 +#define LANCER_A0_SLI_FAMILY 0xA +#define SKYHAWK_SLI_FAMILY 0x2 + /********* ISR0 Register offset **********/ #define CEV_ISR0_OFFSET 0xC18 #define CEV_ISR_SIZE 4 diff --git a/trunk/drivers/net/ethernet/emulex/benet/be_main.c b/trunk/drivers/net/ethernet/emulex/benet/be_main.c index c365722218ff..5e48674f7245 100644 --- a/trunk/drivers/net/ethernet/emulex/benet/be_main.c +++ b/trunk/drivers/net/ethernet/emulex/benet/be_main.c @@ -285,35 +285,7 @@ static int be_mac_addr_set(struct net_device *netdev, void *p) return status; } -/* BE2 supports only v0 cmd */ -static void *hw_stats_from_cmd(struct be_adapter *adapter) -{ - if (BE2_chip(adapter)) { - struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va; - - return &cmd->hw_stats; - } else { - struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va; - - return &cmd->hw_stats; - } -} - -/* BE2 supports only v0 cmd */ -static void *be_erx_stats_from_cmd(struct be_adapter *adapter) -{ - if (BE2_chip(adapter)) { - struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); - - return &hw_stats->erx; - } else { - struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); - - return &hw_stats->erx; - } -} - -static void populate_be_v0_stats(struct be_adapter *adapter) +static void populate_be2_stats(struct be_adapter *adapter) { struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); struct be_pmem_stats *pmem_sts = &hw_stats->pmem; @@ -362,7 +334,7 @@ static void populate_be_v0_stats(struct be_adapter *adapter) adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; } -static void populate_be_v1_stats(struct be_adapter *adapter) +static void populate_be3_stats(struct be_adapter *adapter) { struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); struct be_pmem_stats *pmem_sts = &hw_stats->pmem; @@ -464,25 +436,28 @@ void be_parse_stats(struct be_adapter *adapter) struct be_rx_obj *rxo; int i; - if (lancer_chip(adapter)) { - populate_lancer_stats(adapter); + if (adapter->generation == BE_GEN3) { + if (lancer_chip(adapter)) + populate_lancer_stats(adapter); + else + populate_be3_stats(adapter); } else { - if (BE2_chip(adapter)) - populate_be_v0_stats(adapter); - else - /* for BE3 and Skyhawk */ - populate_be_v1_stats(adapter); + populate_be2_stats(adapter); + } - /* as erx_v1 is longer than v0, ok to use v1 for v0 access */ - for_all_rx_queues(adapter, rxo, i) { - /* below erx HW counter can actually wrap around after - * 65535. Driver accumulates a 32-bit value - */ - accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags, - (u16)erx->rx_drops_no_fragments \ - [rxo->q.id]); - } + if (lancer_chip(adapter)) + goto done; + + /* as erx_v1 is longer than v0, ok to use v1 defn for v0 access */ + for_all_rx_queues(adapter, rxo, i) { + /* below erx HW counter can actually wrap around after + * 65535. Driver accumulates a 32-bit value + */ + accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags, + (u16)erx->rx_drops_no_fragments[rxo->q.id]); } +done: + return; } static struct rtnl_link_stats64 *be_get_stats64(struct net_device *netdev, @@ -646,6 +621,16 @@ static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr, hdr, skb_shinfo(skb)->gso_size); if (skb_is_gso_v6(skb) && !lancer_chip(adapter)) AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso6, hdr, 1); + if (lancer_chip(adapter) && adapter->sli_family == + LANCER_A0_SLI_FAMILY) { + AMAP_SET_BITS(struct amap_eth_hdr_wrb, ipcs, hdr, 1); + if (is_tcp_pkt(skb)) + AMAP_SET_BITS(struct amap_eth_hdr_wrb, + tcpcs, hdr, 1); + else if (is_udp_pkt(skb)) + AMAP_SET_BITS(struct amap_eth_hdr_wrb, + udpcs, hdr, 1); + } } else if (skb->ip_summed == CHECKSUM_PARTIAL) { if (is_tcp_pkt(skb)) AMAP_SET_BITS(struct amap_eth_hdr_wrb, tcpcs, hdr, 1); @@ -1899,7 +1884,7 @@ static int be_num_txqs_want(struct be_adapter *adapter) if ((!lancer_chip(adapter) && sriov_want(adapter)) || be_is_mc(adapter) || (!lancer_chip(adapter) && !be_physfn(adapter)) || - BE2_chip(adapter)) + adapter->generation == BE_GEN2) return 1; else return adapter->max_tx_queues; @@ -2762,6 +2747,8 @@ static void be_setup_init(struct be_adapter *adapter) adapter->if_handle = -1; adapter->be3_native = false; adapter->promiscuous = false; + adapter->eq_next_idx = 0; + if (be_physfn(adapter)) adapter->cmd_privileges = MAX_PRIVILEGES; else @@ -3069,7 +3056,7 @@ static bool is_comp_in_ufi(struct be_adapter *adapter, int i = 0, img_type = 0; struct flash_section_info_g2 *fsec_g2 = NULL; - if (BE2_chip(adapter)) + if (adapter->generation != BE_GEN3) fsec_g2 = (struct flash_section_info_g2 *)fsec; for (i = 0; i < MAX_FLASH_COMP; i++) { @@ -3143,8 +3130,7 @@ static int be_flash(struct be_adapter *adapter, const u8 *img, return 0; } -/* For BE2 and BE3 */ -static int be_flash_BEx(struct be_adapter *adapter, +static int be_flash_data(struct be_adapter *adapter, const struct firmware *fw, struct be_dma_mem *flash_cmd, int num_of_images) @@ -3199,7 +3185,7 @@ static int be_flash_BEx(struct be_adapter *adapter, FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_BACKUP_FCoE} }; - if (BE3_chip(adapter)) { + if (adapter->generation == BE_GEN3) { pflashcomp = gen3_flash_types; filehdr_size = sizeof(struct flash_file_hdr_g3); num_comp = ARRAY_SIZE(gen3_flash_types); @@ -3208,7 +3194,6 @@ static int be_flash_BEx(struct be_adapter *adapter, filehdr_size = sizeof(struct flash_file_hdr_g2); num_comp = ARRAY_SIZE(gen2_flash_types); } - /* Get flash section info*/ fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw); if (!fsec) { @@ -3456,21 +3441,20 @@ static int lancer_fw_download(struct be_adapter *adapter, return status; } -#define UFI_TYPE2 2 -#define UFI_TYPE3 3 -#define UFI_TYPE4 4 -static int be_get_ufi_type(struct be_adapter *adapter, - struct flash_file_hdr_g2 *fhdr) +static int be_get_ufi_gen(struct be_adapter *adapter, + struct flash_file_hdr_g2 *fhdr) { if (fhdr == NULL) goto be_get_ufi_exit; - if (skyhawk_chip(adapter) && fhdr->build[0] == '4') - return UFI_TYPE4; - else if (BE3_chip(adapter) && fhdr->build[0] == '3') - return UFI_TYPE3; - else if (BE2_chip(adapter) && fhdr->build[0] == '2') - return UFI_TYPE2; + if (adapter->generation == BE_GEN3) { + if (skyhawk_chip(adapter) && fhdr->build[0] == '4') + return SH_HW; + else if (!skyhawk_chip(adapter) && fhdr->build[0] == '3') + return BE_GEN3; + } else if (adapter->generation == BE_GEN2 && fhdr->build[0] == '2') { + return BE_GEN2; + } be_get_ufi_exit: dev_err(&adapter->pdev->dev, @@ -3500,7 +3484,7 @@ static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw) p = fw->data; fhdr = (struct flash_file_hdr_g2 *)p; - ufi_type = be_get_ufi_type(adapter, fhdr); + ufi_type = be_get_ufi_gen(adapter, fhdr); fhdr3 = (struct flash_file_hdr_g3 *)fw->data; num_imgs = le32_to_cpu(fhdr3->num_imgs); @@ -3509,17 +3493,17 @@ static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw) (sizeof(struct flash_file_hdr_g3) + i * sizeof(struct image_hdr))); if (le32_to_cpu(img_hdr_ptr->imageid) == 1) { - if (ufi_type == UFI_TYPE4) + if (ufi_type == SH_HW) status = be_flash_skyhawk(adapter, fw, &flash_cmd, num_imgs); - else if (ufi_type == UFI_TYPE3) - status = be_flash_BEx(adapter, fw, &flash_cmd, - num_imgs); + else if (ufi_type == BE_GEN3) + status = be_flash_data(adapter, fw, + &flash_cmd, num_imgs); } } - if (ufi_type == UFI_TYPE2) - status = be_flash_BEx(adapter, fw, &flash_cmd, 0); + if (ufi_type == BE_GEN2) + status = be_flash_data(adapter, fw, &flash_cmd, 0); else if (ufi_type == -1) status = -1; @@ -3617,47 +3601,80 @@ static void be_netdev_init(struct net_device *netdev) static void be_unmap_pci_bars(struct be_adapter *adapter) { + if (adapter->csr) + iounmap(adapter->csr); if (adapter->db) - pci_iounmap(adapter->pdev, adapter->db); + iounmap(adapter->db); + if (adapter->roce_db.base) + pci_iounmap(adapter->pdev, adapter->roce_db.base); } -static int db_bar(struct be_adapter *adapter) +static int lancer_roce_map_pci_bars(struct be_adapter *adapter) { - if (lancer_chip(adapter) || !be_physfn(adapter)) - return 0; - else - return 4; -} + struct pci_dev *pdev = adapter->pdev; + u8 __iomem *addr; -static int be_roce_map_pci_bars(struct be_adapter *adapter) -{ - if (skyhawk_chip(adapter)) { - adapter->roce_db.size = 4096; - adapter->roce_db.io_addr = pci_resource_start(adapter->pdev, - db_bar(adapter)); - adapter->roce_db.total_size = pci_resource_len(adapter->pdev, - db_bar(adapter)); - } + addr = pci_iomap(pdev, 2, 0); + if (addr == NULL) + return -ENOMEM; + + adapter->roce_db.base = addr; + adapter->roce_db.io_addr = pci_resource_start(pdev, 2); + adapter->roce_db.size = 8192; + adapter->roce_db.total_size = pci_resource_len(pdev, 2); return 0; } static int be_map_pci_bars(struct be_adapter *adapter) { u8 __iomem *addr; - u32 sli_intf; + int db_reg; - pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf); - adapter->if_type = (sli_intf & SLI_INTF_IF_TYPE_MASK) >> - SLI_INTF_IF_TYPE_SHIFT; + if (lancer_chip(adapter)) { + if (be_type_2_3(adapter)) { + addr = ioremap_nocache( + pci_resource_start(adapter->pdev, 0), + pci_resource_len(adapter->pdev, 0)); + if (addr == NULL) + return -ENOMEM; + adapter->db = addr; + } + if (adapter->if_type == SLI_INTF_TYPE_3) { + if (lancer_roce_map_pci_bars(adapter)) + goto pci_map_err; + } + return 0; + } - addr = pci_iomap(adapter->pdev, db_bar(adapter), 0); + if (be_physfn(adapter)) { + addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2), + pci_resource_len(adapter->pdev, 2)); + if (addr == NULL) + return -ENOMEM; + adapter->csr = addr; + } + + if (adapter->generation == BE_GEN2) { + db_reg = 4; + } else { + if (be_physfn(adapter)) + db_reg = 4; + else + db_reg = 0; + } + addr = ioremap_nocache(pci_resource_start(adapter->pdev, db_reg), + pci_resource_len(adapter->pdev, db_reg)); if (addr == NULL) goto pci_map_err; adapter->db = addr; - - be_roce_map_pci_bars(adapter); + if (adapter->sli_family == SKYHAWK_SLI_FAMILY) { + adapter->roce_db.size = 4096; + adapter->roce_db.io_addr = + pci_resource_start(adapter->pdev, db_reg); + adapter->roce_db.total_size = + pci_resource_len(adapter->pdev, db_reg); + } return 0; - pci_map_err: be_unmap_pci_bars(adapter); return -ENOMEM; @@ -3684,14 +3701,8 @@ static int be_ctrl_init(struct be_adapter *adapter) struct be_dma_mem *mbox_mem_alloc = &adapter->mbox_mem_alloced; struct be_dma_mem *mbox_mem_align = &adapter->mbox_mem; struct be_dma_mem *rx_filter = &adapter->rx_filter; - u32 sli_intf; int status; - pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf); - adapter->sli_family = (sli_intf & SLI_INTF_FAMILY_MASK) >> - SLI_INTF_FAMILY_SHIFT; - adapter->virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0; - status = be_map_pci_bars(adapter); if (status) goto done; @@ -3750,14 +3761,14 @@ static int be_stats_init(struct be_adapter *adapter) { struct be_dma_mem *cmd = &adapter->stats_cmd; - if (lancer_chip(adapter)) - cmd->size = sizeof(struct lancer_cmd_req_pport_stats); - else if (BE2_chip(adapter)) + if (adapter->generation == BE_GEN2) { cmd->size = sizeof(struct be_cmd_req_get_stats_v0); - else - /* BE3 and Skyhawk */ - cmd->size = sizeof(struct be_cmd_req_get_stats_v1); - + } else { + if (lancer_chip(adapter)) + cmd->size = sizeof(struct lancer_cmd_req_pport_stats); + else + cmd->size = sizeof(struct be_cmd_req_get_stats_v1); + } cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma, GFP_KERNEL); if (cmd->va == NULL) @@ -3869,6 +3880,56 @@ static int be_get_initial_config(struct be_adapter *adapter) return 0; } +static int be_dev_type_check(struct be_adapter *adapter) +{ + struct pci_dev *pdev = adapter->pdev; + u32 sli_intf = 0, if_type; + + switch (pdev->device) { + case BE_DEVICE_ID1: + case OC_DEVICE_ID1: + adapter->generation = BE_GEN2; + break; + case BE_DEVICE_ID2: + case OC_DEVICE_ID2: + adapter->generation = BE_GEN3; + break; + case OC_DEVICE_ID3: + case OC_DEVICE_ID4: + pci_read_config_dword(pdev, SLI_INTF_REG_OFFSET, &sli_intf); + adapter->if_type = (sli_intf & SLI_INTF_IF_TYPE_MASK) >> + SLI_INTF_IF_TYPE_SHIFT; + if_type = (sli_intf & SLI_INTF_IF_TYPE_MASK) >> + SLI_INTF_IF_TYPE_SHIFT; + if (((sli_intf & SLI_INTF_VALID_MASK) != SLI_INTF_VALID) || + !be_type_2_3(adapter)) { + dev_err(&pdev->dev, "SLI_INTF reg val is not valid\n"); + return -EINVAL; + } + adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >> + SLI_INTF_FAMILY_SHIFT); + adapter->generation = BE_GEN3; + break; + case OC_DEVICE_ID5: + case OC_DEVICE_ID6: + pci_read_config_dword(pdev, SLI_INTF_REG_OFFSET, &sli_intf); + if ((sli_intf & SLI_INTF_VALID_MASK) != SLI_INTF_VALID) { + dev_err(&pdev->dev, "SLI_INTF reg val is not valid\n"); + return -EINVAL; + } + adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >> + SLI_INTF_FAMILY_SHIFT); + adapter->generation = BE_GEN3; + break; + default: + adapter->generation = 0; + } + + pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf); + adapter->virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0; + return 0; +} + static int lancer_recover_func(struct be_adapter *adapter) { int status; @@ -4024,6 +4085,11 @@ static int __devinit be_probe(struct pci_dev *pdev, adapter = netdev_priv(netdev); adapter->pdev = pdev; pci_set_drvdata(pdev, adapter); + + status = be_dev_type_check(adapter); + if (status) + goto free_netdev; + adapter->netdev = netdev; SET_NETDEV_DEV(netdev, &pdev->dev); diff --git a/trunk/drivers/net/ethernet/emulex/benet/be_roce.c b/trunk/drivers/net/ethernet/emulex/benet/be_roce.c index 55d32aa0a093..deecc44b3617 100644 --- a/trunk/drivers/net/ethernet/emulex/benet/be_roce.c +++ b/trunk/drivers/net/ethernet/emulex/benet/be_roce.c @@ -47,7 +47,10 @@ static void _be_roce_dev_add(struct be_adapter *adapter) dev_info.dpp_unmapped_len = 0; } dev_info.pdev = adapter->pdev; - dev_info.db = adapter->db; + if (adapter->sli_family == SKYHAWK_SLI_FAMILY) + dev_info.db = adapter->db; + else + dev_info.db = adapter->roce_db.base; dev_info.unmapped_db = adapter->roce_db.io_addr; dev_info.db_page_size = adapter->roce_db.size; dev_info.db_total_size = adapter->roce_db.total_size; diff --git a/trunk/drivers/net/ethernet/freescale/Kconfig b/trunk/drivers/net/ethernet/freescale/Kconfig index 5ba6e1cbd346..ff3be53d0169 100644 --- a/trunk/drivers/net/ethernet/freescale/Kconfig +++ b/trunk/drivers/net/ethernet/freescale/Kconfig @@ -94,9 +94,9 @@ config GIANFAR config FEC_PTP bool "PTP Hardware Clock (PHC)" - depends on FEC && ARCH_MXC + depends on FEC + select PPS select PTP_1588_CLOCK - default y if SOC_IMX6Q --help--- Say Y here if you want to use PTP Hardware Clock (PHC) in the driver. Only the basic clock operations have been implemented. diff --git a/trunk/drivers/net/ethernet/freescale/fec_ptp.c b/trunk/drivers/net/ethernet/freescale/fec_ptp.c index c40526c78c20..5352140468ce 100644 --- a/trunk/drivers/net/ethernet/freescale/fec_ptp.c +++ b/trunk/drivers/net/ethernet/freescale/fec_ptp.c @@ -145,7 +145,6 @@ static int fec_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) u64 diff; unsigned long flags; int neg_adj = 0; - u32 mult = FEC_CC_MULT; struct fec_enet_private *fep = container_of(ptp, struct fec_enet_private, ptp_caps); @@ -155,10 +154,6 @@ static int fec_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) neg_adj = 1; } - diff = mult; - diff *= ppb; - diff = div_u64(diff, 1000000000ULL); - spin_lock_irqsave(&fep->tmreg_lock, flags); /* * dummy read to set cycle_last in tc to now. @@ -166,8 +161,15 @@ static int fec_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) * timercounter_read. */ timecounter_read(&fep->tc); + fep->cc.mult = FEC_CC_MULT; + diff = fep->cc.mult; + diff *= ppb; + diff = div_u64(diff, 1000000000ULL); - fep->cc.mult = neg_adj ? mult - diff : mult + diff; + if (neg_adj) + fep->cc.mult -= diff; + else + fep->cc.mult += diff; spin_unlock_irqrestore(&fep->tmreg_lock, flags); diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 2b23ca21b320..edd9cb8d3e1d 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -870,7 +870,7 @@ static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv) /* If we haven't received a specific coalescing setting * (module param), we set the moderation parameters as follows: * - moder_cnt is set to the number of mtu sized packets to - * satisfy our coalescing target. + * satisfy our coelsing target. * - moder_time is set to a fixed value. */ priv->rx_frames = MLX4_EN_RX_COAL_TARGET; diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/trunk/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 8a5e70d68894..9d27e42264e2 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h @@ -126,7 +126,7 @@ enum { #define MLX4_EN_RX_COAL_TIME 0x10 #define MLX4_EN_TX_COAL_PKTS 16 -#define MLX4_EN_TX_COAL_TIME 0x10 +#define MLX4_EN_TX_COAL_TIME 0x80 #define MLX4_EN_RX_RATE_LOW 400000 #define MLX4_EN_RX_COAL_TIME_LOW 0 diff --git a/trunk/drivers/net/ethernet/micrel/ksz884x.c b/trunk/drivers/net/ethernet/micrel/ksz884x.c index 658afc45f378..318fee91c79d 100644 --- a/trunk/drivers/net/ethernet/micrel/ksz884x.c +++ b/trunk/drivers/net/ethernet/micrel/ksz884x.c @@ -7251,7 +7251,18 @@ static struct pci_driver pci_device_driver = { .remove = pcidev_exit }; -module_pci_driver(pci_device_driver); +static int __init ksz884x_init_module(void) +{ + return pci_register_driver(&pci_device_driver); +} + +static void __exit ksz884x_cleanup_module(void) +{ + pci_unregister_driver(&pci_device_driver); +} + +module_init(ksz884x_init_module); +module_exit(ksz884x_cleanup_module); MODULE_DESCRIPTION("KSZ8841/2 PCI network driver"); MODULE_AUTHOR("Tristram Ha "); diff --git a/trunk/include/uapi/linux/if_packet.h b/trunk/include/uapi/linux/if_packet.h index f9a60375f0d0..f3799295d231 100644 --- a/trunk/include/uapi/linux/if_packet.h +++ b/trunk/include/uapi/linux/if_packet.h @@ -50,7 +50,6 @@ struct sockaddr_ll { #define PACKET_TX_TIMESTAMP 16 #define PACKET_TIMESTAMP 17 #define PACKET_FANOUT 18 -#define PACKET_TX_HAS_OFF 19 #define PACKET_FANOUT_HASH 0 #define PACKET_FANOUT_LB 1 diff --git a/trunk/net/batman-adv/bat_iv_ogm.c b/trunk/net/batman-adv/bat_iv_ogm.c index 75403a491892..9f3925a85aab 100644 --- a/trunk/net/batman-adv/bat_iv_ogm.c +++ b/trunk/net/batman-adv/bat_iv_ogm.c @@ -411,9 +411,11 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff, if ((atomic_read(&bat_priv->aggregated_ogms)) && (packet_len < BATADV_MAX_AGGREGATION_BYTES)) - skb_size = BATADV_MAX_AGGREGATION_BYTES + ETH_HLEN; + skb_size = BATADV_MAX_AGGREGATION_BYTES; else - skb_size = packet_len + ETH_HLEN; + skb_size = packet_len; + + skb_size += ETH_HLEN + NET_IP_ALIGN; forw_packet_aggr->skb = dev_alloc_skb(skb_size); if (!forw_packet_aggr->skb) { @@ -422,7 +424,7 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff, kfree(forw_packet_aggr); goto out; } - skb_reserve(forw_packet_aggr->skb, ETH_HLEN); + skb_reserve(forw_packet_aggr->skb, ETH_HLEN + NET_IP_ALIGN); INIT_HLIST_NODE(&forw_packet_aggr->list); diff --git a/trunk/net/batman-adv/icmp_socket.c b/trunk/net/batman-adv/icmp_socket.c index 5874c0e84846..87ca8095b011 100644 --- a/trunk/net/batman-adv/icmp_socket.c +++ b/trunk/net/batman-adv/icmp_socket.c @@ -177,13 +177,13 @@ static ssize_t batadv_socket_write(struct file *file, const char __user *buff, if (len >= sizeof(struct batadv_icmp_packet_rr)) packet_len = sizeof(struct batadv_icmp_packet_rr); - skb = dev_alloc_skb(packet_len + ETH_HLEN); + skb = dev_alloc_skb(packet_len + ETH_HLEN + NET_IP_ALIGN); if (!skb) { len = -ENOMEM; goto out; } - skb_reserve(skb, ETH_HLEN); + skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN); icmp_packet = (struct batadv_icmp_packet_rr *)skb_put(skb, packet_len); if (copy_from_user(icmp_packet, buff, packet_len)) { diff --git a/trunk/net/batman-adv/translation-table.c b/trunk/net/batman-adv/translation-table.c index a570d957a5a0..f8b9c32c29a5 100644 --- a/trunk/net/batman-adv/translation-table.c +++ b/trunk/net/batman-adv/translation-table.c @@ -1472,11 +1472,11 @@ batadv_tt_response_fill_table(uint16_t tt_len, uint8_t ttvn, tt_tot = tt_len / sizeof(struct batadv_tt_change); len = tt_query_size + tt_len; - skb = dev_alloc_skb(len + ETH_HLEN); + skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN); if (!skb) goto out; - skb_reserve(skb, ETH_HLEN); + skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN); tt_response = (struct batadv_tt_query_packet *)skb_put(skb, len); tt_response->ttvn = ttvn; @@ -1538,11 +1538,11 @@ static int batadv_send_tt_request(struct batadv_priv *bat_priv, if (!tt_req_node) goto out; - skb = dev_alloc_skb(sizeof(*tt_request) + ETH_HLEN); + skb = dev_alloc_skb(sizeof(*tt_request) + ETH_HLEN + NET_IP_ALIGN); if (!skb) goto out; - skb_reserve(skb, ETH_HLEN); + skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN); tt_req_len = sizeof(*tt_request); tt_request = (struct batadv_tt_query_packet *)skb_put(skb, tt_req_len); @@ -1653,11 +1653,11 @@ batadv_send_other_tt_response(struct batadv_priv *bat_priv, tt_tot = tt_len / sizeof(struct batadv_tt_change); len = sizeof(*tt_response) + tt_len; - skb = dev_alloc_skb(len + ETH_HLEN); + skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN); if (!skb) goto unlock; - skb_reserve(skb, ETH_HLEN); + skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN); packet_pos = skb_put(skb, len); tt_response = (struct batadv_tt_query_packet *)packet_pos; tt_response->ttvn = req_ttvn; @@ -1780,11 +1780,11 @@ batadv_send_my_tt_response(struct batadv_priv *bat_priv, tt_tot = tt_len / sizeof(struct batadv_tt_change); len = sizeof(*tt_response) + tt_len; - skb = dev_alloc_skb(len + ETH_HLEN); + skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN); if (!skb) goto unlock; - skb_reserve(skb, ETH_HLEN); + skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN); packet_pos = skb_put(skb, len); tt_response = (struct batadv_tt_query_packet *)packet_pos; tt_response->ttvn = req_ttvn; @@ -2118,11 +2118,11 @@ static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client, if (!batadv_tt_check_roam_count(bat_priv, client)) goto out; - skb = dev_alloc_skb(sizeof(*roam_adv_packet) + ETH_HLEN); + skb = dev_alloc_skb(sizeof(*roam_adv_packet) + ETH_HLEN + NET_IP_ALIGN); if (!skb) goto out; - skb_reserve(skb, ETH_HLEN); + skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN); roam_adv_packet = (struct batadv_roam_adv_packet *)skb_put(skb, len); diff --git a/trunk/net/batman-adv/vis.c b/trunk/net/batman-adv/vis.c index 5abd1454fb07..ad14a6c91d6a 100644 --- a/trunk/net/batman-adv/vis.c +++ b/trunk/net/batman-adv/vis.c @@ -396,12 +396,12 @@ batadv_add_packet(struct batadv_priv *bat_priv, return NULL; len = sizeof(*packet) + vis_info_len; - info->skb_packet = dev_alloc_skb(len + ETH_HLEN); + info->skb_packet = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN); if (!info->skb_packet) { kfree(info); return NULL; } - skb_reserve(info->skb_packet, ETH_HLEN); + skb_reserve(info->skb_packet, ETH_HLEN + NET_IP_ALIGN); packet = (struct batadv_vis_packet *)skb_put(info->skb_packet, len); kref_init(&info->refcount); @@ -873,12 +873,13 @@ int batadv_vis_init(struct batadv_priv *bat_priv) if (!bat_priv->vis.my_info) goto err; - len = sizeof(*packet) + BATADV_MAX_VIS_PACKET_SIZE + ETH_HLEN; + len = sizeof(*packet) + BATADV_MAX_VIS_PACKET_SIZE; + len += ETH_HLEN + NET_IP_ALIGN; bat_priv->vis.my_info->skb_packet = dev_alloc_skb(len); if (!bat_priv->vis.my_info->skb_packet) goto free_info; - skb_reserve(bat_priv->vis.my_info->skb_packet, ETH_HLEN); + skb_reserve(bat_priv->vis.my_info->skb_packet, ETH_HLEN + NET_IP_ALIGN); tmp_skb = bat_priv->vis.my_info->skb_packet; packet = (struct batadv_vis_packet *)skb_put(tmp_skb, sizeof(*packet)); diff --git a/trunk/net/ipv6/ndisc.c b/trunk/net/ipv6/ndisc.c index a2e50dc46dc9..ae0cf818a8f0 100644 --- a/trunk/net/ipv6/ndisc.c +++ b/trunk/net/ipv6/ndisc.c @@ -906,7 +906,7 @@ static void ndisc_recv_na(struct sk_buff *skb) if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) && net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp && pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) { - /* XXX: idev->cnf.proxy_ndp */ + /* XXX: idev->cnf.prixy_ndp */ goto out; } diff --git a/trunk/net/packet/af_packet.c b/trunk/net/packet/af_packet.c index f262dbfc7f06..9034f52659b5 100644 --- a/trunk/net/packet/af_packet.c +++ b/trunk/net/packet/af_packet.c @@ -1881,35 +1881,7 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, skb_reserve(skb, hlen); skb_reset_network_header(skb); - if (po->tp_tx_has_off) { - int off_min, off_max, off; - off_min = po->tp_hdrlen - sizeof(struct sockaddr_ll); - off_max = po->tx_ring.frame_size - tp_len; - if (sock->type == SOCK_DGRAM) { - switch (po->tp_version) { - case TPACKET_V2: - off = ph.h2->tp_net; - break; - default: - off = ph.h1->tp_net; - break; - } - } else { - switch (po->tp_version) { - case TPACKET_V2: - off = ph.h2->tp_mac; - break; - default: - off = ph.h1->tp_mac; - break; - } - } - if (unlikely((off < off_min) || (off_max < off))) - return -EINVAL; - data = ph.raw + off; - } else { - data = ph.raw + po->tp_hdrlen - sizeof(struct sockaddr_ll); - } + data = ph.raw + po->tp_hdrlen - sizeof(struct sockaddr_ll); to_write = tp_len; if (sock->type == SOCK_DGRAM) { @@ -3137,19 +3109,6 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv return fanout_add(sk, val & 0xffff, val >> 16); } - case PACKET_TX_HAS_OFF: - { - unsigned int val; - - if (optlen != sizeof(val)) - return -EINVAL; - if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) - return -EBUSY; - if (copy_from_user(&val, optval, sizeof(val))) - return -EFAULT; - po->tp_tx_has_off = !!val; - return 0; - } default: return -ENOPROTOOPT; } @@ -3241,9 +3200,6 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, ((u32)po->fanout->type << 16)) : 0); break; - case PACKET_TX_HAS_OFF: - val = po->tp_tx_has_off; - break; default: return -ENOPROTOOPT; } diff --git a/trunk/net/packet/internal.h b/trunk/net/packet/internal.h index e84cab8cb7a9..44945f6b7252 100644 --- a/trunk/net/packet/internal.h +++ b/trunk/net/packet/internal.h @@ -109,7 +109,6 @@ struct packet_sock { unsigned int tp_hdrlen; unsigned int tp_reserve; unsigned int tp_loss:1; - unsigned int tp_tx_has_off:1; unsigned int tp_tstamp; struct packet_type prot_hook ____cacheline_aligned_in_smp; };