BNX2X: nic_load progress
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 18 Feb 2015 23:13:12 +0000 (18:13 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 Mar 2015 16:59:10 +0000 (11:59 -0500)
Including vmalloc, gunzip, and others.  Grep XME for issues.

Up to setting up IRQs.

kern/drivers/net/Kconfig
kern/drivers/net/bnx2x/akaros_compat.h
kern/drivers/net/bnx2x/bnx2x.h
kern/drivers/net/bnx2x/bnx2x_cmn.c
kern/drivers/net/bnx2x/bnx2x_cmn.h
kern/drivers/net/bnx2x/bnx2x_main.c

index 25c413b..2428181 100644 (file)
@@ -1,6 +1,7 @@
 config BNX2X
        bool "Broadcom BNX2X NIC driver"
        default n
+       select ZLIB_INFLATE
        help
                Broadcom Everest 10 Gb network driver (NetXtremeII).
 
index f01a4a4..0f9d965 100644 (file)
@@ -22,6 +22,7 @@
 #include <umem.h>
 #include <mmio.h>
 #include <taskqueue.h>
+#include <zlib.h>
 
 /* temporary dumping ground */
 #include "compat_todo.h"
@@ -135,6 +136,20 @@ static inline int __dma_mapping_error(dma_addr_t dma_addr)
 #define dma_mapping_error(dev, handle)                                         \
        __dma_mapping_error(handle)
 
+static void *vmalloc(size_t size)
+{
+       void *vaddr = get_cont_pages(LOG2_UP(nr_pages(size)), KMALLOC_WAIT);
+       /* zalloc, to be safe */
+       if (vaddr)
+               memset(vaddr, 0, size);
+       return vaddr;
+}
+
+/* Akaros needs to know the size, for now.  So it's not quite compatible */
+static void vfree(void *vaddr, size_t size)
+{
+       free_cont_pages(vaddr, LOG2_UP(nr_pages(size)));
+}
 
 typedef int pci_power_t;
 typedef int pm_message_t;
@@ -152,7 +167,7 @@ typedef int pm_message_t;
 
 /* Linux printk front ends */
 #ifndef pr_fmt
-#define pr_fmt(fmt) fmt
+#define pr_fmt(fmt) "bnx2x:" fmt
 #endif
 
 #define KERN_EMERG ""
@@ -187,18 +202,19 @@ typedef int pm_message_t;
 #define pr_info(fmt, ...) \
        printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
 #define pr_cont(fmt, ...) \
-       printk(KERN_CONT fmt, ##__VA_ARGS__)
+       printk(KERN_CONT pr_fmt(fmt), ##__VA_ARGS__)
 #define netdev_printk(lvl, dev, fmt, ...) \
-       printk(fmt, ##__VA_ARGS__)
+       printk("[netdev]: " fmt, ##__VA_ARGS__)
 #define netdev_err(dev, fmt, ...) \
-       printk(fmt, ##__VA_ARGS__)
+       printk("[netdev]: " fmt, ##__VA_ARGS__)
 #define netdev_info(dev, fmt, ...) \
-       printk(fmt, ##__VA_ARGS__)
+       printk("[netdev]: " fmt, ##__VA_ARGS__)
 #define dev_err(dev, fmt, ...) \
-       printk(fmt, ##__VA_ARGS__)
+       printk("[dev]: " fmt, ##__VA_ARGS__)
 #define dev_info(dev, fmt, ...) \
-       printk(fmt, ##__VA_ARGS__)
-
+       printk("[dev]: " fmt, ##__VA_ARGS__)
+#define dev_alert(dev, fmt, ...) \
+       printk("[dev]: " fmt, ##__VA_ARGS__)
 
 #ifdef DEBUG
 
@@ -537,10 +553,6 @@ static inline int pci_enable_device(struct pci_device *dev)
        return 0;
 }
 
-
-
-// TODO: maybe spatch these
-
 static inline uint32_t pci_resource_len(struct pci_device *dev, int bir)
 {
        return pci_get_membar_sz(dev, bir);
@@ -556,6 +568,20 @@ static inline void *pci_resource_end(struct pci_device *dev, int bir)
        return (void*)(pci_get_membar(dev, bir) + pci_resource_len(dev, bir));
 }
 
+/* Hacked up version of Linux's.  Assuming reg's are implemented and
+ * read_config never fails. */
+static int pcie_capability_read_word(struct pci_device *dev, int pos,
+                                     uint16_t *val)
+{
+       uint32_t pcie_cap;
+       if (pos & 1)
+               return -EINVAL;
+       if (pci_find_cap(dev, PCI_CAP_ID_EXP, &pcie_cap))
+               return -EINVAL;
+       pci_read_config_word(dev, pcie_cap + pos, val);
+       return 0;
+}
+
 #define ioremap_nocache(paddr, sz) \
         (void*)vmap_pmem_nocache((uintptr_t)paddr, sz)
 #define ioremap(paddr, sz) (void*)vmap_pmem(paddr, sz)
@@ -573,12 +599,17 @@ static inline void *pci_resource_end(struct pci_device *dev, int bir)
 #define netif_tx_wake_queue(...)
 #define netif_tx_start_all_queues(...)
 #define netif_tx_start_queue(...)
+#define netif_napi_add(...)
+#define napi_hash_add(...)
+#define napi_enable(...)
+#define napi_disable(...)
 /* picks a random, valid mac addr for dev */
 #define eth_hw_addr_random(...)
 /* checks if the MAC is not 0 and not multicast (all 1s) */
 #define is_valid_ether_addr(...) (TRUE)
 
 #define EPROBE_DEFER 1
+#define NET_SKB_PAD 32 // we'll probably delete code using this
 
 /* Could spatch this:
        if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
index d6f2657..a40d4e9 100644 (file)
@@ -116,7 +116,7 @@ do {                                                                \
        pr_err("[%s:%d]" fmt, __func__, __LINE__, ##__VA_ARGS__)
 
 /* before we have a dev->name use dev_info() */
-#define BNX2X_DEV_INFO(fmt, ...) printk(fmt, ##__VA_ARGS__)
+#define BNX2X_DEV_INFO(fmt, ...) pr_info(fmt, ##__VA_ARGS__)
 
 /* Error handling */
 void bnx2x_panic_dump(struct bnx2x *bp, bool disable_int);
@@ -1539,9 +1539,14 @@ struct bnx2x {
         */
 #define BNX2X_FW_RX_ALIGN_START        (1UL << BNX2X_RX_ALIGN_SHIFT)
 
+#if 0 // AKAROS_PORT might have issues with block sizes
 #define BNX2X_FW_RX_ALIGN_END                                  \
        MAX_T(uint64_t, 1UL << BNX2X_RX_ALIGN_SHIFT,                    \
            SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
+#else
+#define BNX2X_FW_RX_ALIGN_END                                  \
+       MAX_T(uint64_t, 1UL << BNX2X_RX_ALIGN_SHIFT, 0)
+#endif
 
 #define BNX2X_PXP_DRAM_ALIGN           (BNX2X_RX_ALIGN_SHIFT - 5)
 
index 18c0f5b..38107cb 100644 (file)
@@ -28,8 +28,6 @@ static int bnx2x_poll(struct napi_struct *napi, int budget);
 
 static void bnx2x_add_all_napi_cnic(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int i;
 
        /* Add NAPI objects */
@@ -38,13 +36,10 @@ panic("Not implemented");
                               bnx2x_poll, NAPI_POLL_WEIGHT);
                napi_hash_add(&bnx2x_fp(bp, i, napi));
        }
-#endif
 }
 
 static void bnx2x_add_all_napi(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int i;
 
        /* Add NAPI objects */
@@ -53,7 +48,6 @@ panic("Not implemented");
                               bnx2x_poll, NAPI_POLL_WEIGHT);
                napi_hash_add(&bnx2x_fp(bp, i, napi));
        }
-#endif
 }
 
 static int bnx2x_calc_num_queues(struct bnx2x *bp)
@@ -686,18 +680,19 @@ static void bnx2x_frag_free(const struct bnx2x_fastpath *fp, void *data)
 
 static void *bnx2x_frag_alloc(const struct bnx2x_fastpath *fp, gfp_t gfp_mask)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        if (fp->rx_frag_size) {
                /* GFP_KERNEL allocations are used only during initialization */
                if (unlikely(gfp_mask & KMALLOC_WAIT))
                        return (void *)kpage_alloc_addr();
 
+#if 0 // AKAROS_PORT
                return netdev_alloc_frag(fp->rx_frag_size);
+#else
+               return (void *)kpage_alloc_addr();
+#endif
        }
 
        return kmalloc(fp->rx_buf_size + NET_SKB_PAD, gfp_mask);
-#endif
 }
 
 #ifdef CONFIG_INET
@@ -840,8 +835,6 @@ drop:
 static int bnx2x_alloc_rx_data(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                               uint16_t index, gfp_t gfp_mask)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        uint8_t *data;
        struct sw_rx_bd *rx_buf = &fp->rx_buf_ring[index];
        struct eth_rx_bd *rx_bd = &fp->rx_desc_ring[index];
@@ -867,7 +860,6 @@ panic("Not implemented");
        rx_bd->addr_lo = cpu_to_le32(U64_LO(mapping));
 
        return 0;
-#endif
 }
 
 static
@@ -1911,34 +1903,26 @@ panic("Not implemented");
 
 static void bnx2x_napi_enable_cnic(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int i;
 
        for_each_rx_queue_cnic(bp, i) {
                bnx2x_fp_init_lock(&bp->fp[i]);
                napi_enable(&bnx2x_fp(bp, i, napi));
        }
-#endif
 }
 
 static void bnx2x_napi_enable(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int i;
 
        for_each_eth_queue(bp, i) {
                bnx2x_fp_init_lock(&bp->fp[i]);
                napi_enable(&bnx2x_fp(bp, i, napi));
        }
-#endif
 }
 
 static void bnx2x_napi_disable_cnic(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int i;
 
        for_each_rx_queue_cnic(bp, i) {
@@ -1946,13 +1930,10 @@ panic("Not implemented");
                while (!bnx2x_fp_ll_disable(&bp->fp[i]))
                        kthread_usleep(1000);
        }
-#endif
 }
 
 static void bnx2x_napi_disable(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int i;
 
        for_each_eth_queue(bp, i) {
@@ -1960,7 +1941,6 @@ panic("Not implemented");
                while (!bnx2x_fp_ll_disable(&bp->fp[i]))
                        kthread_usleep(1000);
        }
-#endif
 }
 
 void bnx2x_netif_start(struct bnx2x *bp)
@@ -2055,8 +2035,6 @@ void bnx2x_set_num_queues(struct bnx2x *bp)
  */
 static int bnx2x_set_real_num_queues(struct bnx2x *bp, int include_cnic)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int rc, tx, rx;
 
        tx = BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos;
@@ -2068,6 +2046,7 @@ panic("Not implemented");
                tx++;
        }
 
+#if 0 // AKAROS_PORT XME: set queues in ether
        rc = netif_set_real_num_tx_queues(bp->dev, tx);
        if (rc) {
                BNX2X_ERR("Failed to set real number of Tx queues: %d\n", rc);
@@ -2078,18 +2057,18 @@ panic("Not implemented");
                BNX2X_ERR("Failed to set real number of Rx queues: %d\n", rc);
                return rc;
        }
+#else
+       rc = 0;
+#endif
 
        DP(NETIF_MSG_IFUP, "Setting real num queues to (tx, rx) (%d, %d)\n",
                          tx, rx);
 
        return rc;
-#endif
 }
 
 static void bnx2x_set_rx_buf_size(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int i;
 
        for_each_queue(bp, i) {
@@ -2107,6 +2086,7 @@ panic("Not implemented");
                        mtu = BNX2X_FCOE_MINI_JUMBO_MTU;
                else
                        mtu = bp->dev->maxmtu;
+               /* AKAROS_PORT XME struct block alignment and size issues? */
                fp->rx_buf_size = BNX2X_FW_RX_ALIGN_START +
                                  IP_HEADER_ALIGNMENT_PADDING +
                                  ETH_OVREHEAD +
@@ -2118,7 +2098,6 @@ panic("Not implemented");
                else
                        fp->rx_frag_size = 0;
        }
-#endif
 }
 
 static int bnx2x_init_rss(struct bnx2x *bp)
@@ -2397,8 +2376,6 @@ alloc_mem_err:
 /* send load request to mcp and analyze response */
 static int bnx2x_nic_load_request(struct bnx2x *bp, uint32_t *load_code)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        uint32_t param;
 
        /* init fw_seq */
@@ -2435,7 +2412,6 @@ panic("Not implemented");
                return -EBUSY;
        }
        return 0;
-#endif
 }
 
 /* check whether another PF has already loaded FW to chip. In
@@ -2445,8 +2421,6 @@ panic("Not implemented");
 int bnx2x_compare_fw_ver(struct bnx2x *bp, uint32_t load_code,
                         bool print_err)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        /* is another pf loaded on this engine? */
        if (load_code != FW_MSG_CODE_DRV_LOAD_COMMON_CHIP &&
            load_code != FW_MSG_CODE_DRV_LOAD_COMMON) {
@@ -2474,7 +2448,6 @@ panic("Not implemented");
                }
        }
        return 0;
-#endif
 }
 
 /* returns the "mcp load_code" according to global load_count array */
@@ -2557,6 +2530,7 @@ static void bnx2x_bz_fp(struct bnx2x *bp, int index)
                       sizeof(struct bnx2x_agg_info));
        memset(fp, 0, sizeof(*fp));
 
+       /* AKAROS_PORT: let the code set up whatever fake napi stuff it needs */
        /* Restore the NAPI object as it has been already initialized */
        fp->napi = orig_napi;
        fp->tpa_info = orig_tpa_info;
@@ -2682,8 +2656,6 @@ load_error_cnic0:
 /* must be called with rtnl_lock */
 int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int port = BP_PORT(bp);
        int i, rc = 0;
        uint32_t load_code = 0;
@@ -2814,6 +2786,7 @@ panic("Not implemented");
 
        bnx2x_pre_irq_nic_init(bp);
 
+// XME HERE
        /* Connect to IRQs */
        rc = bnx2x_setup_irqs(bp);
        if (rc) {
@@ -3015,7 +2988,6 @@ load_error0:
 
        return rc;
 #endif /* ! BNX2X_STOP_ON_ERROR */
-#endif
 }
 
 int bnx2x_drain_tx_queues(struct bnx2x *bp)
@@ -4300,7 +4272,8 @@ panic("Not implemented");
  */
 int bnx2x_setup_tc(struct ether *dev, uint8_t num_tc)
 {
-panic("Not implemented");
+       /* XME skipping traffic classes */
+       return 0;
 #if 0 // AKAROS_PORT
        int cos, prio, count, offset;
        struct bnx2x *bp = netdev_priv(dev);
index 2bf7413..473b78f 100644 (file)
@@ -49,7 +49,7 @@ extern int bnx2x_num_queues;
        void *x = dma_zalloc_coherent(&bp->pdev->dev, size, y, KMALLOC_WAIT); \
        if (x)                                                          \
                DP(NETIF_MSG_HW,                                        \
-                  "BNX2X_PCI_ALLOC: Physical %Lx Virtual %p\n",        \
+                  "BNX2X_PCI_ALLOC: Physical %p Virtual %p\n", \
                   (unsigned long long)(*y), x);                        \
        x;                                                              \
 })
@@ -59,7 +59,7 @@ extern int bnx2x_num_queues;
        if (x) {                                                        \
                memset(x, 0xff, size);                                  \
                DP(NETIF_MSG_HW,                                        \
-                  "BNX2X_PCI_FALLOC: Physical %Lx Virtual %p\n",       \
+                  "BNX2X_PCI_FALLOC: Physical %p Virtual %p\n",        \
                   (unsigned long long)(*y), x);                        \
        }                                                               \
        x;                                                              \
index ab8c78c..4104220 100644 (file)
@@ -1392,13 +1392,10 @@ int bnx2x_send_final_clnup(struct bnx2x *bp, uint8_t clnup_func,
 
 uint8_t bnx2x_is_pcie_pending(struct pci_device *dev)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        uint16_t status;
 
        pcie_capability_read_word(dev, PCI_EXP_DEVSTA, &status);
        return status & PCI_EXP_DEVSTA_TRPND;
-#endif
 }
 
 /* PF FLR specific routines
@@ -5678,7 +5675,7 @@ panic("Not implemented");
                if (status & BNX2X_DEF_SB_IDX) {
                        struct bnx2x_fastpath *fp = bnx2x_fcoe_fp(bp);
 
-               if (FCOE_INIT(bp) &&
+                       if (FCOE_INIT(bp) &&
                            (bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) {
                                /* Prevent local bottom-halves from running as
                                 * we are going to change the local NAPI list.
@@ -5915,8 +5912,6 @@ static void bnx2x_setup_ndsb_state_machine(struct hc_status_block_sm *hc_sm,
 /* allocates state machine ids. */
 static void bnx2x_map_sb_state_machines(struct hc_index_data *index_data)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        /* zero out state machine indices */
        /* rx indices */
        index_data[HC_INDEX_ETH_RX_CQ_CONS].flags &= ~HC_INDEX_DATA_SM_ID;
@@ -5941,7 +5936,6 @@ panic("Not implemented");
                SM_TX_ID << HC_INDEX_DATA_SM_ID_SHIFT;
        index_data[HC_INDEX_ETH_TX_CQ_CONS_COS2].flags |=
                SM_TX_ID << HC_INDEX_DATA_SM_ID_SHIFT;
-#endif
 }
 
 void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid,
@@ -6555,8 +6549,6 @@ void bnx2x_post_irq_nic_init(struct bnx2x *bp, uint32_t load_code)
 /* gzip service functions */
 static int bnx2x_gunzip_init(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        bp->gunzip_buf = dma_alloc_coherent(&bp->pdev->dev, FW_BUF_SIZE,
                                            &bp->gunzip_mapping, KMALLOC_WAIT);
        if (bp->gunzip_buf  == NULL)
@@ -6584,15 +6576,12 @@ gunzip_nomem2:
 gunzip_nomem1:
        BNX2X_ERR("Cannot allocate firmware buffer for un-compression\n");
        return -ENOMEM;
-#endif
 }
 
 static void bnx2x_gunzip_end(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        if (bp->strm) {
-               vfree(bp->strm->workspace);
+               vfree(bp->strm->workspace, zlib_inflate_workspacesize());
                kfree(bp->strm);
                bp->strm = NULL;
        }
@@ -6602,13 +6591,10 @@ panic("Not implemented");
                                  bp->gunzip_mapping);
                bp->gunzip_buf = NULL;
        }
-#endif
 }
 
 static int bnx2x_gunzip(struct bnx2x *bp, const uint8_t *zbuf, int len)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        int n, rc;
 
        /* check gzip header */
@@ -6651,7 +6637,6 @@ panic("Not implemented");
                return 0;
 
        return rc;
-#endif
 }
 
 /* nic load/unload */
@@ -6911,8 +6896,6 @@ static void bnx2x_setup_dmae(struct bnx2x *bp)
 
 static void bnx2x_init_pxp(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        uint16_t devctl;
        int r_order, w_order;
 
@@ -6927,7 +6910,6 @@ panic("Not implemented");
        }
 
        bnx2x_init_pxp_arb(bp, r_order, w_order);
-#endif
 }
 
 static void bnx2x_setup_fan_failure_detection(struct bnx2x *bp)
@@ -7049,8 +7031,6 @@ static void bnx2x_reset_endianity(struct bnx2x *bp)
  */
 static int bnx2x_init_hw_common(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        uint32_t val;
 
        DP(NETIF_MSG_HW, "starting common init  func %d\n", BP_ABS_FUNC(bp));
@@ -7485,7 +7465,6 @@ panic("Not implemented");
                BNX2X_ERR("Bootcode is missing - can not initialize link\n");
 
        return 0;
-#endif
 }
 
 /**
@@ -12458,14 +12437,13 @@ static void bnx2x_set_rx_mode(struct ether *dev)
 
 void bnx2x_set_rx_mode_inner(struct bnx2x *bp)
 {
-panic("Not implemented");
-#if 0 // AKAROS_PORT
        uint32_t rx_mode = BNX2X_RX_MODE_NORMAL;
 
-       DP(NETIF_MSG_IFUP, "dev->flags = %x\n", bp->dev->flags);
+       //DP(NETIF_MSG_IFUP, "dev->flags = %x\n", bp->dev->flags);
 
        qlock(&bp->dev->qlock);
 
+#if 0 // AKAROS_PORT skip promisc and multicast
        if (bp->dev->flags & IFF_PROMISC) {
                rx_mode = BNX2X_RX_MODE_PROMISC;
        } else if ((bp->dev->flags & IFF_ALLMULTI) ||
@@ -12473,6 +12451,9 @@ panic("Not implemented");
                    CHIP_IS_E1(bp))) {
                rx_mode = BNX2X_RX_MODE_ALLMULTI;
        } else {
+#else
+       {
+#endif
                if (IS_PF(bp)) {
                        /* some multicasts */
                        if (bnx2x_set_mc_list(bp) < 0)
@@ -12515,7 +12496,6 @@ panic("Not implemented");
                qunlock(&bp->dev->qlock);
                bnx2x_vfpf_storm_rx_mode(bp);
        }
-#endif
 }
 
 /* called with rtnl_lock */
@@ -13367,7 +13347,7 @@ int bnx2x_init_one(struct ether *dev, struct bnx2x *bp,
 
        bp->igu_sb_cnt = max_non_def_sbs;
        bp->igu_base_addr = IS_VF(bp) ? PXP_VF_ADDR_IGU_START : BAR_IGU_INTMEM;
-       bp->msg_enable = debug;
+       bp->msg_enable = 0xffffffff & ~BNX2X_MSG_DMAE;
        bp->cnic_support = cnic_cnt;
        bp->cnic_probe = bnx2x_cnic_probe;