From: Andi Kleen <andi@firstfloor.org>
To: linux-scsi@vger.kernel.org,
James.Bottomley@HansenPartnership.com, axboe@kernel.dk
Subject: [PATCH] [7/21] SCSI-ISA-DMA: Remove unchecked_isa_dma in gdth
Date: Thu, 2 Oct 2008 09:58:45 +0200 (CEST) [thread overview]
Message-ID: <20081002075845.36E453E6A09@basil.firstfloor.org> (raw)
In-Reply-To: <20081002958.641114646@firstfloor.org>
- Audited ->cmnd use and it always copies
- Allocate hostdata separately with GFP_DMA for the ISA case
- Tell scsi layer to bounce sense_buffer for ISA case
- Tell block layer to bounce for isa case
- Remove unchecked_isa_dma
Untested due to lack of hardware
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Andi Kleen <andi@firstfloor.org>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
drivers/scsi/gdth.c | 81 +++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 62 insertions(+), 19 deletions(-)
Index: linux/drivers/scsi/gdth.c
===================================================================
--- linux.orig/drivers/scsi/gdth.c
+++ linux/drivers/scsi/gdth.c
@@ -139,6 +139,15 @@
#include <scsi/scsi_host.h>
#include "gdth.h"
+
+struct host_ptr {
+ gdth_ha_str *host_ptr;
+ dma_addr_t dma;
+};
+
+#define gdth_shost_priv(host) (((struct host_ptr *)shost_priv(host))->host_ptr)
+#define gdth_shost_dma(host) (((struct host_ptr *)shost_priv(host))->dma)
+
static void gdth_delay(int milliseconds);
static void gdth_eval_mapping(ulong32 size, ulong32 *cyls, int *heads, int *secs);
static irqreturn_t gdth_interrupt(int irq, void *dev_id);
@@ -443,7 +452,7 @@ static void gdth_scsi_done(struct scsi_c
int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,
int timeout, u32 *info)
{
- gdth_ha_str *ha = shost_priv(sdev->host);
+ gdth_ha_str *ha = gdth_shost_priv(sdev->host);
Scsi_Cmnd *scp;
struct gdth_cmndinfo cmndinfo;
DECLARE_COMPLETION_ONSTACK(wait);
@@ -3893,7 +3902,7 @@ static const char *gdth_ctr_name(gdth_ha
static const char *gdth_info(struct Scsi_Host *shp)
{
- gdth_ha_str *ha = shost_priv(shp);
+ gdth_ha_str *ha = gdth_shost_priv(shp);
TRACE2(("gdth_info()\n"));
return ((const char *)ha->binfo.type_string);
@@ -3901,7 +3910,7 @@ static const char *gdth_info(struct Scsi
static int gdth_eh_bus_reset(Scsi_Cmnd *scp)
{
- gdth_ha_str *ha = shost_priv(scp->device->host);
+ gdth_ha_str *ha = gdth_shost_priv(scp->device->host);
int i;
ulong flags;
Scsi_Cmnd *cmnd;
@@ -3954,7 +3963,7 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *
static int gdth_bios_param(struct scsi_device *sdev,struct block_device *bdev,sector_t cap,int *ip)
{
unchar b, t;
- gdth_ha_str *ha = shost_priv(sdev->host);
+ gdth_ha_str *ha = gdth_shost_priv(sdev->host);
struct scsi_device *sd;
unsigned capacity;
@@ -3983,7 +3992,7 @@ static int gdth_bios_param(struct scsi_d
static int gdth_queuecommand(struct scsi_cmnd *scp,
void (*done)(struct scsi_cmnd *))
{
- gdth_ha_str *ha = shost_priv(scp->device->host);
+ gdth_ha_str *ha = gdth_shost_priv(scp->device->host);
struct gdth_cmndinfo *cmndinfo;
TRACE(("gdth_queuecommand() cmd 0x%x\n", scp->cmnd[0]));
@@ -4636,6 +4645,13 @@ static int gdth_slave_configure(struct s
return 0;
}
+static int gdth_adjust_queue(struct scsi_device *device)
+{
+ if (device->host->sense_buffer_isa)
+ blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_ISA);
+ return 0;
+}
+
static struct scsi_host_template gdth_template = {
.name = "GDT SCSI Disk Array Controller",
.info = gdth_info,
@@ -4649,10 +4665,38 @@ static struct scsi_host_template gdth_te
.this_id = -1,
.sg_tablesize = GDTH_MAXSG,
.cmd_per_lun = GDTH_MAXC_P_L,
- .unchecked_isa_dma = 1,
.use_clustering = ENABLE_CLUSTERING,
+ .slave_alloc = gdth_adjust_queue,
};
+static struct Scsi_Host *gdth_host_alloc(struct device *dev)
+{
+ struct Scsi_Host *shost;
+ gdth_ha_str *board;
+ shost = scsi_host_alloc(&gdth_template, sizeof(struct host_ptr));
+ if (!shost)
+ return NULL;
+
+ board = dma_alloc_coherent(dev, sizeof(gdth_ha_str),
+ &gdth_shost_dma(shost), GFP_KERNEL);
+ if (!board) {
+ scsi_host_put(shost);
+ return NULL;
+ }
+
+ gdth_shost_priv(shost) = board;
+
+ return shost;
+}
+
+static void gdth_free_host(struct Scsi_Host *shost)
+{
+ gdth_ha_str *h = gdth_shost_priv(shost);
+ dma_free_coherent(h->pdev ? &h->pdev->dev : NULL, sizeof(gdth_ha_str),
+ h, gdth_shost_dma(shost));
+ scsi_host_put(shost);
+}
+
#ifdef CONFIG_ISA
static int __init gdth_isa_probe_one(ulong32 isa_bios)
{
@@ -4664,10 +4708,10 @@ static int __init gdth_isa_probe_one(ulo
if (!gdth_search_isa(isa_bios))
return -ENXIO;
- shp = scsi_host_alloc(&gdth_template, sizeof(gdth_ha_str));
+ shp = gdth_host_alloc(NULL);
if (!shp)
return -ENOMEM;
- ha = shost_priv(shp);
+ ha = gdth_shost_priv(shp);
error = -ENODEV;
if (!gdth_init_isa(isa_bios,ha))
@@ -4691,7 +4735,7 @@ static int __init gdth_isa_probe_one(ulo
set_dma_mode(ha->drq,DMA_MODE_CASCADE);
enable_dma(ha->drq);
- shp->unchecked_isa_dma = 1;
+ shp->sense_buffer_isa = 1;
shp->irq = ha->irq;
shp->dma_channel = ha->drq;
@@ -4780,7 +4824,7 @@ static int __init gdth_isa_probe_one(ulo
out_free_irq:
free_irq(ha->irq, ha);
out_host_put:
- scsi_host_put(shp);
+ gdth_free_host(shp);
return error;
}
#endif /* CONFIG_ISA */
@@ -4796,10 +4840,11 @@ static int __init gdth_eisa_probe_one(us
if (!gdth_search_eisa(eisa_slot))
return -ENXIO;
- shp = scsi_host_alloc(&gdth_template, sizeof(gdth_ha_str));
+ /* RED-PEN NULL device ISA mask is 24bit, but EISA 32bit */
+ shp = gdth_host_alloc(NULL);
if (!shp)
return -ENOMEM;
- ha = shost_priv(shp);
+ ha = gdth_shost_priv(shp);
error = -ENODEV;
if (!gdth_init_eisa(eisa_slot,ha))
@@ -4815,7 +4860,6 @@ static int __init gdth_eisa_probe_one(us
goto out_host_put;
}
- shp->unchecked_isa_dma = 0;
shp->irq = ha->irq;
shp->dma_channel = 0xff;
@@ -4913,7 +4957,7 @@ static int __init gdth_eisa_probe_one(us
free_irq(ha->irq, ha);
gdth_ctr_count--;
out_host_put:
- scsi_host_put(shp);
+ gdth_free_host(shp);
return error;
}
#endif /* CONFIG_EISA */
@@ -4930,10 +4974,10 @@ static int gdth_pci_probe_one(gdth_pci_s
*ha_out = NULL;
- shp = scsi_host_alloc(&gdth_template, sizeof(gdth_ha_str));
+ shp = gdth_host_alloc(&pcistr->pdev->dev);
if (!shp)
return -ENOMEM;
- ha = shost_priv(shp);
+ ha = gdth_shost_priv(shp);
error = -ENODEV;
if (!gdth_init_pci(pdev, pcistr, ha))
@@ -4952,7 +4996,6 @@ static int gdth_pci_probe_one(gdth_pci_s
goto out_host_put;
}
- shp->unchecked_isa_dma = 0;
shp->irq = ha->irq;
shp->dma_channel = 0xff;
@@ -5059,7 +5102,7 @@ static int gdth_pci_probe_one(gdth_pci_s
free_irq(ha->irq, ha);
gdth_ctr_count--;
out_host_put:
- scsi_host_put(shp);
+ gdth_free_host(shp);
return error;
}
#endif /* CONFIG_PCI */
@@ -5101,7 +5144,7 @@ static void gdth_remove_one(gdth_ha_str
pci_unmap_single(ha->pdev,ha->ccb_phys,
sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL);
- scsi_host_put(shp);
+ gdth_free_host(shp);
}
static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)
next prev parent reply other threads:[~2008-10-02 7:58 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-02 7:58 [PATCH] [0/21] Remove SCSI unchecked_isa_dma try 3 Andi Kleen
2008-10-02 7:58 ` [PATCH] [1/21] SCSI-ISA-DMA: Add the alloc/get_pages_mask calls Andi Kleen
2008-10-02 7:58 ` [PATCH] [2/21] SCSI-ISA-DMA: Add blk_q_mask Andi Kleen
2008-10-02 7:58 ` [PATCH] [3/21] SCSI-ISA-DMA: Pass gfp to scsi_allocate_command Andi Kleen
2008-10-02 7:58 ` [PATCH] [4/21] SCSI-ISA-DMA: Add sense_buffer_isa to host template Andi Kleen
2008-10-02 7:58 ` [PATCH] [5/21] SCSI-ISA-DMA: Remove unchecked_isa in BusLogic Andi Kleen
2008-10-02 7:58 ` [PATCH] [6/21] SCSI-ISA-DMA: Remove unchecked_isa_dma in advansys.c Andi Kleen
2008-10-02 7:58 ` Andi Kleen [this message]
2008-10-02 7:58 ` [PATCH] [8/21] SCSI-ISA-DMA: Remove unchecked_isa_dma in eata.c Andi Kleen
2008-10-02 7:58 ` [PATCH] [9/21] SCSI-ISA-DMA: Remove unchecked_isa_dma in aha1542 Andi Kleen
2008-10-02 7:58 ` [PATCH] [10/21] SCSI-ISA-DMA: Remove unchecked_isa_dma in aha152x/wd7000/sym53c416/u14-34f/NCR53c406a Andi Kleen
2008-10-02 7:58 ` [PATCH] [11/21] SCSI-ISA-DMA: Remove GFP_DMA uses in st/osst Andi Kleen
2008-10-02 7:58 ` [PATCH] [12/21] SCSI-ISA-DMA: Remove unchecked_isa_dma support for hostdata Andi Kleen
2008-10-02 7:58 ` [PATCH] [13/21] SCSI-ISA-DMA: Use blk_q_mask/get_pages_mask in sg driver Andi Kleen
2008-10-02 7:58 ` [PATCH] [14/21] SCSI-ISA-DMA: Rely on block layer bouncing for ISA DMA devices scanning Andi Kleen
2008-10-02 7:58 ` [PATCH] [15/21] SCSI-ISA-DMA: Don't disable direct_io for unchecked_isa_dma in st.c Andi Kleen
2008-10-02 7:58 ` [PATCH] [16/21] SCSI-ISA-DMA: Remove automatic block layer bouncing for unchecked_isa_dma Andi Kleen
2008-10-02 7:58 ` [PATCH] [17/21] SCSI-ISA-DMA: Remove GFP_DMA use in sr.c Andi Kleen
2008-10-02 7:58 ` [PATCH] [18/21] SCSI-ISA-DMA: Remove unchecked_isa_dma from sysfs Andi Kleen
2008-10-02 7:58 ` [PATCH] [19/21] SCSI-ISA-DMA: Switch to a single SCSI command pool Andi Kleen
2008-10-02 7:58 ` [PATCH] [20/21] SCSI-ISA-DMA: Finally kill unchecked_isa_dma Andi Kleen
2008-10-02 7:58 ` [PATCH] [21/21] SCSI-ISA-DMA: Convert DMA buffers in ch.c to allocate via the block layer Andi Kleen
2008-10-07 23:53 ` [PATCH] [0/21] Remove SCSI unchecked_isa_dma try 3 Andi Kleen
2008-10-08 10:21 ` Jens Axboe
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=20081002075845.36E453E6A09@basil.firstfloor.org \
--to=andi@firstfloor.org \
--cc=James.Bottomley@HansenPartnership.com \
--cc=axboe@kernel.dk \
--cc=linux-scsi@vger.kernel.org \
/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.