From: Roland Dreier <roland@purestorage.com>
Date: Thu, 3 Apr 2014 15:30:17 +0000 (-0700)
Subject: Merge branches 'core', 'cxgb4', 'ip-roce', 'iser', 'misc', 'mlx4', 'nes', 'ocrdma... 
X-Git-Tag: firefly_0821_release~176^2~4157^2
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f7eaa7ed8fd46542275cf249cd934a366f6556bb;p=firefly-linux-kernel-4.4.55.git

Merge branches 'core', 'cxgb4', 'ip-roce', 'iser', 'misc', 'mlx4', 'nes', 'ocrdma', 'qib', 'sgwrapper', 'srp' and 'usnic' into for-next
---

f7eaa7ed8fd46542275cf249cd934a366f6556bb
diff --cc drivers/infiniband/hw/ehca/ehca_mrmw.c
index 7168f594d457,bcfb0c183620,bcfb0c183620,bcfb0c183620,bcfb0c183620,bcfb0c183620,bcfb0c183620,bcfb0c183620,bcfb0c183620,65873eeca9b0,bcfb0c183620,bcfb0c183620..3488e8c9fcb4
--- a/drivers/infiniband/hw/ehca/ehca_mrmw.c
+++ b/drivers/infiniband/hw/ehca/ehca_mrmw.c
@@@@@@@@@@@@@ -1925,32 -1953,21 -1953,21 -1953,21 -1953,21 -1953,21 -1953,21 -1953,21 -1953,21 -1953,21 -1953,21 -1953,21 +1925,32 @@@@@@@@@@@@@ static int ehca_set_pagebuf_user2(struc
            	u32 j = 0;
            	int kpages_per_hwpage = pginfo->hwpage_size / PAGE_SIZE;
            	int nr_kpages = kpages_per_hwpage;
 +++++++++++	struct scatterlist **sg = &pginfo->u.usr.next_sg;
 ++++++++ ++
         -  	/* loop over desired chunk entries */
         -  	chunk      = pginfo->u.usr.next_chunk;
         -  	prev_chunk = pginfo->u.usr.next_chunk;
         -  	list_for_each_entry_continue(
         -  		chunk, (&(pginfo->u.usr.region->chunk_list)), list) {
         -  		for (i = pginfo->u.usr.next_nmap; i < chunk->nmap; ) {
         -  			if (nr_kpages == kpages_per_hwpage) {
         -  				pgaddr = ( page_to_pfn(sg_page(&chunk->page_list[i]))
         -  					   << PAGE_SHIFT );
         -  				*kpage = pgaddr;
         -  				if ( !(*kpage) ) {
         -  					ehca_gen_err("pgaddr=%llx i=%x",
         -  						     pgaddr, i);
 +++++++++++	while (*sg != NULL) {
         +  
 -------- --	/* loop over desired chunk entries */
 -------- --	chunk      = pginfo->u.usr.next_chunk;
 -------- --	prev_chunk = pginfo->u.usr.next_chunk;
 -------- --	list_for_each_entry_continue(
 -------- --		chunk, (&(pginfo->u.usr.region->chunk_list)), list) {
 -------- --		for (i = pginfo->u.usr.next_nmap; i < chunk->nmap; ) {
 -------- --			if (nr_kpages == kpages_per_hwpage) {
 -------- --				pgaddr = ( page_to_pfn(sg_page(&chunk->page_list[i]))
 -------- --					   << PAGE_SHIFT );
 -------- --				*kpage = pgaddr;
 -------- --				if ( !(*kpage) ) {
 -------- --					ehca_gen_err("pgaddr=%llx i=%x",
 -------- --						     pgaddr, i);
 +++++++++++		if (nr_kpages == kpages_per_hwpage) {
 +++++++++++			pgaddr = (page_to_pfn(sg_page(*sg))
 +++++++++++				   << PAGE_SHIFT);
 +++++++++++			*kpage = pgaddr;
 +++++++++++			if (!(*kpage)) {
 +++++++++++				ehca_gen_err("pgaddr=%llx entry=%llx",
 +++++++++++					     pgaddr, pginfo->u.usr.next_nmap);
 +++++++++++				ret = -EFAULT;
 +++++++++++				return ret;
 +++++++++++			}
 +++++++++++			/*
 +++++++++++			 * The first page in a hwpage must be aligned;
 +++++++++++			 * the first MR page is exempt from this rule.
 +++++++++++			 */
 +++++++++++			if (pgaddr & (pginfo->hwpage_size - 1)) {
 +++++++++++				if (pginfo->hwpage_cnt) {
 +++++++++++					ehca_gen_err(
 +++++++++++						"invalid alignment "
 +++++++++++						"pgaddr=%llx entry=%llx "
 +++++++++++						"mr_pgsize=%llx",
 +++++++++++						pgaddr, pginfo->u.usr.next_nmap,
 +++++++++++						pginfo->hwpage_size);
            					ret = -EFAULT;
            					return ret;
            				}
diff --cc drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
index 0de3473fa7d9,e0cc201be41a,e0cc201be41a,e0cc201be41a,e0cc201be41a,e0cc201be41a,e0cc201be41a,dd554a2ffe56,e0cc201be41a,e0cc201be41a,e0cc201be41a,e0cc201be41a..edf6211d84b8
--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
@@@@@@@@@@@@@ -954,11 -956,11 -956,11 -956,11 -956,11 -956,11 -956,11 -979,22 -956,11 -956,11 -956,11 -956,11 +977,22 @@@@@@@@@@@@@ int ocrdma_destroy_cq(struct ib_cq *ibc
            {
            	int status;
            	struct ocrdma_cq *cq = get_ocrdma_cq(ibcq);
+++++++ ++++	struct ocrdma_eq *eq = NULL;
            	struct ocrdma_dev *dev = get_ocrdma_dev(ibcq->device);
            	int pdid = 0;
+++++++ ++++	u32 irq, indx;
            
------- ----	status = ocrdma_mbx_destroy_cq(dev, cq);
+++++++ ++++	dev->cq_tbl[cq->id] = NULL;
+++++++ ++++	indx = ocrdma_get_eq_table_index(dev, cq->eqn);
+++++++ ++++	if (indx == -EINVAL)
+++++++ ++++		BUG();
 ++++++ ++++
+++++++ ++++	eq = &dev->eq_tbl[indx];
+++++++ ++++	irq = ocrdma_get_irq(dev, eq);
+++++++ ++++	synchronize_irq(irq);
+++++++ ++++	ocrdma_flush_cq(cq);
+           
+++++++ ++++	status = ocrdma_mbx_destroy_cq(dev, cq);
            	if (cq->ucontext) {
            		pdid = cq->ucontext->cntxt_pd->id;
            		ocrdma_del_mmap(cq->ucontext, (u64) cq->pa,
@@@@@@@@@@@@@ -2703,10 -2705,10 -2705,10 -2705,10 -2705,10 -2705,10 -2705,10 -2723,18 -2705,10 -2705,10 -2705,10 -2705,10 +2721,18 @@@@@@@@@@@@@ expand_cqe
            	}
            stop_cqe:
            	cq->getp = cur_getp;
------- ----	if (polled_hw_cqes || expand || stop) {
------- ----		ocrdma_ring_cq_db(dev, cq->id, cq->armed, cq->solicited,
+++++++ ++++	if (cq->deferred_arm) {
+++++++ ++++		ocrdma_ring_cq_db(dev, cq->id, true, cq->deferred_sol,
 ++++++ ++++				  polled_hw_cqes);
+++++++ ++++		cq->deferred_arm = false;
+++++++ ++++		cq->deferred_sol = false;
+++++++ ++++	} else {
+++++++ ++++		/* We need to pop the CQE. No need to arm */
+++++++ ++++		ocrdma_ring_cq_db(dev, cq->id, false, cq->deferred_sol,
+           				  polled_hw_cqes);
+++++++ ++++		cq->deferred_sol = false;
            	}
+++++++ ++++
            	return i;
            }