On Fri, 13 Mar 2009 01:19:50 +0900 (JST), Atsushi Nemoto <anemo@xxxxxxxxxxxxx> wrote: > Subject: dmaengine: Use chan_id provided by DMA device driver > From: Atsushi Nemoto <anemo@xxxxxxxxxxxxx> > > If chan_id was already given by the DMA device driver, use it. > Otherwise assign an incremental number for each channels. > > This allows the DMA device driver to reserve some channel ID numbers. ... > @@ -663,7 +664,9 @@ int dma_async_device_register(struct dma_device *device) > continue; > } > > - chan->chan_id = chancnt++; > + if (!chan->chan_id) > + chan->chan_id = chan_id++; > + chancnt++; > chan->dev->device.class = &dma_devclass; > chan->dev->device.parent = device->dev; > chan->dev->chan = chan; This patch will fix another potential problem. Some driver, for example ipu, assumes chan_id is an index of its internal array. But dmaengine core does not guarantee it. /* represent channels in sysfs. Probably want devs too */ list_for_each_entry(chan, &device->channels, device_node) { chan->local = alloc_percpu(typeof(*chan->local)); if (chan->local == NULL) continue; chan->dev = kzalloc(sizeof(*chan->dev), GFP_KERNEL); if (chan->dev == NULL) { free_percpu(chan->local); continue; } chan->chan_id = chancnt++; ... } device->chancnt = chancnt; If alloc_percpu or kzalloc failed, chan_id does not match with its position in device->channels list. And above "continue" looks buggy anyway. Keeping incomplete channels in device->channels list looks very dangerous... --- Atsushi Nemoto