From: Ivo van Doorn <ivdoorn@gmail.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: netdev@vger.kernel.org, rt2x00-devel@lfcorreia.dyndns.org
Subject: Re: [PATCH 3/32] rt2x00: use pci_*_consistent for DMA mapping
Date: Fri, 28 Apr 2006 15:24:07 +0200 [thread overview]
Message-ID: <200604281524.11670.IvDoorn@gmail.com> (raw)
In-Reply-To: <20060428131533.GB3288@infradead.org>
[-- Attachment #1: Type: text/plain, Size: 5053 bytes --]
On Friday 28 April 2006 15:15, Christoph Hellwig wrote:
> On Fri, Apr 28, 2006 at 02:57:31PM +0200, Ivo van Doorn wrote:
> > On Friday 28 April 2006 00:11, Christoph Hellwig wrote:
> > > On Fri, Apr 28, 2006 at 12:02:52AM +0200, Ivo van Doorn wrote:
> > > > From: Ivo van Doorn <IvDoorn@gmail.com>
> > > >
> > > > Instead of dma_*_coherent
> > > > use pci_*consistent functions.
> > >
> > > No point in doing that, quite reverse as you use the gfp_mask argument
> > > which is a (small) pessimation here.
> >
> > Would it be recommended that I replace the usb_alloc_buffers in the
> > rt2570 driver with dma_*coherent?
> > This would get the dma rings allocation and freeing a bit more generic
> > between PCI and USB and could reduce some duplicate code between them.
> > But I am not sure if there is any major difference between the two.
>
> I don't have the full code for your driver anywhere near me so I can't
> comment on this. Maybe you could send the code of 'usb_alloc_buffers'
> for comments?
Below is the function of the rt2500usb_alloc_ring, it works very similar
to the pci equivalent, except that urbs are allocated and usb_buffer_alloc is used.
The data_ring structure where the information is stored in is also the same as
used in the pci driver.
Basicly what I want to do is move the urbs to somewhere else,
the data_ring structure has been very generic, and the only real difference
between the pci and usb version of the data_entry has been the urb structure pointer.
If the usb_buffer_* calls could be replaced by dma_*coherent a lot
of duplicate code in the pci and usb drivers could be moved into
a seperate header or source file.
struct data_ring{
/*
* net_device where this ring belongs to.
*/
struct net_device *net_dev;
/*
* Work structure for bottom half interrupt handling.
*/
struct work_struct irq_work;
/*
* Base address for the device specific data entries.
*/
void *entry;
/*
* TX queue statistic info.
*/
struct ieee80211_tx_queue_stats_data stats;
/*
* TX Queue parameters.
*/
struct ieee80211_tx_queue_params tx_params;
/*
* Base address for data ring.
*/
dma_addr_t data_dma;
void *data_addr;
/*
* Index variables.
*/
u8 index;
u8 index_done;
/*
* Size of device specific data entry structure.
*/
u16 entry_size;
/*
* Size of packet and descriptor in bytes.
*/
u16 data_size;
u16 desc_size;
} __attribute__ ((packed));
static int
rt2500usb_alloc_ring(
struct rt2x00_usb *rt2x00usb,
struct data_ring *ring,
void (*handler)(void *),
const u16 max_entries,
const u16 data_size,
const u16 desc_size)
{
struct data_entry *entry;
u8 counter;
int status;
/*
*Set device structure.
*/
ring->net_dev = usb_get_intfdata(rt2x00usb->usb_intf);
/*
* Initialize work structure for deferred work.
*/
INIT_WORK(&ring->irq_work, handler, ring);
/*
* Initialize ring parameters.
*/
ring->tx_params.aifs = 2;
ring->tx_params.cw_min = 5; /* cw_min: 2^5 = 32. */
ring->tx_params.cw_max = 10; /* cw_max: 2^10 = 1024. */
rt2x00_ring_index_clear(ring);
ring->stats.limit = max_entries;
ring->entry_size = sizeof(struct data_entry);
ring->data_size = data_size;
ring->desc_size = desc_size;
/*
* Allocate all ring entries.
*/
ring->entry = kmalloc(ring->stats.limit * ring->entry_size,
GFP_KERNEL);
if (!ring->entry)
return -ENOMEM;
/*
* Allocate DMA memory for descriptor and buffer.
*/
ring->data_addr = usb_buffer_alloc(
interface_to_usbdev(rt2x00usb->usb_intf),
rt2x00_get_ring_size(ring), GFP_KERNEL, &ring->data_dma);
if (!ring->data_addr) {
kfree(ring->entry);
return -ENOMEM;
}
/*
* Initialize all ring entries to contain valid
* addresses.
*/
status = 0;
entry = ring->entry;
for (counter = 0; counter < ring->stats.limit; counter++) {
entry[counter].ring = ring;
if (!status)
entry[counter].urb = usb_alloc_urb(0, GFP_KERNEL);
else
entry[counter].urb = NULL;
if (!entry[counter].urb)
status = -ENOMEM;
entry[counter].skb = NULL;
entry[counter].data_addr = ring->data_addr
+ (counter * ring->desc_size)
+ (counter * ring->data_size);
entry[counter].data_dma = ring->data_dma
+ (counter * ring->desc_size)
+ (counter * ring->data_size);
}
return status;
}
static void
rt2500usb_free_ring(struct rt2x00_usb *rt2x00usb, struct data_ring *ring)
{
struct data_entry *entry;
u8 counter;
if (!ring->entry)
goto exit;
entry = ring->entry;
for (counter = 0; counter < ring->stats.limit; counter++) {
usb_kill_urb(entry[counter].urb);
usb_free_urb(entry[counter].urb);
}
kfree(ring->entry);
ring->entry = NULL;
exit:
if (ring->data_addr)
usb_buffer_free(
interface_to_usbdev(rt2x00usb->usb_intf),
rt2x00_get_ring_size(ring), ring->data_addr,
ring->data_dma);
ring->data_addr = NULL;
}
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
next prev parent reply other threads:[~2006-04-28 13:23 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-27 22:02 [PATCH 3/32] rt2x00: use pci_*_consistent for DMA mapping Ivo van Doorn
2006-04-27 22:11 ` Christoph Hellwig
2006-04-28 12:57 ` Ivo van Doorn
2006-04-28 13:15 ` Christoph Hellwig
2006-04-28 13:24 ` Ivo van Doorn [this message]
2006-04-28 13:33 ` Michael Buesch
2006-04-28 13:39 ` Ivo van Doorn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200604281524.11670.IvDoorn@gmail.com \
--to=ivdoorn@gmail.com \
--cc=hch@infradead.org \
--cc=netdev@vger.kernel.org \
--cc=rt2x00-devel@lfcorreia.dyndns.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is 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).