On Thursday 14 October 2004 7:25 pm, Randy.Dunlap wrote:

> >>>>Could mark req.dma as __le32...
> >>
> >>I didn't like that suggestion (yet), other people can comment on it,
> >>though.  For now I'm just adding a cast.
> > 
> > 
> > Changing that type for sparse sounds better to me, so it works
> > on a big-endian 64bit CPU as well as just fixing the warning.
> > Do you want me to make those changes?
> 
> If you would, please.  I just wasn't sure about the more global
> ramifications of that.

Attached ... see if it behaves for you.
 
> > One of these moments I really should install "sparse". 
> 
> Yes.

Finally did it ... :)

> > Looks OK, at least if you ignore the fact that it'll print out
> > byteswapped on big-endian ... I'm told the driver does
> > work OK on PPC32, though.
> 
> So this is a net2280 dma addr, therefore it's always little-endian?
> ugh.  So it can be something like
> 
>               (unsigned long long) le32_to_cpu(req->td_dma),
> ?  argh.  that doesn't make much sense.
> this is a "dma_32bit_t", right?  darn.
> otherwise le32_to_cpu(on a 64-bit dma addr) is funky.

Yes, dma32_addr_t or something similarly non-existent!  :)

Most places didn't use the pointer based conversion; those
allegedly save an instruction on some CPUs.  Not using the
cpu_to_le32p() version was safer, it turns out.

- Dave
Fix some compiler warnings that came up with net2280 on processors with
64bit dma_addr-t ... one of them would have been a bug on big-endian CPUs.
(Thanks to Randy Dunlap for reporting these.)

Signed-off-by: David Brownell <[EMAIL PROTECTED]>

--- 1.64/drivers/usb/gadget/net2280.c	2004-09-22 21:25:26 -07:00
+++ edited/drivers/usb/gadget/net2280.c	2004-10-15 13:34:35 -07:00
@@ -717,7 +717,7 @@
 		dmacount |= (1 << DMA_DONE_INTERRUPT_ENABLE);
 
 	/* td->dmadesc = previously set by caller */
-	td->dmaaddr = cpu_to_le32p (&req->req.dma);
+	td->dmaaddr = cpu_to_le32 (req->req.dma);
 
 	/* 2280 may be polling VALID_BIT through ep->dma->dmadesc */
 	wmb ();
@@ -1707,8 +1707,10 @@
 				td = req->td;
 				t = scnprintf (next, size, "\t    td %08x "
 					" count %08x buf %08x desc %08x\n",
-					req->td_dma, td->dmacount,
-					td->dmaaddr, td->dmadesc);
+					(u32) req->td_dma,
+					le32_to_cpu (td->dmacount),
+					le32_to_cpu (td->dmaaddr),
+					le32_to_cpu (td->dmadesc));
 				if (t <= 0 || t > size)
 					goto done;
 				size -= t;
@@ -2845,6 +2847,7 @@
 	dev->got_irq = 1;
 
 	/* DMA setup */
+	/* NOTE:  we know only the 32 LSBs of dma addresses may be nonzero */
 	dev->requests = pci_pool_create ("requests", pdev,
 		sizeof (struct net2280_dma),
 		0 /* no alignment requirements */,
--- 1.18/drivers/usb/gadget/net2280.h	2004-09-22 21:25:27 -07:00
+++ edited/drivers/usb/gadget/net2280.h	2004-10-15 13:26:59 -07:00
@@ -495,10 +495,10 @@
  * use struct net2280_dma_regs bitfields
  */
 struct net2280_dma {
-	u32		dmacount;
-	u32		dmaaddr;		/* the buffer */
-	u32		dmadesc;		/* next dma descriptor */
-	u32		_reserved;
+	__le32		dmacount;
+	__le32		dmaaddr;		/* the buffer */
+	__le32		dmadesc;		/* next dma descriptor */
+	__le32		_reserved;
 } __attribute__ ((aligned (16)));
 
 /*-------------------------------------------------------------------------*/

Reply via email to