From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3DF2C15EFA8; Wed, 24 Apr 2024 16:48:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713977341; cv=none; b=h5HWBQy9YJT3yjs2jtIKk3noF5h1PHZ/KG7XLZ4/fKcVA8lL/nXIFBbnEaZo/+9SJvu7d4Dg78l3SGgj0OwBZwxAh432PY3RhhbcvGv+by4+KSoXGt/52bIekNg0xp9iOCNPgbZM5zR1iMKbb+ouCzGhtWwWPSYdcjTxaHvWPT4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713977341; c=relaxed/simple; bh=Ua5ky056Ng1orbaDXSxPSN/kDK2nlq4z8xKFe7dc1P4=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=eK3L+tKltHRixLJ9GlTXeWFnRP6KIXMzZpIwTbMBRSGwSEP3JVTGgRoJSu8BInbWndH6WnXmHFspCBOto33splEy8PWZDE90IxxXZytc0+MihCPyUklFOChwuiwpTnL5ubtfC4cQhSntRqvDobB3sdKTylKighEA5Ew4ruS70/Q= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b=ciSw7ETa; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b="ciSw7ETa" Received: from smtpclient.apple (d66-183-91-182.bchsia.telus.net [66.183.91.182]) by linux.microsoft.com (Postfix) with ESMTPSA id 995C3210DEAF; Wed, 24 Apr 2024 09:48:50 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 995C3210DEAF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1713977332; bh=ksvEFN4skua8jbUiYLns9bHtKk/4wlRJ+9aDRVo11t0=; h=Subject:From:In-Reply-To:Date:Cc:References:To:From; b=ciSw7ETabS09FzB+vGI71vmglWivC+oa0cVPt+dd7Ss0SZ0HwcyxZuoiQNcNF5q63 OU2Zc9ReY3eu79e9oV3MgK0cJNYFO81GC/JgqkwsQSP1lBPHUmLKsrrY/5zP4NZf0t VIf6IyFitxO7pk98vq37Kg2gLGbiD7QpB6ZXnzWA= Content-Type: text/plain; charset=utf-8 Precedence: bulk X-Mailing-List: asahi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3774.500.171.1.1\)) Subject: Re: [PATCH 8/9] drivers/media/*: Convert from tasklet to BH workqueue From: Allen Pais In-Reply-To: Date: Wed, 24 Apr 2024 09:48:38 -0700 Cc: Linux Kernel Mailing List , Tejun Heo , Kees Cook , Vinod Koul , marcan@marcan.st, sven@svenpeter.dev, florian.fainelli@broadcom.com, Ray Jui , Scott Branden , Paul Cercueil , Eugeniy.Paltsev@synopsys.com, manivannan.sadhasivam@linaro.org, Viresh Kumar , Frank.Li@nxp.com, Leo Li , zw@zh-kernel.org, Zhou Wang , haijie1@huawei.com, Shawn Guo , Sascha Hauer , Sean Wang , Matthias Brugger , angelogioacchino.delregno@collabora.com, =?utf-8?Q?Andreas_F=C3=A4rber?= , Logan Gunthorpe , Daniel Mack , Haojian Zhuang , Robert Jarzmik , andersson@kernel.org, konrad.dybcio@linaro.org, Orson Zhai , baolin.wang@linux.alibaba.com, Lyra Zhang , Patrice CHOTARD , Linus Walleij , Chen-Yu Tsai , =?utf-8?Q?Jernej_=C5=A0krabec?= , peter.ujfalusi@gmail.com, kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, jassisinghbrar@gmail.com, mchehab@kernel.org, maintainers@bluecherrydvr.com, aubin.constans@microchip.com, ulf.hansson@linaro.org, manuel.lauss@gmail.com, mirq-linux@rere.qmqm.pl, jh80.chung@samsung.com, oakad@yahoo.com, hayashi.kunihiko@socionext.com, mhiramat@kernel.org, brucechang@via.com.tw, HaraldWelte@viatech.com, pierre@ossman.eu, duncan.sands@free.fr, stern@rowland.harvard.edu, oneukum@suse.com, openipmi-developer@lists.sourceforge.net, dmaengine@vger.kernel.org, asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-rpi-kernel@lists.infradead.org, linux-mips@vger.kernel.org, imx@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-mediatek@lists.infradead.org, linux-actions@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-tegra@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-rdma@vger.kernel.org, linux-media@vger.kernel.org, linux-mmc@vger.kernel.org, linux-omap@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-s390@vger.kernel.org, netdev@vger.kernel.org, linux-usb@vger.kernel.org Content-Transfer-Encoding: quoted-printable Message-Id: <17140C44-9803-4556-B216-12D1ECF30432@linux.microsoft.com> References: <20240327160314.9982-1-apais@linux.microsoft.com> <20240327160314.9982-9-apais@linux.microsoft.com> To: Hans Verkuil X-Mailer: Apple Mail (2.3774.500.171.1.1) > On Apr 24, 2024, at 2:12=E2=80=AFAM, Hans Verkuil = wrote: >=20 > On 27/03/2024 17:03, Allen Pais wrote: >> The only generic interface to execute asynchronously in the BH = context is >> tasklet; however, it's marked deprecated and has some design flaws. = To >> replace tasklets, BH workqueue support was recently added. A BH = workqueue >> behaves similarly to regular workqueues except that the queued work = items >> are executed in the BH context. >>=20 >> This patch converts drivers/media/* from tasklet to BH workqueue. >>=20 >> Based on the work done by Tejun Heo >> Branch: https://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git = for-6.10 >>=20 >> Signed-off-by: Allen Pais >> --- >> drivers/media/pci/bt8xx/bt878.c | 8 ++-- >> drivers/media/pci/bt8xx/bt878.h | 3 +- >> drivers/media/pci/bt8xx/dvb-bt8xx.c | 9 ++-- >> drivers/media/pci/ddbridge/ddbridge.h | 3 +- >> drivers/media/pci/mantis/hopper_cards.c | 2 +- >> drivers/media/pci/mantis/mantis_cards.c | 2 +- >> drivers/media/pci/mantis/mantis_common.h | 3 +- >> drivers/media/pci/mantis/mantis_dma.c | 5 ++- >> drivers/media/pci/mantis/mantis_dma.h | 2 +- >> drivers/media/pci/mantis/mantis_dvb.c | 12 +++--- >> drivers/media/pci/ngene/ngene-core.c | 23 ++++++----- >> drivers/media/pci/ngene/ngene.h | 5 ++- >> drivers/media/pci/smipcie/smipcie-main.c | 18 ++++---- >> drivers/media/pci/smipcie/smipcie.h | 3 +- >> drivers/media/pci/ttpci/budget-av.c | 3 +- >> drivers/media/pci/ttpci/budget-ci.c | 27 ++++++------ >> drivers/media/pci/ttpci/budget-core.c | 10 ++--- >> drivers/media/pci/ttpci/budget.h | 5 ++- >> drivers/media/pci/tw5864/tw5864-core.c | 2 +- >> drivers/media/pci/tw5864/tw5864-video.c | 13 +++--- >> drivers/media/pci/tw5864/tw5864.h | 7 ++-- >> drivers/media/platform/intel/pxa_camera.c | 15 +++---- >> drivers/media/platform/marvell/mcam-core.c | 11 ++--- >> drivers/media/platform/marvell/mcam-core.h | 3 +- >> .../st/sti/c8sectpfe/c8sectpfe-core.c | 15 +++---- >> .../st/sti/c8sectpfe/c8sectpfe-core.h | 2 +- >> drivers/media/radio/wl128x/fmdrv.h | 7 ++-- >> drivers/media/radio/wl128x/fmdrv_common.c | 41 = ++++++++++--------- >> drivers/media/rc/mceusb.c | 2 +- >> drivers/media/usb/ttusb-dec/ttusb_dec.c | 21 +++++----- >> 30 files changed, 151 insertions(+), 131 deletions(-) >>=20 >> diff --git a/drivers/media/pci/bt8xx/bt878.c = b/drivers/media/pci/bt8xx/bt878.c >> index 90972d6952f1..983ec29108f0 100644 >> --- a/drivers/media/pci/bt8xx/bt878.c >> +++ b/drivers/media/pci/bt8xx/bt878.c >> @@ -300,8 +300,8 @@ static irqreturn_t bt878_irq(int irq, void = *dev_id) >> } >> if (astat & BT878_ARISCI) { >> bt->finished_block =3D (stat & BT878_ARISCS) >> = 28; >> - if (bt->tasklet.callback) >> - tasklet_schedule(&bt->tasklet); >> + if (bt->work.func) >> + queue_work(system_bh_wq, >=20 > I stopped reviewing here: this clearly has not been compile tested. >=20 > Also please check the patch with 'checkpatch.pl --strict' and fix the = reported issues. >=20 > Regards, >=20 > Hans Hans, Thanks for taking the time out to review. This was a mistake, I sent = out a v2 which had This fixed. I am working on v3 based on some of the comments I received = recently. Will Appreciate your review when it is sent out. Allen >=20 >> break; >> } >> count++; >> @@ -478,8 +478,8 @@ static int bt878_probe(struct pci_dev *dev, const = struct pci_device_id *pci_id) >> btwrite(0, BT878_AINT_MASK); >> bt878_num++; >>=20 >> - if (!bt->tasklet.func) >> - tasklet_disable(&bt->tasklet); >> + if (!bt->work.func) >> + disable_work_sync(&bt->work); >>=20 >> return 0; >>=20 >> diff --git a/drivers/media/pci/bt8xx/bt878.h = b/drivers/media/pci/bt8xx/bt878.h >> index fde8db293c54..b9ce78e5116b 100644 >> --- a/drivers/media/pci/bt8xx/bt878.h >> +++ b/drivers/media/pci/bt8xx/bt878.h >> @@ -14,6 +14,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include "bt848.h" >> #include "bttv.h" >> @@ -120,7 +121,7 @@ struct bt878 { >> dma_addr_t risc_dma; >> u32 risc_pos; >>=20 >> - struct tasklet_struct tasklet; >> + struct work_struct work; >> int shutdown; >> }; >>=20 >> diff --git a/drivers/media/pci/bt8xx/dvb-bt8xx.c = b/drivers/media/pci/bt8xx/dvb-bt8xx.c >> index 390cbba6c065..8c0e1fa764a4 100644 >> --- a/drivers/media/pci/bt8xx/dvb-bt8xx.c >> +++ b/drivers/media/pci/bt8xx/dvb-bt8xx.c >> @@ -15,6 +15,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >> #include >> @@ -39,9 +40,9 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); >>=20 >> #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ >>=20 >> -static void dvb_bt8xx_task(struct tasklet_struct *t) >> +static void dvb_bt8xx_task(struct work_struct *t) >> { >> - struct bt878 *bt =3D from_tasklet(bt, t, tasklet); >> + struct bt878 *bt =3D from_work(bt, t, work); >> struct dvb_bt8xx_card *card =3D = dev_get_drvdata(&bt->adapter->dev); >>=20 >> dprintk("%d\n", card->bt->finished_block); >> @@ -782,7 +783,7 @@ static int dvb_bt8xx_load_card(struct = dvb_bt8xx_card *card, u32 type) >> goto err_disconnect_frontend; >> } >>=20 >> - tasklet_setup(&card->bt->tasklet, dvb_bt8xx_task); >> + INIT_WORK(&card->bt->work, dvb_bt8xx_task); >>=20 >> frontend_init(card, type); >>=20 >> @@ -922,7 +923,7 @@ static void dvb_bt8xx_remove(struct = bttv_sub_device *sub) >> dprintk("dvb_bt8xx: unloading card%d\n", card->bttv_nr); >>=20 >> bt878_stop(card->bt); >> - tasklet_kill(&card->bt->tasklet); >> + cancel_work_sync(&card->bt->work); >> dvb_net_release(&card->dvbnet); >> card->demux.dmx.remove_frontend(&card->demux.dmx, = &card->fe_mem); >> card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw); >> diff --git a/drivers/media/pci/ddbridge/ddbridge.h = b/drivers/media/pci/ddbridge/ddbridge.h >> index f3699dbd193f..037d1d13ef0f 100644 >> --- a/drivers/media/pci/ddbridge/ddbridge.h >> +++ b/drivers/media/pci/ddbridge/ddbridge.h >> @@ -35,6 +35,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >> #include >> @@ -298,7 +299,7 @@ struct ddb_link { >> spinlock_t lock; /* lock link access */ >> struct mutex flash_mutex; /* lock flash access */ >> struct ddb_lnb lnb; >> - struct tasklet_struct tasklet; >> + struct work_struct work; >> struct ddb_ids ids; >>=20 >> spinlock_t temp_lock; /* lock temp chip access */ >> diff --git a/drivers/media/pci/mantis/hopper_cards.c = b/drivers/media/pci/mantis/hopper_cards.c >> index c0bd5d7e148b..869ea88c4893 100644 >> --- a/drivers/media/pci/mantis/hopper_cards.c >> +++ b/drivers/media/pci/mantis/hopper_cards.c >> @@ -116,7 +116,7 @@ static irqreturn_t hopper_irq_handler(int irq, = void *dev_id) >> if (stat & MANTIS_INT_RISCI) { >> dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]); >> mantis->busy_block =3D (stat & MANTIS_INT_RISCSTAT) >> = 28; >> - tasklet_schedule(&mantis->tasklet); >> + queue_work(system_bh_wq, &mantis->work); >> } >> if (stat & MANTIS_INT_I2CDONE) { >> dprintk(MANTIS_DEBUG, 0, "<%s>", label[9]); >> diff --git a/drivers/media/pci/mantis/mantis_cards.c = b/drivers/media/pci/mantis/mantis_cards.c >> index 906e4500d87d..cb124b19e36e 100644 >> --- a/drivers/media/pci/mantis/mantis_cards.c >> +++ b/drivers/media/pci/mantis/mantis_cards.c >> @@ -125,7 +125,7 @@ static irqreturn_t mantis_irq_handler(int irq, = void *dev_id) >> if (stat & MANTIS_INT_RISCI) { >> dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]); >> mantis->busy_block =3D (stat & MANTIS_INT_RISCSTAT) >> = 28; >> - tasklet_schedule(&mantis->tasklet); >> + queue_work(system_bh_wq, &mantis->work); >> } >> if (stat & MANTIS_INT_I2CDONE) { >> dprintk(MANTIS_DEBUG, 0, "<%s>", label[9]); >> diff --git a/drivers/media/pci/mantis/mantis_common.h = b/drivers/media/pci/mantis/mantis_common.h >> index d88ac280226c..f2247148f268 100644 >> --- a/drivers/media/pci/mantis/mantis_common.h >> +++ b/drivers/media/pci/mantis/mantis_common.h >> @@ -12,6 +12,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include "mantis_reg.h" >> #include "mantis_uart.h" >> @@ -125,7 +126,7 @@ struct mantis_pci { >> __le32 *risc_cpu; >> dma_addr_t risc_dma; >>=20 >> - struct tasklet_struct tasklet; >> + struct work_struct work; >> spinlock_t intmask_lock; >>=20 >> struct i2c_adapter adapter; >> diff --git a/drivers/media/pci/mantis/mantis_dma.c = b/drivers/media/pci/mantis/mantis_dma.c >> index 80c843936493..c85f9b84a2c6 100644 >> --- a/drivers/media/pci/mantis/mantis_dma.c >> +++ b/drivers/media/pci/mantis/mantis_dma.c >> @@ -15,6 +15,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >> #include >> @@ -200,9 +201,9 @@ void mantis_dma_stop(struct mantis_pci *mantis) >> } >>=20 >>=20 >> -void mantis_dma_xfer(struct tasklet_struct *t) >> +void mantis_dma_xfer(struct work_struct *t) >> { >> - struct mantis_pci *mantis =3D from_tasklet(mantis, t, tasklet); >> + struct mantis_pci *mantis =3D from_work(mantis, t, work); >> struct mantis_hwconfig *config =3D mantis->hwconfig; >>=20 >> while (mantis->last_block !=3D mantis->busy_block) { >> diff --git a/drivers/media/pci/mantis/mantis_dma.h = b/drivers/media/pci/mantis/mantis_dma.h >> index 37da982c9c29..5db0d3728f15 100644 >> --- a/drivers/media/pci/mantis/mantis_dma.h >> +++ b/drivers/media/pci/mantis/mantis_dma.h >> @@ -13,6 +13,6 @@ extern int mantis_dma_init(struct mantis_pci = *mantis); >> extern int mantis_dma_exit(struct mantis_pci *mantis); >> extern void mantis_dma_start(struct mantis_pci *mantis); >> extern void mantis_dma_stop(struct mantis_pci *mantis); >> -extern void mantis_dma_xfer(struct tasklet_struct *t); >> +extern void mantis_dma_xfer(struct work_struct *t); >>=20 >> #endif /* __MANTIS_DMA_H */ >> diff --git a/drivers/media/pci/mantis/mantis_dvb.c = b/drivers/media/pci/mantis/mantis_dvb.c >> index c7ba4a76e608..f640635de170 100644 >> --- a/drivers/media/pci/mantis/mantis_dvb.c >> +++ b/drivers/media/pci/mantis/mantis_dvb.c >> @@ -105,7 +105,7 @@ static int mantis_dvb_start_feed(struct = dvb_demux_feed *dvbdmxfeed) >> if (mantis->feeds =3D=3D 1) { >> dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma"); >> mantis_dma_start(mantis); >> - tasklet_enable(&mantis->tasklet); >> + enable_and_queue_work(system_bh_wq, &mantis->work); >> } >>=20 >> return mantis->feeds; >> @@ -125,7 +125,7 @@ static int mantis_dvb_stop_feed(struct = dvb_demux_feed *dvbdmxfeed) >> mantis->feeds--; >> if (mantis->feeds =3D=3D 0) { >> dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma"); >> - tasklet_disable(&mantis->tasklet); >> + disable_work_sync(&mantis->work); >> mantis_dma_stop(mantis); >> } >>=20 >> @@ -205,8 +205,8 @@ int mantis_dvb_init(struct mantis_pci *mantis) >> } >>=20 >> dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, = &mantis->demux.dmx); >> - tasklet_setup(&mantis->tasklet, mantis_dma_xfer); >> - tasklet_disable(&mantis->tasklet); >> + INIT_WORK(&mantis->bh, mantis_dma_xfer); >> + disable_work_sync(&mantis->work); >> if (mantis->hwconfig) { >> result =3D config->frontend_init(mantis, mantis->fe); >> if (result < 0) { >> @@ -235,7 +235,7 @@ int mantis_dvb_init(struct mantis_pci *mantis) >>=20 >> /* Error conditions .. */ >> err5: >> - tasklet_kill(&mantis->tasklet); >> + cancel_work_sync(&mantis->work); >> dvb_net_release(&mantis->dvbnet); >> if (mantis->fe) { >> dvb_unregister_frontend(mantis->fe); >> @@ -273,7 +273,7 @@ int mantis_dvb_exit(struct mantis_pci *mantis) >> dvb_frontend_detach(mantis->fe); >> } >>=20 >> - tasklet_kill(&mantis->tasklet); >> + cancel_work_sync(&mantis->work); >> dvb_net_release(&mantis->dvbnet); >>=20 >> mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, = &mantis->fe_mem); >> diff --git a/drivers/media/pci/ngene/ngene-core.c = b/drivers/media/pci/ngene/ngene-core.c >> index 7481f553f959..5211d6796748 100644 >> --- a/drivers/media/pci/ngene/ngene-core.c >> +++ b/drivers/media/pci/ngene/ngene-core.c >> @@ -21,6 +21,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include "ngene.h" >>=20 >> @@ -50,9 +51,9 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); >> /* nGene interrupt handler = **************************************************/ >> = /*************************************************************************= ***/ >>=20 >> -static void event_tasklet(struct tasklet_struct *t) >> +static void event_work(struct work_struct *t) >> { >> - struct ngene *dev =3D from_tasklet(dev, t, event_tasklet); >> + struct ngene *dev =3D from_work(dev, t, event_work); >>=20 >> while (dev->EventQueueReadIndex !=3D dev->EventQueueWriteIndex) = { >> struct EVENT_BUFFER Event =3D >> @@ -68,9 +69,9 @@ static void event_tasklet(struct tasklet_struct *t) >> } >> } >>=20 >> -static void demux_tasklet(struct tasklet_struct *t) >> +static void demux_work(struct work_struct *t) >> { >> - struct ngene_channel *chan =3D from_tasklet(chan, t, = demux_tasklet); >> + struct ngene_channel *chan =3D from_work(chan, t, demux_work); >> struct device *pdev =3D &chan->dev->pci_dev->dev; >> struct SBufferHeader *Cur =3D chan->nextBuffer; >>=20 >> @@ -204,7 +205,7 @@ static irqreturn_t irq_handler(int irq, void = *dev_id) >> dev->EventQueueOverflowFlag =3D 1; >> } >> dev->EventBuffer->EventStatus &=3D ~0x80; >> - tasklet_schedule(&dev->event_tasklet); >> + queue_work(system_bh_wq, &dev->event_work); >> rc =3D IRQ_HANDLED; >> } >>=20 >> @@ -217,8 +218,8 @@ static irqreturn_t irq_handler(int irq, void = *dev_id) >> ngeneBuffer.SR.Flags & 0xC0) =3D=3D 0x80) { >> dev->channel[i].nextBuffer-> >> ngeneBuffer.SR.Flags |=3D 0x40; >> - tasklet_schedule( >> - &dev->channel[i].demux_tasklet); >> + queue_work(system_bh_wq, >> + &dev->channel[i].demux_work); >> rc =3D IRQ_HANDLED; >> } >> } >> @@ -1181,7 +1182,7 @@ static void ngene_init(struct ngene *dev) >> struct device *pdev =3D &dev->pci_dev->dev; >> int i; >>=20 >> - tasklet_setup(&dev->event_tasklet, event_tasklet); >> + INIT_WORK(&dev->event_work, event_work); >>=20 >> memset_io(dev->iomem + 0xc000, 0x00, 0x220); >> memset_io(dev->iomem + 0xc400, 0x00, 0x100); >> @@ -1395,7 +1396,7 @@ static void release_channel(struct = ngene_channel *chan) >> if (chan->running) >> set_transfer(chan, 0); >>=20 >> - tasklet_kill(&chan->demux_tasklet); >> + cancel_work_sync(&chan->demux_work); >>=20 >> if (chan->ci_dev) { >> dvb_unregister_device(chan->ci_dev); >> @@ -1445,7 +1446,7 @@ static int init_channel(struct ngene_channel = *chan) >> struct ngene_info *ni =3D dev->card_info; >> int io =3D ni->io_type[nr]; >>=20 >> - tasklet_setup(&chan->demux_tasklet, demux_tasklet); >> + INIT_WORK(&chan->demux_work, demux_work); >> chan->users =3D 0; >> chan->type =3D io; >> chan->mode =3D chan->type; /* for now only one mode */ >> @@ -1647,7 +1648,7 @@ void ngene_remove(struct pci_dev *pdev) >> struct ngene *dev =3D pci_get_drvdata(pdev); >> int i; >>=20 >> - tasklet_kill(&dev->event_tasklet); >> + cancel_work_sync(&dev->event_work); >> for (i =3D MAX_STREAM - 1; i >=3D 0; i--) >> release_channel(&dev->channel[i]); >> if (dev->ci.en) >> diff --git a/drivers/media/pci/ngene/ngene.h = b/drivers/media/pci/ngene/ngene.h >> index d1d7da84cd9d..c2a23f6dbe09 100644 >> --- a/drivers/media/pci/ngene/ngene.h >> +++ b/drivers/media/pci/ngene/ngene.h >> @@ -16,6 +16,7 @@ >> #include >>=20 >> #include >> +#include >>=20 >> #include >> #include >> @@ -621,7 +622,7 @@ struct ngene_channel { >> int users; >> struct video_device *v4l_dev; >> struct dvb_device *ci_dev; >> - struct tasklet_struct demux_tasklet; >> + struct work_struct demux_work; >>=20 >> struct SBufferHeader *nextBuffer; >> enum KSSTATE State; >> @@ -717,7 +718,7 @@ struct ngene { >> struct EVENT_BUFFER EventQueue[EVENT_QUEUE_SIZE]; >> int EventQueueOverflowCount; >> int EventQueueOverflowFlag; >> - struct tasklet_struct event_tasklet; >> + struct work_struct event_work; >> struct EVENT_BUFFER *EventBuffer; >> int EventQueueWriteIndex; >> int EventQueueReadIndex; >> diff --git a/drivers/media/pci/smipcie/smipcie-main.c = b/drivers/media/pci/smipcie/smipcie-main.c >> index 0c300d019d9c..7da6bb55660b 100644 >> --- a/drivers/media/pci/smipcie/smipcie-main.c >> +++ b/drivers/media/pci/smipcie/smipcie-main.c >> @@ -279,10 +279,10 @@ static void smi_port_clearInterrupt(struct = smi_port *port) >> (port->_dmaInterruptCH0 | port->_dmaInterruptCH1)); >> } >>=20 >> -/* tasklet handler: DMA data to dmx.*/ >> -static void smi_dma_xfer(struct tasklet_struct *t) >> +/* work handler: DMA data to dmx.*/ >> +static void smi_dma_xfer(struct work_struct *t) >> { >> - struct smi_port *port =3D from_tasklet(port, t, tasklet); >> + struct smi_port *port =3D from_work(port, t, work); >> struct smi_dev *dev =3D port->dev; >> u32 intr_status, finishedData, dmaManagement; >> u8 dmaChan0State, dmaChan1State; >> @@ -426,8 +426,8 @@ static int smi_port_init(struct smi_port *port, = int dmaChanUsed) >> } >>=20 >> smi_port_disableInterrupt(port); >> - tasklet_setup(&port->tasklet, smi_dma_xfer); >> - tasklet_disable(&port->tasklet); >> + INIT_WORK(&port->work, smi_dma_xfer); >> + disable_work_sync(&port->work); >> port->enable =3D 1; >> return 0; >> err: >> @@ -438,7 +438,7 @@ static int smi_port_init(struct smi_port *port, = int dmaChanUsed) >> static void smi_port_exit(struct smi_port *port) >> { >> smi_port_disableInterrupt(port); >> - tasklet_kill(&port->tasklet); >> + cancel_work_sync(&port->work); >> smi_port_dma_free(port); >> port->enable =3D 0; >> } >> @@ -452,7 +452,7 @@ static int smi_port_irq(struct smi_port *port, = u32 int_status) >> smi_port_disableInterrupt(port); >> port->_int_status =3D int_status; >> smi_port_clearInterrupt(port); >> - tasklet_schedule(&port->tasklet); >> + queue_work(system_bh_wq, &port->work); >> handled =3D 1; >> } >> return handled; >> @@ -823,7 +823,7 @@ static int smi_start_feed(struct dvb_demux_feed = *dvbdmxfeed) >> smi_port_clearInterrupt(port); >> smi_port_enableInterrupt(port); >> smi_write(port->DMA_MANAGEMENT, dmaManagement); >> - tasklet_enable(&port->tasklet); >> + enable_and_queue_work(system_bh_wq, &port->work); >> } >> return port->users; >> } >> @@ -837,7 +837,7 @@ static int smi_stop_feed(struct dvb_demux_feed = *dvbdmxfeed) >> if (--port->users) >> return port->users; >>=20 >> - tasklet_disable(&port->tasklet); >> + disable_work_sync(&port->work); >> smi_port_disableInterrupt(port); >> smi_clear(port->DMA_MANAGEMENT, 0x30003); >> return 0; >> diff --git a/drivers/media/pci/smipcie/smipcie.h = b/drivers/media/pci/smipcie/smipcie.h >> index 2b5e0154814c..f124d2cdead6 100644 >> --- a/drivers/media/pci/smipcie/smipcie.h >> +++ b/drivers/media/pci/smipcie/smipcie.h >> @@ -17,6 +17,7 @@ >> #include >> #include >> #include >> +#include >> #include >>=20 >> #include >> @@ -257,7 +258,7 @@ struct smi_port { >> u32 _dmaInterruptCH0; >> u32 _dmaInterruptCH1; >> u32 _int_status; >> - struct tasklet_struct tasklet; >> + struct work_struct work; >> /* dvb */ >> struct dmx_frontend hw_frontend; >> struct dmx_frontend mem_frontend; >> diff --git a/drivers/media/pci/ttpci/budget-av.c = b/drivers/media/pci/ttpci/budget-av.c >> index a47c5850ef87..6e43b1a01191 100644 >> --- a/drivers/media/pci/ttpci/budget-av.c >> +++ b/drivers/media/pci/ttpci/budget-av.c >> @@ -37,6 +37,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >>=20 >> @@ -55,7 +56,7 @@ struct budget_av { >> struct video_device vd; >> int cur_input; >> int has_saa7113; >> - struct tasklet_struct ciintf_irq_tasklet; >> + struct work_struct ciintf_irq_work; >> int slot_status; >> struct dvb_ca_en50221 ca; >> u8 reinitialise_demod:1; >> diff --git a/drivers/media/pci/ttpci/budget-ci.c = b/drivers/media/pci/ttpci/budget-ci.c >> index 66e1a004ee43..11e0ed62707e 100644 >> --- a/drivers/media/pci/ttpci/budget-ci.c >> +++ b/drivers/media/pci/ttpci/budget-ci.c >> @@ -17,6 +17,7 @@ >> #include >> #include >> #include >> +#include >> #include >>=20 >> #include "budget.h" >> @@ -80,7 +81,7 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); >>=20 >> struct budget_ci_ir { >> struct rc_dev *dev; >> - struct tasklet_struct msp430_irq_tasklet; >> + struct work_struct msp430_irq_work; >> char name[72]; /* 40 + 32 for (struct saa7146_dev).name */ >> char phys[32]; >> int rc5_device; >> @@ -91,7 +92,7 @@ struct budget_ci_ir { >>=20 >> struct budget_ci { >> struct budget budget; >> - struct tasklet_struct ciintf_irq_tasklet; >> + struct work_struct ciintf_irq_work; >> int slot_status; >> int ci_irq; >> struct dvb_ca_en50221 ca; >> @@ -99,9 +100,9 @@ struct budget_ci { >> u8 tuner_pll_address; /* used for philips_tdm1316l configs */ >> }; >>=20 >> -static void msp430_ir_interrupt(struct tasklet_struct *t) >> +static void msp430_ir_interrupt(struct work_struct *t) >> { >> - struct budget_ci_ir *ir =3D from_tasklet(ir, t, = msp430_irq_tasklet); >> + struct budget_ci_ir *ir =3D from_work(ir, t, msp430_irq_work); >> struct budget_ci *budget_ci =3D container_of(ir, = typeof(*budget_ci), ir); >> struct rc_dev *dev =3D budget_ci->ir.dev; >> u32 command =3D ttpci_budget_debiread(&budget_ci->budget, = DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8; >> @@ -230,7 +231,7 @@ static int msp430_ir_init(struct budget_ci = *budget_ci) >>=20 >> budget_ci->ir.dev =3D dev; >>=20 >> - tasklet_setup(&budget_ci->ir.msp430_irq_tasklet, = msp430_ir_interrupt); >> + INIT_WORK(&budget_ci->ir.msp430_irq_work, msp430_ir_interrupt); >>=20 >> SAA7146_IER_ENABLE(saa, MASK_06); >> saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI); >> @@ -244,7 +245,7 @@ static void msp430_ir_deinit(struct budget_ci = *budget_ci) >>=20 >> SAA7146_IER_DISABLE(saa, MASK_06); >> saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT); >> - tasklet_kill(&budget_ci->ir.msp430_irq_tasklet); >> + cancel_work_sync(&budget_ci->ir.msp430_irq_work); >>=20 >> rc_unregister_device(budget_ci->ir.dev); >> } >> @@ -348,10 +349,10 @@ static int ciintf_slot_ts_enable(struct = dvb_ca_en50221 *ca, int slot) >> return 0; >> } >>=20 >> -static void ciintf_interrupt(struct tasklet_struct *t) >> +static void ciintf_interrupt(struct work_struct *t) >> { >> - struct budget_ci *budget_ci =3D from_tasklet(budget_ci, t, >> - ciintf_irq_tasklet); >> + struct budget_ci *budget_ci =3D from_work(budget_ci, t, >> + ciintf_irq_work); >> struct saa7146_dev *saa =3D budget_ci->budget.dev; >> unsigned int flags; >>=20 >> @@ -492,7 +493,7 @@ static int ciintf_init(struct budget_ci = *budget_ci) >>=20 >> // Setup CI slot IRQ >> if (budget_ci->ci_irq) { >> - tasklet_setup(&budget_ci->ciintf_irq_tasklet, = ciintf_interrupt); >> + INIT_WORK(&budget_ci->ciintf_irq_work, = ciintf_interrupt); >> if (budget_ci->slot_status !=3D SLOTSTATUS_NONE) { >> saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO); >> } else { >> @@ -532,7 +533,7 @@ static void ciintf_deinit(struct budget_ci = *budget_ci) >> if (budget_ci->ci_irq) { >> SAA7146_IER_DISABLE(saa, MASK_03); >> saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT); >> - tasklet_kill(&budget_ci->ciintf_irq_tasklet); >> + cancel_work_sync(&budget_ci->ciintf_irq_work); >> } >>=20 >> // reset interface >> @@ -558,13 +559,13 @@ static void budget_ci_irq(struct saa7146_dev = *dev, u32 * isr) >> dprintk(8, "dev: %p, budget_ci: %p\n", dev, budget_ci); >>=20 >> if (*isr & MASK_06) >> - tasklet_schedule(&budget_ci->ir.msp430_irq_tasklet); >> + queue_work(system_bh_wq, = &budget_ci->ir.msp430_irq_work); >>=20 >> if (*isr & MASK_10) >> ttpci_budget_irq10_handler(dev, isr); >>=20 >> if ((*isr & MASK_03) && (budget_ci->budget.ci_present) && = (budget_ci->ci_irq)) >> - tasklet_schedule(&budget_ci->ciintf_irq_tasklet); >> + queue_work(system_bh_wq, &budget_ci->ciintf_irq_work); >> } >>=20 >> static u8 philips_su1278_tt_inittab[] =3D { >> diff --git a/drivers/media/pci/ttpci/budget-core.c = b/drivers/media/pci/ttpci/budget-core.c >> index 25f44c3eebf3..3443c12dc9f2 100644 >> --- a/drivers/media/pci/ttpci/budget-core.c >> +++ b/drivers/media/pci/ttpci/budget-core.c >> @@ -171,9 +171,9 @@ static int budget_read_fe_status(struct = dvb_frontend *fe, >> return ret; >> } >>=20 >> -static void vpeirq(struct tasklet_struct *t) >> +static void vpeirq(struct work_struct *t) >> { >> - struct budget *budget =3D from_tasklet(budget, t, vpe_tasklet); >> + struct budget *budget =3D from_work(budget, t, vpe_work); >> u8 *mem =3D (u8 *) (budget->grabbing); >> u32 olddma =3D budget->ttbp; >> u32 newdma =3D saa7146_read(budget->dev, PCI_VDP3); >> @@ -520,7 +520,7 @@ int ttpci_budget_init(struct budget *budget, = struct saa7146_dev *dev, >> /* upload all */ >> saa7146_write(dev, GPIO_CTRL, 0x000000); >>=20 >> - tasklet_setup(&budget->vpe_tasklet, vpeirq); >> + INIT_WORK(&budget->vpe_work, vpeirq); >>=20 >> /* frontend power on */ >> if (bi->type !=3D BUDGET_FS_ACTIVY) >> @@ -557,7 +557,7 @@ int ttpci_budget_deinit(struct budget *budget) >>=20 >> budget_unregister(budget); >>=20 >> - tasklet_kill(&budget->vpe_tasklet); >> + cancel_work_sync(&budget->vpe_work); >>=20 >> saa7146_vfree_destroy_pgtable(dev->pci, budget->grabbing, = &budget->pt); >>=20 >> @@ -575,7 +575,7 @@ void ttpci_budget_irq10_handler(struct = saa7146_dev *dev, u32 * isr) >> dprintk(8, "dev: %p, budget: %p\n", dev, budget); >>=20 >> if (*isr & MASK_10) >> - tasklet_schedule(&budget->vpe_tasklet); >> + queue_work(system_bh_wq, &budget->vpe_work); >> } >>=20 >> void ttpci_budget_set_video_port(struct saa7146_dev *dev, int = video_port) >> diff --git a/drivers/media/pci/ttpci/budget.h = b/drivers/media/pci/ttpci/budget.h >> index bd87432e6cde..a3ee75e326b4 100644 >> --- a/drivers/media/pci/ttpci/budget.h >> +++ b/drivers/media/pci/ttpci/budget.h >> @@ -12,6 +12,7 @@ >>=20 >> #include >> #include >> +#include >>=20 >> #include >>=20 >> @@ -49,8 +50,8 @@ struct budget { >> unsigned char *grabbing; >> struct saa7146_pgtable pt; >>=20 >> - struct tasklet_struct fidb_tasklet; >> - struct tasklet_struct vpe_tasklet; >> + struct work_struct fidb_work; >> + struct work_struct vpe_work; >>=20 >> struct dmxdev dmxdev; >> struct dvb_demux demux; >> diff --git a/drivers/media/pci/tw5864/tw5864-core.c = b/drivers/media/pci/tw5864/tw5864-core.c >> index 560ff1ddcc83..a58c268e94a8 100644 >> --- a/drivers/media/pci/tw5864/tw5864-core.c >> +++ b/drivers/media/pci/tw5864/tw5864-core.c >> @@ -144,7 +144,7 @@ static void tw5864_h264_isr(struct tw5864_dev = *dev) >> cur_frame->gop_seqno =3D input->frame_gop_seqno; >>=20 >> dev->h264_buf_w_index =3D next_frame_index; >> - tasklet_schedule(&dev->tasklet); >> + queue_work(system_bh_wq, &dev->work); >>=20 >> cur_frame =3D next_frame; >>=20 >> diff --git a/drivers/media/pci/tw5864/tw5864-video.c = b/drivers/media/pci/tw5864/tw5864-video.c >> index 8b1aae4b6319..ac2249626506 100644 >> --- a/drivers/media/pci/tw5864/tw5864-video.c >> +++ b/drivers/media/pci/tw5864/tw5864-video.c >> @@ -6,6 +6,7 @@ >> */ >>=20 >> #include >> +#include >> #include >> #include >> #include >> @@ -175,7 +176,7 @@ static const unsigned int intra4x4_lambda3[] =3D = { >> static v4l2_std_id tw5864_get_v4l2_std(enum tw5864_vid_std std); >> static enum tw5864_vid_std tw5864_from_v4l2_std(v4l2_std_id = v4l2_std); >>=20 >> -static void tw5864_handle_frame_task(struct tasklet_struct *t); >> +static void tw5864_handle_frame_task(struct work_struct *t); >> static void tw5864_handle_frame(struct tw5864_h264_frame *frame); >> static void tw5864_frame_interval_set(struct tw5864_input *input); >>=20 >> @@ -1062,7 +1063,7 @@ int tw5864_video_init(struct tw5864_dev *dev, = int *video_nr) >> dev->irqmask |=3D TW5864_INTR_VLC_DONE | TW5864_INTR_TIMER; >> tw5864_irqmask_apply(dev); >>=20 >> - tasklet_setup(&dev->tasklet, tw5864_handle_frame_task); >> + INIT_WORK(&dev->work, tw5864_handle_frame_task); >>=20 >> for (i =3D 0; i < TW5864_INPUTS; i++) { >> dev->inputs[i].root =3D dev; >> @@ -1079,7 +1080,7 @@ int tw5864_video_init(struct tw5864_dev *dev, = int *video_nr) >> for (i =3D last_input_nr_registered; i >=3D 0; i--) >> tw5864_video_input_fini(&dev->inputs[i]); >>=20 >> - tasklet_kill(&dev->tasklet); >> + cancel_work_sync(&dev->work); >>=20 >> free_dma: >> for (i =3D last_dma_allocated; i >=3D 0; i--) { >> @@ -1198,7 +1199,7 @@ void tw5864_video_fini(struct tw5864_dev *dev) >> { >> int i; >>=20 >> - tasklet_kill(&dev->tasklet); >> + cancel_work_sync(&dev->work); >>=20 >> for (i =3D 0; i < TW5864_INPUTS; i++) >> tw5864_video_input_fini(&dev->inputs[i]); >> @@ -1315,9 +1316,9 @@ static int tw5864_is_motion_triggered(struct = tw5864_h264_frame *frame) >> return detected; >> } >>=20 >> -static void tw5864_handle_frame_task(struct tasklet_struct *t) >> +static void tw5864_handle_frame_task(struct work_struct *t) >> { >> - struct tw5864_dev *dev =3D from_tasklet(dev, t, tasklet); >> + struct tw5864_dev *dev =3D from_work(dev, t, work); >> unsigned long flags; >> int batch_size =3D H264_BUF_CNT; >>=20 >> diff --git a/drivers/media/pci/tw5864/tw5864.h = b/drivers/media/pci/tw5864/tw5864.h >> index a8b6fbd5b710..278373859098 100644 >> --- a/drivers/media/pci/tw5864/tw5864.h >> +++ b/drivers/media/pci/tw5864/tw5864.h >> @@ -12,6 +12,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >> #include >> @@ -85,7 +86,7 @@ struct tw5864_input { >> int nr; /* input number */ >> struct tw5864_dev *root; >> struct mutex lock; /* used for vidq and vdev */ >> - spinlock_t slock; /* used for sync between ISR, tasklet & V4L2 = API */ >> + spinlock_t slock; /* used for sync between ISR, work & V4L2 API = */ >> struct video_device vdev; >> struct v4l2_ctrl_handler hdl; >> struct vb2_queue vidq; >> @@ -142,7 +143,7 @@ struct tw5864_h264_frame { >>=20 >> /* global device status */ >> struct tw5864_dev { >> - spinlock_t slock; /* used for sync between ISR, tasklet & V4L2 = API */ >> + spinlock_t slock; /* used for sync between ISR, work & V4L2 API = */ >> struct v4l2_device v4l2_dev; >> struct tw5864_input inputs[TW5864_INPUTS]; >> #define H264_BUF_CNT 4 >> @@ -150,7 +151,7 @@ struct tw5864_dev { >> int h264_buf_r_index; >> int h264_buf_w_index; >>=20 >> - struct tasklet_struct tasklet; >> + struct work_struct work; >>=20 >> int encoder_busy; >> /* Input number to check next for ready raw picture (in RR = fashion) */ >> diff --git a/drivers/media/platform/intel/pxa_camera.c = b/drivers/media/platform/intel/pxa_camera.c >> index d904952bf00e..df0a3c559287 100644 >> --- a/drivers/media/platform/intel/pxa_camera.c >> +++ b/drivers/media/platform/intel/pxa_camera.c >> @@ -43,6 +43,7 @@ >> #include >>=20 >> #include >> +#include >>=20 >> #define PXA_CAM_VERSION "0.0.6" >> #define PXA_CAM_DRV_NAME "pxa27x-camera" >> @@ -683,7 +684,7 @@ struct pxa_camera_dev { >> unsigned int buf_sequence; >>=20 >> struct pxa_buffer *active; >> - struct tasklet_struct task_eof; >> + struct work_struct task_eof; >>=20 >> u32 save_cicr[5]; >> }; >> @@ -1146,9 +1147,9 @@ static void pxa_camera_deactivate(struct = pxa_camera_dev *pcdev) >> clk_disable_unprepare(pcdev->clk); >> } >>=20 >> -static void pxa_camera_eof(struct tasklet_struct *t) >> +static void pxa_camera_eof(struct work_struct *t) >> { >> - struct pxa_camera_dev *pcdev =3D from_tasklet(pcdev, t, = task_eof); >> + struct pxa_camera_dev *pcdev =3D from_work(pcdev, t, task_eof); >> unsigned long cifr; >> struct pxa_buffer *buf; >>=20 >> @@ -1185,7 +1186,7 @@ static irqreturn_t pxa_camera_irq(int irq, void = *data) >> if (status & CISR_EOF) { >> cicr0 =3D __raw_readl(pcdev->base + CICR0) | CICR0_EOFM; >> __raw_writel(cicr0, pcdev->base + CICR0); >> - tasklet_schedule(&pcdev->task_eof); >> + queue_work(system_bh_wq, &pcdev->task_eof); >> } >>=20 >> return IRQ_HANDLED; >> @@ -2383,7 +2384,7 @@ static int pxa_camera_probe(struct = platform_device *pdev) >> } >> } >>=20 >> - tasklet_setup(&pcdev->task_eof, pxa_camera_eof); >> + INIT_WORK(&pcdev->task_eof, pxa_camera_eof); >>=20 >> pxa_camera_activate(pcdev); >>=20 >> @@ -2409,7 +2410,7 @@ static int pxa_camera_probe(struct = platform_device *pdev) >> return 0; >> exit_deactivate: >> pxa_camera_deactivate(pcdev); >> - tasklet_kill(&pcdev->task_eof); >> + cancel_work_sync(&pcdev->task_eof); >> exit_free_dma: >> dma_release_channel(pcdev->dma_chans[2]); >> exit_free_dma_u: >> @@ -2428,7 +2429,7 @@ static void pxa_camera_remove(struct = platform_device *pdev) >> struct pxa_camera_dev *pcdev =3D platform_get_drvdata(pdev); >>=20 >> pxa_camera_deactivate(pcdev); >> - tasklet_kill(&pcdev->task_eof); >> + cancel_work_sync(&pcdev->task_eof); >> dma_release_channel(pcdev->dma_chans[0]); >> dma_release_channel(pcdev->dma_chans[1]); >> dma_release_channel(pcdev->dma_chans[2]); >> diff --git a/drivers/media/platform/marvell/mcam-core.c = b/drivers/media/platform/marvell/mcam-core.c >> index 66688b4aece5..d6b96a7039be 100644 >> --- a/drivers/media/platform/marvell/mcam-core.c >> +++ b/drivers/media/platform/marvell/mcam-core.c >> @@ -25,6 +25,7 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -439,9 +440,9 @@ static void mcam_ctlr_dma_vmalloc(struct = mcam_camera *cam) >> /* >> * Copy data out to user space in the vmalloc case >> */ >> -static void mcam_frame_tasklet(struct tasklet_struct *t) >> +static void mcam_frame_work(struct work_struct *t) >> { >> - struct mcam_camera *cam =3D from_tasklet(cam, t, s_tasklet); >> + struct mcam_camera *cam =3D from_work(cam, t, s_work); >> int i; >> unsigned long flags; >> struct mcam_vb_buffer *buf; >> @@ -480,7 +481,7 @@ static void mcam_frame_tasklet(struct = tasklet_struct *t) >>=20 >>=20 >> /* >> - * Make sure our allocated buffers are up to the task. >> + * Make sure our allocated buffers are up to the work. >> */ >> static int mcam_check_dma_buffers(struct mcam_camera *cam) >> { >> @@ -493,7 +494,7 @@ static int mcam_check_dma_buffers(struct = mcam_camera *cam) >>=20 >> static void mcam_vmalloc_done(struct mcam_camera *cam, int frame) >> { >> - tasklet_schedule(&cam->s_tasklet); >> + queue_work(system_bh_wq, &cam->s_work); >> } >>=20 >> #else /* MCAM_MODE_VMALLOC */ >> @@ -1305,7 +1306,7 @@ static int mcam_setup_vb2(struct mcam_camera = *cam) >> break; >> case B_vmalloc: >> #ifdef MCAM_MODE_VMALLOC >> - tasklet_setup(&cam->s_tasklet, mcam_frame_tasklet); >> + INIT_WORK(&cam->s_work, mcam_frame_work); >> vq->ops =3D &mcam_vb2_ops; >> vq->mem_ops =3D &vb2_vmalloc_memops; >> cam->dma_setup =3D mcam_ctlr_dma_vmalloc; >> diff --git a/drivers/media/platform/marvell/mcam-core.h = b/drivers/media/platform/marvell/mcam-core.h >> index 51e66db45af6..0d4b953dbb23 100644 >> --- a/drivers/media/platform/marvell/mcam-core.h >> +++ b/drivers/media/platform/marvell/mcam-core.h >> @@ -9,6 +9,7 @@ >>=20 >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -167,7 +168,7 @@ struct mcam_camera { >> unsigned int dma_buf_size; /* allocated size */ >> void *dma_bufs[MAX_DMA_BUFS]; /* Internal buffer addresses */ >> dma_addr_t dma_handles[MAX_DMA_BUFS]; /* Buffer bus addresses */ >> - struct tasklet_struct s_tasklet; >> + struct work_struct s_work; >> #endif >> unsigned int sequence; /* Frame sequence number */ >> unsigned int buf_seq[MAX_DMA_BUFS]; /* Sequence for individual = bufs */ >> diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c = b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c >> index e4cf27b5a072..22b359569a10 100644 >> --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c >> +++ b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c >> @@ -33,6 +33,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include "c8sectpfe-common.h" >> #include "c8sectpfe-core.h" >> @@ -73,16 +74,16 @@ static void c8sectpfe_timer_interrupt(struct = timer_list *t) >>=20 >> /* is this descriptor initialised and TP enabled */ >> if (channel->irec && readl(channel->irec + = DMA_PRDS_TPENABLE)) >> - tasklet_schedule(&channel->tsklet); >> + queue_work(system_bh_wq, &channel->tsklet); >> } >>=20 >> fei->timer.expires =3D jiffies + = msecs_to_jiffies(POLL_MSECS); >> add_timer(&fei->timer); >> } >>=20 >> -static void channel_swdemux_tsklet(struct tasklet_struct *t) >> +static void channel_swdemux_tsklet(struct work_struct *t) >> { >> - struct channel_info *channel =3D from_tasklet(channel, t, = tsklet); >> + struct channel_info *channel =3D from_work(channel, t, tsklet); >> struct c8sectpfei *fei; >> unsigned long wp, rp; >> int pos, num_packets, n, size; >> @@ -211,7 +212,7 @@ static int c8sectpfe_start_feed(struct = dvb_demux_feed *dvbdmxfeed) >>=20 >> dev_dbg(fei->dev, "Starting channel=3D%p\n", channel); >>=20 >> - tasklet_setup(&channel->tsklet, channel_swdemux_tsklet); >> + INIT_WORK(&channel->tsklet, channel_swdemux_tsklet); >>=20 >> /* Reset the internal inputblock sram pointers */ >> writel(channel->fifo, >> @@ -304,7 +305,7 @@ static int c8sectpfe_stop_feed(struct = dvb_demux_feed *dvbdmxfeed) >> /* disable this channels descriptor */ >> writel(0, channel->irec + DMA_PRDS_TPENABLE); >>=20 >> - tasklet_disable(&channel->tsklet); >> + disable_work_sync(&channel->tsklet); >>=20 >> /* now request memdma channel goes idle */ >> idlereq =3D (1 << channel->tsin_id) | IDLEREQ; >> @@ -631,8 +632,8 @@ static int configure_memdma_and_inputblock(struct = c8sectpfei *fei, >> writel(tsin->back_buffer_busaddr, tsin->irec + = DMA_PRDS_BUSWP_TP(0)); >> writel(tsin->back_buffer_busaddr, tsin->irec + = DMA_PRDS_BUSRP_TP(0)); >>=20 >> - /* initialize tasklet */ >> - tasklet_setup(&tsin->tsklet, channel_swdemux_tsklet); >> + /* initialize work */ >> + INIT_WORK(&tsin->tsklet, channel_swdemux_tsklet); >>=20 >> return 0; >>=20 >> diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h = b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h >> index bf377cc82225..d63f0ee83615 100644 >> --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h >> +++ b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h >> @@ -51,7 +51,7 @@ struct channel_info { >> unsigned long fifo; >>=20 >> struct completion idle_completion; >> - struct tasklet_struct tsklet; >> + struct work_struct tsklet; >>=20 >> struct c8sectpfei *fei; >> void __iomem *irec; >> diff --git a/drivers/media/radio/wl128x/fmdrv.h = b/drivers/media/radio/wl128x/fmdrv.h >> index da8920169df8..85282f638c4a 100644 >> --- a/drivers/media/radio/wl128x/fmdrv.h >> +++ b/drivers/media/radio/wl128x/fmdrv.h >> @@ -15,6 +15,7 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -200,15 +201,15 @@ struct fmdev { >> int streg_cbdata; /* status of ST registration */ >>=20 >> struct sk_buff_head rx_q; /* RX queue */ >> - struct tasklet_struct rx_task; /* RX Tasklet */ >> + struct work_struct rx_task; /* RX Work */ >>=20 >> struct sk_buff_head tx_q; /* TX queue */ >> - struct tasklet_struct tx_task; /* TX Tasklet */ >> + struct work_struct tx_task; /* TX Work */ >> unsigned long last_tx_jiffies; /* Timestamp of last pkt sent */ >> atomic_t tx_cnt; /* Number of packets can send at a time = */ >>=20 >> struct sk_buff *resp_skb; /* Response from the chip */ >> - /* Main task completion handler */ >> + /* Main work completion handler */ >> struct completion maintask_comp; >> /* Opcode of last command sent to the chip */ >> u8 pre_op; >> diff --git a/drivers/media/radio/wl128x/fmdrv_common.c = b/drivers/media/radio/wl128x/fmdrv_common.c >> index 3da8e5102bec..52290bb4a4ad 100644 >> --- a/drivers/media/radio/wl128x/fmdrv_common.c >> +++ b/drivers/media/radio/wl128x/fmdrv_common.c >> @@ -9,7 +9,7 @@ >> * one Channel-8 command to be sent to the chip). >> * 2) Sending each Channel-8 command to the chip and reading >> * response back over Shared Transport. >> - * 3) Managing TX and RX Queues and Tasklets. >> + * 3) Managing TX and RX Queues and Works. >> * 4) Handling FM Interrupt packet and taking appropriate action. >> * 5) Loading FM firmware to the chip (common, FM TX, and FM RX >> * firmware files based on mode selection) >> @@ -29,6 +29,7 @@ >> #include "fmdrv_v4l2.h" >> #include "fmdrv_common.h" >> #include >> +#include >> #include "fmdrv_rx.h" >> #include "fmdrv_tx.h" >>=20 >> @@ -244,10 +245,10 @@ void fmc_update_region_info(struct fmdev = *fmdev, u8 region_to_set) >> } >>=20 >> /* >> - * FM common sub-module will schedule this tasklet whenever it = receives >> + * FM common sub-module will schedule this work whenever it receives >> * FM packet from ST driver. >> */ >> -static void recv_tasklet(struct tasklet_struct *t) >> +static void recv_work(struct work_struct *t) >> { >> struct fmdev *fmdev; >> struct fm_irq *irq_info; >> @@ -256,7 +257,7 @@ static void recv_tasklet(struct tasklet_struct = *t) >> u8 num_fm_hci_cmds; >> unsigned long flags; >>=20 >> - fmdev =3D from_tasklet(fmdev, t, tx_task); >> + fmdev =3D from_work(fmdev, t, tx_task); >> irq_info =3D &fmdev->irq_info; >> /* Process all packets in the RX queue */ >> while ((skb =3D skb_dequeue(&fmdev->rx_q))) { >> @@ -322,22 +323,22 @@ static void recv_tasklet(struct tasklet_struct = *t) >>=20 >> /* >> * Check flow control field. If Num_FM_HCI_Commands = field is >> - * not zero, schedule FM TX tasklet. >> + * not zero, schedule FM TX work. >> */ >> if (num_fm_hci_cmds && atomic_read(&fmdev->tx_cnt)) >> if (!skb_queue_empty(&fmdev->tx_q)) >> - tasklet_schedule(&fmdev->tx_task); >> + queue_work(system_bh_wq, = &fmdev->tx_task); >> } >> } >>=20 >> -/* FM send tasklet: is scheduled when FM packet has to be sent to = chip */ >> -static void send_tasklet(struct tasklet_struct *t) >> +/* FM send work: is scheduled when FM packet has to be sent to chip = */ >> +static void send_work(struct work_struct *t) >> { >> struct fmdev *fmdev; >> struct sk_buff *skb; >> int len; >>=20 >> - fmdev =3D from_tasklet(fmdev, t, tx_task); >> + fmdev =3D from_work(fmdev, t, tx_task); >>=20 >> if (!atomic_read(&fmdev->tx_cnt)) >> return; >> @@ -366,7 +367,7 @@ static void send_tasklet(struct tasklet_struct = *t) >> if (len < 0) { >> kfree_skb(skb); >> fmdev->resp_comp =3D NULL; >> - fmerr("TX tasklet failed to send skb(%p)\n", skb); >> + fmerr("TX work failed to send skb(%p)\n", skb); >> atomic_set(&fmdev->tx_cnt, 1); >> } else { >> fmdev->last_tx_jiffies =3D jiffies; >> @@ -374,7 +375,7 @@ static void send_tasklet(struct tasklet_struct = *t) >> } >>=20 >> /* >> - * Queues FM Channel-8 packet to FM TX queue and schedules FM TX = tasklet for >> + * Queues FM Channel-8 packet to FM TX queue and schedules FM TX = work for >> * transmission >> */ >> static int fm_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, = void *payload, >> @@ -440,7 +441,7 @@ static int fm_send_cmd(struct fmdev *fmdev, u8 = fm_op, u16 type, void *payload, >>=20 >> fm_cb(skb)->completion =3D wait_completion; >> skb_queue_tail(&fmdev->tx_q, skb); >> - tasklet_schedule(&fmdev->tx_task); >> + queue_work(system_bh_wq, &fmdev->tx_task); >>=20 >> return 0; >> } >> @@ -462,7 +463,7 @@ int fmc_send_cmd(struct fmdev *fmdev, u8 fm_op, = u16 type, void *payload, >>=20 >> if (!wait_for_completion_timeout(&fmdev->maintask_comp, >> FM_DRV_TX_TIMEOUT)) { >> - fmerr("Timeout(%d sec),didn't get regcompletion signal = from RX tasklet\n", >> + fmerr("Timeout(%d sec),didn't get regcompletion signal = from RX work\n", >> jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000); >> return -ETIMEDOUT; >> } >> @@ -1455,7 +1456,7 @@ static long fm_st_receive(void *arg, struct = sk_buff *skb) >>=20 >> memcpy(skb_push(skb, 1), &skb->cb[0], 1); >> skb_queue_tail(&fmdev->rx_q, skb); >> - tasklet_schedule(&fmdev->rx_task); >> + queue_work(system_bh_wq, &fmdev->rx_task); >>=20 >> return 0; >> } >> @@ -1537,13 +1538,13 @@ int fmc_prepare(struct fmdev *fmdev) >> spin_lock_init(&fmdev->rds_buff_lock); >> spin_lock_init(&fmdev->resp_skb_lock); >>=20 >> - /* Initialize TX queue and TX tasklet */ >> + /* Initialize TX queue and TX work */ >> skb_queue_head_init(&fmdev->tx_q); >> - tasklet_setup(&fmdev->tx_task, send_tasklet); >> + INIT_WORK(&fmdev->tx_task, send_work); >>=20 >> - /* Initialize RX Queue and RX tasklet */ >> + /* Initialize RX Queue and RX work */ >> skb_queue_head_init(&fmdev->rx_q); >> - tasklet_setup(&fmdev->rx_task, recv_tasklet); >> + INIT_WORK(&fmdev->rx_task, recv_work); >>=20 >> fmdev->irq_info.stage =3D 0; >> atomic_set(&fmdev->tx_cnt, 1); >> @@ -1589,8 +1590,8 @@ int fmc_release(struct fmdev *fmdev) >> /* Service pending read */ >> wake_up_interruptible(&fmdev->rx.rds.read_queue); >>=20 >> - tasklet_kill(&fmdev->tx_task); >> - tasklet_kill(&fmdev->rx_task); >> + cancel_work_sync(&fmdev->tx_task); >> + cancel_work_sync(&fmdev->rx_task); >>=20 >> skb_queue_purge(&fmdev->tx_q); >> skb_queue_purge(&fmdev->rx_q); >> diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c >> index c76ba24c1f55..a2e2e58b7506 100644 >> --- a/drivers/media/rc/mceusb.c >> +++ b/drivers/media/rc/mceusb.c >> @@ -774,7 +774,7 @@ static void mceusb_dev_printdata(struct = mceusb_dev *ir, u8 *buf, int buf_len, >>=20 >> /* >> * Schedule work that can't be done in interrupt handlers >> - * (mceusb_dev_recv() and mce_write_callback()) nor tasklets. >> + * (mceusb_dev_recv() and mce_write_callback()) nor works. >> * Invokes mceusb_deferred_kevent() for recovering from >> * error events specified by the kevent bit field. >> */ >> diff --git a/drivers/media/usb/ttusb-dec/ttusb_dec.c = b/drivers/media/usb/ttusb-dec/ttusb_dec.c >> index 79faa2560613..55eeb00f1126 100644 >> --- a/drivers/media/usb/ttusb-dec/ttusb_dec.c >> +++ b/drivers/media/usb/ttusb-dec/ttusb_dec.c >> @@ -19,6 +19,7 @@ >> #include >>=20 >> #include >> +#include >>=20 >> #include >> #include >> @@ -139,7 +140,7 @@ struct ttusb_dec { >> int v_pes_postbytes; >>=20 >> struct list_head urb_frame_list; >> - struct tasklet_struct urb_tasklet; >> + struct work_struct urb_work; >> spinlock_t urb_frame_list_lock; >>=20 >> struct dvb_demux_filter *audio_filter; >> @@ -766,9 +767,9 @@ static void ttusb_dec_process_urb_frame(struct = ttusb_dec *dec, u8 *b, >> } >> } >>=20 >> -static void ttusb_dec_process_urb_frame_list(struct tasklet_struct = *t) >> +static void ttusb_dec_process_urb_frame_list(struct work_struct *t) >> { >> - struct ttusb_dec *dec =3D from_tasklet(dec, t, urb_tasklet); >> + struct ttusb_dec *dec =3D from_work(dec, t, urb_work); >> struct list_head *item; >> struct urb_frame *frame; >> unsigned long flags; >> @@ -822,7 +823,7 @@ static void ttusb_dec_process_urb(struct urb = *urb) >> = spin_unlock_irqrestore(&dec->urb_frame_list_lock, >> flags); >>=20 >> - tasklet_schedule(&dec->urb_tasklet); >> + queue_work(system_bh_wq, = &dec->urb_work); >> } >> } >> } else { >> @@ -1198,11 +1199,11 @@ static int ttusb_dec_alloc_iso_urbs(struct = ttusb_dec *dec) >> return 0; >> } >>=20 >> -static void ttusb_dec_init_tasklet(struct ttusb_dec *dec) >> +static void ttusb_dec_init_work(struct ttusb_dec *dec) >> { >> spin_lock_init(&dec->urb_frame_list_lock); >> INIT_LIST_HEAD(&dec->urb_frame_list); >> - tasklet_setup(&dec->urb_tasklet, = ttusb_dec_process_urb_frame_list); >> + INIT_WORK(&dec->urb_work, ttusb_dec_process_urb_frame_list); >> } >>=20 >> static int ttusb_init_rc( struct ttusb_dec *dec) >> @@ -1588,12 +1589,12 @@ static void ttusb_dec_exit_usb(struct = ttusb_dec *dec) >> ttusb_dec_free_iso_urbs(dec); >> } >>=20 >> -static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec) >> +static void ttusb_dec_exit_work(struct ttusb_dec *dec) >> { >> struct list_head *item; >> struct urb_frame *frame; >>=20 >> - tasklet_kill(&dec->urb_tasklet); >> + cancel_work_sync(&dec->urb_work); >>=20 >> while ((item =3D dec->urb_frame_list.next) !=3D = &dec->urb_frame_list) { >> frame =3D list_entry(item, struct urb_frame, = urb_frame_list); >> @@ -1703,7 +1704,7 @@ static int ttusb_dec_probe(struct usb_interface = *intf, >>=20 >> ttusb_dec_init_v_pes(dec); >> ttusb_dec_init_filters(dec); >> - ttusb_dec_init_tasklet(dec); >> + ttusb_dec_init_work(dec); >>=20 >> dec->active =3D 1; >>=20 >> @@ -1729,7 +1730,7 @@ static void ttusb_dec_disconnect(struct = usb_interface *intf) >> dprintk("%s\n", __func__); >>=20 >> if (dec->active) { >> - ttusb_dec_exit_tasklet(dec); >> + ttusb_dec_exit_work(dec); >> ttusb_dec_exit_filters(dec); >> if(enable_rc) >> ttusb_dec_exit_rc(dec); From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 84D3CC4345F for ; Wed, 24 Apr 2024 16:49:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:To:References:Message-Id:Cc:Date: In-Reply-To:From:Subject:Mime-Version:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ZS6Xme1QzdGcFCyRiRwi66otMPHe5tz/hhqxkgXYkFM=; b=o9opte3eZUsuJc pyTrJdOj2K8luanmfRh2dwBN9921LH9p0xd0EzPpnP4lJUATas0Dn1PFCe7N5F7kGdvXalx736Y0C Iy7h5J4w8vnTgHQTzfkwGIt7ueYHTojF1ULtXW4BUbQHJYAoHgygezl2pc0mhMXLYyVxKZj/8glqu mvXsTZ+vywDs3TzKRwnnhU9MGg06STd1W36+rLtpfcDMPbZR5tmumKhDk62P5QVcxo4IyNocPgVph Y1tPCKd9s4wo752rSNa+D+uBn2GVCfMvbkoQnzsifX7g7ReFr0L1MyDkrMu5Hwu3DNJLw2y8y0sFB Uph1xuLAURQDUwAhl1Vg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rzfnu-0000000518l-0lEw; Wed, 24 Apr 2024 16:49:06 +0000 Received: from linux.microsoft.com ([13.77.154.182]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rzfnm-0000000516W-0NeB; Wed, 24 Apr 2024 16:49:02 +0000 Received: from smtpclient.apple (d66-183-91-182.bchsia.telus.net [66.183.91.182]) by linux.microsoft.com (Postfix) with ESMTPSA id 995C3210DEAF; Wed, 24 Apr 2024 09:48:50 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 995C3210DEAF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1713977332; bh=ksvEFN4skua8jbUiYLns9bHtKk/4wlRJ+9aDRVo11t0=; h=Subject:From:In-Reply-To:Date:Cc:References:To:From; b=ciSw7ETabS09FzB+vGI71vmglWivC+oa0cVPt+dd7Ss0SZ0HwcyxZuoiQNcNF5q63 OU2Zc9ReY3eu79e9oV3MgK0cJNYFO81GC/JgqkwsQSP1lBPHUmLKsrrY/5zP4NZf0t VIf6IyFitxO7pk98vq37Kg2gLGbiD7QpB6ZXnzWA= Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3774.500.171.1.1\)) Subject: Re: [PATCH 8/9] drivers/media/*: Convert from tasklet to BH workqueue From: Allen Pais In-Reply-To: Date: Wed, 24 Apr 2024 09:48:38 -0700 Cc: Linux Kernel Mailing List , Tejun Heo , Kees Cook , Vinod Koul , marcan@marcan.st, sven@svenpeter.dev, florian.fainelli@broadcom.com, Ray Jui , Scott Branden , Paul Cercueil , Eugeniy.Paltsev@synopsys.com, manivannan.sadhasivam@linaro.org, Viresh Kumar , Frank.Li@nxp.com, Leo Li , zw@zh-kernel.org, Zhou Wang , haijie1@huawei.com, Shawn Guo , Sascha Hauer , Sean Wang , Matthias Brugger , angelogioacchino.delregno@collabora.com, =?utf-8?Q?Andreas_F=C3=A4rber?= , Logan Gunthorpe , Daniel Mack , Haojian Zhuang , Robert Jarzmik , andersson@kernel.org, konrad.dybcio@linaro.org, Orson Zhai , baolin.wang@linux.alibaba.com, Lyra Zhang , Patrice CHOTARD , Linus Walleij , Chen-Yu Tsai , =?utf-8?Q?Jernej_=C5=A0krabec?= , peter.ujfalusi@gmail.com, kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, jassisinghbrar@gmail.com, mchehab@kernel.org, maintainers@bluecherrydvr.com, aubin.constans@microchip.com, ulf.hansson@linaro.org, manuel.lauss@gmail.com, mirq-linux@rere.qmqm.pl, jh80.chung@samsung.com, oakad@yahoo.com, hayashi.kunihiko@socionext.com, mhiramat@kernel.org, brucechang@via.com.tw, HaraldWelte@viatech.com, pierre@ossman.eu, duncan.sands@free.fr, stern@rowland.harvard.edu, oneukum@suse.com, openipmi-developer@lists.sourceforge.net, dmaengine@vger.kernel.org, asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-rpi-kernel@lists.infradead.org, linux-mips@vger.kernel.org, imx@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-mediatek@lists.infradead.org, linux-actions@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-tegra@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-rdma@vger.kernel.org, linux-media@vger.kernel.org, linux-mmc@vger.kernel.org, linux-omap@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-s390@vger.kernel.org, netdev@vger.kernel.org, linux-usb@vger.kernel.org Message-Id: <17140C44-9803-4556-B216-12D1ECF30432@linux.microsoft.com> References: <20240327160314.9982-1-apais@linux.microsoft.com> <20240327160314.9982-9-apais@linux.microsoft.com> To: Hans Verkuil X-Mailer: Apple Mail (2.3774.500.171.1.1) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240424_094858_503340_17AFFA8C X-CRM114-Status: GOOD ( 24.44 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org Cgo+IE9uIEFwciAyNCwgMjAyNCwgYXQgMjoxMuKAr0FNLCBIYW5zIFZlcmt1aWwgPGh2ZXJrdWls QHhzNGFsbC5ubD4gd3JvdGU6Cj4gCj4gT24gMjcvMDMvMjAyNCAxNzowMywgQWxsZW4gUGFpcyB3 cm90ZToKPj4gVGhlIG9ubHkgZ2VuZXJpYyBpbnRlcmZhY2UgdG8gZXhlY3V0ZSBhc3luY2hyb25v dXNseSBpbiB0aGUgQkggY29udGV4dCBpcwo+PiB0YXNrbGV0OyBob3dldmVyLCBpdCdzIG1hcmtl ZCBkZXByZWNhdGVkIGFuZCBoYXMgc29tZSBkZXNpZ24gZmxhd3MuIFRvCj4+IHJlcGxhY2UgdGFz a2xldHMsIEJIIHdvcmtxdWV1ZSBzdXBwb3J0IHdhcyByZWNlbnRseSBhZGRlZC4gQSBCSCB3b3Jr cXVldWUKPj4gYmVoYXZlcyBzaW1pbGFybHkgdG8gcmVndWxhciB3b3JrcXVldWVzIGV4Y2VwdCB0 aGF0IHRoZSBxdWV1ZWQgd29yayBpdGVtcwo+PiBhcmUgZXhlY3V0ZWQgaW4gdGhlIEJIIGNvbnRl eHQuCj4+IAo+PiBUaGlzIHBhdGNoIGNvbnZlcnRzIGRyaXZlcnMvbWVkaWEvKiBmcm9tIHRhc2ts ZXQgdG8gQkggd29ya3F1ZXVlLgo+PiAKPj4gQmFzZWQgb24gdGhlIHdvcmsgZG9uZSBieSBUZWp1 biBIZW8gPHRqQGtlcm5lbC5vcmc+Cj4+IEJyYW5jaDogaHR0cHM6Ly9naXQua2VybmVsLm9yZy9w dWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdGovd3EuZ2l0IGZvci02LjEwCj4+IAo+PiBTaWduZWQt b2ZmLWJ5OiBBbGxlbiBQYWlzIDxhbGxlbi5sa21sQGdtYWlsLmNvbT4KPj4gLS0tCj4+IGRyaXZl cnMvbWVkaWEvcGNpL2J0OHh4L2J0ODc4LmMgICAgICAgICAgICAgICB8ICA4ICsrLS0KPj4gZHJp dmVycy9tZWRpYS9wY2kvYnQ4eHgvYnQ4NzguaCAgICAgICAgICAgICAgIHwgIDMgKy0KPj4gZHJp dmVycy9tZWRpYS9wY2kvYnQ4eHgvZHZiLWJ0OHh4LmMgICAgICAgICAgIHwgIDkgKystLQo+PiBk cml2ZXJzL21lZGlhL3BjaS9kZGJyaWRnZS9kZGJyaWRnZS5oICAgICAgICAgfCAgMyArLQo+PiBk cml2ZXJzL21lZGlhL3BjaS9tYW50aXMvaG9wcGVyX2NhcmRzLmMgICAgICAgfCAgMiArLQo+PiBk cml2ZXJzL21lZGlhL3BjaS9tYW50aXMvbWFudGlzX2NhcmRzLmMgICAgICAgfCAgMiArLQo+PiBk cml2ZXJzL21lZGlhL3BjaS9tYW50aXMvbWFudGlzX2NvbW1vbi5oICAgICAgfCAgMyArLQo+PiBk cml2ZXJzL21lZGlhL3BjaS9tYW50aXMvbWFudGlzX2RtYS5jICAgICAgICAgfCAgNSArKy0KPj4g ZHJpdmVycy9tZWRpYS9wY2kvbWFudGlzL21hbnRpc19kbWEuaCAgICAgICAgIHwgIDIgKy0KPj4g ZHJpdmVycy9tZWRpYS9wY2kvbWFudGlzL21hbnRpc19kdmIuYyAgICAgICAgIHwgMTIgKysrLS0t Cj4+IGRyaXZlcnMvbWVkaWEvcGNpL25nZW5lL25nZW5lLWNvcmUuYyAgICAgICAgICB8IDIzICsr KysrKy0tLS0tCj4+IGRyaXZlcnMvbWVkaWEvcGNpL25nZW5lL25nZW5lLmggICAgICAgICAgICAg ICB8ICA1ICsrLQo+PiBkcml2ZXJzL21lZGlhL3BjaS9zbWlwY2llL3NtaXBjaWUtbWFpbi5jICAg ICAgfCAxOCArKysrLS0tLQo+PiBkcml2ZXJzL21lZGlhL3BjaS9zbWlwY2llL3NtaXBjaWUuaCAg ICAgICAgICAgfCAgMyArLQo+PiBkcml2ZXJzL21lZGlhL3BjaS90dHBjaS9idWRnZXQtYXYuYyAg ICAgICAgICAgfCAgMyArLQo+PiBkcml2ZXJzL21lZGlhL3BjaS90dHBjaS9idWRnZXQtY2kuYyAg ICAgICAgICAgfCAyNyArKysrKystLS0tLS0KPj4gZHJpdmVycy9tZWRpYS9wY2kvdHRwY2kvYnVk Z2V0LWNvcmUuYyAgICAgICAgIHwgMTAgKystLS0KPj4gZHJpdmVycy9tZWRpYS9wY2kvdHRwY2kv YnVkZ2V0LmggICAgICAgICAgICAgIHwgIDUgKystCj4+IGRyaXZlcnMvbWVkaWEvcGNpL3R3NTg2 NC90dzU4NjQtY29yZS5jICAgICAgICB8ICAyICstCj4+IGRyaXZlcnMvbWVkaWEvcGNpL3R3NTg2 NC90dzU4NjQtdmlkZW8uYyAgICAgICB8IDEzICsrKy0tLQo+PiBkcml2ZXJzL21lZGlhL3BjaS90 dzU4NjQvdHc1ODY0LmggICAgICAgICAgICAgfCAgNyArKy0tCj4+IGRyaXZlcnMvbWVkaWEvcGxh dGZvcm0vaW50ZWwvcHhhX2NhbWVyYS5jICAgICB8IDE1ICsrKy0tLS0KPj4gZHJpdmVycy9tZWRp YS9wbGF0Zm9ybS9tYXJ2ZWxsL21jYW0tY29yZS5jICAgIHwgMTEgKystLS0KPj4gZHJpdmVycy9t ZWRpYS9wbGF0Zm9ybS9tYXJ2ZWxsL21jYW0tY29yZS5oICAgIHwgIDMgKy0KPj4gLi4uL3N0L3N0 aS9jOHNlY3RwZmUvYzhzZWN0cGZlLWNvcmUuYyAgICAgICAgIHwgMTUgKysrLS0tLQo+PiAuLi4v c3Qvc3RpL2M4c2VjdHBmZS9jOHNlY3RwZmUtY29yZS5oICAgICAgICAgfCAgMiArLQo+PiBkcml2 ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydi5oICAgICAgICAgICAgfCAgNyArKy0tCj4+IGRy aXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2X2NvbW1vbi5jICAgICB8IDQxICsrKysrKysr KystLS0tLS0tLS0KPj4gZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYyAgICAgICAgICAgICAgICAg ICAgIHwgIDIgKy0KPj4gZHJpdmVycy9tZWRpYS91c2IvdHR1c2ItZGVjL3R0dXNiX2RlYy5jICAg ICAgIHwgMjEgKysrKystLS0tLQo+PiAzMCBmaWxlcyBjaGFuZ2VkLCAxNTEgaW5zZXJ0aW9ucygr KSwgMTMxIGRlbGV0aW9ucygtKQo+PiAKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNp L2J0OHh4L2J0ODc4LmMgYi9kcml2ZXJzL21lZGlhL3BjaS9idDh4eC9idDg3OC5jCj4+IGluZGV4 IDkwOTcyZDY5NTJmMS4uOTgzZWMyOTEwOGYwIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlh L3BjaS9idDh4eC9idDg3OC5jCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2J0OHh4L2J0ODc4 LmMKPj4gQEAgLTMwMCw4ICszMDAsOCBAQCBzdGF0aWMgaXJxcmV0dXJuX3QgYnQ4NzhfaXJxKGlu dCBpcnEsIHZvaWQgKmRldl9pZCkKPj4gCQl9Cj4+IAkJaWYgKGFzdGF0ICYgQlQ4NzhfQVJJU0NJ KSB7Cj4+IAkJCWJ0LT5maW5pc2hlZF9ibG9jayA9IChzdGF0ICYgQlQ4NzhfQVJJU0NTKSA+PiAy ODsKPj4gLQkJCWlmIChidC0+dGFza2xldC5jYWxsYmFjaykKPj4gLQkJCQl0YXNrbGV0X3NjaGVk dWxlKCZidC0+dGFza2xldCk7Cj4+ICsJCQlpZiAoYnQtPndvcmsuZnVuYykKPj4gKwkJCQlxdWV1 ZV93b3JrKHN5c3RlbV9iaF93cSwKPiAKPiBJIHN0b3BwZWQgcmV2aWV3aW5nIGhlcmU6IHRoaXMg Y2xlYXJseSBoYXMgbm90IGJlZW4gY29tcGlsZSB0ZXN0ZWQuCj4gCj4gQWxzbyBwbGVhc2UgY2hl Y2sgdGhlIHBhdGNoIHdpdGggJ2NoZWNrcGF0Y2gucGwgLS1zdHJpY3QnIGFuZCBmaXggdGhlIHJl cG9ydGVkIGlzc3Vlcy4KPiAKPiBSZWdhcmRzLAo+IAo+IAlIYW5zCgogSGFucywKCiAgIFRoYW5r cyBmb3IgdGFraW5nIHRoZSB0aW1lIG91dCB0byByZXZpZXcuIFRoaXMgd2FzIGEgbWlzdGFrZSwg SSBzZW50IG91dCBhIHYyIHdoaWNoIGhhZApUaGlzIGZpeGVkLiBJIGFtIHdvcmtpbmcgb24gdjMg YmFzZWQgb24gc29tZSBvZiB0aGUgY29tbWVudHMgSSByZWNlaXZlZCAgcmVjZW50bHkuIFdpbGwK QXBwcmVjaWF0ZSB5b3VyIHJldmlldyB3aGVuIGl0IGlzIHNlbnQgb3V0LgoKQWxsZW4KCj4gCj4+ IAkJCWJyZWFrOwo+PiAJCX0KPj4gCQljb3VudCsrOwo+PiBAQCAtNDc4LDggKzQ3OCw4IEBAIHN0 YXRpYyBpbnQgYnQ4NzhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBj aV9kZXZpY2VfaWQgKnBjaV9pZCkKPj4gCWJ0d3JpdGUoMCwgQlQ4NzhfQUlOVF9NQVNLKTsKPj4g CWJ0ODc4X251bSsrOwo+PiAKPj4gLQlpZiAoIWJ0LT50YXNrbGV0LmZ1bmMpCj4+IC0JCXRhc2ts ZXRfZGlzYWJsZSgmYnQtPnRhc2tsZXQpOwo+PiArCWlmICghYnQtPndvcmsuZnVuYykKPj4gKwkJ ZGlzYWJsZV93b3JrX3N5bmMoJmJ0LT53b3JrKTsKPj4gCj4+IAlyZXR1cm4gMDsKPj4gCj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9idDh4eC9idDg3OC5oIGIvZHJpdmVycy9tZWRp YS9wY2kvYnQ4eHgvYnQ4NzguaAo+PiBpbmRleCBmZGU4ZGIyOTNjNTQuLmI5Y2U3OGU1MTE2YiAx MDA2NDQKPj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvYnQ4NzguaAo+PiArKysgYi9k cml2ZXJzL21lZGlhL3BjaS9idDh4eC9idDg3OC5oCj4+IEBAIC0xNCw2ICsxNCw3IEBACj4+ICNp bmNsdWRlIDxsaW51eC9zY2hlZC5oPgo+PiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KPj4g I2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+ Cj4+IAo+PiAjaW5jbHVkZSAiYnQ4NDguaCIKPj4gI2luY2x1ZGUgImJ0dHYuaCIKPj4gQEAgLTEy MCw3ICsxMjEsNyBAQCBzdHJ1Y3QgYnQ4Nzggewo+PiAJZG1hX2FkZHJfdCByaXNjX2RtYTsKPj4g CXUzMiByaXNjX3BvczsKPj4gCj4+IC0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7Cj4+ ICsJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Cj4+IAlpbnQgc2h1dGRvd247Cj4+IH07Cj4+IAo+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvZHZiLWJ0OHh4LmMgYi9kcml2 ZXJzL21lZGlhL3BjaS9idDh4eC9kdmItYnQ4eHguYwo+PiBpbmRleCAzOTBjYmJhNmMwNjUuLjhj MGUxZmE3NjRhNCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvZHZiLWJ0 OHh4LmMKPj4gKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvYnQ4eHgvZHZiLWJ0OHh4LmMKPj4gQEAg LTE1LDYgKzE1LDcgQEAKPj4gI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4+ICNpbmNsdWRlIDxs aW51eC9zbGFiLmg+Cj4+ICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KPj4gKyNpbmNsdWRlIDxsaW51 eC93b3JrcXVldWUuaD4KPj4gCj4+ICNpbmNsdWRlIDxtZWRpYS9kbXhkZXYuaD4KPj4gI2luY2x1 ZGUgPG1lZGlhL2R2YmRldi5oPgo+PiBAQCAtMzksOSArNDAsOSBAQCBEVkJfREVGSU5FX01PRF9P UFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKPj4gCj4+ICNkZWZpbmUgSUZfRlJFUVVFTkNZeDYg MjE3ICAgIC8qIDYgKiAzNi4xNjY2NjY2NjY2N01IeiAqLwo+PiAKPj4gLXN0YXRpYyB2b2lkIGR2 Yl9idDh4eF90YXNrKHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCkKPj4gK3N0YXRpYyB2b2lkIGR2 Yl9idDh4eF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdCkKPj4gewo+PiAtCXN0cnVjdCBidDg3 OCAqYnQgPSBmcm9tX3Rhc2tsZXQoYnQsIHQsIHRhc2tsZXQpOwo+PiArCXN0cnVjdCBidDg3OCAq YnQgPSBmcm9tX3dvcmsoYnQsIHQsIHdvcmspOwo+PiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpj YXJkID0gZGV2X2dldF9kcnZkYXRhKCZidC0+YWRhcHRlci0+ZGV2KTsKPj4gCj4+IAlkcHJpbnRr KCIlZFxuIiwgY2FyZC0+YnQtPmZpbmlzaGVkX2Jsb2NrKTsKPj4gQEAgLTc4Miw3ICs3ODMsNyBA QCBzdGF0aWMgaW50IGR2Yl9idDh4eF9sb2FkX2NhcmQoc3RydWN0IGR2Yl9idDh4eF9jYXJkICpj YXJkLCB1MzIgdHlwZSkKPj4gCQlnb3RvIGVycl9kaXNjb25uZWN0X2Zyb250ZW5kOwo+PiAJfQo+ PiAKPj4gLQl0YXNrbGV0X3NldHVwKCZjYXJkLT5idC0+dGFza2xldCwgZHZiX2J0OHh4X3Rhc2sp Owo+PiArCUlOSVRfV09SSygmY2FyZC0+YnQtPndvcmssIGR2Yl9idDh4eF90YXNrKTsKPj4gCj4+ IAlmcm9udGVuZF9pbml0KGNhcmQsIHR5cGUpOwo+PiAKPj4gQEAgLTkyMiw3ICs5MjMsNyBAQCBz dGF0aWMgdm9pZCBkdmJfYnQ4eHhfcmVtb3ZlKHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1YikK Pj4gCWRwcmludGsoImR2Yl9idDh4eDogdW5sb2FkaW5nIGNhcmQlZFxuIiwgY2FyZC0+YnR0dl9u cik7Cj4+IAo+PiAJYnQ4Nzhfc3RvcChjYXJkLT5idCk7Cj4+IC0JdGFza2xldF9raWxsKCZjYXJk LT5idC0+dGFza2xldCk7Cj4+ICsJY2FuY2VsX3dvcmtfc3luYygmY2FyZC0+YnQtPndvcmspOwo+ PiAJZHZiX25ldF9yZWxlYXNlKCZjYXJkLT5kdmJuZXQpOwo+PiAJY2FyZC0+ZGVtdXguZG14LnJl bW92ZV9mcm9udGVuZCgmY2FyZC0+ZGVtdXguZG14LCAmY2FyZC0+ZmVfbWVtKTsKPj4gCWNhcmQt PmRlbXV4LmRteC5yZW1vdmVfZnJvbnRlbmQoJmNhcmQtPmRlbXV4LmRteCwgJmNhcmQtPmZlX2h3 KTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL2RkYnJpZGdlL2RkYnJpZGdlLmgg Yi9kcml2ZXJzL21lZGlhL3BjaS9kZGJyaWRnZS9kZGJyaWRnZS5oCj4+IGluZGV4IGYzNjk5ZGJk MTkzZi4uMDM3ZDFkMTNlZjBmIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9kZGJy aWRnZS9kZGJyaWRnZS5oCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2RkYnJpZGdlL2RkYnJp ZGdlLmgKPj4gQEAgLTM1LDYgKzM1LDcgQEAKPj4gI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4K Pj4gI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KPj4gI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1 ZS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgo+PiAKPj4gI2luY2x1ZGUgPGFz bS9kbWEuaD4KPj4gI2luY2x1ZGUgPGFzbS9pcnEuaD4KPj4gQEAgLTI5OCw3ICsyOTksNyBAQCBz dHJ1Y3QgZGRiX2xpbmsgewo+PiAJc3BpbmxvY2tfdCAgICAgICAgICAgICBsb2NrOyAvKiBsb2Nr IGxpbmsgYWNjZXNzICovCj4+IAlzdHJ1Y3QgbXV0ZXggICAgICAgICAgIGZsYXNoX211dGV4OyAv KiBsb2NrIGZsYXNoIGFjY2VzcyAqLwo+PiAJc3RydWN0IGRkYl9sbmIgICAgICAgICBsbmI7Cj4+ IC0Jc3RydWN0IHRhc2tsZXRfc3RydWN0ICB0YXNrbGV0Owo+PiArCXN0cnVjdCB3b3JrX3N0cnVj dCB3b3JrOwo+PiAJc3RydWN0IGRkYl9pZHMgICAgICAgICBpZHM7Cj4+IAo+PiAJc3BpbmxvY2tf dCAgICAgICAgICAgICB0ZW1wX2xvY2s7IC8qIGxvY2sgdGVtcCBjaGlwIGFjY2VzcyAqLwo+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvbWFudGlzL2hvcHBlcl9jYXJkcy5jIGIvZHJp dmVycy9tZWRpYS9wY2kvbWFudGlzL2hvcHBlcl9jYXJkcy5jCj4+IGluZGV4IGMwYmQ1ZDdlMTQ4 Yi4uODY5ZWE4OGM0ODkzIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9tYW50aXMv aG9wcGVyX2NhcmRzLmMKPj4gKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvbWFudGlzL2hvcHBlcl9j YXJkcy5jCj4+IEBAIC0xMTYsNyArMTE2LDcgQEAgc3RhdGljIGlycXJldHVybl90IGhvcHBlcl9p cnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4+IAlpZiAoc3RhdCAmIE1BTlRJU19J TlRfUklTQ0kpIHsKPj4gCQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMCwgIjwlcz4iLCBsYWJlbFs4 XSk7Cj4+IAkJbWFudGlzLT5idXN5X2Jsb2NrID0gKHN0YXQgJiBNQU5USVNfSU5UX1JJU0NTVEFU KSA+PiAyODsKPj4gLQkJdGFza2xldF9zY2hlZHVsZSgmbWFudGlzLT50YXNrbGV0KTsKPj4gKwkJ cXVldWVfd29yayhzeXN0ZW1fYmhfd3EsICZtYW50aXMtPndvcmspOwo+PiAJfQo+PiAJaWYgKHN0 YXQgJiBNQU5USVNfSU5UX0kyQ0RPTkUpIHsKPj4gCQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMCwg Ijwlcz4iLCBsYWJlbFs5XSk7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9tYW50 aXMvbWFudGlzX2NhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9tYW50aXMvbWFudGlzX2NhcmRz LmMKPj4gaW5kZXggOTA2ZTQ1MDBkODdkLi5jYjEyNGIxOWUzNmUgMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvbWVkaWEvcGNpL21hbnRpcy9tYW50aXNfY2FyZHMuYwo+PiArKysgYi9kcml2ZXJzL21l ZGlhL3BjaS9tYW50aXMvbWFudGlzX2NhcmRzLmMKPj4gQEAgLTEyNSw3ICsxMjUsNyBAQCBzdGF0 aWMgaXJxcmV0dXJuX3QgbWFudGlzX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkK Pj4gCWlmIChzdGF0ICYgTUFOVElTX0lOVF9SSVNDSSkgewo+PiAJCWRwcmludGsoTUFOVElTX0RF QlVHLCAwLCAiPCVzPiIsIGxhYmVsWzhdKTsKPj4gCQltYW50aXMtPmJ1c3lfYmxvY2sgPSAoc3Rh dCAmIE1BTlRJU19JTlRfUklTQ1NUQVQpID4+IDI4Owo+PiAtCQl0YXNrbGV0X3NjaGVkdWxlKCZt YW50aXMtPnRhc2tsZXQpOwo+PiArCQlxdWV1ZV93b3JrKHN5c3RlbV9iaF93cSwgJm1hbnRpcy0+ d29yayk7Cj4+IAl9Cj4+IAlpZiAoc3RhdCAmIE1BTlRJU19JTlRfSTJDRE9ORSkgewo+PiAJCWRw cmludGsoTUFOVElTX0RFQlVHLCAwLCAiPCVzPiIsIGxhYmVsWzldKTsKPj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvbWVkaWEvcGNpL21hbnRpcy9tYW50aXNfY29tbW9uLmggYi9kcml2ZXJzL21lZGlh L3BjaS9tYW50aXMvbWFudGlzX2NvbW1vbi5oCj4+IGluZGV4IGQ4OGFjMjgwMjI2Yy4uZjIyNDcx NDhmMjY4IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9tYW50aXMvbWFudGlzX2Nv bW1vbi5oCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL21hbnRpcy9tYW50aXNfY29tbW9uLmgK Pj4gQEAgLTEyLDYgKzEyLDcgQEAKPj4gI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+PiAj aW5jbHVkZSA8bGludXgvbXV0ZXguaD4KPj4gI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgo+ PiArI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgo+PiAKPj4gI2luY2x1ZGUgIm1hbnRpc19y ZWcuaCIKPj4gI2luY2x1ZGUgIm1hbnRpc191YXJ0LmgiCj4+IEBAIC0xMjUsNyArMTI2LDcgQEAg c3RydWN0IG1hbnRpc19wY2kgewo+PiAJX19sZTMyCQkJKnJpc2NfY3B1Owo+PiAJZG1hX2FkZHJf dAkJcmlzY19kbWE7Cj4+IAo+PiAtCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YXNrbGV0Owo+PiAr CXN0cnVjdCB3b3JrX3N0cnVjdCAJd29yazsKPj4gCXNwaW5sb2NrX3QJCWludG1hc2tfbG9jazsK Pj4gCj4+IAlzdHJ1Y3QgaTJjX2FkYXB0ZXIJYWRhcHRlcjsKPj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvbWVkaWEvcGNpL21hbnRpcy9tYW50aXNfZG1hLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9tYW50 aXMvbWFudGlzX2RtYS5jCj4+IGluZGV4IDgwYzg0MzkzNjQ5My4uYzg1ZjliODRhMmM2IDEwMDY0 NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9tYW50aXMvbWFudGlzX2RtYS5jCj4+ICsrKyBi L2RyaXZlcnMvbWVkaWEvcGNpL21hbnRpcy9tYW50aXNfZG1hLmMKPj4gQEAgLTE1LDYgKzE1LDcg QEAKPj4gI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgo+PiAjaW5jbHVkZSA8bGludXgvc2NoZWQu aD4KPj4gI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3dv cmtxdWV1ZS5oPgo+PiAKPj4gI2luY2x1ZGUgPG1lZGlhL2RteGRldi5oPgo+PiAjaW5jbHVkZSA8 bWVkaWEvZHZiZGV2Lmg+Cj4+IEBAIC0yMDAsOSArMjAxLDkgQEAgdm9pZCBtYW50aXNfZG1hX3N0 b3Aoc3RydWN0IG1hbnRpc19wY2kgKm1hbnRpcykKPj4gfQo+PiAKPj4gCj4+IC12b2lkIG1hbnRp c19kbWFfeGZlcihzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnQpCj4+ICt2b2lkIG1hbnRpc19kbWFf eGZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnQpCj4+IHsKPj4gLQlzdHJ1Y3QgbWFudGlzX3BjaSAq bWFudGlzID0gZnJvbV90YXNrbGV0KG1hbnRpcywgdCwgdGFza2xldCk7Cj4+ICsJc3RydWN0IG1h bnRpc19wY2kgKm1hbnRpcyA9IGZyb21fd29yayhtYW50aXMsIHQsIHdvcmspOwo+PiAJc3RydWN0 IG1hbnRpc19od2NvbmZpZyAqY29uZmlnID0gbWFudGlzLT5od2NvbmZpZzsKPj4gCj4+IAl3aGls ZSAobWFudGlzLT5sYXN0X2Jsb2NrICE9IG1hbnRpcy0+YnVzeV9ibG9jaykgewo+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvbWFudGlzL21hbnRpc19kbWEuaCBiL2RyaXZlcnMvbWVk aWEvcGNpL21hbnRpcy9tYW50aXNfZG1hLmgKPj4gaW5kZXggMzdkYTk4MmM5YzI5Li41ZGIwZDM3 MjhmMTUgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL21hbnRpcy9tYW50aXNfZG1h LmgKPj4gKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvbWFudGlzL21hbnRpc19kbWEuaAo+PiBAQCAt MTMsNiArMTMsNiBAQCBleHRlcm4gaW50IG1hbnRpc19kbWFfaW5pdChzdHJ1Y3QgbWFudGlzX3Bj aSAqbWFudGlzKTsKPj4gZXh0ZXJuIGludCBtYW50aXNfZG1hX2V4aXQoc3RydWN0IG1hbnRpc19w Y2kgKm1hbnRpcyk7Cj4+IGV4dGVybiB2b2lkIG1hbnRpc19kbWFfc3RhcnQoc3RydWN0IG1hbnRp c19wY2kgKm1hbnRpcyk7Cj4+IGV4dGVybiB2b2lkIG1hbnRpc19kbWFfc3RvcChzdHJ1Y3QgbWFu dGlzX3BjaSAqbWFudGlzKTsKPj4gLWV4dGVybiB2b2lkIG1hbnRpc19kbWFfeGZlcihzdHJ1Y3Qg dGFza2xldF9zdHJ1Y3QgKnQpOwo+PiArZXh0ZXJuIHZvaWQgbWFudGlzX2RtYV94ZmVyKHN0cnVj dCB3b3JrX3N0cnVjdCAqdCk7Cj4+IAo+PiAjZW5kaWYgLyogX19NQU5USVNfRE1BX0ggKi8KPj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL21hbnRpcy9tYW50aXNfZHZiLmMgYi9kcml2 ZXJzL21lZGlhL3BjaS9tYW50aXMvbWFudGlzX2R2Yi5jCj4+IGluZGV4IGM3YmE0YTc2ZTYwOC4u ZjY0MDYzNWRlMTcwIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9tYW50aXMvbWFu dGlzX2R2Yi5jCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL21hbnRpcy9tYW50aXNfZHZiLmMK Pj4gQEAgLTEwNSw3ICsxMDUsNyBAQCBzdGF0aWMgaW50IG1hbnRpc19kdmJfc3RhcnRfZmVlZChz dHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCj4+IAlpZiAobWFudGlzLT5mZWVkcyA9 PSAxKQkgewo+PiAJCWRwcmludGsoTUFOVElTX0RFQlVHLCAxLCAibWFudGlzIHN0YXJ0IGZlZWQg JiBkbWEiKTsKPj4gCQltYW50aXNfZG1hX3N0YXJ0KG1hbnRpcyk7Cj4+IC0JCXRhc2tsZXRfZW5h YmxlKCZtYW50aXMtPnRhc2tsZXQpOwo+PiArCQllbmFibGVfYW5kX3F1ZXVlX3dvcmsoc3lzdGVt X2JoX3dxLCAmbWFudGlzLT53b3JrKTsKPj4gCX0KPj4gCj4+IAlyZXR1cm4gbWFudGlzLT5mZWVk czsKPj4gQEAgLTEyNSw3ICsxMjUsNyBAQCBzdGF0aWMgaW50IG1hbnRpc19kdmJfc3RvcF9mZWVk KHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKPj4gCW1hbnRpcy0+ZmVlZHMtLTsK Pj4gCWlmIChtYW50aXMtPmZlZWRzID09IDApIHsKPj4gCQlkcHJpbnRrKE1BTlRJU19ERUJVRywg MSwgIm1hbnRpcyBzdG9wIGZlZWQgYW5kIGRtYSIpOwo+PiAtCQl0YXNrbGV0X2Rpc2FibGUoJm1h bnRpcy0+dGFza2xldCk7Cj4+ICsJCWRpc2FibGVfd29ya19zeW5jKCZtYW50aXMtPndvcmspOwo+ PiAJCW1hbnRpc19kbWFfc3RvcChtYW50aXMpOwo+PiAJfQo+PiAKPj4gQEAgLTIwNSw4ICsyMDUs OCBAQCBpbnQgbWFudGlzX2R2Yl9pbml0KHN0cnVjdCBtYW50aXNfcGNpICptYW50aXMpCj4+IAl9 Cj4+IAo+PiAJZHZiX25ldF9pbml0KCZtYW50aXMtPmR2Yl9hZGFwdGVyLCAmbWFudGlzLT5kdmJu ZXQsICZtYW50aXMtPmRlbXV4LmRteCk7Cj4+IC0JdGFza2xldF9zZXR1cCgmbWFudGlzLT50YXNr bGV0LCBtYW50aXNfZG1hX3hmZXIpOwo+PiAtCXRhc2tsZXRfZGlzYWJsZSgmbWFudGlzLT50YXNr bGV0KTsKPj4gKwlJTklUX1dPUksoJm1hbnRpcy0+YmgsIG1hbnRpc19kbWFfeGZlcik7Cj4+ICsJ ZGlzYWJsZV93b3JrX3N5bmMoJm1hbnRpcy0+d29yayk7Cj4+IAlpZiAobWFudGlzLT5od2NvbmZp Zykgewo+PiAJCXJlc3VsdCA9IGNvbmZpZy0+ZnJvbnRlbmRfaW5pdChtYW50aXMsIG1hbnRpcy0+ ZmUpOwo+PiAJCWlmIChyZXN1bHQgPCAwKSB7Cj4+IEBAIC0yMzUsNyArMjM1LDcgQEAgaW50IG1h bnRpc19kdmJfaW5pdChzdHJ1Y3QgbWFudGlzX3BjaSAqbWFudGlzKQo+PiAKPj4gCS8qIEVycm9y IGNvbmRpdGlvbnMgLi4JKi8KPj4gZXJyNToKPj4gLQl0YXNrbGV0X2tpbGwoJm1hbnRpcy0+dGFz a2xldCk7Cj4+ICsJY2FuY2VsX3dvcmtfc3luYygmbWFudGlzLT53b3JrKTsKPj4gCWR2Yl9uZXRf cmVsZWFzZSgmbWFudGlzLT5kdmJuZXQpOwo+PiAJaWYgKG1hbnRpcy0+ZmUpIHsKPj4gCQlkdmJf dW5yZWdpc3Rlcl9mcm9udGVuZChtYW50aXMtPmZlKTsKPj4gQEAgLTI3Myw3ICsyNzMsNyBAQCBp bnQgbWFudGlzX2R2Yl9leGl0KHN0cnVjdCBtYW50aXNfcGNpICptYW50aXMpCj4+IAkJZHZiX2Zy b250ZW5kX2RldGFjaChtYW50aXMtPmZlKTsKPj4gCX0KPj4gCj4+IC0JdGFza2xldF9raWxsKCZt YW50aXMtPnRhc2tsZXQpOwo+PiArCWNhbmNlbF93b3JrX3N5bmMoJm1hbnRpcy0+d29yayk7Cj4+ IAlkdmJfbmV0X3JlbGVhc2UoJm1hbnRpcy0+ZHZibmV0KTsKPj4gCj4+IAltYW50aXMtPmRlbXV4 LmRteC5yZW1vdmVfZnJvbnRlbmQoJm1hbnRpcy0+ZGVtdXguZG14LCAmbWFudGlzLT5mZV9tZW0p Owo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvbmdlbmUvbmdlbmUtY29yZS5jIGIv ZHJpdmVycy9tZWRpYS9wY2kvbmdlbmUvbmdlbmUtY29yZS5jCj4+IGluZGV4IDc0ODFmNTUzZjk1 OS4uNTIxMWQ2Nzk2NzQ4IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9uZ2VuZS9u Z2VuZS1jb3JlLmMKPj4gKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvbmdlbmUvbmdlbmUtY29yZS5j Cj4+IEBAIC0yMSw2ICsyMSw3IEBACj4+ICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJp Yy5oPgo+PiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KPj4gI2luY2x1ZGUgPGxpbnV4L3Zt YWxsb2MuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KPj4gCj4+ICNpbmNsdWRl ICJuZ2VuZS5oIgo+PiAKPj4gQEAgLTUwLDkgKzUxLDkgQEAgRFZCX0RFRklORV9NT0RfT1BUX0FE QVBURVJfTlIoYWRhcHRlcl9ucik7Cj4+IC8qIG5HZW5lIGludGVycnVwdCBoYW5kbGVyICoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwo+PiAvKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KPj4gCj4+IC1zdGF0aWMgdm9pZCBldmVudF90YXNrbGV0KHN0cnVjdCB0 YXNrbGV0X3N0cnVjdCAqdCkKPj4gK3N0YXRpYyB2b2lkIGV2ZW50X3dvcmsoc3RydWN0IHdvcmtf c3RydWN0ICp0KQo+PiB7Cj4+IC0Jc3RydWN0IG5nZW5lICpkZXYgPSBmcm9tX3Rhc2tsZXQoZGV2 LCB0LCBldmVudF90YXNrbGV0KTsKPj4gKwlzdHJ1Y3QgbmdlbmUgKmRldiA9IGZyb21fd29yayhk ZXYsIHQsIGV2ZW50X3dvcmspOwo+PiAKPj4gCXdoaWxlIChkZXYtPkV2ZW50UXVldWVSZWFkSW5k ZXggIT0gZGV2LT5FdmVudFF1ZXVlV3JpdGVJbmRleCkgewo+PiAJCXN0cnVjdCBFVkVOVF9CVUZG RVIgRXZlbnQgPQo+PiBAQCAtNjgsOSArNjksOSBAQCBzdGF0aWMgdm9pZCBldmVudF90YXNrbGV0 KHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCkKPj4gCX0KPj4gfQo+PiAKPj4gLXN0YXRpYyB2b2lk IGRlbXV4X3Rhc2tsZXQoc3RydWN0IHRhc2tsZXRfc3RydWN0ICp0KQo+PiArc3RhdGljIHZvaWQg ZGVtdXhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnQpCj4+IHsKPj4gLQlzdHJ1Y3QgbmdlbmVf Y2hhbm5lbCAqY2hhbiA9IGZyb21fdGFza2xldChjaGFuLCB0LCBkZW11eF90YXNrbGV0KTsKPj4g KwlzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbiA9IGZyb21fd29yayhjaGFuLCB0LCBkZW11eF93 b3JrKTsKPj4gCXN0cnVjdCBkZXZpY2UgKnBkZXYgPSAmY2hhbi0+ZGV2LT5wY2lfZGV2LT5kZXY7 Cj4+IAlzdHJ1Y3QgU0J1ZmZlckhlYWRlciAqQ3VyID0gY2hhbi0+bmV4dEJ1ZmZlcjsKPj4gCj4+ IEBAIC0yMDQsNyArMjA1LDcgQEAgc3RhdGljIGlycXJldHVybl90IGlycV9oYW5kbGVyKGludCBp cnEsIHZvaWQgKmRldl9pZCkKPj4gCQkJZGV2LT5FdmVudFF1ZXVlT3ZlcmZsb3dGbGFnID0gMTsK Pj4gCQl9Cj4+IAkJZGV2LT5FdmVudEJ1ZmZlci0+RXZlbnRTdGF0dXMgJj0gfjB4ODA7Cj4+IC0J CXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+ZXZlbnRfdGFza2xldCk7Cj4+ICsJCXF1ZXVlX3dvcmso c3lzdGVtX2JoX3dxLCAmZGV2LT5ldmVudF93b3JrKTsKPj4gCQlyYyA9IElSUV9IQU5ETEVEOwo+ PiAJfQo+PiAKPj4gQEAgLTIxNyw4ICsyMTgsOCBAQCBzdGF0aWMgaXJxcmV0dXJuX3QgaXJxX2hh bmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQo+PiAJCQkgICAgIG5nZW5lQnVmZmVyLlNSLkZs YWdzICYgMHhDMCkgPT0gMHg4MCkgewo+PiAJCQkJZGV2LT5jaGFubmVsW2ldLm5leHRCdWZmZXIt Pgo+PiAJCQkJCW5nZW5lQnVmZmVyLlNSLkZsYWdzIHw9IDB4NDA7Cj4+IC0JCQkJdGFza2xldF9z Y2hlZHVsZSgKPj4gLQkJCQkJJmRldi0+Y2hhbm5lbFtpXS5kZW11eF90YXNrbGV0KTsKPj4gKwkJ CQlxdWV1ZV93b3JrKHN5c3RlbV9iaF93cSwKPj4gKwkJCQkJJmRldi0+Y2hhbm5lbFtpXS5kZW11 eF93b3JrKTsKPj4gCQkJCXJjID0gSVJRX0hBTkRMRUQ7Cj4+IAkJCX0KPj4gCQl9Cj4+IEBAIC0x MTgxLDcgKzExODIsNyBAQCBzdGF0aWMgdm9pZCBuZ2VuZV9pbml0KHN0cnVjdCBuZ2VuZSAqZGV2 KQo+PiAJc3RydWN0IGRldmljZSAqcGRldiA9ICZkZXYtPnBjaV9kZXYtPmRldjsKPj4gCWludCBp Owo+PiAKPj4gLQl0YXNrbGV0X3NldHVwKCZkZXYtPmV2ZW50X3Rhc2tsZXQsIGV2ZW50X3Rhc2ts ZXQpOwo+PiArCUlOSVRfV09SSygmZGV2LT5ldmVudF93b3JrLCBldmVudF93b3JrKTsKPj4gCj4+ IAltZW1zZXRfaW8oZGV2LT5pb21lbSArIDB4YzAwMCwgMHgwMCwgMHgyMjApOwo+PiAJbWVtc2V0 X2lvKGRldi0+aW9tZW0gKyAweGM0MDAsIDB4MDAsIDB4MTAwKTsKPj4gQEAgLTEzOTUsNyArMTM5 Niw3IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfY2hhbm5lbChzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAq Y2hhbikKPj4gCWlmIChjaGFuLT5ydW5uaW5nKQo+PiAJCXNldF90cmFuc2ZlcihjaGFuLCAwKTsK Pj4gCj4+IC0JdGFza2xldF9raWxsKCZjaGFuLT5kZW11eF90YXNrbGV0KTsKPj4gKwljYW5jZWxf d29ya19zeW5jKCZjaGFuLT5kZW11eF93b3JrKTsKPj4gCj4+IAlpZiAoY2hhbi0+Y2lfZGV2KSB7 Cj4+IAkJZHZiX3VucmVnaXN0ZXJfZGV2aWNlKGNoYW4tPmNpX2Rldik7Cj4+IEBAIC0xNDQ1LDcg KzE0NDYsNyBAQCBzdGF0aWMgaW50IGluaXRfY2hhbm5lbChzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAq Y2hhbikKPj4gCXN0cnVjdCBuZ2VuZV9pbmZvICpuaSA9IGRldi0+Y2FyZF9pbmZvOwo+PiAJaW50 IGlvID0gbmktPmlvX3R5cGVbbnJdOwo+PiAKPj4gLQl0YXNrbGV0X3NldHVwKCZjaGFuLT5kZW11 eF90YXNrbGV0LCBkZW11eF90YXNrbGV0KTsKPj4gKwlJTklUX1dPUksoJmNoYW4tPmRlbXV4X3dv cmssIGRlbXV4X3dvcmspOwo+PiAJY2hhbi0+dXNlcnMgPSAwOwo+PiAJY2hhbi0+dHlwZSA9IGlv Owo+PiAJY2hhbi0+bW9kZSA9IGNoYW4tPnR5cGU7CS8qIGZvciBub3cgb25seSBvbmUgbW9kZSAq Lwo+PiBAQCAtMTY0Nyw3ICsxNjQ4LDcgQEAgdm9pZCBuZ2VuZV9yZW1vdmUoc3RydWN0IHBjaV9k ZXYgKnBkZXYpCj4+IAlzdHJ1Y3QgbmdlbmUgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsK Pj4gCWludCBpOwo+PiAKPj4gLQl0YXNrbGV0X2tpbGwoJmRldi0+ZXZlbnRfdGFza2xldCk7Cj4+ ICsJY2FuY2VsX3dvcmtfc3luYygmZGV2LT5ldmVudF93b3JrKTsKPj4gCWZvciAoaSA9IE1BWF9T VFJFQU0gLSAxOyBpID49IDA7IGktLSkKPj4gCQlyZWxlYXNlX2NoYW5uZWwoJmRldi0+Y2hhbm5l bFtpXSk7Cj4+IAlpZiAoZGV2LT5jaS5lbikKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEv cGNpL25nZW5lL25nZW5lLmggYi9kcml2ZXJzL21lZGlhL3BjaS9uZ2VuZS9uZ2VuZS5oCj4+IGlu ZGV4IGQxZDdkYTg0Y2Q5ZC4uYzJhMjNmNmRiZTA5IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21l ZGlhL3BjaS9uZ2VuZS9uZ2VuZS5oCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL25nZW5lL25n ZW5lLmgKPj4gQEAgLTE2LDYgKzE2LDcgQEAKPj4gI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0 Lmg+Cj4+IAo+PiAjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+Cj4+ICsjaW5jbHVkZSA8 bGludXgvd29ya3F1ZXVlLmg+Cj4+IAo+PiAjaW5jbHVkZSA8bWVkaWEvZG14ZGV2Lmg+Cj4+ICNp bmNsdWRlIDxtZWRpYS9kdmJkZXYuaD4KPj4gQEAgLTYyMSw3ICs2MjIsNyBAQCBzdHJ1Y3Qgbmdl bmVfY2hhbm5lbCB7Cj4+IAlpbnQgICAgICAgICAgICAgICAgICAgdXNlcnM7Cj4+IAlzdHJ1Y3Qg dmlkZW9fZGV2aWNlICAqdjRsX2RldjsKPj4gCXN0cnVjdCBkdmJfZGV2aWNlICAgICpjaV9kZXY7 Cj4+IC0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IGRlbXV4X3Rhc2tsZXQ7Cj4+ICsJc3RydWN0IHdv cmtfc3RydWN0IGRlbXV4X3dvcms7Cj4+IAo+PiAJc3RydWN0IFNCdWZmZXJIZWFkZXIgKm5leHRC dWZmZXI7Cj4+IAllbnVtIEtTU1RBVEUgICAgICAgICAgU3RhdGU7Cj4+IEBAIC03MTcsNyArNzE4 LDcgQEAgc3RydWN0IG5nZW5lIHsKPj4gCXN0cnVjdCBFVkVOVF9CVUZGRVIgICBFdmVudFF1ZXVl W0VWRU5UX1FVRVVFX1NJWkVdOwo+PiAJaW50ICAgICAgICAgICAgICAgICAgIEV2ZW50UXVldWVP dmVyZmxvd0NvdW50Owo+PiAJaW50ICAgICAgICAgICAgICAgICAgIEV2ZW50UXVldWVPdmVyZmxv d0ZsYWc7Cj4+IC0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IGV2ZW50X3Rhc2tsZXQ7Cj4+ICsJc3Ry dWN0IHdvcmtfc3RydWN0IGV2ZW50X3dvcms7Cj4+IAlzdHJ1Y3QgRVZFTlRfQlVGRkVSICAqRXZl bnRCdWZmZXI7Cj4+IAlpbnQgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZVdyaXRlSW5kZXg7 Cj4+IAlpbnQgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZVJlYWRJbmRleDsKPj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NtaXBjaWUvc21pcGNpZS1tYWluLmMgYi9kcml2ZXJz L21lZGlhL3BjaS9zbWlwY2llL3NtaXBjaWUtbWFpbi5jCj4+IGluZGV4IDBjMzAwZDAxOWQ5Yy4u N2RhNmJiNTU2NjBiIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9zbWlwY2llL3Nt aXBjaWUtbWFpbi5jCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NtaXBjaWUvc21pcGNpZS1t YWluLmMKPj4gQEAgLTI3OSwxMCArMjc5LDEwIEBAIHN0YXRpYyB2b2lkIHNtaV9wb3J0X2NsZWFy SW50ZXJydXB0KHN0cnVjdCBzbWlfcG9ydCAqcG9ydCkKPj4gCQkocG9ydC0+X2RtYUludGVycnVw dENIMCB8IHBvcnQtPl9kbWFJbnRlcnJ1cHRDSDEpKTsKPj4gfQo+PiAKPj4gLS8qIHRhc2tsZXQg aGFuZGxlcjogRE1BIGRhdGEgdG8gZG14LiovCj4+IC1zdGF0aWMgdm9pZCBzbWlfZG1hX3hmZXIo c3RydWN0IHRhc2tsZXRfc3RydWN0ICp0KQo+PiArLyogd29yayBoYW5kbGVyOiBETUEgZGF0YSB0 byBkbXguKi8KPj4gK3N0YXRpYyB2b2lkIHNtaV9kbWFfeGZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3Qg KnQpCj4+IHsKPj4gLQlzdHJ1Y3Qgc21pX3BvcnQgKnBvcnQgPSBmcm9tX3Rhc2tsZXQocG9ydCwg dCwgdGFza2xldCk7Cj4+ICsJc3RydWN0IHNtaV9wb3J0ICpwb3J0ID0gZnJvbV93b3JrKHBvcnQs IHQsIHdvcmspOwo+PiAJc3RydWN0IHNtaV9kZXYgKmRldiA9IHBvcnQtPmRldjsKPj4gCXUzMiBp bnRyX3N0YXR1cywgZmluaXNoZWREYXRhLCBkbWFNYW5hZ2VtZW50Owo+PiAJdTggZG1hQ2hhbjBT dGF0ZSwgZG1hQ2hhbjFTdGF0ZTsKPj4gQEAgLTQyNiw4ICs0MjYsOCBAQCBzdGF0aWMgaW50IHNt aV9wb3J0X2luaXQoc3RydWN0IHNtaV9wb3J0ICpwb3J0LCBpbnQgZG1hQ2hhblVzZWQpCj4+IAl9 Cj4+IAo+PiAJc21pX3BvcnRfZGlzYWJsZUludGVycnVwdChwb3J0KTsKPj4gLQl0YXNrbGV0X3Nl dHVwKCZwb3J0LT50YXNrbGV0LCBzbWlfZG1hX3hmZXIpOwo+PiAtCXRhc2tsZXRfZGlzYWJsZSgm cG9ydC0+dGFza2xldCk7Cj4+ICsJSU5JVF9XT1JLKCZwb3J0LT53b3JrLCBzbWlfZG1hX3hmZXIp Owo+PiArCWRpc2FibGVfd29ya19zeW5jKCZwb3J0LT53b3JrKTsKPj4gCXBvcnQtPmVuYWJsZSA9 IDE7Cj4+IAlyZXR1cm4gMDsKPj4gZXJyOgo+PiBAQCAtNDM4LDcgKzQzOCw3IEBAIHN0YXRpYyBp bnQgc21pX3BvcnRfaW5pdChzdHJ1Y3Qgc21pX3BvcnQgKnBvcnQsIGludCBkbWFDaGFuVXNlZCkK Pj4gc3RhdGljIHZvaWQgc21pX3BvcnRfZXhpdChzdHJ1Y3Qgc21pX3BvcnQgKnBvcnQpCj4+IHsK Pj4gCXNtaV9wb3J0X2Rpc2FibGVJbnRlcnJ1cHQocG9ydCk7Cj4+IC0JdGFza2xldF9raWxsKCZw b3J0LT50YXNrbGV0KTsKPj4gKwljYW5jZWxfd29ya19zeW5jKCZwb3J0LT53b3JrKTsKPj4gCXNt aV9wb3J0X2RtYV9mcmVlKHBvcnQpOwo+PiAJcG9ydC0+ZW5hYmxlID0gMDsKPj4gfQo+PiBAQCAt NDUyLDcgKzQ1Miw3IEBAIHN0YXRpYyBpbnQgc21pX3BvcnRfaXJxKHN0cnVjdCBzbWlfcG9ydCAq cG9ydCwgdTMyIGludF9zdGF0dXMpCj4+IAkJc21pX3BvcnRfZGlzYWJsZUludGVycnVwdChwb3J0 KTsKPj4gCQlwb3J0LT5faW50X3N0YXR1cyA9IGludF9zdGF0dXM7Cj4+IAkJc21pX3BvcnRfY2xl YXJJbnRlcnJ1cHQocG9ydCk7Cj4+IC0JCXRhc2tsZXRfc2NoZWR1bGUoJnBvcnQtPnRhc2tsZXQp Owo+PiArCQlxdWV1ZV93b3JrKHN5c3RlbV9iaF93cSwgJnBvcnQtPndvcmspOwo+PiAJCWhhbmRs ZWQgPSAxOwo+PiAJfQo+PiAJcmV0dXJuIGhhbmRsZWQ7Cj4+IEBAIC04MjMsNyArODIzLDcgQEAg c3RhdGljIGludCBzbWlfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZl ZWQpCj4+IAkJc21pX3BvcnRfY2xlYXJJbnRlcnJ1cHQocG9ydCk7Cj4+IAkJc21pX3BvcnRfZW5h YmxlSW50ZXJydXB0KHBvcnQpOwo+PiAJCXNtaV93cml0ZShwb3J0LT5ETUFfTUFOQUdFTUVOVCwg ZG1hTWFuYWdlbWVudCk7Cj4+IC0JCXRhc2tsZXRfZW5hYmxlKCZwb3J0LT50YXNrbGV0KTsKPj4g KwkJZW5hYmxlX2FuZF9xdWV1ZV93b3JrKHN5c3RlbV9iaF93cSwgJnBvcnQtPndvcmspOwo+PiAJ fQo+PiAJcmV0dXJuIHBvcnQtPnVzZXJzOwo+PiB9Cj4+IEBAIC04MzcsNyArODM3LDcgQEAgc3Rh dGljIGludCBzbWlfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkK Pj4gCWlmICgtLXBvcnQtPnVzZXJzKQo+PiAJCXJldHVybiBwb3J0LT51c2VyczsKPj4gCj4+IC0J dGFza2xldF9kaXNhYmxlKCZwb3J0LT50YXNrbGV0KTsKPj4gKwlkaXNhYmxlX3dvcmtfc3luYygm cG9ydC0+d29yayk7Cj4+IAlzbWlfcG9ydF9kaXNhYmxlSW50ZXJydXB0KHBvcnQpOwo+PiAJc21p X2NsZWFyKHBvcnQtPkRNQV9NQU5BR0VNRU5ULCAweDMwMDAzKTsKPj4gCXJldHVybiAwOwo+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc21pcGNpZS9zbWlwY2llLmggYi9kcml2ZXJz L21lZGlhL3BjaS9zbWlwY2llL3NtaXBjaWUuaAo+PiBpbmRleCAyYjVlMDE1NDgxNGMuLmYxMjRk MmNkZWFkNiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvc21pcGNpZS9zbWlwY2ll LmgKPj4gKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvc21pcGNpZS9zbWlwY2llLmgKPj4gQEAgLTE3 LDYgKzE3LDcgQEAKPj4gI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+PiAjaW5jbHVkZSA8bGludXgv ZG1hLW1hcHBpbmcuaD4KPj4gI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4gKyNpbmNsdWRlIDxs aW51eC93b3JrcXVldWUuaD4KPj4gI2luY2x1ZGUgPG1lZGlhL3JjLWNvcmUuaD4KPj4gCj4+ICNp bmNsdWRlIDxtZWRpYS9kZW11eC5oPgo+PiBAQCAtMjU3LDcgKzI1OCw3IEBAIHN0cnVjdCBzbWlf cG9ydCB7Cj4+IAl1MzIgX2RtYUludGVycnVwdENIMDsKPj4gCXUzMiBfZG1hSW50ZXJydXB0Q0gx Owo+PiAJdTMyIF9pbnRfc3RhdHVzOwo+PiAtCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0 Owo+PiArCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwo+PiAJLyogZHZiICovCj4+IAlzdHJ1Y3Qg ZG14X2Zyb250ZW5kIGh3X2Zyb250ZW5kOwo+PiAJc3RydWN0IGRteF9mcm9udGVuZCBtZW1fZnJv bnRlbmQ7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS90dHBjaS9idWRnZXQtYXYu YyBiL2RyaXZlcnMvbWVkaWEvcGNpL3R0cGNpL2J1ZGdldC1hdi5jCj4+IGluZGV4IGE0N2M1ODUw ZWY4Ny4uNmU0M2IxYTAxMTkxIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BjaS90dHBj aS9idWRnZXQtYXYuYwo+PiArKysgYi9kcml2ZXJzL21lZGlhL3BjaS90dHBjaS9idWRnZXQtYXYu Ywo+PiBAQCAtMzcsNiArMzcsNyBAQAo+PiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4+ ICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgo+PiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4K Pj4gKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KPj4gCj4+ICNpbmNsdWRlIDxtZWRpYS9k dmJfY2FfZW41MDIyMS5oPgo+PiAKPj4gQEAgLTU1LDcgKzU2LDcgQEAgc3RydWN0IGJ1ZGdldF9h diB7Cj4+IAlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkOwo+PiAJaW50IGN1cl9pbnB1dDsKPj4gCWlu dCBoYXNfc2FhNzExMzsKPj4gLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgY2lpbnRmX2lycV90YXNr bGV0Owo+PiArCXN0cnVjdCB3b3JrX3N0cnVjdCBjaWludGZfaXJxX3dvcms7Cj4+IAlpbnQgc2xv dF9zdGF0dXM7Cj4+IAlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgY2E7Cj4+IAl1OCByZWluaXRpYWxp c2VfZGVtb2Q6MTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3R0cGNpL2J1ZGdl dC1jaS5jIGIvZHJpdmVycy9tZWRpYS9wY2kvdHRwY2kvYnVkZ2V0LWNpLmMKPj4gaW5kZXggNjZl MWEwMDRlZTQzLi4xMWUwZWQ2MjcwN2UgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGNp L3R0cGNpL2J1ZGdldC1jaS5jCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL3R0cGNpL2J1ZGdl dC1jaS5jCj4+IEBAIC0xNyw2ICsxNyw3IEBACj4+ICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4+ ICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPj4gI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2Nr Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Cj4+ICNpbmNsdWRlIDxtZWRpYS9y Yy1jb3JlLmg+Cj4+IAo+PiAjaW5jbHVkZSAiYnVkZ2V0LmgiCj4+IEBAIC04MCw3ICs4MSw3IEBA IERWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOwo+PiAKPj4gc3RydWN0 IGJ1ZGdldF9jaV9pciB7Cj4+IAlzdHJ1Y3QgcmNfZGV2ICpkZXY7Cj4+IC0Jc3RydWN0IHRhc2ts ZXRfc3RydWN0IG1zcDQzMF9pcnFfdGFza2xldDsKPj4gKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbXNw NDMwX2lycV93b3JrOwo+PiAJY2hhciBuYW1lWzcyXTsgLyogNDAgKyAzMiBmb3IgKHN0cnVjdCBz YWE3MTQ2X2RldikubmFtZSAqLwo+PiAJY2hhciBwaHlzWzMyXTsKPj4gCWludCByYzVfZGV2aWNl Owo+PiBAQCAtOTEsNyArOTIsNyBAQCBzdHJ1Y3QgYnVkZ2V0X2NpX2lyIHsKPj4gCj4+IHN0cnVj dCBidWRnZXRfY2kgewo+PiAJc3RydWN0IGJ1ZGdldCBidWRnZXQ7Cj4+IC0Jc3RydWN0IHRhc2ts ZXRfc3RydWN0IGNpaW50Zl9pcnFfdGFza2xldDsKPj4gKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2lp bnRmX2lycV93b3JrOwo+PiAJaW50IHNsb3Rfc3RhdHVzOwo+PiAJaW50IGNpX2lycTsKPj4gCXN0 cnVjdCBkdmJfY2FfZW41MDIyMSBjYTsKPj4gQEAgLTk5LDkgKzEwMCw5IEBAIHN0cnVjdCBidWRn ZXRfY2kgewo+PiAJdTggdHVuZXJfcGxsX2FkZHJlc3M7IC8qIHVzZWQgZm9yIHBoaWxpcHNfdGRt MTMxNmwgY29uZmlncyAqLwo+PiB9Owo+PiAKPj4gLXN0YXRpYyB2b2lkIG1zcDQzMF9pcl9pbnRl cnJ1cHQoc3RydWN0IHRhc2tsZXRfc3RydWN0ICp0KQo+PiArc3RhdGljIHZvaWQgbXNwNDMwX2ly X2ludGVycnVwdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnQpCj4+IHsKPj4gLQlzdHJ1Y3QgYnVkZ2V0 X2NpX2lyICppciA9IGZyb21fdGFza2xldChpciwgdCwgbXNwNDMwX2lycV90YXNrbGV0KTsKPj4g KwlzdHJ1Y3QgYnVkZ2V0X2NpX2lyICppciA9IGZyb21fd29yayhpciwgdCwgbXNwNDMwX2lycV93 b3JrKTsKPj4gCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IGNvbnRhaW5lcl9vZihpciwg dHlwZW9mKCpidWRnZXRfY2kpLCBpcik7Cj4+IAlzdHJ1Y3QgcmNfZGV2ICpkZXYgPSBidWRnZXRf Y2ktPmlyLmRldjsKPj4gCXUzMiBjb21tYW5kID0gdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRn ZXRfY2ktPmJ1ZGdldCwgREVCSU5PU1dBUCwgREVCSUFERFJfSVIsIDIsIDEsIDApID4+IDg7Cj4+ IEBAIC0yMzAsNyArMjMxLDcgQEAgc3RhdGljIGludCBtc3A0MzBfaXJfaW5pdChzdHJ1Y3QgYnVk Z2V0X2NpICpidWRnZXRfY2kpCj4+IAo+PiAJYnVkZ2V0X2NpLT5pci5kZXYgPSBkZXY7Cj4+IAo+ PiAtCXRhc2tsZXRfc2V0dXAoJmJ1ZGdldF9jaS0+aXIubXNwNDMwX2lycV90YXNrbGV0LCBtc3A0 MzBfaXJfaW50ZXJydXB0KTsKPj4gKwlJTklUX1dPUksoJmJ1ZGdldF9jaS0+aXIubXNwNDMwX2ly cV93b3JrLCBtc3A0MzBfaXJfaW50ZXJydXB0KTsKPj4gCj4+IAlTQUE3MTQ2X0lFUl9FTkFCTEUo c2FhLCBNQVNLXzA2KTsKPj4gCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19J UlFISSk7Cj4+IEBAIC0yNDQsNyArMjQ1LDcgQEAgc3RhdGljIHZvaWQgbXNwNDMwX2lyX2RlaW5p dChzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kpCj4+IAo+PiAJU0FBNzE0Nl9JRVJfRElTQUJM RShzYWEsIE1BU0tfMDYpOwo+PiAJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElP X0lOUFVUKTsKPj4gLQl0YXNrbGV0X2tpbGwoJmJ1ZGdldF9jaS0+aXIubXNwNDMwX2lycV90YXNr bGV0KTsKPj4gKwljYW5jZWxfd29ya19zeW5jKCZidWRnZXRfY2ktPmlyLm1zcDQzMF9pcnFfd29y ayk7Cj4+IAo+PiAJcmNfdW5yZWdpc3Rlcl9kZXZpY2UoYnVkZ2V0X2NpLT5pci5kZXYpOwo+PiB9 Cj4+IEBAIC0zNDgsMTAgKzM0OSwxMCBAQCBzdGF0aWMgaW50IGNpaW50Zl9zbG90X3RzX2VuYWJs ZShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCkKPj4gCXJldHVybiAwOwo+PiB9 Cj4+IAo+PiAtc3RhdGljIHZvaWQgY2lpbnRmX2ludGVycnVwdChzdHJ1Y3QgdGFza2xldF9zdHJ1 Y3QgKnQpCj4+ICtzdGF0aWMgdm9pZCBjaWludGZfaW50ZXJydXB0KHN0cnVjdCB3b3JrX3N0cnVj dCAqdCkKPj4gewo+PiAtCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IGZyb21fdGFza2xl dChidWRnZXRfY2ksIHQsCj4+IC0JCQkJCQkgICBjaWludGZfaXJxX3Rhc2tsZXQpOwo+PiArCXN0 cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IGZyb21fd29yayhidWRnZXRfY2ksIHQsCj4+ICsJ CQkJCQkgICBjaWludGZfaXJxX3dvcmspOwo+PiAJc3RydWN0IHNhYTcxNDZfZGV2ICpzYWEgPSBi dWRnZXRfY2ktPmJ1ZGdldC5kZXY7Cj4+IAl1bnNpZ25lZCBpbnQgZmxhZ3M7Cj4+IAo+PiBAQCAt NDkyLDcgKzQ5Myw3IEBAIHN0YXRpYyBpbnQgY2lpbnRmX2luaXQoc3RydWN0IGJ1ZGdldF9jaSAq YnVkZ2V0X2NpKQo+PiAKPj4gCS8vIFNldHVwIENJIHNsb3QgSVJRCj4+IAlpZiAoYnVkZ2V0X2Np LT5jaV9pcnEpIHsKPj4gLQkJdGFza2xldF9zZXR1cCgmYnVkZ2V0X2NpLT5jaWludGZfaXJxX3Rh c2tsZXQsIGNpaW50Zl9pbnRlcnJ1cHQpOwo+PiArCQlJTklUX1dPUksoJmJ1ZGdldF9jaS0+Y2lp bnRmX2lycV93b3JrLCBjaWludGZfaW50ZXJydXB0KTsKPj4gCQlpZiAoYnVkZ2V0X2NpLT5zbG90 X3N0YXR1cyAhPSBTTE9UU1RBVFVTX05PTkUpIHsKPj4gCQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwg MCwgU0FBNzE0Nl9HUElPX0lSUUxPKTsKPj4gCQl9IGVsc2Ugewo+PiBAQCAtNTMyLDcgKzUzMyw3 IEBAIHN0YXRpYyB2b2lkIGNpaW50Zl9kZWluaXQoc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2Np KQo+PiAJaWYgKGJ1ZGdldF9jaS0+Y2lfaXJxKSB7Cj4+IAkJU0FBNzE0Nl9JRVJfRElTQUJMRShz YWEsIE1BU0tfMDMpOwo+PiAJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19J TlBVVCk7Cj4+IC0JCXRhc2tsZXRfa2lsbCgmYnVkZ2V0X2NpLT5jaWludGZfaXJxX3Rhc2tsZXQp Owo+PiArCQljYW5jZWxfd29ya19zeW5jKCZidWRnZXRfY2ktPmNpaW50Zl9pcnFfd29yayk7Cj4+ IAl9Cj4+IAo+PiAJLy8gcmVzZXQgaW50ZXJmYWNlCj4+IEBAIC01NTgsMTMgKzU1OSwxMyBAQCBz dGF0aWMgdm9pZCBidWRnZXRfY2lfaXJxKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCB1MzIgKiBp c3IpCj4+IAlkcHJpbnRrKDgsICJkZXY6ICVwLCBidWRnZXRfY2k6ICVwXG4iLCBkZXYsIGJ1ZGdl dF9jaSk7Cj4+IAo+PiAJaWYgKCppc3IgJiBNQVNLXzA2KQo+PiAtCQl0YXNrbGV0X3NjaGVkdWxl KCZidWRnZXRfY2ktPmlyLm1zcDQzMF9pcnFfdGFza2xldCk7Cj4+ICsJCXF1ZXVlX3dvcmsoc3lz dGVtX2JoX3dxLCAmYnVkZ2V0X2NpLT5pci5tc3A0MzBfaXJxX3dvcmspOwo+PiAKPj4gCWlmICgq aXNyICYgTUFTS18xMCkKPj4gCQl0dHBjaV9idWRnZXRfaXJxMTBfaGFuZGxlcihkZXYsIGlzcik7 Cj4+IAo+PiAJaWYgKCgqaXNyICYgTUFTS18wMykgJiYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmNpX3By ZXNlbnQpICYmIChidWRnZXRfY2ktPmNpX2lycSkpCj4+IC0JCXRhc2tsZXRfc2NoZWR1bGUoJmJ1 ZGdldF9jaS0+Y2lpbnRmX2lycV90YXNrbGV0KTsKPj4gKwkJcXVldWVfd29yayhzeXN0ZW1fYmhf d3EsICZidWRnZXRfY2ktPmNpaW50Zl9pcnFfd29yayk7Cj4+IH0KPj4gCj4+IHN0YXRpYyB1OCBw aGlsaXBzX3N1MTI3OF90dF9pbml0dGFiW10gPSB7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21l ZGlhL3BjaS90dHBjaS9idWRnZXQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wY2kvdHRwY2kvYnVk Z2V0LWNvcmUuYwo+PiBpbmRleCAyNWY0NGMzZWViZjMuLjM0NDNjMTJkYzlmMiAxMDA2NDQKPj4g LS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvdHRwY2kvYnVkZ2V0LWNvcmUuYwo+PiArKysgYi9kcml2 ZXJzL21lZGlhL3BjaS90dHBjaS9idWRnZXQtY29yZS5jCj4+IEBAIC0xNzEsOSArMTcxLDkgQEAg c3RhdGljIGludCBidWRnZXRfcmVhZF9mZV9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUs Cj4+IAlyZXR1cm4gcmV0Owo+PiB9Cj4+IAo+PiAtc3RhdGljIHZvaWQgdnBlaXJxKHN0cnVjdCB0 YXNrbGV0X3N0cnVjdCAqdCkKPj4gK3N0YXRpYyB2b2lkIHZwZWlycShzdHJ1Y3Qgd29ya19zdHJ1 Y3QgKnQpCj4+IHsKPj4gLQlzdHJ1Y3QgYnVkZ2V0ICpidWRnZXQgPSBmcm9tX3Rhc2tsZXQoYnVk Z2V0LCB0LCB2cGVfdGFza2xldCk7Cj4+ICsJc3RydWN0IGJ1ZGdldCAqYnVkZ2V0ID0gZnJvbV93 b3JrKGJ1ZGdldCwgdCwgdnBlX3dvcmspOwo+PiAJdTggKm1lbSA9ICh1OCAqKSAoYnVkZ2V0LT5n cmFiYmluZyk7Cj4+IAl1MzIgb2xkZG1hID0gYnVkZ2V0LT50dGJwOwo+PiAJdTMyIG5ld2RtYSA9 IHNhYTcxNDZfcmVhZChidWRnZXQtPmRldiwgUENJX1ZEUDMpOwo+PiBAQCAtNTIwLDcgKzUyMCw3 IEBAIGludCB0dHBjaV9idWRnZXRfaW5pdChzdHJ1Y3QgYnVkZ2V0ICpidWRnZXQsIHN0cnVjdCBz YWE3MTQ2X2RldiAqZGV2LAo+PiAJLyogdXBsb2FkIGFsbCAqLwo+PiAJc2FhNzE0Nl93cml0ZShk ZXYsIEdQSU9fQ1RSTCwgMHgwMDAwMDApOwo+PiAKPj4gLQl0YXNrbGV0X3NldHVwKCZidWRnZXQt PnZwZV90YXNrbGV0LCB2cGVpcnEpOwo+PiArCUlOSVRfV09SSygmYnVkZ2V0LT52cGVfd29yaywg dnBlaXJxKTsKPj4gCj4+IAkvKiBmcm9udGVuZCBwb3dlciBvbiAqLwo+PiAJaWYgKGJpLT50eXBl ICE9IEJVREdFVF9GU19BQ1RJVlkpCj4+IEBAIC01NTcsNyArNTU3LDcgQEAgaW50IHR0cGNpX2J1 ZGdldF9kZWluaXQoc3RydWN0IGJ1ZGdldCAqYnVkZ2V0KQo+PiAKPj4gCWJ1ZGdldF91bnJlZ2lz dGVyKGJ1ZGdldCk7Cj4+IAo+PiAtCXRhc2tsZXRfa2lsbCgmYnVkZ2V0LT52cGVfdGFza2xldCk7 Cj4+ICsJY2FuY2VsX3dvcmtfc3luYygmYnVkZ2V0LT52cGVfd29yayk7Cj4+IAo+PiAJc2FhNzE0 Nl92ZnJlZV9kZXN0cm95X3BndGFibGUoZGV2LT5wY2ksIGJ1ZGdldC0+Z3JhYmJpbmcsICZidWRn ZXQtPnB0KTsKPj4gCj4+IEBAIC01NzUsNyArNTc1LDcgQEAgdm9pZCB0dHBjaV9idWRnZXRfaXJx MTBfaGFuZGxlcihzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgdTMyICogaXNyKQo+PiAJZHByaW50 ayg4LCAiZGV2OiAlcCwgYnVkZ2V0OiAlcFxuIiwgZGV2LCBidWRnZXQpOwo+PiAKPj4gCWlmICgq aXNyICYgTUFTS18xMCkKPj4gLQkJdGFza2xldF9zY2hlZHVsZSgmYnVkZ2V0LT52cGVfdGFza2xl dCk7Cj4+ICsJCXF1ZXVlX3dvcmsoc3lzdGVtX2JoX3dxLCAmYnVkZ2V0LT52cGVfd29yayk7Cj4+ IH0KPj4gCj4+IHZvaWQgdHRwY2lfYnVkZ2V0X3NldF92aWRlb19wb3J0KHN0cnVjdCBzYWE3MTQ2 X2RldiAqZGV2LCBpbnQgdmlkZW9fcG9ydCkKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEv cGNpL3R0cGNpL2J1ZGdldC5oIGIvZHJpdmVycy9tZWRpYS9wY2kvdHRwY2kvYnVkZ2V0LmgKPj4g aW5kZXggYmQ4NzQzMmU2Y2RlLi5hM2VlNzVlMzI2YjQgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMv bWVkaWEvcGNpL3R0cGNpL2J1ZGdldC5oCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL3R0cGNp L2J1ZGdldC5oCj4+IEBAIC0xMiw2ICsxMiw3IEBACj4+IAo+PiAjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+Cj4+ICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3dv cmtxdWV1ZS5oPgo+PiAKPj4gI2luY2x1ZGUgPG1lZGlhL2Rydi1pbnRmL3NhYTcxNDYuaD4KPj4g Cj4+IEBAIC00OSw4ICs1MCw4IEBAIHN0cnVjdCBidWRnZXQgewo+PiAJdW5zaWduZWQgY2hhciAq Z3JhYmJpbmc7Cj4+IAlzdHJ1Y3Qgc2FhNzE0Nl9wZ3RhYmxlIHB0Owo+PiAKPj4gLQlzdHJ1Y3Qg dGFza2xldF9zdHJ1Y3QgZmlkYl90YXNrbGV0Owo+PiAtCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB2 cGVfdGFza2xldDsKPj4gKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZmlkYl93b3JrOwo+PiArCXN0cnVj dCB3b3JrX3N0cnVjdCB2cGVfd29yazsKPj4gCj4+IAlzdHJ1Y3QgZG14ZGV2IGRteGRldjsKPj4g CXN0cnVjdCBkdmJfZGVtdXggZGVtdXg7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Bj aS90dzU4NjQvdHc1ODY0LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL3R3NTg2NC90dzU4NjQt Y29yZS5jCj4+IGluZGV4IDU2MGZmMWRkY2M4My4uYTU4YzI2OGU5NGE4IDEwMDY0NAo+PiAtLS0g YS9kcml2ZXJzL21lZGlhL3BjaS90dzU4NjQvdHc1ODY0LWNvcmUuYwo+PiArKysgYi9kcml2ZXJz L21lZGlhL3BjaS90dzU4NjQvdHc1ODY0LWNvcmUuYwo+PiBAQCAtMTQ0LDcgKzE0NCw3IEBAIHN0 YXRpYyB2b2lkIHR3NTg2NF9oMjY0X2lzcihzdHJ1Y3QgdHc1ODY0X2RldiAqZGV2KQo+PiAJCWN1 cl9mcmFtZS0+Z29wX3NlcW5vID0gaW5wdXQtPmZyYW1lX2dvcF9zZXFubzsKPj4gCj4+IAkJZGV2 LT5oMjY0X2J1Zl93X2luZGV4ID0gbmV4dF9mcmFtZV9pbmRleDsKPj4gLQkJdGFza2xldF9zY2hl ZHVsZSgmZGV2LT50YXNrbGV0KTsKPj4gKwkJcXVldWVfd29yayhzeXN0ZW1fYmhfd3EsICZkZXYt PndvcmspOwo+PiAKPj4gCQljdXJfZnJhbWUgPSBuZXh0X2ZyYW1lOwo+PiAKPj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvbWVkaWEvcGNpL3R3NTg2NC90dzU4NjQtdmlkZW8uYyBiL2RyaXZlcnMvbWVk aWEvcGNpL3R3NTg2NC90dzU4NjQtdmlkZW8uYwo+PiBpbmRleCA4YjFhYWU0YjYzMTkuLmFjMjI0 OTYyNjUwNiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvdHc1ODY0L3R3NTg2NC12 aWRlby5jCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL3R3NTg2NC90dzU4NjQtdmlkZW8uYwo+ PiBAQCAtNiw2ICs2LDcgQEAKPj4gICovCj4+IAo+PiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ Cj4+ICsjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Cj4+ICNpbmNsdWRlIDxtZWRpYS92NGwy LWNvbW1vbi5oPgo+PiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgo+PiAjaW5jbHVkZSA8 bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KPj4gQEAgLTE3NSw3ICsxNzYsNyBAQCBzdGF0 aWMgY29uc3QgdW5zaWduZWQgaW50IGludHJhNHg0X2xhbWJkYTNbXSA9IHsKPj4gc3RhdGljIHY0 bDJfc3RkX2lkIHR3NTg2NF9nZXRfdjRsMl9zdGQoZW51bSB0dzU4NjRfdmlkX3N0ZCBzdGQpOwo+ PiBzdGF0aWMgZW51bSB0dzU4NjRfdmlkX3N0ZCB0dzU4NjRfZnJvbV92NGwyX3N0ZCh2NGwyX3N0 ZF9pZCB2NGwyX3N0ZCk7Cj4+IAo+PiAtc3RhdGljIHZvaWQgdHc1ODY0X2hhbmRsZV9mcmFtZV90 YXNrKHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCk7Cj4+ICtzdGF0aWMgdm9pZCB0dzU4NjRfaGFu ZGxlX2ZyYW1lX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp0KTsKPj4gc3RhdGljIHZvaWQgdHc1 ODY0X2hhbmRsZV9mcmFtZShzdHJ1Y3QgdHc1ODY0X2gyNjRfZnJhbWUgKmZyYW1lKTsKPj4gc3Rh dGljIHZvaWQgdHc1ODY0X2ZyYW1lX2ludGVydmFsX3NldChzdHJ1Y3QgdHc1ODY0X2lucHV0ICpp bnB1dCk7Cj4+IAo+PiBAQCAtMTA2Miw3ICsxMDYzLDcgQEAgaW50IHR3NTg2NF92aWRlb19pbml0 KHN0cnVjdCB0dzU4NjRfZGV2ICpkZXYsIGludCAqdmlkZW9fbnIpCj4+IAlkZXYtPmlycW1hc2sg fD0gVFc1ODY0X0lOVFJfVkxDX0RPTkUgfCBUVzU4NjRfSU5UUl9USU1FUjsKPj4gCXR3NTg2NF9p cnFtYXNrX2FwcGx5KGRldik7Cj4+IAo+PiAtCXRhc2tsZXRfc2V0dXAoJmRldi0+dGFza2xldCwg dHc1ODY0X2hhbmRsZV9mcmFtZV90YXNrKTsKPj4gKwlJTklUX1dPUksoJmRldi0+d29yaywgdHc1 ODY0X2hhbmRsZV9mcmFtZV90YXNrKTsKPj4gCj4+IAlmb3IgKGkgPSAwOyBpIDwgVFc1ODY0X0lO UFVUUzsgaSsrKSB7Cj4+IAkJZGV2LT5pbnB1dHNbaV0ucm9vdCA9IGRldjsKPj4gQEAgLTEwNzks NyArMTA4MCw3IEBAIGludCB0dzU4NjRfdmlkZW9faW5pdChzdHJ1Y3QgdHc1ODY0X2RldiAqZGV2 LCBpbnQgKnZpZGVvX25yKQo+PiAJZm9yIChpID0gbGFzdF9pbnB1dF9ucl9yZWdpc3RlcmVkOyBp ID49IDA7IGktLSkKPj4gCQl0dzU4NjRfdmlkZW9faW5wdXRfZmluaSgmZGV2LT5pbnB1dHNbaV0p Owo+PiAKPj4gLQl0YXNrbGV0X2tpbGwoJmRldi0+dGFza2xldCk7Cj4+ICsJY2FuY2VsX3dvcmtf c3luYygmZGV2LT53b3JrKTsKPj4gCj4+IGZyZWVfZG1hOgo+PiAJZm9yIChpID0gbGFzdF9kbWFf YWxsb2NhdGVkOyBpID49IDA7IGktLSkgewo+PiBAQCAtMTE5OCw3ICsxMTk5LDcgQEAgdm9pZCB0 dzU4NjRfdmlkZW9fZmluaShzdHJ1Y3QgdHc1ODY0X2RldiAqZGV2KQo+PiB7Cj4+IAlpbnQgaTsK Pj4gCj4+IC0JdGFza2xldF9raWxsKCZkZXYtPnRhc2tsZXQpOwo+PiArCWNhbmNlbF93b3JrX3N5 bmMoJmRldi0+d29yayk7Cj4+IAo+PiAJZm9yIChpID0gMDsgaSA8IFRXNTg2NF9JTlBVVFM7IGkr KykKPj4gCQl0dzU4NjRfdmlkZW9faW5wdXRfZmluaSgmZGV2LT5pbnB1dHNbaV0pOwo+PiBAQCAt MTMxNSw5ICsxMzE2LDkgQEAgc3RhdGljIGludCB0dzU4NjRfaXNfbW90aW9uX3RyaWdnZXJlZChz dHJ1Y3QgdHc1ODY0X2gyNjRfZnJhbWUgKmZyYW1lKQo+PiAJcmV0dXJuIGRldGVjdGVkOwo+PiB9 Cj4+IAo+PiAtc3RhdGljIHZvaWQgdHc1ODY0X2hhbmRsZV9mcmFtZV90YXNrKHN0cnVjdCB0YXNr bGV0X3N0cnVjdCAqdCkKPj4gK3N0YXRpYyB2b2lkIHR3NTg2NF9oYW5kbGVfZnJhbWVfdGFzayhz dHJ1Y3Qgd29ya19zdHJ1Y3QgKnQpCj4+IHsKPj4gLQlzdHJ1Y3QgdHc1ODY0X2RldiAqZGV2ID0g ZnJvbV90YXNrbGV0KGRldiwgdCwgdGFza2xldCk7Cj4+ICsJc3RydWN0IHR3NTg2NF9kZXYgKmRl diA9IGZyb21fd29yayhkZXYsIHQsIHdvcmspOwo+PiAJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4g CWludCBiYXRjaF9zaXplID0gSDI2NF9CVUZfQ05UOwo+PiAKPj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvbWVkaWEvcGNpL3R3NTg2NC90dzU4NjQuaCBiL2RyaXZlcnMvbWVkaWEvcGNpL3R3NTg2NC90 dzU4NjQuaAo+PiBpbmRleCBhOGI2ZmJkNWI3MTAuLjI3ODM3Mzg1OTA5OCAxMDA2NDQKPj4gLS0t IGEvZHJpdmVycy9tZWRpYS9wY2kvdHc1ODY0L3R3NTg2NC5oCj4+ICsrKyBiL2RyaXZlcnMvbWVk aWEvcGNpL3R3NTg2NC90dzU4NjQuaAo+PiBAQCAtMTIsNiArMTIsNyBAQAo+PiAjaW5jbHVkZSA8 bGludXgvbXV0ZXguaD4KPj4gI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4+ICNpbmNsdWRlIDxsaW51 eC9pbnRlcnJ1cHQuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KPj4gCj4+ICNp bmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgo+PiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0 bC5oPgo+PiBAQCAtODUsNyArODYsNyBAQCBzdHJ1Y3QgdHc1ODY0X2lucHV0IHsKPj4gCWludCBu cjsgLyogaW5wdXQgbnVtYmVyICovCj4+IAlzdHJ1Y3QgdHc1ODY0X2RldiAqcm9vdDsKPj4gCXN0 cnVjdCBtdXRleCBsb2NrOyAvKiB1c2VkIGZvciB2aWRxIGFuZCB2ZGV2ICovCj4+IC0Jc3Bpbmxv Y2tfdCBzbG9jazsgLyogdXNlZCBmb3Igc3luYyBiZXR3ZWVuIElTUiwgdGFza2xldCAmIFY0TDIg QVBJICovCj4+ICsJc3BpbmxvY2tfdCBzbG9jazsgLyogdXNlZCBmb3Igc3luYyBiZXR3ZWVuIElT Uiwgd29yayAmIFY0TDIgQVBJICovCj4+IAlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7Cj4+IAlz dHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgaGRsOwo+PiAJc3RydWN0IHZiMl9xdWV1ZSB2aWRxOwo+ PiBAQCAtMTQyLDcgKzE0Myw3IEBAIHN0cnVjdCB0dzU4NjRfaDI2NF9mcmFtZSB7Cj4+IAo+PiAv KiBnbG9iYWwgZGV2aWNlIHN0YXR1cyAqLwo+PiBzdHJ1Y3QgdHc1ODY0X2RldiB7Cj4+IC0Jc3Bp bmxvY2tfdCBzbG9jazsgLyogdXNlZCBmb3Igc3luYyBiZXR3ZWVuIElTUiwgdGFza2xldCAmIFY0 TDIgQVBJICovCj4+ICsJc3BpbmxvY2tfdCBzbG9jazsgLyogdXNlZCBmb3Igc3luYyBiZXR3ZWVu IElTUiwgd29yayAmIFY0TDIgQVBJICovCj4+IAlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7 Cj4+IAlzdHJ1Y3QgdHc1ODY0X2lucHV0IGlucHV0c1tUVzU4NjRfSU5QVVRTXTsKPj4gI2RlZmlu ZSBIMjY0X0JVRl9DTlQgNAo+PiBAQCAtMTUwLDcgKzE1MSw3IEBAIHN0cnVjdCB0dzU4NjRfZGV2 IHsKPj4gCWludCBoMjY0X2J1Zl9yX2luZGV4Owo+PiAJaW50IGgyNjRfYnVmX3dfaW5kZXg7Cj4+ IAo+PiAtCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0Owo+PiArCXN0cnVjdCB3b3JrX3N0 cnVjdCB3b3JrOwo+PiAKPj4gCWludCBlbmNvZGVyX2J1c3k7Cj4+IAkvKiBJbnB1dCBudW1iZXIg dG8gY2hlY2sgbmV4dCBmb3IgcmVhZHkgcmF3IHBpY3R1cmUgKGluIFJSIGZhc2hpb24pICovCj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2ludGVsL3B4YV9jYW1lcmEuYyBi L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vaW50ZWwvcHhhX2NhbWVyYS5jCj4+IGluZGV4IGQ5MDQ5 NTJiZjAwZS4uZGYwYTNjNTU5Mjg3IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRm b3JtL2ludGVsL3B4YV9jYW1lcmEuYwo+PiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2lu dGVsL3B4YV9jYW1lcmEuYwo+PiBAQCAtNDMsNiArNDMsNyBAQAo+PiAjaW5jbHVkZSA8bGludXgv dmlkZW9kZXYyLmg+Cj4+IAo+PiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9tZWRpYS9j YW1lcmEtcHhhLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Cj4+IAo+PiAjZGVm aW5lIFBYQV9DQU1fVkVSU0lPTiAiMC4wLjYiCj4+ICNkZWZpbmUgUFhBX0NBTV9EUlZfTkFNRSAi cHhhMjd4LWNhbWVyYSIKPj4gQEAgLTY4Myw3ICs2ODQsNyBAQCBzdHJ1Y3QgcHhhX2NhbWVyYV9k ZXYgewo+PiAJdW5zaWduZWQgaW50CQlidWZfc2VxdWVuY2U7Cj4+IAo+PiAJc3RydWN0IHB4YV9i dWZmZXIJKmFjdGl2ZTsKPj4gLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGFza19lb2Y7Cj4+ICsJ c3RydWN0IHdvcmtfc3RydWN0IAl0YXNrX2VvZjsKPj4gCj4+IAl1MzIJCQlzYXZlX2NpY3JbNV07 Cj4+IH07Cj4+IEBAIC0xMTQ2LDkgKzExNDcsOSBAQCBzdGF0aWMgdm9pZCBweGFfY2FtZXJhX2Rl YWN0aXZhdGUoc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldikKPj4gCWNsa19kaXNhYmxlX3Vu cHJlcGFyZShwY2Rldi0+Y2xrKTsKPj4gfQo+PiAKPj4gLXN0YXRpYyB2b2lkIHB4YV9jYW1lcmFf ZW9mKHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCkKPj4gK3N0YXRpYyB2b2lkIHB4YV9jYW1lcmFf ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCAqdCkKPj4gewo+PiAtCXN0cnVjdCBweGFfY2FtZXJhX2Rl diAqcGNkZXYgPSBmcm9tX3Rhc2tsZXQocGNkZXYsIHQsIHRhc2tfZW9mKTsKPj4gKwlzdHJ1Y3Qg cHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gZnJvbV93b3JrKHBjZGV2LCB0LCB0YXNrX2VvZik7Cj4+ IAl1bnNpZ25lZCBsb25nIGNpZnI7Cj4+IAlzdHJ1Y3QgcHhhX2J1ZmZlciAqYnVmOwo+PiAKPj4g QEAgLTExODUsNyArMTE4Niw3IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBweGFfY2FtZXJhX2lycShp bnQgaXJxLCB2b2lkICpkYXRhKQo+PiAJaWYgKHN0YXR1cyAmIENJU1JfRU9GKSB7Cj4+IAkJY2lj cjAgPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1IwKSB8IENJQ1IwX0VPRk07Cj4+IAkJ X19yYXdfd3JpdGVsKGNpY3IwLCBwY2Rldi0+YmFzZSArIENJQ1IwKTsKPj4gLQkJdGFza2xldF9z Y2hlZHVsZSgmcGNkZXYtPnRhc2tfZW9mKTsKPj4gKwkJcXVldWVfd29yayhzeXN0ZW1fYmhfd3Es ICZwY2Rldi0+dGFza19lb2YpOwo+PiAJfQo+PiAKPj4gCXJldHVybiBJUlFfSEFORExFRDsKPj4g QEAgLTIzODMsNyArMjM4NCw3IEBAIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+PiAJCX0KPj4gCX0KPj4gCj4+IC0JdGFza2xldF9zZXR1 cCgmcGNkZXYtPnRhc2tfZW9mLCBweGFfY2FtZXJhX2VvZik7Cj4+ICsJSU5JVF9XT1JLKCZwY2Rl di0+dGFza19lb2YsIHB4YV9jYW1lcmFfZW9mKTsKPj4gCj4+IAlweGFfY2FtZXJhX2FjdGl2YXRl KHBjZGV2KTsKPj4gCj4+IEBAIC0yNDA5LDcgKzI0MTAsNyBAQCBzdGF0aWMgaW50IHB4YV9jYW1l cmFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4gCXJldHVybiAwOwo+PiBl eGl0X2RlYWN0aXZhdGU6Cj4+IAlweGFfY2FtZXJhX2RlYWN0aXZhdGUocGNkZXYpOwo+PiAtCXRh c2tsZXRfa2lsbCgmcGNkZXYtPnRhc2tfZW9mKTsKPj4gKwljYW5jZWxfd29ya19zeW5jKCZwY2Rl di0+dGFza19lb2YpOwo+PiBleGl0X2ZyZWVfZG1hOgo+PiAJZG1hX3JlbGVhc2VfY2hhbm5lbChw Y2Rldi0+ZG1hX2NoYW5zWzJdKTsKPj4gZXhpdF9mcmVlX2RtYV91Ogo+PiBAQCAtMjQyOCw3ICsy NDI5LDcgQEAgc3RhdGljIHZvaWQgcHhhX2NhbWVyYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKPj4gCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBwbGF0Zm9ybV9n ZXRfZHJ2ZGF0YShwZGV2KTsKPj4gCj4+IAlweGFfY2FtZXJhX2RlYWN0aXZhdGUocGNkZXYpOwo+ PiAtCXRhc2tsZXRfa2lsbCgmcGNkZXYtPnRhc2tfZW9mKTsKPj4gKwljYW5jZWxfd29ya19zeW5j KCZwY2Rldi0+dGFza19lb2YpOwo+PiAJZG1hX3JlbGVhc2VfY2hhbm5lbChwY2Rldi0+ZG1hX2No YW5zWzBdKTsKPj4gCWRtYV9yZWxlYXNlX2NoYW5uZWwocGNkZXYtPmRtYV9jaGFuc1sxXSk7Cj4+ IAlkbWFfcmVsZWFzZV9jaGFubmVsKHBjZGV2LT5kbWFfY2hhbnNbMl0pOwo+PiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tYXJ2ZWxsL21jYW0tY29yZS5jIGIvZHJpdmVycy9t ZWRpYS9wbGF0Zm9ybS9tYXJ2ZWxsL21jYW0tY29yZS5jCj4+IGluZGV4IDY2Njg4YjRhZWNlNS4u ZDZiOTZhNzAzOWJlIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21hcnZl bGwvbWNhbS1jb3JlLmMKPj4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tYXJ2ZWxsL21j YW0tY29yZS5jCj4+IEBAIC0yNSw2ICsyNSw3IEBACj4+ICNpbmNsdWRlIDxsaW51eC9jbGstcHJv dmlkZXIuaD4KPj4gI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgo+PiAjaW5jbHVkZSA8bGlu dXgvcG1fcnVudGltZS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgo+PiAjaW5j bHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KPj4gI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwu aD4KPj4gI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KPj4gQEAgLTQzOSw5ICs0NDAsOSBA QCBzdGF0aWMgdm9pZCBtY2FtX2N0bHJfZG1hX3ZtYWxsb2Moc3RydWN0IG1jYW1fY2FtZXJhICpj YW0pCj4+IC8qCj4+ICAqIENvcHkgZGF0YSBvdXQgdG8gdXNlciBzcGFjZSBpbiB0aGUgdm1hbGxv YyBjYXNlCj4+ICAqLwo+PiAtc3RhdGljIHZvaWQgbWNhbV9mcmFtZV90YXNrbGV0KHN0cnVjdCB0 YXNrbGV0X3N0cnVjdCAqdCkKPj4gK3N0YXRpYyB2b2lkIG1jYW1fZnJhbWVfd29yayhzdHJ1Y3Qg d29ya19zdHJ1Y3QgKnQpCj4+IHsKPj4gLQlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZyb21f dGFza2xldChjYW0sIHQsIHNfdGFza2xldCk7Cj4+ICsJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0g PSBmcm9tX3dvcmsoY2FtLCB0LCBzX3dvcmspOwo+PiAJaW50IGk7Cj4+IAl1bnNpZ25lZCBsb25n IGZsYWdzOwo+PiAJc3RydWN0IG1jYW1fdmJfYnVmZmVyICpidWY7Cj4+IEBAIC00ODAsNyArNDgx LDcgQEAgc3RhdGljIHZvaWQgbWNhbV9mcmFtZV90YXNrbGV0KHN0cnVjdCB0YXNrbGV0X3N0cnVj dCAqdCkKPj4gCj4+IAo+PiAvKgo+PiAtICogTWFrZSBzdXJlIG91ciBhbGxvY2F0ZWQgYnVmZmVy cyBhcmUgdXAgdG8gdGhlIHRhc2suCj4+ICsgKiBNYWtlIHN1cmUgb3VyIGFsbG9jYXRlZCBidWZm ZXJzIGFyZSB1cCB0byB0aGUgd29yay4KPj4gICovCj4+IHN0YXRpYyBpbnQgbWNhbV9jaGVja19k bWFfYnVmZmVycyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKPj4gewo+PiBAQCAtNDkzLDcgKzQ5 NCw3IEBAIHN0YXRpYyBpbnQgbWNhbV9jaGVja19kbWFfYnVmZmVycyhzdHJ1Y3QgbWNhbV9jYW1l cmEgKmNhbSkKPj4gCj4+IHN0YXRpYyB2b2lkIG1jYW1fdm1hbGxvY19kb25lKHN0cnVjdCBtY2Ft X2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUpCj4+IHsKPj4gLQl0YXNrbGV0X3NjaGVkdWxlKCZjYW0t PnNfdGFza2xldCk7Cj4+ICsJcXVldWVfd29yayhzeXN0ZW1fYmhfd3EsICZjYW0tPnNfd29yayk7 Cj4+IH0KPj4gCj4+ICNlbHNlIC8qIE1DQU1fTU9ERV9WTUFMTE9DICovCj4+IEBAIC0xMzA1LDcg KzEzMDYsNyBAQCBzdGF0aWMgaW50IG1jYW1fc2V0dXBfdmIyKHN0cnVjdCBtY2FtX2NhbWVyYSAq Y2FtKQo+PiAJCWJyZWFrOwo+PiAJY2FzZSBCX3ZtYWxsb2M6Cj4+ICNpZmRlZiBNQ0FNX01PREVf Vk1BTExPQwo+PiAtCQl0YXNrbGV0X3NldHVwKCZjYW0tPnNfdGFza2xldCwgbWNhbV9mcmFtZV90 YXNrbGV0KTsKPj4gKwkJSU5JVF9XT1JLKCZjYW0tPnNfd29yaywgbWNhbV9mcmFtZV93b3JrKTsK Pj4gCQl2cS0+b3BzID0gJm1jYW1fdmIyX29wczsKPj4gCQl2cS0+bWVtX29wcyA9ICZ2YjJfdm1h bGxvY19tZW1vcHM7Cj4+IAkJY2FtLT5kbWFfc2V0dXAgPSBtY2FtX2N0bHJfZG1hX3ZtYWxsb2M7 Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21hcnZlbGwvbWNhbS1jb3Jl LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21hcnZlbGwvbWNhbS1jb3JlLmgKPj4gaW5kZXgg NTFlNjZkYjQ1YWY2Li4wZDRiOTUzZGJiMjMgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvbWVkaWEv cGxhdGZvcm0vbWFydmVsbC9tY2FtLWNvcmUuaAo+PiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRm b3JtL21hcnZlbGwvbWNhbS1jb3JlLmgKPj4gQEAgLTksNiArOSw3IEBACj4+IAo+PiAjaW5jbHVk ZSA8bGludXgvbGlzdC5oPgo+PiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Cj4+ICsj aW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Cj4+ICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1v bi5oPgo+PiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgo+PiAjaW5jbHVkZSA8bWVkaWEv djRsMi1kZXYuaD4KPj4gQEAgLTE2Nyw3ICsxNjgsNyBAQCBzdHJ1Y3QgbWNhbV9jYW1lcmEgewo+ PiAJdW5zaWduZWQgaW50IGRtYV9idWZfc2l6ZTsJLyogYWxsb2NhdGVkIHNpemUgKi8KPj4gCXZv aWQgKmRtYV9idWZzW01BWF9ETUFfQlVGU107CS8qIEludGVybmFsIGJ1ZmZlciBhZGRyZXNzZXMg Ki8KPj4gCWRtYV9hZGRyX3QgZG1hX2hhbmRsZXNbTUFYX0RNQV9CVUZTXTsgLyogQnVmZmVyIGJ1 cyBhZGRyZXNzZXMgKi8KPj4gLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qgc190YXNrbGV0Owo+PiAr CXN0cnVjdCB3b3JrX3N0cnVjdCBzX3dvcms7Cj4+ICNlbmRpZgo+PiAJdW5zaWduZWQgaW50IHNl cXVlbmNlOwkJLyogRnJhbWUgc2VxdWVuY2UgbnVtYmVyICovCj4+IAl1bnNpZ25lZCBpbnQgYnVm X3NlcVtNQVhfRE1BX0JVRlNdOyAvKiBTZXF1ZW5jZSBmb3IgaW5kaXZpZHVhbCBidWZzICovCj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3N0L3N0aS9jOHNlY3RwZmUvYzhz ZWN0cGZlLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3Qvc3RpL2M4c2VjdHBmZS9j OHNlY3RwZmUtY29yZS5jCj4+IGluZGV4IGU0Y2YyN2I1YTA3Mi4uMjJiMzU5NTY5YTEwIDEwMDY0 NAo+PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3N0L3N0aS9jOHNlY3RwZmUvYzhzZWN0 cGZlLWNvcmUuYwo+PiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3N0L3N0aS9jOHNlY3Rw ZmUvYzhzZWN0cGZlLWNvcmUuYwo+PiBAQCAtMzMsNiArMzMsNyBAQAo+PiAjaW5jbHVkZSA8bGlu dXgvdGltZS5oPgo+PiAjaW5jbHVkZSA8bGludXgvdXNiLmg+Cj4+ICNpbmNsdWRlIDxsaW51eC93 YWl0Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Cj4+IAo+PiAjaW5jbHVkZSAi YzhzZWN0cGZlLWNvbW1vbi5oIgo+PiAjaW5jbHVkZSAiYzhzZWN0cGZlLWNvcmUuaCIKPj4gQEAg LTczLDE2ICs3NCwxNiBAQCBzdGF0aWMgdm9pZCBjOHNlY3RwZmVfdGltZXJfaW50ZXJydXB0KHN0 cnVjdCB0aW1lcl9saXN0ICp0KQo+PiAKPj4gCQkvKiBpcyB0aGlzIGRlc2NyaXB0b3IgaW5pdGlh bGlzZWQgYW5kIFRQIGVuYWJsZWQgKi8KPj4gCQlpZiAoY2hhbm5lbC0+aXJlYyAmJiByZWFkbChj aGFubmVsLT5pcmVjICsgRE1BX1BSRFNfVFBFTkFCTEUpKQo+PiAtCQkJdGFza2xldF9zY2hlZHVs ZSgmY2hhbm5lbC0+dHNrbGV0KTsKPj4gKwkJCXF1ZXVlX3dvcmsoc3lzdGVtX2JoX3dxLCAmY2hh bm5lbC0+dHNrbGV0KTsKPj4gCX0KPj4gCj4+IAlmZWktPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVz ICsJbXNlY3NfdG9famlmZmllcyhQT0xMX01TRUNTKTsKPj4gCWFkZF90aW1lcigmZmVpLT50aW1l cik7Cj4+IH0KPj4gCj4+IC1zdGF0aWMgdm9pZCBjaGFubmVsX3N3ZGVtdXhfdHNrbGV0KHN0cnVj dCB0YXNrbGV0X3N0cnVjdCAqdCkKPj4gK3N0YXRpYyB2b2lkIGNoYW5uZWxfc3dkZW11eF90c2ts ZXQoc3RydWN0IHdvcmtfc3RydWN0ICp0KQo+PiB7Cj4+IC0Jc3RydWN0IGNoYW5uZWxfaW5mbyAq Y2hhbm5lbCA9IGZyb21fdGFza2xldChjaGFubmVsLCB0LCB0c2tsZXQpOwo+PiArCXN0cnVjdCBj aGFubmVsX2luZm8gKmNoYW5uZWwgPSBmcm9tX3dvcmsoY2hhbm5lbCwgdCwgdHNrbGV0KTsKPj4g CXN0cnVjdCBjOHNlY3RwZmVpICpmZWk7Cj4+IAl1bnNpZ25lZCBsb25nIHdwLCBycDsKPj4gCWlu dCBwb3MsIG51bV9wYWNrZXRzLCBuLCBzaXplOwo+PiBAQCAtMjExLDcgKzIxMiw3IEBAIHN0YXRp YyBpbnQgYzhzZWN0cGZlX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhm ZWVkKQo+PiAKPj4gCQlkZXZfZGJnKGZlaS0+ZGV2LCAiU3RhcnRpbmcgY2hhbm5lbD0lcFxuIiwg Y2hhbm5lbCk7Cj4+IAo+PiAtCQl0YXNrbGV0X3NldHVwKCZjaGFubmVsLT50c2tsZXQsIGNoYW5u ZWxfc3dkZW11eF90c2tsZXQpOwo+PiArCQlJTklUX1dPUksoJmNoYW5uZWwtPnRza2xldCwgY2hh bm5lbF9zd2RlbXV4X3Rza2xldCk7Cj4+IAo+PiAJCS8qIFJlc2V0IHRoZSBpbnRlcm5hbCBpbnB1 dGJsb2NrIHNyYW0gcG9pbnRlcnMgKi8KPj4gCQl3cml0ZWwoY2hhbm5lbC0+ZmlmbywKPj4gQEAg LTMwNCw3ICszMDUsNyBAQCBzdGF0aWMgaW50IGM4c2VjdHBmZV9zdG9wX2ZlZWQoc3RydWN0IGR2 Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQo+PiAJCS8qIGRpc2FibGUgdGhpcyBjaGFubmVscyBk ZXNjcmlwdG9yICovCj4+IAkJd3JpdGVsKDAsICBjaGFubmVsLT5pcmVjICsgRE1BX1BSRFNfVFBF TkFCTEUpOwo+PiAKPj4gLQkJdGFza2xldF9kaXNhYmxlKCZjaGFubmVsLT50c2tsZXQpOwo+PiAr CQlkaXNhYmxlX3dvcmtfc3luYygmY2hhbm5lbC0+dHNrbGV0KTsKPj4gCj4+IAkJLyogbm93IHJl cXVlc3QgbWVtZG1hIGNoYW5uZWwgZ29lcyBpZGxlICovCj4+IAkJaWRsZXJlcSA9ICgxIDw8IGNo YW5uZWwtPnRzaW5faWQpIHwgSURMRVJFUTsKPj4gQEAgLTYzMSw4ICs2MzIsOCBAQCBzdGF0aWMg aW50IGNvbmZpZ3VyZV9tZW1kbWFfYW5kX2lucHV0YmxvY2soc3RydWN0IGM4c2VjdHBmZWkgKmZl aSwKPj4gCXdyaXRlbCh0c2luLT5iYWNrX2J1ZmZlcl9idXNhZGRyLCB0c2luLT5pcmVjICsgRE1B X1BSRFNfQlVTV1BfVFAoMCkpOwo+PiAJd3JpdGVsKHRzaW4tPmJhY2tfYnVmZmVyX2J1c2FkZHIs IHRzaW4tPmlyZWMgKyBETUFfUFJEU19CVVNSUF9UUCgwKSk7Cj4+IAo+PiAtCS8qIGluaXRpYWxp emUgdGFza2xldCAqLwo+PiAtCXRhc2tsZXRfc2V0dXAoJnRzaW4tPnRza2xldCwgY2hhbm5lbF9z d2RlbXV4X3Rza2xldCk7Cj4+ICsJLyogaW5pdGlhbGl6ZSB3b3JrICovCj4+ICsJSU5JVF9XT1JL KCZ0c2luLT50c2tsZXQsIGNoYW5uZWxfc3dkZW11eF90c2tsZXQpOwo+PiAKPj4gCXJldHVybiAw Owo+PiAKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3Qvc3RpL2M4c2Vj dHBmZS9jOHNlY3RwZmUtY29yZS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdC9zdGkvYzhz ZWN0cGZlL2M4c2VjdHBmZS1jb3JlLmgKPj4gaW5kZXggYmYzNzdjYzgyMjI1Li5kNjNmMGVlODM2 MTUgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3Qvc3RpL2M4c2VjdHBm ZS9jOHNlY3RwZmUtY29yZS5oCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3Qvc3Rp L2M4c2VjdHBmZS9jOHNlY3RwZmUtY29yZS5oCj4+IEBAIC01MSw3ICs1MSw3IEBAIHN0cnVjdCBj aGFubmVsX2luZm8gewo+PiAJdW5zaWduZWQgbG9uZyAgZmlmbzsKPj4gCj4+IAlzdHJ1Y3QgY29t cGxldGlvbiBpZGxlX2NvbXBsZXRpb247Cj4+IC0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHRza2xl dDsKPj4gKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHNrbGV0Owo+PiAKPj4gCXN0cnVjdCBjOHNlY3Rw ZmVpICpmZWk7Cj4+IAl2b2lkIF9faW9tZW0gKmlyZWM7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJz L21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydi5oIGIvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgv Zm1kcnYuaAo+PiBpbmRleCBkYTg5MjAxNjlkZjguLjg1MjgyZjYzOGM0YSAxMDA2NDQKPj4gLS0t IGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnYuaAo+PiArKysgYi9kcml2ZXJzL21l ZGlhL3JhZGlvL3dsMTI4eC9mbWRydi5oCj4+IEBAIC0xNSw2ICsxNSw3IEBACj4+ICNpbmNsdWRl IDxzb3VuZC9jb3JlLmg+Cj4+ICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+Cj4+ICNpbmNsdWRl IDxsaW51eC90aW1lci5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgo+PiAjaW5j bHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgo+PiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24u aD4KPj4gI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Cj4+IEBAIC0yMDAsMTUgKzIwMSwx NSBAQCBzdHJ1Y3QgZm1kZXYgewo+PiAJaW50IHN0cmVnX2NiZGF0YTsgLyogc3RhdHVzIG9mIFNU IHJlZ2lzdHJhdGlvbiAqLwo+PiAKPj4gCXN0cnVjdCBza19idWZmX2hlYWQgcnhfcTsJLyogUlgg cXVldWUgKi8KPj4gLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhfdGFzazsJLyogUlggVGFza2xl dCAqLwo+PiArCXN0cnVjdCB3b3JrX3N0cnVjdCByeF90YXNrOwkvKiBSWCBXb3JrICovCj4+IAo+ PiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9xOwkvKiBUWCBxdWV1ZSAqLwo+PiAtCXN0cnVjdCB0 YXNrbGV0X3N0cnVjdCB0eF90YXNrOwkvKiBUWCBUYXNrbGV0ICovCj4+ICsJc3RydWN0IHdvcmtf c3RydWN0IHR4X3Rhc2s7CS8qIFRYIFdvcmsgKi8KPj4gCXVuc2lnbmVkIGxvbmcgbGFzdF90eF9q aWZmaWVzOwkvKiBUaW1lc3RhbXAgb2YgbGFzdCBwa3Qgc2VudCAqLwo+PiAJYXRvbWljX3QgdHhf Y250OwkvKiBOdW1iZXIgb2YgcGFja2V0cyBjYW4gc2VuZCBhdCBhIHRpbWUgKi8KPj4gCj4+IAlz dHJ1Y3Qgc2tfYnVmZiAqcmVzcF9za2I7CS8qIFJlc3BvbnNlIGZyb20gdGhlIGNoaXAgKi8KPj4g LQkvKiBNYWluIHRhc2sgY29tcGxldGlvbiBoYW5kbGVyICovCj4+ICsJLyogTWFpbiB3b3JrIGNv bXBsZXRpb24gaGFuZGxlciAqLwo+PiAJc3RydWN0IGNvbXBsZXRpb24gbWFpbnRhc2tfY29tcDsK Pj4gCS8qIE9wY29kZSBvZiBsYXN0IGNvbW1hbmQgc2VudCB0byB0aGUgY2hpcCAqLwo+PiAJdTgg cHJlX29wOwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnZf Y29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydl9jb21tb24uYwo+PiBp bmRleCAzZGE4ZTUxMDJiZWMuLjUyMjkwYmI0YTRhZCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9t ZWRpYS9yYWRpby93bDEyOHgvZm1kcnZfY29tbW9uLmMKPj4gKysrIGIvZHJpdmVycy9tZWRpYS9y YWRpby93bDEyOHgvZm1kcnZfY29tbW9uLmMKPj4gQEAgLTksNyArOSw3IEBACj4+ICAqICAgICBv bmUgQ2hhbm5lbC04IGNvbW1hbmQgdG8gYmUgc2VudCB0byB0aGUgY2hpcCkuCj4+ICAqICAyKSBT ZW5kaW5nIGVhY2ggQ2hhbm5lbC04IGNvbW1hbmQgdG8gdGhlIGNoaXAgYW5kIHJlYWRpbmcKPj4g ICogICAgIHJlc3BvbnNlIGJhY2sgb3ZlciBTaGFyZWQgVHJhbnNwb3J0Lgo+PiAtICogIDMpIE1h bmFnaW5nIFRYIGFuZCBSWCBRdWV1ZXMgYW5kIFRhc2tsZXRzLgo+PiArICogIDMpIE1hbmFnaW5n IFRYIGFuZCBSWCBRdWV1ZXMgYW5kIFdvcmtzLgo+PiAgKiAgNCkgSGFuZGxpbmcgRk0gSW50ZXJy dXB0IHBhY2tldCBhbmQgdGFraW5nIGFwcHJvcHJpYXRlIGFjdGlvbi4KPj4gICogIDUpIExvYWRp bmcgRk0gZmlybXdhcmUgdG8gdGhlIGNoaXAgKGNvbW1vbiwgRk0gVFgsIGFuZCBGTSBSWAo+PiAg KiAgICAgZmlybXdhcmUgZmlsZXMgYmFzZWQgb24gbW9kZSBzZWxlY3Rpb24pCj4+IEBAIC0yOSw2 ICsyOSw3IEBACj4+ICNpbmNsdWRlICJmbWRydl92NGwyLmgiCj4+ICNpbmNsdWRlICJmbWRydl9j b21tb24uaCIKPj4gI2luY2x1ZGUgPGxpbnV4L3RpX3dpbGlua19zdC5oPgo+PiArI2luY2x1ZGUg PGxpbnV4L3dvcmtxdWV1ZS5oPgo+PiAjaW5jbHVkZSAiZm1kcnZfcnguaCIKPj4gI2luY2x1ZGUg ImZtZHJ2X3R4LmgiCj4+IAo+PiBAQCAtMjQ0LDEwICsyNDUsMTAgQEAgdm9pZCBmbWNfdXBkYXRl X3JlZ2lvbl9pbmZvKHN0cnVjdCBmbWRldiAqZm1kZXYsIHU4IHJlZ2lvbl90b19zZXQpCj4+IH0K Pj4gCj4+IC8qCj4+IC0gKiBGTSBjb21tb24gc3ViLW1vZHVsZSB3aWxsIHNjaGVkdWxlIHRoaXMg dGFza2xldCB3aGVuZXZlciBpdCByZWNlaXZlcwo+PiArICogRk0gY29tbW9uIHN1Yi1tb2R1bGUg d2lsbCBzY2hlZHVsZSB0aGlzIHdvcmsgd2hlbmV2ZXIgaXQgcmVjZWl2ZXMKPj4gICogRk0gcGFj a2V0IGZyb20gU1QgZHJpdmVyLgo+PiAgKi8KPj4gLXN0YXRpYyB2b2lkIHJlY3ZfdGFza2xldChz dHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnQpCj4+ICtzdGF0aWMgdm9pZCByZWN2X3dvcmsoc3RydWN0 IHdvcmtfc3RydWN0ICp0KQo+PiB7Cj4+IAlzdHJ1Y3QgZm1kZXYgKmZtZGV2Owo+PiAJc3RydWN0 IGZtX2lycSAqaXJxX2luZm87Cj4+IEBAIC0yNTYsNyArMjU3LDcgQEAgc3RhdGljIHZvaWQgcmVj dl90YXNrbGV0KHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCkKPj4gCXU4IG51bV9mbV9oY2lfY21k czsKPj4gCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+IAo+PiAtCWZtZGV2ID0gZnJvbV90YXNrbGV0 KGZtZGV2LCB0LCB0eF90YXNrKTsKPj4gKwlmbWRldiA9IGZyb21fd29yayhmbWRldiwgdCwgdHhf dGFzayk7Cj4+IAlpcnFfaW5mbyA9ICZmbWRldi0+aXJxX2luZm87Cj4+IAkvKiBQcm9jZXNzIGFs bCBwYWNrZXRzIGluIHRoZSBSWCBxdWV1ZSAqLwo+PiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1 ZSgmZm1kZXYtPnJ4X3EpKSkgewo+PiBAQCAtMzIyLDIyICszMjMsMjIgQEAgc3RhdGljIHZvaWQg cmVjdl90YXNrbGV0KHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCkKPj4gCj4+IAkJLyoKPj4gCQkg KiBDaGVjayBmbG93IGNvbnRyb2wgZmllbGQuIElmIE51bV9GTV9IQ0lfQ29tbWFuZHMgZmllbGQg aXMKPj4gLQkJICogbm90IHplcm8sIHNjaGVkdWxlIEZNIFRYIHRhc2tsZXQuCj4+ICsJCSAqIG5v dCB6ZXJvLCBzY2hlZHVsZSBGTSBUWCB3b3JrLgo+PiAJCSAqLwo+PiAJCWlmIChudW1fZm1faGNp X2NtZHMgJiYgYXRvbWljX3JlYWQoJmZtZGV2LT50eF9jbnQpKQo+PiAJCQlpZiAoIXNrYl9xdWV1 ZV9lbXB0eSgmZm1kZXYtPnR4X3EpKQo+PiAtCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmZtZGV2LT50 eF90YXNrKTsKPj4gKwkJCQlxdWV1ZV93b3JrKHN5c3RlbV9iaF93cSwgJmZtZGV2LT50eF90YXNr KTsKPj4gCX0KPj4gfQo+PiAKPj4gLS8qIEZNIHNlbmQgdGFza2xldDogaXMgc2NoZWR1bGVkIHdo ZW4gRk0gcGFja2V0IGhhcyB0byBiZSBzZW50IHRvIGNoaXAgKi8KPj4gLXN0YXRpYyB2b2lkIHNl bmRfdGFza2xldChzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnQpCj4+ICsvKiBGTSBzZW5kIHdvcms6 IGlzIHNjaGVkdWxlZCB3aGVuIEZNIHBhY2tldCBoYXMgdG8gYmUgc2VudCB0byBjaGlwICovCj4+ ICtzdGF0aWMgdm9pZCBzZW5kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp0KQo+PiB7Cj4+IAlz dHJ1Y3QgZm1kZXYgKmZtZGV2Owo+PiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKPj4gCWludCBsZW47 Cj4+IAo+PiAtCWZtZGV2ID0gZnJvbV90YXNrbGV0KGZtZGV2LCB0LCB0eF90YXNrKTsKPj4gKwlm bWRldiA9IGZyb21fd29yayhmbWRldiwgdCwgdHhfdGFzayk7Cj4+IAo+PiAJaWYgKCFhdG9taWNf cmVhZCgmZm1kZXYtPnR4X2NudCkpCj4+IAkJcmV0dXJuOwo+PiBAQCAtMzY2LDcgKzM2Nyw3IEBA IHN0YXRpYyB2b2lkIHNlbmRfdGFza2xldChzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnQpCj4+IAlp ZiAobGVuIDwgMCkgewo+PiAJCWtmcmVlX3NrYihza2IpOwo+PiAJCWZtZGV2LT5yZXNwX2NvbXAg PSBOVUxMOwo+PiAtCQlmbWVycigiVFggdGFza2xldCBmYWlsZWQgdG8gc2VuZCBza2IoJXApXG4i LCBza2IpOwo+PiArCQlmbWVycigiVFggd29yayBmYWlsZWQgdG8gc2VuZCBza2IoJXApXG4iLCBz a2IpOwo+PiAJCWF0b21pY19zZXQoJmZtZGV2LT50eF9jbnQsIDEpOwo+PiAJfSBlbHNlIHsKPj4g CQlmbWRldi0+bGFzdF90eF9qaWZmaWVzID0gamlmZmllczsKPj4gQEAgLTM3NCw3ICszNzUsNyBA QCBzdGF0aWMgdm9pZCBzZW5kX3Rhc2tsZXQoc3RydWN0IHRhc2tsZXRfc3RydWN0ICp0KQo+PiB9 Cj4+IAo+PiAvKgo+PiAtICogUXVldWVzIEZNIENoYW5uZWwtOCBwYWNrZXQgdG8gRk0gVFggcXVl dWUgYW5kIHNjaGVkdWxlcyBGTSBUWCB0YXNrbGV0IGZvcgo+PiArICogUXVldWVzIEZNIENoYW5u ZWwtOCBwYWNrZXQgdG8gRk0gVFggcXVldWUgYW5kIHNjaGVkdWxlcyBGTSBUWCB3b3JrIGZvcgo+ PiAgKiB0cmFuc21pc3Npb24KPj4gICovCj4+IHN0YXRpYyBpbnQgZm1fc2VuZF9jbWQoc3RydWN0 IGZtZGV2ICpmbWRldiwgdTggZm1fb3AsIHUxNiB0eXBlLAl2b2lkICpwYXlsb2FkLAo+PiBAQCAt NDQwLDcgKzQ0MSw3IEBAIHN0YXRpYyBpbnQgZm1fc2VuZF9jbWQoc3RydWN0IGZtZGV2ICpmbWRl diwgdTggZm1fb3AsIHUxNiB0eXBlLAl2b2lkICpwYXlsb2FkLAo+PiAKPj4gCWZtX2NiKHNrYikt PmNvbXBsZXRpb24gPSB3YWl0X2NvbXBsZXRpb247Cj4+IAlza2JfcXVldWVfdGFpbCgmZm1kZXYt PnR4X3EsIHNrYik7Cj4+IC0JdGFza2xldF9zY2hlZHVsZSgmZm1kZXYtPnR4X3Rhc2spOwo+PiAr CXF1ZXVlX3dvcmsoc3lzdGVtX2JoX3dxLCAmZm1kZXYtPnR4X3Rhc2spOwo+PiAKPj4gCXJldHVy biAwOwo+PiB9Cj4+IEBAIC00NjIsNyArNDYzLDcgQEAgaW50IGZtY19zZW5kX2NtZChzdHJ1Y3Qg Zm1kZXYgKmZtZGV2LCB1OCBmbV9vcCwgdTE2IHR5cGUsIHZvaWQgKnBheWxvYWQsCj4+IAo+PiAJ aWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmZtZGV2LT5tYWludGFza19jb21wLAo+ PiAJCQkJCSBGTV9EUlZfVFhfVElNRU9VVCkpIHsKPj4gLQkJZm1lcnIoIlRpbWVvdXQoJWQgc2Vj KSxkaWRuJ3QgZ2V0IHJlZ2NvbXBsZXRpb24gc2lnbmFsIGZyb20gUlggdGFza2xldFxuIiwKPj4g KwkJZm1lcnIoIlRpbWVvdXQoJWQgc2VjKSxkaWRuJ3QgZ2V0IHJlZ2NvbXBsZXRpb24gc2lnbmFs IGZyb20gUlggd29ya1xuIiwKPj4gCQkJICAgamlmZmllc190b19tc2VjcyhGTV9EUlZfVFhfVElN RU9VVCkgLyAxMDAwKTsKPj4gCQlyZXR1cm4gLUVUSU1FRE9VVDsKPj4gCX0KPj4gQEAgLTE0NTUs NyArMTQ1Niw3IEBAIHN0YXRpYyBsb25nIGZtX3N0X3JlY2VpdmUodm9pZCAqYXJnLCBzdHJ1Y3Qg c2tfYnVmZiAqc2tiKQo+PiAKPj4gCW1lbWNweShza2JfcHVzaChza2IsIDEpLCAmc2tiLT5jYlsw XSwgMSk7Cj4+IAlza2JfcXVldWVfdGFpbCgmZm1kZXYtPnJ4X3EsIHNrYik7Cj4+IC0JdGFza2xl dF9zY2hlZHVsZSgmZm1kZXYtPnJ4X3Rhc2spOwo+PiArCXF1ZXVlX3dvcmsoc3lzdGVtX2JoX3dx LCAmZm1kZXYtPnJ4X3Rhc2spOwo+PiAKPj4gCXJldHVybiAwOwo+PiB9Cj4+IEBAIC0xNTM3LDEz ICsxNTM4LDEzIEBAIGludCBmbWNfcHJlcGFyZShzdHJ1Y3QgZm1kZXYgKmZtZGV2KQo+PiAJc3Bp bl9sb2NrX2luaXQoJmZtZGV2LT5yZHNfYnVmZl9sb2NrKTsKPj4gCXNwaW5fbG9ja19pbml0KCZm bWRldi0+cmVzcF9za2JfbG9jayk7Cj4+IAo+PiAtCS8qIEluaXRpYWxpemUgVFggcXVldWUgYW5k IFRYIHRhc2tsZXQgKi8KPj4gKwkvKiBJbml0aWFsaXplIFRYIHF1ZXVlIGFuZCBUWCB3b3JrICov Cj4+IAlza2JfcXVldWVfaGVhZF9pbml0KCZmbWRldi0+dHhfcSk7Cj4+IC0JdGFza2xldF9zZXR1 cCgmZm1kZXYtPnR4X3Rhc2ssIHNlbmRfdGFza2xldCk7Cj4+ICsJSU5JVF9XT1JLKCZmbWRldi0+ dHhfdGFzaywgc2VuZF93b3JrKTsKPj4gCj4+IC0JLyogSW5pdGlhbGl6ZSBSWCBRdWV1ZSBhbmQg UlggdGFza2xldCAqLwo+PiArCS8qIEluaXRpYWxpemUgUlggUXVldWUgYW5kIFJYIHdvcmsgKi8K Pj4gCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmZtZGV2LT5yeF9xKTsKPj4gLQl0YXNrbGV0X3NldHVw KCZmbWRldi0+cnhfdGFzaywgcmVjdl90YXNrbGV0KTsKPj4gKwlJTklUX1dPUksoJmZtZGV2LT5y eF90YXNrLCByZWN2X3dvcmspOwo+PiAKPj4gCWZtZGV2LT5pcnFfaW5mby5zdGFnZSA9IDA7Cj4+ IAlhdG9taWNfc2V0KCZmbWRldi0+dHhfY250LCAxKTsKPj4gQEAgLTE1ODksOCArMTU5MCw4IEBA IGludCBmbWNfcmVsZWFzZShzdHJ1Y3QgZm1kZXYgKmZtZGV2KQo+PiAJLyogU2VydmljZSBwZW5k aW5nIHJlYWQgKi8KPj4gCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZm1kZXYtPnJ4LnJkcy5yZWFk X3F1ZXVlKTsKPj4gCj4+IC0JdGFza2xldF9raWxsKCZmbWRldi0+dHhfdGFzayk7Cj4+IC0JdGFz a2xldF9raWxsKCZmbWRldi0+cnhfdGFzayk7Cj4+ICsJY2FuY2VsX3dvcmtfc3luYygmZm1kZXYt PnR4X3Rhc2spOwo+PiArCWNhbmNlbF93b3JrX3N5bmMoJmZtZGV2LT5yeF90YXNrKTsKPj4gCj4+ IAlza2JfcXVldWVfcHVyZ2UoJmZtZGV2LT50eF9xKTsKPj4gCXNrYl9xdWV1ZV9wdXJnZSgmZm1k ZXYtPnJ4X3EpOwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYyBiL2Ry aXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKPj4gaW5kZXggYzc2YmEyNGMxZjU1Li5hMmUyZTU4Yjc1 MDYgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKPj4gKysrIGIvZHJp dmVycy9tZWRpYS9yYy9tY2V1c2IuYwo+PiBAQCAtNzc0LDcgKzc3NCw3IEBAIHN0YXRpYyB2b2lk IG1jZXVzYl9kZXZfcHJpbnRkYXRhKHN0cnVjdCBtY2V1c2JfZGV2ICppciwgdTggKmJ1ZiwgaW50 IGJ1Zl9sZW4sCj4+IAo+PiAvKgo+PiAgKiBTY2hlZHVsZSB3b3JrIHRoYXQgY2FuJ3QgYmUgZG9u ZSBpbiBpbnRlcnJ1cHQgaGFuZGxlcnMKPj4gLSAqIChtY2V1c2JfZGV2X3JlY3YoKSBhbmQgbWNl X3dyaXRlX2NhbGxiYWNrKCkpIG5vciB0YXNrbGV0cy4KPj4gKyAqIChtY2V1c2JfZGV2X3JlY3Yo KSBhbmQgbWNlX3dyaXRlX2NhbGxiYWNrKCkpIG5vciB3b3Jrcy4KPj4gICogSW52b2tlcyBtY2V1 c2JfZGVmZXJyZWRfa2V2ZW50KCkgZm9yIHJlY292ZXJpbmcgZnJvbQo+PiAgKiBlcnJvciBldmVu dHMgc3BlY2lmaWVkIGJ5IHRoZSBrZXZlbnQgYml0IGZpZWxkLgo+PiAgKi8KPj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvbWVkaWEvdXNiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVk aWEvdXNiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwo+PiBpbmRleCA3OWZhYTI1NjA2MTMuLjU1ZWVi MDBmMTEyNiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvdHR1c2ItZGVjL3R0dXNi X2RlYy5jCj4+ICsrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwo+ PiBAQCAtMTksNiArMTksNyBAQAo+PiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KPj4gCj4+ICNp bmNsdWRlIDxsaW51eC9tdXRleC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgo+ PiAKPj4gI2luY2x1ZGUgPG1lZGlhL2RteGRldi5oPgo+PiAjaW5jbHVkZSA8bWVkaWEvZHZiX2Rl bXV4Lmg+Cj4+IEBAIC0xMzksNyArMTQwLDcgQEAgc3RydWN0IHR0dXNiX2RlYyB7Cj4+IAlpbnQJ CQl2X3Blc19wb3N0Ynl0ZXM7Cj4+IAo+PiAJc3RydWN0IGxpc3RfaGVhZAl1cmJfZnJhbWVfbGlz dDsKPj4gLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdXJiX3Rhc2tsZXQ7Cj4+ICsJc3RydWN0IHdv cmtfc3RydWN0IAl1cmJfd29yazsKPj4gCXNwaW5sb2NrX3QJCXVyYl9mcmFtZV9saXN0X2xvY2s7 Cj4+IAo+PiAJc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIJKmF1ZGlvX2ZpbHRlcjsKPj4gQEAgLTc2 Niw5ICs3NjcsOSBAQCBzdGF0aWMgdm9pZCB0dHVzYl9kZWNfcHJvY2Vzc191cmJfZnJhbWUoc3Ry dWN0IHR0dXNiX2RlYyAqZGVjLCB1OCAqYiwKPj4gCX0KPj4gfQo+PiAKPj4gLXN0YXRpYyB2b2lk IHR0dXNiX2RlY19wcm9jZXNzX3VyYl9mcmFtZV9saXN0KHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAq dCkKPj4gK3N0YXRpYyB2b2lkIHR0dXNiX2RlY19wcm9jZXNzX3VyYl9mcmFtZV9saXN0KHN0cnVj dCB3b3JrX3N0cnVjdCAqdCkKPj4gewo+PiAtCXN0cnVjdCB0dHVzYl9kZWMgKmRlYyA9IGZyb21f dGFza2xldChkZWMsIHQsIHVyYl90YXNrbGV0KTsKPj4gKwlzdHJ1Y3QgdHR1c2JfZGVjICpkZWMg PSBmcm9tX3dvcmsoZGVjLCB0LCB1cmJfd29yayk7Cj4+IAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVt Owo+PiAJc3RydWN0IHVyYl9mcmFtZSAqZnJhbWU7Cj4+IAl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ PiBAQCAtODIyLDcgKzgyMyw3IEBAIHN0YXRpYyB2b2lkIHR0dXNiX2RlY19wcm9jZXNzX3VyYihz dHJ1Y3QgdXJiICp1cmIpCj4+IAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZWMtPnVyYl9m cmFtZV9saXN0X2xvY2ssCj4+IAkJCQkJCSAgICAgICBmbGFncyk7Cj4+IAo+PiAtCQkJCXRhc2ts ZXRfc2NoZWR1bGUoJmRlYy0+dXJiX3Rhc2tsZXQpOwo+PiArCQkJCXF1ZXVlX3dvcmsoc3lzdGVt X2JoX3dxLCAmZGVjLT51cmJfd29yayk7Cj4+IAkJCX0KPj4gCQl9Cj4+IAl9IGVsc2Ugewo+PiBA QCAtMTE5OCwxMSArMTE5OSwxMSBAQCBzdGF0aWMgaW50IHR0dXNiX2RlY19hbGxvY19pc29fdXJi cyhzdHJ1Y3QgdHR1c2JfZGVjICpkZWMpCj4+IAlyZXR1cm4gMDsKPj4gfQo+PiAKPj4gLXN0YXRp YyB2b2lkIHR0dXNiX2RlY19pbml0X3Rhc2tsZXQoc3RydWN0IHR0dXNiX2RlYyAqZGVjKQo+PiAr c3RhdGljIHZvaWQgdHR1c2JfZGVjX2luaXRfd29yayhzdHJ1Y3QgdHR1c2JfZGVjICpkZWMpCj4+ IHsKPj4gCXNwaW5fbG9ja19pbml0KCZkZWMtPnVyYl9mcmFtZV9saXN0X2xvY2spOwo+PiAJSU5J VF9MSVNUX0hFQUQoJmRlYy0+dXJiX2ZyYW1lX2xpc3QpOwo+PiAtCXRhc2tsZXRfc2V0dXAoJmRl Yy0+dXJiX3Rhc2tsZXQsIHR0dXNiX2RlY19wcm9jZXNzX3VyYl9mcmFtZV9saXN0KTsKPj4gKwlJ TklUX1dPUksoJmRlYy0+dXJiX3dvcmssIHR0dXNiX2RlY19wcm9jZXNzX3VyYl9mcmFtZV9saXN0 KTsKPj4gfQo+PiAKPj4gc3RhdGljIGludCB0dHVzYl9pbml0X3JjKCBzdHJ1Y3QgdHR1c2JfZGVj ICpkZWMpCj4+IEBAIC0xNTg4LDEyICsxNTg5LDEyIEBAIHN0YXRpYyB2b2lkIHR0dXNiX2RlY19l eGl0X3VzYihzdHJ1Y3QgdHR1c2JfZGVjICpkZWMpCj4+IAl0dHVzYl9kZWNfZnJlZV9pc29fdXJi cyhkZWMpOwo+PiB9Cj4+IAo+PiAtc3RhdGljIHZvaWQgdHR1c2JfZGVjX2V4aXRfdGFza2xldChz dHJ1Y3QgdHR1c2JfZGVjICpkZWMpCj4+ICtzdGF0aWMgdm9pZCB0dHVzYl9kZWNfZXhpdF93b3Jr KHN0cnVjdCB0dHVzYl9kZWMgKmRlYykKPj4gewo+PiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsK Pj4gCXN0cnVjdCB1cmJfZnJhbWUgKmZyYW1lOwo+PiAKPj4gLQl0YXNrbGV0X2tpbGwoJmRlYy0+ dXJiX3Rhc2tsZXQpOwo+PiArCWNhbmNlbF93b3JrX3N5bmMoJmRlYy0+dXJiX3dvcmspOwo+PiAK Pj4gCXdoaWxlICgoaXRlbSA9IGRlYy0+dXJiX2ZyYW1lX2xpc3QubmV4dCkgIT0gJmRlYy0+dXJi X2ZyYW1lX2xpc3QpIHsKPj4gCQlmcmFtZSA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHVyYl9m cmFtZSwgdXJiX2ZyYW1lX2xpc3QpOwo+PiBAQCAtMTcwMyw3ICsxNzA0LDcgQEAgc3RhdGljIGlu dCB0dHVzYl9kZWNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCj4+IAo+PiAJdHR1 c2JfZGVjX2luaXRfdl9wZXMoZGVjKTsKPj4gCXR0dXNiX2RlY19pbml0X2ZpbHRlcnMoZGVjKTsK Pj4gLQl0dHVzYl9kZWNfaW5pdF90YXNrbGV0KGRlYyk7Cj4+ICsJdHR1c2JfZGVjX2luaXRfd29y ayhkZWMpOwo+PiAKPj4gCWRlYy0+YWN0aXZlID0gMTsKPj4gCj4+IEBAIC0xNzI5LDcgKzE3MzAs NyBAQCBzdGF0aWMgdm9pZCB0dHVzYl9kZWNfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFj ZSAqaW50ZikKPj4gCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7Cj4+IAo+PiAJaWYgKGRlYy0+ YWN0aXZlKSB7Cj4+IC0JCXR0dXNiX2RlY19leGl0X3Rhc2tsZXQoZGVjKTsKPj4gKwkJdHR1c2Jf ZGVjX2V4aXRfd29yayhkZWMpOwo+PiAJCXR0dXNiX2RlY19leGl0X2ZpbHRlcnMoZGVjKTsKPj4g CQlpZihlbmFibGVfcmMpCj4+IAkJCXR0dXNiX2RlY19leGl0X3JjKGRlYyk7CgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGlu ZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 527A4C4345F for ; Wed, 24 Apr 2024 23:47:21 +0000 (UTC) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.a=rsa-sha256 header.s=default header.b=ciSw7ETa; dkim-atps=neutral Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4VPwdM6kVkz3vYf for ; Thu, 25 Apr 2024 09:47:19 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.a=rsa-sha256 header.s=default header.b=ciSw7ETa; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=linux.microsoft.com (client-ip=13.77.154.182; helo=linux.microsoft.com; envelope-from=apais@linux.microsoft.com; receiver=lists.ozlabs.org) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.ozlabs.org (Postfix) with ESMTP id 4VPlM76pdDz3cFw for ; Thu, 25 Apr 2024 02:49:23 +1000 (AEST) Received: from smtpclient.apple (d66-183-91-182.bchsia.telus.net [66.183.91.182]) by linux.microsoft.com (Postfix) with ESMTPSA id 995C3210DEAF; Wed, 24 Apr 2024 09:48:50 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 995C3210DEAF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1713977332; bh=ksvEFN4skua8jbUiYLns9bHtKk/4wlRJ+9aDRVo11t0=; h=Subject:From:In-Reply-To:Date:Cc:References:To:From; b=ciSw7ETabS09FzB+vGI71vmglWivC+oa0cVPt+dd7Ss0SZ0HwcyxZuoiQNcNF5q63 OU2Zc9ReY3eu79e9oV3MgK0cJNYFO81GC/JgqkwsQSP1lBPHUmLKsrrY/5zP4NZf0t VIf6IyFitxO7pk98vq37Kg2gLGbiD7QpB6ZXnzWA= Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3774.500.171.1.1\)) Subject: Re: [PATCH 8/9] drivers/media/*: Convert from tasklet to BH workqueue From: Allen Pais In-Reply-To: Date: Wed, 24 Apr 2024 09:48:38 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: <17140C44-9803-4556-B216-12D1ECF30432@linux.microsoft.com> References: <20240327160314.9982-1-apais@linux.microsoft.com> <20240327160314.9982-9-apais@linux.microsoft.com> To: Hans Verkuil X-Mailer: Apple Mail (2.3774.500.171.1.1) X-Mailman-Approved-At: Thu, 25 Apr 2024 09:45:48 +1000 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: imx@lists.linux.dev, ulf.hansson@linaro.org, oneukum@suse.com, duncan.sands@free.fr, hayashi.kunihiko@socionext.com, linux-mmc@vger.kernel.org, aubin.constans@microchip.com, Linus Walleij , Frank.Li@nxp.com, linux-hyperv@vger.kernel.org, linux-usb@vger.kernel.org, HaraldWelte@viatech.com, Paul Cercueil , linux-tegra@vger.kernel.org, netdev@vger.kernel.org, maintainers@bluecherrydvr.com, peter.ujfalusi@gmail.com, manivannan.sadhasivam@linaro.org, linux-riscv@lists.infradead.org, kys@microsoft.com, Robert Jarzmik , haijie1@huawei.com, linux-renesas-soc@vger.kernel.org, wei.liu@kernel.org, linux-omap@vger.kernel.org, florian.fainelli@broadcom.com, linux-rdma@vger.kernel.org, Viresh Kumar , jassisinghbrar@gmail.com, decui@microsoft.com, Zhou Wang , =?utf-8?Q?Jernej_=C5=A0krabec?= , jh80.chung@samsung.com, zw@zh-kernel.org, Chen-Yu Tsai , stern@rowland.harvard.edu, linux-arm-msm@vger.kernel.org, Orson Zhai , pierre@ossman.eu, linux-mips@vger.kernel.org, Eugeniy.Paltsev@synopsys.com, Patrice CHOTARD , asahi@lists.linux.dev, brucechang@via.com.tw, Kees Cook , oakad@yahoo.com, sven@svenpeter.dev, Ray Jui , Sascha Hauer , Sean Wang , linux-actions@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, Haojian Zhuang , mirq-linux@rere.qmqm.pl, dmaengine@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-rpi-kernel@lists.infradead.org, baolin.wang@linux.alibaba.com, Matthias Brugger , openipmi-developer@lists.sourceforge.net, mchehab@kernel.org, linux-arm-kernel@lists.infradead.org, angelogioacchino.delregno@collabora.com, Scott Branden , Logan Gunthorpe , andersson@kernel.org, marcan@marcan.st, haiyangz@microsoft.com, Linux Kernel Mailing List , Leo Li , konrad.dybcio@linaro.org, linux-sunxi@lists.linux.dev, Vinod Koul , linux-s390@vger.kernel.org, mhiramat@kernel.org, Lyra Zhang , Tejun Heo , manuel.lauss@gmail.com, linux-media@vger.kernel.org, Shawn Guo , =?utf-8?Q?Andreas_F=C3=A4rber?= , Daniel Mack Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" > On Apr 24, 2024, at 2:12=E2=80=AFAM, Hans Verkuil = wrote: >=20 > On 27/03/2024 17:03, Allen Pais wrote: >> The only generic interface to execute asynchronously in the BH = context is >> tasklet; however, it's marked deprecated and has some design flaws. = To >> replace tasklets, BH workqueue support was recently added. A BH = workqueue >> behaves similarly to regular workqueues except that the queued work = items >> are executed in the BH context. >>=20 >> This patch converts drivers/media/* from tasklet to BH workqueue. >>=20 >> Based on the work done by Tejun Heo >> Branch: https://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git = for-6.10 >>=20 >> Signed-off-by: Allen Pais >> --- >> drivers/media/pci/bt8xx/bt878.c | 8 ++-- >> drivers/media/pci/bt8xx/bt878.h | 3 +- >> drivers/media/pci/bt8xx/dvb-bt8xx.c | 9 ++-- >> drivers/media/pci/ddbridge/ddbridge.h | 3 +- >> drivers/media/pci/mantis/hopper_cards.c | 2 +- >> drivers/media/pci/mantis/mantis_cards.c | 2 +- >> drivers/media/pci/mantis/mantis_common.h | 3 +- >> drivers/media/pci/mantis/mantis_dma.c | 5 ++- >> drivers/media/pci/mantis/mantis_dma.h | 2 +- >> drivers/media/pci/mantis/mantis_dvb.c | 12 +++--- >> drivers/media/pci/ngene/ngene-core.c | 23 ++++++----- >> drivers/media/pci/ngene/ngene.h | 5 ++- >> drivers/media/pci/smipcie/smipcie-main.c | 18 ++++---- >> drivers/media/pci/smipcie/smipcie.h | 3 +- >> drivers/media/pci/ttpci/budget-av.c | 3 +- >> drivers/media/pci/ttpci/budget-ci.c | 27 ++++++------ >> drivers/media/pci/ttpci/budget-core.c | 10 ++--- >> drivers/media/pci/ttpci/budget.h | 5 ++- >> drivers/media/pci/tw5864/tw5864-core.c | 2 +- >> drivers/media/pci/tw5864/tw5864-video.c | 13 +++--- >> drivers/media/pci/tw5864/tw5864.h | 7 ++-- >> drivers/media/platform/intel/pxa_camera.c | 15 +++---- >> drivers/media/platform/marvell/mcam-core.c | 11 ++--- >> drivers/media/platform/marvell/mcam-core.h | 3 +- >> .../st/sti/c8sectpfe/c8sectpfe-core.c | 15 +++---- >> .../st/sti/c8sectpfe/c8sectpfe-core.h | 2 +- >> drivers/media/radio/wl128x/fmdrv.h | 7 ++-- >> drivers/media/radio/wl128x/fmdrv_common.c | 41 = ++++++++++--------- >> drivers/media/rc/mceusb.c | 2 +- >> drivers/media/usb/ttusb-dec/ttusb_dec.c | 21 +++++----- >> 30 files changed, 151 insertions(+), 131 deletions(-) >>=20 >> diff --git a/drivers/media/pci/bt8xx/bt878.c = b/drivers/media/pci/bt8xx/bt878.c >> index 90972d6952f1..983ec29108f0 100644 >> --- a/drivers/media/pci/bt8xx/bt878.c >> +++ b/drivers/media/pci/bt8xx/bt878.c >> @@ -300,8 +300,8 @@ static irqreturn_t bt878_irq(int irq, void = *dev_id) >> } >> if (astat & BT878_ARISCI) { >> bt->finished_block =3D (stat & BT878_ARISCS) >> = 28; >> - if (bt->tasklet.callback) >> - tasklet_schedule(&bt->tasklet); >> + if (bt->work.func) >> + queue_work(system_bh_wq, >=20 > I stopped reviewing here: this clearly has not been compile tested. >=20 > Also please check the patch with 'checkpatch.pl --strict' and fix the = reported issues. >=20 > Regards, >=20 > Hans Hans, Thanks for taking the time out to review. This was a mistake, I sent = out a v2 which had This fixed. I am working on v3 based on some of the comments I received = recently. Will Appreciate your review when it is sent out. Allen >=20 >> break; >> } >> count++; >> @@ -478,8 +478,8 @@ static int bt878_probe(struct pci_dev *dev, const = struct pci_device_id *pci_id) >> btwrite(0, BT878_AINT_MASK); >> bt878_num++; >>=20 >> - if (!bt->tasklet.func) >> - tasklet_disable(&bt->tasklet); >> + if (!bt->work.func) >> + disable_work_sync(&bt->work); >>=20 >> return 0; >>=20 >> diff --git a/drivers/media/pci/bt8xx/bt878.h = b/drivers/media/pci/bt8xx/bt878.h >> index fde8db293c54..b9ce78e5116b 100644 >> --- a/drivers/media/pci/bt8xx/bt878.h >> +++ b/drivers/media/pci/bt8xx/bt878.h >> @@ -14,6 +14,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include "bt848.h" >> #include "bttv.h" >> @@ -120,7 +121,7 @@ struct bt878 { >> dma_addr_t risc_dma; >> u32 risc_pos; >>=20 >> - struct tasklet_struct tasklet; >> + struct work_struct work; >> int shutdown; >> }; >>=20 >> diff --git a/drivers/media/pci/bt8xx/dvb-bt8xx.c = b/drivers/media/pci/bt8xx/dvb-bt8xx.c >> index 390cbba6c065..8c0e1fa764a4 100644 >> --- a/drivers/media/pci/bt8xx/dvb-bt8xx.c >> +++ b/drivers/media/pci/bt8xx/dvb-bt8xx.c >> @@ -15,6 +15,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >> #include >> @@ -39,9 +40,9 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); >>=20 >> #define IF_FREQUENCYx6 217 /* 6 * 36.16666666667MHz */ >>=20 >> -static void dvb_bt8xx_task(struct tasklet_struct *t) >> +static void dvb_bt8xx_task(struct work_struct *t) >> { >> - struct bt878 *bt =3D from_tasklet(bt, t, tasklet); >> + struct bt878 *bt =3D from_work(bt, t, work); >> struct dvb_bt8xx_card *card =3D = dev_get_drvdata(&bt->adapter->dev); >>=20 >> dprintk("%d\n", card->bt->finished_block); >> @@ -782,7 +783,7 @@ static int dvb_bt8xx_load_card(struct = dvb_bt8xx_card *card, u32 type) >> goto err_disconnect_frontend; >> } >>=20 >> - tasklet_setup(&card->bt->tasklet, dvb_bt8xx_task); >> + INIT_WORK(&card->bt->work, dvb_bt8xx_task); >>=20 >> frontend_init(card, type); >>=20 >> @@ -922,7 +923,7 @@ static void dvb_bt8xx_remove(struct = bttv_sub_device *sub) >> dprintk("dvb_bt8xx: unloading card%d\n", card->bttv_nr); >>=20 >> bt878_stop(card->bt); >> - tasklet_kill(&card->bt->tasklet); >> + cancel_work_sync(&card->bt->work); >> dvb_net_release(&card->dvbnet); >> card->demux.dmx.remove_frontend(&card->demux.dmx, = &card->fe_mem); >> card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw); >> diff --git a/drivers/media/pci/ddbridge/ddbridge.h = b/drivers/media/pci/ddbridge/ddbridge.h >> index f3699dbd193f..037d1d13ef0f 100644 >> --- a/drivers/media/pci/ddbridge/ddbridge.h >> +++ b/drivers/media/pci/ddbridge/ddbridge.h >> @@ -35,6 +35,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >> #include >> @@ -298,7 +299,7 @@ struct ddb_link { >> spinlock_t lock; /* lock link access */ >> struct mutex flash_mutex; /* lock flash access */ >> struct ddb_lnb lnb; >> - struct tasklet_struct tasklet; >> + struct work_struct work; >> struct ddb_ids ids; >>=20 >> spinlock_t temp_lock; /* lock temp chip access */ >> diff --git a/drivers/media/pci/mantis/hopper_cards.c = b/drivers/media/pci/mantis/hopper_cards.c >> index c0bd5d7e148b..869ea88c4893 100644 >> --- a/drivers/media/pci/mantis/hopper_cards.c >> +++ b/drivers/media/pci/mantis/hopper_cards.c >> @@ -116,7 +116,7 @@ static irqreturn_t hopper_irq_handler(int irq, = void *dev_id) >> if (stat & MANTIS_INT_RISCI) { >> dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]); >> mantis->busy_block =3D (stat & MANTIS_INT_RISCSTAT) >> = 28; >> - tasklet_schedule(&mantis->tasklet); >> + queue_work(system_bh_wq, &mantis->work); >> } >> if (stat & MANTIS_INT_I2CDONE) { >> dprintk(MANTIS_DEBUG, 0, "<%s>", label[9]); >> diff --git a/drivers/media/pci/mantis/mantis_cards.c = b/drivers/media/pci/mantis/mantis_cards.c >> index 906e4500d87d..cb124b19e36e 100644 >> --- a/drivers/media/pci/mantis/mantis_cards.c >> +++ b/drivers/media/pci/mantis/mantis_cards.c >> @@ -125,7 +125,7 @@ static irqreturn_t mantis_irq_handler(int irq, = void *dev_id) >> if (stat & MANTIS_INT_RISCI) { >> dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]); >> mantis->busy_block =3D (stat & MANTIS_INT_RISCSTAT) >> = 28; >> - tasklet_schedule(&mantis->tasklet); >> + queue_work(system_bh_wq, &mantis->work); >> } >> if (stat & MANTIS_INT_I2CDONE) { >> dprintk(MANTIS_DEBUG, 0, "<%s>", label[9]); >> diff --git a/drivers/media/pci/mantis/mantis_common.h = b/drivers/media/pci/mantis/mantis_common.h >> index d88ac280226c..f2247148f268 100644 >> --- a/drivers/media/pci/mantis/mantis_common.h >> +++ b/drivers/media/pci/mantis/mantis_common.h >> @@ -12,6 +12,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include "mantis_reg.h" >> #include "mantis_uart.h" >> @@ -125,7 +126,7 @@ struct mantis_pci { >> __le32 *risc_cpu; >> dma_addr_t risc_dma; >>=20 >> - struct tasklet_struct tasklet; >> + struct work_struct work; >> spinlock_t intmask_lock; >>=20 >> struct i2c_adapter adapter; >> diff --git a/drivers/media/pci/mantis/mantis_dma.c = b/drivers/media/pci/mantis/mantis_dma.c >> index 80c843936493..c85f9b84a2c6 100644 >> --- a/drivers/media/pci/mantis/mantis_dma.c >> +++ b/drivers/media/pci/mantis/mantis_dma.c >> @@ -15,6 +15,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >> #include >> @@ -200,9 +201,9 @@ void mantis_dma_stop(struct mantis_pci *mantis) >> } >>=20 >>=20 >> -void mantis_dma_xfer(struct tasklet_struct *t) >> +void mantis_dma_xfer(struct work_struct *t) >> { >> - struct mantis_pci *mantis =3D from_tasklet(mantis, t, tasklet); >> + struct mantis_pci *mantis =3D from_work(mantis, t, work); >> struct mantis_hwconfig *config =3D mantis->hwconfig; >>=20 >> while (mantis->last_block !=3D mantis->busy_block) { >> diff --git a/drivers/media/pci/mantis/mantis_dma.h = b/drivers/media/pci/mantis/mantis_dma.h >> index 37da982c9c29..5db0d3728f15 100644 >> --- a/drivers/media/pci/mantis/mantis_dma.h >> +++ b/drivers/media/pci/mantis/mantis_dma.h >> @@ -13,6 +13,6 @@ extern int mantis_dma_init(struct mantis_pci = *mantis); >> extern int mantis_dma_exit(struct mantis_pci *mantis); >> extern void mantis_dma_start(struct mantis_pci *mantis); >> extern void mantis_dma_stop(struct mantis_pci *mantis); >> -extern void mantis_dma_xfer(struct tasklet_struct *t); >> +extern void mantis_dma_xfer(struct work_struct *t); >>=20 >> #endif /* __MANTIS_DMA_H */ >> diff --git a/drivers/media/pci/mantis/mantis_dvb.c = b/drivers/media/pci/mantis/mantis_dvb.c >> index c7ba4a76e608..f640635de170 100644 >> --- a/drivers/media/pci/mantis/mantis_dvb.c >> +++ b/drivers/media/pci/mantis/mantis_dvb.c >> @@ -105,7 +105,7 @@ static int mantis_dvb_start_feed(struct = dvb_demux_feed *dvbdmxfeed) >> if (mantis->feeds =3D=3D 1) { >> dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma"); >> mantis_dma_start(mantis); >> - tasklet_enable(&mantis->tasklet); >> + enable_and_queue_work(system_bh_wq, &mantis->work); >> } >>=20 >> return mantis->feeds; >> @@ -125,7 +125,7 @@ static int mantis_dvb_stop_feed(struct = dvb_demux_feed *dvbdmxfeed) >> mantis->feeds--; >> if (mantis->feeds =3D=3D 0) { >> dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma"); >> - tasklet_disable(&mantis->tasklet); >> + disable_work_sync(&mantis->work); >> mantis_dma_stop(mantis); >> } >>=20 >> @@ -205,8 +205,8 @@ int mantis_dvb_init(struct mantis_pci *mantis) >> } >>=20 >> dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, = &mantis->demux.dmx); >> - tasklet_setup(&mantis->tasklet, mantis_dma_xfer); >> - tasklet_disable(&mantis->tasklet); >> + INIT_WORK(&mantis->bh, mantis_dma_xfer); >> + disable_work_sync(&mantis->work); >> if (mantis->hwconfig) { >> result =3D config->frontend_init(mantis, mantis->fe); >> if (result < 0) { >> @@ -235,7 +235,7 @@ int mantis_dvb_init(struct mantis_pci *mantis) >>=20 >> /* Error conditions .. */ >> err5: >> - tasklet_kill(&mantis->tasklet); >> + cancel_work_sync(&mantis->work); >> dvb_net_release(&mantis->dvbnet); >> if (mantis->fe) { >> dvb_unregister_frontend(mantis->fe); >> @@ -273,7 +273,7 @@ int mantis_dvb_exit(struct mantis_pci *mantis) >> dvb_frontend_detach(mantis->fe); >> } >>=20 >> - tasklet_kill(&mantis->tasklet); >> + cancel_work_sync(&mantis->work); >> dvb_net_release(&mantis->dvbnet); >>=20 >> mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, = &mantis->fe_mem); >> diff --git a/drivers/media/pci/ngene/ngene-core.c = b/drivers/media/pci/ngene/ngene-core.c >> index 7481f553f959..5211d6796748 100644 >> --- a/drivers/media/pci/ngene/ngene-core.c >> +++ b/drivers/media/pci/ngene/ngene-core.c >> @@ -21,6 +21,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include "ngene.h" >>=20 >> @@ -50,9 +51,9 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); >> /* nGene interrupt handler = **************************************************/ >> = /*************************************************************************= ***/ >>=20 >> -static void event_tasklet(struct tasklet_struct *t) >> +static void event_work(struct work_struct *t) >> { >> - struct ngene *dev =3D from_tasklet(dev, t, event_tasklet); >> + struct ngene *dev =3D from_work(dev, t, event_work); >>=20 >> while (dev->EventQueueReadIndex !=3D dev->EventQueueWriteIndex) = { >> struct EVENT_BUFFER Event =3D >> @@ -68,9 +69,9 @@ static void event_tasklet(struct tasklet_struct *t) >> } >> } >>=20 >> -static void demux_tasklet(struct tasklet_struct *t) >> +static void demux_work(struct work_struct *t) >> { >> - struct ngene_channel *chan =3D from_tasklet(chan, t, = demux_tasklet); >> + struct ngene_channel *chan =3D from_work(chan, t, demux_work); >> struct device *pdev =3D &chan->dev->pci_dev->dev; >> struct SBufferHeader *Cur =3D chan->nextBuffer; >>=20 >> @@ -204,7 +205,7 @@ static irqreturn_t irq_handler(int irq, void = *dev_id) >> dev->EventQueueOverflowFlag =3D 1; >> } >> dev->EventBuffer->EventStatus &=3D ~0x80; >> - tasklet_schedule(&dev->event_tasklet); >> + queue_work(system_bh_wq, &dev->event_work); >> rc =3D IRQ_HANDLED; >> } >>=20 >> @@ -217,8 +218,8 @@ static irqreturn_t irq_handler(int irq, void = *dev_id) >> ngeneBuffer.SR.Flags & 0xC0) =3D=3D 0x80) { >> dev->channel[i].nextBuffer-> >> ngeneBuffer.SR.Flags |=3D 0x40; >> - tasklet_schedule( >> - &dev->channel[i].demux_tasklet); >> + queue_work(system_bh_wq, >> + &dev->channel[i].demux_work); >> rc =3D IRQ_HANDLED; >> } >> } >> @@ -1181,7 +1182,7 @@ static void ngene_init(struct ngene *dev) >> struct device *pdev =3D &dev->pci_dev->dev; >> int i; >>=20 >> - tasklet_setup(&dev->event_tasklet, event_tasklet); >> + INIT_WORK(&dev->event_work, event_work); >>=20 >> memset_io(dev->iomem + 0xc000, 0x00, 0x220); >> memset_io(dev->iomem + 0xc400, 0x00, 0x100); >> @@ -1395,7 +1396,7 @@ static void release_channel(struct = ngene_channel *chan) >> if (chan->running) >> set_transfer(chan, 0); >>=20 >> - tasklet_kill(&chan->demux_tasklet); >> + cancel_work_sync(&chan->demux_work); >>=20 >> if (chan->ci_dev) { >> dvb_unregister_device(chan->ci_dev); >> @@ -1445,7 +1446,7 @@ static int init_channel(struct ngene_channel = *chan) >> struct ngene_info *ni =3D dev->card_info; >> int io =3D ni->io_type[nr]; >>=20 >> - tasklet_setup(&chan->demux_tasklet, demux_tasklet); >> + INIT_WORK(&chan->demux_work, demux_work); >> chan->users =3D 0; >> chan->type =3D io; >> chan->mode =3D chan->type; /* for now only one mode */ >> @@ -1647,7 +1648,7 @@ void ngene_remove(struct pci_dev *pdev) >> struct ngene *dev =3D pci_get_drvdata(pdev); >> int i; >>=20 >> - tasklet_kill(&dev->event_tasklet); >> + cancel_work_sync(&dev->event_work); >> for (i =3D MAX_STREAM - 1; i >=3D 0; i--) >> release_channel(&dev->channel[i]); >> if (dev->ci.en) >> diff --git a/drivers/media/pci/ngene/ngene.h = b/drivers/media/pci/ngene/ngene.h >> index d1d7da84cd9d..c2a23f6dbe09 100644 >> --- a/drivers/media/pci/ngene/ngene.h >> +++ b/drivers/media/pci/ngene/ngene.h >> @@ -16,6 +16,7 @@ >> #include >>=20 >> #include >> +#include >>=20 >> #include >> #include >> @@ -621,7 +622,7 @@ struct ngene_channel { >> int users; >> struct video_device *v4l_dev; >> struct dvb_device *ci_dev; >> - struct tasklet_struct demux_tasklet; >> + struct work_struct demux_work; >>=20 >> struct SBufferHeader *nextBuffer; >> enum KSSTATE State; >> @@ -717,7 +718,7 @@ struct ngene { >> struct EVENT_BUFFER EventQueue[EVENT_QUEUE_SIZE]; >> int EventQueueOverflowCount; >> int EventQueueOverflowFlag; >> - struct tasklet_struct event_tasklet; >> + struct work_struct event_work; >> struct EVENT_BUFFER *EventBuffer; >> int EventQueueWriteIndex; >> int EventQueueReadIndex; >> diff --git a/drivers/media/pci/smipcie/smipcie-main.c = b/drivers/media/pci/smipcie/smipcie-main.c >> index 0c300d019d9c..7da6bb55660b 100644 >> --- a/drivers/media/pci/smipcie/smipcie-main.c >> +++ b/drivers/media/pci/smipcie/smipcie-main.c >> @@ -279,10 +279,10 @@ static void smi_port_clearInterrupt(struct = smi_port *port) >> (port->_dmaInterruptCH0 | port->_dmaInterruptCH1)); >> } >>=20 >> -/* tasklet handler: DMA data to dmx.*/ >> -static void smi_dma_xfer(struct tasklet_struct *t) >> +/* work handler: DMA data to dmx.*/ >> +static void smi_dma_xfer(struct work_struct *t) >> { >> - struct smi_port *port =3D from_tasklet(port, t, tasklet); >> + struct smi_port *port =3D from_work(port, t, work); >> struct smi_dev *dev =3D port->dev; >> u32 intr_status, finishedData, dmaManagement; >> u8 dmaChan0State, dmaChan1State; >> @@ -426,8 +426,8 @@ static int smi_port_init(struct smi_port *port, = int dmaChanUsed) >> } >>=20 >> smi_port_disableInterrupt(port); >> - tasklet_setup(&port->tasklet, smi_dma_xfer); >> - tasklet_disable(&port->tasklet); >> + INIT_WORK(&port->work, smi_dma_xfer); >> + disable_work_sync(&port->work); >> port->enable =3D 1; >> return 0; >> err: >> @@ -438,7 +438,7 @@ static int smi_port_init(struct smi_port *port, = int dmaChanUsed) >> static void smi_port_exit(struct smi_port *port) >> { >> smi_port_disableInterrupt(port); >> - tasklet_kill(&port->tasklet); >> + cancel_work_sync(&port->work); >> smi_port_dma_free(port); >> port->enable =3D 0; >> } >> @@ -452,7 +452,7 @@ static int smi_port_irq(struct smi_port *port, = u32 int_status) >> smi_port_disableInterrupt(port); >> port->_int_status =3D int_status; >> smi_port_clearInterrupt(port); >> - tasklet_schedule(&port->tasklet); >> + queue_work(system_bh_wq, &port->work); >> handled =3D 1; >> } >> return handled; >> @@ -823,7 +823,7 @@ static int smi_start_feed(struct dvb_demux_feed = *dvbdmxfeed) >> smi_port_clearInterrupt(port); >> smi_port_enableInterrupt(port); >> smi_write(port->DMA_MANAGEMENT, dmaManagement); >> - tasklet_enable(&port->tasklet); >> + enable_and_queue_work(system_bh_wq, &port->work); >> } >> return port->users; >> } >> @@ -837,7 +837,7 @@ static int smi_stop_feed(struct dvb_demux_feed = *dvbdmxfeed) >> if (--port->users) >> return port->users; >>=20 >> - tasklet_disable(&port->tasklet); >> + disable_work_sync(&port->work); >> smi_port_disableInterrupt(port); >> smi_clear(port->DMA_MANAGEMENT, 0x30003); >> return 0; >> diff --git a/drivers/media/pci/smipcie/smipcie.h = b/drivers/media/pci/smipcie/smipcie.h >> index 2b5e0154814c..f124d2cdead6 100644 >> --- a/drivers/media/pci/smipcie/smipcie.h >> +++ b/drivers/media/pci/smipcie/smipcie.h >> @@ -17,6 +17,7 @@ >> #include >> #include >> #include >> +#include >> #include >>=20 >> #include >> @@ -257,7 +258,7 @@ struct smi_port { >> u32 _dmaInterruptCH0; >> u32 _dmaInterruptCH1; >> u32 _int_status; >> - struct tasklet_struct tasklet; >> + struct work_struct work; >> /* dvb */ >> struct dmx_frontend hw_frontend; >> struct dmx_frontend mem_frontend; >> diff --git a/drivers/media/pci/ttpci/budget-av.c = b/drivers/media/pci/ttpci/budget-av.c >> index a47c5850ef87..6e43b1a01191 100644 >> --- a/drivers/media/pci/ttpci/budget-av.c >> +++ b/drivers/media/pci/ttpci/budget-av.c >> @@ -37,6 +37,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >>=20 >> @@ -55,7 +56,7 @@ struct budget_av { >> struct video_device vd; >> int cur_input; >> int has_saa7113; >> - struct tasklet_struct ciintf_irq_tasklet; >> + struct work_struct ciintf_irq_work; >> int slot_status; >> struct dvb_ca_en50221 ca; >> u8 reinitialise_demod:1; >> diff --git a/drivers/media/pci/ttpci/budget-ci.c = b/drivers/media/pci/ttpci/budget-ci.c >> index 66e1a004ee43..11e0ed62707e 100644 >> --- a/drivers/media/pci/ttpci/budget-ci.c >> +++ b/drivers/media/pci/ttpci/budget-ci.c >> @@ -17,6 +17,7 @@ >> #include >> #include >> #include >> +#include >> #include >>=20 >> #include "budget.h" >> @@ -80,7 +81,7 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); >>=20 >> struct budget_ci_ir { >> struct rc_dev *dev; >> - struct tasklet_struct msp430_irq_tasklet; >> + struct work_struct msp430_irq_work; >> char name[72]; /* 40 + 32 for (struct saa7146_dev).name */ >> char phys[32]; >> int rc5_device; >> @@ -91,7 +92,7 @@ struct budget_ci_ir { >>=20 >> struct budget_ci { >> struct budget budget; >> - struct tasklet_struct ciintf_irq_tasklet; >> + struct work_struct ciintf_irq_work; >> int slot_status; >> int ci_irq; >> struct dvb_ca_en50221 ca; >> @@ -99,9 +100,9 @@ struct budget_ci { >> u8 tuner_pll_address; /* used for philips_tdm1316l configs */ >> }; >>=20 >> -static void msp430_ir_interrupt(struct tasklet_struct *t) >> +static void msp430_ir_interrupt(struct work_struct *t) >> { >> - struct budget_ci_ir *ir =3D from_tasklet(ir, t, = msp430_irq_tasklet); >> + struct budget_ci_ir *ir =3D from_work(ir, t, msp430_irq_work); >> struct budget_ci *budget_ci =3D container_of(ir, = typeof(*budget_ci), ir); >> struct rc_dev *dev =3D budget_ci->ir.dev; >> u32 command =3D ttpci_budget_debiread(&budget_ci->budget, = DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8; >> @@ -230,7 +231,7 @@ static int msp430_ir_init(struct budget_ci = *budget_ci) >>=20 >> budget_ci->ir.dev =3D dev; >>=20 >> - tasklet_setup(&budget_ci->ir.msp430_irq_tasklet, = msp430_ir_interrupt); >> + INIT_WORK(&budget_ci->ir.msp430_irq_work, msp430_ir_interrupt); >>=20 >> SAA7146_IER_ENABLE(saa, MASK_06); >> saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI); >> @@ -244,7 +245,7 @@ static void msp430_ir_deinit(struct budget_ci = *budget_ci) >>=20 >> SAA7146_IER_DISABLE(saa, MASK_06); >> saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT); >> - tasklet_kill(&budget_ci->ir.msp430_irq_tasklet); >> + cancel_work_sync(&budget_ci->ir.msp430_irq_work); >>=20 >> rc_unregister_device(budget_ci->ir.dev); >> } >> @@ -348,10 +349,10 @@ static int ciintf_slot_ts_enable(struct = dvb_ca_en50221 *ca, int slot) >> return 0; >> } >>=20 >> -static void ciintf_interrupt(struct tasklet_struct *t) >> +static void ciintf_interrupt(struct work_struct *t) >> { >> - struct budget_ci *budget_ci =3D from_tasklet(budget_ci, t, >> - ciintf_irq_tasklet); >> + struct budget_ci *budget_ci =3D from_work(budget_ci, t, >> + ciintf_irq_work); >> struct saa7146_dev *saa =3D budget_ci->budget.dev; >> unsigned int flags; >>=20 >> @@ -492,7 +493,7 @@ static int ciintf_init(struct budget_ci = *budget_ci) >>=20 >> // Setup CI slot IRQ >> if (budget_ci->ci_irq) { >> - tasklet_setup(&budget_ci->ciintf_irq_tasklet, = ciintf_interrupt); >> + INIT_WORK(&budget_ci->ciintf_irq_work, = ciintf_interrupt); >> if (budget_ci->slot_status !=3D SLOTSTATUS_NONE) { >> saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO); >> } else { >> @@ -532,7 +533,7 @@ static void ciintf_deinit(struct budget_ci = *budget_ci) >> if (budget_ci->ci_irq) { >> SAA7146_IER_DISABLE(saa, MASK_03); >> saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT); >> - tasklet_kill(&budget_ci->ciintf_irq_tasklet); >> + cancel_work_sync(&budget_ci->ciintf_irq_work); >> } >>=20 >> // reset interface >> @@ -558,13 +559,13 @@ static void budget_ci_irq(struct saa7146_dev = *dev, u32 * isr) >> dprintk(8, "dev: %p, budget_ci: %p\n", dev, budget_ci); >>=20 >> if (*isr & MASK_06) >> - tasklet_schedule(&budget_ci->ir.msp430_irq_tasklet); >> + queue_work(system_bh_wq, = &budget_ci->ir.msp430_irq_work); >>=20 >> if (*isr & MASK_10) >> ttpci_budget_irq10_handler(dev, isr); >>=20 >> if ((*isr & MASK_03) && (budget_ci->budget.ci_present) && = (budget_ci->ci_irq)) >> - tasklet_schedule(&budget_ci->ciintf_irq_tasklet); >> + queue_work(system_bh_wq, &budget_ci->ciintf_irq_work); >> } >>=20 >> static u8 philips_su1278_tt_inittab[] =3D { >> diff --git a/drivers/media/pci/ttpci/budget-core.c = b/drivers/media/pci/ttpci/budget-core.c >> index 25f44c3eebf3..3443c12dc9f2 100644 >> --- a/drivers/media/pci/ttpci/budget-core.c >> +++ b/drivers/media/pci/ttpci/budget-core.c >> @@ -171,9 +171,9 @@ static int budget_read_fe_status(struct = dvb_frontend *fe, >> return ret; >> } >>=20 >> -static void vpeirq(struct tasklet_struct *t) >> +static void vpeirq(struct work_struct *t) >> { >> - struct budget *budget =3D from_tasklet(budget, t, vpe_tasklet); >> + struct budget *budget =3D from_work(budget, t, vpe_work); >> u8 *mem =3D (u8 *) (budget->grabbing); >> u32 olddma =3D budget->ttbp; >> u32 newdma =3D saa7146_read(budget->dev, PCI_VDP3); >> @@ -520,7 +520,7 @@ int ttpci_budget_init(struct budget *budget, = struct saa7146_dev *dev, >> /* upload all */ >> saa7146_write(dev, GPIO_CTRL, 0x000000); >>=20 >> - tasklet_setup(&budget->vpe_tasklet, vpeirq); >> + INIT_WORK(&budget->vpe_work, vpeirq); >>=20 >> /* frontend power on */ >> if (bi->type !=3D BUDGET_FS_ACTIVY) >> @@ -557,7 +557,7 @@ int ttpci_budget_deinit(struct budget *budget) >>=20 >> budget_unregister(budget); >>=20 >> - tasklet_kill(&budget->vpe_tasklet); >> + cancel_work_sync(&budget->vpe_work); >>=20 >> saa7146_vfree_destroy_pgtable(dev->pci, budget->grabbing, = &budget->pt); >>=20 >> @@ -575,7 +575,7 @@ void ttpci_budget_irq10_handler(struct = saa7146_dev *dev, u32 * isr) >> dprintk(8, "dev: %p, budget: %p\n", dev, budget); >>=20 >> if (*isr & MASK_10) >> - tasklet_schedule(&budget->vpe_tasklet); >> + queue_work(system_bh_wq, &budget->vpe_work); >> } >>=20 >> void ttpci_budget_set_video_port(struct saa7146_dev *dev, int = video_port) >> diff --git a/drivers/media/pci/ttpci/budget.h = b/drivers/media/pci/ttpci/budget.h >> index bd87432e6cde..a3ee75e326b4 100644 >> --- a/drivers/media/pci/ttpci/budget.h >> +++ b/drivers/media/pci/ttpci/budget.h >> @@ -12,6 +12,7 @@ >>=20 >> #include >> #include >> +#include >>=20 >> #include >>=20 >> @@ -49,8 +50,8 @@ struct budget { >> unsigned char *grabbing; >> struct saa7146_pgtable pt; >>=20 >> - struct tasklet_struct fidb_tasklet; >> - struct tasklet_struct vpe_tasklet; >> + struct work_struct fidb_work; >> + struct work_struct vpe_work; >>=20 >> struct dmxdev dmxdev; >> struct dvb_demux demux; >> diff --git a/drivers/media/pci/tw5864/tw5864-core.c = b/drivers/media/pci/tw5864/tw5864-core.c >> index 560ff1ddcc83..a58c268e94a8 100644 >> --- a/drivers/media/pci/tw5864/tw5864-core.c >> +++ b/drivers/media/pci/tw5864/tw5864-core.c >> @@ -144,7 +144,7 @@ static void tw5864_h264_isr(struct tw5864_dev = *dev) >> cur_frame->gop_seqno =3D input->frame_gop_seqno; >>=20 >> dev->h264_buf_w_index =3D next_frame_index; >> - tasklet_schedule(&dev->tasklet); >> + queue_work(system_bh_wq, &dev->work); >>=20 >> cur_frame =3D next_frame; >>=20 >> diff --git a/drivers/media/pci/tw5864/tw5864-video.c = b/drivers/media/pci/tw5864/tw5864-video.c >> index 8b1aae4b6319..ac2249626506 100644 >> --- a/drivers/media/pci/tw5864/tw5864-video.c >> +++ b/drivers/media/pci/tw5864/tw5864-video.c >> @@ -6,6 +6,7 @@ >> */ >>=20 >> #include >> +#include >> #include >> #include >> #include >> @@ -175,7 +176,7 @@ static const unsigned int intra4x4_lambda3[] =3D = { >> static v4l2_std_id tw5864_get_v4l2_std(enum tw5864_vid_std std); >> static enum tw5864_vid_std tw5864_from_v4l2_std(v4l2_std_id = v4l2_std); >>=20 >> -static void tw5864_handle_frame_task(struct tasklet_struct *t); >> +static void tw5864_handle_frame_task(struct work_struct *t); >> static void tw5864_handle_frame(struct tw5864_h264_frame *frame); >> static void tw5864_frame_interval_set(struct tw5864_input *input); >>=20 >> @@ -1062,7 +1063,7 @@ int tw5864_video_init(struct tw5864_dev *dev, = int *video_nr) >> dev->irqmask |=3D TW5864_INTR_VLC_DONE | TW5864_INTR_TIMER; >> tw5864_irqmask_apply(dev); >>=20 >> - tasklet_setup(&dev->tasklet, tw5864_handle_frame_task); >> + INIT_WORK(&dev->work, tw5864_handle_frame_task); >>=20 >> for (i =3D 0; i < TW5864_INPUTS; i++) { >> dev->inputs[i].root =3D dev; >> @@ -1079,7 +1080,7 @@ int tw5864_video_init(struct tw5864_dev *dev, = int *video_nr) >> for (i =3D last_input_nr_registered; i >=3D 0; i--) >> tw5864_video_input_fini(&dev->inputs[i]); >>=20 >> - tasklet_kill(&dev->tasklet); >> + cancel_work_sync(&dev->work); >>=20 >> free_dma: >> for (i =3D last_dma_allocated; i >=3D 0; i--) { >> @@ -1198,7 +1199,7 @@ void tw5864_video_fini(struct tw5864_dev *dev) >> { >> int i; >>=20 >> - tasklet_kill(&dev->tasklet); >> + cancel_work_sync(&dev->work); >>=20 >> for (i =3D 0; i < TW5864_INPUTS; i++) >> tw5864_video_input_fini(&dev->inputs[i]); >> @@ -1315,9 +1316,9 @@ static int tw5864_is_motion_triggered(struct = tw5864_h264_frame *frame) >> return detected; >> } >>=20 >> -static void tw5864_handle_frame_task(struct tasklet_struct *t) >> +static void tw5864_handle_frame_task(struct work_struct *t) >> { >> - struct tw5864_dev *dev =3D from_tasklet(dev, t, tasklet); >> + struct tw5864_dev *dev =3D from_work(dev, t, work); >> unsigned long flags; >> int batch_size =3D H264_BUF_CNT; >>=20 >> diff --git a/drivers/media/pci/tw5864/tw5864.h = b/drivers/media/pci/tw5864/tw5864.h >> index a8b6fbd5b710..278373859098 100644 >> --- a/drivers/media/pci/tw5864/tw5864.h >> +++ b/drivers/media/pci/tw5864/tw5864.h >> @@ -12,6 +12,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include >> #include >> @@ -85,7 +86,7 @@ struct tw5864_input { >> int nr; /* input number */ >> struct tw5864_dev *root; >> struct mutex lock; /* used for vidq and vdev */ >> - spinlock_t slock; /* used for sync between ISR, tasklet & V4L2 = API */ >> + spinlock_t slock; /* used for sync between ISR, work & V4L2 API = */ >> struct video_device vdev; >> struct v4l2_ctrl_handler hdl; >> struct vb2_queue vidq; >> @@ -142,7 +143,7 @@ struct tw5864_h264_frame { >>=20 >> /* global device status */ >> struct tw5864_dev { >> - spinlock_t slock; /* used for sync between ISR, tasklet & V4L2 = API */ >> + spinlock_t slock; /* used for sync between ISR, work & V4L2 API = */ >> struct v4l2_device v4l2_dev; >> struct tw5864_input inputs[TW5864_INPUTS]; >> #define H264_BUF_CNT 4 >> @@ -150,7 +151,7 @@ struct tw5864_dev { >> int h264_buf_r_index; >> int h264_buf_w_index; >>=20 >> - struct tasklet_struct tasklet; >> + struct work_struct work; >>=20 >> int encoder_busy; >> /* Input number to check next for ready raw picture (in RR = fashion) */ >> diff --git a/drivers/media/platform/intel/pxa_camera.c = b/drivers/media/platform/intel/pxa_camera.c >> index d904952bf00e..df0a3c559287 100644 >> --- a/drivers/media/platform/intel/pxa_camera.c >> +++ b/drivers/media/platform/intel/pxa_camera.c >> @@ -43,6 +43,7 @@ >> #include >>=20 >> #include >> +#include >>=20 >> #define PXA_CAM_VERSION "0.0.6" >> #define PXA_CAM_DRV_NAME "pxa27x-camera" >> @@ -683,7 +684,7 @@ struct pxa_camera_dev { >> unsigned int buf_sequence; >>=20 >> struct pxa_buffer *active; >> - struct tasklet_struct task_eof; >> + struct work_struct task_eof; >>=20 >> u32 save_cicr[5]; >> }; >> @@ -1146,9 +1147,9 @@ static void pxa_camera_deactivate(struct = pxa_camera_dev *pcdev) >> clk_disable_unprepare(pcdev->clk); >> } >>=20 >> -static void pxa_camera_eof(struct tasklet_struct *t) >> +static void pxa_camera_eof(struct work_struct *t) >> { >> - struct pxa_camera_dev *pcdev =3D from_tasklet(pcdev, t, = task_eof); >> + struct pxa_camera_dev *pcdev =3D from_work(pcdev, t, task_eof); >> unsigned long cifr; >> struct pxa_buffer *buf; >>=20 >> @@ -1185,7 +1186,7 @@ static irqreturn_t pxa_camera_irq(int irq, void = *data) >> if (status & CISR_EOF) { >> cicr0 =3D __raw_readl(pcdev->base + CICR0) | CICR0_EOFM; >> __raw_writel(cicr0, pcdev->base + CICR0); >> - tasklet_schedule(&pcdev->task_eof); >> + queue_work(system_bh_wq, &pcdev->task_eof); >> } >>=20 >> return IRQ_HANDLED; >> @@ -2383,7 +2384,7 @@ static int pxa_camera_probe(struct = platform_device *pdev) >> } >> } >>=20 >> - tasklet_setup(&pcdev->task_eof, pxa_camera_eof); >> + INIT_WORK(&pcdev->task_eof, pxa_camera_eof); >>=20 >> pxa_camera_activate(pcdev); >>=20 >> @@ -2409,7 +2410,7 @@ static int pxa_camera_probe(struct = platform_device *pdev) >> return 0; >> exit_deactivate: >> pxa_camera_deactivate(pcdev); >> - tasklet_kill(&pcdev->task_eof); >> + cancel_work_sync(&pcdev->task_eof); >> exit_free_dma: >> dma_release_channel(pcdev->dma_chans[2]); >> exit_free_dma_u: >> @@ -2428,7 +2429,7 @@ static void pxa_camera_remove(struct = platform_device *pdev) >> struct pxa_camera_dev *pcdev =3D platform_get_drvdata(pdev); >>=20 >> pxa_camera_deactivate(pcdev); >> - tasklet_kill(&pcdev->task_eof); >> + cancel_work_sync(&pcdev->task_eof); >> dma_release_channel(pcdev->dma_chans[0]); >> dma_release_channel(pcdev->dma_chans[1]); >> dma_release_channel(pcdev->dma_chans[2]); >> diff --git a/drivers/media/platform/marvell/mcam-core.c = b/drivers/media/platform/marvell/mcam-core.c >> index 66688b4aece5..d6b96a7039be 100644 >> --- a/drivers/media/platform/marvell/mcam-core.c >> +++ b/drivers/media/platform/marvell/mcam-core.c >> @@ -25,6 +25,7 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -439,9 +440,9 @@ static void mcam_ctlr_dma_vmalloc(struct = mcam_camera *cam) >> /* >> * Copy data out to user space in the vmalloc case >> */ >> -static void mcam_frame_tasklet(struct tasklet_struct *t) >> +static void mcam_frame_work(struct work_struct *t) >> { >> - struct mcam_camera *cam =3D from_tasklet(cam, t, s_tasklet); >> + struct mcam_camera *cam =3D from_work(cam, t, s_work); >> int i; >> unsigned long flags; >> struct mcam_vb_buffer *buf; >> @@ -480,7 +481,7 @@ static void mcam_frame_tasklet(struct = tasklet_struct *t) >>=20 >>=20 >> /* >> - * Make sure our allocated buffers are up to the task. >> + * Make sure our allocated buffers are up to the work. >> */ >> static int mcam_check_dma_buffers(struct mcam_camera *cam) >> { >> @@ -493,7 +494,7 @@ static int mcam_check_dma_buffers(struct = mcam_camera *cam) >>=20 >> static void mcam_vmalloc_done(struct mcam_camera *cam, int frame) >> { >> - tasklet_schedule(&cam->s_tasklet); >> + queue_work(system_bh_wq, &cam->s_work); >> } >>=20 >> #else /* MCAM_MODE_VMALLOC */ >> @@ -1305,7 +1306,7 @@ static int mcam_setup_vb2(struct mcam_camera = *cam) >> break; >> case B_vmalloc: >> #ifdef MCAM_MODE_VMALLOC >> - tasklet_setup(&cam->s_tasklet, mcam_frame_tasklet); >> + INIT_WORK(&cam->s_work, mcam_frame_work); >> vq->ops =3D &mcam_vb2_ops; >> vq->mem_ops =3D &vb2_vmalloc_memops; >> cam->dma_setup =3D mcam_ctlr_dma_vmalloc; >> diff --git a/drivers/media/platform/marvell/mcam-core.h = b/drivers/media/platform/marvell/mcam-core.h >> index 51e66db45af6..0d4b953dbb23 100644 >> --- a/drivers/media/platform/marvell/mcam-core.h >> +++ b/drivers/media/platform/marvell/mcam-core.h >> @@ -9,6 +9,7 @@ >>=20 >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -167,7 +168,7 @@ struct mcam_camera { >> unsigned int dma_buf_size; /* allocated size */ >> void *dma_bufs[MAX_DMA_BUFS]; /* Internal buffer addresses */ >> dma_addr_t dma_handles[MAX_DMA_BUFS]; /* Buffer bus addresses */ >> - struct tasklet_struct s_tasklet; >> + struct work_struct s_work; >> #endif >> unsigned int sequence; /* Frame sequence number */ >> unsigned int buf_seq[MAX_DMA_BUFS]; /* Sequence for individual = bufs */ >> diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c = b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c >> index e4cf27b5a072..22b359569a10 100644 >> --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c >> +++ b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c >> @@ -33,6 +33,7 @@ >> #include >> #include >> #include >> +#include >>=20 >> #include "c8sectpfe-common.h" >> #include "c8sectpfe-core.h" >> @@ -73,16 +74,16 @@ static void c8sectpfe_timer_interrupt(struct = timer_list *t) >>=20 >> /* is this descriptor initialised and TP enabled */ >> if (channel->irec && readl(channel->irec + = DMA_PRDS_TPENABLE)) >> - tasklet_schedule(&channel->tsklet); >> + queue_work(system_bh_wq, &channel->tsklet); >> } >>=20 >> fei->timer.expires =3D jiffies + = msecs_to_jiffies(POLL_MSECS); >> add_timer(&fei->timer); >> } >>=20 >> -static void channel_swdemux_tsklet(struct tasklet_struct *t) >> +static void channel_swdemux_tsklet(struct work_struct *t) >> { >> - struct channel_info *channel =3D from_tasklet(channel, t, = tsklet); >> + struct channel_info *channel =3D from_work(channel, t, tsklet); >> struct c8sectpfei *fei; >> unsigned long wp, rp; >> int pos, num_packets, n, size; >> @@ -211,7 +212,7 @@ static int c8sectpfe_start_feed(struct = dvb_demux_feed *dvbdmxfeed) >>=20 >> dev_dbg(fei->dev, "Starting channel=3D%p\n", channel); >>=20 >> - tasklet_setup(&channel->tsklet, channel_swdemux_tsklet); >> + INIT_WORK(&channel->tsklet, channel_swdemux_tsklet); >>=20 >> /* Reset the internal inputblock sram pointers */ >> writel(channel->fifo, >> @@ -304,7 +305,7 @@ static int c8sectpfe_stop_feed(struct = dvb_demux_feed *dvbdmxfeed) >> /* disable this channels descriptor */ >> writel(0, channel->irec + DMA_PRDS_TPENABLE); >>=20 >> - tasklet_disable(&channel->tsklet); >> + disable_work_sync(&channel->tsklet); >>=20 >> /* now request memdma channel goes idle */ >> idlereq =3D (1 << channel->tsin_id) | IDLEREQ; >> @@ -631,8 +632,8 @@ static int configure_memdma_and_inputblock(struct = c8sectpfei *fei, >> writel(tsin->back_buffer_busaddr, tsin->irec + = DMA_PRDS_BUSWP_TP(0)); >> writel(tsin->back_buffer_busaddr, tsin->irec + = DMA_PRDS_BUSRP_TP(0)); >>=20 >> - /* initialize tasklet */ >> - tasklet_setup(&tsin->tsklet, channel_swdemux_tsklet); >> + /* initialize work */ >> + INIT_WORK(&tsin->tsklet, channel_swdemux_tsklet); >>=20 >> return 0; >>=20 >> diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h = b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h >> index bf377cc82225..d63f0ee83615 100644 >> --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h >> +++ b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h >> @@ -51,7 +51,7 @@ struct channel_info { >> unsigned long fifo; >>=20 >> struct completion idle_completion; >> - struct tasklet_struct tsklet; >> + struct work_struct tsklet; >>=20 >> struct c8sectpfei *fei; >> void __iomem *irec; >> diff --git a/drivers/media/radio/wl128x/fmdrv.h = b/drivers/media/radio/wl128x/fmdrv.h >> index da8920169df8..85282f638c4a 100644 >> --- a/drivers/media/radio/wl128x/fmdrv.h >> +++ b/drivers/media/radio/wl128x/fmdrv.h >> @@ -15,6 +15,7 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -200,15 +201,15 @@ struct fmdev { >> int streg_cbdata; /* status of ST registration */ >>=20 >> struct sk_buff_head rx_q; /* RX queue */ >> - struct tasklet_struct rx_task; /* RX Tasklet */ >> + struct work_struct rx_task; /* RX Work */ >>=20 >> struct sk_buff_head tx_q; /* TX queue */ >> - struct tasklet_struct tx_task; /* TX Tasklet */ >> + struct work_struct tx_task; /* TX Work */ >> unsigned long last_tx_jiffies; /* Timestamp of last pkt sent */ >> atomic_t tx_cnt; /* Number of packets can send at a time = */ >>=20 >> struct sk_buff *resp_skb; /* Response from the chip */ >> - /* Main task completion handler */ >> + /* Main work completion handler */ >> struct completion maintask_comp; >> /* Opcode of last command sent to the chip */ >> u8 pre_op; >> diff --git a/drivers/media/radio/wl128x/fmdrv_common.c = b/drivers/media/radio/wl128x/fmdrv_common.c >> index 3da8e5102bec..52290bb4a4ad 100644 >> --- a/drivers/media/radio/wl128x/fmdrv_common.c >> +++ b/drivers/media/radio/wl128x/fmdrv_common.c >> @@ -9,7 +9,7 @@ >> * one Channel-8 command to be sent to the chip). >> * 2) Sending each Channel-8 command to the chip and reading >> * response back over Shared Transport. >> - * 3) Managing TX and RX Queues and Tasklets. >> + * 3) Managing TX and RX Queues and Works. >> * 4) Handling FM Interrupt packet and taking appropriate action. >> * 5) Loading FM firmware to the chip (common, FM TX, and FM RX >> * firmware files based on mode selection) >> @@ -29,6 +29,7 @@ >> #include "fmdrv_v4l2.h" >> #include "fmdrv_common.h" >> #include >> +#include >> #include "fmdrv_rx.h" >> #include "fmdrv_tx.h" >>=20 >> @@ -244,10 +245,10 @@ void fmc_update_region_info(struct fmdev = *fmdev, u8 region_to_set) >> } >>=20 >> /* >> - * FM common sub-module will schedule this tasklet whenever it = receives >> + * FM common sub-module will schedule this work whenever it receives >> * FM packet from ST driver. >> */ >> -static void recv_tasklet(struct tasklet_struct *t) >> +static void recv_work(struct work_struct *t) >> { >> struct fmdev *fmdev; >> struct fm_irq *irq_info; >> @@ -256,7 +257,7 @@ static void recv_tasklet(struct tasklet_struct = *t) >> u8 num_fm_hci_cmds; >> unsigned long flags; >>=20 >> - fmdev =3D from_tasklet(fmdev, t, tx_task); >> + fmdev =3D from_work(fmdev, t, tx_task); >> irq_info =3D &fmdev->irq_info; >> /* Process all packets in the RX queue */ >> while ((skb =3D skb_dequeue(&fmdev->rx_q))) { >> @@ -322,22 +323,22 @@ static void recv_tasklet(struct tasklet_struct = *t) >>=20 >> /* >> * Check flow control field. If Num_FM_HCI_Commands = field is >> - * not zero, schedule FM TX tasklet. >> + * not zero, schedule FM TX work. >> */ >> if (num_fm_hci_cmds && atomic_read(&fmdev->tx_cnt)) >> if (!skb_queue_empty(&fmdev->tx_q)) >> - tasklet_schedule(&fmdev->tx_task); >> + queue_work(system_bh_wq, = &fmdev->tx_task); >> } >> } >>=20 >> -/* FM send tasklet: is scheduled when FM packet has to be sent to = chip */ >> -static void send_tasklet(struct tasklet_struct *t) >> +/* FM send work: is scheduled when FM packet has to be sent to chip = */ >> +static void send_work(struct work_struct *t) >> { >> struct fmdev *fmdev; >> struct sk_buff *skb; >> int len; >>=20 >> - fmdev =3D from_tasklet(fmdev, t, tx_task); >> + fmdev =3D from_work(fmdev, t, tx_task); >>=20 >> if (!atomic_read(&fmdev->tx_cnt)) >> return; >> @@ -366,7 +367,7 @@ static void send_tasklet(struct tasklet_struct = *t) >> if (len < 0) { >> kfree_skb(skb); >> fmdev->resp_comp =3D NULL; >> - fmerr("TX tasklet failed to send skb(%p)\n", skb); >> + fmerr("TX work failed to send skb(%p)\n", skb); >> atomic_set(&fmdev->tx_cnt, 1); >> } else { >> fmdev->last_tx_jiffies =3D jiffies; >> @@ -374,7 +375,7 @@ static void send_tasklet(struct tasklet_struct = *t) >> } >>=20 >> /* >> - * Queues FM Channel-8 packet to FM TX queue and schedules FM TX = tasklet for >> + * Queues FM Channel-8 packet to FM TX queue and schedules FM TX = work for >> * transmission >> */ >> static int fm_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, = void *payload, >> @@ -440,7 +441,7 @@ static int fm_send_cmd(struct fmdev *fmdev, u8 = fm_op, u16 type, void *payload, >>=20 >> fm_cb(skb)->completion =3D wait_completion; >> skb_queue_tail(&fmdev->tx_q, skb); >> - tasklet_schedule(&fmdev->tx_task); >> + queue_work(system_bh_wq, &fmdev->tx_task); >>=20 >> return 0; >> } >> @@ -462,7 +463,7 @@ int fmc_send_cmd(struct fmdev *fmdev, u8 fm_op, = u16 type, void *payload, >>=20 >> if (!wait_for_completion_timeout(&fmdev->maintask_comp, >> FM_DRV_TX_TIMEOUT)) { >> - fmerr("Timeout(%d sec),didn't get regcompletion signal = from RX tasklet\n", >> + fmerr("Timeout(%d sec),didn't get regcompletion signal = from RX work\n", >> jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000); >> return -ETIMEDOUT; >> } >> @@ -1455,7 +1456,7 @@ static long fm_st_receive(void *arg, struct = sk_buff *skb) >>=20 >> memcpy(skb_push(skb, 1), &skb->cb[0], 1); >> skb_queue_tail(&fmdev->rx_q, skb); >> - tasklet_schedule(&fmdev->rx_task); >> + queue_work(system_bh_wq, &fmdev->rx_task); >>=20 >> return 0; >> } >> @@ -1537,13 +1538,13 @@ int fmc_prepare(struct fmdev *fmdev) >> spin_lock_init(&fmdev->rds_buff_lock); >> spin_lock_init(&fmdev->resp_skb_lock); >>=20 >> - /* Initialize TX queue and TX tasklet */ >> + /* Initialize TX queue and TX work */ >> skb_queue_head_init(&fmdev->tx_q); >> - tasklet_setup(&fmdev->tx_task, send_tasklet); >> + INIT_WORK(&fmdev->tx_task, send_work); >>=20 >> - /* Initialize RX Queue and RX tasklet */ >> + /* Initialize RX Queue and RX work */ >> skb_queue_head_init(&fmdev->rx_q); >> - tasklet_setup(&fmdev->rx_task, recv_tasklet); >> + INIT_WORK(&fmdev->rx_task, recv_work); >>=20 >> fmdev->irq_info.stage =3D 0; >> atomic_set(&fmdev->tx_cnt, 1); >> @@ -1589,8 +1590,8 @@ int fmc_release(struct fmdev *fmdev) >> /* Service pending read */ >> wake_up_interruptible(&fmdev->rx.rds.read_queue); >>=20 >> - tasklet_kill(&fmdev->tx_task); >> - tasklet_kill(&fmdev->rx_task); >> + cancel_work_sync(&fmdev->tx_task); >> + cancel_work_sync(&fmdev->rx_task); >>=20 >> skb_queue_purge(&fmdev->tx_q); >> skb_queue_purge(&fmdev->rx_q); >> diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c >> index c76ba24c1f55..a2e2e58b7506 100644 >> --- a/drivers/media/rc/mceusb.c >> +++ b/drivers/media/rc/mceusb.c >> @@ -774,7 +774,7 @@ static void mceusb_dev_printdata(struct = mceusb_dev *ir, u8 *buf, int buf_len, >>=20 >> /* >> * Schedule work that can't be done in interrupt handlers >> - * (mceusb_dev_recv() and mce_write_callback()) nor tasklets. >> + * (mceusb_dev_recv() and mce_write_callback()) nor works. >> * Invokes mceusb_deferred_kevent() for recovering from >> * error events specified by the kevent bit field. >> */ >> diff --git a/drivers/media/usb/ttusb-dec/ttusb_dec.c = b/drivers/media/usb/ttusb-dec/ttusb_dec.c >> index 79faa2560613..55eeb00f1126 100644 >> --- a/drivers/media/usb/ttusb-dec/ttusb_dec.c >> +++ b/drivers/media/usb/ttusb-dec/ttusb_dec.c >> @@ -19,6 +19,7 @@ >> #include >>=20 >> #include >> +#include >>=20 >> #include >> #include >> @@ -139,7 +140,7 @@ struct ttusb_dec { >> int v_pes_postbytes; >>=20 >> struct list_head urb_frame_list; >> - struct tasklet_struct urb_tasklet; >> + struct work_struct urb_work; >> spinlock_t urb_frame_list_lock; >>=20 >> struct dvb_demux_filter *audio_filter; >> @@ -766,9 +767,9 @@ static void ttusb_dec_process_urb_frame(struct = ttusb_dec *dec, u8 *b, >> } >> } >>=20 >> -static void ttusb_dec_process_urb_frame_list(struct tasklet_struct = *t) >> +static void ttusb_dec_process_urb_frame_list(struct work_struct *t) >> { >> - struct ttusb_dec *dec =3D from_tasklet(dec, t, urb_tasklet); >> + struct ttusb_dec *dec =3D from_work(dec, t, urb_work); >> struct list_head *item; >> struct urb_frame *frame; >> unsigned long flags; >> @@ -822,7 +823,7 @@ static void ttusb_dec_process_urb(struct urb = *urb) >> = spin_unlock_irqrestore(&dec->urb_frame_list_lock, >> flags); >>=20 >> - tasklet_schedule(&dec->urb_tasklet); >> + queue_work(system_bh_wq, = &dec->urb_work); >> } >> } >> } else { >> @@ -1198,11 +1199,11 @@ static int ttusb_dec_alloc_iso_urbs(struct = ttusb_dec *dec) >> return 0; >> } >>=20 >> -static void ttusb_dec_init_tasklet(struct ttusb_dec *dec) >> +static void ttusb_dec_init_work(struct ttusb_dec *dec) >> { >> spin_lock_init(&dec->urb_frame_list_lock); >> INIT_LIST_HEAD(&dec->urb_frame_list); >> - tasklet_setup(&dec->urb_tasklet, = ttusb_dec_process_urb_frame_list); >> + INIT_WORK(&dec->urb_work, ttusb_dec_process_urb_frame_list); >> } >>=20 >> static int ttusb_init_rc( struct ttusb_dec *dec) >> @@ -1588,12 +1589,12 @@ static void ttusb_dec_exit_usb(struct = ttusb_dec *dec) >> ttusb_dec_free_iso_urbs(dec); >> } >>=20 >> -static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec) >> +static void ttusb_dec_exit_work(struct ttusb_dec *dec) >> { >> struct list_head *item; >> struct urb_frame *frame; >>=20 >> - tasklet_kill(&dec->urb_tasklet); >> + cancel_work_sync(&dec->urb_work); >>=20 >> while ((item =3D dec->urb_frame_list.next) !=3D = &dec->urb_frame_list) { >> frame =3D list_entry(item, struct urb_frame, = urb_frame_list); >> @@ -1703,7 +1704,7 @@ static int ttusb_dec_probe(struct usb_interface = *intf, >>=20 >> ttusb_dec_init_v_pes(dec); >> ttusb_dec_init_filters(dec); >> - ttusb_dec_init_tasklet(dec); >> + ttusb_dec_init_work(dec); >>=20 >> dec->active =3D 1; >>=20 >> @@ -1729,7 +1730,7 @@ static void ttusb_dec_disconnect(struct = usb_interface *intf) >> dprintk("%s\n", __func__); >>=20 >> if (dec->active) { >> - ttusb_dec_exit_tasklet(dec); >> + ttusb_dec_exit_work(dec); >> ttusb_dec_exit_filters(dec); >> if(enable_rc) >> ttusb_dec_exit_rc(dec);