* [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver??
@ 2002-11-23 7:38 Ryan Bradetich
2002-11-24 2:13 ` Grant Grundler
2002-11-24 2:43 ` Grant Grundler
0 siblings, 2 replies; 6+ messages in thread
From: Ryan Bradetich @ 2002-11-23 7:38 UTC (permalink / raw)
To: parisc-linux
Hello parisc-linux hackers,
I traced my boot problem with cvs head for the linux-2.4 tree down to
the following patch:
Index: drivers/scsi/sym53c8xx_2/sym53c8xx.h
===================================================================
RCS file: /var/cvs/linux/drivers/scsi/sym53c8xx_2/sym53c8xx.h,v
retrieving revision 1.4
diff -u -p -r1.4 sym53c8xx.h
--- drivers/scsi/sym53c8xx_2/sym53c8xx.h 13 Nov 2002 15:15:44 -0000 1.4
+++ drivers/scsi/sym53c8xx_2/sym53c8xx.h 23 Nov 2002 07:32:10 -0000
@@ -119,8 +119,7 @@ int sym53c8xx_release(struct Scsi_Host *
this_id: 7, \
sg_tablesize: 0, \
cmd_per_lun: 0, \
- use_clustering: DISABLE_CLUSTERING, \
- highmem_io: 1}
+ use_clustering: DISABLE_CLUSTERING}
#endif /* defined(HOSTS_C) || defined(MODULE) */
Index: drivers/scsi/sym53c8xx_2/sym_glue.c
===================================================================
RCS file: /var/cvs/linux/drivers/scsi/sym53c8xx_2/sym_glue.c,v
retrieving revision 1.6
diff -u -p -r1.6 sym_glue.c
--- drivers/scsi/sym53c8xx_2/sym_glue.c 16 Nov 2002 06:10:46 -0000 1.6
+++ drivers/scsi/sym53c8xx_2/sym_glue.c 23 Nov 2002 07:32:11 -0000
@@ -2154,7 +2154,6 @@ sym_attach (Scsi_Host_Template *tpnt, in
instance->max_cmd_len = 16;
#endif
instance->select_queue_depths = sym53c8xx_select_queue_depths;
- instance->highmem_io = 1;
SYM_UNLOCK_HCB(np, flags);
I am not sure what the highmem_io flag does, but when it is enabled it
causes my C200 to HPMC.
Thoughts?
Thanks,
- Ryan
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver??
2002-11-23 7:38 [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver?? Ryan Bradetich
@ 2002-11-24 2:13 ` Grant Grundler
2002-11-24 2:43 ` Grant Grundler
1 sibling, 0 replies; 6+ messages in thread
From: Grant Grundler @ 2002-11-24 2:13 UTC (permalink / raw)
To: Ryan Bradetich; +Cc: parisc-linux
Ryan Bradetich wrote:
...
> I am not sure what the highmem_io flag does, but when it is enabled it
> causes my C200 to HPMC.
That's for the SCSI midlayer to know whether or not the driver can do
64-bit DMA or not. Basically it means SCSI will use "page+offset"
instead of "address" when building SG lists.
All parisc machines require 32-bit DMA - ie through an IO MMU or direct.
Failures with highmem_io enabled suggests we aren't handling
"page+offset" correctly in the iommu code.
grant
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver??
2002-11-23 7:38 [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver?? Ryan Bradetich
2002-11-24 2:13 ` Grant Grundler
@ 2002-11-24 2:43 ` Grant Grundler
2002-11-25 18:59 ` Ryan Bradetich
2002-11-26 15:07 ` jsoe0708
1 sibling, 2 replies; 6+ messages in thread
From: Grant Grundler @ 2002-11-24 2:43 UTC (permalink / raw)
To: Ryan Bradetich; +Cc: parisc-linux
Ryan Bradetich wrote:
> I am not sure what the highmem_io flag does, but when it is enabled it
> causes my C200 to HPMC.
yeah - ccio-dma.c isn't using sg_virt_address() to access to the virtual
address of an SG list entry. It's defined in include/asm/scatterlist.h.
See sba_iommu.c on how to use this correctly.
Attached diff is a first cut, untested. My advice is to rewrite the
loop so sg_virt_address() result is saved once instead of referencing
the macro 3 (or more) times in the main loop.
grant
Index: ccio-dma.c
===================================================================
RCS file: /var/cvs/linux/arch/parisc/kernel/ccio-dma.c,v
retrieving revision 1.56
diff -u -p -r1.56 ccio-dma.c
--- ccio-dma.c 17 Nov 2002 20:44:11 -0000 1.56
+++ ccio-dma.c 24 Nov 2002 02:42:09 -0000
@@ -805,7 +805,7 @@ ccio_fill_pdir(struct ioc *ioc, struct s
DBG_RUN_SG(" %d : %08lx/%05x %p/%05x\n", nents,
(unsigned long)sg_dma_address(startsg), cnt,
- startsg->address, startsg->length
+ sg_virt_address(startsg), startsg->length
);
/*
@@ -825,7 +825,7 @@ ccio_fill_pdir(struct ioc *ioc, struct s
** Look for a VCONTIG chunk
*/
if (cnt) {
- unsigned long vaddr = (unsigned long)startsg->address;
+ unsigned long vaddr = (unsigned long)sg_virt_address(startsg);
ASSERT(pdirp);
/* Since multiple Vcontig blocks could make up
@@ -878,8 +878,8 @@ ccio_coalesce_chunks(struct ioc *ioc, st
*/
dma_sg = vcontig_sg = startsg;
dma_len = vcontig_len = vcontig_end = startsg->length;
- vcontig_end += (unsigned long) startsg->address;
- dma_offset = (unsigned long) startsg->address & ~IOVP_MASK;
+ vcontig_end += (unsigned long) sg_virt_address(startsg);
+ dma_offset = (unsigned long) sg_virt_address(startsg) & ~IOVP_MASK;
/* PARANOID: clear entries */
sg_dma_address(startsg) = 0;
@@ -893,7 +893,7 @@ ccio_coalesce_chunks(struct ioc *ioc, st
unsigned long startsg_end;
startsg++;
- startsg_end = (unsigned long)startsg->address +
+ startsg_end = (unsigned long)sg_virt_address(startsg) +
startsg->length;
/* PARANOID: clear entries */
@@ -912,7 +912,7 @@ ccio_coalesce_chunks(struct ioc *ioc, st
/*
** Append the next transaction?
*/
- if(vcontig_end == (unsigned long) startsg->address) {
+ if(vcontig_end == (unsigned long) sg_virt_address(startsg)) {
vcontig_len += startsg->length;
vcontig_end += startsg->length;
dma_len += startsg->length;
@@ -981,7 +981,8 @@ ccio_map_sg(struct pci_dev *dev, struct
/* Fast path single entry scatterlists. */
if(nents == 1) {
- sg_dma_address(sglist)= ccio_map_single(dev, sglist->address,
+ sg_dma_address(sglist)= ccio_map_single(dev,
+ sg_virt_address(sglist),
sglist->length,
direction);
sg_dma_len(sglist)= sglist->length;
@@ -1043,7 +1044,7 @@ ccio_unmap_sg(struct pci_dev *dev, struc
ioc = GET_IOC(dev);
DBG_RUN_SG("%s() START %d entries, %p,%x\n",
- __FUNCTION__, nents, sglist->address, sglist->length);
+ __FUNCTION__, nents, sg_virt_address(sglist), sglist->length);
#ifdef CONFIG_PROC_FS
ioc->usg_calls++;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver??
2002-11-24 2:43 ` Grant Grundler
@ 2002-11-25 18:59 ` Ryan Bradetich
2002-11-26 15:07 ` jsoe0708
1 sibling, 0 replies; 6+ messages in thread
From: Ryan Bradetich @ 2002-11-25 18:59 UTC (permalink / raw)
To: Grant Grundler; +Cc: parisc-linux
Thanks Grant!
I will look look at this and try this out later this week after I get
back!
Nice catch.
- Ryan
On Sat, 2002-11-23 at 19:43, Grant Grundler wrote:
> Ryan Bradetich wrote:
> > I am not sure what the highmem_io flag does, but when it is enabled it
> > causes my C200 to HPMC.
>
> yeah - ccio-dma.c isn't using sg_virt_address() to access to the virtual
> address of an SG list entry. It's defined in include/asm/scatterlist.h.
> See sba_iommu.c on how to use this correctly.
>
> Attached diff is a first cut, untested. My advice is to rewrite the
> loop so sg_virt_address() result is saved once instead of referencing
> the macro 3 (or more) times in the main loop.
>
> grant
>
>
> Index: ccio-dma.c
> ===================================================================
> RCS file: /var/cvs/linux/arch/parisc/kernel/ccio-dma.c,v
> retrieving revision 1.56
> diff -u -p -r1.56 ccio-dma.c
> --- ccio-dma.c 17 Nov 2002 20:44:11 -0000 1.56
> +++ ccio-dma.c 24 Nov 2002 02:42:09 -0000
> @@ -805,7 +805,7 @@ ccio_fill_pdir(struct ioc *ioc, struct s
>
> DBG_RUN_SG(" %d : %08lx/%05x %p/%05x\n", nents,
> (unsigned long)sg_dma_address(startsg), cnt,
> - startsg->address, startsg->length
> + sg_virt_address(startsg), startsg->length
> );
>
> /*
> @@ -825,7 +825,7 @@ ccio_fill_pdir(struct ioc *ioc, struct s
> ** Look for a VCONTIG chunk
> */
> if (cnt) {
> - unsigned long vaddr = (unsigned long)startsg->address;
> + unsigned long vaddr = (unsigned long)sg_virt_address(startsg);
> ASSERT(pdirp);
>
> /* Since multiple Vcontig blocks could make up
> @@ -878,8 +878,8 @@ ccio_coalesce_chunks(struct ioc *ioc, st
> */
> dma_sg = vcontig_sg = startsg;
> dma_len = vcontig_len = vcontig_end = startsg->length;
> - vcontig_end += (unsigned long) startsg->address;
> - dma_offset = (unsigned long) startsg->address & ~IOVP_MASK;
> + vcontig_end += (unsigned long) sg_virt_address(startsg);
> + dma_offset = (unsigned long) sg_virt_address(startsg) & ~IOVP_MASK;
>
> /* PARANOID: clear entries */
> sg_dma_address(startsg) = 0;
> @@ -893,7 +893,7 @@ ccio_coalesce_chunks(struct ioc *ioc, st
> unsigned long startsg_end;
>
> startsg++;
> - startsg_end = (unsigned long)startsg->address +
> + startsg_end = (unsigned long)sg_virt_address(startsg) +
> startsg->length;
>
> /* PARANOID: clear entries */
> @@ -912,7 +912,7 @@ ccio_coalesce_chunks(struct ioc *ioc, st
> /*
> ** Append the next transaction?
> */
> - if(vcontig_end == (unsigned long) startsg->address) {
> + if(vcontig_end == (unsigned long) sg_virt_address(startsg)) {
> vcontig_len += startsg->length;
> vcontig_end += startsg->length;
> dma_len += startsg->length;
> @@ -981,7 +981,8 @@ ccio_map_sg(struct pci_dev *dev, struct
>
> /* Fast path single entry scatterlists. */
> if(nents == 1) {
> - sg_dma_address(sglist)= ccio_map_single(dev, sglist->address,
> + sg_dma_address(sglist)= ccio_map_single(dev,
> + sg_virt_address(sglist),
> sglist->length,
> direction);
> sg_dma_len(sglist)= sglist->length;
> @@ -1043,7 +1044,7 @@ ccio_unmap_sg(struct pci_dev *dev, struc
> ioc = GET_IOC(dev);
>
> DBG_RUN_SG("%s() START %d entries, %p,%x\n",
> - __FUNCTION__, nents, sglist->address, sglist->length);
> + __FUNCTION__, nents, sg_virt_address(sglist), sglist->length);
>
> #ifdef CONFIG_PROC_FS
> ioc->usg_calls++;
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver??
2002-11-24 2:43 ` Grant Grundler
2002-11-25 18:59 ` Ryan Bradetich
@ 2002-11-26 15:07 ` jsoe0708
2002-11-26 18:45 ` Grant Grundler
1 sibling, 1 reply; 6+ messages in thread
From: jsoe0708 @ 2002-11-26 15:07 UTC (permalink / raw)
To: Grant Grundler, Ryan Bradetich; +Cc: parisc-linux
>
>yeah - ccio-dma.c isn't using sg_virt_address() to access to the virtual
>address of an SG list entry. It's defined in include/asm/scatterlist.h.
>See sba_iommu.c on how to use this correctly.
>
>Attached diff is a first cut, untested. My advice is to rewrite the
>loop so sg_virt_address() result is saved once instead of referencing
>the macro 3 (or more) times in the main loop.
>
Hey Grant,
Am I wrong or sg_virt_address() should be called sg_virt_addr()?
Joel
********************************************************************************
Controlez mieux votre consommation Internet...surfez Tiscali Complete...http://tiscali.complete.be
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver??
2002-11-26 15:07 ` jsoe0708
@ 2002-11-26 18:45 ` Grant Grundler
0 siblings, 0 replies; 6+ messages in thread
From: Grant Grundler @ 2002-11-26 18:45 UTC (permalink / raw)
To: jsoe0708; +Cc: Ryan Bradetich, parisc-linux
jsoe0708@tiscali.be wrote:
> Am I wrong or sg_virt_address() should be called sg_virt_addr()?
you've got it right.
grant
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2002-11-26 18:45 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-11-23 7:38 [parisc-linux] [PATCH] highmem_io for the sym53c8xx_2 driver?? Ryan Bradetich
2002-11-24 2:13 ` Grant Grundler
2002-11-24 2:43 ` Grant Grundler
2002-11-25 18:59 ` Ryan Bradetich
2002-11-26 15:07 ` jsoe0708
2002-11-26 18:45 ` Grant Grundler
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox