#define FNIC_MAIN_NOTE(kern_level, host, fmt, args...)          \
        shost_printk(kern_level, host, fmt, ##args)
 
+#define FNIC_WQ_COPY_MAX 64
+#define FNIC_WQ_MAX 1
+#define FNIC_RQ_MAX 1
+#define FNIC_CQ_MAX (FNIC_WQ_COPY_MAX + FNIC_WQ_MAX + FNIC_RQ_MAX)
+#define FNIC_DFLT_IO_COMPLETIONS 256
+
+#define FNIC_MQ_CQ_INDEX        2
+
 extern const char *fnic_state_str[];
 
 enum fnic_intx_intr_index {
        FNIC_INTX_WQ_RQ_COPYWQ,
-       FNIC_INTX_ERR,
+       FNIC_INTX_DUMMY,
        FNIC_INTX_NOTIFY,
+       FNIC_INTX_ERR,
        FNIC_INTX_INTR_MAX,
 };
 
        FNIC_MSIX_RQ,
        FNIC_MSIX_WQ,
        FNIC_MSIX_WQ_COPY,
-       FNIC_MSIX_ERR_NOTIFY,
+       FNIC_MSIX_ERR_NOTIFY = FNIC_MSIX_WQ_COPY + FNIC_WQ_COPY_MAX,
        FNIC_MSIX_INTR_MAX,
 };
 
        char devname[IFNAMSIZ + 11];
        irqreturn_t (*isr)(int, void *);
        void *devid;
+       int irq_num;
 };
 
 enum fnic_state {
        FNIC_IN_ETH_TRANS_FC_MODE,
 };
 
-#define FNIC_WQ_COPY_MAX 1
-#define FNIC_WQ_MAX 1
-#define FNIC_RQ_MAX 1
-#define FNIC_CQ_MAX (FNIC_WQ_COPY_MAX + FNIC_WQ_MAX + FNIC_RQ_MAX)
-#define FNIC_DFLT_IO_COMPLETIONS 256
-
 struct mempool;
 
 enum fnic_evt {
        enum fnic_evt event;
 };
 
+struct fnic_cpy_wq {
+       unsigned long hw_lock_flags;
+       u16 active_ioreq_count;
+       u16 ioreq_table_size;
+       ____cacheline_aligned struct fnic_io_req **io_req_table;
+};
+
 /* Per-instance private data structure */
 struct fnic {
        int fnic_num;
        mempool_t *io_sgl_pool[FNIC_SGL_NUM_CACHES];
        spinlock_t io_req_lock[FNIC_IO_LOCKS];  /* locks for scsi cmnds */
 
+       unsigned int copy_wq_base;
        struct work_struct link_work;
        struct work_struct frame_work;
        struct sk_buff_head frame_queue;
 
        /* copy work queue cache line section */
        ____cacheline_aligned struct vnic_wq_copy hw_copy_wq[FNIC_WQ_COPY_MAX];
+       ____cacheline_aligned struct fnic_cpy_wq sw_copy_wq[FNIC_WQ_COPY_MAX];
+
        /* completion queue cache line section */
        ____cacheline_aligned struct vnic_cq cq[FNIC_CQ_MAX];