* [ADVANSYS] Add basic highmem/DMA support
@ 2004-05-08 0:39 Herbert Xu
2004-05-19 10:38 ` Herbert Xu
0 siblings, 1 reply; 11+ messages in thread
From: Herbert Xu @ 2004-05-08 0:39 UTC (permalink / raw)
To: James Bottomley, SCSI Mailing List, support
[-- Attachment #1: Type: text/plain, Size: 312 bytes --]
Hi:
This patch adds basic support for highmem on i386 to the advansys driver.
Cheers,
--
Debian GNU/Linux 3.0 is out! ( http://www.debian.org/ )
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
[-- Attachment #2: p --]
[-- Type: text/plain, Size: 8944 bytes --]
Index: drivers/scsi/advansys.c
===================================================================
RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/drivers/scsi/advansys.c,v
retrieving revision 1.9
diff -u -r1.9 advansys.c
--- a/drivers/scsi/advansys.c 19 Feb 2004 09:55:53 -0000 1.9
+++ b/drivers/scsi/advansys.c 7 May 2004 22:30:16 -0000
@@ -801,6 +801,7 @@
#include <linux/blkdev.h>
#include <linux/stat.h>
#include <linux/spinlock.h>
+#include <linux/dma-mapping.h>
#include <asm/io.h>
#include <asm/system.h>
@@ -4214,7 +4215,7 @@
STATIC int asc_execute_scsi_cmnd(Scsi_Cmnd *);
STATIC int asc_build_req(asc_board_t *, Scsi_Cmnd *);
STATIC int adv_build_req(asc_board_t *, Scsi_Cmnd *, ADV_SCSI_REQ_Q **);
-STATIC int adv_get_sglist(asc_board_t *, adv_req_t *, Scsi_Cmnd *);
+STATIC int adv_get_sglist(asc_board_t *, adv_req_t *, Scsi_Cmnd *, int);
STATIC void asc_isr_callback(ASC_DVC_VAR *, ASC_QDONE_INFO *);
STATIC void adv_isr_callback(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
STATIC void adv_async_callback(ADV_DVC_VAR *, uchar);
@@ -6381,9 +6382,30 @@
ASC_DBG(2, "asc_scsi_done_list: begin\n");
while (scp != NULL) {
+ asc_board_t *boardp;
+ struct pci_dev *pci_dev;
+ int dir;
+
ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong) scp);
tscp = REQPNEXT(scp);
scp->host_scribble = NULL;
+
+ boardp = ASC_BOARDP(scp->device->host);
+
+ if (ASC_NARROW_BOARD(boardp))
+ pci_dev = boardp->dvc_cfg.asc_dvc_cfg.pci_dev;
+ else
+ pci_dev = boardp->dvc_cfg.adv_dvc_cfg.pci_dev;
+
+ dir = scsi_to_pci_dma_dir(scp->sc_data_direction);
+
+ if (scp->use_sg)
+ pci_unmap_sg(pci_dev, (struct scatterlist *)scp->request_buffer,
+ scp->use_sg, dir);
+ else if (scp->request_bufflen)
+ pci_unmap_single(pci_dev, scp->SCp.dma_handle,
+ scp->request_bufflen, dir);
+
ASC_STATS(scp->device->host, done);
ASC_ASSERT(scp->scsi_done != NULL);
if (from_isr)
@@ -6619,6 +6641,9 @@
STATIC int
asc_build_req(asc_board_t *boardp, Scsi_Cmnd *scp)
{
+ struct pci_dev *pci_dev = boardp->dvc_cfg.asc_dvc_cfg.pci_dev;
+ int dir = scsi_to_pci_dma_dir(scp->sc_data_direction);
+
/*
* Mutually exclusive access is required to 'asc_scsi_q' and
* 'asc_sg_head' until after the request is started.
@@ -6679,8 +6704,10 @@
* CDB request of single contiguous buffer.
*/
ASC_STATS(scp->device->host, cont_cnt);
- asc_scsi_q.q1.data_addr =
- cpu_to_le32(virt_to_bus(scp->request_buffer));
+ scp->SCp.dma_handle = scp->request_bufflen ?
+ pci_map_single(pci_dev, scp->request_buffer,
+ scp->request_bufflen, dir) : 0;
+ asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle);
asc_scsi_q.q1.data_cnt = cpu_to_le32(scp->request_bufflen);
ASC_STATS_ADD(scp->device->host, cont_xfer,
ASC_CEILING(scp->request_bufflen, 512));
@@ -6691,12 +6718,17 @@
* CDB scatter-gather request list.
*/
int sgcnt;
+ int use_sg;
struct scatterlist *slp;
- if (scp->use_sg > scp->device->host->sg_tablesize) {
+ slp = (struct scatterlist *)scp->request_buffer;
+ use_sg = pci_map_sg(pci_dev, slp, scp->use_sg, dir);
+
+ if (use_sg > scp->device->host->sg_tablesize) {
ASC_PRINT3(
"asc_build_req: board %d: use_sg %d > sg_tablesize %d\n",
- boardp->id, scp->use_sg, scp->device->host->sg_tablesize);
+ boardp->id, use_sg, scp->device->host->sg_tablesize);
+ pci_unmap_sg(pci_dev, slp, scp->use_sg, dir);
scp->result = HOST_BYTE(DID_ERROR);
asc_enqueue(&boardp->done, scp, ASC_BACK);
return ASC_ERROR;
@@ -6715,19 +6747,16 @@
asc_scsi_q.q1.data_cnt = 0;
asc_scsi_q.q1.data_addr = 0;
/* This is a byte value, otherwise it would need to be swapped. */
- asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = scp->use_sg;
+ asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = use_sg;
ASC_STATS_ADD(scp->device->host, sg_elem, asc_sg_head.entry_cnt);
/*
* Convert scatter-gather list into ASC_SG_HEAD list.
*/
- slp = (struct scatterlist *) scp->request_buffer;
- for (sgcnt = 0; sgcnt < scp->use_sg; sgcnt++, slp++) {
- asc_sg_head.sg_list[sgcnt].addr =
- cpu_to_le32(virt_to_bus(
- (unsigned char *)page_address(slp->page) + slp->offset));
- asc_sg_head.sg_list[sgcnt].bytes = cpu_to_le32(slp->length);
- ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(slp->length, 512));
+ for (sgcnt = 0; sgcnt < use_sg; sgcnt++, slp++) {
+ asc_sg_head.sg_list[sgcnt].addr = cpu_to_le32(sg_dma_address(slp));
+ asc_sg_head.sg_list[sgcnt].bytes = cpu_to_le32(sg_dma_len(slp));
+ ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(sg_dma_len(slp), 512));
}
}
@@ -6755,6 +6784,8 @@
ADV_SCSI_REQ_Q *scsiqp;
int i;
int ret;
+ struct pci_dev *pci_dev = boardp->dvc_cfg.adv_dvc_cfg.pci_dev;
+ int dir = scsi_to_pci_dma_dir(scp->sc_data_direction);
/*
* Allocate an adv_req_t structure from the board to execute
@@ -6827,15 +6858,23 @@
* Build ADV_SCSI_REQ_Q for a contiguous buffer or a scatter-gather
* buffer command.
*/
- scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
- scsiqp->vdata_addr = scp->request_buffer;
- scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
if (scp->use_sg == 0) {
/*
* CDB request of single contiguous buffer.
*/
reqp->sgblkp = NULL;
+ scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
+ if (scp->request_bufflen) {
+ scsiqp->vdata_addr = scp->request_buffer;
+ scp->SCp.dma_handle =
+ pci_map_single(pci_dev, scp->request_buffer,
+ scp->request_bufflen, dir);
+ } else {
+ scsiqp->vdata_addr = 0;
+ scp->SCp.dma_handle = 0;
+ }
+ scsiqp->data_addr = cpu_to_le32(scp->SCp.dma_handle);
scsiqp->sg_list_ptr = NULL;
scsiqp->sg_real_addr = 0;
ASC_STATS(scp->device->host, cont_cnt);
@@ -6845,10 +6884,21 @@
/*
* CDB scatter-gather request list.
*/
- if (scp->use_sg > ADV_MAX_SG_LIST) {
+ struct scatterlist *slp;
+ int use_sg;
+
+ scsiqp->data_cnt = 0;
+ scsiqp->vdata_addr = 0;
+ scsiqp->data_addr = 0;
+
+ slp = (struct scatterlist *)scp->request_buffer;
+ use_sg = pci_map_sg(pci_dev, slp, scp->use_sg, dir);
+
+ if (use_sg > ADV_MAX_SG_LIST) {
ASC_PRINT3(
"adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %d\n",
- boardp->id, scp->use_sg, scp->device->host->sg_tablesize);
+ boardp->id, use_sg, scp->device->host->sg_tablesize);
+ pci_unmap_sg(pci_dev, slp, scp->use_sg, dir);
scp->result = HOST_BYTE(DID_ERROR);
asc_enqueue(&boardp->done, scp, ASC_BACK);
@@ -6862,7 +6912,7 @@
return ASC_ERROR;
}
- if ((ret = adv_get_sglist(boardp, reqp, scp)) != ADV_SUCCESS) {
+ if ((ret = adv_get_sglist(boardp, reqp, scp, use_sg)) != ADV_SUCCESS) {
/*
* Free the adv_req_t structure by adding it back to the
* board free list.
@@ -6874,7 +6924,7 @@
}
ASC_STATS(scp->device->host, sg_cnt);
- ASC_STATS_ADD(scp->device->host, sg_elem, scp->use_sg);
+ ASC_STATS_ADD(scp->device->host, sg_elem, use_sg);
}
ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
@@ -6898,7 +6948,7 @@
* ADV_ERROR(-1) - SG List creation failed
*/
STATIC int
-adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, Scsi_Cmnd *scp)
+adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, Scsi_Cmnd *scp, int use_sg)
{
adv_sgblk_t *sgblkp;
ADV_SCSI_REQ_Q *scsiqp;
@@ -6910,7 +6960,7 @@
scsiqp = (ADV_SCSI_REQ_Q *) ADV_32BALIGN(&reqp->scsi_req_q);
slp = (struct scatterlist *) scp->request_buffer;
- sg_elem_cnt = scp->use_sg;
+ sg_elem_cnt = use_sg;
prev_sg_block = NULL;
reqp->sgblkp = NULL;
@@ -6982,11 +7032,9 @@
for (i = 0; i < NO_OF_SG_PER_BLOCK; i++)
{
- sg_block->sg_list[i].sg_addr =
- cpu_to_le32(virt_to_bus(
- (unsigned char *)page_address(slp->page) + slp->offset));
- sg_block->sg_list[i].sg_count = cpu_to_le32(slp->length);
- ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(slp->length, 512));
+ sg_block->sg_list[i].sg_addr = cpu_to_le32(sg_dma_address(slp));
+ sg_block->sg_list[i].sg_count = cpu_to_le32(sg_dma_len(slp));
+ ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(sg_dma_len(slp), 512));
if (--sg_elem_cnt == 0)
{ /* Last ADV_SG_BLOCK and scatter-gather entry. */
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-05-08 0:39 [ADVANSYS] Add basic highmem/DMA support Herbert Xu
@ 2004-05-19 10:38 ` Herbert Xu
2004-05-31 18:02 ` James Bottomley
0 siblings, 1 reply; 11+ messages in thread
From: Herbert Xu @ 2004-05-19 10:38 UTC (permalink / raw)
To: James Bottomley, SCSI Mailing List, Andrew Morton
[-- Attachment #1: Type: text/plain, Size: 488 bytes --]
Hi:
This is a resend of my patch that adds basic support for highmem
on i386 to the advansys driver. It has been tested in
http://bugs.debian.org/245238.
The maintainer email address listed in the MAINTAINERS file bounced
so someone else will need to look at this.
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
[-- Attachment #2: p --]
[-- Type: text/plain, Size: 8944 bytes --]
Index: drivers/scsi/advansys.c
===================================================================
RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/drivers/scsi/advansys.c,v
retrieving revision 1.9
diff -u -r1.9 advansys.c
--- a/drivers/scsi/advansys.c 19 Feb 2004 09:55:53 -0000 1.9
+++ b/drivers/scsi/advansys.c 7 May 2004 22:30:16 -0000
@@ -801,6 +801,7 @@
#include <linux/blkdev.h>
#include <linux/stat.h>
#include <linux/spinlock.h>
+#include <linux/dma-mapping.h>
#include <asm/io.h>
#include <asm/system.h>
@@ -4214,7 +4215,7 @@
STATIC int asc_execute_scsi_cmnd(Scsi_Cmnd *);
STATIC int asc_build_req(asc_board_t *, Scsi_Cmnd *);
STATIC int adv_build_req(asc_board_t *, Scsi_Cmnd *, ADV_SCSI_REQ_Q **);
-STATIC int adv_get_sglist(asc_board_t *, adv_req_t *, Scsi_Cmnd *);
+STATIC int adv_get_sglist(asc_board_t *, adv_req_t *, Scsi_Cmnd *, int);
STATIC void asc_isr_callback(ASC_DVC_VAR *, ASC_QDONE_INFO *);
STATIC void adv_isr_callback(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
STATIC void adv_async_callback(ADV_DVC_VAR *, uchar);
@@ -6381,9 +6382,30 @@
ASC_DBG(2, "asc_scsi_done_list: begin\n");
while (scp != NULL) {
+ asc_board_t *boardp;
+ struct pci_dev *pci_dev;
+ int dir;
+
ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong) scp);
tscp = REQPNEXT(scp);
scp->host_scribble = NULL;
+
+ boardp = ASC_BOARDP(scp->device->host);
+
+ if (ASC_NARROW_BOARD(boardp))
+ pci_dev = boardp->dvc_cfg.asc_dvc_cfg.pci_dev;
+ else
+ pci_dev = boardp->dvc_cfg.adv_dvc_cfg.pci_dev;
+
+ dir = scsi_to_pci_dma_dir(scp->sc_data_direction);
+
+ if (scp->use_sg)
+ pci_unmap_sg(pci_dev, (struct scatterlist *)scp->request_buffer,
+ scp->use_sg, dir);
+ else if (scp->request_bufflen)
+ pci_unmap_single(pci_dev, scp->SCp.dma_handle,
+ scp->request_bufflen, dir);
+
ASC_STATS(scp->device->host, done);
ASC_ASSERT(scp->scsi_done != NULL);
if (from_isr)
@@ -6619,6 +6641,9 @@
STATIC int
asc_build_req(asc_board_t *boardp, Scsi_Cmnd *scp)
{
+ struct pci_dev *pci_dev = boardp->dvc_cfg.asc_dvc_cfg.pci_dev;
+ int dir = scsi_to_pci_dma_dir(scp->sc_data_direction);
+
/*
* Mutually exclusive access is required to 'asc_scsi_q' and
* 'asc_sg_head' until after the request is started.
@@ -6679,8 +6704,10 @@
* CDB request of single contiguous buffer.
*/
ASC_STATS(scp->device->host, cont_cnt);
- asc_scsi_q.q1.data_addr =
- cpu_to_le32(virt_to_bus(scp->request_buffer));
+ scp->SCp.dma_handle = scp->request_bufflen ?
+ pci_map_single(pci_dev, scp->request_buffer,
+ scp->request_bufflen, dir) : 0;
+ asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle);
asc_scsi_q.q1.data_cnt = cpu_to_le32(scp->request_bufflen);
ASC_STATS_ADD(scp->device->host, cont_xfer,
ASC_CEILING(scp->request_bufflen, 512));
@@ -6691,12 +6718,17 @@
* CDB scatter-gather request list.
*/
int sgcnt;
+ int use_sg;
struct scatterlist *slp;
- if (scp->use_sg > scp->device->host->sg_tablesize) {
+ slp = (struct scatterlist *)scp->request_buffer;
+ use_sg = pci_map_sg(pci_dev, slp, scp->use_sg, dir);
+
+ if (use_sg > scp->device->host->sg_tablesize) {
ASC_PRINT3(
"asc_build_req: board %d: use_sg %d > sg_tablesize %d\n",
- boardp->id, scp->use_sg, scp->device->host->sg_tablesize);
+ boardp->id, use_sg, scp->device->host->sg_tablesize);
+ pci_unmap_sg(pci_dev, slp, scp->use_sg, dir);
scp->result = HOST_BYTE(DID_ERROR);
asc_enqueue(&boardp->done, scp, ASC_BACK);
return ASC_ERROR;
@@ -6715,19 +6747,16 @@
asc_scsi_q.q1.data_cnt = 0;
asc_scsi_q.q1.data_addr = 0;
/* This is a byte value, otherwise it would need to be swapped. */
- asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = scp->use_sg;
+ asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = use_sg;
ASC_STATS_ADD(scp->device->host, sg_elem, asc_sg_head.entry_cnt);
/*
* Convert scatter-gather list into ASC_SG_HEAD list.
*/
- slp = (struct scatterlist *) scp->request_buffer;
- for (sgcnt = 0; sgcnt < scp->use_sg; sgcnt++, slp++) {
- asc_sg_head.sg_list[sgcnt].addr =
- cpu_to_le32(virt_to_bus(
- (unsigned char *)page_address(slp->page) + slp->offset));
- asc_sg_head.sg_list[sgcnt].bytes = cpu_to_le32(slp->length);
- ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(slp->length, 512));
+ for (sgcnt = 0; sgcnt < use_sg; sgcnt++, slp++) {
+ asc_sg_head.sg_list[sgcnt].addr = cpu_to_le32(sg_dma_address(slp));
+ asc_sg_head.sg_list[sgcnt].bytes = cpu_to_le32(sg_dma_len(slp));
+ ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(sg_dma_len(slp), 512));
}
}
@@ -6755,6 +6784,8 @@
ADV_SCSI_REQ_Q *scsiqp;
int i;
int ret;
+ struct pci_dev *pci_dev = boardp->dvc_cfg.adv_dvc_cfg.pci_dev;
+ int dir = scsi_to_pci_dma_dir(scp->sc_data_direction);
/*
* Allocate an adv_req_t structure from the board to execute
@@ -6827,15 +6858,23 @@
* Build ADV_SCSI_REQ_Q for a contiguous buffer or a scatter-gather
* buffer command.
*/
- scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
- scsiqp->vdata_addr = scp->request_buffer;
- scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
if (scp->use_sg == 0) {
/*
* CDB request of single contiguous buffer.
*/
reqp->sgblkp = NULL;
+ scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
+ if (scp->request_bufflen) {
+ scsiqp->vdata_addr = scp->request_buffer;
+ scp->SCp.dma_handle =
+ pci_map_single(pci_dev, scp->request_buffer,
+ scp->request_bufflen, dir);
+ } else {
+ scsiqp->vdata_addr = 0;
+ scp->SCp.dma_handle = 0;
+ }
+ scsiqp->data_addr = cpu_to_le32(scp->SCp.dma_handle);
scsiqp->sg_list_ptr = NULL;
scsiqp->sg_real_addr = 0;
ASC_STATS(scp->device->host, cont_cnt);
@@ -6845,10 +6884,21 @@
/*
* CDB scatter-gather request list.
*/
- if (scp->use_sg > ADV_MAX_SG_LIST) {
+ struct scatterlist *slp;
+ int use_sg;
+
+ scsiqp->data_cnt = 0;
+ scsiqp->vdata_addr = 0;
+ scsiqp->data_addr = 0;
+
+ slp = (struct scatterlist *)scp->request_buffer;
+ use_sg = pci_map_sg(pci_dev, slp, scp->use_sg, dir);
+
+ if (use_sg > ADV_MAX_SG_LIST) {
ASC_PRINT3(
"adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %d\n",
- boardp->id, scp->use_sg, scp->device->host->sg_tablesize);
+ boardp->id, use_sg, scp->device->host->sg_tablesize);
+ pci_unmap_sg(pci_dev, slp, scp->use_sg, dir);
scp->result = HOST_BYTE(DID_ERROR);
asc_enqueue(&boardp->done, scp, ASC_BACK);
@@ -6862,7 +6912,7 @@
return ASC_ERROR;
}
- if ((ret = adv_get_sglist(boardp, reqp, scp)) != ADV_SUCCESS) {
+ if ((ret = adv_get_sglist(boardp, reqp, scp, use_sg)) != ADV_SUCCESS) {
/*
* Free the adv_req_t structure by adding it back to the
* board free list.
@@ -6874,7 +6924,7 @@
}
ASC_STATS(scp->device->host, sg_cnt);
- ASC_STATS_ADD(scp->device->host, sg_elem, scp->use_sg);
+ ASC_STATS_ADD(scp->device->host, sg_elem, use_sg);
}
ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
@@ -6898,7 +6948,7 @@
* ADV_ERROR(-1) - SG List creation failed
*/
STATIC int
-adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, Scsi_Cmnd *scp)
+adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, Scsi_Cmnd *scp, int use_sg)
{
adv_sgblk_t *sgblkp;
ADV_SCSI_REQ_Q *scsiqp;
@@ -6910,7 +6960,7 @@
scsiqp = (ADV_SCSI_REQ_Q *) ADV_32BALIGN(&reqp->scsi_req_q);
slp = (struct scatterlist *) scp->request_buffer;
- sg_elem_cnt = scp->use_sg;
+ sg_elem_cnt = use_sg;
prev_sg_block = NULL;
reqp->sgblkp = NULL;
@@ -6982,11 +7032,9 @@
for (i = 0; i < NO_OF_SG_PER_BLOCK; i++)
{
- sg_block->sg_list[i].sg_addr =
- cpu_to_le32(virt_to_bus(
- (unsigned char *)page_address(slp->page) + slp->offset));
- sg_block->sg_list[i].sg_count = cpu_to_le32(slp->length);
- ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(slp->length, 512));
+ sg_block->sg_list[i].sg_addr = cpu_to_le32(sg_dma_address(slp));
+ sg_block->sg_list[i].sg_count = cpu_to_le32(sg_dma_len(slp));
+ ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(sg_dma_len(slp), 512));
if (--sg_elem_cnt == 0)
{ /* Last ADV_SG_BLOCK and scatter-gather entry. */
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-05-19 10:38 ` Herbert Xu
@ 2004-05-31 18:02 ` James Bottomley
2004-06-21 8:41 ` Douglas Gilbert
0 siblings, 1 reply; 11+ messages in thread
From: James Bottomley @ 2004-05-31 18:02 UTC (permalink / raw)
To: Herbert Xu, Gene Heskett; +Cc: SCSI Mailing List, Andrew Morton
On Wed, 2004-05-19 at 05:38, Herbert Xu wrote:
> Hi:
>
> This is a resend of my patch that adds basic support for highmem
> on i386 to the advansys driver. It has been tested in
> http://bugs.debian.org/245238.
>
> The maintainer email address listed in the MAINTAINERS file bounced
> so someone else will need to look at this.
I converted your patch to use the DMA-API. This will be necessary to
use the EISA advansys boards---Of course, EISA won't work properly until
the entire driver is converted to the driverfs probing API, sigh, but
I'll get around to that eventually.
OK, and I couldn't resist getting rid of the stupid in_isr locking on
the done function.
Could someone who actually has one of these things please test? Thanks,
James
===== drivers/scsi/advansys.c 1.38 vs edited =====
--- 1.38/drivers/scsi/advansys.c 2004-02-03 23:29:29 -06:00
+++ edited/drivers/scsi/advansys.c 2004-05-31 12:14:32 -05:00
@@ -801,6 +801,7 @@
#include <linux/blkdev.h>
#include <linux/stat.h>
#include <linux/spinlock.h>
+#include <linux/dma-mapping.h>
#include <asm/io.h>
#include <asm/system.h>
@@ -1576,7 +1577,7 @@
uchar sdtr_period_offset[ASC_MAX_TID + 1];
ushort pci_slot_info;
uchar adapter_info[6];
- struct pci_dev *pci_dev;
+ struct device *dev;
} ASC_DVC_CFG;
#define ASC_DEF_DVC_CNTL 0xFFFF
@@ -3082,7 +3083,7 @@
ushort serial1; /* EEPROM serial number word 1 */
ushort serial2; /* EEPROM serial number word 2 */
ushort serial3; /* EEPROM serial number word 3 */
- struct pci_dev *pci_dev; /* pointer to the pci dev structure for this board */
+ struct device *dev; /* pointer to the pci dev structure for this board */
} ADV_DVC_CFG;
struct adv_dvc_var;
@@ -4210,11 +4211,11 @@
STATIC irqreturn_t advansys_interrupt(int, void *, struct pt_regs *);
STATIC int advansys_slave_configure(Scsi_Device *);
-STATIC void asc_scsi_done_list(Scsi_Cmnd *, int from_isr);
+STATIC void asc_scsi_done_list(Scsi_Cmnd *);
STATIC int asc_execute_scsi_cmnd(Scsi_Cmnd *);
STATIC int asc_build_req(asc_board_t *, Scsi_Cmnd *);
STATIC int adv_build_req(asc_board_t *, Scsi_Cmnd *, ADV_SCSI_REQ_Q **);
-STATIC int adv_get_sglist(asc_board_t *, adv_req_t *, Scsi_Cmnd *);
+STATIC int adv_get_sglist(asc_board_t *, adv_req_t *, Scsi_Cmnd *, int);
STATIC void asc_isr_callback(ASC_DVC_VAR *, ASC_QDONE_INFO *);
STATIC void adv_isr_callback(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
STATIC void adv_async_callback(ADV_DVC_VAR *, uchar);
@@ -4526,6 +4527,7 @@
struct pci_dev *pci_devicep[ASC_NUM_BOARD_SUPPORTED];
int pci_card_cnt_max = 0;
int pci_card_cnt = 0;
+ struct device *dev = NULL;
struct pci_dev *pci_devp = NULL;
int pci_device_id_cnt = 0;
unsigned int pci_device_id[ASC_PCI_DEVICE_ID_CNT] = {
@@ -4735,6 +4737,9 @@
ASC_DBG2(2, "advansys_detect: iop %X, irqLine %d\n",
iop, pci_devp->irq);
}
+ if(pci_devp)
+ dev = &pci_devp->dev;
+
#endif /* CONFIG_PCI */
break;
@@ -4765,7 +4770,7 @@
continue;
}
- scsi_set_device(shp, &pci_devp->dev);
+ scsi_set_device(shp, dev);
/* Save a pointer to the Scsi_Host of each board found. */
asc_host[asc_board_count++] = shp;
@@ -4904,7 +4909,8 @@
#endif /* CONFIG_PROC_FS */
if (ASC_NARROW_BOARD(boardp)) {
- /*
+ asc_dvc_varp->cfg->dev = dev;
+ /*
* Set the board bus type and PCI IRQ before
* calling AscInitGetConfig().
*/
@@ -4926,7 +4932,6 @@
#ifdef CONFIG_PCI
case ASC_IS_PCI:
shp->irq = asc_dvc_varp->irq_no = pci_devp->irq;
- asc_dvc_varp->cfg->pci_dev = pci_devp;
asc_dvc_varp->cfg->pci_slot_info =
ASC_PCI_MKID(pci_devp->bus->number,
PCI_SLOT(pci_devp->devfn),
@@ -4944,13 +4949,13 @@
break;
}
} else {
+ adv_dvc_varp->cfg->dev = dev;
/*
* For Wide boards set PCI information before calling
* AdvInitGetConfig().
*/
#ifdef CONFIG_PCI
shp->irq = adv_dvc_varp->irq_no = pci_devp->irq;
- adv_dvc_varp->cfg->pci_dev = pci_devp;
adv_dvc_varp->cfg->pci_slot_info =
ASC_PCI_MKID(pci_devp->bus->number,
PCI_SLOT(pci_devp->devfn),
@@ -5880,7 +5885,7 @@
default:
done_scp = asc_dequeue_list(&boardp->done, NULL, ASC_TID_ALL);
/* Interrupts could be enabled here. */
- asc_scsi_done_list(done_scp, 0);
+ asc_scsi_done_list(done_scp);
break;
}
spin_unlock_irqrestore(&boardp->lock, flags);
@@ -6063,7 +6068,7 @@
* Complete all the 'done_scp' requests.
*/
if (done_scp != NULL) {
- asc_scsi_done_list(done_scp, 0);
+ asc_scsi_done_list(done_scp);
}
ASC_DBG1(1, "advansys_reset: ret %d\n", ret);
@@ -6328,7 +6333,7 @@
* Complete all requests on the done list.
*/
- asc_scsi_done_list(done_scp, 1);
+ asc_scsi_done_list(done_scp);
ASC_DBG(1, "advansys_interrupt: end\n");
return IRQ_HANDLED;
@@ -6374,23 +6379,38 @@
* Interrupts can be enabled on entry.
*/
STATIC void
-asc_scsi_done_list(Scsi_Cmnd *scp, int from_isr)
+asc_scsi_done_list(Scsi_Cmnd *scp)
{
Scsi_Cmnd *tscp;
- ulong flags = 0;
ASC_DBG(2, "asc_scsi_done_list: begin\n");
while (scp != NULL) {
+ asc_board_t *boardp;
+ struct device *dev;
+
ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong) scp);
tscp = REQPNEXT(scp);
scp->host_scribble = NULL;
+
+ boardp = ASC_BOARDP(scp->device->host);
+
+ if (ASC_NARROW_BOARD(boardp))
+ dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
+ else
+ dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
+
+ if (scp->use_sg)
+ dma_unmap_sg(dev, (struct scatterlist *)scp->request_buffer,
+ scp->use_sg, scp->sc_data_direction);
+ else if (scp->request_bufflen)
+ dma_unmap_single(dev, scp->SCp.dma_handle,
+ scp->request_bufflen, scp->sc_data_direction);
+
ASC_STATS(scp->device->host, done);
ASC_ASSERT(scp->scsi_done != NULL);
- if (from_isr)
- spin_lock_irqsave(scp->device->host->host_lock, flags);
+
scp->scsi_done(scp);
- if (from_isr)
- spin_unlock_irqrestore(scp->device->host->host_lock, flags);
+
scp = tscp;
}
ASC_DBG(2, "asc_scsi_done_list: done\n");
@@ -6619,6 +6639,8 @@
STATIC int
asc_build_req(asc_board_t *boardp, Scsi_Cmnd *scp)
{
+ struct device *dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
+
/*
* Mutually exclusive access is required to 'asc_scsi_q' and
* 'asc_sg_head' until after the request is started.
@@ -6679,8 +6701,10 @@
* CDB request of single contiguous buffer.
*/
ASC_STATS(scp->device->host, cont_cnt);
- asc_scsi_q.q1.data_addr =
- cpu_to_le32(virt_to_bus(scp->request_buffer));
+ scp->SCp.dma_handle = scp->request_bufflen ?
+ dma_map_single(dev, scp->request_buffer,
+ scp->request_bufflen, scp->sc_data_direction) : 0;
+ asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle);
asc_scsi_q.q1.data_cnt = cpu_to_le32(scp->request_bufflen);
ASC_STATS_ADD(scp->device->host, cont_xfer,
ASC_CEILING(scp->request_bufflen, 512));
@@ -6691,12 +6715,17 @@
* CDB scatter-gather request list.
*/
int sgcnt;
+ int use_sg;
struct scatterlist *slp;
- if (scp->use_sg > scp->device->host->sg_tablesize) {
+ slp = (struct scatterlist *)scp->request_buffer;
+ use_sg = dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
+
+ if (use_sg > scp->device->host->sg_tablesize) {
ASC_PRINT3(
"asc_build_req: board %d: use_sg %d > sg_tablesize %d\n",
- boardp->id, scp->use_sg, scp->device->host->sg_tablesize);
+ boardp->id, use_sg, scp->device->host->sg_tablesize);
+ dma_unmap_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
scp->result = HOST_BYTE(DID_ERROR);
asc_enqueue(&boardp->done, scp, ASC_BACK);
return ASC_ERROR;
@@ -6715,19 +6744,16 @@
asc_scsi_q.q1.data_cnt = 0;
asc_scsi_q.q1.data_addr = 0;
/* This is a byte value, otherwise it would need to be swapped. */
- asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = scp->use_sg;
+ asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = use_sg;
ASC_STATS_ADD(scp->device->host, sg_elem, asc_sg_head.entry_cnt);
/*
* Convert scatter-gather list into ASC_SG_HEAD list.
*/
- slp = (struct scatterlist *) scp->request_buffer;
- for (sgcnt = 0; sgcnt < scp->use_sg; sgcnt++, slp++) {
- asc_sg_head.sg_list[sgcnt].addr =
- cpu_to_le32(virt_to_bus(
- (unsigned char *)page_address(slp->page) + slp->offset));
- asc_sg_head.sg_list[sgcnt].bytes = cpu_to_le32(slp->length);
- ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(slp->length, 512));
+ for (sgcnt = 0; sgcnt < use_sg; sgcnt++, slp++) {
+ asc_sg_head.sg_list[sgcnt].addr = cpu_to_le32(sg_dma_address(slp));
+ asc_sg_head.sg_list[sgcnt].bytes = cpu_to_le32(sg_dma_len(slp));
+ ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(sg_dma_len(slp), 512));
}
}
@@ -6755,6 +6781,7 @@
ADV_SCSI_REQ_Q *scsiqp;
int i;
int ret;
+ struct device *dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
/*
* Allocate an adv_req_t structure from the board to execute
@@ -6827,15 +6854,23 @@
* Build ADV_SCSI_REQ_Q for a contiguous buffer or a scatter-gather
* buffer command.
*/
- scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
- scsiqp->vdata_addr = scp->request_buffer;
- scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
if (scp->use_sg == 0) {
/*
* CDB request of single contiguous buffer.
*/
reqp->sgblkp = NULL;
+ scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
+ if (scp->request_bufflen) {
+ scsiqp->vdata_addr = scp->request_buffer;
+ scp->SCp.dma_handle =
+ dma_map_single(dev, scp->request_buffer,
+ scp->request_bufflen, scp->sc_data_direction);
+ } else {
+ scsiqp->vdata_addr = 0;
+ scp->SCp.dma_handle = 0;
+ }
+ scsiqp->data_addr = cpu_to_le32(scp->SCp.dma_handle);
scsiqp->sg_list_ptr = NULL;
scsiqp->sg_real_addr = 0;
ASC_STATS(scp->device->host, cont_cnt);
@@ -6845,10 +6880,21 @@
/*
* CDB scatter-gather request list.
*/
- if (scp->use_sg > ADV_MAX_SG_LIST) {
+ struct scatterlist *slp;
+ int use_sg;
+
+ scsiqp->data_cnt = 0;
+ scsiqp->vdata_addr = 0;
+ scsiqp->data_addr = 0;
+
+ slp = (struct scatterlist *)scp->request_buffer;
+ use_sg = dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
+
+ if (use_sg > ADV_MAX_SG_LIST) {
ASC_PRINT3(
"adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %d\n",
- boardp->id, scp->use_sg, scp->device->host->sg_tablesize);
+ boardp->id, use_sg, scp->device->host->sg_tablesize);
+ dma_unmap_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
scp->result = HOST_BYTE(DID_ERROR);
asc_enqueue(&boardp->done, scp, ASC_BACK);
@@ -6862,7 +6908,7 @@
return ASC_ERROR;
}
- if ((ret = adv_get_sglist(boardp, reqp, scp)) != ADV_SUCCESS) {
+ if ((ret = adv_get_sglist(boardp, reqp, scp, use_sg)) != ADV_SUCCESS) {
/*
* Free the adv_req_t structure by adding it back to the
* board free list.
@@ -6874,7 +6920,7 @@
}
ASC_STATS(scp->device->host, sg_cnt);
- ASC_STATS_ADD(scp->device->host, sg_elem, scp->use_sg);
+ ASC_STATS_ADD(scp->device->host, sg_elem, use_sg);
}
ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
@@ -6898,7 +6944,7 @@
* ADV_ERROR(-1) - SG List creation failed
*/
STATIC int
-adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, Scsi_Cmnd *scp)
+adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, Scsi_Cmnd *scp, int use_sg)
{
adv_sgblk_t *sgblkp;
ADV_SCSI_REQ_Q *scsiqp;
@@ -6910,7 +6956,7 @@
scsiqp = (ADV_SCSI_REQ_Q *) ADV_32BALIGN(&reqp->scsi_req_q);
slp = (struct scatterlist *) scp->request_buffer;
- sg_elem_cnt = scp->use_sg;
+ sg_elem_cnt = use_sg;
prev_sg_block = NULL;
reqp->sgblkp = NULL;
@@ -6982,11 +7028,9 @@
for (i = 0; i < NO_OF_SG_PER_BLOCK; i++)
{
- sg_block->sg_list[i].sg_addr =
- cpu_to_le32(virt_to_bus(
- (unsigned char *)page_address(slp->page) + slp->offset));
- sg_block->sg_list[i].sg_count = cpu_to_le32(slp->length);
- ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(slp->length, 512));
+ sg_block->sg_list[i].sg_addr = cpu_to_le32(sg_dma_address(slp));
+ sg_block->sg_list[i].sg_count = cpu_to_le32(sg_dma_len(slp));
+ ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(sg_dma_len(slp), 512));
if (--sg_elem_cnt == 0)
{ /* Last ADV_SG_BLOCK and scatter-gather entry. */
@@ -9011,7 +9055,7 @@
{
#ifdef CONFIG_PCI
uchar byte_data;
- pci_read_config_byte(asc_dvc->cfg->pci_dev, offset, &byte_data);
+ pci_read_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, &byte_data);
return byte_data;
#else /* !defined(CONFIG_PCI) */
return 0;
@@ -9030,7 +9074,7 @@
)
{
#ifdef CONFIG_PCI
- pci_write_config_byte(asc_dvc->cfg->pci_dev, offset, byte_data);
+ pci_write_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, byte_data);
#endif /* CONFIG_PCI */
}
@@ -9128,7 +9172,7 @@
{
#ifdef CONFIG_PCI
uchar byte_data;
- pci_read_config_byte(asc_dvc->cfg->pci_dev, offset, &byte_data);
+ pci_read_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, &byte_data);
return byte_data;
#else /* CONFIG_PCI */
return 0;
@@ -9147,7 +9191,7 @@
)
{
#ifdef CONFIG_PCI
- pci_write_config_byte(asc_dvc->cfg->pci_dev, offset, byte_data);
+ pci_write_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, byte_data);
#else /* CONFIG_PCI */
return 0;
#endif /* CONFIG_PCI */
@@ -9507,7 +9551,8 @@
printk(
" pci_device_id %d, lib_serial_no %u, lib_version %u, mcode_date 0x%x,\n",
- h->pci_dev->device, h->lib_serial_no, h->lib_version, h->mcode_date);
+ to_pci_dev(h->dev)->device, h->lib_serial_no, h->lib_version,
+ h->mcode_date);
printk(
" mcode_version %d, overrun_buf 0x%lx\n",
@@ -9632,7 +9677,7 @@
printk(
" mcode_version 0x%x, pci_device_id 0x%x, lib_version %u\n",
- h->mcode_version, h->pci_dev->device, h->lib_version);
+ h->mcode_version, to_pci_dev(h->dev)->device, h->lib_version);
printk(
" control_flag 0x%x, pci_slot_info 0x%x\n",
@@ -12301,7 +12346,7 @@
ushort pci_device_id;
iop_base = asc_dvc->iop_base;
- pci_device_id = asc_dvc->cfg->pci_dev->device;
+ pci_device_id = to_pci_dev(asc_dvc->cfg->dev)->device;
warn_code = 0;
cfg_msw = AscGetChipCfgMsw(iop_base);
if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-05-31 18:02 ` James Bottomley
@ 2004-06-21 8:41 ` Douglas Gilbert
2004-06-21 14:28 ` James Bottomley
0 siblings, 1 reply; 11+ messages in thread
From: Douglas Gilbert @ 2004-06-21 8:41 UTC (permalink / raw)
To: James Bottomley
Cc: Herbert Xu, Gene Heskett, SCSI Mailing List, Andrew Morton
James Bottomley wrote:
> On Wed, 2004-05-19 at 05:38, Herbert Xu wrote:
>
>>Hi:
>>
>>This is a resend of my patch that adds basic support for highmem
>>on i386 to the advansys driver. It has been tested in
>>http://bugs.debian.org/245238.
>>
>>The maintainer email address listed in the MAINTAINERS file bounced
>>so someone else will need to look at this.
>
>
> I converted your patch to use the DMA-API. This will be necessary to
> use the EISA advansys boards---Of course, EISA won't work properly until
> the entire driver is converted to the driverfs probing API, sigh, but
> I'll get around to that eventually.
>
> OK, and I couldn't resist getting rid of the stupid in_isr locking on
> the done function.
>
> Could someone who actually has one of these things please test? Thanks,
James,
I just tested it in lk 2.6.7-bk2 and the advansys driver is
broken. The disk access light stays on for several seconds
while it tries to read the partition table after which it
announces "unknown partition table". Since my rootfs is on
that disk it's all downhill from there.
HBA is a ASB3940U2VV (PCI) and it worked ok in lk 2.6.6 .
I haven't tried lk 2.6.7 (release yet).
Also when I put an ISA Advansys HBA in the box (with the PCI
advansys HBA) it causes an oops during bootup in
AscInitGetConfig+0x75/0x1d0
which is called from advansys_detect().
I think this ISA HBA has been causing this oops each
time I have tried it in the lk 2.6 series (not just
with lk 2.6.7-bk2).
Doug Gilbert
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-06-21 8:41 ` Douglas Gilbert
@ 2004-06-21 14:28 ` James Bottomley
2004-06-22 0:35 ` Douglas Gilbert
2004-06-23 6:35 ` Douglas Gilbert
0 siblings, 2 replies; 11+ messages in thread
From: James Bottomley @ 2004-06-21 14:28 UTC (permalink / raw)
To: Douglas Gilbert
Cc: Herbert Xu, Gene Heskett, SCSI Mailing List, Andrew Morton
On Mon, 2004-06-21 at 03:41, Douglas Gilbert wrote:
> I just tested it in lk 2.6.7-bk2 and the advansys driver is
> broken. The disk access light stays on for several seconds
> while it tries to read the partition table after which it
> announces "unknown partition table". Since my rootfs is on
> that disk it's all downhill from there.
To be sure: the inquiry goes through and produces the correct result,
and the read capacity, but then the read partition table fails?
If so, I think that sounds like a failure in the use_sg != 0 path.
James
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-06-21 14:28 ` James Bottomley
@ 2004-06-22 0:35 ` Douglas Gilbert
2004-06-23 6:35 ` Douglas Gilbert
1 sibling, 0 replies; 11+ messages in thread
From: Douglas Gilbert @ 2004-06-22 0:35 UTC (permalink / raw)
To: James Bottomley
Cc: Herbert Xu, Gene Heskett, SCSI Mailing List, Andrew Morton
James Bottomley wrote:
> On Mon, 2004-06-21 at 03:41, Douglas Gilbert wrote:
>
>>I just tested it in lk 2.6.7-bk2 and the advansys driver is
>>broken. The disk access light stays on for several seconds
>>while it tries to read the partition table after which it
>>announces "unknown partition table". Since my rootfs is on
>>that disk it's all downhill from there.
>
>
> To be sure: the inquiry goes through and produces the correct result,
> and the read capacity, but then the read partition table fails?
Precisely.
> If so, I think that sounds like a failure in the use_sg != 0 path.
Yes. Grub is installed on the MBR of the SCSI disk in
question so it loads ok. The Advansys 2uw HBA works
ok in lk 2.6.7 but not lk 2.6.7-bk2 . I checked the
disk on another system (with a aic7xxx based controller)
and the disk does have a partition table and works ok.
Doug Gilbert
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-06-21 14:28 ` James Bottomley
2004-06-22 0:35 ` Douglas Gilbert
@ 2004-06-23 6:35 ` Douglas Gilbert
2004-06-23 14:13 ` Christoph Hellwig
1 sibling, 1 reply; 11+ messages in thread
From: Douglas Gilbert @ 2004-06-23 6:35 UTC (permalink / raw)
To: James Bottomley; +Cc: Herbert Xu, Gene Heskett, SCSI Mailing List
[-- Attachment #1: Type: text/plain, Size: 1603 bytes --]
James Bottomley wrote:
> On Mon, 2004-06-21 at 03:41, Douglas Gilbert wrote:
>
>>I just tested it in lk 2.6.7-bk2 and the advansys driver is
>>broken. The disk access light stays on for several seconds
>>while it tries to read the partition table after which it
>>announces "unknown partition table". Since my rootfs is on
>>that disk it's all downhill from there.
>
>
> To be sure: the inquiry goes through and produces the correct result,
> and the read capacity, but then the read partition table fails?
>
> If so, I think that sounds like a failure in the use_sg != 0 path.
Here are some more datapoints. There are at least 3 categories
of adapters handled by the advansys driver:
- ISA: broken in lk 2.6 series
- PCI narrow (8 bit SCSI bus e.g. ABP-940U): working in 2.6.7-bk2
- PCI wide (16 bit SCSI bus, e.g. ASB-3940U2W): broken in 2.6.7-bk2
but was working in lk 2.6.7
By playing around with the U2W adapter I found that it does
work when use_sg==0 but the returned data becomes incorrect
30 bytes into the transfer when use_sg==2. It is almost as if
the scatter gather DMA kicks off ok then stalls taking
several seconds to complete (with no timeout).
This was tested with:
sg_dd if=/dev/sg1 of=t bs=512 count=63
sg_dd if=/dev/sg1 of=tt bs=512 count=65
Since the sg driver bypasses scatter gather when the transfer
is <= 32 KB then the first sg_dd works and the second one
fails as described above.
Any suggestions for further testing?
Attached is a small patch to bump the version number
and fix the compile error when ADVANSYS_DEBUG is
defined.
Doug Gilbert
[-- Attachment #2: advansys_267bk2deb --]
[-- Type: text/plain, Size: 739 bytes --]
--- linux/drivers/scsi/advansys.c 2004-06-22 16:56:10.000000000 +1000
+++ linux/drivers/scsi/advansys.c267bk2deb 2004-06-23 16:28:45.599854928 +1000
@@ -1,4 +1,4 @@
-#define ASC_VERSION "3.3GJ" /* AdvanSys Driver Version */
+#define ASC_VERSION "3.3K" /* AdvanSys Driver Version */
/*
* advansys.c - Linux Host Driver for AdvanSys SCSI Adapters
@@ -9198,9 +9198,7 @@
" timeout_per_command %d, timeout_total %d, timeout %d\n",
s->timeout_per_command, s->timeout_total, s->timeout);
- printk(
-" internal_timeout %u, flags %u\n",
- s->internal_timeout, s->flags);
+ printk(" internal_timeout %u\n", s->internal_timeout);
printk(
" scsi_done 0x%lx, done 0x%lx, host_scribble 0x%lx, result 0x%x\n",
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-06-23 6:35 ` Douglas Gilbert
@ 2004-06-23 14:13 ` Christoph Hellwig
2004-06-23 15:51 ` James Bottomley
0 siblings, 1 reply; 11+ messages in thread
From: Christoph Hellwig @ 2004-06-23 14:13 UTC (permalink / raw)
To: Douglas Gilbert
Cc: James Bottomley, Herbert Xu, Gene Heskett, SCSI Mailing List
There were actually two patches to advansys in that timeframe. Although
it's much more likely that the dma api patch is the culprit can you test
with the compat code cleanup patch below reversed?:
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2004/06/04 09:13:16-05:00 hch@lst.de
# [PATCH] kill dead compat code in advansys
#
# I actually wanted to fix up the check_region usage there but got lost
# in the mess. Let's start by kicking out the 2.2 compat and using scsi
# layer constants instead of their own redefinitions first.
#
# Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
#
# drivers/scsi/advansys.c
# 2004/06/04 06:19:50-05:00 hch@lst.de +119 -508
# kill dead compat code in advansys
#
diff -Nru a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
--- a/drivers/scsi/advansys.c 2004-06-23 07:12:13 -07:00
+++ b/drivers/scsi/advansys.c 2004-06-23 07:12:13 -07:00
@@ -756,27 +756,6 @@
*/
-
-/*
- * --- Linux Version
- */
-
-#ifndef LINUX_VERSION_CODE
-#include <linux/version.h>
-#endif /* LINUX_VERSION_CODE */
-
-/* Convert Linux Version, Patch-level, Sub-level to LINUX_VERSION_CODE. */
-#define ASC_LINUX_VERSION(V, P, S) (((V) * 65536) + ((P) * 256) + (S))
-#define ASC_LINUX_KERNEL22 (LINUX_VERSION_CODE < ASC_LINUX_VERSION(2,4,0))
-#define ASC_LINUX_KERNEL24 (LINUX_VERSION_CODE >= ASC_LINUX_VERSION(2,4,0))
-
-/* Driver supported only in version 2.2 and version >= 2.4. */
-#if LINUX_VERSION_CODE < ASC_LINUX_VERSION(2,2,0) || \
- (LINUX_VERSION_CODE > ASC_LINUX_VERSION(2,3,0) && \
- LINUX_VERSION_CODE < ASC_LINUX_VERSION(2,4,0))
-#error "AdvanSys driver supported only in 2.2 and 2.4 or greater kernels."
-#endif
-
/*
* --- Linux Include Files
*/
@@ -875,9 +854,6 @@
typedef unsigned char uchar;
-#ifndef NULL
-#define NULL (0)
-#endif
#ifndef TRUE
#define TRUE (1)
#endif
@@ -987,49 +963,6 @@
#define ASC_MIN_SENSE_LEN 14
#define ASC_MAX_CDB_LEN 12
#define ASC_SCSI_RESET_HOLD_TIME_US 60
-#define SCSICMD_TestUnitReady 0x00
-#define SCSICMD_Rewind 0x01
-#define SCSICMD_Rezero 0x01
-#define SCSICMD_RequestSense 0x03
-#define SCSICMD_Format 0x04
-#define SCSICMD_FormatUnit 0x04
-#define SCSICMD_Read6 0x08
-#define SCSICMD_Write6 0x0A
-#define SCSICMD_Seek6 0x0B
-#define SCSICMD_Inquiry 0x12
-#define SCSICMD_Verify6 0x13
-#define SCSICMD_ModeSelect6 0x15
-#define SCSICMD_ModeSense6 0x1A
-#define SCSICMD_StartStopUnit 0x1B
-#define SCSICMD_LoadUnloadTape 0x1B
-#define SCSICMD_ReadCapacity 0x25
-#define SCSICMD_Read10 0x28
-#define SCSICMD_Write10 0x2A
-#define SCSICMD_Seek10 0x2B
-#define SCSICMD_Erase10 0x2C
-#define SCSICMD_WriteAndVerify10 0x2E
-#define SCSICMD_Verify10 0x2F
-#define SCSICMD_WriteBuffer 0x3B
-#define SCSICMD_ReadBuffer 0x3C
-#define SCSICMD_ReadLong 0x3E
-#define SCSICMD_WriteLong 0x3F
-#define SCSICMD_ReadTOC 0x43
-#define SCSICMD_ReadHeader 0x44
-#define SCSICMD_ModeSelect10 0x55
-#define SCSICMD_ModeSense10 0x5A
-
-/* Inquiry Data Peripheral Device Types */
-#define SCSI_TYPE_DASD 0x00
-#define SCSI_TYPE_SASD 0x01
-#define SCSI_TYPE_PRN 0x02
-#define SCSI_TYPE_PROC 0x03
-#define SCSI_TYPE_WORM 0x04
-#define SCSI_TYPE_CDROM 0x05
-#define SCSI_TYPE_SCANNER 0x06
-#define SCSI_TYPE_OPTMEM 0x07
-#define SCSI_TYPE_MED_CHG 0x08
-#define SCSI_TYPE_COMM 0x09
-#define SCSI_TYPE_UNKNOWN 0x1F
#define ADV_INQ_CLOCKING_ST_ONLY 0x0
#define ADV_INQ_CLOCKING_DT_ONLY 0x1
@@ -1048,36 +981,11 @@
#define ASC_SCSIDIR_T2H 0x08
#define ASC_SCSIDIR_H2T 0x10
#define ASC_SCSIDIR_NODATA 0x18
-#define SCSI_SENKEY_NO_SENSE 0x00
-#define SCSI_SENKEY_UNDEFINED 0x01
-#define SCSI_SENKEY_NOT_READY 0x02
-#define SCSI_SENKEY_MEDIUM_ERR 0x03
-#define SCSI_SENKEY_HW_ERR 0x04
-#define SCSI_SENKEY_ILLEGAL 0x05
-#define SCSI_SENKEY_ATTENTION 0x06
-#define SCSI_SENKEY_PROTECTED 0x07
-#define SCSI_SENKEY_BLANK 0x08
-#define SCSI_SENKEY_V_UNIQUE 0x09
-#define SCSI_SENKEY_CPY_ABORT 0x0A
-#define SCSI_SENKEY_ABORT 0x0B
-#define SCSI_SENKEY_EQUAL 0x0C
-#define SCSI_SENKEY_VOL_OVERFLOW 0x0D
-#define SCSI_SENKEY_MISCOMP 0x0E
-#define SCSI_SENKEY_RESERVED 0x0F
#define SCSI_ASC_NOMEDIA 0x3A
#define ASC_SRB_HOST(x) ((uchar)((uchar)(x) >> 4))
#define ASC_SRB_TID(x) ((uchar)((uchar)(x) & (uchar)0x0F))
#define ASC_SRB_LUN(x) ((uchar)((uint)(x) >> 13))
#define PUT_CDB1(x) ((uchar)((uint)(x) >> 8))
-#define SS_GOOD 0x00
-#define SS_CHK_CONDITION 0x02
-#define SS_CONDITION_MET 0x04
-#define SS_TARGET_BUSY 0x08
-#define SS_INTERMID 0x10
-#define SS_INTERMID_COND_MET 0x14
-#define SS_RSERV_CONFLICT 0x18
-#define SS_CMD_TERMINATED 0x22
-#define SS_QUEUE_FULL 0x28
#define MS_CMD_DONE 0x00
#define MS_EXTEND 0x01
#define MS_SDTR_LEN 0x03
@@ -1086,26 +994,6 @@
#define MS_WDTR_CODE 0x03
#define MS_MDP_LEN 0x05
#define MS_MDP_CODE 0x00
-#define M1_SAVE_DATA_PTR 0x02
-#define M1_RESTORE_PTRS 0x03
-#define M1_DISCONNECT 0x04
-#define M1_INIT_DETECTED_ERR 0x05
-#define M1_ABORT 0x06
-#define M1_MSG_REJECT 0x07
-#define M1_NO_OP 0x08
-#define M1_MSG_PARITY_ERR 0x09
-#define M1_LINK_CMD_DONE 0x0A
-#define M1_LINK_CMD_DONE_WFLAG 0x0B
-#define M1_BUS_DVC_RESET 0x0C
-#define M1_ABORT_TAG 0x0D
-#define M1_CLR_QUEUE 0x0E
-#define M1_INIT_RECOVERY 0x0F
-#define M1_RELEASE_RECOVERY 0x10
-#define M1_KILL_IO_PROC 0x11
-#define M2_QTAG_MSG_SIMPLE 0x20
-#define M2_QTAG_MSG_HEAD 0x21
-#define M2_QTAG_MSG_ORDERED 0x22
-#define M2_IGNORE_WIDE_RESIDUE 0x23
/*
* Inquiry data structure and bitfield macros
@@ -3582,19 +3470,6 @@
#define NO_ISA_DMA 0xff /* No ISA DMA Channel Used */
-/*
- * If the Linux kernel version supports freeing initialization code
- * and data after loading, define macros for this purpose. These macros
- * are not used when the driver is built as a module, cf. linux/init.h.
- */
-#if ASC_LINUX_KERNEL24
-#define ASC_INITFUNC(type, func) type __init func
-#elif ASC_LINUX_KERNEL22
-#define ASC_INITFUNC(type, func) __initfunc(type func)
-#endif
-#define ASC_INITDATA __initdata
-#define ASC_INIT __init
-
#define ASC_INFO_SIZE 128 /* advansys_info() line size */
#ifdef CONFIG_PROC_FS
@@ -3611,8 +3486,6 @@
} \
cp += len; \
}
-
-#define ASC_MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif /* CONFIG_PROC_FS */
/* Asc Library return codes */
@@ -3686,53 +3559,6 @@
/* Return non-zero, if the queue is empty. */
#define ASC_QUEUE_EMPTY(ascq) ((ascq)->q_tidmask == 0)
-/* PCI configuration declarations */
-
-#define PCI_BASE_CLASS_PREDEFINED 0x00
-#define PCI_BASE_CLASS_MASS_STORAGE 0x01
-#define PCI_BASE_CLASS_NETWORK 0x02
-#define PCI_BASE_CLASS_DISPLAY 0x03
-#define PCI_BASE_CLASS_MULTIMEDIA 0x04
-#define PCI_BASE_CLASS_MEMORY_CONTROLLER 0x05
-#define PCI_BASE_CLASS_BRIDGE_DEVICE 0x06
-
-/* MASS STORAGE */
-#define PCI_SUB_CLASS_SCSI_CONTROLLER 0x00
-#define PCI_SUB_CLASS_IDE_CONTROLLER 0x01
-#define PCI_SUB_CLASS_FLOPPY_DISK_CONTROLLER 0x02
-#define PCI_SUB_CLASS_IPI_BUS_CONTROLLER 0x03
-#define PCI_SUB_CLASS_OTHER_MASS_CONTROLLER 0x80
-
-/* NETWORK CONTROLLER */
-#define PCI_SUB_CLASS_ETHERNET_CONTROLLER 0x00
-#define PCI_SUB_CLASS_TOKEN_RING_CONTROLLER 0x01
-#define PCI_SUB_CLASS_FDDI_CONTROLLER 0x02
-#define PCI_SUB_CLASS_OTHER_NETWORK_CONTROLLER 0x80
-
-/* DISPLAY CONTROLLER */
-#define PCI_SUB_CLASS_VGA_CONTROLLER 0x00
-#define PCI_SUB_CLASS_XGA_CONTROLLER 0x01
-#define PCI_SUB_CLASS_OTHER_DISPLAY_CONTROLLER 0x80
-
-/* MULTIMEDIA CONTROLLER */
-#define PCI_SUB_CLASS_VIDEO_DEVICE 0x00
-#define PCI_SUB_CLASS_AUDIO_DEVICE 0x01
-#define PCI_SUB_CLASS_OTHER_MULTIMEDIA_DEVICE 0x80
-
-/* MEMORY CONTROLLER */
-#define PCI_SUB_CLASS_RAM_CONTROLLER 0x00
-#define PCI_SUB_CLASS_FLASH_CONTROLLER 0x01
-#define PCI_SUB_CLASS_OTHER_MEMORY_CONTROLLER 0x80
-
-/* BRIDGE CONTROLLER */
-#define PCI_SUB_CLASS_HOST_BRIDGE_CONTROLLER 0x00
-#define PCI_SUB_CLASS_ISA_BRIDGE_CONTROLLER 0x01
-#define PCI_SUB_CLASS_EISA_BRIDGE_CONTROLLER 0x02
-#define PCI_SUB_CLASS_MC_BRIDGE_CONTROLLER 0x03
-#define PCI_SUB_CLASS_PCI_TO_PCI_BRIDGE_CONTROLLER 0x04
-#define PCI_SUB_CLASS_PCMCIA_BRIDGE_CONTROLLER 0x05
-#define PCI_SUB_CLASS_OTHER_BRIDGE_CONTROLLER 0x80
-
#define PCI_MAX_SLOT 0x1F
#define PCI_MAX_BUS 0xFF
#define PCI_IOADDRESS_MASK 0xFFFE
@@ -3745,25 +3571,6 @@
#define ASC_PCI_DEVICE_ID_2500 0x2500 /* ASC-38C0800 */
#define ASC_PCI_DEVICE_ID_2700 0x2700 /* ASC-38C1600 */
-/* PCI IO Port Addresses to generate special cycle */
-
-#define PCI_CONFIG_ADDRESS_MECH1 0x0CF8
-#define PCI_CONFIG_DATA_MECH1 0x0CFC
-
-#define PCI_CONFIG_FORWARD_REGISTER 0x0CFA /* 0=type 0; 1=type 1; */
-
-#define PCI_CONFIG_BUS_NUMBER_MASK 0x00FF0000
-#define PCI_CONFIG_DEVICE_FUNCTION_MASK 0x0000FF00
-#define PCI_CONFIG_REGISTER_NUMBER_MASK 0x000000F8
-
-#define PCI_DEVICE_FOUND 0x0000
-#define PCI_DEVICE_NOT_FOUND 0xffff
-
-#define SUBCLASS_OFFSET 0x0A
-#define CLASSCODE_OFFSET 0x0B
-#define VENDORID_OFFSET 0x00
-#define DEVICEID_OFFSET 0x02
-
#ifndef ADVANSYS_STATS
#define ASC_STATS(shp, counter)
#define ASC_STATS_ADD(shp, counter, count)
@@ -4146,19 +3953,6 @@
/* Note: All driver global data should be initialized. */
-#if ASC_LINUX_KERNEL22
-#ifdef CONFIG_PROC_FS
-struct proc_dir_entry proc_scsi_advansys =
-{
- PROC_SCSI_ADVANSYS, /* unsigned short low_ino */
- 8, /* unsigned short namelen */
- "advansys", /* const char *name */
- S_IFDIR | S_IRUGO | S_IXUGO, /* mode_t mode */
- 2 /* nlink_t nlink */
-};
-#endif /* CONFIG_PROC_FS */
-#endif /* ASC_LINUX_KERNEL22 */
-
/* Number of boards detected in system. */
STATIC int asc_board_count = 0;
STATIC struct Scsi_Host *asc_host[ASC_NUM_BOARD_SUPPORTED] = { 0 };
@@ -4173,7 +3967,7 @@
STATIC ASC_SG_HEAD asc_sg_head = { 0 };
/* List of supported bus types. */
-STATIC ushort asc_bus[ASC_NUM_BUS] ASC_INITDATA = {
+STATIC ushort asc_bus[ASC_NUM_BUS] __initdata = {
ASC_IS_ISA,
ASC_IS_VL,
ASC_IS_EISA,
@@ -4506,10 +4300,8 @@
* it must not call SCSI mid-level functions including scsi_malloc()
* and scsi_free().
*/
-ASC_INITFUNC(
-int,
+int __init
advansys_detect(Scsi_Host_Template *tpnt)
-)
{
static int detect_called = ASC_FALSE;
int iop;
@@ -4552,12 +4344,6 @@
ASC_DBG(1, "advansys_detect: begin\n");
-#if ASC_LINUX_KERNEL24
- tpnt->proc_name = "advansys";
-#elif ASC_LINUX_KERNEL22
- tpnt->proc_dir = &proc_scsi_advansys;
-#endif
-
asc_board_count = 0;
/*
@@ -4683,13 +4469,9 @@
NULL) {
pci_device_id_cnt++;
} else {
-#if ASC_LINUX_KERNEL24
if (pci_enable_device(pci_devp) == 0) {
pci_devicep[pci_card_cnt_max++] = pci_devp;
}
-#elif ASC_LINUX_KERNEL22
- pci_devicep[pci_card_cnt_max++] = pci_devp;
-#endif
}
}
@@ -4726,11 +4508,7 @@
ASC_DBG2(2,
"advansys_detect: devfn %d, bus number %d\n",
pci_devp->devfn, pci_devp->bus->number);
-#if ASC_LINUX_KERNEL24
iop = pci_resource_start(pci_devp, 0);
-#elif ASC_LINUX_KERNEL22
- iop = pci_devp->base_address[0] & PCI_IOADDRESS_MASK;
-#endif
ASC_DBG2(1,
"advansys_detect: vendorID %X, deviceID %X\n",
pci_devp->vendor, pci_devp->device);
@@ -4854,11 +4632,7 @@
iolen = ADV_38C1600_IOLEN;
}
#ifdef CONFIG_PCI
-#if ASC_LINUX_KERNEL24
pci_memory_address = pci_resource_start(pci_devp, 1);
-#elif ASC_LINUX_KERNEL22
- pci_memory_address = pci_devp->base_address[1];
-#endif
ASC_DBG1(1, "advansys_detect: pci_memory_address: 0x%lx\n",
(ulong) pci_memory_address);
if ((boardp->ioremap_addr =
@@ -5326,11 +5100,7 @@
/* BIOS start address. */
if (ASC_NARROW_BOARD(boardp)) {
-#if ASC_LINUX_KERNEL24
shp->base =
-#elif ASC_LINUX_KERNEL22
- shp->base = (char *)
-#endif
((ulong) AscGetChipBiosAddress(
asc_dvc_varp->iop_base,
asc_dvc_varp->bus_type));
@@ -5365,11 +5135,7 @@
* Convert x86 realmode code segment to a linear
* address by shifting left 4.
*/
- shp->base =
-#if ASC_LINUX_KERNEL22
- (char *)
-#endif
- ((ulong) boardp->bios_codeseg << 4);
+ shp->base = ((ulong) boardp->bios_codeseg << 4);
} else {
shp->base = 0;
}
@@ -5390,7 +5156,6 @@
ASC_DBG2(2,
"advansys_detect: request_region port 0x%lx, len 0x%x\n",
(ulong) shp->io_port, boardp->asc_n_io_port);
-#if ASC_LINUX_KERNEL24
if (request_region(shp->io_port, boardp->asc_n_io_port,
"advansys") == NULL) {
ASC_PRINT3(
@@ -5403,9 +5168,6 @@
asc_board_count--;
continue;
}
-#elif ASC_LINUX_KERNEL22
- request_region(shp->io_port, boardp->asc_n_io_port, "advansys");
-#endif
/* Register DMA Channel for Narrow boards. */
shp->dma_channel = NO_ISA_DMA; /* Default to no ISA DMA. */
@@ -6154,10 +5916,8 @@
* ints[2] - second argument
* ...
*/
-ASC_INITFUNC(
-void,
+void __init
advansys_setup(char *str, int *ints)
-)
{
int i;
@@ -6687,9 +6447,9 @@
*/
if ((boardp->dvc_var.asc_dvc_var.cur_dvc_qng[scp->device->id] > 0) &&
(boardp->reqcnt[scp->device->id] % 255) == 0) {
- asc_scsi_q.q2.tag_code = M2_QTAG_MSG_ORDERED;
+ asc_scsi_q.q2.tag_code = MSG_ORDERED_TAG;
} else {
- asc_scsi_q.q2.tag_code = M2_QTAG_MSG_SIMPLE;
+ asc_scsi_q.q2.tag_code = MSG_SIMPLE_TAG;
}
/*
@@ -7123,14 +6883,13 @@
* If an INQUIRY command completed successfully, then call
* the AscInquiryHandling() function to set-up the device.
*/
- if (scp->cmnd[0] == SCSICMD_Inquiry && scp->device->lun == 0 &&
+ if (scp->cmnd[0] == INQUIRY && scp->device->lun == 0 &&
(scp->request_bufflen - qdonep->remain_bytes) >= 8)
{
AscInquiryHandling(asc_dvc_varp, scp->device->id & 0x7,
(ASC_SCSI_INQUIRY *) scp->request_buffer);
}
-#if ASC_LINUX_KERNEL24
/*
* Check for an underrun condition.
*
@@ -7143,15 +6902,14 @@
(unsigned) qdonep->remain_bytes);
scp->resid = qdonep->remain_bytes;
}
-#endif
break;
case QD_WITH_ERROR:
ASC_DBG(2, "asc_isr_callback: QD_WITH_ERROR\n");
switch (qdonep->d3.host_stat) {
case QHSTA_NO_ERROR:
- if (qdonep->d3.scsi_stat == SS_CHK_CONDITION) {
- ASC_DBG(2, "asc_isr_callback: SS_CHK_CONDITION\n");
+ if (qdonep->d3.scsi_stat == SAM_STAT_CHECK_CONDITION) {
+ ASC_DBG(2, "asc_isr_callback: SAM_STAT_CHECK_CONDITION\n");
ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
sizeof(scp->sense_buffer));
/*
@@ -7229,9 +6987,7 @@
Scsi_Cmnd *scp;
struct Scsi_Host *shp;
int i;
-#if ASC_LINUX_KERNEL24
ADV_DCNT resid_cnt;
-#endif
ASC_DBG2(1, "adv_isr_callback: adv_dvc_varp 0x%lx, scsiqp 0x%lx\n",
@@ -7314,7 +7070,6 @@
ASC_DBG(2, "adv_isr_callback: QD_NO_ERROR\n");
scp->result = 0;
-#if ASC_LINUX_KERNEL24
/*
* Check for an underrun condition.
*
@@ -7328,15 +7083,14 @@
(ulong) resid_cnt);
scp->resid = resid_cnt;
}
-#endif
break;
case QD_WITH_ERROR:
ASC_DBG(2, "adv_isr_callback: QD_WITH_ERROR\n");
switch (scsiqp->host_status) {
case QHSTA_NO_ERROR:
- if (scsiqp->scsi_status == SS_CHK_CONDITION) {
- ASC_DBG(2, "adv_isr_callback: SS_CHK_CONDITION\n");
+ if (scsiqp->scsi_status == SAM_STAT_CHECK_CONDITION) {
+ ASC_DBG(2, "adv_isr_callback: SAM_STAT_CHECK_CONDITION\n");
ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
sizeof(scp->sense_buffer));
/*
@@ -8902,7 +8656,7 @@
(unsigned) offset, (unsigned) advoffset, cplen);
if (offset <= advoffset) {
/* Read offset below current offset, copy everything. */
- cnt = ASC_MIN(cplen, leftlen);
+ cnt = min(cplen, leftlen);
ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %d\n",
(ulong) curbuf, (ulong) cp, cnt);
memcpy(curbuf, cp, cnt);
@@ -8910,7 +8664,7 @@
/* Read offset within current range, partial copy. */
cnt = (advoffset + cplen) - offset;
cp = (cp + cplen) - cnt;
- cnt = ASC_MIN(cnt, leftlen);
+ cnt = min(cnt, leftlen);
ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %d\n",
(ulong) curbuf, (ulong) cp, cnt);
memcpy(curbuf, cp, cnt);
@@ -8943,7 +8697,7 @@
(void) printk(s);
ret = 0;
} else {
- ret = ASC_MIN(buflen, ret);
+ ret = min(buflen, ret);
memcpy(buf, s, ret);
}
va_end(args);
@@ -9046,12 +8800,10 @@
/*
* Read a PCI configuration byte.
*/
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
DvcReadPCIConfigByte(
ASC_DVC_VAR *asc_dvc,
ushort offset)
-)
{
#ifdef CONFIG_PCI
uchar byte_data;
@@ -9065,13 +8817,11 @@
/*
* Write a PCI configuration byte.
*/
-ASC_INITFUNC(
-STATIC void,
+STATIC void __init
DvcWritePCIConfigByte(
ASC_DVC_VAR *asc_dvc,
ushort offset,
uchar byte_data)
-)
{
#ifdef CONFIG_PCI
pci_write_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, byte_data);
@@ -9082,13 +8832,10 @@
* Return the BIOS address of the adapter at the specified
* I/O port and with the specified bus type.
*/
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscGetChipBiosAddress(
PortAddr iop_base,
- ushort bus_type
-)
-)
+ ushort bus_type)
{
ushort cfg_lsw;
ushort bios_addr;
@@ -9163,12 +8910,10 @@
/*
* Read a PCI configuration byte.
*/
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
DvcAdvReadPCIConfigByte(
ADV_DVC_VAR *asc_dvc,
ushort offset)
-)
{
#ifdef CONFIG_PCI
uchar byte_data;
@@ -9182,13 +8927,11 @@
/*
* Write a PCI configuration byte.
*/
-ASC_INITFUNC(
-STATIC void,
+STATIC void __init
DvcAdvWritePCIConfigByte(
ADV_DVC_VAR *asc_dvc,
ushort offset,
uchar byte_data)
-)
{
#ifdef CONFIG_PCI
pci_write_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, byte_data);
@@ -9402,16 +9145,6 @@
s->host_busy, s->host_no,
(unsigned) s->last_reset);
-#if ASC_LINUX_KERNEL24
- printk(
-" hostt 0x%lx\n",
- (ulong) s->hostt);
-#elif ASC_LINUX_KERNEL22
- printk(
-" host_queue 0x%lx, hostt 0x%lx, block 0x%lx,\n",
- (ulong) s->host_queue, (ulong) s->hostt, (ulong) s->block);
-#endif
-
printk(
" base 0x%lx, io_port 0x%lx, n_io_port %u, irq 0x%x,\n",
(ulong) s->base, (ulong) s->io_port, s->n_io_port, s->irq);
@@ -9448,11 +9181,9 @@
asc_prt_hex(" CDB", s->cmnd, s->cmd_len);
-#if ASC_LINUX_KERNEL24
printk (
"sc_data_direction %u, resid %d\n",
s->sc_data_direction, s->resid);
-#endif
printk(
" use_sg %u, sglist_len %u, abort_reason 0x%x\n",
@@ -9467,15 +9198,9 @@
" timeout_per_command %d, timeout_total %d, timeout %d\n",
s->timeout_per_command, s->timeout_total, s->timeout);
-#if ASC_LINUX_KERNEL24
printk(
" internal_timeout %u, flags %u\n",
s->internal_timeout, s->flags);
-#elif ASC_LINUX_KERNEL22
- printk(
-" internal_timeout %u, flags %u, this_count %d\n",
- s->internal_timeout, s->flags,s->this_count);
-#endif
printk(
" scsi_done 0x%lx, done 0x%lx, host_scribble 0x%lx, result 0x%x\n",
@@ -9832,12 +9557,9 @@
* --- Asc Library Functions
*/
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscGetEisaChipCfg(
- PortAddr iop_base
-)
-)
+ PortAddr iop_base)
{
PortAddr eisa_cfg_iop;
@@ -9846,13 +9568,11 @@
return (inpw(eisa_cfg_iop));
}
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
AscSetChipScsiID(
PortAddr iop_base,
uchar new_host_id
)
-)
{
ushort cfg_lsw;
@@ -9866,12 +9586,9 @@
return (AscGetChipScsiID(iop_base));
}
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
AscGetChipScsiCtrl(
- PortAddr iop_base
-)
-)
+ PortAddr iop_base)
{
uchar sc;
@@ -9881,13 +9598,11 @@
return (sc);
}
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
AscGetChipVersion(
PortAddr iop_base,
ushort bus_type
)
-)
{
if ((bus_type & ASC_IS_EISA) != 0) {
PortAddr eisa_iop;
@@ -9900,12 +9615,9 @@
return (AscGetChipVerNo(iop_base));
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscGetChipBusType(
- PortAddr iop_base
-)
-)
+ PortAddr iop_base)
{
ushort chip_ver;
@@ -9985,22 +9697,19 @@
return (0);
}
-STATIC PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] ASC_INITDATA =
+STATIC PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] __initdata =
{
0x100, ASC_IOADR_1, 0x120, ASC_IOADR_2, 0x140, ASC_IOADR_3, ASC_IOADR_4,
ASC_IOADR_5, ASC_IOADR_6, ASC_IOADR_7, ASC_IOADR_8
};
#ifdef CONFIG_ISA
-STATIC uchar _isa_pnp_inited ASC_INITDATA = 0;
+STATIC uchar _isa_pnp_inited __initdata = 0;
-ASC_INITFUNC(
-STATIC PortAddr,
+STATIC PortAddr __init
AscSearchIOPortAddr(
PortAddr iop_beg,
- ushort bus_type
-)
-)
+ ushort bus_type)
{
if (bus_type & ASC_IS_VL) {
while ((iop_beg = AscSearchIOPortAddr11(iop_beg)) != 0) {
@@ -10031,12 +9740,10 @@
return (0);
}
-ASC_INITFUNC(
-STATIC PortAddr,
+STATIC PortAddr __init
AscSearchIOPortAddr11(
PortAddr s_addr
)
-)
{
int i;
PortAddr iop_base;
@@ -10062,11 +9769,8 @@
return (0);
}
-ASC_INITFUNC(
-STATIC void,
-AscSetISAPNPWaitForKey(
- void)
-)
+STATIC void __init
+AscSetISAPNPWaitForKey(void)
{
outp(ASC_ISA_PNP_PORT_ADDR, 0x02);
outp(ASC_ISA_PNP_PORT_WRITE, 0x02);
@@ -10074,25 +9778,20 @@
}
#endif /* CONFIG_ISA */
-ASC_INITFUNC(
-STATIC void,
+STATIC void __init
AscToggleIRQAct(
PortAddr iop_base
)
-)
{
AscSetChipStatus(iop_base, CIW_IRQ_ACT);
AscSetChipStatus(iop_base, 0);
return;
}
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
AscGetChipIRQ(
PortAddr iop_base,
- ushort bus_type
-)
-)
+ ushort bus_type)
{
ushort cfg_lsw;
uchar chip_irq;
@@ -10122,14 +9821,11 @@
return ((uchar) (chip_irq + ASC_MIN_IRQ_NO));
}
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
AscSetChipIRQ(
PortAddr iop_base,
uchar irq_no,
- ushort bus_type
-)
-)
+ ushort bus_type)
{
ushort cfg_lsw;
@@ -10164,12 +9860,9 @@
}
#ifdef CONFIG_ISA
-ASC_INITFUNC(
-STATIC void,
+STATIC void __init
AscEnableIsaDma(
- uchar dma_channel
-)
-)
+ uchar dma_channel)
{
if (dma_channel < 4) {
outp(0x000B, (ushort) (0xC0 | dma_channel));
@@ -10330,7 +10023,7 @@
return (0);
} else {
- ext_msg.msg_type = M1_MSG_REJECT;
+ ext_msg.msg_type = MESSAGE_REJECT;
AscMemWordCopyPtrToLram(iop_base,
ASCV_MSGOUT_BEG,
(uchar *) &ext_msg,
@@ -10430,7 +10123,7 @@
(ushort) ASCV_SCSIBUSY_B, scsi_busy);
asc_dvc->queue_full_or_busy |= target_id;
- if (scsi_status == SS_QUEUE_FULL) {
+ if (scsi_status == SAM_STAT_TASK_SET_FULL) {
if (cur_dvc_qng > ASC_MIN_TAGGED_CMD) {
cur_dvc_qng -= 1;
asc_dvc->max_dvc_qng[tid_no] = cur_dvc_qng;
@@ -10777,7 +10470,7 @@
} else {
if ((AscReadLramByte(iop_base,
(ushort) (q_addr + (ushort) ASC_SCSIQ_CDB_BEG)) ==
- SCSICMD_StartStopUnit)) {
+ START_STOP)) {
asc_dvc->unit_not_ready &= ~target_id;
if (scsiq->d3.done_stat != QD_NO_ERROR) {
asc_dvc->start_motor &= ~target_id;
@@ -11050,14 +10743,14 @@
#define ASC_SYN_OFFSET_ONE_DISABLE_LIST 16
STATIC uchar _syn_offset_one_disable_cmd[ASC_SYN_OFFSET_ONE_DISABLE_LIST] =
{
- SCSICMD_Inquiry,
- SCSICMD_RequestSense,
- SCSICMD_ReadCapacity,
- SCSICMD_ReadTOC,
- SCSICMD_ModeSelect6,
- SCSICMD_ModeSense6,
- SCSICMD_ModeSelect10,
- SCSICMD_ModeSense10,
+ INQUIRY,
+ REQUEST_SENSE,
+ READ_CAPACITY,
+ READ_TOC,
+ MODE_SELECT,
+ MODE_SENSE,
+ MODE_SELECT_10,
+ MODE_SENSE_10,
0xFF,
0xFF,
0xFF,
@@ -11110,7 +10803,7 @@
target_ix = scsiq->q2.target_ix;
tid_no = ASC_TIX_TO_TID(target_ix);
n_q_required = 1;
- if (scsiq->cdbptr[0] == SCSICMD_RequestSense) {
+ if (scsiq->cdbptr[0] == REQUEST_SENSE) {
if ((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) {
asc_dvc->sdtr_done &= ~scsiq->q1.target_id;
sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
@@ -11179,7 +10872,7 @@
}
}
if (disable_syn_offset_one_fix) {
- scsiq->q2.tag_code &= ~M2_QTAG_MSG_SIMPLE;
+ scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG;
scsiq->q2.tag_code |= (ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX |
ASC_TAG_FLAG_DISABLE_DISCONNECT);
} else {
@@ -11188,8 +10881,8 @@
if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
if (asc_dvc->bug_fix_cntl) {
if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
- if ((scsi_cmd == SCSICMD_Read6) ||
- (scsi_cmd == SCSICMD_Read10)) {
+ if ((scsi_cmd == READ_6) ||
+ (scsi_cmd == READ_10)) {
addr =
(ADV_PADDR) le32_to_cpu(
sg_head->sg_list[sg_entry_cnt_minus_one].addr) +
@@ -11238,8 +10931,8 @@
} else {
if (asc_dvc->bug_fix_cntl) {
if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
- if ((scsi_cmd == SCSICMD_Read6) ||
- (scsi_cmd == SCSICMD_Read10)) {
+ if ((scsi_cmd == READ_6) ||
+ (scsi_cmd == READ_10)) {
addr = le32_to_cpu(scsiq->q1.data_addr) +
le32_to_cpu(scsiq->q1.data_cnt);
extra_bytes = (uchar) ((ushort) addr & 0x0003);
@@ -11410,7 +11103,7 @@
}
q_addr = ASC_QNO_TO_QADDR(q_no);
if ((scsiq->q1.target_id & asc_dvc->use_tagged_qng) == 0) {
- scsiq->q2.tag_code &= ~M2_QTAG_MSG_SIMPLE;
+ scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG ;
}
scsiq->q1.status = QS_FREE;
AscMemWordCopyPtrToLram(iop_base,
@@ -11907,12 +11600,9 @@
}
#ifdef CONFIG_ISA
-ASC_INITFUNC(
-STATIC ASC_DCNT,
+STATIC ASC_DCNT __init
AscGetEisaProductID(
- PortAddr iop_base
-)
-)
+ PortAddr iop_base)
{
PortAddr eisa_iop;
ushort product_id_high, product_id_low;
@@ -11926,12 +11616,9 @@
return (product_id);
}
-ASC_INITFUNC(
-STATIC PortAddr,
+STATIC PortAddr __init
AscSearchIOPortAddrEISA(
- PortAddr iop_base
-)
-)
+ PortAddr iop_base)
{
ASC_DCNT eisa_product_id;
@@ -12125,12 +11812,9 @@
return (AscIsChipHalted(iop_base));
}
-ASC_INITFUNC(
-STATIC ASC_DCNT,
+STATIC ASC_DCNT __init
AscGetMaxDmaCount(
- ushort bus_type
-)
-)
+ ushort bus_type)
{
if (bus_type & ASC_IS_ISA)
return (ASC_MAX_ISA_DMA_COUNT);
@@ -12140,12 +11824,9 @@
}
#ifdef CONFIG_ISA
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscGetIsaDmaChannel(
- PortAddr iop_base
-)
-)
+ PortAddr iop_base)
{
ushort channel;
@@ -12157,13 +11838,10 @@
return (channel + 4);
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscSetIsaDmaChannel(
PortAddr iop_base,
- ushort dma_channel
-)
-)
+ ushort dma_channel)
{
ushort cfg_lsw;
uchar value;
@@ -12181,13 +11859,10 @@
return (0);
}
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
AscSetIsaDmaSpeed(
PortAddr iop_base,
- uchar speed_value
-)
-)
+ uchar speed_value)
{
speed_value &= 0x07;
AscSetBank(iop_base, 1);
@@ -12196,12 +11871,10 @@
return (AscGetIsaDmaSpeed(iop_base));
}
-ASC_INITFUNC(
-STATIC uchar,
+STATIC uchar __init
AscGetIsaDmaSpeed(
PortAddr iop_base
)
-)
{
uchar speed_value;
@@ -12213,12 +11886,10 @@
}
#endif /* CONFIG_ISA */
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscReadPCIConfigWord(
ASC_DVC_VAR *asc_dvc,
ushort pci_config_offset)
-)
{
uchar lsb, msb;
@@ -12227,12 +11898,10 @@
return ((ushort) ((msb << 8) | lsb));
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscInitGetConfig(
ASC_DVC_VAR *asc_dvc
)
-)
{
ushort warn_code;
PortAddr iop_base;
@@ -12312,12 +11981,10 @@
return(warn_code);
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscInitSetConfig(
ASC_DVC_VAR *asc_dvc
)
-)
{
ushort warn_code = 0;
@@ -12333,12 +12000,10 @@
return (warn_code);
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscInitFromAscDvcVar(
ASC_DVC_VAR *asc_dvc
)
-)
{
PortAddr iop_base;
ushort cfg_msw;
@@ -12438,12 +12103,9 @@
return (warn_code);
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscInitAscDvcVar(
- ASC_DVC_VAR *asc_dvc
-)
-)
+ ASC_DVC_VAR *asc_dvc)
{
int i;
PortAddr iop_base;
@@ -12553,12 +12215,8 @@
return (warn_code);
}
-ASC_INITFUNC(
-STATIC ushort,
-AscInitFromEEP(
- ASC_DVC_VAR *asc_dvc
-)
-)
+STATIC ushort __init
+AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
{
ASCEEP_CONFIG eep_config_buf;
ASCEEP_CONFIG *eep_config;
@@ -12774,12 +12432,9 @@
return (warn_code);
}
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AscTestExternalLram(
- ASC_DVC_VAR *asc_dvc
-)
-)
+ ASC_DVC_VAR *asc_dvc)
{
PortAddr iop_base;
ushort q_addr;
@@ -12801,13 +12456,11 @@
return (sta);
}
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AscWriteEEPCmdReg(
PortAddr iop_base,
uchar cmd_reg
)
-)
{
uchar read_back;
int retry;
@@ -12826,13 +12479,11 @@
}
}
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AscWriteEEPDataReg(
PortAddr iop_base,
ushort data_reg
)
-)
{
ushort read_back;
int retry;
@@ -12851,35 +12502,24 @@
}
}
-ASC_INITFUNC(
-STATIC void,
-AscWaitEEPRead(
- void
-)
-)
+STATIC void __init
+AscWaitEEPRead(void)
{
DvcSleepMilliSecond(1);
return;
}
-ASC_INITFUNC(
-STATIC void,
-AscWaitEEPWrite(
- void
-)
-)
+STATIC void __init
+AscWaitEEPWrite(void)
{
DvcSleepMilliSecond(20);
return;
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscReadEEPWord(
PortAddr iop_base,
- uchar addr
-)
-)
+ uchar addr)
{
ushort read_wval;
uchar cmd_reg;
@@ -12894,14 +12534,11 @@
return (read_wval);
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscWriteEEPWord(
PortAddr iop_base,
uchar addr,
- ushort word_val
-)
-)
+ ushort word_val)
{
ushort read_wval;
@@ -12921,13 +12558,10 @@
return (read_wval);
}
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AscGetEEPConfig(
PortAddr iop_base,
- ASCEEP_CONFIG * cfg_buf, ushort bus_type
-)
-)
+ ASCEEP_CONFIG * cfg_buf, ushort bus_type)
{
ushort wval;
ushort sum;
@@ -12973,13 +12607,10 @@
return (sum);
}
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AscSetEEPConfigOnce(
PortAddr iop_base,
- ASCEEP_CONFIG * cfg_buf, ushort bus_type
-)
-)
+ ASCEEP_CONFIG * cfg_buf, ushort bus_type)
{
int n_error;
ushort *wbuf;
@@ -13071,13 +12702,11 @@
return (n_error);
}
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AscSetEEPConfig(
PortAddr iop_base,
ASCEEP_CONFIG * cfg_buf, ushort bus_type
)
-)
{
int retry;
int n_error;
@@ -13111,17 +12740,17 @@
{
if (!(asc_dvc->init_sdtr & tid_bits))
{
- if ((dvc_type == SCSI_TYPE_CDROM) &&
+ if ((dvc_type == TYPE_ROM) &&
(AscCompareString((uchar *) inq->vendor_id,
(uchar *) "HP ", 3) == 0))
{
asc_dvc->pci_fix_asyn_xfer_always |= tid_bits;
}
asc_dvc->pci_fix_asyn_xfer |= tid_bits;
- if ((dvc_type == SCSI_TYPE_PROC) ||
- (dvc_type == SCSI_TYPE_SCANNER) ||
- (dvc_type == SCSI_TYPE_CDROM) ||
- (dvc_type == SCSI_TYPE_SASD))
+ if ((dvc_type == TYPE_PROCESSOR) ||
+ (dvc_type == TYPE_SCANNER) ||
+ (dvc_type == TYPE_ROM) ||
+ (dvc_type == TYPE_TAPE))
{
asc_dvc->pci_fix_asyn_xfer &= ~tid_bits;
}
@@ -14515,7 +14144,7 @@
* unswapped on big-endian platforms.
*/
STATIC ADVEEP_3550_CONFIG
-Default_3550_EEPROM_Config ASC_INITDATA = {
+Default_3550_EEPROM_Config __initdata = {
ADV_EEPROM_BIOS_ENABLE, /* cfg_lsw */
0x0000, /* cfg_msw */
0xFFFF, /* disc_enable */
@@ -14553,7 +14182,7 @@
};
STATIC ADVEEP_3550_CONFIG
-ADVEEP_3550_Config_Field_IsChar ASC_INITDATA = {
+ADVEEP_3550_Config_Field_IsChar __initdata = {
0, /* cfg_lsw */
0, /* cfg_msw */
0, /* -disc_enable */
@@ -14591,7 +14220,7 @@
};
STATIC ADVEEP_38C0800_CONFIG
-Default_38C0800_EEPROM_Config ASC_INITDATA = {
+Default_38C0800_EEPROM_Config __initdata = {
ADV_EEPROM_BIOS_ENABLE, /* 00 cfg_lsw */
0x0000, /* 01 cfg_msw */
0xFFFF, /* 02 disc_enable */
@@ -14656,7 +14285,7 @@
};
STATIC ADVEEP_38C0800_CONFIG
-ADVEEP_38C0800_Config_Field_IsChar ASC_INITDATA = {
+ADVEEP_38C0800_Config_Field_IsChar __initdata = {
0, /* 00 cfg_lsw */
0, /* 01 cfg_msw */
0, /* 02 disc_enable */
@@ -14721,7 +14350,7 @@
};
STATIC ADVEEP_38C1600_CONFIG
-Default_38C1600_EEPROM_Config ASC_INITDATA = {
+Default_38C1600_EEPROM_Config __initdata = {
ADV_EEPROM_BIOS_ENABLE, /* 00 cfg_lsw */
0x0000, /* 01 cfg_msw */
0xFFFF, /* 02 disc_enable */
@@ -14786,7 +14415,7 @@
};
STATIC ADVEEP_38C1600_CONFIG
-ADVEEP_38C1600_Config_Field_IsChar ASC_INITDATA = {
+ADVEEP_38C1600_Config_Field_IsChar __initdata = {
0, /* 00 cfg_lsw */
0, /* 01 cfg_msw */
0, /* 02 disc_enable */
@@ -14858,10 +14487,8 @@
* For a non-fatal error return a warning code. If there are no warnings
* then 0 is returned.
*/
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AdvInitGetConfig(ADV_DVC_VAR *asc_dvc)
-)
{
ushort warn_code;
AdvPortAddr iop_base;
@@ -16845,10 +16472,8 @@
*
* Note: Chip is stopped on entry.
*/
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
-)
{
AdvPortAddr iop_base;
ushort warn_code;
@@ -17019,10 +16644,8 @@
*
* Note: Chip is stopped on entry.
*/
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
-)
{
AdvPortAddr iop_base;
ushort warn_code;
@@ -17254,10 +16877,8 @@
*
* Note: Chip is stopped on entry.
*/
-ASC_INITFUNC(
-STATIC int,
+STATIC int __init
AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
-)
{
AdvPortAddr iop_base;
ushort warn_code;
@@ -17522,10 +17143,8 @@
*
* Return a checksum based on the EEPROM configuration read.
*/
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AdvGet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
-)
{
ushort wval, chksum;
ushort *wbuf;
@@ -17570,11 +17189,9 @@
*
* Return a checksum based on the EEPROM configuration read.
*/
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AdvGet38C0800EEPConfig(AdvPortAddr iop_base,
ADVEEP_38C0800_CONFIG *cfg_buf)
-)
{
ushort wval, chksum;
ushort *wbuf;
@@ -17619,11 +17236,9 @@
*
* Return a checksum based on the EEPROM configuration read.
*/
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AdvGet38C1600EEPConfig(AdvPortAddr iop_base,
ADVEEP_38C1600_CONFIG *cfg_buf)
-)
{
ushort wval, chksum;
ushort *wbuf;
@@ -17666,10 +17281,8 @@
/*
* Read the EEPROM from specified location
*/
-ASC_INITFUNC(
-STATIC ushort,
+STATIC ushort __init
AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
-)
{
AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
ASC_EEP_CMD_READ | eep_word_addr);
@@ -17680,10 +17293,8 @@
/*
* Wait for EEPROM command to complete
*/
-ASC_INITFUNC(
-STATIC void,
+STATIC void __init
AdvWaitEEPCmd(AdvPortAddr iop_base)
-)
{
int eep_delay_ms;
@@ -18335,7 +17946,7 @@
* the device, otherwise may erroneously set *_able bits.
*/
if (scsiq->done_status == QD_NO_ERROR &&
- scsiq->cdb[0] == SCSICMD_Inquiry &&
+ scsiq->cdb[0] == INQUIRY &&
scsiq->target_lun == 0 &&
(scsiq->cdb[1] & ADV_INQ_RTN_VPD_AND_CMDDT)
== ADV_INQ_RTN_STD_INQUIRY_DATA)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-06-23 14:13 ` Christoph Hellwig
@ 2004-06-23 15:51 ` James Bottomley
2004-06-24 12:09 ` Douglas Gilbert
0 siblings, 1 reply; 11+ messages in thread
From: James Bottomley @ 2004-06-23 15:51 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Douglas Gilbert, Herbert Xu, Gene Heskett, SCSI Mailing List
On Wed, 2004-06-23 at 09:13, Christoph Hellwig wrote:
> There were actually two patches to advansys in that timeframe. Although
> it's much more likely that the dma api patch is the culprit can you test
> with the compat code cleanup patch below reversed?:
I've got to say I would bet quite a lot on the DMA API conversion being
the culpret. Also, because the narrow board works and the wide board
doesn't, the fault has got to be in adv_build_req().
There is a logic change in that routine that seems to be a simple
initialisation clean up, but, since it's in a globally visible
structure, could be altering the behaviour. I don't have time to follow
these structures all around the logic, but just see if this makes the
problem go away. (A correct fix, if this is the problem, is going to be
a bit nasty).
James
===== drivers/scsi/advansys.c 1.41 vs edited =====
--- 1.41/drivers/scsi/advansys.c 2004-06-04 06:19:50 -05:00
+++ edited/drivers/scsi/advansys.c 2004-06-23 10:50:01 -05:00
@@ -6615,6 +6615,10 @@
* buffer command.
*/
+ scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
+ scsiqp->vdata_addr = scp->request_buffer;
+ scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
+
if (scp->use_sg == 0) {
/*
* CDB request of single contiguous buffer.
@@ -6642,10 +6646,6 @@
*/
struct scatterlist *slp;
int use_sg;
-
- scsiqp->data_cnt = 0;
- scsiqp->vdata_addr = 0;
- scsiqp->data_addr = 0;
slp = (struct scatterlist *)scp->request_buffer;
use_sg = dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-06-23 15:51 ` James Bottomley
@ 2004-06-24 12:09 ` Douglas Gilbert
2004-06-24 13:00 ` James Bottomley
0 siblings, 1 reply; 11+ messages in thread
From: Douglas Gilbert @ 2004-06-24 12:09 UTC (permalink / raw)
To: James Bottomley
Cc: Christoph Hellwig, Herbert Xu, Gene Heskett, SCSI Mailing List
[-- Attachment #1: Type: text/plain, Size: 1278 bytes --]
James Bottomley wrote:
> On Wed, 2004-06-23 at 09:13, Christoph Hellwig wrote:
>
>>There were actually two patches to advansys in that timeframe. Although
>>it's much more likely that the dma api patch is the culprit can you test
>>with the compat code cleanup patch below reversed?:
>
>
> I've got to say I would bet quite a lot on the DMA API conversion being
> the culpret. Also, because the narrow board works and the wide board
> doesn't, the fault has got to be in adv_build_req().
>
> There is a logic change in that routine that seems to be a simple
> initialisation clean up, but, since it's in a globally visible
> structure, could be altering the behaviour. I don't have time to follow
> these structures all around the logic, but just see if this makes the
> problem go away. (A correct fix, if this is the problem, is going to be
> a bit nasty).
James,
Your patch fixed the PCI wide problem. The attached incorporates
your fix and also fixes the ISA oops. So now all my advansys cards
work.
Changelog:
- fix PCI wide "use_sg > 0" problem introduced in lk 2.6.7-bk2
- fix ISA oops (present in all versions of the lk 2.6 series to date)
- bump version to "3.3K" and add comments
- fix compilation error when ADVANSYS_DEBUG defined
Doug Gilbert
[-- Attachment #2: advansys267bk2fix.diff --]
[-- Type: text/x-patch, Size: 2156 bytes --]
--- linux/drivers/scsi/advansys.c 2004-06-20 13:29:28.000000000 +1000
+++ linux/drivers/scsi/advansys.c267bk2fix 2004-06-24 21:25:34.309239520 +1000
@@ -1,4 +1,4 @@
-#define ASC_VERSION "3.3GJ" /* AdvanSys Driver Version */
+#define ASC_VERSION "3.3K" /* AdvanSys Driver Version */
/*
* advansys.c - Linux Host Driver for AdvanSys SCSI Adapters
@@ -677,6 +677,11 @@
1. change select_queue_depths to slave_configure
2. make cmd_per_lun be sane again
+ 3.3K [2004/06/24]:
+ 1. continuing cleanup for lk 2.6 series
+ 2. Fix problem in lk 2.6.7-bk2 that broke PCI wide cards
+ 3. Fix problem that oopsed ISA cards
+
I. Known Problems/Fix List (XXX)
1. Need to add memory mapping workaround. Test the memory mapping.
@@ -6615,6 +6620,10 @@
* buffer command.
*/
+ scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
+ scsiqp->vdata_addr = scp->request_buffer;
+ scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
+
if (scp->use_sg == 0) {
/*
* CDB request of single contiguous buffer.
@@ -6643,10 +6652,6 @@
struct scatterlist *slp;
int use_sg;
- scsiqp->data_cnt = 0;
- scsiqp->vdata_addr = 0;
- scsiqp->data_addr = 0;
-
slp = (struct scatterlist *)scp->request_buffer;
use_sg = dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
@@ -9198,9 +9203,7 @@
" timeout_per_command %d, timeout_total %d, timeout %d\n",
s->timeout_per_command, s->timeout_total, s->timeout);
- printk(
-" internal_timeout %u, flags %u\n",
- s->internal_timeout, s->flags);
+ printk(" internal_timeout %u\n", s->internal_timeout);
printk(
" scsi_done 0x%lx, done 0x%lx, host_scribble 0x%lx, result 0x%x\n",
@@ -12011,7 +12014,10 @@
ushort pci_device_id;
iop_base = asc_dvc->iop_base;
- pci_device_id = to_pci_dev(asc_dvc->cfg->dev)->device;
+ if (asc_dvc->cfg->dev)
+ pci_device_id = to_pci_dev(asc_dvc->cfg->dev)->device;
+ else
+ pci_device_id = 0;
warn_code = 0;
cfg_msw = AscGetChipCfgMsw(iop_base);
if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [ADVANSYS] Add basic highmem/DMA support
2004-06-24 12:09 ` Douglas Gilbert
@ 2004-06-24 13:00 ` James Bottomley
0 siblings, 0 replies; 11+ messages in thread
From: James Bottomley @ 2004-06-24 13:00 UTC (permalink / raw)
To: Douglas Gilbert
Cc: Christoph Hellwig, Herbert Xu, Gene Heskett, SCSI Mailing List
On Thu, 2004-06-24 at 07:09, Douglas Gilbert wrote:
> Your patch fixed the PCI wide problem. The attached incorporates
> your fix and also fixes the ISA oops. So now all my advansys cards
> work.
Well, damn, I was afraid of that.
Unfortunately, that patch working is a symptom of deep malaise within
the driver. It means that these segments are used in some way in its
internals and virt_to_bus and bus_to_virt translations occur all over
it. It also means that the DMA API conversion really isn't effective.
James
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2004-06-24 13:01 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-05-08 0:39 [ADVANSYS] Add basic highmem/DMA support Herbert Xu
2004-05-19 10:38 ` Herbert Xu
2004-05-31 18:02 ` James Bottomley
2004-06-21 8:41 ` Douglas Gilbert
2004-06-21 14:28 ` James Bottomley
2004-06-22 0:35 ` Douglas Gilbert
2004-06-23 6:35 ` Douglas Gilbert
2004-06-23 14:13 ` Christoph Hellwig
2004-06-23 15:51 ` James Bottomley
2004-06-24 12:09 ` Douglas Gilbert
2004-06-24 13:00 ` James Bottomley
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).