All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Yan <ayan@marvell.com>
To: james.bottomley@hansenpartnership.com, jeff@garzik.org,
	linux-scsi@vger.kernel.org
Cc: qswang@marvell.com, jfeng@marvell.com
Subject: [PATCH 5/7]MVSAS:Optimization for DMA buffer
Date: Mon, 9 Nov 2009 20:19:52 +0800	[thread overview]
Message-ID: <20091109121952.GD32336@Andy.marvell.com> (raw)


>From 0b428877eecefb91b7ec7e9f1a087e5ccf2b0445 Mon Sep 17 00:00:00 2001
From: Andy <ayan@marvell.com>
Date: Fri, 6 Nov 2009 17:25:08 +0800
Subject: [PATCH 5/7] optimization for DMA buffer
  optimization for DMA buffer allocation to get 
  better compatbility with different OS distribution

Signed-off-by: Andy <ayan@marvell.com>
Signed-off-by: Jacky <jfeng@marvell.com>
Signed-off-by: Ke <kewei@marvell.com>

---
 drivers/scsi/mvsas/mv_94xx.h |    2 +-
 drivers/scsi/mvsas/mv_defs.h |    7 +++--
 drivers/scsi/mvsas/mv_init.c |   57 +++++++++++++++++++++++++++++------------
 drivers/scsi/mvsas/mv_sas.c  |    9 ++++--
 drivers/scsi/mvsas/mv_sas.h  |    2 +
 5 files changed, 53 insertions(+), 24 deletions(-)

diff --git a/drivers/scsi/mvsas/mv_94xx.h b/drivers/scsi/mvsas/mv_94xx.h
index 1df38a9..d0b081a 100644
--- a/drivers/scsi/mvsas/mv_94xx.h
+++ b/drivers/scsi/mvsas/mv_94xx.h
@@ -187,7 +187,7 @@ struct mvs_prd_imt {
 
 struct mvs_prd {
 	/* 64-bit buffer address */
-	__le64			addr;
+	__le64		addr;
 	/* 22-bit length */
 	__le32		im_len;
 } __attribute__ ((packed));
diff --git a/drivers/scsi/mvsas/mv_defs.h b/drivers/scsi/mvsas/mv_defs.h
index 5096de8..f39f16a 100644
--- a/drivers/scsi/mvsas/mv_defs.h
+++ b/drivers/scsi/mvsas/mv_defs.h
@@ -40,7 +40,6 @@ enum chip_flavors {
 
 /* driver compile-time configuration */
 enum driver_configuration {
-	MVS_SLOTS		= 512,	/* command slots */
 	MVS_TX_RING_SZ		= 1024,	/* TX ring size (12-bit) */
 	MVS_RX_RING_SZ		= 1024, /* RX ring size (12-bit) */
 					/* software requires power-of-2
@@ -53,8 +52,8 @@ enum driver_configuration {
 	MVS_SSP_CMD_SZ		= 64,	/* SSP command table buffer size */
 	MVS_ATA_CMD_SZ		= 96,	/* SATA command table buffer size */
 	MVS_OAF_SZ		= 64,	/* Open address frame buffer size */
-	MVS_QUEUE_SIZE	= 32,	/* Support Queue depth */
-	MVS_CAN_QUEUE		= MVS_SLOTS - 2,	/* SCSI Queue depth */
+	MVS_QUEUE_SIZE	= 64,	/* Support Queue depth */
+	MVS_CAN_QUEUE		= MVS_QUEUE_SIZE - 2,	/* SCSI Queue depth */
 	MVS_SOC_CAN_QUEUE	= MVS_SOC_SLOTS - 2,
 };
 
@@ -397,6 +396,7 @@ enum mvs_event_flags {
 	PHY_PLUG_EVENT	= (3U),
 	PHY_PLUG_IN		= (1U << 0),	/* phy plug in */
 	PHY_PLUG_OUT		= (1U << 1),	/* phy plug out */
+	EXP_BRCT_CHG		= (1U << 2),    /* broadcast change */
 };
 
 enum mvs_port_type {
@@ -507,4 +507,5 @@ enum pci_cfg_comm_registers {
 	PCR_CMD		= 0x04,
 	PCR_MSI_CTRL 	= 0x50,
 };
+
 #endif
diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
index eca335b..fb1bee0 100644
--- a/drivers/scsi/mvsas/mv_init.c
+++ b/drivers/scsi/mvsas/mv_init.c
@@ -156,6 +156,10 @@ static void mvs_free(struct mvs_info *mvi)
 	if (mvi->bulk_buffer)
 		dma_free_coherent(mvi->dev, TRASH_BUCKET_SIZE,
 				  mvi->bulk_buffer, mvi->bulk_buffer_dma);
+	if (mvi->bulk_buffer1)
+		dma_free_coherent(mvi->dev, TRASH_BUCKET_SIZE,
+				  mvi->bulk_buffer1, mvi->bulk_buffer_dma1);
+
 #endif
 
 	MVS_CHIP_DISP->chip_iounmap(mvi);
@@ -304,21 +308,37 @@ static int __devinit mvs_alloc(struct mvs_info *mvi, struct Scsi_Host *shost)
 	mvi->bulk_buffer = dma_alloc_coherent(mvi->dev,
 				       TRASH_BUCKET_SIZE,
 				       &mvi->bulk_buffer_dma, GFP_KERNEL);
+
+	mvi->bulk_buffer1 = dma_alloc_coherent(mvi->dev,
+				       TRASH_BUCKET_SIZE,
+				       &mvi->bulk_buffer_dma1, GFP_KERNEL);
+
 	if (!mvi->bulk_buffer)
 		goto err_out;
 #endif
-	for (i = 0; i < slot_nr; i++) {
-		struct mvs_slot_info *slot = &mvi->slot_info[i];
-
-		slot->buf = dma_alloc_coherent(mvi->dev, MVS_SLOT_BUF_SZ,
-					       &slot->buf_dma, GFP_KERNEL);
-		if (!slot->buf) {
+	i = 0;
+	while (i < slot_nr) {
+		buf_size = PAGE_SIZE > MVS_SLOT_BUF_SZ ?
+			PAGE_SIZE : MVS_SLOT_BUF_SZ;
+		buf = dma_alloc_coherent(mvi->dev, buf_size,
+				&buf_dma, GFP_KERNEL);
+
+		if (!buf) {
 			printk(KERN_DEBUG"failed to allocate slot->buf.\n");
 			goto err_out;
 		}
-		memset(slot->buf, 0, MVS_SLOT_BUF_SZ);
-		++mvi->tags_num;
+		j = 0;
+		do {
+			slot = &mvi->slot_info[i + j];
+			slot->buf = buf + MVS_SLOT_BUF_SZ * j;
+			slot->buf_dma = buf_dma + MVS_SLOT_BUF_SZ * j;
+			memset(slot->buf, 0, MVS_SLOT_BUF_SZ);
+			++mvi->tags_num;
+			j++;
+		} while (j < PAGE_SIZE/MVS_SLOT_BUF_SZ);
+		i += j;
 	}
+
 	/* Initialize tags */
 	mvs_tag_init(mvi);
 	return 0;
@@ -385,14 +405,17 @@ static struct mvs_info *__devinit mvs_pci_alloc(struct pci_dev *pdev,
 				const struct pci_device_id *ent,
 				struct Scsi_Host *shost, unsigned int id)
 {
-	struct mvs_info *mvi;
+	struct mvs_info *mvi = NULL;
 	struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
 
-	mvi = kzalloc(sizeof(*mvi) + MVS_SLOTS * sizeof(struct mvs_slot_info),
-			GFP_KERNEL);
+	mvi = kzalloc(sizeof(*mvi) +
+		(1L << mvs_chips[ent->driver_data].slot_width)
+		* sizeof(struct mvs_slot_info), GFP_KERNEL);
 	if (!mvi)
 		return NULL;
-
+	memset(mvi, 0, sizeof(*mvi)+(1L <<
+		mvs_chips[ent->driver_data].slot_width)
+		* sizeof(struct mvs_slot_info));
 	mvi->pdev = pdev;
 	mvi->dev = &pdev->dev;
 	mvi->chip_id = ent->driver_data;
@@ -425,10 +448,10 @@ static int pci_go_64(struct pci_dev *pdev)
 {
 	int rc;
 
-	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
-		rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
+	if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+		rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
 		if (rc) {
-			rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
+			rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
 			if (rc) {
 				dev_printk(KERN_ERR, &pdev->dev,
 					   "64-bit DMA enable failed\n");
@@ -436,13 +459,13 @@ static int pci_go_64(struct pci_dev *pdev)
 			}
 		}
 	} else {
-		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
+		rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
 		if (rc) {
 			dev_printk(KERN_ERR, &pdev->dev,
 				   "32-bit DMA enable failed\n");
 			return rc;
 		}
-		rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
+		rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
 		if (rc) {
 			dev_printk(KERN_ERR, &pdev->dev,
 				   "32-bit consistent DMA enable failed\n");
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c
index 7423fc9..09023d7 100644
--- a/drivers/scsi/mvsas/mv_sas.c
+++ b/drivers/scsi/mvsas/mv_sas.c
@@ -719,9 +719,12 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
 	/* fill in PRD (scatter/gather) table, if any */
 	MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd);
 #ifndef DISABLE_HOTPLUG_DMA_FIX
-	if (task->data_dir == DMA_FROM_DEVICE)
-		MVS_CHIP_DISP->dma_fix(mvi->bulk_buffer_dma,
-				TRASH_BUCKET_SIZE, tei->n_elem, buf_prd);
+	if (task->data_dir == DMA_FROM_DEVICE) {
+		dma_addr_t _dmaAddr = ((phy_mask <= 0x08) ?
+			mvi->bulk_buffer_dma : mvi->bulk_buffer_dma1);
+		MVS_CHIP_DISP->dma_fix(_dmaAddr, TRASH_BUCKET_SIZE,
+			tei->n_elem, buf_prd);
+	}
 #endif
 	return 0;
 }
diff --git a/drivers/scsi/mvsas/mv_sas.h b/drivers/scsi/mvsas/mv_sas.h
index ffddace..b0f43e7 100644
--- a/drivers/scsi/mvsas/mv_sas.h
+++ b/drivers/scsi/mvsas/mv_sas.h
@@ -340,6 +340,8 @@ struct mvs_info {
 #ifndef DISABLE_HOTPLUG_DMA_FIX
 	void *bulk_buffer;
 	dma_addr_t bulk_buffer_dma;
+	void *bulk_buffer1;
+	dma_addr_t bulk_buffer_dma1;
 #define TRASH_BUCKET_SIZE    	0x20000
 #endif
 	struct mvs_slot_info slot_info[0];
-- 
1.6.2.2


             reply	other threads:[~2009-11-09  3:23 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-09 12:19 Andy Yan [this message]
2009-11-14 17:41 ` [PATCH 5/7]MVSAS:Optimization for DMA buffer James Bottomley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091109121952.GD32336@Andy.marvell.com \
    --to=ayan@marvell.com \
    --cc=james.bottomley@hansenpartnership.com \
    --cc=jeff@garzik.org \
    --cc=jfeng@marvell.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=qswang@marvell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.