Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c6992781 authored by Mahesh Rajashekhara's avatar Mahesh Rajashekhara Committed by James Bottomley
Browse files

aacraid: Enable 64bit write to controller register



If writeq() not supported, then do atomic two 32bit write

Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Reviewed-by: default avatarMurthy Bhat <Murthy.Bhat@pmcs.com>
Reviewed-by: default avatarKarthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
Signed-off-by: default avatarMahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent 9022d375
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -844,6 +844,10 @@ struct src_registers {
						&((AEP)->regs.src.bar0->CSR))
#define src_writel(AEP, CSR, value)	writel(value, \
						&((AEP)->regs.src.bar0->CSR))
#if defined(writeq)
#define	src_writeq(AEP, CSR, value)	writeq(value, \
						&((AEP)->regs.src.bar0->CSR))
#endif

#define SRC_ODR_SHIFT		12
#define SRC_IDR_SHIFT		9
@@ -1163,6 +1167,11 @@ struct aac_dev
	struct fsa_dev_info	*fsa_dev;
	struct task_struct	*thread;
	int			cardtype;
	/*
	 *This lock will protect the two 32-bit
	 *writes to the Inbound Queue
	 */
	spinlock_t		iq_lock;

	/*
	 *	The following is the device specific extension.
+1 −0
Original line number Diff line number Diff line
@@ -424,6 +424,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
	dev->management_fib_count = 0;
	spin_lock_init(&dev->manage_lock);
	spin_lock_init(&dev->sync_lock);
	spin_lock_init(&dev->iq_lock);
	dev->max_fib_size = sizeof(struct hw_fib);
	dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
		- sizeof(struct aac_fibhdr)
+10 −2
Original line number Diff line number Diff line
@@ -447,6 +447,10 @@ static int aac_src_deliver_message(struct fib *fib)
	u32 fibsize;
	dma_addr_t address;
	struct aac_fib_xporthdr *pFibX;
#if !defined(writeq)
	unsigned long flags;
#endif

	u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);

	atomic_inc(&q->numpending);
@@ -511,10 +515,14 @@ static int aac_src_deliver_message(struct fib *fib)
			return -EINVAL;
		address |= fibsize;
	}

#if defined(writeq)
	src_writeq(dev, MUnit.IQ_L, (u64)address);
#else
	spin_lock_irqsave(&fib->dev->iq_lock, flags);
	src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
	src_writel(dev, MUnit.IQ_L, address & 0xffffffff);

	spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
#endif
	return 0;
}