mmc: logging neatening and mmc_host_<level>
Subsystems (14)
cover mmc: logging neatening and mmc_host_<level>
Joe Perches (4):
mmc: Update logging style
wbsd: Use current logging
mmc: Logging neatening
mmc: Add mmc_host_<level> logging
drivers/mmc/card/block.c | 4 +- drivers/mmc/card/mmc_test.c | 77 ++++++--------- drivers/mmc/card/queue.c | 6 +- drivers/mmc/card/sdio_uart.c | 10 +- drivers/mmc/core/bus.c | 27 ++--- drivers/mmc/core/core.c | 116 ++++++++++----------- drivers/mmc/core/host.c | 14 +-- drivers/mmc/core/mmc.c | 75 +++++--------- drivers/mmc/core/mmc_ops.c | 12 +-- drivers/mmc/core/sd.c | 73 +++++--------- drivers/mmc/core/sdio.c | 11 +-- drivers/mmc/core/sdio_bus.c | 6 +- drivers/mmc/core/sdio_cis.c | 10 +- drivers/mmc/core/sdio_io.c | 14 ++- drivers/mmc/core/sdio_irq.c | 24 ++-- drivers/mmc/host/at91_mci.c | 12 +- drivers/mmc/host/au1xmmc.c | 35 +++--- drivers/mmc/host/bfin_sdh.c | 3 +- drivers/mmc/host/dw_mmc.c | 18 ++-- drivers/mmc/host/mmc_spi.c | 9 +- drivers/mmc/host/mmci.c | 8 +- drivers/mmc/host/msm_sdcc.c | 101 ++++++++---------- drivers/mmc/host/mvsdio.c | 42 +++----- drivers/mmc/host/omap_hsmmc.c | 19 +--- drivers/mmc/host/pxamci.c | 4 +- drivers/mmc/host/s3cmci.c | 3 +- drivers/mmc/host/sdhci-pci.c | 17 ++-- drivers/mmc/host/sdhci-pxav3.c | 7 +- drivers/mmc/host/sdhci.c | 218 +++++++++++++++++---------------------- drivers/mmc/host/sdricoh_cs.c | 12 +- drivers/mmc/host/tifm_sd.c | 12 +-- drivers/mmc/host/tmio_mmc.c | 4 +- drivers/mmc/host/tmio_mmc_pio.c | 4 +- drivers/mmc/host/via-sdmmc.c | 33 +++---- drivers/mmc/host/vub300.c | 54 +++++----- drivers/mmc/host/wbsd.c | 72 ++++++-------- include/linux/mmc/host.h | 11 ++ 37 files changed, 510 insertions(+), 667 deletions(-)
Signature · 1 line
1.7.6.405.gc1be0
PATCH 1/4 mmc: Update logging style
Convert pr_warning to pr_warn.
Coalesce format strings.
Align arguments.
Add missing \n.
--- drivers/mmc/card/block.c | 4 +- drivers/mmc/card/queue.c | 6 +--- drivers/mmc/card/sdio_uart.c | 10 ++++---- drivers/mmc/core/bus.c | 4 +- drivers/mmc/core/core.c | 9 +++---- drivers/mmc/core/mmc.c | 28 ++++++++++-------------- drivers/mmc/core/mmc_ops.c | 4 +- drivers/mmc/core/sd.c | 46 +++++++++++++++++------------------------ drivers/mmc/core/sdio.c | 5 +-- drivers/mmc/core/sdio_bus.c | 4 +- drivers/mmc/core/sdio_cis.c | 7 ++--- drivers/mmc/core/sdio_irq.c | 7 ++--- drivers/mmc/host/mmci.c | 5 +-- drivers/mmc/host/omap_hsmmc.c | 5 +-- drivers/mmc/host/s3cmci.c | 3 +- drivers/mmc/host/sdhci.c | 18 +++++++--------- drivers/mmc/host/tifm_sd.c | 3 +- drivers/mmc/host/wbsd.c | 24 ++++++++------------- 18 files changed, 82 insertions(+), 110 deletions(-)
drivers/mmc/card/block.c +2 -2
@@ -1238,8 +1238,8 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)case MMC_BLK_ECC_ERR :if (brq->data.blocks >1 ) {/* Redo read one sector at a time */ -pr_warning ("%s: retrying using single block read\n" , - req->rq_disk->disk_name); +pr_warn ("%s: retrying using single block read\n" , + req->rq_disk->disk_name); disable_multi =1 ;break ; }
drivers/mmc/card/queue.c +2 -4
@@ -197,14 +197,12 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card,if (bouncesz >512 ) { mqrq_cur->bounce_buf =kmalloc (bouncesz,GFP_KERNEL );if (!mqrq_cur->bounce_buf) { -pr_warning ("%s: unable to " -"allocate bounce cur buffer\n" , +pr_warn ("%s: unable to allocate bounce cur buffer\n" ,mmc_card_name (card)); } mqrq_prev->bounce_buf =kmalloc (bouncesz,GFP_KERNEL );if (!mqrq_prev->bounce_buf) { -pr_warning ("%s: unable to " -"allocate bounce prev buffer\n" , +pr_warn ("%s: unable to allocate bounce prev buffer\n" ,mmc_card_name (card));kfree (mqrq_cur->bounce_buf); mqrq_cur->bounce_buf =NULL ;
drivers/mmc/card/sdio_uart.c +5 -5
@@ -1082,8 +1082,8 @@ static int sdio_uart_probe(struct sdio_func *func,return -ENOMEM ;if (func->class ==SDIO_CLASS_UART ) { -pr_warning ("%s: need info on UART class basic setup\n" , -sdio_func_id (func)); +pr_warn ("%s: need info on UART class basic setup\n" , +sdio_func_id (func));kfree (port);return -ENOSYS ; }else if (func->class ==SDIO_CLASS_GPS ) {
@@ -1101,9 +1101,9 @@ static int sdio_uart_probe(struct sdio_func *func,break ; }if (!tpl) { -pr_warning ( -"%s: can't find tuple 0x91 subtuple 0 (SUBTPL_SIOREG) for GPS class\n" , -sdio_func_id (func)); +pr_warn ( +"%s: can't find tuple 0x91 subtuple 0 (SUBTPL_SIOREG) for GPS class\n" , +sdio_func_id (func));kfree (port);return -EINVAL ; }
drivers/mmc/core/bus.c +2 -2
@@ -303,10 +303,10 @@ int mmc_add_card(struct mmc_card *card)mmc_card_ddr_mode (card) ?"DDR " :"" , type); }else { -printk (KERN_INFO "%s: new %s%s%s card at address %04x\n" , +pr_info ("%s: new %s%s%s card at address %04x\n" ,mmc_hostname (card->host),mmc_sd_card_uhs (card) ?"ultra high speed " : - (mmc_card_highspeed (card) ?"high speed " :"" ), +mmc_card_highspeed (card) ?"high speed " :"" ,mmc_card_ddr_mode (card) ?"DDR " :"" , type, card->rca); }
drivers/mmc/core/core.c +4 -5
@@ -1163,8 +1163,8 @@ u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)mmc_set_ios (host);mmc_host_clk_release (host); }else { -pr_warning ("%s: host doesn't support card's voltages\n" , -mmc_hostname (host)); +pr_warn ("%s: host doesn't support card's voltages\n" , +mmc_hostname (host)); ocr =0 ; }
@@ -2375,9 +2375,8 @@ int mmc_resume_host(struct mmc_host *host)BUG_ON (!host->bus_ops->resume); err = host->bus_ops->resume (host);if (err) { -pr_warning ("%s: error %d during resume " -"(card was removed?)\n" , -mmc_hostname (host), err); +pr_warn ("%s: error %d during resume (card was removed?)\n" , +mmc_hostname (host), err); err =0 ; } }
drivers/mmc/core/mmc.c +12 -16
@@ -223,9 +223,7 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)"Card will be ignored.\n" , mmc_hostname(card->host)); }else { -pr_warning ("%s: unable to read " -"EXT_CSD, performance might " -"suffer.\n" , +pr_warn ("%s: unable to read EXT_CSD, performance might suffer\n" ,mmc_hostname (card->host)); err =0 ; }
@@ -309,8 +307,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)break ;default :/* MMC v4 spec says this cannot happen */ -pr_warning ("%s: card is mmc v4 but doesn't " -"support any high-speed modes.\n" , +pr_warn ("%s: card is mmc v4 but doesn't support any high-speed modes\n" ,mmc_hostname (card->host)); }
@@ -664,8 +661,8 @@ static int mmc_select_powerclass(struct mmc_card *card, index =EXT_CSD_PWR_CL_200_360 ;break ;default : -pr_warning ("%s: Voltage range not supported " -"for power class.\n" ,mmc_hostname (host)); +pr_warn ("%s: Voltage range not supported for power class\n" , +mmc_hostname (host));return -EINVAL ; }
@@ -904,8 +901,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, goto free_card;if (err) { -pr_warning ("%s: switch to highspeed failed\n" , -mmc_hostname (card->host)); +pr_warn ("%s: switch to highspeed failed\n" , +mmc_hostname (card->host)); err =0 ; }else {mmc_card_set_highspeed (card);
@@ -922,8 +919,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,if (err && err != -EBADMSG ) goto free_card;if (err) { -pr_warning ("%s: Enabling HPI failed\n" , -mmc_hostname (card->host)); +pr_warn ("%s: Enabling HPI failed\n" , +mmc_hostname (card->host)); err =0 ; }else card->ext_csd.hpi_en =1 ;
@@ -1029,8 +1026,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, card->ext_csd.generic_cmd6_time); }if (err) { -pr_warning ("%s: switch to bus width %d ddr %d " -"failed\n" ,mmc_hostname (card->host), +pr_warn ("%s: switch to bus width %d ddr %d failed\n" , +mmc_hostname (card->host),1 << bus_width, ddr); goto free_card; }else if (ddr) {
@@ -1284,9 +1281,8 @@ int mmc_attach_mmc(struct mmc_host *host)* support. */ if (ocr &0x7F ) { -pr_warning ("%s: card claims to support voltages " -"below the defined range. These will be ignored.\n" , -mmc_hostname (host)); +pr_warn ("%s: card claims to support voltages below the defined range. These will be ignored.\n" , +mmc_hostname (host)); ocr &= ~0x7F ; }
drivers/mmc/core/mmc_ops.c +2 -2
@@ -415,8 +415,8 @@ int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,return -EBADMSG ; }else {if (status &0xFDFFA000 ) -pr_warning ("%s: unexpected status %#x after " -"switch" ,mmc_hostname (card->host), status); +pr_warn ("%s: unexpected status %#x after switch\n" , +mmc_hostname (card->host), status);if (status &R1_SWITCH_ERROR )return -EBADMSG ; }
drivers/mmc/core/sd.c +19 -27
129 lines not on this page · raw message
drivers/mmc/core/sdio.c +2 -3
@@ -777,9 +777,8 @@ int mmc_attach_sdio(struct mmc_host *host)* support. */ if (ocr &0x7F ) { -pr_warning ("%s: card claims to support voltages " -"below the defined range. These will be ignored.\n" , -mmc_hostname (host)); +pr_warn ("%s: card claims to support voltages below the defined range. These will be ignored.\n" , +mmc_hostname (host)); ocr &= ~0x7F ; }
drivers/mmc/core/sdio_bus.c +2 -2
@@ -174,8 +174,8 @@ static int sdio_bus_remove(struct device *dev) drv->remove (func);if (func->irq_handler) { -pr_warning ("WARNING: driver %s did not remove " -"its interrupt handler!\n" , drv->name); +pr_warn ("WARNING: driver %s did not remove its interrupt handler!\n" , + drv->name);sdio_claim_host (func);sdio_release_irq (func);sdio_release_host (func);
drivers/mmc/core/sdio_cis.c +3 -4
@@ -313,10 +313,9 @@ static int sdio_read_cis(struct mmc_card *card, struct sdio_func *func)if (ret == -ENOENT ) {/* warn about unknown tuples */ -pr_warning ("%s: queuing unknown" -" CIS tuple 0x%02x (%u bytes)\n" , -mmc_hostname (card->host), - tpl_code, tpl_link); +pr_warn ("%s: queuing unknown CIS tuple 0x%02x (%u bytes)\n" , +mmc_hostname (card->host), + tpl_code, tpl_link); }/* keep on analyzing tuples */
drivers/mmc/core/sdio_irq.c +3 -4
@@ -56,16 +56,15 @@ static int process_sdio_pending_irqs(struct mmc_card *card)if (pending & (1 << i)) { func = card->sdio_func[i -1 ];if (!func) { -pr_warning ("%s: pending IRQ for " -"non-existent function\n" , +pr_warn ("%s: pending IRQ for non-existent function\n" ,mmc_card_id (card)); ret = -EINVAL ; }else if (func->irq_handler) { func->irq_handler (func); count++; }else { -pr_warning ("%s: pending IRQ with no handler\n" , -sdio_func_id (func)); +pr_warn ("%s: pending IRQ with no handler\n" , +sdio_func_id (func)); ret = -EINVAL ; } }
drivers/mmc/host/mmci.c +2 -3
@@ -466,9 +466,8 @@ static void mmci_get_next_data(struct mmci_host *host, struct mmc_data *data)struct mmci_host_next *next = &host->next_data;if (data->host_cookie && data->host_cookie != next->cookie) { -pr_warning ("[%s] invalid cookie: data->host_cookie %d" -" host->next_data.cookie %d\n" , - __func__, data->host_cookie, host->next_data.cookie); +pr_warn ("[%s] invalid cookie: data->host_cookie %d host->next_data.cookie %d\n" , + __func__, data->host_cookie, host->next_data.cookie); data->host_cookie =0 ; }
drivers/mmc/host/omap_hsmmc.c +2 -3
@@ -1422,9 +1422,8 @@ static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,if (!next && data->host_cookie && data->host_cookie != host->next_data.cookie) { -pr_warning ("[%s] invalid cookie: data->host_cookie %d" -" host->next_data.cookie %d\n" , - __func__, data->host_cookie, host->next_data.cookie); +pr_warn ("[%s] invalid cookie: data->host_cookie %d host->next_data.cookie %d\n" , + __func__, data->host_cookie, host->next_data.cookie); data->host_cookie =0 ; }
drivers/mmc/host/s3cmci.c +2 -1
@@ -983,7 +983,8 @@ static int s3cmci_setup_data(struct s3cmci_host *host, struct mmc_data *data)* one block being transferred. */ if (data->blocks >1 ) { -pr_warning ("%s: can't do non-word sized block transfers (blksz %d)\n" , __func__, data->blksz); +pr_warn ("%s: can't do non-word sized block transfers (blksz %d)\n" , + __func__, data->blksz);return -EINVAL ; } }
drivers/mmc/host/sdhci.c +8 -10
@@ -677,8 +677,8 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) }if (count >=0xF ) { -pr_warning ("%s: Too large timeout requested for CMD%d!\n" , -mmc_hostname (host->mmc), cmd->opcode); +pr_warn ("%s: Too large timeout requested for CMD%d!\n" , +mmc_hostname (host->mmc), cmd->opcode); count =0xE ; }
@@ -2237,8 +2237,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)if (host->runtime_suspended) {spin_unlock (&host->lock); -pr_warning ("%s: got irq while runtime suspended\n" , -mmc_hostname (host->mmc)); +pr_warn ("%s: got irq while runtime suspended\n" , +mmc_hostname (host->mmc));return IRQ_HANDLED ; }
@@ -2585,8 +2585,7 @@ int sdhci_add_host(struct sdhci_host *host)if (host->flags & (SDHCI_USE_SDMA |SDHCI_USE_ADMA )) {if (host->ops->enable_dma) {if (host->ops->enable_dma (host)) { -pr_warning ("%s: No suitable DMA " -"available. Falling back to PIO.\n" , +pr_warn ("%s: No suitable DMA available. Falling back to PIO.\n" ,mmc_hostname (mmc)); host->flags &= ~(SDHCI_USE_SDMA |SDHCI_USE_ADMA );
@@ -2605,8 +2604,7 @@ int sdhci_add_host(struct sdhci_host *host)if (!host->adma_desc || !host->align_buffer) {kfree (host->adma_desc);kfree (host->align_buffer); -pr_warning ("%s: Unable to allocate ADMA " -"buffers. Falling back to standard DMA.\n" , +pr_warn ("%s: Unable to allocate ADMA buffers. Falling back to standard DMA.\n" ,mmc_hostname (mmc)); host->flags &= ~SDHCI_USE_ADMA ; }
@@ -2895,8 +2893,8 @@ int sdhci_add_host(struct sdhci_host *host) mmc->max_blk_size = (caps[0 ] &SDHCI_MAX_BLOCK_MASK ) >>SDHCI_MAX_BLOCK_SHIFT ;if (mmc->max_blk_size >=3 ) { -pr_warning ("%s: Invalid maximum block size, " -"assuming 512 bytes\n" ,mmc_hostname (mmc)); +pr_warn ("%s: Invalid maximum block size, assuming 512 bytes\n" , +mmc_hostname (mmc)); mmc->max_blk_size =0 ; } }
drivers/mmc/host/tifm_sd.c +1 -2
@@ -952,8 +952,7 @@ static int tifm_sd_probe(struct tifm_dev *sock)if (!(TIFM_SOCK_STATE_OCCUPIED &readl (sock->addr +SOCK_PRESENT_STATE ))) { -pr_warning ("%s : card gone, unexpectedly\n" , -dev_name (&sock->dev)); +pr_warn ("%s : card gone, unexpectedly\n" ,dev_name (&sock->dev));return rc; }
drivers/mmc/host/wbsd.c +9 -15
@@ -803,8 +803,7 @@ static void wbsd_request(struct mmc_host *mmc, struct mmc_request *mrq)default :#ifdef CONFIG_MMC_DEBUG -pr_warning ("%s: Data command %d is not " -"supported by this controller.\n" , +pr_warn ("%s: Data command %d is not supported by this controller\n" ,mmc_hostname (host->mmc), cmd->opcode);#endif cmd->error = -EINVAL ;
@@ -1429,8 +1428,8 @@ free:free_dma (dma); err: -pr_warning (DRIVER_NAME ": Unable to allocate DMA %d. " -"Falling back on FIFO.\n" , dma); +pr_warn (DRIVER_NAME ": Unable to allocate DMA %d. Falling back on FIFO.\n" , + dma); }static void wbsd_release_dma (struct wbsd_host *host)
@@ -1664,9 +1663,8 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma, ret =wbsd_scan (host);if (ret) {if (pnp && (ret == -ENODEV )) { -pr_warning (DRIVER_NAME -": Unable to confirm device presence. You may " -"experience lock-ups.\n" ); +pr_warn (DRIVER_NAME +": Unable to confirm device presence. You may experience lock-ups.\n" ); }else {wbsd_free_mmc (dev);return ret;
@@ -1688,10 +1686,8 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma,*/ if (pnp) {if ((host->config !=0 ) && !wbsd_chip_validate (host)) { -pr_warning (DRIVER_NAME -": PnP active but chip not configured! " -"You probably have a buggy BIOS. " -"Configuring chip manually.\n" ); +pr_warn (DRIVER_NAME +": PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n" );wbsd_chip_config (host); } }else
@@ -1909,10 +1905,8 @@ static int wbsd_pnp_resume(struct pnp_dev *pnp_dev)*/ if (host->config !=0 ) {if (!wbsd_chip_validate (host)) { -pr_warning (DRIVER_NAME -": PnP active but chip not configured! " -"You probably have a buggy BIOS. " -"Configuring chip manually.\n" ); +pr_warn (DRIVER_NAME +": PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n" );wbsd_chip_config (host); } }
Signature · 1 line
1.7.6.405.gc1be0
Re: [PATCH 1/4] mmc: Update logging style
2011/11/16 Joe Perches <[email protected]>:
Quoted 6 lines
Convert
pr_warningtopr_warn.
Coalesce format strings.
Align arguments.
Add missing \n.Signed-off-by Joe Perches <[email protected]>
Quoted 1 line
---
PATCH 2/4 wbsd: Use current logging
In reply to Joe PerchesAdd pr_fmt.
Remove DRIVER_NAME from logging calls.
Remove DBG, use pr_debug.
--- drivers/mmc/host/wbsd.c | 36 ++++++++++++++++-------------------- 1 files changed, 16 insertions(+), 20 deletions(-)
drivers/mmc/host/wbsd.c +16 -20
@@ -22,6 +22,8 @@* - On APIC systems the FIFO empty interrupt is sometimes lost. */ +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/init.h>
@@ -43,10 +45,8 @@#define DRIVER_NAME "wbsd" -#define DBG(x...) \ - pr_debug(DRIVER_NAME ": " x) -#define DBGF(f, x...) \ - pr_debug(DRIVER_NAME " [%s()]: " f, __func__ , ##x) +#define DBGF (fmt, ...) \ + pr_debug("[%s()]: " fmt, __func__, ##__VA_ARGS__)/* * Device resources
@@ -964,7 +964,7 @@ static void wbsd_reset_ignore(unsigned long data)BUG_ON (host ==NULL ); -DBG ("Resetting card detection ignore\n" ); +pr_debug ("Resetting card detection ignore\n" );spin_lock_bh (&host->lock);
@@ -1018,13 +1018,13 @@ static void wbsd_tasklet_card(unsigned long param)if (csr &WBSD_CARDPRESENT ) {if (!(host->flags &WBSD_FCARD_PRESENT )) { -DBG ("Card inserted\n" ); +pr_debug ("Card inserted\n" ); host->flags |=WBSD_FCARD_PRESENT ; delay =500 ; } }else if (host->flags &WBSD_FCARD_PRESENT ) { -DBG ("Card removed\n" ); +pr_debug ("Card removed\n" ); host->flags &= ~WBSD_FCARD_PRESENT ;if (host->mrq) {
@@ -1325,8 +1325,8 @@ static int __devinit wbsd_scan(struct wbsd_host *host) }if (id !=0xFFFF ) { -DBG ("Unknown hardware (id %x) found at %x\n" , - id, config_ports[i]); +pr_debug ("Unknown hardware (id %x) found at %x\n" , + id, config_ports[i]); } }
@@ -1428,7 +1428,7 @@ free:free_dma (dma); err: -pr_warn (DRIVER_NAME ": Unable to allocate DMA %d. Falling back on FIFO.\n" , +pr_warn ("Unable to allocate DMA %d. Falling back on FIFO.\n" , dma); }
@@ -1663,8 +1663,7 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma, ret =wbsd_scan (host);if (ret) {if (pnp && (ret == -ENODEV )) { -pr_warn (DRIVER_NAME -": Unable to confirm device presence. You may experience lock-ups.\n" ); +pr_warn ("Unable to confirm device presence. You may experience lock-ups.\n" ); }else {wbsd_free_mmc (dev);return ret;
@@ -1686,8 +1685,7 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma,*/ if (pnp) {if ((host->config !=0 ) && !wbsd_chip_validate (host)) { -pr_warn (DRIVER_NAME -": PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n" ); +pr_warn ("PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n" );wbsd_chip_config (host); } }else
@@ -1905,8 +1903,7 @@ static int wbsd_pnp_resume(struct pnp_dev *pnp_dev)*/ if (host->config !=0 ) {if (!wbsd_chip_validate (host)) { -pr_warn (DRIVER_NAME -": PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n" ); +pr_warn ("PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n" );wbsd_chip_config (host); } }
@@ -1967,9 +1964,8 @@ static int __init wbsd_drv_init(void) {int result; -pr_info (DRIVER_NAME -": Winbond W83L51xD SD/MMC card interface driver\n" ); -pr_info (DRIVER_NAME ": Copyright(c) Pierre Ossman\n" ); +pr_info ("Winbond W83L51xD SD/MMC card interface driver\n" ); +pr_info ("Copyright(c) Pierre Ossman\n" );#ifdef CONFIG_PNP
@@ -2017,7 +2013,7 @@ static void __exit wbsd_drv_exit(void)platform_driver_unregister (&wbsd_driver); } -DBG ("unloaded\n" ); +pr_debug ("unloaded\n" ); }module_init (wbsd_drv_init);
Signature · 1 line
1.7.6.405.gc1be0
Re: [PATCH 2/4] wbsd: Use current logging
2011/11/16 Joe Perches <[email protected]>:
Quoted 5 lines
Add
pr_fmt.
RemoveDRIVER_NAMEfrom logging calls.
Remove DBG, usepr_debug.Signed-off-by Joe Perches <[email protected]>
Quoted 1 line
---
PATCH 3/4 mmc: Logging neatening
In reply to Joe PerchesCoalesce formats.
Align arguments.
Add pr_fmt, remove prefixes from format strings.
Neaten DBG uses, rearrange argument order.
--- drivers/mmc/card/mmc_test.c | 49 +++++------- drivers/mmc/core/core.c | 52 ++++++------ drivers/mmc/core/host.c | 3 +- drivers/mmc/core/mmc.c | 22 ++--- drivers/mmc/core/mmc_ops.c | 5 +- drivers/mmc/core/sd.c | 25 +++--- drivers/mmc/core/sdio_bus.c | 2 + drivers/mmc/core/sdio_io.c | 14 ++-- drivers/mmc/core/sdio_irq.c | 10 ++- drivers/mmc/host/at91_mci.c | 3 +- drivers/mmc/host/au1xmmc.c | 35 ++++---- drivers/mmc/host/bfin_sdh.c | 3 +- drivers/mmc/host/dw_mmc.c | 16 ++-- drivers/mmc/host/mmc_spi.c | 9 +- drivers/mmc/host/mmci.c | 3 +- drivers/mmc/host/mvsdio.c | 33 ++++---- drivers/mmc/host/omap_hsmmc.c | 11 +-- drivers/mmc/host/sdhci-pci.c | 17 ++--- drivers/mmc/host/sdhci-pxav3.c | 7 +- drivers/mmc/host/sdhci.c | 175 ++++++++++++++++++--------------------- drivers/mmc/host/sdricoh_cs.c | 12 ++-- drivers/mmc/host/tifm_sd.c | 9 +- drivers/mmc/host/via-sdmmc.c | 22 +++--- drivers/mmc/host/vub300.c | 54 ++++++------- drivers/mmc/host/wbsd.c | 5 +- 25 files changed, 277 insertions(+), 319 deletions(-)
drivers/mmc/card/mmc_test.c +21 -28
@@ -9,6 +9,8 @@* your option) any later version. */ +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/mmc/core.h> #include <linux/mmc/card.h> #include <linux/mmc/host.h>
@@ -251,8 +253,7 @@ static int mmc_test_wait_busy(struct mmc_test_card *test)if (!busy &&mmc_test_busy (&cmd)) { busy =1 ;if (test->card->host->caps &MMC_CAP_WAIT_WHILE_BUSY ) -pr_info ("%s: Warning: Host did not " -"wait for busy state to end.\n" , +pr_info ("%s: Warning: Host did not wait for busy state to end\n" ,mmc_hostname (test->card->host)); } }while (mmc_test_busy (&cmd));
@@ -553,12 +554,11 @@ static void mmc_test_print_rate(struct mmc_test_card *test, uint64_t bytes, rate =mmc_test_rate (bytes, &ts); iops =mmc_test_rate (100 , &ts);/* I/O ops per sec x 100 */ -pr_info ("%s: Transfer of %u sectors (%u%s KiB) took %lu.%09lu " -"seconds (%u kB/s, %u KiB/s, %u.%02u IOPS)\n" , -mmc_hostname (test->card->host), sectors, sectors >>1 , - (sectors &1 ?".5" :"" ), (unsigned long )ts.tv_sec, - (unsigned long )ts.tv_nsec, rate /1000 , rate /1024 , - iops /100 , iops %100 ); +pr_info ("%s: Transfer of %u sectors (%u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS)\n" , +mmc_hostname (test->card->host), sectors, sectors >>1 , + (sectors &1 ?".5" :"" ), (unsigned long )ts.tv_sec, + (unsigned long )ts.tv_nsec, rate /1000 , rate /1024 , + iops /100 , iops %100 );mmc_test_save_transfer_result (test,1 , sectors, ts, rate, iops); }
@@ -579,14 +579,12 @@ static void mmc_test_print_avg_rate(struct mmc_test_card *test, uint64_t bytes, rate =mmc_test_rate (tot, &ts); iops =mmc_test_rate (count *100 , &ts);/* I/O ops per sec x 100 */ -pr_info ("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took " -"%lu.%09lu seconds (%u kB/s, %u KiB/s, " -"%u.%02u IOPS, sg_len %d)\n" , -mmc_hostname (test->card->host), count, sectors, count, - sectors >>1 , (sectors &1 ?".5" :"" ), - (unsigned long )ts.tv_sec, (unsigned long )ts.tv_nsec, - rate /1000 , rate /1024 , iops /100 , iops %100 , - test->area.sg_len); +pr_info ("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS, sg_len %d)\n" , +mmc_hostname (test->card->host), count, sectors, count, + sectors >>1 , (sectors &1 ?".5" :"" ), + (unsigned long )ts.tv_sec, (unsigned long )ts.tv_nsec, + rate /1000 , rate /1024 , iops /100 , iops %100 , + test->area.sg_len);mmc_test_save_transfer_result (test, count, sectors, ts, rate, iops); }
@@ -1410,7 +1408,7 @@ static int mmc_test_multi_read_high(struct mmc_test_card *test)static int mmc_test_no_highmem (struct mmc_test_card *test) {pr_info ("%s: Highmem not configured - test skipped\n" , -mmc_hostname (test->card->host)); +mmc_hostname (test->card->host));return 0 ; }
@@ -1437,7 +1435,7 @@ static int mmc_test_area_map(struct mmc_test_card *test, unsigned long sz, }if (err)pr_info ("%s: Failed to map sg list\n" , -mmc_hostname (test->card->host)); +mmc_hostname (test->card->host));return err; }
@@ -2709,8 +2707,7 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase)if (mmc_test_cases[i].prepare) { ret = mmc_test_cases[i].prepare (test);if (ret) { -pr_info ("%s: Result: Prepare " -"stage failed! (%d)\n" , +pr_info ("%s: Result: Prepare stage failed! (%d)\n" ,mmc_hostname (test->card->host), ret);continue ;
@@ -2747,13 +2744,11 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase) mmc_hostname(test->card->host));break ;case RESULT_UNSUP_HOST : -pr_info ("%s: Result: UNSUPPORTED " -"(by host)\n" , +pr_info ("%s: Result: UNSUPPORTED (by host)\n" ,mmc_hostname (test->card->host));break ;case RESULT_UNSUP_CARD : -pr_info ("%s: Result: UNSUPPORTED " -"(by card)\n" , +pr_info ("%s: Result: UNSUPPORTED (by card)\n" ,mmc_hostname (test->card->host));break ;default :
@@ -2768,8 +2763,7 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase)if (mmc_test_cases[i].cleanup) { ret = mmc_test_cases[i].cleanup (test);if (ret) { -pr_info ("%s: Warning: Cleanup " -"stage failed! (%d)\n" , +pr_info ("%s: Warning: Cleanup stage failed! (%d)\n" ,mmc_hostname (test->card->host), ret); }
@@ -2778,8 +2772,7 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase)mmc_release_host (test->card->host); -pr_info ("%s: Tests completed.\n" , -mmc_hostname (test->card->host)); +pr_info ("%s: Tests completed\n" ,mmc_hostname (test->card->host)); }static void mmc_test_free_result (struct mmc_card *card)
drivers/mmc/core/core.c +26 -26
113 lines not on this page · raw message
drivers/mmc/core/host.c +1 -2
@@ -94,8 +94,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host)unsigned long flags;if (!freq) { -pr_debug ("%s: frequency set to 0 in disable function, " -"this means the clock is already disabled.\n" , +pr_debug ("%s: frequency set to 0 in disable function, this means the clock is already disabled\n" ,mmc_hostname (host));return ; }
drivers/mmc/core/mmc.c +9 -13
@@ -196,8 +196,8 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)*/ ext_csd =kmalloc (512 ,GFP_KERNEL );if (!ext_csd) { -pr_err ("%s: could not allocate a buffer to " -"receive the ext_csd.\n" ,mmc_hostname (card->host)); +pr_err ("%s: could not allocate a buffer to receive the ext_csd\n" , +mmc_hostname (card->host));return -ENOMEM ; }
@@ -218,10 +218,8 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)* stored in their CSD. */ if (card->csd.capacity == (4096 *512 )) { -pr_err ("%s: unable to read EXT_CSD " -"on a possible high capacity card. " -"Card will be ignored.\n" , -mmc_hostname (card->host)); +pr_err ("%s: unable to read EXT_CSD on a possible high capacity card. Card will be ignored.\n" , +mmc_hostname (card->host)); }else {pr_warn ("%s: unable to read EXT_CSD, performance might suffer\n" ,mmc_hostname (card->host));
@@ -251,9 +249,9 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE ];if (card->csd.structure ==3 ) {if (card->ext_csd.raw_ext_csd_structure >2 ) { -pr_err ("%s: unrecognised EXT_CSD structure " -"version %d\n" ,mmc_hostname (card->host), - card->ext_csd.raw_ext_csd_structure); +pr_err ("%s: unrecognised EXT_CSD structure version %d\n" , +mmc_hostname (card->host), + card->ext_csd.raw_ext_csd_structure); err = -EINVAL ; goto out; }
@@ -984,8 +982,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, err =mmc_select_powerclass (card, ext_csd_bits[idx][0 ], ext_csd);if (err) -pr_err ("%s: power class selection to " -"bus width %d failed\n" , +pr_err ("%s: power class selection to bus width %d failed\n" ,mmc_hostname (card->host),1 << bus_width);
@@ -1015,8 +1012,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, err =mmc_select_powerclass (card, ext_csd_bits[idx][1 ], ext_csd);if (err) -pr_err ("%s: power class selection to " -"bus width %d ddr %d failed\n" , +pr_err ("%s: power class selection to bus width %d ddr %d failed\n" ,mmc_hostname (card->host),1 << bus_width, ddr);
drivers/mmc/core/mmc_ops.c +2 -3
@@ -569,9 +569,8 @@ int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status) err =mmc_wait_for_cmd (card->host, &cmd,0 );if (err) { -pr_warn ("%s: error %d interrupting operation. " -"HPI command response %#x\n" ,mmc_hostname (card->host), - err, cmd.resp[0 ]); +pr_warn ("%s: error %d interrupting operation. HPI command response %#x\n" , +mmc_hostname (card->host), err, cmd.resp[0 ]);return err; }if (status)
drivers/mmc/core/sd.c +13 -12
@@ -10,6 +10,8 @@* published by the Free Software Foundation. */ +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/err.h> #include <linux/slab.h> #include <linux/stat.h>
@@ -283,9 +285,8 @@ static int mmc_read_switch(struct mmc_card *card) status =kmalloc (64 ,GFP_KERNEL );if (!status) { -pr_err ("%s: could not allocate a buffer for " -"switch capabilities.\n" , -mmc_hostname (card->host)); +pr_err ("%s: could not allocate a buffer for switch capabilities\n" , +mmc_hostname (card->host));return -ENOMEM ; }
@@ -299,7 +300,7 @@ static int mmc_read_switch(struct mmc_card *card)if (err != -EINVAL && err != -ENOSYS && err != -EFAULT ) goto out; -pr_warn ("%s: problem reading Bus Speed modes.\n" , +pr_warn ("%s: problem reading Bus Speed modes\n" ,mmc_hostname (card->host)); err =0 ;
@@ -381,8 +382,8 @@ int mmc_sd_switch_hs(struct mmc_card *card) status =kmalloc (64 ,GFP_KERNEL );if (!status) { -pr_err ("%s: could not allocate a buffer for " -"switch capabilities.\n" ,mmc_hostname (card->host)); +pr_err ("%s: could not allocate a buffer for switch capabilities\n" , +mmc_hostname (card->host));return -ENOMEM ; }
@@ -391,7 +392,7 @@ int mmc_sd_switch_hs(struct mmc_card *card) goto out;if ((status[16 ] &0xF ) !=1 ) { -pr_warn ("%s: Problem switching card into high-speed mode!\n" , +pr_warn ("%s: problem switching card into high-speed mode!\n" ,mmc_hostname (card->host)); err =0 ; }else {
@@ -456,7 +457,7 @@ static int sd_select_driver_type(struct mmc_card *card, u8 *status)return err;if ((status[15 ] &0xF ) != drive_strength) { -pr_warn ("%s: Problem setting drive strength!\n" , +pr_warn ("%s: problem setting drive strength!\n" ,mmc_hostname (card->host));return 0 ; }
@@ -535,7 +536,7 @@ static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status)return err;if ((status[16 ] &0xF ) != card->sd_bus_speed) -pr_warn ("%s: Problem setting bus speed mode!\n" , +pr_warn ("%s: problem setting bus speed mode!\n" ,mmc_hostname (card->host));else {mmc_set_timing (card->host, timing);
@@ -597,7 +598,7 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)return err;if (((status[15 ] >>4 ) &0x0F ) != current_limit) -pr_warn ("%s: Problem setting current limit!\n" , +pr_warn ("%s: problem setting current limit!\n" ,mmc_hostname (card->host));return 0 ;
@@ -619,8 +620,8 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) status =kmalloc (64 ,GFP_KERNEL );if (!status) { -pr_err ("%s: could not allocate a buffer for " -"switch capabilities.\n" ,mmc_hostname (card->host)); +pr_err ("%s: could not allocate a buffer for switch capabilities\n" , +mmc_hostname (card->host));return -ENOMEM ; }
drivers/mmc/core/sdio_bus.c +2 -0
@@ -11,6 +11,8 @@* SDIO function driver model */ +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/device.h> #include <linux/err.h> #include <linux/export.h>
drivers/mmc/core/sdio_io.c +8 -6
@@ -9,6 +9,8 @@* your option) any later version. */ +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/export.h> #include <linux/mmc/host.h> #include <linux/mmc/card.h>
@@ -65,7 +67,7 @@ int sdio_enable_func(struct sdio_func *func)BUG_ON (!func);BUG_ON (!func->card); -pr_debug ("SDIO: Enabling device %s...\n" ,sdio_func_id (func)); +pr_debug ("Enabling device %s...\n" ,sdio_func_id (func)); ret =mmc_io_rw_direct (func->card,0 ,0 , SDIO_CCCR_IOEx,0 , ®);if (ret)
@@ -90,12 +92,12 @@ int sdio_enable_func(struct sdio_func *func) goto err; } -pr_debug ("SDIO: Enabled device %s\n" ,sdio_func_id (func)); +pr_debug ("Enabled device %s\n" ,sdio_func_id (func));return 0 ; err: -pr_debug ("SDIO: Failed to enable device %s\n" ,sdio_func_id (func)); +pr_debug ("Failed to enable device %s\n" ,sdio_func_id (func));return ret; }EXPORT_SYMBOL_GPL (sdio_enable_func);
@@ -115,7 +117,7 @@ int sdio_disable_func(struct sdio_func *func)BUG_ON (!func);BUG_ON (!func->card); -pr_debug ("SDIO: Disabling device %s...\n" ,sdio_func_id (func)); +pr_debug ("Disabling device %s...\n" ,sdio_func_id (func)); ret =mmc_io_rw_direct (func->card,0 ,0 , SDIO_CCCR_IOEx,0 , ®);if (ret)
@@ -127,12 +129,12 @@ int sdio_disable_func(struct sdio_func *func)if (ret) goto err; -pr_debug ("SDIO: Disabled device %s\n" ,sdio_func_id (func)); +pr_debug ("Disabled device %s\n" ,sdio_func_id (func));return 0 ; err: -pr_debug ("SDIO: Failed to disable device %s\n" ,sdio_func_id (func)); +pr_debug ("Failed to disable device %s\n" ,sdio_func_id (func));return -EIO ; }EXPORT_SYMBOL_GPL (sdio_disable_func);
drivers/mmc/core/sdio_irq.c +6 -4
@@ -13,6 +13,8 @@* your option) any later version. */ +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/kernel.h> #include <linux/sched.h> #include <linux/kthread.h>
@@ -47,7 +49,7 @@ static int process_sdio_pending_irqs(struct mmc_card *card) ret =mmc_io_rw_direct (card,0 ,0 , SDIO_CCCR_INTx,0 , &pending);if (ret) {pr_debug ("%s: error %d reading SDIO_CCCR_INTx\n" , -mmc_card_id (card), ret); +mmc_card_id (card), ret);return ret; }
@@ -233,10 +235,10 @@ int sdio_claim_irq(struct sdio_func *func, sdio_irq_handler_t *handler)BUG_ON (!func);BUG_ON (!func->card); -pr_debug ("SDIO: Enabling IRQ for %s...\n" ,sdio_func_id (func)); +pr_debug ("Enabling IRQ for %s...\n" ,sdio_func_id (func));if (func->irq_handler) { -pr_debug ("SDIO: IRQ for %s already in use.\n" ,sdio_func_id (func)); +pr_debug ("IRQ for %s already in use\n" ,sdio_func_id (func));return -EBUSY ; }
@@ -276,7 +278,7 @@ int sdio_release_irq(struct sdio_func *func)BUG_ON (!func);BUG_ON (!func->card); -pr_debug ("SDIO: Disabling IRQ for %s...\n" ,sdio_func_id (func)); +pr_debug ("Disabling IRQ for %s...\n" ,sdio_func_id (func));if (func->irq_handler) { func->irq_handler =NULL ;
drivers/mmc/host/at91_mci.c +1 -2
@@ -968,8 +968,7 @@ static int __init at91_mci_probe(struct platform_device *pdev)if (at91mci_is_mci1rev2xx ()) mmc->caps |=MMC_CAP_4_BIT_DATA ;else -dev_warn (&pdev->dev,"4 wire bus mode not supported" -" - using 1 wire\n" ); +dev_warn (&pdev->dev,"4 wire bus mode not supported - using 1 wire\n" ); } host->buffer = dma_alloc_coherent(&pdev->dev, MCI_BUFSIZE,
drivers/mmc/host/au1xmmc.c +18 -17
@@ -32,6 +32,8 @@* (the low to high transition will not occur). */ +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/module.h> #include <linux/init.h> #include <linux/platform_device.h>
@@ -54,10 +56,11 @@/* #define DEBUG */ #ifdef DEBUG -#define DBG(fmt, idx, args...) \ - pr_debug("au1xmmc(%d): DEBUG: " fmt, idx, ##args) +#define DBG (idx, fmt, ...) \ + pr_debug("(%d): DEBUG: " fmt, idx, ##__VA_ARGS__)#else -#define DBG(fmt, idx, args...) do {} while (0) +#define DBG (idx, fmt, ...) \ + no_printk(fmt, ##__VA_ARGS__)#endif /* Hardware definitions */
@@ -277,8 +280,7 @@ static int au1xmmc_send_command(struct au1xmmc_host *host, int wait, mmccmd |=SD_CMD_RT_3 ;break ;default : -pr_info ("au1xmmc: unhandled response type %02x\n" , -mmc_resp_type (cmd)); +pr_info ("unhandled response type %02x\n" ,mmc_resp_type (cmd));return -EINVAL ; }
@@ -478,19 +480,19 @@ static void au1xmmc_receive_pio(struct au1xmmc_host *host)break ;if (status &SD_STATUS_RC ) { -DBG ("RX CRC Error [%d + %d].\n" , host->pdev->id, - host->pio.len, count); +DBG (host->pdev->id,"RX CRC Error [%d + %d]\n" , + host->pio.len, count);break ; }if (status &SD_STATUS_RO ) { -DBG ("RX Overrun [%d + %d]\n" , host->pdev->id, - host->pio.len, count); +DBG (host->pdev->id,"RX Overrun [%d + %d]\n" , + host->pio.len, count);break ; }else if (status &SD_STATUS_RU ) { -DBG ("RX Underrun [%d + %d]\n" , host->pdev->id, - host->pio.len, count); +DBG (host->pdev->id,"RX Underrun [%d + %d]\n" , + host->pio.len, count);break ; }
@@ -835,8 +837,7 @@ static irqreturn_t au1xmmc_irq(int irq, void *dev_id)au1xmmc_receive_pio (host); }else if (status &0x203F3C70 ) { -DBG ("Unhandled status %8.8x\n" , host->pdev->id, - status); +DBG (host->pdev->id,"Unhandled status %8.8x\n" , status); }au_writel (status,HOST_STATUS (host));
@@ -1050,7 +1051,7 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev)if (has_dbdma ()) { ret =au1xmmc_dbdma_init (host);if (ret) -pr_info (DRIVER_NAME ": DBDMA init failed; using PIO\n" ); +pr_info ("DBDMA init failed; using PIO\n" ); }#ifdef CONFIG_LEDS_CLASS
@@ -1075,8 +1076,8 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev)platform_set_drvdata (pdev, host); -pr_info (DRIVER_NAME ": MMC Controller %d set up at %8.8X" -" (mode=%s)\n" , pdev->id, host->iobase, +pr_info ("MMC Controller %d set up at %8.8X (mode=%s)\n" , + pdev->id, host->iobase, host->flags &HOST_F_DMA ?"dma" :"pio" );return 0 ;/* all ok */
@@ -1206,7 +1207,7 @@ static int __init au1xmmc_init(void)*/ memid =au1xxx_ddma_add_device (&au1xmmc_mem_dbdev);if (!memid) -pr_err ("au1xmmc: cannot add memory dbdma\n" ); +pr_err ("cannot add memory dbdma\n" ); }return platform_driver_register (&au1xmmc_driver); }
drivers/mmc/host/bfin_sdh.c +1 -2
@@ -162,8 +162,7 @@ static int sdh_setup_data(struct sdh_host *host, struct mmc_data *data) host->sg_cpu[i].cfg = dma_cfg; host->sg_cpu[i].x_count =sg_dma_len (sg) /4 ; host->sg_cpu[i].x_modify =4 ; -dev_dbg (mmc_dev (host->mmc),"%d: start_addr:0x%lx, " -"cfg:0x%x, x_count:0x%x, x_modify:0x%x\n" , +dev_dbg (mmc_dev (host->mmc),"%d: start_addr:0x%lx, cfg:0x%x, x_count:0x%x, x_modify:0x%x\n" , i, host->sg_cpu[i].start_addr, host->sg_cpu[i].cfg, host->sg_cpu[i].x_count, host->sg_cpu[i].x_modify);
drivers/mmc/host/dw_mmc.c +7 -9
@@ -554,8 +554,8 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot) div = (host->bus_hz / slot->clock) >>1 ;dev_info (&slot->mmc->class_dev, -"Bus speed (slot %d) = %dHz (slot req %dHz, actual %dHZ" -" div = %d)\n" , slot->id, host->bus_hz, slot->clock, +"Bus speed (slot %d) = %dHz (slot req %dHz, actual %dHZ div = %d)\n" , + slot->id, host->bus_hz, slot->clock, div ? ((host->bus_hz / div) >>1 ) : host->bus_hz, div);/* disable clock */
@@ -942,8 +942,7 @@ static void dw_mci_tasklet_func(unsigned long priv) data->error = -ETIMEDOUT ; }else {dev_err (&host->pdev->dev, -"data FIFO error " -"(status=%08x)\n" , +"data FIFO error (status=%08x)\n" , status); data->error = -EIO ; }
@@ -1776,8 +1775,8 @@ static void dw_mci_init_dma(struct dw_mci *host)if (host->dma_ops->init) {if (host->dma_ops->init (host)) { -dev_err (&host->pdev->dev,"%s: Unable to initialize " -"DMA Controller.\n" , __func__); +dev_err (&host->pdev->dev,"%s: Unable to initialize DMA Controller\n" , + __func__); goto no_dma; } }else {
@@ -1985,9 +1984,8 @@ static int dw_mci_probe(struct platform_device *pdev) DW_MCI_ERROR_FLAGS | SDMMC_INT_CD);mci_writel (host,CTRL ,SDMMC_CTRL_INT_ENABLE );/* Enable mci interrupt */ -dev_info (&pdev->dev,"DW MMC controller at irq %d, " -"%d bit host data width, " -"%u deep fifo\n" , +dev_info (&pdev->dev, +"DW MMC controller at irq %d, %d bit host data width, %u deep fifo\n" , irq, width, fifo_size);if (host->quirks &DW_MCI_QUIRK_IDMAC_DTO )dev_info (&pdev->dev,"Internal DMAC interrupt fix enabled.\n" );
drivers/mmc/host/mmc_spi.c +4 -5
@@ -860,9 +860,9 @@ mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t,be16_to_cpus (&scratch->crc_val);if (scratch->crc_val != crc) { -dev_dbg (&spi->dev,"read - crc error: crc_val=0x%04x, " -"computed=0x%04x len=%d\n" , - scratch->crc_val, crc, t->len); +dev_dbg (&spi->dev, +"read - crc error: crc_val=0x%04x, computed=0x%04x len=%d\n" , + scratch->crc_val, crc, t->len);return -EILSEQ ; } }
@@ -1253,8 +1253,7 @@ static void mmc_spi_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) mres =spi_setup (host->spi);if (mres <0 )dev_dbg (&host->spi->dev, -"switch back to SPI mode 3" -" failed\n" ); +"switch back to SPI mode 3 failed\n" ); } }
drivers/mmc/host/mmci.c +1 -2
@@ -1229,8 +1229,7 @@ static int __devinit mmci_probe(struct amba_device *dev, host->mmc->ocr_avail = (u32 ) mask;if (plat->ocr_mask)dev_warn (&dev->dev, -"Provided ocr_mask/setpower will not be used " - "(using regulator instead)\n"); +"Provided ocr_mask/setpower will not be used (using regulator instead)\n"); } }#endif
drivers/mmc/host/mvsdio.c +16 -17
@@ -84,9 +84,9 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data) hw_state =mvsd_read (MVSD_HW_STATE ); count++; }while (!(hw_state & (1 <<13 ))); -dev_dbg (host->dev,"*** wait for FIFO_EMPTY bit " -"(hw=0x%04x, count=%d, jiffies=%ld)\n" , - hw_state, count, jiffies - (t -HZ )); +dev_dbg (host->dev, +"*** wait for FIFO_EMPTY bit (hw=0x%04x, count=%d, jiffies=%ld)\n" , + hw_state, count, jiffies - (t -HZ )); }/* If timeout=0 then maximum timeout index is used. */
@@ -117,10 +117,9 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data) host->pio_size = data->blocks * data->blksz; host->pio_ptr =sg_virt (data->sg);if (!nodma) -pr_debug ("%s: fallback to PIO for data " -"at 0x%p size %d\n" , -mmc_hostname (host->mmc), - host->pio_ptr, host->pio_size); +pr_debug ("%s: fallback to PIO for data at 0x%p size %d\n" , +mmc_hostname (host->mmc), + host->pio_ptr, host->pio_size);return 1 ; }else {dma_addr_t phys_addr;
@@ -489,9 +488,9 @@ static irqreturn_t mvsd_irq(int irq, void *dev)if (irq_handled)return IRQ_HANDLED ; -pr_err ("%s: unhandled interrupt status=0x%04x en=0x%04x " -"pio=%d\n" ,mmc_hostname (host->mmc), intr_status, - host->intr_en, host->pio_size); +pr_err ("%s: unhandled interrupt status=0x%04x en=0x%04x pio=%d\n" , +mmc_hostname (host->mmc), intr_status, + host->intr_en, host->pio_size);return IRQ_NONE ; }
@@ -505,13 +504,13 @@ static void mvsd_timeout_timer(unsigned long data)spin_lock_irqsave (&host->lock, flags); mrq = host->mrq;if (mrq) { -pr_err ("%s: Timeout waiting for hardware interrupt.\n" , -mmc_hostname (host->mmc)); -pr_err ("%s: hw_state=0x%04x, intr_status=0x%04x " -"intr_en=0x%04x\n" ,mmc_hostname (host->mmc), -mvsd_read (MVSD_HW_STATE ), -mvsd_read (MVSD_NOR_INTR_STATUS ), -mvsd_read (MVSD_NOR_INTR_EN )); +pr_err ("%s: Timeout waiting for hardware interrupt\n" , +mmc_hostname (host->mmc)); +pr_err ("%s: hw_state=0x%04x, intr_status=0x%04x intr_en=0x%04x\n" , +mmc_hostname (host->mmc), +mvsd_read (MVSD_HW_STATE ), +mvsd_read (MVSD_NOR_INTR_STATUS ), +mvsd_read (MVSD_NOR_INTR_EN )); host->mrq =NULL ;
drivers/mmc/host/omap_hsmmc.c +4 -7
@@ -1264,9 +1264,8 @@ static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host) host->reqs_blocked =0 ;if (mmc_slot (host).get_cover_state (host->dev, host->slot_id)) {if (host->protect_card) { -pr_info ("%s: cover is closed, " -"card is now accessible\n" , -mmc_hostname (host->mmc)); +pr_info ("%s: cover is closed, card is now accessible\n" , +mmc_hostname (host->mmc)); host->protect_card =0 ; } }else {
@@ -1967,8 +1966,7 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)if (host->got_dbclk)if (clk_enable (host->dbclk) !=0 ) -dev_dbg (mmc_dev (host->mmc),"Enabling debounce" -" clk failed\n" ); +dev_dbg (mmc_dev (host->mmc),"Enabling debounce clk failed\n" ); }/* Since we do only SG emulation, we can have as many segs
@@ -2169,8 +2167,7 @@ static int omap_hsmmc_suspend(struct device *dev) host->slot_id);if (ret) {dev_dbg (mmc_dev (host->mmc), -"Unable to handle MMC board" -" level suspend\n" ); +"Unable to handle MMC board level suspend\n" ); host->suspended =0 ;return ret; }
drivers/mmc/host/sdhci-pci.c +7 -10
@@ -460,8 +460,7 @@ static int jmicron_probe(struct sdhci_pci_chip *chip)if (sd_dev) {pci_dev_put (sd_dev); -dev_info (&chip->pdev->dev,"Refusing to bind to " -"secondary interface.\n" ); +dev_info (&chip->pdev->dev,"Refusing to bind to secondary interface\n" );return -ENODEV ; } }
@@ -628,10 +627,10 @@ static int syskt_probe_slot(struct sdhci_pci_slot *slot)u8 board_rev =readb (slot->host->ioaddr +SYSKT_BOARD_REV );u8 chip_rev =readb (slot->host->ioaddr +SYSKT_CHIP_REV ); -dev_info (&slot->chip->pdev->dev,"SysKonnect CardBus2SDIO, " -"board rev %d.%d, chip rev %d.%d\n" , - board_rev >>4 , board_rev &0xf , - chip_rev >>4 , chip_rev &0xf ); +dev_info (&slot->chip->pdev->dev, +"SysKonnect CardBus2SDIO, board rev %d.%d, chip rev %d.%d\n" , + board_rev >>4 , board_rev &0xf , + chip_rev >>4 , chip_rev &0xf );if (chip_rev >=0x20 ) slot->host->quirks |=SDHCI_QUIRK_FORCE_DMA ;
@@ -925,8 +924,7 @@ static int sdhci_pci_enable_dma(struct sdhci_host *host)if (((pdev->class &0xFFFF00 ) == (PCI_CLASS_SYSTEM_SDHCI <<8 )) && ((pdev->class &0x0000FF ) !=PCI_SDHCI_IFDMA ) && (host->flags &SDHCI_USE_SDMA )) { -dev_warn (&pdev->dev,"Will use DMA mode even though HW " -"doesn't fully claim to support it.\n" ); +dev_warn (&pdev->dev,"Will use DMA mode even though HW doesn't fully claim to support it\n" ); } ret =pci_set_dma_mask (pdev,DMA_BIT_MASK (32 ));
@@ -1202,8 +1200,7 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot( }if (pci_resource_len (pdev, bar) !=0x100 ) { -dev_err (&pdev->dev,"Invalid iomem size. You may " -"experience problems.\n" ); +dev_err (&pdev->dev,"Invalid iomem size. You may experience problems.\n" ); }if ((pdev->class &0x0000FF ) ==PCI_SDHCI_IFVENDOR ) {
drivers/mmc/host/sdhci-pxav3.c +2 -5
@@ -82,11 +82,8 @@ static void pxav3_gen_init_74_clocks(struct sdhci_host *host, u8 power_mode) && power_mode == MMC_POWER_ON) {dev_dbg (mmc_dev (host->mmc), -"%s: slot->power_mode = %d," -"ios->power_mode = %d\n" , - __func__, - pxa->power_mode, - power_mode); +"%s: slot->power_mode = %d, ios->power_mode = %d\n" , + __func__, pxa->power_mode, power_mode);/* set we want notice of when 74 clocks are sent */ tmp =readw (host->ioaddr +SD_CE_ATA_2 );
drivers/mmc/host/sdhci.c +81 -94
322 lines not on this page · raw message
drivers/mmc/host/sdricoh_cs.c +6 -6
@@ -310,8 +310,8 @@ static void sdricoh_request(struct mmc_host *mmc, struct mmc_request *mrq)/* transfer data */ if (data && cmd->error ==0 ) { -dev_dbg (dev,"transfer: blksz %i blocks %i sg_len %i " -"sg length %i\n" , data->blksz, data->blocks, +dev_dbg (dev,"transfer: blksz %i blocks %i sg_len %i sg length %i\n" , + data->blksz, data->blocks, data->sg_len, data->sg->length);/* enter data reading mode */
@@ -330,8 +330,8 @@ static void sdricoh_request(struct mmc_host *mmc, struct mmc_request *mrq)kunmap (page);flush_dcache_page (page);if (result) { -dev_err (dev,"sdricoh_request: cmd %i " -"block transfer failed\n" , cmd->opcode); +dev_err (dev,"sdricoh_request: cmd %i block transfer failed\n" , + cmd->opcode); cmd->error = result;break ; }else
@@ -476,8 +476,8 @@ static int sdricoh_pcmcia_probe(struct pcmcia_device *pcmcia_dev) {struct pci_dev *pci_dev =NULL ; -dev_info (&pcmcia_dev->dev,"Searching MMC controller for pcmcia device" -" %s %s ...\n" , pcmcia_dev->prod_id[0 ], pcmcia_dev->prod_id[1 ]); +dev_info (&pcmcia_dev->dev,"Searching MMC controller for pcmcia device %s %s ...\n" , + pcmcia_dev->prod_id[0 ], pcmcia_dev->prod_id[1 ]);/* search pci cardbus bridge that contains the mmc controller */ /* the io region is already claimed by yenta_socket... */
drivers/mmc/host/tifm_sd.c +4 -5
@@ -787,9 +787,9 @@ static void tifm_sd_abort(unsigned long data) {struct tifm_sd *host = (struct tifm_sd *)data; -pr_err ("%s : card failed to respond for a long period of time " -"(%x, %x)\n" , -dev_name (&host->dev->dev), host->req->cmd->opcode, host->cmd_flags); +pr_err ("%s : card failed to respond for a long period of time (%x, %x)\n" , +dev_name (&host->dev->dev), + host->req->cmd->opcode, host->cmd_flags);tifm_eject (host->dev); }
@@ -803,8 +803,7 @@ static void tifm_sd_ios(struct mmc_host *mmc, struct mmc_ios *ios)spin_lock_irqsave (&sock->lock, flags); -dev_dbg (&sock->dev,"ios: clock = %u, vdd = %x, bus_mode = %x, " -"chip_select = %x, power_mode = %x, bus_width = %x\n" , +dev_dbg (&sock->dev,"ios: clock = %u, vdd = %x, bus_mode = %x, chip_select = %x, power_mode = %x, bus_width = %x\n" , ios->clock, ios->vdd, ios->bus_mode, ios->chip_select, ios->power_mode, ios->bus_width);
drivers/mmc/host/via-sdmmc.c +10 -12
@@ -8,6 +8,8 @@* your option) any later version. */ +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/pci.h> #include <linux/module.h> #include <linux/dma-mapping.h>
@@ -838,8 +840,7 @@ static void via_sdc_cmd_isr(struct via_crdr_mmc_host *host, u16 intmask)BUG_ON (intmask ==0 );if (!host->cmd) { -pr_err ("%s: Got command interrupt 0x%x even " -"though no command operation was in progress.\n" , +pr_err ("%s: Got command interrupt 0x%x even though no command operation was in progress\n" ,mmc_hostname (host->mmc), intmask);return ; }
@@ -941,8 +942,8 @@ static void via_sdc_timeout(unsigned long ulongdata)spin_lock_irqsave (&sdhost->lock, flags);if (sdhost->mrq) { -pr_err ("%s: Timeout waiting for hardware interrupt." -"cmd:0x%x\n" ,mmc_hostname (sdhost->mmc), +pr_err ("%s: Timeout waiting for hardware interrupt.cmd:0x%x\n" , +mmc_hostname (sdhost->mmc), sdhost->mrq->cmd->opcode);if (sdhost->data) {
@@ -1091,8 +1092,7 @@ static int __devinit via_sd_probe(struct pci_dev *pcidev,u8 gatt;int ret; -pr_info (DRV_NAME -": VIA SDMMC controller found at %s [%04x:%04x] (rev %x)\n" , +pr_info ("VIA SDMMC controller found at %s [%04x:%04x] (rev %x)\n" ,pci_name (pcidev), (int )pcidev->vendor, (int )pcidev->device, (int )pcidev->revision);
@@ -1192,8 +1192,8 @@ static void __devexit via_sd_remove(struct pci_dev *pcidev)mmiowb ();if (sdhost->mrq) { -pr_err ("%s: Controller removed during " -"transfer\n" ,mmc_hostname (sdhost->mmc)); +pr_err ("%s: Controller removed during transfer\n" , +mmc_hostname (sdhost->mmc));/* make sure all DMA is stopped */ writel(VIA_CRDR_DMACTRL_SFTRST,
@@ -1225,8 +1225,7 @@ static void __devexit via_sd_remove(struct pci_dev *pcidev)pci_release_regions (pcidev);pci_disable_device (pcidev); -pr_info (DRV_NAME -": VIA SDMMC controller at %s [%04x:%04x] has been removed\n" , +pr_info ("VIA SDMMC controller at %s [%04x:%04x] has been removed\n" ,pci_name (pcidev), (int )pcidev->vendor, (int )pcidev->device); }
@@ -1339,8 +1338,7 @@ static struct pci_driver via_sd_driver = {static int __init via_sd_drv_init (void ) { -pr_info (DRV_NAME ": VIA SD/MMC Card Reader driver " -"(C) 2008 VIA Technologies, Inc.\n" ); +pr_info ("VIA SD/MMC Card Reader driver (C) 2008 VIA Technologies, Inc.\n" );return pci_register_driver (&via_sd_driver); }
drivers/mmc/host/vub300.c +25 -29
138 lines not on this page · raw message
drivers/mmc/host/wbsd.c +2 -3
@@ -721,9 +721,8 @@ static void wbsd_finish_data(struct wbsd_host *host, struct mmc_data *data)* Any leftover data? */ if (count) { -pr_err ("%s: Incomplete DMA transfer. " -"%d bytes left.\n" , -mmc_hostname (host->mmc), count); +pr_err ("%s: Incomplete DMA transfer. %d bytes left.\n" , +mmc_hostname (host->mmc), count);if (!data->error) data->error = -EIO ;
Signature · 1 line
1.7.6.405.gc1be0
Re: [PATCH 3/4] mmc: Logging neatening
MjAxMS8xMS8xNiBKb2UgUGVyY2hlcyA8am9lQHBlcmNoZXMuY29tPjoKPiBDb2FsZXNjZSBmb3Jt YXRzLgo+IEFsaWduIGFyZ3VtZW50cy4KPiBBZGQgcHJfZm10LCByZW1vdmUgcHJlZml4ZXMgZnJv bSBmb3JtYXQgc3RyaW5ncy4KPiBOZWF0ZW4gREJHIHVzZXMsIHJlYXJyYW5nZSBhcmd1bWVudCBv cmRlci4KPgo+IFNpZ25lZC1vZmYtYnk6IEpvZSBQZXJjaGVzIDxqb2VAcGVyY2hlcy5jb20+Cj4g LS0tCj4gwqBkcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMgwqAgwqB8IMKgIDQ5ICsrKysrLS0t LS0tLQo+IMKgZHJpdmVycy9tbWMvY29yZS9jb3JlLmMgwqAgwqAgwqAgwqB8IMKgIDUyICsrKysr Ky0tLS0tLQo+IMKgZHJpdmVycy9tbWMvY29yZS9ob3N0LmMgwqAgwqAgwqAgwqB8IMKgIMKgMyAr LQo+IMKgZHJpdmVycy9tbWMvY29yZS9tbWMuYyDCoCDCoCDCoCDCoCB8IMKgIDIyICsrLS0tCj4g wqBkcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYyDCoCDCoCB8IMKgIMKgNSArLQo+IMKgZHJpdmVy cy9tbWMvY29yZS9zZC5jIMKgIMKgIMKgIMKgIMKgfCDCoCAyNSArKystLS0KPiDCoGRyaXZlcnMv bW1jL2NvcmUvc2Rpb19idXMuYyDCoCDCoHwgwqAgwqAyICsKPiDCoGRyaXZlcnMvbW1jL2NvcmUv c2Rpb19pby5jIMKgIMKgIHwgwqAgMTQgKystLQo+IMKgZHJpdmVycy9tbWMvY29yZS9zZGlvX2ly cS5jIMKgIMKgfCDCoCAxMCArKy0KPiDCoGRyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYyDCoCDC oHwgwqAgwqAzICstCj4gwqBkcml2ZXJzL21tYy9ob3N0L2F1MXhtbWMuYyDCoCDCoCB8IMKgIDM1 ICsrKystLS0tCj4gwqBkcml2ZXJzL21tYy9ob3N0L2JmaW5fc2RoLmMgwqAgwqB8IMKgIMKgMyAr LQo+IMKgZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYyDCoCDCoCDCoHwgwqAgMTYgKystLQo+IMKg ZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMgwqAgwqAgfCDCoCDCoDkgKy0KPiDCoGRyaXZlcnMv bW1jL2hvc3QvbW1jaS5jIMKgIMKgIMKgIMKgfCDCoCDCoDMgKy0KPiDCoGRyaXZlcnMvbW1jL2hv c3QvbXZzZGlvLmMgwqAgwqAgwqB8IMKgIDMzICsrKystLS0tCj4gwqBkcml2ZXJzL21tYy9ob3N0 L29tYXBfaHNtbWMuYyDCoHwgwqAgMTEgKy0tCj4gwqBkcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBj aS5jIMKgIHwgwqAgMTcgKystLS0KPiDCoGRyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjMuYyB8 IMKgIMKgNyArLQo+IMKgZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jIMKgIMKgIMKgIHwgwqAxNzUg KysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gwqBkcml2ZXJzL21tYy9o b3N0L3Nkcmljb2hfY3MuYyDCoHwgwqAgMTIgKystLQo+IMKgZHJpdmVycy9tbWMvaG9zdC90aWZt X3NkLmMgwqAgwqAgfCDCoCDCoDkgKy0KPiDCoGRyaXZlcnMvbW1jL2hvc3QvdmlhLXNkbW1jLmMg wqAgfCDCoCAyMiArKystLS0KPiDCoGRyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMgwqAgwqAgwqB8 IMKgIDU0ICsrKysrKy0tLS0tLS0KPiDCoGRyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jIMKgIMKgIMKg IMKgfCDCoCDCoDUgKy0KPiDCoDI1IGZpbGVzIGNoYW5nZWQsIDI3NyBpbnNlcnRpb25zKCspLCAz MTkgZGVsZXRpb25zKC0pCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVz dC5jIGIvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVzdC5jCj4gaW5kZXggYjAzOGM0YS4uZjA3OTU1 NSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMKPiArKysgYi9kcml2 ZXJzL21tYy9jYXJkL21tY190ZXN0LmMKPiBAQCAtOSw2ICs5LDggQEAKPiDCoCogeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgo+IMKgKi8KPgo+ICsjZGVmaW5lIHByX2ZtdChmbXQpIEtC VUlMRF9NT0ROQU1FICI6ICIgZm10Cj4gKwo+IMKgI2luY2x1ZGUgPGxpbnV4L21tYy9jb3JlLmg+ Cj4gwqAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KPiDCoCNpbmNsdWRlIDxsaW51eC9tbWMv aG9zdC5oPgo+IEBAIC0yNTEsOCArMjUzLDcgQEAgc3RhdGljIGludCBtbWNfdGVzdF93YWl0X2J1 c3koc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp ZiAoIWJ1c3kgJiYgbW1jX3Rlc3RfYnVzeSgmY21kKSkgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgYnVzeSA9IDE7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBpZiAodGVzdC0+Y2FyZC0+aG9zdC0+Y2FwcyAmIE1NQ19DQVBfV0FJVF9XSElMRV9CVVNZ KQo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfaW5m bygiJXM6IFdhcm5pbmc6IEhvc3QgZGlkIG5vdCAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAid2FpdCBmb3IgYnVzeSBzdGF0ZSB0 byBlbmQuXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgcHJfaW5mbygiJXM6IFdhcm5pbmc6IEhvc3QgZGlkIG5vdCB3YWl0IGZvciBidXN5IHN0YXRl IHRvIGVuZFxuIiwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSk7Cj4gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAgwqAgwqAgwqB9IHdoaWxlIChtbWNfdGVzdF9idXN5KCZj bWQpKTsKPiBAQCAtNTUzLDEyICs1NTQsMTEgQEAgc3RhdGljIHZvaWQgbW1jX3Rlc3RfcHJpbnRf cmF0ZShzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwgdWludDY0X3QgYnl0ZXMsCj4gwqAgwqAg wqAgwqByYXRlID0gbW1jX3Rlc3RfcmF0ZShieXRlcywgJnRzKTsKPiDCoCDCoCDCoCDCoGlvcHMg PSBtbWNfdGVzdF9yYXRlKDEwMCwgJnRzKTsgLyogSS9PIG9wcyBwZXIgc2VjIHggMTAwICovCj4K PiAtIMKgIMKgIMKgIHByX2luZm8oIiVzOiBUcmFuc2ZlciBvZiAldSBzZWN0b3JzICgldSVzIEtp QikgdG9vayAlbHUuJTA5bHUgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAic2Vjb25kcyAoJXUga0IvcywgJXUgS2lCL3MsICV1LiUwMnUgSU9QUylcbiIsCj4gLSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5o b3N0KSwgc2VjdG9ycywgc2VjdG9ycyA+PiAxLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAoc2VjdG9ycyAmIDEgPyAiLjUiIDogIiIpLCAodW5zaWduZWQgbG9uZyl0cy50 dl9zZWMsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCh1bnNpZ25lZCBs b25nKXRzLnR2X25zZWMsIHJhdGUgLyAxMDAwLCByYXRlIC8gMTAyNCwKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaW9wcyAvIDEwMCwgaW9wcyAlIDEwMCk7Cj4gKyDCoCDC oCDCoCBwcl9pbmZvKCIlczogVHJhbnNmZXIgb2YgJXUgc2VjdG9ycyAoJXUlcyBLaUIpIHRvb2sg JWx1LiUwOWx1IHNlY29uZHMgKCV1IGtCL3MsICV1IEtpQi9zLCAldS4lMDJ1IElPUFMpXG4iLAo+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpLCBz ZWN0b3JzLCBzZWN0b3JzID4+IDEsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoc2VjdG9ycyAm IDEgPyAiLjUiIDogIiIpLCAodW5zaWduZWQgbG9uZyl0cy50dl9zZWMsCj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCAodW5zaWduZWQgbG9uZyl0cy50dl9uc2VjLCByYXRlIC8gMTAwMCwgcmF0ZSAv IDEwMjQsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpb3BzIC8gMTAwLCBpb3BzICUgMTAwKTsK Pgo+IMKgIMKgIMKgIMKgbW1jX3Rlc3Rfc2F2ZV90cmFuc2Zlcl9yZXN1bHQodGVzdCwgMSwgc2Vj dG9ycywgdHMsIHJhdGUsIGlvcHMpOwo+IMKgfQo+IEBAIC01NzksMTQgKzU3OSwxMiBAQCBzdGF0 aWMgdm9pZCBtbWNfdGVzdF9wcmludF9hdmdfcmF0ZShzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVz dCwgdWludDY0X3QgYnl0ZXMsCj4gwqAgwqAgwqAgwqByYXRlID0gbW1jX3Rlc3RfcmF0ZSh0b3Qs ICZ0cyk7Cj4gwqAgwqAgwqAgwqBpb3BzID0gbW1jX3Rlc3RfcmF0ZShjb3VudCAqIDEwMCwgJnRz KTsgLyogSS9PIG9wcyBwZXIgc2VjIHggMTAwICovCj4KPiAtIMKgIMKgIMKgIHByX2luZm8oIiVz OiBUcmFuc2ZlciBvZiAldSB4ICV1IHNlY3RvcnMgKCV1IHggJXUlcyBLaUIpIHRvb2sgIgo+IC0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAiJWx1LiUwOWx1IHNlY29uZHMgKCV1 IGtCL3MsICV1IEtpQi9zLCAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCIldS4lMDJ1IElPUFMsIHNnX2xlbiAlZClcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwgY291bnQsIHNlY3Rv cnMsIGNvdW50LAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzZWN0b3Jz ID4+IDEsIChzZWN0b3JzICYgMSA/ICIuNSIgOiAiIiksCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCh1bnNpZ25lZCBsb25nKXRzLnR2X3NlYywgKHVuc2lnbmVkIGxvbmcp dHMudHZfbnNlYywKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmF0ZSAv IDEwMDAsIHJhdGUgLyAxMDI0LCBpb3BzIC8gMTAwLCBpb3BzICUgMTAwLAo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZXN0LT5hcmVhLnNnX2xlbik7Cj4gKyDCoCDCoCDC oCBwcl9pbmZvKCIlczogVHJhbnNmZXIgb2YgJXUgeCAldSBzZWN0b3JzICgldSB4ICV1JXMgS2lC KSB0b29rICVsdS4lMDlsdSBzZWNvbmRzICgldSBrQi9zLCAldSBLaUIvcywgJXUuJTAydSBJT1BT LCBzZ19sZW4gJWQpXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbW1jX2hvc3RuYW1lKHRl c3QtPmNhcmQtPmhvc3QpLCBjb3VudCwgc2VjdG9ycywgY291bnQsCj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCBzZWN0b3JzID4+IDEsIChzZWN0b3JzICYgMSA/ICIuNSIgOiAiIiksCj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCAodW5zaWduZWQgbG9uZyl0cy50dl9zZWMsICh1bnNpZ25lZCBsb25n KXRzLnR2X25zZWMsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCByYXRlIC8gMTAwMCwgcmF0ZSAv IDEwMjQsIGlvcHMgLyAxMDAsIGlvcHMgJSAxMDAsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0 ZXN0LT5hcmVhLnNnX2xlbik7Cj4KPiDCoCDCoCDCoCDCoG1tY190ZXN0X3NhdmVfdHJhbnNmZXJf cmVzdWx0KHRlc3QsIGNvdW50LCBzZWN0b3JzLCB0cywgcmF0ZSwgaW9wcyk7Cj4gwqB9Cj4gQEAg LTE0MTAsNyArMTQwOCw3IEBAIHN0YXRpYyBpbnQgbW1jX3Rlc3RfbXVsdGlfcmVhZF9oaWdoKHN0 cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQo+IMKgc3RhdGljIGludCBtbWNfdGVzdF9ub19oaWdo bWVtKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQo+IMKgewo+IMKgIMKgIMKgIMKgcHJfaW5m bygiJXM6IEhpZ2htZW0gbm90IGNvbmZpZ3VyZWQgLSB0ZXN0IHNraXBwZWRcbiIsCj4gLSDCoCDC oCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSk7Cj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCBtbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCkpOwo+IMKgIMKg IMKgIMKgcmV0dXJuIDA7Cj4gwqB9Cj4KPiBAQCAtMTQzNyw3ICsxNDM1LDcgQEAgc3RhdGljIGlu dCBtbWNfdGVzdF9hcmVhX21hcChzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwgdW5zaWduZWQg bG9uZyBzeiwKPiDCoCDCoCDCoCDCoH0KPiDCoCDCoCDCoCDCoGlmIChlcnIpCj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBwcl9pbmZvKCIlczogRmFpbGVkIHRvIG1hcCBzZyBsaXN0XG4iLAo+IC0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+ aG9zdCkpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbW1jX2hvc3RuYW1l KHRlc3QtPmNhcmQtPmhvc3QpKTsKPiDCoCDCoCDCoCDCoHJldHVybiBlcnI7Cj4gwqB9Cj4KPiBA QCAtMjcwOSw4ICsyNzA3LDcgQEAgc3RhdGljIHZvaWQgbW1jX3Rlc3RfcnVuKHN0cnVjdCBtbWNf dGVzdF9jYXJkICp0ZXN0LCBpbnQgdGVzdGNhc2UpCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp ZiAobW1jX3Rlc3RfY2FzZXNbaV0ucHJlcGFyZSkgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgcmV0ID0gbW1jX3Rlc3RfY2FzZXNbaV0ucHJlcGFyZSh0ZXN0KTsKPiDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChyZXQpIHsKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2luZm8oIiVzOiBSZXN1bHQ6IFBy ZXBhcmUgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgInN0YWdlIGZhaWxlZCEgKCVkKVxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2luZm8oIiVzOiBSZXN1bHQ6IFByZXBhcmUg c3RhZ2UgZmFpbGVkISAoJWQpXG4iLAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3Qp LAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgcmV0KTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGNvbnRpbnVlOwo+IEBAIC0yNzQ3LDEzICsyNzQ0LDExIEBAIHN0YXRpYyB2b2lkIG1tY190 ZXN0X3J1bihzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwgaW50IHRlc3RjYXNlKQo+IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW1jX2hvc3RuYW1lKHRl c3QtPmNhcmQtPmhvc3QpKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJy ZWFrOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSBSRVNVTFRfVU5TVVBfSE9TVDoKPiAt IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2luZm8oIiVzOiBSZXN1bHQ6IFVO U1VQUE9SVEVEICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgICIoYnkgaG9zdClcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBw cl9pbmZvKCIlczogUmVzdWx0OiBVTlNVUFBPUlRFRCAoYnkgaG9zdClcbiIsCj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfaG9zdG5hbWUodGVzdC0+ Y2FyZC0+aG9zdCkpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7 Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIFJFU1VMVF9VTlNVUF9DQVJEOgo+IC0gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfaW5mbygiJXM6IFJlc3VsdDogVU5TVVBQ T1JURUQgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg IihieSBjYXJkKVxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2lu Zm8oIiVzOiBSZXN1bHQ6IFVOU1VQUE9SVEVEIChieSBjYXJkKVxuIiwKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZSh0ZXN0LT5jYXJk LT5ob3N0KSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazsKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRlZmF1bHQ6Cj4gQEAgLTI3NjgsOCArMjc2Myw3IEBAIHN0 YXRpYyB2b2lkIG1tY190ZXN0X3J1bihzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwgaW50IHRl c3RjYXNlKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1tY190ZXN0X2Nhc2VzW2ldLmNs ZWFudXApIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldCA9IG1tY190 ZXN0X2Nhc2VzW2ldLmNsZWFudXAodGVzdCk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBpZiAocmV0KSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBwcl9pbmZvKCIlczogV2FybmluZzogQ2xlYW51cCAiCj4gLSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAic3RhZ2UgZmFp bGVkISAoJWQpXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgcHJfaW5mbygiJXM6IFdhcm5pbmc6IENsZWFudXAgc3RhZ2UgZmFpbGVkISAoJWQpXG4i LAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpLAo+IMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0KTsKPiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0KPiBAQCAtMjc3OCw4ICsyNzcyLDcgQEAgc3Rh dGljIHZvaWQgbW1jX3Rlc3RfcnVuKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0LCBpbnQgdGVz dGNhc2UpCj4KPiDCoCDCoCDCoCDCoG1tY19yZWxlYXNlX2hvc3QodGVzdC0+Y2FyZC0+aG9zdCk7 Cj4KPiAtIMKgIMKgIMKgIHByX2luZm8oIiVzOiBUZXN0cyBjb21wbGV0ZWQuXG4iLAo+IC0gwqAg wqAgwqAgwqAgwqAgwqAgwqAgbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpKTsKPiArIMKg IMKgIMKgIHByX2luZm8oIiVzOiBUZXN0cyBjb21wbGV0ZWRcbiIsIG1tY19ob3N0bmFtZSh0ZXN0 LT5jYXJkLT5ob3N0KSk7Cj4gwqB9Cj4KPiDCoHN0YXRpYyB2b2lkIG1tY190ZXN0X2ZyZWVfcmVz dWx0KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29y ZS9jb3JlLmMgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYwo+IGluZGV4IDU0ZDZhMTMuLjM5ZTEz MTEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKPiArKysgYi9kcml2ZXJz L21tYy9jb3JlL2NvcmUuYwo+IEBAIC0xMCw2ICsxMCw5IEBACj4gwqAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCj4gwqAq IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+IMKgKi8KPiArCj4g KyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKPiArCj4gwqAjaW5j bHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gwqAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+IMKgI2lu Y2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+IEBAIC0xNTMsMjIgKzE1NiwyMiBAQCB2b2lkIG1t Y19yZXF1ZXN0X2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3Qg Km1ycSkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGxlZF90cmlnZ2VyX2V2ZW50KGhvc3QtPmxl ZCwgTEVEX09GRik7Cj4KPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHByX2RlYnVnKCIlczogcmVx IGRvbmUgKENNRCV1KTogJWQ6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCj4gLSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtbWNfaG9zdG5hbWUoaG9zdCksIGNtZC0+b3Bjb2RlLCBl cnIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjbWQtPnJlc3BbMF0sIGNt ZC0+cmVzcFsxXSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNtZC0+cmVz cFsyXSwgY21kLT5yZXNwWzNdKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgbW1jX2hvc3RuYW1lKGhvc3QpLCBjbWQtPm9wY29kZSwgZXJyLAo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjbWQtPnJlc3BbMF0sIGNtZC0+cmVzcFsxXSwKPiArIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY21kLT5yZXNwWzJdLCBjbWQtPnJlc3Bb M10pOwo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobXJxLT5kYXRhKSB7Cj4gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwcl9kZWJ1ZygiJXM6IMKgIMKgICVkIGJ5dGVz IHRyYW5zZmVycmVkOiAlZFxuIiwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIG1tY19ob3N0bmFtZShob3N0KSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1ycS0+ZGF0YS0+Ynl0ZXNfeGZlcmVkLCBtcnEtPmRh dGEtPmVycm9yKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgbW1jX2hvc3RuYW1lKGhvc3QpLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBtcnEtPmRhdGEtPmJ5dGVzX3hmZXJlZCwgbXJxLT5kYXRhLT5l cnJvcik7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4KPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmIChtcnEtPnN0b3ApIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oHByX2RlYnVnKCIlczogwqAgwqAgKENNRCV1KTogJWQ6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIs Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtbWNfaG9z dG5hbWUoaG9zdCksIG1ycS0+c3RvcC0+b3Bjb2RlLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbXJxLT5zdG9wLT5lcnJvciwKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1ycS0+c3RvcC0+cmVzcFswXSwgbXJx LT5zdG9wLT5yZXNwWzFdLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgbXJxLT5zdG9wLT5yZXNwWzJdLCBtcnEtPnN0b3AtPnJlc3BbM10pOwo+ICsgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfaG9zdG5hbWUo aG9zdCksIG1ycS0+c3RvcC0+b3Bjb2RlLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBtcnEtPnN0b3AtPmVycm9yLAo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtcnEtPnN0b3AtPnJlc3BbMF0sIG1ycS0+ c3RvcC0+cmVzcFsxXSwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgbXJxLT5zdG9wLT5yZXNwWzJdLCBtcnEtPnN0b3AtPnJlc3BbM10pOwo+IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgfQo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobXJxLT5k b25lKQo+IEBAIC0xOTMsMTIgKzE5NiwxMSBAQCBtbWNfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgbW1j X2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQo+IMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIG1ycS0+Y21kLT5hcmcsIG1ycS0+Y21kLT5mbGFncyk7Cj4KPiDCoCDCoCDCoCDCoGlm IChtcnEtPmRhdGEpIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2RlYnVnKCIlczogwqAg wqAgYmxrc3ogJWQgYmxvY2tzICVkIGZsYWdzICUwOHggIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgInRzYWMgJWQgbXMgbnNhYyAlZFxuIiwKPiAtIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIG1tY19ob3N0bmFtZShob3N0KSwgbXJxLT5kYXRhLT5ibGtzeiwK PiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1ycS0+ZGF0YS0+YmxvY2tzLCBt cnEtPmRhdGEtPmZsYWdzLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbXJx LT5kYXRhLT50aW1lb3V0X25zIC8gMTAwMDAwMCwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIG1ycS0+ZGF0YS0+dGltZW91dF9jbGtzKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHByX2RlYnVnKCIlczogwqAgwqAgYmxrc3ogJWQgYmxvY2tzICVkIGZsYWdzICUwOHggdHNh YyAlZCBtcyBuc2FjICVkXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBtbWNfaG9zdG5hbWUoaG9zdCksIG1ycS0+ZGF0YS0+Ymxrc3osCj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1ycS0+ZGF0YS0+YmxvY2tzLCBtcnEtPmRhdGEtPmZsYWdz LAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtcnEtPmRhdGEtPnRpbWVv dXRfbnMgLyAxMDAwMDAwLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBt cnEtPmRhdGEtPnRpbWVvdXRfY2xrcyk7Cj4gwqAgwqAgwqAgwqB9Cj4KPiDCoCDCoCDCoCDCoGlm IChtcnEtPnN0b3ApIHsKPiBAQCAtODQyLDggKzg0NCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBt bWNfc2V0X2lvcyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCj4gwqB7Cj4gwqAgwqAgwqAgwqBzdHJ1 Y3QgbW1jX2lvcyAqaW9zID0gJmhvc3QtPmlvczsKPgo+IC0gwqAgwqAgwqAgcHJfZGVidWcoIiVz OiBjbG9jayAldUh6IGJ1c21vZGUgJXUgcG93ZXJtb2RlICV1IGNzICV1IFZkZCAldSAiCj4gLSDC oCDCoCDCoCDCoCDCoCDCoCDCoCAid2lkdGggJXUgdGltaW5nICV1XG4iLAo+ICsgwqAgwqAgwqAg cHJfZGVidWcoIiVzOiBjbG9jayAldUh6IGJ1c21vZGUgJXUgcG93ZXJtb2RlICV1IGNzICV1IFZk ZCAldSB3aWR0aCAldSB0aW1pbmcgJXVcbiIsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbW1j X2hvc3RuYW1lKGhvc3QpLCBpb3MtPmNsb2NrLCBpb3MtPmJ1c19tb2RlLAo+IMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGlvcy0+cG93ZXJfbW9kZSwgaW9zLT5jaGlwX3NlbGVjdCwgaW9zLT52ZGQs Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaW9zLT5idXNfd2lkdGgsIGlvcy0+dGltaW5nKTsK PiBAQCAtMTMxMCw4ICsxMzExLDcgQEAgdm9pZCBtbWNfcG93ZXJfb2ZmKHN0cnVjdCBtbWNfaG9z dCAqaG9zdCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBub3RpZnlfdHlwZSwgdGltZW91dCk7Cj4KPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChl cnIgJiYgZXJyICE9IC1FQkFETVNHKQo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgcHJfZXJyKCJEZXZpY2UgZmFpbGVkIHRvIHJlc3BvbmQgd2l0aGluICVkIHBvd2Vyb2ZmICIK PiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgInRpbWUuIEZv cmNlZnVsbHkgcG93ZXJpbmcgZG93biB0aGUgZGV2aWNlXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCJEZXZpY2UgZmFpbGVkIHRvIHJlc3BvbmQgd2l0aGlu ICVkIHBvd2Vyb2ZmIHRpbWUuIEZvcmNlZnVsbHkgcG93ZXJpbmcgZG93biB0aGUgZGV2aWNlLlxu IiwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0aW1lb3V0 KTsKPgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLyogU2V0IHRoZSBjYXJkIHN0YXRlIHRvIG5v IG5vdGlmaWNhdGlvbiBhZnRlciB0aGUgcG93ZXJvZmYgKi8KPiBAQCAtMTY0Miw4ICsxNjQyLDgg QEAgc3RhdGljIGludCBtbWNfZG9fZXJhc2Uoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1bnNpZ25l ZCBpbnQgZnJvbSwKPiDCoCDCoCDCoCDCoGNtZC5mbGFncyA9IE1NQ19SU1BfU1BJX1IxIHwgTU1D X1JTUF9SMSB8IE1NQ19DTURfQUM7Cj4gwqAgwqAgwqAgwqBlcnIgPSBtbWNfd2FpdF9mb3JfY21k KGNhcmQtPmhvc3QsICZjbWQsIDApOwo+IMKgIMKgIMKgIMKgaWYgKGVycikgewo+IC0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgcHJfZXJyKCJtbWNfZXJhc2U6IGdyb3VwIHN0YXJ0IGVycm9yICVkLCAi Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJzdGF0dXMgJSN4XG4iLCBlcnIs IGNtZC5yZXNwWzBdKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2VycigibW1jX2VyYXNl OiBncm91cCBzdGFydCBlcnJvciAlZCwgc3RhdHVzICUjeFxuIiwKPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZXJyLCBjbWQucmVzcFswXSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBlcnIgPSAtRUlPOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBvdXQ7Cj4gwqAg wqAgwqAgwqB9Cj4gQEAgLTE2ODgsNyArMTY4OCw3IEBAIHN0YXRpYyBpbnQgbW1jX2RvX2VyYXNl KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGZyb20sCj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBlcnIgPSBtbWNfd2FpdF9mb3JfY21kKGNhcmQtPmhvc3QsICZjbWQsIDApOwo+ IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGVyciB8fCAoY21kLnJlc3BbMF0gJiAweEZERjky MDAwKSkgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcHJfZXJyKCJlcnJv ciAlZCByZXF1ZXN0aW5nIHN0YXR1cyAlI3hcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlcnIsIGNtZC5yZXNwWzBdKTsKPiArIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZXJyLCBjbWQucmVzcFswXSk7Cj4gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlcnIgPSAtRUlPOwo+IMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBvdXQ7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB9Cj4gQEAgLTIyNDUsNyArMjI0NSw3IEBAIGludCBtbWNfZmx1c2hfY2FjaGUoc3RydWN0IG1t Y19jYXJkICpjYXJkKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgRVhUX0NTRF9GTFVTSF9DQUNIRSwgMSwgMCk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBpZiAoZXJyKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcHJfZXJyKCIl czogY2FjaGUgZmx1c2ggZXJyb3IgJWRcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCks IGVycik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1t Y19ob3N0bmFtZShjYXJkLT5ob3N0KSwgZXJyKTsKPiDCoCDCoCDCoCDCoH0KPgo+IMKgIMKgIMKg IMKgcmV0dXJuIGVycjsKPiBAQCAtMjI3NSw5ICsyMjc1LDkgQEAgaW50IG1tY19jYWNoZV9jdHJs KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTggZW5hYmxlKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgRVhUX0NTRF9DQUNIRV9DVFJM LCBlbmFibGUsIDApOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGVycikKPiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHByX2VycigiJXM6IGNhY2hlICVzIGVycm9yICVk XG4iLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZW5hYmxlID8gIm9uIiA6ICJv ZmYiLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgZXJyKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbmFibGUgPyAib24iIDogIm9mZiIsCj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVycik7Cj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBlbHNlCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXJk LT5leHRfY3NkLmNhY2hlX2N0cmwgPSBlbmFibGU7Cj4gwqAgwqAgwqAgwqB9Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5jIGIvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMKPiBp bmRleCA4MzVlODZhLi43Zjk2M2MwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvaG9z dC5jCj4gKysrIGIvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMKPiBAQCAtOTQsOCArOTQsNyBAQCBz dGF0aWMgdm9pZCBtbWNfaG9zdF9jbGtfZ2F0ZV9kZWxheWVkKHN0cnVjdCBtbWNfaG9zdCAqaG9z dCkKPiDCoCDCoCDCoCDCoHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4KPiDCoCDCoCDCoCDCoGlmICgh ZnJlcSkgewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfZGVidWcoIiVzOiBmcmVxdWVuY3kg c2V0IHRvIDAgaW4gZGlzYWJsZSBmdW5jdGlvbiwgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAidGhpcyBtZWFucyB0aGUgY2xvY2sgaXMgYWxyZWFkeSBkaXNhYmxlZC5c biIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9kZWJ1ZygiJXM6IGZyZXF1ZW5jeSBzZXQg dG8gMCBpbiBkaXNhYmxlIGZ1bmN0aW9uLCB0aGlzIG1lYW5zIHRoZSBjbG9jayBpcyBhbHJlYWR5 IGRpc2FibGVkXG4iLAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1tY19o b3N0bmFtZShob3N0KSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm47Cj4gwqAgwqAg wqAgwqB9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMgYi9kcml2ZXJzL21t Yy9jb3JlL21tYy5jCj4gaW5kZXggYmJkN2FkYi4uZjZkYjc4OCAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL21tYy9jb3JlL21tYy5jCj4gKysrIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwo+IEBAIC0x OTYsOCArMTk2LDggQEAgc3RhdGljIGludCBtbWNfZ2V0X2V4dF9jc2Qoc3RydWN0IG1tY19jYXJk ICpjYXJkLCB1OCAqKm5ld19leHRfY3NkKQo+IMKgIMKgIMKgIMKgICovCj4gwqAgwqAgwqAgwqBl eHRfY3NkID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwpOwo+IMKgIMKgIMKgIMKgaWYgKCFleHRf Y3NkKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxs b2NhdGUgYSBidWZmZXIgdG8gIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg InJlY2VpdmUgdGhlIGV4dF9jc2QuXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwo+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVm ZmVyIHRvIHJlY2VpdmUgdGhlIGV4dF9jc2RcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqByZXR1cm4gLUVOT01FTTsKPiDCoCDCoCDCoCDCoH0KPgo+IEBAIC0yMTgsMTAgKzIxOCw4 IEBAIHN0YXRpYyBpbnQgbW1jX2dldF9leHRfY3NkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdTgg KipuZXdfZXh0X2NzZCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqIHN0b3JlZCBpbiB0aGVp ciBDU0QuCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKi8KPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmIChjYXJkLT5jc2QuY2FwYWNpdHkgPT0gKDQwOTYgKiA1MTIpKSB7Cj4gLSDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiB1bmFibGUgdG8gcmVhZCBFWFRf Q1NEICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJv biBhIHBvc3NpYmxlIGhpZ2ggY2FwYWNpdHkgY2FyZC4gIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIkNhcmQgd2lsbCBiZSBpZ25vcmVkLlxuIiwKPiAt IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1tY19ob3N0bmFt ZShjYXJkLT5ob3N0KSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9l cnIoIiVzOiB1bmFibGUgdG8gcmVhZCBFWFRfQ1NEIG9uIGEgcG9zc2libGUgaGlnaCBjYXBhY2l0 eSBjYXJkLiBDYXJkIHdpbGwgYmUgaWdub3JlZC5cbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7Cj4gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgcHJfd2FybigiJXM6IHVuYWJsZSB0byByZWFkIEVYVF9DU0QsIHBlcmZvcm1hbmNl IG1pZ2h0IHN1ZmZlclxuIiwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7Cj4gQEAgLTI1MSw5ICsyNDksOSBA QCBzdGF0aWMgaW50IG1tY19yZWFkX2V4dF9jc2Qoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1OCAq ZXh0X2NzZCkKPiDCoCDCoCDCoCDCoGNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJl ID0gZXh0X2NzZFtFWFRfQ1NEX1NUUlVDVFVSRV07Cj4gwqAgwqAgwqAgwqBpZiAoY2FyZC0+Y3Nk LnN0cnVjdHVyZSA9PSAzKSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoY2FyZC0+ZXh0 X2NzZC5yYXdfZXh0X2NzZF9zdHJ1Y3R1cmUgPiAyKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiB1bnJlY29nbmlzZWQgRVhUX0NTRCBzdHJ1Y3R1cmUg Igo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgInZlcnNp b24gJWRcbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNhcmQtPmV4dF9jc2QucmF3 X2V4dF9jc2Rfc3RydWN0dXJlKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHByX2VycigiJXM6IHVucmVjb2duaXNlZCBFWFRfQ1NEIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4i LAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfaG9z dG5hbWUoY2FyZC0+aG9zdCksCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJlKTsKPiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVyciA9IC1FSU5WQUw7Cj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIG91dDsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oH0KPiBAQCAtOTg0LDggKzk4Miw3IEBAIHN0YXRpYyBpbnQgbW1jX2luaXRfY2FyZChzdHJ1Y3Qg bW1jX2hvc3QgKmhvc3QsIHUzMiBvY3IsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBlcnIgPSBtbWNfc2VsZWN0X3Bvd2VyY2xhc3MoY2FyZCwgZXh0X2NzZF9iaXRzW2lkeF1b MF0sCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBleHRfY3NkKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGlmIChlcnIpCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiBwb3dlciBjbGFzcyBzZWxlY3Rpb24gdG8gIgo+ IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAiYnVzIHdpZHRoICVkIGZhaWxlZFxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHByX2VycigiJXM6IHBvd2VyIGNsYXNzIHNlbGVjdGlvbiB0byBi dXMgd2lkdGggJWQgZmFpbGVkXG4iLAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKPiDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAxIDw8 IGJ1c193aWR0aCk7Cj4KPiBAQCAtMTAxNSw4ICsxMDEyLDcgQEAgc3RhdGljIGludCBtbWNfaW5p dF9jYXJkKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jciwKPiDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGVyciA9IG1tY19zZWxlY3RfcG93ZXJjbGFzcyhjYXJkLCBleHRf Y3NkX2JpdHNbaWR4XVsxXSwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGV4dF9jc2QpOwo+IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGVycikKPiAtIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2VycigiJXM6IHBvd2VyIGNsYXNzIHNl bGVjdGlvbiB0byAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCJidXMgd2lkdGggJWQgZGRyICVkIGZhaWxlZFxuIiwKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2VycigiJXM6IHBvd2Vy IGNsYXNzIHNlbGVjdGlvbiB0byBidXMgd2lkdGggJWQgZGRyICVkIGZhaWxlZFxuIiwKPiDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtbWNf aG9zdG5hbWUoY2FyZC0+aG9zdCksCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgMSA8PCBidXNfd2lkdGgsIGRkcik7Cj4KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMgYi9kcml2ZXJzL21tYy9jb3JlL21tY19v cHMuYwo+IGluZGV4IDMyZGViM2UuLjdjNzM4OGMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tbWMv Y29yZS9tbWNfb3BzLmMKPiArKysgYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYwo+IEBAIC01 NjksOSArNTY5LDggQEAgaW50IG1tY19zZW5kX2hwaV9jbWQoc3RydWN0IG1tY19jYXJkICpjYXJk LCB1MzIgKnN0YXR1cykKPgo+IMKgIMKgIMKgIMKgZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJk LT5ob3N0LCAmY21kLCAwKTsKPiDCoCDCoCDCoCDCoGlmIChlcnIpIHsKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHByX3dhcm4oIiVzOiBlcnJvciAlZCBpbnRlcnJ1cHRpbmcgb3BlcmF0aW9uLiAi Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiSFBJIGNvbW1hbmQgcmVzcG9u c2UgJSN4XG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCj4gLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBlcnIsIGNtZC5yZXNwWzBdKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHByX3dhcm4oIiVzOiBlcnJvciAlZCBpbnRlcnJ1cHRpbmcgb3BlcmF0aW9uLiBIUEkgY29t bWFuZCByZXNwb25zZSAlI3hcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGVyciwgY21kLnJlc3BbMF0pOwo+IMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgcmV0dXJuIGVycjsKPiDCoCDCoCDCoCDCoH0KPiDCoCDCoCDCoCDCoGlm IChzdGF0dXMpCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2QuYyBiL2RyaXZlcnMv bW1jL2NvcmUvc2QuYwo+IGluZGV4IDUyYTE1NjMuLjE0OTJiN2IgMTAwNjQ0Cj4gLS0tIGEvZHJp dmVycy9tbWMvY29yZS9zZC5jCj4gKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZC5jCj4gQEAgLTEw LDYgKzEwLDggQEAKPiDCoCogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24uCj4gwqAqLwo+Cj4gKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBm bXQKPiArCj4gwqAjaW5jbHVkZSA8bGludXgvZXJyLmg+Cj4gwqAjaW5jbHVkZSA8bGludXgvc2xh Yi5oPgo+IMKgI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KPiBAQCAtMjgzLDkgKzI4NSw4IEBAIHN0 YXRpYyBpbnQgbW1jX3JlYWRfc3dpdGNoKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKPgo+IMKgIMKg IMKgIMKgc3RhdHVzID0ga21hbGxvYyg2NCwgR0ZQX0tFUk5FTCk7Cj4gwqAgwqAgwqAgwqBpZiAo IXN0YXR1cykgewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogY291bGQgbm90 IGFsbG9jYXRlIGEgYnVmZmVyIGZvciAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCAic3dpdGNoIGNhcGFiaWxpdGllcy5cbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIGZvciBzd2l0Y2gg Y2FwYWJpbGl0aWVzXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNf aG9zdG5hbWUoY2FyZC0+aG9zdCkpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIC1F Tk9NRU07Cj4gwqAgwqAgwqAgwqB9Cj4KPiBAQCAtMjk5LDcgKzMwMCw3IEBAIHN0YXRpYyBpbnQg bW1jX3JlYWRfc3dpdGNoKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKPiDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGlmIChlcnIgIT0gLUVJTlZBTCAmJiBlcnIgIT0gLUVOT1NZUyAmJiBlcnIgIT0gLUVG QVVMVCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gb3V0Owo+Cj4g LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl93YXJuKCIlczogcHJvYmxlbSByZWFkaW5nIEJ1cyBT cGVlZCBtb2Rlcy5cbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl93YXJuKCIlczogcHJv YmxlbSByZWFkaW5nIEJ1cyBTcGVlZCBtb2Rlc1xuIiwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7Cj4gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBlcnIgPSAwOwo+Cj4gQEAgLTM4MSw4ICszODIsOCBAQCBpbnQgbW1jX3NkX3N3aXRj aF9ocyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCj4KPiDCoCDCoCDCoCDCoHN0YXR1cyA9IGttYWxs b2MoNjQsIEdGUF9LRVJORUwpOwo+IMKgIMKgIMKgIMKgaWYgKCFzdGF0dXMpIHsKPiAtIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciBm b3IgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgInN3aXRjaCBjYXBhYmls aXRpZXMuXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIGZvciBzd2l0Y2gg Y2FwYWJpbGl0aWVzXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNf aG9zdG5hbWUoY2FyZC0+aG9zdCkpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIC1F Tk9NRU07Cj4gwqAgwqAgwqAgwqB9Cj4KPiBAQCAtMzkxLDcgKzM5Miw3IEBAIGludCBtbWNfc2Rf c3dpdGNoX2hzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGdvdG8gb3V0Owo+Cj4gwqAgwqAgwqAgwqBpZiAoKHN0YXR1c1sxNl0gJiAweEYpICE9IDEpIHsK PiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX3dhcm4oIiVzOiBQcm9ibGVtIHN3aXRjaGluZyBj YXJkIGludG8gaGlnaC1zcGVlZCBtb2RlIVxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHBy X3dhcm4oIiVzOiBwcm9ibGVtIHN3aXRjaGluZyBjYXJkIGludG8gaGlnaC1zcGVlZCBtb2RlIVxu IiwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZShjYXJk LT5ob3N0KSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlcnIgPSAwOwo+IMKgIMKgIMKgIMKg fSBlbHNlIHsKPiBAQCAtNDU2LDcgKzQ1Nyw3IEBAIHN0YXRpYyBpbnQgc2Rfc2VsZWN0X2RyaXZl cl90eXBlKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdTggKnN0YXR1cykKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHJldHVybiBlcnI7Cj4KPiDCoCDCoCDCoCDCoGlmICgoc3RhdHVzWzE1XSAmIDB4 RikgIT0gZHJpdmVfc3RyZW5ndGgpIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX3dhcm4o IiVzOiBQcm9ibGVtIHNldHRpbmcgZHJpdmUgc3RyZW5ndGghXG4iLAo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgcHJfd2FybigiJXM6IHByb2JsZW0gc2V0dGluZyBkcml2ZSBzdHJlbmd0aCFcbiIs Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfaG9zdG5hbWUoY2FyZC0+ aG9zdCkpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIDA7Cj4gwqAgwqAgwqAgwqB9 Cj4gQEAgLTUzNSw3ICs1MzYsNyBAQCBzdGF0aWMgaW50IHNkX3NldF9idXNfc3BlZWRfbW9kZShz dHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHU4ICpzdGF0dXMpCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqByZXR1cm4gZXJyOwo+Cj4gwqAgwqAgwqAgwqBpZiAoKHN0YXR1c1sxNl0gJiAweEYpICE9IGNh cmQtPnNkX2J1c19zcGVlZCkKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX3dhcm4oIiVzOiBQ cm9ibGVtIHNldHRpbmcgYnVzIHNwZWVkIG1vZGUhXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgcHJfd2FybigiJXM6IHByb2JsZW0gc2V0dGluZyBidXMgc3BlZWQgbW9kZSFcbiIsCj4gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkp Owo+IMKgIMKgIMKgIMKgZWxzZSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfc2V0X3Rp bWluZyhjYXJkLT5ob3N0LCB0aW1pbmcpOwo+IEBAIC01OTcsNyArNTk4LDcgQEAgc3RhdGljIGlu dCBzZF9zZXRfY3VycmVudF9saW1pdChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHU4ICpzdGF0dXMp Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gZXJyOwo+Cj4gwqAgwqAgwqAgwqBpZiAo KChzdGF0dXNbMTVdID4+IDQpICYgMHgwRikgIT0gY3VycmVudF9saW1pdCkKPiAtIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHByX3dhcm4oIiVzOiBQcm9ibGVtIHNldHRpbmcgY3VycmVudCBsaW1pdCFc biIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl93YXJuKCIlczogcHJvYmxlbSBzZXR0aW5n IGN1cnJlbnQgbGltaXQhXG4iLAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg bW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKPgo+IMKgIMKgIMKgIMKgcmV0dXJuIDA7Cj4gQEAg LTYxOSw4ICs2MjAsOCBAQCBzdGF0aWMgaW50IG1tY19zZF9pbml0X3Voc19jYXJkKHN0cnVjdCBt bWNfY2FyZCAqY2FyZCkKPgo+IMKgIMKgIMKgIMKgc3RhdHVzID0ga21hbGxvYyg2NCwgR0ZQX0tF Uk5FTCk7Cj4gwqAgwqAgwqAgwqBpZiAoIXN0YXR1cykgewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAg wqAgcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIGZvciAiCj4gLSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAic3dpdGNoIGNhcGFiaWxpdGllcy5cbiIsIG1t Y19ob3N0bmFtZShjYXJkLT5ob3N0KSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIo IiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yIHN3aXRjaCBjYXBhYmlsaXRpZXNc biIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZShjYXJk LT5ob3N0KSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gLUVOT01FTTsKPiDCoCDC oCDCoCDCoH0KPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMgYi9k cml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMKPiBpbmRleCAzZDgyZjEyLi41N2NlMDUyIDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYwo+ICsrKyBiL2RyaXZlcnMvbW1j L2NvcmUvc2Rpb19idXMuYwo+IEBAIC0xMSw2ICsxMSw4IEBACj4gwqAqIFNESU8gZnVuY3Rpb24g ZHJpdmVyIG1vZGVsCj4gwqAqLwo+Cj4gKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5B TUUgIjogIiBmbXQKPiArCj4gwqAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4gwqAjaW5jbHVk ZSA8bGludXgvZXJyLmg+Cj4gwqAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pby5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lv LmMKPiBpbmRleCA4ZjZmNWFjLi43Yzg3NzMyIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbW1jL2Nv cmUvc2Rpb19pby5jCj4gKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lvLmMKPiBAQCAtOSw2 ICs5LDggQEAKPiDCoCogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+IMKgKi8KPgo+ ICsjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Cj4gKwo+IMKgI2lu Y2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgo+IMKgI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Cj4g wqAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KPiBAQCAtNjUsNyArNjcsNyBAQCBpbnQgc2Rp b19lbmFibGVfZnVuYyhzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQo+IMKgIMKgIMKgIMKgQlVHX09O KCFmdW5jKTsKPiDCoCDCoCDCoCDCoEJVR19PTighZnVuYy0+Y2FyZCk7Cj4KPiAtIMKgIMKgIMKg IHByX2RlYnVnKCJTRElPOiBFbmFibGluZyBkZXZpY2UgJXMuLi5cbiIsIHNkaW9fZnVuY19pZChm dW5jKSk7Cj4gKyDCoCDCoCDCoCBwcl9kZWJ1ZygiRW5hYmxpbmcgZGV2aWNlICVzLi4uXG4iLCBz ZGlvX2Z1bmNfaWQoZnVuYykpOwo+Cj4gwqAgwqAgwqAgwqByZXQgPSBtbWNfaW9fcndfZGlyZWN0 KGZ1bmMtPmNhcmQsIDAsIDAsIFNESU9fQ0NDUl9JT0V4LCAwLCAmcmVnKTsKPiDCoCDCoCDCoCDC oGlmIChyZXQpCj4gQEAgLTkwLDEyICs5MiwxMiBAQCBpbnQgc2Rpb19lbmFibGVfZnVuYyhzdHJ1 Y3Qgc2Rpb19mdW5jICpmdW5jKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z290byBlcnI7Cj4gwqAgwqAgwqAgwqB9Cj4KPiAtIMKgIMKgIMKgIHByX2RlYnVnKCJTRElPOiBF bmFibGVkIGRldmljZSAlc1xuIiwgc2Rpb19mdW5jX2lkKGZ1bmMpKTsKPiArIMKgIMKgIMKgIHBy X2RlYnVnKCJFbmFibGVkIGRldmljZSAlc1xuIiwgc2Rpb19mdW5jX2lkKGZ1bmMpKTsKPgo+IMKg IMKgIMKgIMKgcmV0dXJuIDA7Cj4KPiDCoGVycjoKPiAtIMKgIMKgIMKgIHByX2RlYnVnKCJTRElP OiBGYWlsZWQgdG8gZW5hYmxlIGRldmljZSAlc1xuIiwgc2Rpb19mdW5jX2lkKGZ1bmMpKTsKPiAr IMKgIMKgIMKgIHByX2RlYnVnKCJGYWlsZWQgdG8gZW5hYmxlIGRldmljZSAlc1xuIiwgc2Rpb19m dW5jX2lkKGZ1bmMpKTsKPiDCoCDCoCDCoCDCoHJldHVybiByZXQ7Cj4gwqB9Cj4gwqBFWFBPUlRf U1lNQk9MX0dQTChzZGlvX2VuYWJsZV9mdW5jKTsKPiBAQCAtMTE1LDcgKzExNyw3IEBAIGludCBz ZGlvX2Rpc2FibGVfZnVuYyhzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQo+IMKgIMKgIMKgIMKgQlVH X09OKCFmdW5jKTsKPiDCoCDCoCDCoCDCoEJVR19PTighZnVuYy0+Y2FyZCk7Cj4KPiAtIMKgIMKg IMKgIHByX2RlYnVnKCJTRElPOiBEaXNhYmxpbmcgZGV2aWNlICVzLi4uXG4iLCBzZGlvX2Z1bmNf aWQoZnVuYykpOwo+ICsgwqAgwqAgwqAgcHJfZGVidWcoIkRpc2FibGluZyBkZXZpY2UgJXMuLi5c biIsIHNkaW9fZnVuY19pZChmdW5jKSk7Cj4KPiDCoCDCoCDCoCDCoHJldCA9IG1tY19pb19yd19k aXJlY3QoZnVuYy0+Y2FyZCwgMCwgMCwgU0RJT19DQ0NSX0lPRXgsIDAsICZyZWcpOwo+IMKgIMKg IMKgIMKgaWYgKHJldCkKPiBAQCAtMTI3LDEyICsxMjksMTIgQEAgaW50IHNkaW9fZGlzYWJsZV9m dW5jKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCj4gwqAgwqAgwqAgwqBpZiAocmV0KQo+IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZ290byBlcnI7Cj4KPiAtIMKgIMKgIMKgIHByX2RlYnVnKCJTRElP OiBEaXNhYmxlZCBkZXZpY2UgJXNcbiIsIHNkaW9fZnVuY19pZChmdW5jKSk7Cj4gKyDCoCDCoCDC oCBwcl9kZWJ1ZygiRGlzYWJsZWQgZGV2aWNlICVzXG4iLCBzZGlvX2Z1bmNfaWQoZnVuYykpOwo+ Cj4gwqAgwqAgwqAgwqByZXR1cm4gMDsKPgo+IMKgZXJyOgo+IC0gwqAgwqAgwqAgcHJfZGVidWco IlNESU86IEZhaWxlZCB0byBkaXNhYmxlIGRldmljZSAlc1xuIiwgc2Rpb19mdW5jX2lkKGZ1bmMp KTsKPiArIMKgIMKgIMKgIHByX2RlYnVnKCJGYWlsZWQgdG8gZGlzYWJsZSBkZXZpY2UgJXNcbiIs IHNkaW9fZnVuY19pZChmdW5jKSk7Cj4gwqAgwqAgwqAgwqByZXR1cm4gLUVJTzsKPiDCoH0KPiDC oEVYUE9SVF9TWU1CT0xfR1BMKHNkaW9fZGlzYWJsZV9mdW5jKTsKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9tbWMvY29yZS9zZGlvX2lycS5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lycS5jCj4g aW5kZXggYmM5ZTY3YS4uNTMzZDBlNSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21tYy9jb3JlL3Nk aW9faXJxLmMKPiArKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9faXJxLmMKPiBAQCAtMTMsNiAr MTMsOCBAQAo+IMKgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4gwqAqLwo+Cj4g KyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKPiArCj4gwqAjaW5j bHVkZSA8bGludXgva2VybmVsLmg+Cj4gwqAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KPiDCoCNp bmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Cj4gQEAgLTQ3LDcgKzQ5LDcgQEAgc3RhdGljIGludCBw cm9jZXNzX3NkaW9fcGVuZGluZ19pcnFzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKPiDCoCDCoCDC oCDCoHJldCA9IG1tY19pb19yd19kaXJlY3QoY2FyZCwgMCwgMCwgU0RJT19DQ0NSX0lOVHgsIDAs ICZwZW5kaW5nKTsKPiDCoCDCoCDCoCDCoGlmIChyZXQpIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHByX2RlYnVnKCIlczogZXJyb3IgJWQgcmVhZGluZyBTRElPX0NDQ1JfSU5UeFxuIiwKPiAt IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW1jX2NhcmRfaWQoY2FyZCksIHJldCk7 Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19jYXJkX2lkKGNhcmQp LCByZXQpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIHJldDsKPiDCoCDCoCDCoCDC oH0KPgo+IEBAIC0yMzMsMTAgKzIzNSwxMCBAQCBpbnQgc2Rpb19jbGFpbV9pcnEoc3RydWN0IHNk aW9fZnVuYyAqZnVuYywgc2Rpb19pcnFfaGFuZGxlcl90ICpoYW5kbGVyKQo+IMKgIMKgIMKgIMKg QlVHX09OKCFmdW5jKTsKPiDCoCDCoCDCoCDCoEJVR19PTighZnVuYy0+Y2FyZCk7Cj4KPiAtIMKg IMKgIMKgIHByX2RlYnVnKCJTRElPOiBFbmFibGluZyBJUlEgZm9yICVzLi4uXG4iLCBzZGlvX2Z1 bmNfaWQoZnVuYykpOwo+ICsgwqAgwqAgwqAgcHJfZGVidWcoIkVuYWJsaW5nIElSUSBmb3IgJXMu Li5cbiIsIHNkaW9fZnVuY19pZChmdW5jKSk7Cj4KPiDCoCDCoCDCoCDCoGlmIChmdW5jLT5pcnFf aGFuZGxlcikgewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfZGVidWcoIlNESU86IElSUSBm b3IgJXMgYWxyZWFkeSBpbiB1c2UuXG4iLCBzZGlvX2Z1bmNfaWQoZnVuYykpOwo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcHJfZGVidWcoIklSUSBmb3IgJXMgYWxyZWFkeSBpbiB1c2VcbiIsIHNk aW9fZnVuY19pZChmdW5jKSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gLUVCVVNZ Owo+IMKgIMKgIMKgIMKgfQo+Cj4gQEAgLTI3Niw3ICsyNzgsNyBAQCBpbnQgc2Rpb19yZWxlYXNl X2lycShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQo+IMKgIMKgIMKgIMKgQlVHX09OKCFmdW5jKTsK PiDCoCDCoCDCoCDCoEJVR19PTighZnVuYy0+Y2FyZCk7Cj4KPiAtIMKgIMKgIMKgIHByX2RlYnVn KCJTRElPOiBEaXNhYmxpbmcgSVJRIGZvciAlcy4uLlxuIiwgc2Rpb19mdW5jX2lkKGZ1bmMpKTsK PiArIMKgIMKgIMKgIHByX2RlYnVnKCJEaXNhYmxpbmcgSVJRIGZvciAlcy4uLlxuIiwgc2Rpb19m dW5jX2lkKGZ1bmMpKTsKPgo+IMKgIMKgIMKgIMKgaWYgKGZ1bmMtPmlycV9oYW5kbGVyKSB7Cj4g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmdW5jLT5pcnFfaGFuZGxlciA9IE5VTEw7Cj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvYXQ5 MV9tY2kuYwo+IGluZGV4IGY0MzdjM2UuLmQ2M2Y0NTMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9t bWMvaG9zdC9hdDkxX21jaS5jCj4gKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdDkxX21jaS5jCj4g QEAgLTk2OCw4ICs5NjgsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBhdDkxX21jaV9wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGF0 OTFtY2lfaXNfbWNpMXJldjJ4eCgpKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgbW1jLT5jYXBzIHw9IE1NQ19DQVBfNF9CSVRfREFUQTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGVsc2UKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGRldl93YXJuKCZw ZGV2LT5kZXYsICI0IHdpcmUgYnVzIG1vZGUgbm90IHN1cHBvcnRlZCIKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICIgLSB1c2luZyAxIHdpcmVcbiIpOwo+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZGV2X3dhcm4oJnBkZXYtPmRldiwg IjQgd2lyZSBidXMgbW9kZSBub3Qgc3VwcG9ydGVkIC0gdXNpbmcgMSB3aXJlXG4iKTsKPiDCoCDC oCDCoCDCoH0KPgo+IMKgIMKgIMKgIMKgaG9zdC0+YnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50 KCZwZGV2LT5kZXYsIE1DSV9CVUZTSVpFLAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0 L2F1MXhtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jCj4gaW5kZXggZGJkMGM4YS4u Y2ZkMzI1ZCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21tYy9ob3N0L2F1MXhtbWMuYwo+ICsrKyBi L2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jCj4gQEAgLTMyLDYgKzMyLDggQEAKPiDCoCogKHRo ZSBsb3cgdG8gaGlnaCB0cmFuc2l0aW9uIHdpbGwgbm90IG9jY3VyKS4KPiDCoCovCj4KPiArI2Rl ZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAo+ICsKPiDCoCNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KPiDCoCNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4gwqAjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gQEAgLTU0LDEwICs1NiwxMSBAQAo+IMKgLyog I2RlZmluZSBERUJVRyAqLwo+Cj4gwqAjaWZkZWYgREVCVUcKPiAtI2RlZmluZSBEQkcoZm10LCBp ZHgsIGFyZ3MuLi4pIFwKPiAtIMKgIMKgIMKgIHByX2RlYnVnKCJhdTF4bW1jKCVkKTogREVCVUc6 ICIgZm10LCBpZHgsICMjYXJncykKPiArI2RlZmluZSBEQkcoaWR4LCBmbXQsIC4uLikgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgXAo+ICsgwqAg wqAgwqAgcHJfZGVidWcoIiglZCk6IERFQlVHOiAiIGZtdCwgaWR4LCAjI19fVkFfQVJHU19fKQo+ IMKgI2Vsc2UKPiAtI2RlZmluZSBEQkcoZm10LCBpZHgsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgw KQo+ICsjZGVmaW5lIERCRyhpZHgsIGZtdCwgLi4uKSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBcCj4gKyDCoCDCoCDCoCBub19wcmludGsoZm10 LCAjI19fVkFfQVJHU19fKQo+IMKgI2VuZGlmCj4KPiDCoC8qIEhhcmR3YXJlIGRlZmluaXRpb25z ICovCj4gQEAgLTI3Nyw4ICsyODAsNyBAQCBzdGF0aWMgaW50IGF1MXhtbWNfc2VuZF9jb21tYW5k KHN0cnVjdCBhdTF4bW1jX2hvc3QgKmhvc3QsIGludCB3YWl0LAo+IMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgbW1jY21kIHw9IFNEX0NNRF9SVF8zOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJl YWs7Cj4gwqAgwqAgwqAgwqBkZWZhdWx0Ogo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfaW5m bygiYXUxeG1tYzogdW5oYW5kbGVkIHJlc3BvbnNlIHR5cGUgJTAyeFxuIiwKPiAtIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1tY19yZXNwX3R5cGUoY21kKSk7Cj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCBwcl9pbmZvKCJ1bmhhbmRsZWQgcmVzcG9uc2UgdHlwZSAlMDJ4XG4iLCBt bWNfcmVzcF90eXBlKGNtZCkpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIC1FSU5W QUw7Cj4gwqAgwqAgwqAgwqB9Cj4KPiBAQCAtNDc4LDE5ICs0ODAsMTkgQEAgc3RhdGljIHZvaWQg YXUxeG1tY19yZWNlaXZlX3BpbyhzdHJ1Y3QgYXUxeG1tY19ob3N0ICpob3N0KQo+IMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7Cj4KPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmIChzdGF0dXMgJiBTRF9TVEFUVVNfUkMpIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIERCRygiUlggQ1JDIEVycm9yIFslZCArICVkXS5cbiIsIGhvc3QtPnBkZXYt PmlkLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgaG9zdC0+cGlvLmxlbiwgY291bnQpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgREJHKGhvc3QtPnBkZXYtPmlkLCAiUlggQ1JDIEVycm9yIFslZCArICVkXVxu IiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGhvc3QtPnBpby5s ZW4sIGNvdW50KTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOwo+ IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfQo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAo c3RhdHVzICYgU0RfU1RBVFVTX1JPKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBEQkcoIlJYIE92ZXJydW4gWyVkICsgJWRdXG4iLCBob3N0LT5wZGV2LT5pZCwKPiAtIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGhv c3QtPnBpby5sZW4sIGNvdW50KTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IERCRyhob3N0LT5wZGV2LT5pZCwgIlJYIE92ZXJydW4gWyVkICsgJWRdXG4iLAo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaG9zdC0+cGlvLmxlbiwgY291bnQpOwo+ IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7Cj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB9Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbHNlIGlmIChzdGF0dXMgJiBT RF9TVEFUVVNfUlUpIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIERCRygi UlggVW5kZXJydW4gWyVkICsgJWRdXG4iLCBob3N0LT5wZGV2LT5pZCwKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGhvc3QtPnBpby5s ZW4sIMKgY291bnQpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgREJHKGhv c3QtPnBkZXYtPmlkLCAiUlggVW5kZXJydW4gWyVkICsgJWRdXG4iLAo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaG9zdC0+cGlvLmxlbiwgY291bnQpOwo+IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7Cj4gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqB9Cj4KPiBAQCAtODM1LDggKzgzNyw3IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBhdTF4bW1j X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBhdTF4bW1jX3JlY2VpdmVfcGlvKGhvc3QpOwo+Cj4gwqAgwqAgwqAgwqB9IGVsc2Ug aWYgKHN0YXR1cyAmIDB4MjAzRjNDNzApIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIERCRygiVW5oYW5kbGVkIHN0YXR1cyAlOC44eFxuIiwgaG9zdC0+cGRldi0+aWQsCj4g LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzdGF0dXMpOwo+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgREJHKGhvc3QtPnBkZXYtPmlkLCAi VW5oYW5kbGVkIHN0YXR1cyAlOC44eFxuIiwgc3RhdHVzKTsKPiDCoCDCoCDCoCDCoH0KPgo+IMKg IMKgIMKgIMKgYXVfd3JpdGVsKHN0YXR1cywgSE9TVF9TVEFUVVMoaG9zdCkpOwo+IEBAIC0xMDUw LDcgKzEwNTEsNyBAQCBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTF4bW1jX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gwqAgwqAgwqAgwqBpZiAoaGFzX2RiZG1hKCkpIHsKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldCA9IGF1MXhtbWNfZGJkbWFfaW5pdChob3N0KTsKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChyZXQpCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBwcl9pbmZvKERSSVZFUl9OQU1FICI6IERCRE1BIGluaXQgZmFpbGVkOyB1c2lu ZyBQSU9cbiIpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfaW5mbygi REJETUEgaW5pdCBmYWlsZWQ7IHVzaW5nIFBJT1xuIik7Cj4gwqAgwqAgwqAgwqB9Cj4KPiDCoCNp ZmRlZiBDT05GSUdfTEVEU19DTEFTUwo+IEBAIC0xMDc1LDggKzEwNzYsOCBAQCBzdGF0aWMgaW50 IF9fZGV2aW5pdCBhdTF4bW1jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4K PiDCoCDCoCDCoCDCoHBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwo+Cj4gLSDCoCDC oCDCoCBwcl9pbmZvKERSSVZFUl9OQU1FICI6IE1NQyBDb250cm9sbGVyICVkIHNldCB1cCBhdCAl OC44WCIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgICIgKG1vZGU9JXMpXG4iLCBwZGV2LT5pZCwg aG9zdC0+aW9iYXNlLAo+ICsgwqAgwqAgwqAgcHJfaW5mbygiTU1DIENvbnRyb2xsZXIgJWQgc2V0 IHVwIGF0ICU4LjhYIChtb2RlPSVzKVxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHBkZXYt PmlkLCBob3N0LT5pb2Jhc2UsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5mbGFncyAm IEhPU1RfRl9ETUEgPyAiZG1hIiA6ICJwaW8iKTsKPgo+IMKgIMKgIMKgIMKgcmV0dXJuIDA7IMKg IMKgIMKgIC8qIGFsbCBvayAqLwo+IEBAIC0xMjA2LDcgKzEyMDcsNyBAQCBzdGF0aWMgaW50IF9f aW5pdCBhdTF4bW1jX2luaXQodm9pZCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCovCj4gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBtZW1pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoJmF1MXht bWNfbWVtX2RiZGV2KTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghbWVtaWQpCj4gLSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoImF1MXhtbWM6IGNhbm5vdCBh ZGQgbWVtb3J5IGRiZG1hXG4iKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHByX2VycigiY2Fubm90IGFkZCBtZW1vcnkgZGJkbWFcbiIpOwo+IMKgIMKgIMKgIMKgfQo+IMKg IMKgIMKgIMKgcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXUxeG1tY19kcml2ZXIp Owo+IMKgfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2JmaW5fc2RoLmMgYi9kcml2 ZXJzL21tYy9ob3N0L2JmaW5fc2RoLmMKPiBpbmRleCAwMzcxYmY1Li43ODBhMWViIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYmZpbl9zZGguYwo+ICsrKyBiL2RyaXZlcnMvbW1jL2hv c3QvYmZpbl9zZGguYwo+IEBAIC0xNjIsOCArMTYyLDcgQEAgc3RhdGljIGludCBzZGhfc2V0dXBf ZGF0YShzdHJ1Y3Qgc2RoX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKPiDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGhvc3QtPnNnX2NwdVtpXS5jZmcgPSBkbWFf Y2ZnOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaG9zdC0+c2dfY3B1W2ld LnhfY291bnQgPSBzZ19kbWFfbGVuKHNnKSAvIDQ7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBob3N0LT5zZ19jcHVbaV0ueF9tb2RpZnkgPSA0Owo+IC0gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICIlZDogc3Rh cnRfYWRkcjoweCVseCwgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgImNmZzoweCV4LCB4X2NvdW50OjB4JXgsIHhfbW9kaWZ5OjB4JXhcbiIsCj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1j KSwgIiVkOiBzdGFydF9hZGRyOjB4JWx4LCBjZmc6MHgleCwgeF9jb3VudDoweCV4LCB4X21vZGlm eToweCV4XG4iLAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgaSwgaG9zdC0+c2dfY3B1W2ldLnN0YXJ0X2FkZHIsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5zZ19jcHVbaV0uY2ZnLCBob3N0LT5zZ19j cHVbaV0ueF9jb3VudCwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGhvc3QtPnNnX2NwdVtpXS54X21vZGlmeSk7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv bW1jL2hvc3QvZHdfbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCj4gaW5kZXggM2Fh ZWIwOC4uNWQzNGMwMSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCj4g KysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwo+IEBAIC01NTQsOCArNTU0LDggQEAgc3Rh dGljIHZvaWQgZHdfbWNpX3NldHVwX2J1cyhzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCj4gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkaXYgPSAoaG9zdC0+YnVzX2h6IMKgLyBz bG90LT5jbG9jaykgPj4gMTsKPgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGV2X2luZm8oJnNs b3QtPm1tYy0+Y2xhc3NfZGV2LAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAiQnVzIHNwZWVkIChzbG90ICVkKSA9ICVkSHogKHNsb3QgcmVxICVkSHosIGFjdHVhbCAlZEha Igo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAiIGRpdiA9ICVkKVxuIiwg c2xvdC0+aWQsIGhvc3QtPmJ1c19oeiwgc2xvdC0+Y2xvY2ssCj4gKyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCJCdXMgc3BlZWQgKHNsb3QgJWQpID0gJWRIeiAoc2xvdCByZXEg JWRIeiwgYWN0dWFsICVkSFogZGl2ID0gJWQpXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBzbG90LT5pZCwgaG9zdC0+YnVzX2h6LCBzbG90LT5jbG9jaywKPiDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBkaXYgPyAoKGhvc3QtPmJ1c19oeiAvIGRp dikgPj4gMSkgOiBob3N0LT5idXNfaHosIGRpdik7Cj4KPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oC8qIGRpc2FibGUgY2xvY2sgKi8KPiBAQCAtOTQyLDggKzk0Miw3IEBAIHN0YXRpYyB2b2lkIGR3 X21jaV90YXNrbGV0X2Z1bmModW5zaWduZWQgbG9uZyBwcml2KQo+IMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGF0YS0+ZXJyb3IgPSAt RVRJTUVET1VUOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgfSBlbHNlIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGRldl9lcnIoJmhvc3QtPnBkZXYtPmRldiwKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ICJkYXRhIEZJRk8gZXJyb3IgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIihzdGF0dXM9JTA4eClcbiIsCj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAiZGF0YSBGSUZPIGVycm9yIChzdGF0dXM9JTA4eClcbiIsCj4gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBzdGF0dXMpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZGF0YS0+ZXJyb3IgPSAtRUlPOwo+IMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfQo+IEBAIC0xNzc2LDggKzE3NzUsOCBA QCBzdGF0aWMgdm9pZCBkd19tY2lfaW5pdF9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCkKPgo+IMKg IMKgIMKgIMKgaWYgKGhvc3QtPmRtYV9vcHMtPmluaXQpIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmIChob3N0LT5kbWFfb3BzLT5pbml0KGhvc3QpKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBkZXZfZXJyKCZob3N0LT5wZGV2LT5kZXYsICIlczogVW5hYmxlIHRv IGluaXRpYWxpemUgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgIkRNQSBDb250cm9sbGVyLlxuIiwgX19mdW5jX18pOwo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgZGV2X2VycigmaG9zdC0+cGRldi0+ZGV2LCAiJXM6IFVuYWJsZSB0 byBpbml0aWFsaXplIERNQSBDb250cm9sbGVyXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgX19mdW5jX18pOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZ290byBub19kbWE7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4g wqAgwqAgwqAgwqB9IGVsc2Ugewo+IEBAIC0xOTg1LDkgKzE5ODQsOCBAQCBzdGF0aWMgaW50IGR3 X21jaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+IMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIERXX01DSV9FUlJPUl9GTEFHUyB8IFNETU1DX0lOVF9DRCk7Cj4gwqAgwqAg wqAgwqBtY2lfd3JpdGVsKGhvc3QsIENUUkwsIFNETU1DX0NUUkxfSU5UX0VOQUJMRSk7IC8qIEVu YWJsZSBtY2kgaW50ZXJydXB0ICovCj4KPiAtIMKgIMKgIMKgIGRldl9pbmZvKCZwZGV2LT5kZXYs ICJEVyBNTUMgY29udHJvbGxlciBhdCBpcnEgJWQsICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIiVkIGJpdCBob3N0IGRhdGEgd2lkdGgsICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IiV1IGRlZXAgZmlmb1xuIiwKPiArIMKgIMKgIMKgIGRldl9pbmZvKCZwZGV2LT5kZXYsCj4gKyDC oCDCoCDCoCAiRFcgTU1DIGNvbnRyb2xsZXIgYXQgaXJxICVkLCAlZCBiaXQgaG9zdCBkYXRhIHdp ZHRoLCAldSBkZWVwIGZpZm9cbiIsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaXJxLCB3aWR0 aCwgZmlmb19zaXplKTsKSSB0aGluayB0aGF0IHRhYiBpcyBuZWVkZWQgdGhpcyAiRFcgTU1DIGNv bnRyb2xsZXIgYXQgaXJxIC4uLi4iID8KPiDCoCDCoCDCoCDCoGlmIChob3N0LT5xdWlya3MgJiBE V19NQ0lfUVVJUktfSURNQUNfRFRPKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGV2X2luZm8o JnBkZXYtPmRldiwgIkludGVybmFsIERNQUMgaW50ZXJydXB0IGZpeCBlbmFibGVkLlxuIik7Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jIGIvZHJpdmVycy9tbWMvaG9z dC9tbWNfc3BpLmMKPiBpbmRleCA5Mjk0NmI4Li5mNzc4OTlmIDEwMDY0NAo+IC0tLSBhL2RyaXZl cnMvbW1jL2hvc3QvbW1jX3NwaS5jCj4gKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMK PiBAQCAtODYwLDkgKzg2MCw5IEBAIG1tY19zcGlfcmVhZGJsb2NrKHN0cnVjdCBtbWNfc3BpX2hv c3QgKmhvc3QsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsCj4KPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGJlMTZfdG9fY3B1cygmc2NyYXRjaC0+Y3JjX3ZhbCk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBpZiAoc2NyYXRjaC0+Y3JjX3ZhbCAhPSBjcmMpIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZCAtIGNyYyBlcnJvcjogY3Jj X3ZhbD0weCUwNHgsICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgICJjb21wdXRlZD0weCUwNHggbGVuPSVkXG4iLAo+IC0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2NyYXRj aC0+Y3JjX3ZhbCwgY3JjLCB0LT5sZW4pOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgZGV2X2RiZygmc3BpLT5kZXYsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAicmVhZCAtIGNyYyBlcnJvcjogY3JjX3ZhbD0weCUwNHgsIGNvbXB1 dGVkPTB4JTA0eCBsZW49JWRcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBzY3JhdGNoLT5jcmNfdmFsLCBjcmMsIHQtPmxlbik7Cj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gLUVJTFNFUTsKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH0KPiDCoCDCoCDCoCDCoH0KPiBAQCAtMTI1Myw4ICsxMjUzLDcgQEAgc3RhdGlj IHZvaWQgbW1jX3NwaV9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lv cyAqaW9zKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg bXJlcyA9IHNwaV9zZXR1cChob3N0LT5zcGkpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1yZXMgPCAwKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGV2X2RiZygmaG9zdC0+c3Bp LT5kZXYsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAic3dpdGNoIGJhY2sgdG8gU1BJIG1vZGUgMyIKPiAtIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgICIgZmFpbGVkXG4iKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJzd2l0Y2ggYmFjayB0byBT UEkgbW9kZSAzIGZhaWxlZFxuIik7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB9Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t bWMvaG9zdC9tbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwo+IGluZGV4IDBlYTk5MzUu LjMzYjNjZDEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKPiArKysgYi9k cml2ZXJzL21tYy9ob3N0L21tY2kuYwo+IEBAIC0xMjI5LDggKzEyMjksNyBAQCBzdGF0aWMgaW50 IF9fZGV2aW5pdCBtbWNpX3Byb2JlKHN0cnVjdCBhbWJhX2RldmljZSAqZGV2LAo+IMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaG9zdC0+bW1jLT5vY3JfYXZhaWwgPSAodTMyKSBt YXNrOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHBsYXQtPm9jcl9t YXNrKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGV2 X3dhcm4oJmRldi0+ZGV2LAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAiUHJvdmlkZWQgb2NyX21hc2svc2V0cG93ZXIgd2lsbCBub3QgYmUgdXNlZCAi Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCIodXNp bmcgcmVndWxhdG9yIGluc3RlYWQpXG4iKTsKPiArIlByb3ZpZGVkIG9jcl9tYXNrL3NldHBvd2Vy IHdpbGwgbm90IGJlIHVzZWQgKHVzaW5nIHJlZ3VsYXRvciBpbnN0ZWFkKVxuIik7Cj4gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAgwqAgwqAgwqB9Cj4gwqAjZW5kaWYKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9tbWMvaG9zdC9tdnNkaW8uYyBiL2RyaXZlcnMvbW1jL2hvc3QvbXZzZGlvLmMK PiBpbmRleCAyMTFhNDk1Li45MzAxMmEwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qv bXZzZGlvLmMKPiArKysgYi9kcml2ZXJzL21tYy9ob3N0L212c2Rpby5jCj4gQEAgLTg0LDkgKzg0 LDkgQEAgc3RhdGljIGludCBtdnNkX3NldHVwX2RhdGEoc3RydWN0IG12c2RfaG9zdCAqaG9zdCwg c3RydWN0IG1tY19kYXRhICpkYXRhKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgaHdfc3RhdGUgPSBtdnNkX3JlYWQoTVZTRF9IV19TVEFURSk7Cj4gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBjb3VudCsrOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSB3 aGlsZSAoIShod19zdGF0ZSAmICgxIDw8IDEzKSkpOwo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg ZGV2X2RiZyhob3N0LT5kZXYsICIqKiogd2FpdCBmb3IgRklGT19FTVBUWSBiaXQgIgo+IC0gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAiKGh3PTB4JTA0 eCwgY291bnQ9JWQsIGppZmZpZXM9JWxkKVxuIiwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaHdfc3RhdGUsIGNvdW50LCBqaWZmaWVzIC0gKHQg LSBIWikpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZGV2X2RiZyhob3N0LT5kZXYsCj4gKyIq Kiogd2FpdCBmb3IgRklGT19FTVBUWSBiaXQgKGh3PTB4JTA0eCwgY291bnQ9JWQsIGppZmZpZXM9 JWxkKVxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGh3X3N0YXRlLCBj b3VudCwgamlmZmllcyAtICh0IC0gSFopKTsKPiDCoCDCoCDCoCDCoH0KPgo+IMKgIMKgIMKgIMKg LyogSWYgdGltZW91dD0wIHRoZW4gbWF4aW11bSB0aW1lb3V0IGluZGV4IGlzIHVzZWQuICovCj4g QEAgLTExNywxMCArMTE3LDkgQEAgc3RhdGljIGludCBtdnNkX3NldHVwX2RhdGEoc3RydWN0IG12 c2RfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQo+IMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgaG9zdC0+cGlvX3NpemUgPSBkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzejsKPiDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGhvc3QtPnBpb19wdHIgPSBzZ192aXJ0KGRhdGEtPnNnKTsKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghbm9kbWEpCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBwcl9kZWJ1ZygiJXM6IGZhbGxiYWNrIHRvIFBJTyBmb3IgZGF0YSAiCj4g LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCAiYXQgMHglcCBzaXplICVkXG4iLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyks Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBob3N0LT5waW9fcHRyLCBob3N0LT5waW9fc2l6ZSk7Cj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9kZWJ1ZygiJXM6IGZhbGxiYWNrIHRvIFBJTyBmb3IgZGF0 YSBhdCAweCVwIHNpemUgJWRcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZShob3N0LT5tbWMpLAo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5waW9fcHRyLCBob3N0LT5w aW9fc2l6ZSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gMTsKPiDCoCDCoCDCoCDC oH0gZWxzZSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkbWFfYWRkcl90IHBoeXNfYWRkcjsK PiBAQCAtNDg5LDkgKzQ4OCw5IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBtdnNkX2lycShpbnQgaXJx LCB2b2lkICpkZXYpCj4gwqAgwqAgwqAgwqBpZiAoaXJxX2hhbmRsZWQpCj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqByZXR1cm4gSVJRX0hBTkRMRUQ7Cj4KPiAtIMKgIMKgIMKgIHByX2VycigiJXM6 IHVuaGFuZGxlZCBpbnRlcnJ1cHQgc3RhdHVzPTB4JTA0eCBlbj0weCUwNHggIgo+IC0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgInBpbz0lZFxuIiwgbW1jX2hvc3RuYW1lKGhvc3Qt Pm1tYyksIGludHJfc3RhdHVzLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg aG9zdC0+aW50cl9lbiwgaG9zdC0+cGlvX3NpemUpOwo+ICsgwqAgwqAgwqAgcHJfZXJyKCIlczog dW5oYW5kbGVkIGludGVycnVwdCBzdGF0dXM9MHglMDR4IGVuPTB4JTA0eCBwaW89JWRcbiIsCj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBpbnRyX3N0YXR1 cywKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgaG9zdC0+aW50cl9lbiwgaG9zdC0+cGlvX3NpemUp Owo+IMKgIMKgIMKgIMKgcmV0dXJuIElSUV9OT05FOwo+IMKgfQo+Cj4gQEAgLTUwNSwxMyArNTA0 LDEzIEBAIHN0YXRpYyB2b2lkIG12c2RfdGltZW91dF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEp Cj4gwqAgwqAgwqAgwqBzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwo+IMKg IMKgIMKgIMKgbXJxID0gaG9zdC0+bXJxOwo+IMKgIMKgIMKgIMKgaWYgKG1ycSkgewo+IC0gwqAg wqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogVGltZW91dCB3YWl0aW5nIGZvciBoYXJkd2Fy ZSBpbnRlcnJ1cHQuXG4iLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwo+IC0gwqAgwqAgwqAgwqAgwqAgwqAg wqAgcHJfZXJyKCIlczogaHdfc3RhdGU9MHglMDR4LCBpbnRyX3N0YXR1cz0weCUwNHggIgo+IC0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgImludHJfZW49MHgl MDR4XG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG12c2RfcmVhZChNVlNEX0hXX1NUQVRFKSwKPiAtIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG12c2RfcmVhZChNVlNE X05PUl9JTlRSX1NUQVRVUyksCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBtdnNkX3JlYWQoTVZTRF9OT1JfSU5UUl9FTikpOwo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgcHJfZXJyKCIlczogVGltZW91dCB3YWl0aW5nIGZvciBoYXJkd2FyZSBpbnRlcnJ1 cHRcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZSho b3N0LT5tbWMpKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2VycigiJXM6IGh3X3N0YXRl PTB4JTA0eCwgaW50cl9zdGF0dXM9MHglMDR4IGludHJfZW49MHglMDR4XG4iLAo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwKPiArIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbXZzZF9yZWFkKE1WU0RfSFdfU1RBVEUpLAo+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtdnNkX3JlYWQoTVZTRF9OT1JfSU5U Ul9TVEFUVVMpLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtdnNkX3JlYWQo TVZTRF9OT1JfSU5UUl9FTikpOwo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5tcnEg PSBOVUxMOwo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jIGIv ZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKPiBpbmRleCAxNDU1YmQ2Li5kZDUxNTliIDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCj4gKysrIGIvZHJpdmVy cy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKPiBAQCAtMTI2NCw5ICsxMjY0LDggQEAgc3RhdGljIHZv aWQgb21hcF9oc21tY19wcm90ZWN0X2NhcmQoc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCkK PiDCoCDCoCDCoCDCoGhvc3QtPnJlcXNfYmxvY2tlZCA9IDA7Cj4gwqAgwqAgwqAgwqBpZiAobW1j X3Nsb3QoaG9zdCkuZ2V0X2NvdmVyX3N0YXRlKGhvc3QtPmRldiwgaG9zdC0+c2xvdF9pZCkpIHsK PiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChob3N0LT5wcm90ZWN0X2NhcmQpIHsKPiAtIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2luZm8oIiVzOiBjb3ZlciBpcyBjbG9z ZWQsICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgImNhcmQgaXMgbm93IGFjY2Vzc2libGVcbiIsCj4gLSDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFt ZShob3N0LT5tbWMpKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2lu Zm8oIiVzOiBjb3ZlciBpcyBjbG9zZWQsIGNhcmQgaXMgbm93IGFjY2Vzc2libGVcbiIsCj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtbWNfaG9zdG5hbWUo aG9zdC0+bW1jKSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5w cm90ZWN0X2NhcmQgPSAwOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfQo+IMKgIMKgIMKgIMKg fSBlbHNlIHsKPiBAQCAtMTk2Nyw4ICsxOTY2LDcgQEAgc3RhdGljIGludCBfX2luaXQgb21hcF9o c21tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+Cj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAoaG9zdC0+Z290X2RiY2xrKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgaWYgKGNsa19lbmFibGUoaG9zdC0+ZGJjbGspICE9IDApCj4gLSDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBkZXZfZGJnKG1tY19kZXYoaG9z dC0+bW1jKSwgIkVuYWJsaW5nIGRlYm91bmNlIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg IiBjbGsgZmFpbGVkXG4iKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiRW5hYmxpbmcgZGVib3VuY2Ug Y2xrIGZhaWxlZFxuIik7Cj4gwqAgwqAgwqAgwqB9Cj4KPiDCoCDCoCDCoCDCoC8qIFNpbmNlIHdl IGRvIG9ubHkgU0cgZW11bGF0aW9uLCB3ZSBjYW4gaGF2ZSBhcyBtYW55IHNlZ3MKPiBAQCAtMjE2 OSw4ICsyMTY3LDcgQEAgc3RhdGljIGludCBvbWFwX2hzbW1jX3N1c3BlbmQoc3RydWN0IGRldmlj ZSAqZGV2KQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaG9zdC0+c2xvdF9pZCk7Cj4gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocmV0KSB7Cj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZXZfZGJnKG1tY19kZXYoaG9zdC0+ bW1jKSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgICJVbmFibGUgdG8gaGFuZGxlIE1NQyBib2FyZCIKPiAtIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICIgbGV2ZWwgc3VzcGVu ZFxuIik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCAiVW5hYmxlIHRvIGhhbmRsZSBNTUMgYm9hcmQgbGV2ZWwgc3VzcGVuZFxuIik7 Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5z dXNwZW5kZWQgPSAwOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgcmV0dXJuIHJldDsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0K PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYyBiL2RyaXZlcnMvbW1j L2hvc3Qvc2RoY2ktcGNpLmMKPiBpbmRleCA2ODc4YTk0Li42N2M1NzUxIDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKPiArKysgYi9kcml2ZXJzL21tYy9ob3N0L3Nk aGNpLXBjaS5jCj4gQEAgLTQ2MCw4ICs0NjAsNyBAQCBzdGF0aWMgaW50IGptaWNyb25fcHJvYmUo c3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwKQo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp ZiAoc2RfZGV2KSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwY2lfZGV2 X3B1dChzZF9kZXYpOwo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZGV2X2lu Zm8oJmNoaXAtPnBkZXYtPmRldiwgIlJlZnVzaW5nIHRvIGJpbmQgdG8gIgo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgInNlY29uZGFyeSBpbnRlcmZhY2Uu XG4iKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGRldl9pbmZvKCZjaGlw LT5wZGV2LT5kZXYsICJSZWZ1c2luZyB0byBiaW5kIHRvIHNlY29uZGFyeSBpbnRlcmZhY2VcbiIp Owo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIC1FTk9ERVY7Cj4g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAgwqAgwqAgwqB9Cj4gQEAgLTYyOCwxMCArNjI3 LDEwIEBAIHN0YXRpYyBpbnQgc3lza3RfcHJvYmVfc2xvdChzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3Qg KnNsb3QpCj4KPiDCoCDCoCDCoCDCoHU4IGJvYXJkX3JldiA9IHJlYWRiKHNsb3QtPmhvc3QtPmlv YWRkciArIFNZU0tUX0JPQVJEX1JFVik7Cj4gwqAgwqAgwqAgwqB1OCDCoGNoaXBfcmV2ID0gcmVh ZGIoc2xvdC0+aG9zdC0+aW9hZGRyICsgU1lTS1RfQ0hJUF9SRVYpOwo+IC0gwqAgwqAgwqAgZGV2 X2luZm8oJnNsb3QtPmNoaXAtPnBkZXYtPmRldiwgIlN5c0tvbm5lY3QgQ2FyZEJ1czJTRElPLCAi Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCJib2FyZCByZXYgJWQuJWQsIGNoaXAgcmV2ICVkLiVkXG4iLAo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBib2FyZF9y ZXYgPj4gNCwgYm9hcmRfcmV2ICYgMHhmLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjaGlwX3JldiA+PiA0LCDCoGNoaXBfcmV2 ICYgMHhmKTsKPiArIMKgIMKgIMKgIGRldl9pbmZvKCZzbG90LT5jaGlwLT5wZGV2LT5kZXYsCj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJTeXNLb25uZWN0IENhcmRCdXMyU0RJTywgYm9hcmQg cmV2ICVkLiVkLCBjaGlwIHJldiAlZC4lZFxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Ym9hcmRfcmV2ID4+IDQsIGJvYXJkX3JldiAmIDB4ZiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgY2hpcF9yZXYgPj4gNCwgwqBjaGlwX3JldiAmIDB4Zik7Cj4gwqAgwqAgwqAgwqBpZiAoY2hp cF9yZXYgPj0gMHgyMCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNsb3QtPmhvc3QtPnF1aXJr cyB8PSBTREhDSV9RVUlSS19GT1JDRV9ETUE7Cj4KPiBAQCAtOTI1LDggKzkyNCw3IEBAIHN0YXRp YyBpbnQgc2RoY2lfcGNpX2VuYWJsZV9kbWEoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCj4gwqAg wqAgwqAgwqBpZiAoKChwZGV2LT5jbGFzcyAmIDB4RkZGRjAwKSA9PSAoUENJX0NMQVNTX1NZU1RF TV9TREhDSSA8PCA4KSkgJiYKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgocGRldi0+Y2xhc3Mg JiAweDAwMDBGRikgIT0gUENJX1NESENJX0lGRE1BKSAmJgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgKGhvc3QtPmZsYWdzICYgU0RIQ0lfVVNFX1NETUEpKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCBkZXZfd2FybigmcGRldi0+ZGV2LCAiV2lsbCB1c2UgRE1BIG1vZGUgZXZlbiB0aG91Z2gg SFcgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgImRvZXNuJ3QgZnVsbHkg Y2xhaW0gdG8gc3VwcG9ydCBpdC5cbiIpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZGV2X3dh cm4oJnBkZXYtPmRldiwgIldpbGwgdXNlIERNQSBtb2RlIGV2ZW4gdGhvdWdoIEhXIGRvZXNuJ3Qg ZnVsbHkgY2xhaW0gdG8gc3VwcG9ydCBpdFxuIik7Cj4gwqAgwqAgwqAgwqB9Cj4KPiDCoCDCoCDC oCDCoHJldCA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Cj4gQEAg LTEyMDIsOCArMTIwMCw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKiBfX2Rldmlu aXQgc2RoY2lfcGNpX3Byb2JlX3Nsb3QoCj4gwqAgwqAgwqAgwqB9Cj4KPiDCoCDCoCDCoCDCoGlm IChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhcikgIT0gMHgxMDApIHsKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgaW9tZW0gc2l6ZS4gWW91IG1h eSAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiZXhwZXJpZW5jZSBwcm9i bGVtcy5cbiIpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZGV2X2VycigmcGRldi0+ZGV2LCAi SW52YWxpZCBpb21lbSBzaXplLiBZb3UgbWF5IGV4cGVyaWVuY2UgcHJvYmxlbXMuXG4iKTsKPiDC oCDCoCDCoCDCoH0KPgo+IMKgIMKgIMKgIMKgaWYgKChwZGV2LT5jbGFzcyAmIDB4MDAwMEZGKSA9 PSBQQ0lfU0RIQ0lfSUZWRU5ET1IpIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9z ZGhjaS1weGF2My5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2My5jCj4gaW5kZXggMTU2 NzNhNy4uMGQ4ZjA2MSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYz LmMKPiArKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYzLmMKPiBAQCAtODIsMTEgKzgy LDggQEAgc3RhdGljIHZvaWQgcHhhdjNfZ2VuX2luaXRfNzRfY2xvY2tzKHN0cnVjdCBzZGhjaV9o b3N0ICpob3N0LCB1OCBwb3dlcl9tb2RlKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgJiYgcG93ZXJfbW9kZSA9PSBNTUNfUE9XRVJfT04pIHsKPgo+IMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksCj4gLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiJXM6IHNsb3QtPnBvd2VyX21vZGUgPSAlZCwi Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiaW9zLT5w b3dlcl9tb2RlID0gJWRcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBfX2Z1bmNfXywKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHB4YS0+cG93ZXJfbW9kZSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHBvd2VyX21vZGUpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIiVzOiBzbG90LT5wb3dlcl9tb2RlID0gJWQsIGlv cy0+cG93ZXJfbW9kZSA9ICVkXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgX19mdW5jX18sIHB4YS0+cG93ZXJfbW9kZSwgcG93ZXJfbW9kZSk7Cj4K PiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8qIHNldCB3ZSB3YW50IG5vdGljZSBvZiB3aGVuIDc0 IGNsb2NrcyBhcmUgc2VudCAqLwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdG1wID0gcmVhZHco aG9zdC0+aW9hZGRyICsgU0RfQ0VfQVRBXzIpOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9o b3N0L3NkaGNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKPiBpbmRleCBkMTQ2YmZmLi5k MzFjMzFkIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwo+ICsrKyBiL2Ry aXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwo+IEBAIC0xMyw2ICsxMyw4IEBACj4gwqAqIMKgIMKgIC0g Sk1pY3JvbiAoaGFyZHdhcmUgYW5kIHRlY2huaWNhbCBzdXBwb3J0KQo+IMKgKi8KPgo+ICsjZGVm aW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Cj4gKwo+IMKgI2luY2x1ZGUg PGxpbnV4L2RlbGF5Lmg+Cj4gwqAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgo+IMKgI2luY2x1 ZGUgPGxpbnV4L2lvLmg+Cj4gQEAgLTMyLDggKzM0LDggQEAKPgo+IMKgI2RlZmluZSBEUklWRVJf TkFNRSAic2RoY2kiCj4KPiAtI2RlZmluZSBEQkcoZiwgeC4uLikgXAo+IC0gwqAgwqAgwqAgcHJf ZGVidWcoRFJJVkVSX05BTUUgIiBbJXMoKV06ICIgZiwgX19mdW5jX18sIyMgeCkKPiArI2RlZmlu ZSBEQkcoZm10LCAuLi4pIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgXAo+ICsgwqAgwqAgwqAgcHJfZGVidWcoIlslcygpXTogIiBm bXQsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQo+Cj4gwqAjaWYgZGVmaW5lZChDT05GSUdfTEVE U19DTEFTUykgfHwgKGRlZmluZWQoQ09ORklHX0xFRFNfQ0xBU1NfTU9EVUxFKSAmJiBcCj4gwqAg wqAgwqAgwqBkZWZpbmVkKENPTkZJR19NTUNfU0RIQ0lfTU9EVUxFKSkKPiBAQCAtNjgsNTEgKzcw LDUxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHNkaGNpX3J1bnRpbWVfcG1fcHV0KHN0cnVjdCBzZGhj aV9ob3N0ICpob3N0KQo+Cj4gwqBzdGF0aWMgdm9pZCBzZGhjaV9kdW1wcmVncyhzdHJ1Y3Qgc2Ro Y2lfaG9zdCAqaG9zdCkKPiDCoHsKPiAtIMKgIMKgIMKgIHByX2RlYnVnKERSSVZFUl9OQU1FICI6 ID09PT09PT09PT09IFJFR0lTVEVSIERVTVAgKCVzKT09PT09PT09PT09XG4iLAo+IC0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwo+IC0KPiAtIMKgIMKgIMKg IHByX2RlYnVnKERSSVZFUl9OQU1FICI6IFN5cyBhZGRyOiAweCUwOHggfCBWZXJzaW9uOiDCoDB4 JTA4eFxuIiwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNkaGNpX3JlYWRsKGhvc3QsIFNESENJ X0RNQV9BRERSRVNTKSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNkaGNpX3JlYWR3KGhvc3Qs IFNESENJX0hPU1RfVkVSU0lPTikpOwo+IC0gwqAgwqAgwqAgcHJfZGVidWcoRFJJVkVSX05BTUUg IjogQmxrIHNpemU6IDB4JTA4eCB8IEJsayBjbnQ6IMKgMHglMDh4XG4iLAo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfQkxPQ0tfU0laRSksCj4gLSDCoCDC oCDCoCDCoCDCoCDCoCDCoCBzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9CTE9DS19DT1VOVCkpOwo+ IC0gwqAgwqAgwqAgcHJfZGVidWcoRFJJVkVSX05BTUUgIjogQXJndW1lbnQ6IDB4JTA4eCB8IFRy biBtb2RlOiAweCUwOHhcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZGhjaV9yZWFkbCho b3N0LCBTREhDSV9BUkdVTUVOVCksCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZGhjaV9yZWFk dyhob3N0LCBTREhDSV9UUkFOU0ZFUl9NT0RFKSk7Cj4gLSDCoCDCoCDCoCBwcl9kZWJ1ZyhEUklW RVJfTkFNRSAiOiBQcmVzZW50OiDCoDB4JTA4eCB8IEhvc3QgY3RsOiAweCUwOHhcbiIsCj4gLSDC oCDCoCDCoCDCoCDCoCDCoCDCoCBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9QUkVTRU5UX1NUQVRF KSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNkaGNpX3JlYWRiKGhvc3QsIFNESENJX0hPU1Rf Q09OVFJPTCkpOwo+IC0gwqAgwqAgwqAgcHJfZGVidWcoRFJJVkVSX05BTUUgIjogUG93ZXI6IMKg IMKgMHglMDh4IHwgQmxrIGdhcDogwqAweCUwOHhcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCBzZGhjaV9yZWFkYihob3N0LCBTREhDSV9QT1dFUl9DT05UUk9MKSwKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHNkaGNpX3JlYWRiKGhvc3QsIFNESENJX0JMT0NLX0dBUF9DT05UUk9MKSk7Cj4g LSDCoCDCoCDCoCBwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBXYWtlLXVwOiDCoDB4JTA4eCB8IENs b2NrOiDCoCDCoDB4JTA4eFxuIiwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNkaGNpX3JlYWRi KGhvc3QsIFNESENJX1dBS0VfVVBfQ09OVFJPTCksCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBz ZGhjaV9yZWFkdyhob3N0LCBTREhDSV9DTE9DS19DT05UUk9MKSk7Cj4gLSDCoCDCoCDCoCBwcl9k ZWJ1ZyhEUklWRVJfTkFNRSAiOiBUaW1lb3V0OiDCoDB4JTA4eCB8IEludCBzdGF0OiAweCUwOHhc biIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZGhjaV9yZWFkYihob3N0LCBTREhDSV9USU1F T1VUX0NPTlRST0wpLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2RoY2lfcmVhZGwoaG9zdCwg U0RIQ0lfSU5UX1NUQVRVUykpOwo+IC0gwqAgwqAgwqAgcHJfZGVidWcoRFJJVkVSX05BTUUgIjog SW50IGVuYWI6IDB4JTA4eCB8IFNpZyBlbmFiOiAweCUwOHhcbiIsCj4gLSDCoCDCoCDCoCDCoCDC oCDCoCDCoCBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9JTlRfRU5BQkxFKSwKPiAtIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1NJR05BTF9FTkFCTEUpKTsKPiAt IMKgIMKgIMKgIHByX2RlYnVnKERSSVZFUl9OQU1FICI6IEFDMTIgZXJyOiAweCUwOHggfCBTbG90 IGludDogMHglMDh4XG4iLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2RoY2lfcmVhZHcoaG9z dCwgU0RIQ0lfQUNNRDEyX0VSUiksCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZGhjaV9yZWFk dyhob3N0LCBTREhDSV9TTE9UX0lOVF9TVEFUVVMpKTsKPiAtIMKgIMKgIMKgIHByX2RlYnVnKERS SVZFUl9OQU1FICI6IENhcHM6IMKgIMKgIDB4JTA4eCB8IENhcHNfMTogwqAgMHglMDh4XG4iLAo+ IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfQ0FQQUJJTElU SUVTKSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NB UEFCSUxJVElFU18xKSk7Cj4gLSDCoCDCoCDCoCBwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBDbWQ6 IMKgIMKgIMKgMHglMDh4IHwgTWF4IGN1cnI6IDB4JTA4eFxuIiwKPiAtIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0NPTU1BTkQpLAo+IC0gwqAgwqAgwqAgwqAg wqAgwqAgwqAgc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfTUFYX0NVUlJFTlQpKTsKPiAtIMKgIMKg IMKgIHByX2RlYnVnKERSSVZFUl9OQU1FICI6IEhvc3QgY3RsMjogMHglMDh4XG4iLAo+IC0gwqAg wqAgwqAgwqAgwqAgwqAgwqAgc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfSE9TVF9DT05UUk9MMikp Owo+ICsgwqAgwqAgwqAgcHJfZGVidWcoIj09PT09PT09PT09IFJFR0lTVEVSIERVTVAgKCVzKT09 PT09PT09PT09XG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtbWNfaG9zdG5hbWUoaG9z dC0+bW1jKSk7Cj4gKwo+ICsgwqAgwqAgwqAgcHJfZGVidWcoIlN5cyBhZGRyOiAweCUwOHggfCBW ZXJzaW9uOiDCoDB4JTA4eFxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2RoY2lfcmVh ZGwoaG9zdCwgU0RIQ0lfRE1BX0FERFJFU1MpLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBz ZGhjaV9yZWFkdyhob3N0LCBTREhDSV9IT1NUX1ZFUlNJT04pKTsKPiArIMKgIMKgIMKgIHByX2Rl YnVnKCJCbGsgc2l6ZTogMHglMDh4IHwgQmxrIGNudDogwqAweCUwOHhcbiIsCj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0JMT0NLX1NJWkUpLAo+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9CTE9DS19DT1VO VCkpOwo+ICsgwqAgwqAgwqAgcHJfZGVidWcoIkFyZ3VtZW50OiAweCUwOHggfCBUcm4gbW9kZTog MHglMDh4XG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzZGhjaV9yZWFkbChob3N0LCBT REhDSV9BUkdVTUVOVCksCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNkaGNpX3JlYWR3KGhv c3QsIFNESENJX1RSQU5TRkVSX01PREUpKTsKPiArIMKgIMKgIMKgIHByX2RlYnVnKCJQcmVzZW50 OiDCoDB4JTA4eCB8IEhvc3QgY3RsOiAweCUwOHhcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpLAo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBzZGhjaV9yZWFkYihob3N0LCBTREhDSV9IT1NUX0NPTlRST0wpKTsKPiAr IMKgIMKgIMKgIHByX2RlYnVnKCJQb3dlcjogwqAgwqAweCUwOHggfCBCbGsgZ2FwOiDCoDB4JTA4 eFxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2RoY2lfcmVhZGIoaG9zdCwgU0RIQ0lf UE9XRVJfQ09OVFJPTCksCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNkaGNpX3JlYWRiKGhv c3QsIFNESENJX0JMT0NLX0dBUF9DT05UUk9MKSk7Cj4gKyDCoCDCoCDCoCBwcl9kZWJ1ZygiV2Fr ZS11cDogwqAweCUwOHggfCBDbG9jazogwqAgwqAweCUwOHhcbiIsCj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHNkaGNpX3JlYWRiKGhvc3QsIFNESENJX1dBS0VfVVBfQ09OVFJPTCksCj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0NMT0NLX0NPTlRS T0wpKTsKPiArIMKgIMKgIMKgIHByX2RlYnVnKCJUaW1lb3V0OiDCoDB4JTA4eCB8IEludCBzdGF0 OiAweCUwOHhcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNkaGNpX3JlYWRiKGhvc3Qs IFNESENJX1RJTUVPVVRfQ09OVFJPTCksCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNkaGNp X3JlYWRsKGhvc3QsIFNESENJX0lOVF9TVEFUVVMpKTsKPiArIMKgIMKgIMKgIHByX2RlYnVnKCJJ bnQgZW5hYjogMHglMDh4IHwgU2lnIGVuYWI6IDB4JTA4eFxuIiwKPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfSU5UX0VOQUJMRSksCj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1NJR05BTF9FTkFCTEUpKTsK PiArIMKgIMKgIMKgIHByX2RlYnVnKCJBQzEyIGVycjogMHglMDh4IHwgU2xvdCBpbnQ6IDB4JTA4 eFxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lf QUNNRDEyX0VSUiksCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNkaGNpX3JlYWR3KGhvc3Qs IFNESENJX1NMT1RfSU5UX1NUQVRVUykpOwo+ICsgwqAgwqAgwqAgcHJfZGVidWcoIkNhcHM6IMKg IMKgIDB4JTA4eCB8IENhcHNfMTogwqAgMHglMDh4XG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9DQVBBQklMSVRJRVMpLAo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9DQVBBQklMSVRJRVNfMSkpOwo+ ICsgwqAgwqAgwqAgcHJfZGVidWcoIkNtZDogwqAgwqAgwqAweCUwOHggfCBNYXggY3VycjogMHgl MDh4XG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzZGhjaV9yZWFkdyhob3N0LCBTREhD SV9DT01NQU5EKSwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2RoY2lfcmVhZGwoaG9zdCwg U0RIQ0lfTUFYX0NVUlJFTlQpKTsKPiArIMKgIMKgIMKgIHByX2RlYnVnKCJIb3N0IGN0bDI6IDB4 JTA4eFxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2RoY2lfcmVhZHcoaG9zdCwgU0RI Q0lfSE9TVF9DT05UUk9MMikpOwo+Cj4gwqAgwqAgwqAgwqBpZiAoaG9zdC0+ZmxhZ3MgJiBTREhD SV9VU0VfQURNQSkKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2RlYnVnKERSSVZFUl9OQU1F ICI6IEFETUEgRXJyOiAweCUwOHggfCBBRE1BIFB0cjogMHglMDh4XG4iLAo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9BRE1BX0VS Uk9SKSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmVhZGwoaG9zdC0+aW9h ZGRyICsgU0RIQ0lfQURNQV9BRERSRVNTKSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9k ZWJ1ZygiQURNQSBFcnI6IDB4JTA4eCB8IEFETUEgUHRyOiAweCUwOHhcbiIsCj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX0FE TUFfRVJST1IpLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZWFkbCho b3N0LT5pb2FkZHIgKyBTREhDSV9BRE1BX0FERFJFU1MpKTsKPgo+IC0gwqAgwqAgwqAgcHJfZGVi dWcoRFJJVkVSX05BTUUgIjogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PVxuIik7Cj4gKyDCoCDCoCDCoCBwcl9kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PVxuIik7Cj4gwqB9Cj4KPiDCoC8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KlwKPiBAQCAtNDE3LDcgKzQxOSw3IEBAIHN0YXRpYyB2b2lkIHNkaGNpX3RyYW5zZmVyX3Bpbyhz dHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGJyZWFrOwo+IMKgIMKgIMKgIMKgfQo+Cj4gLSDCoCDCoCDCoCBEQkcoIlBJTyB0cmFuc2Zl ciBjb21wbGV0ZS5cbiIpOwo+ICsgwqAgwqAgwqAgREJHKCJQSU8gdHJhbnNmZXIgY29tcGxldGVc biIpOwo+IMKgfQo+Cj4gwqBzdGF0aWMgY2hhciAqc2RoY2lfa21hcF9hdG9taWMoc3RydWN0IHNj YXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCj4gQEAgLTc0NSw5ICs3NDcsOCBA QCBzdGF0aWMgdm9pZCBzZGhjaV9wcmVwYXJlX2RhdGEoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Qs IHN0cnVjdCBtbWNfY29tbWFuZCAqY21kKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHVu bGlrZWx5KGJyb2tlbikpIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGZv cl9lYWNoX3NnKGRhdGEtPnNnLCBzZywgZGF0YS0+c2dfbGVuLCBpKSB7Cj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoc2ctPmxlbmd0aCAmIDB4Mykg ewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgREJHKCJSZXZlcnRpbmcgdG8gUElPIGJlY2F1c2Ugb2YgIgo+IC0gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg InRyYW5zZmVyIHNpemUgKCVkKVxuIiwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNnLT5sZW5ndGgpOwo+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg REJHKCJSZXZlcnRpbmcgdG8gUElPIGJlY2F1c2Ugb2YgdHJhbnNmZXIgc2l6ZSAoJWQpXG4iLAo+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgc2ctPmxlbmd0aCk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5mbGFncyAmPSB+U0RIQ0lfUkVRX1VTRV9E TUE7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBicmVhazsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoH0KPiBAQCAtNzgwLDggKzc4MSw3IEBAIHN0YXRpYyB2b2lkIHNkaGNpX3ByZXBhcmVf ZGF0YShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jb21tYW5kICpjbWQpCj4g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAodW5saWtlbHkoYnJva2VuKSkgewo+IMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZm9yX2VhY2hfc2coZGF0YS0+c2csIHNnLCBkYXRh LT5zZ19sZW4sIGkpIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGlmIChzZy0+b2Zmc2V0ICYgMHgzKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBEQkcoIlJldmVydGluZyB0byBQSU8g YmVjYXVzZSBvZiAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiYmFkIGFsaWdubWVudFxuIik7Cj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBEQkco IlJldmVydGluZyB0byBQSU8gYmVjYXVzZSBvZiBiYWQgYWxpZ25tZW50XG4iKTsKPiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGhvc3Qt PmZsYWdzICY9IH5TREhDSV9SRVFfVVNFX0RNQTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOwo+IMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfQo+IEBAIC05NzIsOCArOTcyLDggQEAg c3RhdGljIHZvaWQgc2RoY2lfc2VuZF9jb21tYW5kKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBz dHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKPgo+IMKgIMKgIMKgIMKgd2hpbGUgKHNkaGNpX3JlYWRs KGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpICYgbWFzaykgewo+IMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgaWYgKHRpbWVvdXQgPT0gMCkgewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgcHJfZXJyKCIlczogQ29udHJvbGxlciBuZXZlciByZWxlYXNlZCAiCj4gLSDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiaW5oaWJpdCBiaXQocykuXG4i LCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBwcl9lcnIoIiVzOiBDb250cm9sbGVyIG5ldmVyIHJlbGVhc2VkIGluaGliaXQgYml0 KHMpXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBt bWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBzZGhjaV9kdW1wcmVncyhob3N0KTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGNtZC0+ZXJyb3IgPSAtRUlPOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+ZmluaXNoX3Rhc2tsZXQpOwo+IEBAIC0xMTU0 LDggKzExNTQsOCBAQCBzdGF0aWMgdm9pZCBzZGhjaV9zZXRfY2xvY2soc3RydWN0IHNkaGNpX2hv c3QgKmhvc3QsIHVuc2lnbmVkIGludCBjbG9jaykKPiDCoCDCoCDCoCDCoHdoaWxlICghKChjbGsg PSBzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9DTE9DS19DT05UUk9MKSkKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCYgU0RIQ0lfQ0xPQ0tfSU5UX1NUQUJMRSkpIHsKPiDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGlmICh0aW1lb3V0ID09IDApIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHByX2VycigiJXM6IEludGVybmFsIGNsb2NrIG5ldmVyICIKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJzdGFiaWxpc2VkLlxuIiwgbW1jX2hv c3RuYW1lKGhvc3QtPm1tYykpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg cHJfZXJyKCIlczogSW50ZXJuYWwgY2xvY2sgbmV2ZXIgc3RhYmlsaXNlZFxuIiwKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW1jX2hvc3RuYW1lKGhvc3Qt Pm1tYykpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2RoY2lfZHVtcHJl Z3MoaG9zdCk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm47Cj4g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4gQEAgLTE1OTIsOCArMTU5Miw3IEBAIHN0YXRpYyBp bnQgc2RoY2lfZG9fc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoKHN0cnVjdCBzZGhjaV9ob3N0 ICpob3N0LAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKCEoY3RybCAmIFNESENJX0NUUkxf VkREXzE4MCkpCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gMDsK PiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVsc2Ugewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcHJfaW5mbyhEUklWRVJfTkFNRSAiOiBTd2l0Y2hpbmcgdG8gMy4zViAiCj4g LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAic2lnbmFsbGlu ZyB2b2x0YWdlIGZhaWxlZFxuIik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBwcl9pbmZvKCJTd2l0Y2hpbmcgdG8gMy4zViBzaWduYWxsaW5nIHZvbHRhZ2UgZmFpbGVkXG4i KTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiAtRUlPOwo+IMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgfQo+IMKgIMKgIMKgIMKgfSBlbHNlIGlmICghKGN0cmwgJiBT REhDSV9DVFJMX1ZERF8xODApICYmCj4gQEAgLTE2NTEsOCArMTY1MCw3IEBAIHN0YXRpYyBpbnQg c2RoY2lfZG9fc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoKHN0cnVjdCBzZGhjaV9ob3N0ICpo b3N0LAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcHdyIHw9IFNESENJX1BPV0VSX09OOwo+IMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgc2RoY2lfd3JpdGViKGhvc3QsIHB3ciwgU0RIQ0lfUE9XRVJf Q09OVFJPTCk7Cj4KPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2luZm8oRFJJVkVSX05BTUUg IjogU3dpdGNoaW5nIHRvIDEuOFYgc2lnbmFsbGluZyAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAidm9sdGFnZSBmYWlsZWQsIHJldHJ5aW5nIHdpdGggUzE4UiBzZXQgdG8g MFxuIik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9pbmZvKCJTd2l0Y2hpbmcgdG8gMS44 ViBzaWduYWxsaW5nIHZvbHRhZ2UgZmFpbGVkLCByZXRyeWluZyB3aXRoIFMxOFIgc2V0IHRvIDBc biIpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIC1FQUdBSU47Cj4gwqAgwqAgwqAg wqB9IGVsc2UKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8qIE5vIHNpZ25hbCB2b2x0YWdlIHN3 aXRjaCByZXF1aXJlZCAqLwo+IEBAIC0xNzc0LDEwICsxNzcyLDcgQEAgc3RhdGljIGludCBzZGhj aV9leGVjdXRlX3R1bmluZyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKPiDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHNwaW5fbG9jaygmaG9zdC0+bG9jayk7Cj4KPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlmICghaG9zdC0+dHVuaW5nX2RvbmUpIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHByX2luZm8oRFJJVkVSX05BTUUgIjogVGltZW91dCB3YWl0aW5nIGZvciAiCj4gLSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiQnVmZmVyIFJlYWQg UmVhZHkgaW50ZXJydXB0IGR1cmluZyB0dW5pbmcgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgInByb2NlZHVyZSwgZmFsbGluZyBiYWNrIHRvIGZpeGVk IHNhbXBsaW5nICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgICJjbG9ja1xuIik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9p bmZvKCJUaW1lb3V0IHdhaXRpbmcgZm9yIEJ1ZmZlciBSZWFkIFJlYWR5IGludGVycnVwdCBkdXJp bmcgdHVuaW5nIHByb2NlZHVyZSwgZmFsbGluZyBiYWNrIHRvIGZpeGVkIHNhbXBsaW5nIGNsb2Nr XG4iKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGN0cmwgPSBzZGhjaV9y ZWFkdyhob3N0LCBTREhDSV9IT1NUX0NPTlRST0wyKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGN0cmwgJj0gflNESENJX0NUUkxfVFVORURfQ0xLOwo+IMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY3RybCAmPSB+U0RIQ0lfQ1RSTF9FWEVDX1RVTklORzsK PiBAQCAtMTgwNCw5ICsxNzk5LDcgQEAgc3RhdGljIGludCBzZGhjaV9leGVjdXRlX3R1bmluZyhz dHJ1Y3QgbW1jX2hvc3QgKm1tYykKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNkaGNpX3dyaXRl dyhob3N0LCBjdHJsLCBTREhDSV9IT1NUX0NPTlRST0wyKTsKPiDCoCDCoCDCoCDCoH0gZWxzZSB7 Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoIShjdHJsICYgU0RIQ0lfQ1RSTF9UVU5FRF9D TEspKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9pbmZvKERSSVZF Ul9OQU1FICI6IFR1bmluZyBwcm9jZWR1cmUiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCAiIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGZpeGVkIHNhbXBs aW5nIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIiBj bG9ja1xuIik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9pbmZvKCJU dW5pbmcgcHJvY2VkdXJlIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGZpeGVkIHNhbXBsaW5nIGNs b2NrXG4iKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVyciA9IC1FSU87 Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAgwqAgwqAgwqB9Cj4gQEAgLTIwMTAsOCAr MjAwMyw4IEBAIHN0YXRpYyB2b2lkIHNkaGNpX3RpbWVvdXRfdGltZXIodW5zaWduZWQgbG9uZyBk YXRhKQo+IMKgIMKgIMKgIMKgc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsK Pgo+IMKgIMKgIMKgIMKgaWYgKGhvc3QtPm1ycSkgewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg cHJfZXJyKCIlczogVGltZW91dCB3YWl0aW5nIGZvciBoYXJkd2FyZSAiCj4gLSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiaW50ZXJydXB0LlxuIiwgbW1jX2hvc3RuYW1lKGhvc3Qt Pm1tYykpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogVGltZW91dCB3YWl0 aW5nIGZvciBoYXJkd2FyZSBpbnRlcnJ1cHRcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHNkaGNpX2R1bXByZWdzKGhvc3QpOwo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAo aG9zdC0+ZGF0YSkgewo+IEBAIC0yMDU2LDkgKzIwNDksOCBAQCBzdGF0aWMgdm9pZCBzZGhjaV9j bWRfaXJxKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MzIgaW50bWFzaykKPiDCoCDCoCDCoCDC oEJVR19PTihpbnRtYXNrID09IDApOwo+Cj4gwqAgwqAgwqAgwqBpZiAoIWhvc3QtPmNtZCkgewo+ IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogR290IGNvbW1hbmQgaW50ZXJydXB0 IDB4JTA4eCBldmVuICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJ0aG91 Z2ggbm8gY29tbWFuZCBvcGVyYXRpb24gd2FzIGluIHByb2dyZXNzLlxuIiwKPiAtIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCAodW5zaWdu ZWQpaW50bWFzayk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiBHb3QgY29t bWFuZCBpbnRlcnJ1cHQgMHglMDh4IGV2ZW4gdGhvdWdoIG5vIGNvbW1hbmQgb3BlcmF0aW9uIHdh cyBpbiBwcm9ncmVzc1xuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW1j X2hvc3RuYW1lKGhvc3QtPm1tYyksICh1bnNpZ25lZClpbnRtYXNrKTsKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHNkaGNpX2R1bXByZWdzKGhvc3QpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg cmV0dXJuOwo+IMKgIMKgIMKgIMKgfQo+IEBAIC0yMDg3LDggKzIwNzksNyBAQCBzdGF0aWMgdm9p ZCBzZGhjaV9jbWRfaXJxKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MzIgaW50bWFzaykKPiDC oCDCoCDCoCDCoCAqLwo+IMKgIMKgIMKgIMKgaWYgKGhvc3QtPmNtZC0+ZmxhZ3MgJiBNTUNfUlNQ X0JVU1kpIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChob3N0LT5jbWQtPmRhdGEpCj4g LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBEQkcoIkNhbm5vdCB3YWl0IGZvciBi dXN5IHNpZ25hbCB3aGVuIGFsc28gIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgImRvaW5nIGEgZGF0YSB0cmFuc2ZlciIpOwo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgREJHKCJDYW5ub3Qgd2FpdCBmb3IgYnVzeSBzaWduYWwgd2hl biBhbHNvIGRvaW5nIGEgZGF0YSB0cmFuc2ZlclxuIik7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBlbHNlIGlmICghKGhvc3QtPnF1aXJrcyAmIFNESENJX1FVSVJLX05PX0JVU1lfSVJRKSkKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybjsKPgo+IEBAIC0yMTU2LDkg KzIxNDcsOCBAQCBzdGF0aWMgdm9pZCBzZGhjaV9kYXRhX2lycShzdHJ1Y3Qgc2RoY2lfaG9zdCAq aG9zdCwgdTMyIGludG1hc2spCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9 Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4KPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHBy X2VycigiJXM6IEdvdCBkYXRhIGludGVycnVwdCAweCUwOHggZXZlbiAiCj4gLSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAidGhvdWdoIG5vIGRhdGEgb3BlcmF0aW9uIHdhcyBpbiBw cm9ncmVzcy5cbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtbWNfaG9z dG5hbWUoaG9zdC0+bW1jKSwgKHVuc2lnbmVkKWludG1hc2spOwo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgcHJfZXJyKCIlczogR290IGRhdGEgaW50ZXJydXB0IDB4JTA4eCBldmVuIHRob3VnaCBu byBkYXRhIG9wZXJhdGlvbiB3YXMgaW4gcHJvZ3Jlc3NcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCAodW5zaWduZWQpaW50bWFz ayk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzZGhjaV9kdW1wcmVncyhob3N0KTsKPgo+IMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuOwo+IEBAIC0yMjA0LDEwICsyMTk0LDkgQEAgc3Rh dGljIHZvaWQgc2RoY2lfZGF0YV9pcnEoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHUzMiBpbnRt YXNrKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfihT REhDSV9ERUZBVUxUX0JPVU5EQVJZX1NJWkUgLSAxKSkgKwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgU0RIQ0lfREVGQVVMVF9CT1VOREFSWV9TSVpFOwo+ IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaG9zdC0+ZGF0YS0+Ynl0ZXNfeGZl cmVkID0gZG1hbm93IC0gZG1hc3RhcnQ7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBEQkcoIiVzOiBETUEgYmFzZSAweCUwOHgsIHRyYW5zZmVycmVkIDB4JTA2eCBieXRlcywi Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiIG5leHQg MHglMDh4XG4iLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIGRtYXN0YXJ0LAo+IC0gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaG9zdC0+ZGF0YS0+Ynl0ZXNfeGZlcmVkLCBk bWFub3cpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgREJHKCIlczogRE1B IGJhc2UgMHglMDh4LCB0cmFuc2ZlcnJlZCAweCUwNnggYnl0ZXMsIG5leHQgMHglMDh4XG4iLAo+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbW1jX2hvc3RuYW1lKGhv c3QtPm1tYyksIGRtYXN0YXJ0LAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgaG9zdC0+ZGF0YS0+Ynl0ZXNfeGZlcmVkLCBkbWFub3cpOwo+IMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgc2RoY2lfd3JpdGVsKGhvc3QsIGRtYW5vdywgU0RIQ0lfRE1B X0FERFJFU1MpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfQo+Cj4gQEAgLTIyNTAsNyArMjIz OSw3IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBzZGhjaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lk KQo+IMKgIMKgIMKgIMKgfQo+Cj4gwqAgwqAgwqAgwqBEQkcoIioqKiAlcyBnb3QgaW50ZXJydXB0 OiAweCUwOHhcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtbWNfaG9zdG5hbWUoaG9zdC0+ bW1jKSwgaW50bWFzayk7Cj4gKyDCoCDCoCDCoCDCoCDCoCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1j KSwgaW50bWFzayk7Cj4KPiDCoCDCoCDCoCDCoGlmIChpbnRtYXNrICYgKFNESENJX0lOVF9DQVJE X0lOU0VSVCB8IFNESENJX0lOVF9DQVJEX1JFTU9WRSkpIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHUzMiBwcmVzZW50ID0gc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfUFJFU0VOVF9TVEFURSkg Jgo+IEBAIC0yNTQ4LDkgKzI1MzcsOCBAQCBpbnQgc2RoY2lfYWRkX2hvc3Qoc3RydWN0IHNkaGNp X2hvc3QgKmhvc3QpCj4gwqAgwqAgwqAgwqBob3N0LT52ZXJzaW9uID0gKGhvc3QtPnZlcnNpb24g JiBTREhDSV9TUEVDX1ZFUl9NQVNLKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgPj4gU0RIQ0lfU1BFQ19WRVJfU0hJRlQ7Cj4gwqAgwqAgwqAgwqBpZiAo aG9zdC0+dmVyc2lvbiA+IFNESENJX1NQRUNfMzAwKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCBwcl9lcnIoIiVzOiBVbmtub3duIGNvbnRyb2xsZXIgdmVyc2lvbiAoJWQpLiAiCj4gLSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiWW91IG1heSBleHBlcmllbmNlIHByb2JsZW1z LlxuIiwgbW1jX2hvc3RuYW1lKG1tYyksCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBob3N0LT52ZXJzaW9uKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2VycigiJXM6 IFVua25vd24gY29udHJvbGxlciB2ZXJzaW9uICglZCkuIFlvdSBtYXkgZXhwZXJpZW5jZSBwcm9i bGVtcy5cbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19ob3N0bmFt ZShtbWMpLCBob3N0LT52ZXJzaW9uKTsKPiDCoCDCoCDCoCDCoH0KPgo+IMKgIMKgIMKgIMKgY2Fw c1swXSA9IChob3N0LT5xdWlya3MgJiBTREhDSV9RVUlSS19NSVNTSU5HX0NBUFMpID8gaG9zdC0+ Y2FwcyA6Cj4gQEAgLTI2MzEsOCArMjYxOSw4IEBAIGludCBzZGhjaV9hZGRfaG9zdChzdHJ1Y3Qg c2RoY2lfaG9zdCAqaG9zdCkKPiDCoCDCoCDCoCDCoGlmIChob3N0LT5tYXhfY2xrID09IDAgfHwg aG9zdC0+cXVpcmtzICYKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFNESENJ X1FVSVJLX0NBUF9DTE9DS19CQVNFX0JST0tFTikgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg aWYgKCFob3N0LT5vcHMtPmdldF9tYXhfY2xvY2spIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHByX2VycigiJXM6IEhhcmR3YXJlIGRvZXNuJ3Qgc3BlY2lmeSBiYXNlIGNs b2NrICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgImZy ZXF1ZW5jeS5cbiIsIG1tY19ob3N0bmFtZShtbWMpKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHByX2VycigiJXM6IEhhcmR3YXJlIGRvZXNuJ3Qgc3BlY2lmeSBiYXNlIGNs b2NrIGZyZXF1ZW5jeVxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgbW1jX2hvc3RuYW1lKG1tYykpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgcmV0dXJuIC1FTk9ERVY7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5tYXhfY2xrID0gaG9zdC0+b3BzLT5nZXRfbWF4X2Ns b2NrKGhvc3QpOwo+IEBAIC0yNjc3LDggKzI2NjUsOCBAQCBpbnQgc2RoY2lfYWRkX2hvc3Qoc3Ry dWN0IHNkaGNpX2hvc3QgKmhvc3QpCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBob3N0LT50aW1lb3V0X2NsayA9IGhvc3QtPm9wcy0+Z2V0X3RpbWVvdXRfY2xvY2soaG9zdCk7 Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2UgaWYgKCEoaG9zdC0+cXVpcmtzICYKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFNESENJX1FVSVJL X0RBVEFfVElNRU9VVF9VU0VTX1NEQ0xLKSkgewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgcHJfZXJyKCIlczogSGFyZHdhcmUgZG9lc24ndCBzcGVjaWZ5IHRpbWVvdXQgY2xv Y2sgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAiZnJl cXVlbmN5LlxuIiwgbW1jX2hvc3RuYW1lKG1tYykpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcHJfZXJyKCIlczogSGFyZHdhcmUgZG9lc24ndCBzcGVjaWZ5IHRpbWVvdXQg Y2xvY2sgZnJlcXVlbmN5XG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBtbWNfaG9zdG5hbWUobW1jKSk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqByZXR1cm4gLUVOT0RFVjsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0KPiDC oCDCoCDCoCDCoH0KPiBAQCAtMjg0NSw4ICsyODMzLDggQEAgaW50IHNkaGNpX2FkZF9ob3N0KHN0 cnVjdCBzZGhjaV9ob3N0ICpob3N0KQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW1jLT5vY3Jf YXZhaWxfbW1jICY9IGhvc3QtPm9jcl9hdmFpbF9tbWM7Cj4KPiDCoCDCoCDCoCDCoGlmIChtbWMt Pm9jcl9hdmFpbCA9PSAwKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiBI YXJkd2FyZSBkb2Vzbid0IHJlcG9ydCBhbnkgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgInN1cHBvcnQgdm9sdGFnZXMuXG4iLCBtbWNfaG9zdG5hbWUobW1jKSk7Cj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiBIYXJkd2FyZSBkb2Vzbid0IHJlcG9ydCBh bnkgc3VwcG9ydCB2b2x0YWdlc1xuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgbW1jX2hvc3RuYW1lKG1tYykpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIC1F Tk9ERVY7Cj4gwqAgwqAgwqAgwqB9Cj4KPiBAQCAtMjk5NCw4ICsyOTgyLDggQEAgdm9pZCBzZGhj aV9yZW1vdmVfaG9zdChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IGRlYWQpCj4gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBob3N0LT5mbGFncyB8PSBTREhDSV9ERVZJQ0VfREVBRDsKPgo+IMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGhvc3QtPm1ycSkgewo+IC0gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogQ29udHJvbGxlciByZW1vdmVkIGR1cmluZyAi Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiIHRyYW5z ZmVyIVxuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogQ29udHJvbGxlciByZW1vdmVkIGR1cmluZyB0cmFu c2ZlciFcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKPgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgaG9zdC0+bXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKPiDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmZpbmlzaF90 YXNrbGV0KTsKPiBAQCAtMzA1Myw5ICszMDQxLDggQEAgRVhQT1JUX1NZTUJPTF9HUEwoc2RoY2lf ZnJlZV9ob3N0KTsKPgo+IMKgc3RhdGljIGludCBfX2luaXQgc2RoY2lfZHJ2X2luaXQodm9pZCkK PiDCoHsKPiAtIMKgIMKgIMKgIHByX2luZm8oRFJJVkVSX05BTUUKPiAtIMKgIMKgIMKgIMKgIMKg IMKgIMKgICI6IFNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgZHJpdmVy XG4iKTsKPiAtIMKgIMKgIMKgIHByX2luZm8oRFJJVkVSX05BTUUgIjogQ29weXJpZ2h0KGMpIFBp ZXJyZSBPc3NtYW5cbiIpOwo+ICsgwqAgwqAgwqAgcHJfaW5mbygiU2VjdXJlIERpZ2l0YWwgSG9z dCBDb250cm9sbGVyIEludGVyZmFjZSBkcml2ZXJcbiIpOwo+ICsgwqAgwqAgwqAgcHJfaW5mbygi Q29weXJpZ2h0KGMpIFBpZXJyZSBPc3NtYW5cbiIpOwo+Cj4gwqAgwqAgwqAgwqByZXR1cm4gMDsK PiDCoH0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZHJpY29oX2NzLmMgYi9kcml2 ZXJzL21tYy9ob3N0L3Nkcmljb2hfY3MuYwo+IGluZGV4IDcwMDlmMTcuLjFlMzAyNDUgMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZHJpY29oX2NzLmMKPiArKysgYi9kcml2ZXJzL21t Yy9ob3N0L3Nkcmljb2hfY3MuYwo+IEBAIC0zMTAsOCArMzEwLDggQEAgc3RhdGljIHZvaWQgc2Ry aWNvaF9yZXF1ZXN0KHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1y cSkKPgo+IMKgIMKgIMKgIMKgLyogdHJhbnNmZXIgZGF0YSAqLwo+IMKgIMKgIMKgIMKgaWYgKGRh dGEgJiYgY21kLT5lcnJvciA9PSAwKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBkZXZfZGJn KGRldiwgInRyYW5zZmVyOiBibGtzeiAlaSBibG9ja3MgJWkgc2dfbGVuICVpICIKPiAtIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJzZyBsZW5ndGggJWlcbiIsIGRhdGEtPmJsa3N6 LCBkYXRhLT5ibG9ja3MsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBkZXZfZGJnKGRldiwgInRy YW5zZmVyOiBibGtzeiAlaSBibG9ja3MgJWkgc2dfbGVuICVpIHNnIGxlbmd0aCAlaVxuIiwKPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGRhdGEtPmJsa3N6LCBkYXRhLT5ibG9j a3MsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkYXRhLT5zZ19sZW4sIGRh dGEtPnNnLT5sZW5ndGgpOwo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBlbnRlciBkYXRh IHJlYWRpbmcgbW9kZSAqLwo+IEBAIC0zMzAsOCArMzMwLDggQEAgc3RhdGljIHZvaWQgc2RyaWNv aF9yZXF1ZXN0KHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkK PiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGt1bm1hcChwYWdlKTsKPiDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwo+ IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHJlc3VsdCkgewo+IC0gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZGV2X2VycihkZXYsICJz ZHJpY29oX3JlcXVlc3Q6IGNtZCAlaSAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiYmxvY2sgdHJhbnNmZXIgZmFpbGVkXG4iLCBj bWQtPm9wY29kZSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBkZXZfZXJyKGRldiwgInNkcmljb2hfcmVxdWVzdDogY21kICVpIGJsb2NrIHRyYW5zZmVy IGZhaWxlZFxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGNtZC0+b3Bjb2RlKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNtZC0+ZXJyb3IgPSByZXN1bHQ7Cj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazsKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZQo+IEBAIC00NzYsOCArNDc2LDggQEAgc3RhdGlj IGludCBzZHJpY29oX3BjbWNpYV9wcm9iZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2Rl dikKPiDCoHsKPiDCoCDCoCDCoCDCoHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKPgo+ IC0gwqAgwqAgwqAgZGV2X2luZm8oJnBjbWNpYV9kZXYtPmRldiwgIlNlYXJjaGluZyBNTUMgY29u dHJvbGxlciBmb3IgcGNtY2lhIGRldmljZSIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgICIgJXMg JXMgLi4uXG4iLCBwY21jaWFfZGV2LT5wcm9kX2lkWzBdLCBwY21jaWFfZGV2LT5wcm9kX2lkWzFd KTsKPiArIMKgIMKgIMKgIGRldl9pbmZvKCZwY21jaWFfZGV2LT5kZXYsICJTZWFyY2hpbmcgTU1D IGNvbnRyb2xsZXIgZm9yIHBjbWNpYSBkZXZpY2UgJXMgJXMgLi4uXG4iLAo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBwY21jaWFfZGV2LT5wcm9kX2lkWzBdLCBwY21jaWFfZGV2LT5wcm9kX2lk WzFdKTsKPgo+IMKgIMKgIMKgIMKgLyogc2VhcmNoIHBjaSBjYXJkYnVzIGJyaWRnZSB0aGF0IGNv bnRhaW5zIHRoZSBtbWMgY29udHJvbGxlciAqLwo+IMKgIMKgIMKgIMKgLyogdGhlIGlvIHJlZ2lv biBpcyBhbHJlYWR5IGNsYWltZWQgYnkgeWVudGFfc29ja2V0Li4uICovCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvbW1jL2hvc3QvdGlmbV9zZC5jIGIvZHJpdmVycy9tbWMvaG9zdC90aWZtX3NkLmMK PiBpbmRleCA1NWQ2YzYwLi5kNDMyNTk3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qv dGlmbV9zZC5jCj4gKysrIGIvZHJpdmVycy9tbWMvaG9zdC90aWZtX3NkLmMKPiBAQCAtNzg3LDkg Kzc4Nyw5IEBAIHN0YXRpYyB2b2lkIHRpZm1fc2RfYWJvcnQodW5zaWduZWQgbG9uZyBkYXRhKQo+ IMKgewo+IMKgIMKgIMKgIMKgc3RydWN0IHRpZm1fc2QgKmhvc3QgPSAoc3RydWN0IHRpZm1fc2Qq KWRhdGE7Cj4KPiAtIMKgIMKgIMKgIHByX2VycigiJXMgOiBjYXJkIGZhaWxlZCB0byByZXNwb25k IGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAiKCV4 LCAleClcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoGRldl9uYW1lKCZob3N0LT5kZXYtPmRl diksIGhvc3QtPnJlcS0+Y21kLT5vcGNvZGUsIGhvc3QtPmNtZF9mbGFncyk7Cj4gKyDCoCDCoCDC oCBwcl9lcnIoIiVzIDogY2FyZCBmYWlsZWQgdG8gcmVzcG9uZCBmb3IgYSBsb25nIHBlcmlvZCBv ZiB0aW1lICgleCwgJXgpXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZXZfbmFtZSgmaG9z dC0+ZGV2LT5kZXYpLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqBob3N0LT5yZXEtPmNtZC0+b3Bj b2RlLCBob3N0LT5jbWRfZmxhZ3MpOwo+Cj4gwqAgwqAgwqAgwqB0aWZtX2VqZWN0KGhvc3QtPmRl dik7Cj4gwqB9Cj4gQEAgLTgwMyw4ICs4MDMsNyBAQCBzdGF0aWMgdm9pZCB0aWZtX3NkX2lvcyhz dHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19pb3MgKmlvcykKPgo+IMKgIMKgIMKgIMKg c3Bpbl9sb2NrX2lycXNhdmUoJnNvY2stPmxvY2ssIGZsYWdzKTsKPgo+IC0gwqAgwqAgwqAgZGV2 X2RiZygmc29jay0+ZGV2LCAiaW9zOiBjbG9jayA9ICV1LCB2ZGQgPSAleCwgYnVzX21vZGUgPSAl eCwgIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgImNoaXBfc2VsZWN0ID0gJXgsIHBvd2VyX21v ZGUgPSAleCwgYnVzX3dpZHRoID0gJXhcbiIsCj4gKyDCoCDCoCDCoCBkZXZfZGJnKCZzb2NrLT5k ZXYsICJpb3M6IGNsb2NrID0gJXUsIHZkZCA9ICV4LCBidXNfbW9kZSA9ICV4LCBjaGlwX3NlbGVj dCA9ICV4LCBwb3dlcl9tb2RlID0gJXgsIGJ1c193aWR0aCA9ICV4XG4iLAo+IMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgaW9zLT5jbG9jaywgaW9zLT52ZGQsIGlvcy0+YnVzX21vZGUsIGlvcy0+Y2hp cF9zZWxlY3QsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpb3MtPnBvd2VyX21vZGUsIGlvcy0+ YnVzX3dpZHRoKTsKPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3ZpYS1zZG1tYy5j IGIvZHJpdmVycy9tbWMvaG9zdC92aWEtc2RtbWMuYwo+IGluZGV4IDRiODNjNDMuLmRjNDc5YjAg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tbWMvaG9zdC92aWEtc2RtbWMuYwo+ICsrKyBiL2RyaXZl cnMvbW1jL2hvc3QvdmlhLXNkbW1jLmMKPiBAQCAtOCw2ICs4LDggQEAKPiDCoCogeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgo+IMKgKi8KPgo+ICsjZGVmaW5lIHByX2ZtdChmbXQpIEtC VUlMRF9NT0ROQU1FICI6ICIgZm10Cj4gKwo+IMKgI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+IMKg I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+IMKgI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5n Lmg+Cj4gQEAgLTgzOCw4ICs4NDAsNyBAQCBzdGF0aWMgdm9pZCB2aWFfc2RjX2NtZF9pc3Ioc3Ry dWN0IHZpYV9jcmRyX21tY19ob3N0ICpob3N0LCB1MTYgaW50bWFzaykKPiDCoCDCoCDCoCDCoEJV R19PTihpbnRtYXNrID09IDApOwo+Cj4gwqAgwqAgwqAgwqBpZiAoIWhvc3QtPmNtZCkgewo+IC0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogR290IGNvbW1hbmQgaW50ZXJydXB0IDB4 JXggZXZlbiAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJ0aG91Z2ggbm8g Y29tbWFuZCBvcGVyYXRpb24gd2FzIGluIHByb2dyZXNzLlxuIiwKPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHByX2VycigiJXM6IEdvdCBjb21tYW5kIGludGVycnVwdCAweCV4IGV2ZW4gdGhvdWdo IG5vIGNvbW1hbmQgb3BlcmF0aW9uIHdhcyBpbiBwcm9ncmVzc1xuIiwKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgaW50bWFzayk7Cj4g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm47Cj4gwqAgwqAgwqAgwqB9Cj4gQEAgLTk0MSw4 ICs5NDIsOCBAQCBzdGF0aWMgdm9pZCB2aWFfc2RjX3RpbWVvdXQodW5zaWduZWQgbG9uZyB1bG9u Z2RhdGEpCj4gwqAgwqAgwqAgwqBzcGluX2xvY2tfaXJxc2F2ZSgmc2Rob3N0LT5sb2NrLCBmbGFn cyk7Cj4KPiDCoCDCoCDCoCDCoGlmIChzZGhvc3QtPm1ycSkgewo+IC0gwqAgwqAgwqAgwqAgwqAg wqAgwqAgcHJfZXJyKCIlczogVGltZW91dCB3YWl0aW5nIGZvciBoYXJkd2FyZSBpbnRlcnJ1cHQu Igo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAiY21kOjB4JXhcbiIsIG1tY19o b3N0bmFtZShzZGhvc3QtPm1tYyksCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVz OiBUaW1lb3V0IHdhaXRpbmcgZm9yIGhhcmR3YXJlIGludGVycnVwdC5jbWQ6MHgleFxuIiwKPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW1jX2hvc3RuYW1lKHNkaG9zdC0+bW1j KSwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZGhvc3QtPm1ycS0+Y21kLT5v cGNvZGUpOwo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoc2Rob3N0LT5kYXRhKSB7Cj4g QEAgLTEwOTEsOCArMTA5Miw3IEBAIHN0YXRpYyBpbnQgX19kZXZpbml0IHZpYV9zZF9wcm9iZShz dHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAo+IMKgIMKgIMKgIMKgdTggwqBnYXR0Owo+IMKgIMKgIMKg IMKgaW50IHJldDsKPgo+IC0gwqAgwqAgwqAgcHJfaW5mbyhEUlZfTkFNRQo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgIjogVklBIFNETU1DIGNvbnRyb2xsZXIgZm91bmQgYXQgJXMgWyUwNHg6JTA0 eF0gKHJldiAleClcbiIsCj4gKyDCoCDCoCDCoCBwcl9pbmZvKCJWSUEgU0RNTUMgY29udHJvbGxl ciBmb3VuZCBhdCAlcyBbJTA0eDolMDR4XSAocmV2ICV4KVxuIiwKPiDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHBjaV9uYW1lKHBjaWRldiksIChpbnQpcGNpZGV2LT52ZW5kb3IsIChpbnQpcGNpZGV2 LT5kZXZpY2UsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoaW50KXBjaWRldi0+cmV2aXNpb24p Owo+Cj4gQEAgLTExOTIsOCArMTE5Miw4IEBAIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2aWFfc2Rf cmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCj4gwqAgwqAgwqAgwqBtbWlvd2IoKTsKPgo+ IMKgIMKgIMKgIMKgaWYgKHNkaG9zdC0+bXJxKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBw cl9lcnIoIiVzOiBDb250cm9sbGVyIHJlbW92ZWQgZHVyaW5nICIKPiAtIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgICJ0cmFuc2ZlclxuIiwgbW1jX2hvc3RuYW1lKHNkaG9zdC0+bW1j KSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiBDb250cm9sbGVyIHJlbW92 ZWQgZHVyaW5nIHRyYW5zZmVyXG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBtbWNfaG9zdG5hbWUoc2Rob3N0LT5tbWMpKTsKPgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg LyogbWFrZSBzdXJlIGFsbCBETUEgaXMgc3RvcHBlZCAqLwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgd3JpdGVsKFZJQV9DUkRSX0RNQUNUUkxfU0ZUUlNULAo+IEBAIC0xMjI1LDggKzEyMjUsNyBA QCBzdGF0aWMgdm9pZCBfX2RldmV4aXQgdmlhX3NkX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNp ZGV2KQo+IMKgIMKgIMKgIMKgcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lkZXYpOwo+IMKgIMKgIMKg IMKgcGNpX2Rpc2FibGVfZGV2aWNlKHBjaWRldik7Cj4KPiAtIMKgIMKgIMKgIHByX2luZm8oRFJW X05BTUUKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgICI6IFZJQSBTRE1NQyBjb250cm9sbGVyIGF0 ICVzIFslMDR4OiUwNHhdIGhhcyBiZWVuIHJlbW92ZWRcbiIsCj4gKyDCoCDCoCDCoCBwcl9pbmZv KCJWSUEgU0RNTUMgY29udHJvbGxlciBhdCAlcyBbJTA0eDolMDR4XSBoYXMgYmVlbiByZW1vdmVk XG4iLAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcGNpX25hbWUocGNpZGV2KSwgKGludClwY2lk ZXYtPnZlbmRvciwgKGludClwY2lkZXYtPmRldmljZSk7Cj4gwqB9Cj4KPiBAQCAtMTMzOSw4ICsx MzM4LDcgQEAgc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZpYV9zZF9kcml2ZXIgPSB7Cj4KPiDC oHN0YXRpYyBpbnQgX19pbml0IHZpYV9zZF9kcnZfaW5pdCh2b2lkKQo+IMKgewo+IC0gwqAgwqAg wqAgcHJfaW5mbyhEUlZfTkFNRSAiOiBWSUEgU0QvTU1DIENhcmQgUmVhZGVyIGRyaXZlciAiCj4g LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiKEMpIDIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLlxu Iik7Cj4gKyDCoCDCoCDCoCBwcl9pbmZvKCJWSUEgU0QvTU1DIENhcmQgUmVhZGVyIGRyaXZlciAo QykgMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuXG4iKTsKPgo+IMKgIMKgIMKgIMKgcmV0dXJu IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpYV9zZF9kcml2ZXIpOwo+IMKgfQo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jIGIvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYwo+ IGluZGV4IGU4ZjZlNjUuLjE5MDhhMjUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tbWMvaG9zdC92 dWIzMDAuYwo+ICsrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMKPiBAQCAtMzUsNiArMzUs OSBAQAo+IMKgKiDCoCDCoCDCoCDCoCDCoCDCoCBiaXRzIGFuZCBkcml2ZXIgZGF0YSBmaWVsZHMg cmVmbGVjdCB0aGF0IGxpbWl0IGJ5IHVzaW5nCj4gwqAqIMKgIMKgIMKgIMKgIMKgIMKgIHU4LCB1 MTYsIHUzMgo+IMKgKi8KPiArCj4gKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUg IjogIiBmbXQKPiArCj4gwqAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4gwqAjaW5jbHVkZSA8 bGludXgvZXJybm8uaD4KPiDCoCNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4gQEAgLTEyNTcsOSAr MTI2MCw4IEBAIHN0YXRpYyB2b2lkIF9fZG93bmxvYWRfb2ZmbG9hZF9wc2V1ZG9jb2RlKHN0cnVj dCB2dWIzMDBfbW1jX2hvc3QgKnZ1YjMwMCwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoH0KPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7Cj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZXZfZXJyKCZ2dWIzMDAtPnVkZXYtPmRldiwKPiAtIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJub3QgZW5vdWdoIG1l bW9yeSBmb3IgeGZlciBidWZmZXIgdG8gc2VuZCIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgICIgSU5URVJSVVBUX1BTRVVET0NPREUgZm9yICVzICVzXG4i LCBmdy0+ZGF0YSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHZ1YjMwMC0+dnViX25hbWUpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciB4ZmVyIGJ1ZmZlciB0byBzZW5k IElOVEVSUlVQVF9QU0VVRE9DT0RFIGZvciAlcyAlc1xuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGZ3LT5kYXRhLCB2dWIzMDAtPnZ1Yl9uYW1lKTsK PiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHN0cm5jcHkodnViMzAwLT52dWJf bmFtZSwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJT RElPIGludGVycnVwdCBwc2V1ZG9jb2RlIGRvd25sb2FkIGZhaWxlZCIsCj4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzaXplb2YodnViMzAwLT52dWJfbmFt ZSkpOwo+IEBAIC0xMzA0LDkgKzEzMDYsOCBAQCBzdGF0aWMgdm9pZCBfX2Rvd25sb2FkX29mZmxv YWRfcHNldWRvY29kZShzdHJ1Y3QgdnViMzAwX21tY19ob3N0ICp2dWIzMDAsCj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVs c2Ugewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGV2X2VycigmdnViMzAw LT51ZGV2LT5kZXYsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCAibm90IGVub3VnaCBtZW1vcnkgZm9yIHhmZXIgYnVmZmVyIHRvIHNlbmQiCj4gLSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiIFRSQU5TRkVSX1BTRVVE T0NPREUgZm9yICVzICVzXG4iLCBmdy0+ZGF0YSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZ1YjMwMC0+dnViX25hbWUpOwo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciB4 ZmVyIGJ1ZmZlciB0byBzZW5kIFRSQU5TRkVSX1BTRVVET0NPREUgZm9yICVzICVzXG4iLAo+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZnctPmRhdGEsIHZ1 YjMwMC0+dnViX25hbWUpOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3Ry bmNweSh2dWIzMDAtPnZ1Yl9uYW1lLAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIlNESU8gdHJhbnNmZXIgcHNldWRvY29kZSBkb3dubG9hZCBmYWlsZWQi LAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2l6ZW9m KHZ1YjMwMC0+dnViX25hbWUpKTsKPiBAQCAtMjAwMiwxMSArMjAwMywxMSBAQCBzdGF0aWMgdm9p ZCBfX3NldF9jbG9ja19zcGVlZChzdHJ1Y3QgdnViMzAwX21tY19ob3N0ICp2dWIzMDAsIHU4IGJ1 Zls4XSwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFVT Ql9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKPiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4MDAsIDB4MDAsIGJ1Ziwg YnVmX2FycmF5X3NpemUsIEhaKTsKPiDCoCDCoCDCoCDCoGlmIChyZXR2YWwgIT0gOCkgewo+IC0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgZGV2X2VycigmdnViMzAwLT51ZGV2LT5kZXYsICJTRVRfQ0xP Q0tfU1BFRUQiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiICVka0h6IGZh aWxlZCB3aXRoIHJldHZhbD0lZFxuIiwga0h6Q2xvY2ssIHJldHZhbCk7Cj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCBkZXZfZXJyKCZ2dWIzMDAtPnVkZXYtPmRldiwgIlNFVF9DTE9DS19TUEVFRCAl ZGtIeiBmYWlsZWQgd2l0aCByZXR2YWw9JWRcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBrSHpDbG9jaywgcmV0dmFsKTsKPiDCoCDCoCDCoCDCoH0gZWxzZSB7Cj4gLSDC oCDCoCDCoCDCoCDCoCDCoCDCoCBkZXZfZGJnKCZ2dWIzMDAtPnVkZXYtPmRldiwgIlNFVF9DTE9D S19TUEVFRCIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICIgJWRrSHpcbiIs IGtIekNsb2NrKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGRldl9kYmcoJnZ1YjMwMC0+dWRl di0+ZGV2LCAiU0VUX0NMT0NLX1NQRUVEICVka0h6XG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAga0h6Q2xvY2spOwo+IMKgIMKgIMKgIMKgfQo+IMKgfQo+Cj4gQEAgLTIy NTEsOCArMjI1Miw3IEBAIHN0YXRpYyBpbnQgdnViMzAwX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJm YWNlICppbnRlcmZhY2UsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKPiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZXZfd2FybigmdnViMzAwLT51ZGV2LT5kZXYs Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCJpZ25vcmluZyIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIiB1bmV4cGVjdGVkIGJ1bGtfaW4gZW5kcG9pbnQiKTsK PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgImlnbm9yaW5nIHVuZXhwZWN0ZWQgYnVsa19pbiBlbmRwb2ludFxuIik7Cj4gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9 IGVsc2UgaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKPiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghdnViMzAwLT5jbW5kX291dF9lcCkgewo+ IEBAIC0yMjYzLDIwICsyMjYzLDE4IEBAIHN0YXRpYyBpbnQgdnViMzAwX3Byb2JlKHN0cnVjdCB1 c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsK PiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7Cj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZXZfd2FybigmdnViMzAwLT51 ZGV2LT5kZXYsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCJpZ25vcmluZyIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIiB1bmV4cGVjdGVkIGJ1bGtfb3V0IGVu ZHBvaW50Iik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCJpZ25vcmluZyB1bmV4cGVjdGVkIGJ1bGtfb3V0IGVuZHBvaW50XG4i KTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0KPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH0gZWxzZSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBk ZXZfd2FybigmdnViMzAwLT51ZGV2LT5kZXYsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJ2dWIzMDAgaWdub3JpbmcgRW5kUG9pbnQoJWQpICUwMlgi LCBpLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBl bmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJ2dWIzMDAgaWdub3JpbmcgRW5kUG9pbnQoJWQpICUwMlhc biIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGks IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0K PiDCoCDCoCDCoCDCoH0KPiDCoCDCoCDCoCDCoGlmICh2dWIzMDAtPmNtbmRfcmVzX2VwICYmIHZ1 YjMwMC0+Y21uZF9vdXRfZXAgJiYKPiDCoCDCoCDCoCDCoCDCoCDCoHZ1YjMwMC0+ZGF0YV9pbnBf ZXAgJiYgdnViMzAwLT5kYXRhX291dF9lcCkgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGV2 X2luZm8oJnZ1YjMwMC0+dWRldi0+ZGV2LAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAidnViMzAwICVzIHBhY2tldHMiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCIgdXNpbmcgRW5kUG9pbnRzICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJ2dWIzMDAgJXMgcGFja2V0cyB1c2lu ZyBFbmRQb2ludHMgJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCB2dWIzMDAtPmxhcmdlX3VzYl9wYWNrZXRzID8gIkxBUkdFIiA6ICJT TUFMTCIsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdnViMzAwLT5jbW5k X291dF9lcCwgdnViMzAwLT5jbW5kX3Jlc19lcCwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCB2dWIzMDAtPmRhdGFfb3V0X2VwLCB2dWIzMDAtPmRhdGFfaW5wX2VwKTsKPiBA QCAtMjM0MSwxMyArMjMzOSwxMSBAQCBzdGF0aWMgaW50IHZ1YjMwMF9wcm9iZShzdHJ1Y3QgdXNi X2ludGVyZmFjZSAqaW50ZXJmYWNlLAo+IMKgIMKgIMKgIMKgYWRkX3RpbWVyKCZ2dWIzMDAtPmlu YWN0aXZpdHlfdGltZXIpOwo+IMKgIMKgIMKgIMKgaWYgKHZ1YjMwMC0+Y2FyZF9wcmVzZW50KQo+ IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGV2X2luZm8oJnZ1YjMwMC0+dWRldi0+ZGV2LAo+IC0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAiVVNCIHZ1YjMwMCByZW1vdGUgU0RJ TyBob3N0IGNvbnRyb2xsZXJbJWRdIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAiY29ubmVjdGVkIHdpdGggU0QvU0RJTyBjYXJkIGluc2VydGVkXG4iLAo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAiVVNCIHZ1YjMwMCByZW1vdGUgU0RJTyBob3N0 IGNvbnRyb2xsZXJbJWRdY29ubmVjdGVkIHdpdGggU0QvU0RJTyBjYXJkIGluc2VydGVkXG4iLAo+ IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGludGVyZmFjZV90b19JbnRlcmZh Y2VOdW1iZXIoaW50ZXJmYWNlKSk7Cj4gwqAgwqAgwqAgwqBlbHNlCj4gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBkZXZfaW5mbygmdnViMzAwLT51ZGV2LT5kZXYsCj4gLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCJVU0IgdnViMzAwIHJlbW90ZSBTRElPIGhvc3QgY29udHJvbGxl clslZF0iCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJjb25uZWN0ZWQg d2l0aCBubyBTRC9TRElPIGNhcmQgaW5zZXJ0ZWRcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCJVU0IgdnViMzAwIHJlbW90ZSBTRElPIGhvc3QgY29udHJvbGxlclsl ZF1jb25uZWN0ZWQgd2l0aCBubyBTRC9TRElPIGNhcmQgaW5zZXJ0ZWRcbiIsCj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaW50ZXJmYWNlX3RvX0ludGVyZmFjZU51bWJlcihp bnRlcmZhY2UpKTsKPiDCoCDCoCDCoCDCoG1tY19hZGRfaG9zdChtbWMpOwo+IMKgIMKgIMKgIMKg cmV0dXJuIDA7Cj4gQEAgLTIzODEsOCArMjM3Nyw4IEBAIHN0YXRpYyB2b2lkIHZ1YjMwMF9kaXNj b25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCj4gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB2dWIzMDAtPmludGVyZmFjZSA9IE5VTEw7Cj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBrcmVmX3B1dCgmdnViMzAwLT5rcmVmLCB2dWIzMDBf ZGVsZXRlKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1tY19yZW1vdmVf aG9zdChtbWMpOwo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfaW5mbygi VVNCIHZ1YjMwMCByZW1vdGUgU0RJTyBob3N0IGNvbnRyb2xsZXJbJWRdIgo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIiBub3cgZGlzY29ubmVjdGVkIiwg aWZudW0pOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfaW5mbygiVVNC IHJlbW90ZSBTRElPIGhvc3QgY29udHJvbGxlclslZF0gbm93IGRpc2Nvbm5lY3RlZFxuIiwKPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmbnVtKTsKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybjsKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH0KPiDCoCDCoCDCoCDCoH0KPiBAQCAtMjQ0OCwyOSArMjQ0NCwyOSBAQCBzdGF0 aWMgaW50IF9faW5pdCB2dWIzMDBfaW5pdCh2b2lkKQo+IMKgeyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8qIE5PVCBpcnEgKi8KPiDCoCDCoCDCoCDCoGludCBy ZXN1bHQ7Cj4KPiAtIMKgIMKgIMKgIHByX2luZm8oIlZVQjMwMCBEcml2ZXIgcm9tIHdhaXQgc3Rh dGVzID0gJTAyWCBpcnFwb2xsIHRpbWVvdXQgPSAlMDRYIiwKPiArIMKgIMKgIMKgIHByX2luZm8o IkRyaXZlciByb20gd2FpdCBzdGF0ZXMgPSAlMDJYIGlycXBvbGwgdGltZW91dCA9ICUwNFhcbiIs Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmaXJtd2FyZV9yb21fd2FpdF9zdGF0ZXMsIDB4MEZG RkYgJiBmaXJtd2FyZV9pcnFwb2xsX3RpbWVvdXQpOwo+IMKgIMKgIMKgIMKgY21uZHdvcmtxdWV1 ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrdnViMzAwYyIpOwo+IMKgIMKgIMKg IMKgaWYgKCFjbW5kd29ya3F1ZXVlKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIo Im5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgUkVRVUVTVCB3b3JrcXVldWUiKTsKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHByX2Vycigibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBSRVFVRVNU IHdvcmtxdWV1ZVxuIik7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXN1bHQgPSAtRU5PTUVN Owo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBvdXQxOwo+IMKgIMKgIMKgIMKgfQo+IMKg IMKgIMKgIMKgcG9sbHdvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJr dnViMzAwcCIpOwo+IMKgIMKgIMKgIMKgaWYgKCFwb2xsd29ya3F1ZXVlKSB7Cj4gLSDCoCDCoCDC oCDCoCDCoCDCoCDCoCBwcl9lcnIoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgSVJRUE9MTCB3 b3JrcXVldWUiKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2Vycigibm90IGVub3VnaCBt ZW1vcnkgZm9yIHRoZSBJUlFQT0xMIHdvcmtxdWV1ZVxuIik7Cj4gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqByZXN1bHQgPSAtRU5PTUVNOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBvdXQy Owo+IMKgIMKgIMKgIMKgfQo+IMKgIMKgIMKgIMKgZGVhZHdvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5n bGV0aHJlYWRfd29ya3F1ZXVlKCJrdnViMzAwZCIpOwo+IMKgIMKgIMKgIMKgaWYgKCFkZWFkd29y a3F1ZXVlKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIm5vdCBlbm91Z2ggbWVt b3J5IGZvciB0aGUgRVhQSVJFRCB3b3JrcXVldWUiKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHByX2Vycigibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBFWFBJUkVEIHdvcmtxdWV1ZVxuIik7 Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXN1bHQgPSAtRU5PTUVNOwo+IMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ290byBvdXQzOwo+IMKgIMKgIMKgIMKgfQo+IMKgIMKgIMKgIMKgcmVzdWx0 ID0gdXNiX3JlZ2lzdGVyKCZ2dWIzMDBfZHJpdmVyKTsKPiDCoCDCoCDCoCDCoGlmIChyZXN1bHQp IHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2VycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4g RXJyb3IgbnVtYmVyICVkIiwgcmVzdWx0KTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2Vy cigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXN1bHQpOwo+IMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBvdXQ0Owo+IMKgIMKgIMKgIMKgfQo+IMKgIMKgIMKg IMKgcmV0dXJuIDA7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jIGIvZHJp dmVycy9tbWMvaG9zdC93YnNkLmMKPiBpbmRleCBkZWFlZDhjLi43NTM2YjUwIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jCj4gKysrIGIvZHJpdmVycy9tbWMvaG9zdC93YnNk LmMKPiBAQCAtNzIxLDkgKzcyMSw4IEBAIHN0YXRpYyB2b2lkIHdic2RfZmluaXNoX2RhdGEoc3Ry dWN0IHdic2RfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQo+IMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgICogQW55IGxlZnRvdmVyIGRhdGE/Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgKi8KPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChjb3VudCkgewo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJfZXJyKCIlczogSW5jb21wbGV0ZSBETUEgdHJhbnNm ZXIuICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICIl ZCBieXRlcyBsZWZ0LlxuIiwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBjb3VudCk7Cj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcl9lcnIoIiVzOiBJbmNvbXBsZXRlIERNQSB0cmFuc2Zl ci4gJWQgYnl0ZXMgbGVmdC5cbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBjb3VudCk7Cj4KPiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghZGF0YS0+ZXJyb3IpCj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkYXRhLT5lcnJvciA9IC1FSU87 Cj4gLS0KPiAxLjcuNi40MDUuZ2MxYmUwCj4KPiAtLQo+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhp cyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1rZXJuZWwiIGluCj4gdGhl IGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKPiBNb3JlIG1h am9yZG9tbyBpbmZvIGF0IMKgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5mby5o dG1sCj4gUGxlYXNlIHJlYWQgdGhlIEZBUSBhdCDCoGh0dHA6Ly93d3cudHV4Lm9yZy9sa21sLwo+ Cg==
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 3/4] mmc: Logging neatening
On Wed, 2011-11-16 at 10:48 +0900, NamJae Jeon wrote:
[123K of untrimmed reply]
If you wrote something, I didn't find it.
Re: [PATCH 3/4] mmc: Logging neatening
2011/11/16 Joe Perches <[email protected]>:
drivers/mmc/host/dw_mmc.c static int dw_mci_probe(struct platform_device *pdev) · line 1989
Quoted 13 lines · NamJae Jeon
[123K of untrimmed reply]
If you wrote something, I didn't find it.
drivers/mmc/host/dw_mmc.c +2
-3-dev_info (&pdev->dev,"DW MMC controller at irq %d, " -"%d bit host data width, " -"%u deep fifo\n" , +dev_info (&pdev->dev, +"DW MMC controller at irq %d, %d bit host data width, %u deep fifo\n" , irq, width, fifo_size);
I think that tab is needed this "DW MMC controller at irq ...." ?
Re: [PATCH 3/4] mmc: Logging neatening
Quoted 8 lines · NamJae Jeon
2011/11/16 Joe Perches <[email protected]>:
Quoted 6 lines · NamJae Jeon
[123K of untrimmed reply]
If you wrote something, I didn't find it.
Quoted 8 lines
drivers/mmc/host/dw_mmc.c static int dw_mci_probe(struct platform_device *pdev) · line 1989
Quoted 6 lines
drivers/mmc/host/dw_mmc.c +2
-3-dev_info (&pdev->dev,"DW MMC controller at irq %d, " -"%d bit host data width, " -"%u deep fifo\n" , +dev_info (&pdev->dev, +"DW MMC controller at irq %d, %d bit host data width, %u deep fifo\n" , irq, width, fifo_size);I think that tab is needed this "DW MMC controller at irq ...." ?
Argument alignment isn't always the right thing.
Very long formats should not necessarily be aligned at the open parenthesis. It helps to determine when the format string or the dmesg output line length is too long.
NamJae Jeon
Reviewed-byRe: [PATCH 3/4] mmc: Logging neatening
2011/11/16 Joe Perches <[email protected]>:
Quoted 16 lines · NamJae Jeon
Quoted 15 lines
2011/11/16 Joe Perches <[email protected]>:
Quoted 13 lines · NamJae Jeon
[123K of untrimmed reply]
If you wrote something, I didn't find it.
- ? ? ? dev_info(&pdev->dev, "DW MMC controller at irq %d, "
- ? ? ? ? ? ? ? ?"%d bit host data width, "
- ? ? ? ? ? ? ? ?"%u deep fifo\n",
+ ? ? ? dev_info(&pdev->dev,
+ ? ? ? "DW MMC controller at irq %d, %d bit host data width, %u deep fifo\n", ? ? ? ? ? ? ? ? irq, width,fifo_size);
Quoted 8 lines
Quoted 1 line
I think that tab is needed this "DW MMC controller at irq ...." ?
Argument alignment isn't always the right thing.
Very long formats should not necessarily be aligned at the open parenthesis. ?It helps to determine when the format string or the dmesg output line length is too long.
Okay~ I understand clearly.
Thanks.
Quoted 6 lines
Coalesce formats.
Align arguments.
Addpr_fmt, remove prefixes from format strings. Neaten DBG uses, rearrange argument order.Signed-off-by Joe Perches <[email protected]>
Quoted 6 lines
Re: [PATCH 3/4] mmc: Logging neatening
In reply to NamJae JeonQuoted 4 lines · On Tuesday 15 November 2011 20:48:05 NamJae Jeon wrote:
2011/11/16 Joe Perches <[email protected]>:
Quoted 3 lines
mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci
interrupt */
Quoted 8 lines
Quoted 6 lines
drivers/mmc/host/dw_mmc.c +2
-3- dev_info(&pdev->dev, "DW MMC controller at irq %d, " - "%d bit host data width, " - "%u deep fifo\n", + dev_info(&pdev->dev, + "DW MMC controller at irq %d, %d bit host data width, %u deepfifo\n", irq, width,
fifo_size);I think that tab is needed this "DW MMC controller at irq ...." ?
looks to me like this was the only part you replied to. could you please snip
the unrelated context in the future ? no reason to include ~1700 lines of
context when you only replying to like ~10 lines.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20111116/43f34bba/attachment.sig>
PATCH 4/4 mmc: Add mmc_host_<level> logging
In reply to Joe PerchesCentralize the pr_<level> uses of mmc_hostname into specific mmc_host_<level> calls to allow a flexible presentation style and shorten the code a bit.
Add mmc_host_<level> macros.
Convert the logging calls from:
pr_<level>("%s: ...", mmc_hostname(foo)
to:
mmc_host_<level>(foo, ...)Add a couple of missing newlines.
Convert bare printks to pr_cont where appropriate. Spelling/typo fix of initialiazed to initialized.
--- drivers/mmc/card/mmc_test.c | 66 +++++++++++--------------- drivers/mmc/core/bus.c | 27 +++++------ drivers/mmc/core/core.c | 101 ++++++++++++++++++--------------------- drivers/mmc/core/host.c | 13 ++--- drivers/mmc/core/mmc.c | 67 ++++++++++--------------- drivers/mmc/core/mmc_ops.c | 11 ++-- drivers/mmc/core/sd.c | 62 ++++++++--------------- drivers/mmc/core/sdio.c | 10 ++-- drivers/mmc/core/sdio_cis.c | 9 ++-- drivers/mmc/core/sdio_irq.c | 7 +-- drivers/mmc/host/at91_mci.c | 9 ++-- drivers/mmc/host/dw_mmc.c | 2 +- drivers/mmc/host/msm_sdcc.c | 101 ++++++++++++++++++--------------------- drivers/mmc/host/mvsdio.c | 35 ++++++-------- drivers/mmc/host/omap_hsmmc.c | 7 +-- drivers/mmc/host/pxamci.c | 4 +- drivers/mmc/host/sdhci.c | 81 +++++++++++++------------------ drivers/mmc/host/tmio_mmc.c | 4 +- drivers/mmc/host/tmio_mmc_pio.c | 4 +- drivers/mmc/host/via-sdmmc.c | 21 ++++----- drivers/mmc/host/wbsd.c | 27 +++++----- include/linux/mmc/host.h | 11 ++++ 22 files changed, 298 insertions(+), 381 deletions(-)
drivers/mmc/card/mmc_test.c +28 -38
@@ -253,8 +253,7 @@ static int mmc_test_wait_busy(struct mmc_test_card *test)if (!busy &&mmc_test_busy (&cmd)) { busy =1 ;if (test->card->host->caps &MMC_CAP_WAIT_WHILE_BUSY ) -pr_info ("%s: Warning: Host did not wait for busy state to end\n" , -mmc_hostname (test->card->host)); +mmc_host_info (test->card->host,"Warning: Host did not wait for busy state to end\n" ); } }while (mmc_test_busy (&cmd));
@@ -554,11 +553,11 @@ static void mmc_test_print_rate(struct mmc_test_card *test, uint64_t bytes, rate =mmc_test_rate (bytes, &ts); iops =mmc_test_rate (100 , &ts);/* I/O ops per sec x 100 */ -pr_info ("%s: Transfer of %u sectors (%u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS)\n" , -mmc_hostname (test->card->host), sectors, sectors >>1 , - (sectors &1 ?".5" :"" ), (unsigned long )ts.tv_sec, - (unsigned long )ts.tv_nsec, rate /1000 , rate /1024 , - iops /100 , iops %100 ); +mmc_host_info (test->card->host,"Transfer of %u sectors (%u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS)\n" , + sectors, sectors >>1 , + (sectors &1 ?".5" :"" ), (unsigned long )ts.tv_sec, + (unsigned long )ts.tv_nsec, rate /1000 , rate /1024 , + iops /100 , iops %100 );mmc_test_save_transfer_result (test,1 , sectors, ts, rate, iops); }
@@ -579,12 +578,12 @@ static void mmc_test_print_avg_rate(struct mmc_test_card *test, uint64_t bytes, rate =mmc_test_rate (tot, &ts); iops =mmc_test_rate (count *100 , &ts);/* I/O ops per sec x 100 */ -pr_info ("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS, sg_len %d)\n" , -mmc_hostname (test->card->host), count, sectors, count, - sectors >>1 , (sectors &1 ?".5" :"" ), - (unsigned long )ts.tv_sec, (unsigned long )ts.tv_nsec, - rate /1000 , rate /1024 , iops /100 , iops %100 , - test->area.sg_len); +mmc_host_info (test->card->host,"Transfer of %u x %u sectors (%u x %u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS, sg_len %d)\n" , + count, sectors, count, + sectors >>1 , (sectors &1 ?".5" :"" ), + (unsigned long )ts.tv_sec, (unsigned long )ts.tv_nsec, + rate /1000 , rate /1024 , iops /100 , iops %100 , + test->area.sg_len);mmc_test_save_transfer_result (test, count, sectors, ts, rate, iops); }
@@ -1407,8 +1406,7 @@ static int mmc_test_multi_read_high(struct mmc_test_card *test)static int mmc_test_no_highmem (struct mmc_test_card *test) { -pr_info ("%s: Highmem not configured - test skipped\n" , -mmc_hostname (test->card->host)); +mmc_host_info (test->card->host,"Highmem not configured - test skipped\n" );return 0 ; }
@@ -1434,8 +1432,7 @@ static int mmc_test_area_map(struct mmc_test_card *test, unsigned long sz, t->max_seg_sz, &t->sg_len, min_sg_len); }if (err) -pr_info ("%s: Failed to map sg list\n" , -mmc_hostname (test->card->host)); +mmc_host_info (test->card->host,"Failed to map sg list\n" );return err; }
@@ -2689,8 +2686,8 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase) {int i, ret; -pr_info ("%s: Starting tests of card %s...\n" , -mmc_hostname (test->card->host),mmc_card_id (test->card)); +mmc_host_info (test->card->host,"Starting tests of card %s...\n" , +mmc_card_id (test->card));mmc_claim_host (test->card->host);
@@ -2700,16 +2697,14 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase)if (testcase && ((i +1 ) != testcase))continue ; -pr_info ("%s: Test case %d. %s...\n" , -mmc_hostname (test->card->host), i +1 , - mmc_test_cases[i].name); +mmc_host_info (test->card->host,"Test case %d. %s...\n" , + i +1 , mmc_test_cases[i].name);if (mmc_test_cases[i].prepare) { ret = mmc_test_cases[i].prepare (test);if (ret) { -pr_info ("%s: Result: Prepare stage failed! (%d)\n" , -mmc_hostname (test->card->host), - ret); +mmc_host_info (test->card->host,"Result: Prepare stage failed! (%d)\n" , + ret);continue ; } }
@@ -2736,24 +2731,20 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase) ret = mmc_test_cases[i].run (test);switch (ret) {case RESULT_OK : -pr_info ("%s: Result: OK\n" , -mmc_hostname (test->card->host)); +mmc_host_info (test->card->host,"Result: OK\n" );break ;case RESULT_FAIL : -pr_info ("%s: Result: FAILED\n" , -mmc_hostname (test->card->host)); +mmc_host_info (test->card->host,"Result: FAILED\n" );break ;case RESULT_UNSUP_HOST : -pr_info ("%s: Result: UNSUPPORTED (by host)\n" , -mmc_hostname (test->card->host)); +mmc_host_info (test->card->host,"Result: UNSUPPORTED (by host)\n" );break ;case RESULT_UNSUP_CARD : -pr_info ("%s: Result: UNSUPPORTED (by card)\n" , -mmc_hostname (test->card->host)); +mmc_host_info (test->card->host,"Result: UNSUPPORTED (by card)\n" );break ;default : -pr_info ("%s: Result: ERROR (%d)\n" , -mmc_hostname (test->card->host), ret); +mmc_host_info (test->card->host,"Result: ERROR (%d)\n" , + ret); }/* Save the result */
@@ -2763,8 +2754,7 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase)if (mmc_test_cases[i].cleanup) { ret = mmc_test_cases[i].cleanup (test);if (ret) { -pr_info ("%s: Warning: Cleanup stage failed! (%d)\n" , -mmc_hostname (test->card->host), +mmc_host_info (test->card->host,"Warning: Cleanup stage failed! (%d)\n" , ret); } }
@@ -2772,7 +2762,7 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase)mmc_release_host (test->card->host); -pr_info ("%s: Tests completed\n" ,mmc_hostname (test->card->host)); +mmc_host_info (test->card->host,"Tests completed\n" ); }static void mmc_test_free_result (struct mmc_card *card)
drivers/mmc/core/bus.c +12 -15
@@ -297,18 +297,16 @@ int mmc_add_card(struct mmc_card *card) }if (mmc_host_is_spi (card->host)) { -pr_info ("%s: new %s%s%s card on SPI\n" , -mmc_hostname (card->host), -mmc_card_highspeed (card) ?"high speed " :"" , -mmc_card_ddr_mode (card) ?"DDR " :"" , - type); +mmc_host_info (card->host,"new %s%s%s card on SPI\n" , +mmc_card_highspeed (card) ?"high speed " :"" , +mmc_card_ddr_mode (card) ?"DDR " :"" , + type); }else { -pr_info ("%s: new %s%s%s card at address %04x\n" , -mmc_hostname (card->host), -mmc_sd_card_uhs (card) ?"ultra high speed " : -mmc_card_highspeed (card) ?"high speed " :"" , -mmc_card_ddr_mode (card) ?"DDR " :"" , - type, card->rca); +mmc_host_info (card->host,"new %s%s%s card at address %04x\n" , +mmc_sd_card_uhs (card) ?"ultra high speed " : +mmc_card_highspeed (card) ?"high speed " :"" , +mmc_card_ddr_mode (card) ?"DDR " :"" , + type, card->rca); }#ifdef CONFIG_DEBUG_FS
@@ -336,11 +334,10 @@ void mmc_remove_card(struct mmc_card *card)if (mmc_card_present (card)) {if (mmc_host_is_spi (card->host)) { -pr_info ("%s: SPI card removed\n" , -mmc_hostname (card->host)); +mmc_host_info (card->host,"SPI card removed\n" ); }else { -pr_info ("%s: card %04x removed\n" , -mmc_hostname (card->host), card->rca); +mmc_host_info (card->host,"card %04x removed\n" , + card->rca); }device_del (&card->dev); }
drivers/mmc/core/core.c +47 -54
219 lines not on this page · raw message
drivers/mmc/core/host.c +5 -8
@@ -75,8 +75,7 @@ static ssize_t clkgate_delay_store(struct device *dev, host->clkgate_delay = value;spin_unlock_irqrestore (&host->clk_lock, flags); -pr_info ("%s: clock gate delay set to %lu ms\n" , -mmc_hostname (host), value); +mmc_host_info (host,"clock gate delay set to %lu ms\n" , value);return count; }
@@ -94,8 +93,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host)unsigned long flags;if (!freq) { -pr_debug ("%s: frequency set to 0 in disable function, this means the clock is already disabled\n" , -mmc_hostname (host)); +mmc_host_debug (host,"frequency set to 0 in disable function, this means the clock is already disabled\n" );return ; }/*
@@ -126,7 +124,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host)/* This will set host->ios.clock to 0 */ mmc_gate_clock (host);spin_lock_irqsave (&host->clk_lock, flags); -pr_debug ("%s: gated MCI clock\n" ,mmc_hostname (host)); +mmc_host_debug (host,"gated MCI clock\n" ); }spin_unlock_irqrestore (&host->clk_lock, flags);mutex_unlock (&host->clk_gate_mutex);
@@ -163,7 +161,7 @@ void mmc_host_clk_hold(struct mmc_host *host)spin_unlock_irqrestore (&host->clk_lock, flags);mmc_ungate_clock (host);spin_lock_irqsave (&host->clk_lock, flags); -pr_debug ("%s: ungated MCI clock\n" ,mmc_hostname (host)); +mmc_host_debug (host,"ungated MCI clock\n" ); } host->clk_requests++;spin_unlock_irqrestore (&host->clk_lock, flags);
@@ -277,8 +275,7 @@ static inline void mmc_host_clk_sysfs_init(struct mmc_host *host) host->clkgate_delay_attr.attr.name ="clkgate_delay" ; host->clkgate_delay_attr.attr.mode =S_IRUGO |S_IWUSR ;if (device_create_file (&host->class_dev, &host->clkgate_delay_attr)) -pr_err ("%s: Failed to create clkgate_delay sysfs entry\n" , - mmc_hostname(host)); + mmc_host_err(host, "Failed to create clkgate_delay sysfs entry\n"); }#else
drivers/mmc/core/mmc.c +27 -40
170 lines not on this page · raw message
drivers/mmc/core/mmc_ops.c +5 -6
@@ -415,8 +415,8 @@ int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,return -EBADMSG ; }else {if (status &0xFDFFA000 ) -pr_warn ("%s: unexpected status %#x after switch\n" , -mmc_hostname (card->host), status); +mmc_host_warn (card->host,"unexpected status %#x after switch\n" , + status);if (status &R1_SWITCH_ERROR )return -EBADMSG ; }
@@ -477,8 +477,7 @@ mmc_send_bus_test(struct mmc_card *card, struct mmc_host *host, u8 opcode,else if (len ==4 ) test_buf = testdata_4bit;else { -pr_err ("%s: Invalid bus_width %d\n" , -mmc_hostname (host), len); +mmc_host_err (host,"Invalid bus_width %d\n" , len);kfree (data_buf);return -EINVAL ; }
@@ -569,8 +568,8 @@ int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status) err =mmc_wait_for_cmd (card->host, &cmd,0 );if (err) { -pr_warn ("%s: error %d interrupting operation. HPI command response %#x\n" , -mmc_hostname (card->host), err, cmd.resp[0 ]); +mmc_host_warn (card->host,"error %d interrupting operation. HPI command response %#x\n" , + err, cmd.resp[0 ]);return err; }if (status)
drivers/mmc/core/sd.c +22 -40
181 lines not on this page · raw message
drivers/mmc/core/sdio.c +4 -6
@@ -112,8 +112,8 @@ static int sdio_read_cccr(struct mmc_card *card) cccr_vsn = data &0x0f ;if (cccr_vsn >SDIO_CCCR_REV_3_00 ) { -pr_err ("%s: unrecognised CCCR structure version %d\n" , -mmc_hostname (card->host), cccr_vsn); +mmc_host_err (card->host,"unrecognised CCCR structure version %d\n" , + cccr_vsn);return -EINVAL ; }
@@ -777,8 +777,7 @@ int mmc_attach_sdio(struct mmc_host *host)* support. */ if (ocr &0x7F ) { -pr_warn ("%s: card claims to support voltages below the defined range. These will be ignored.\n" , -mmc_hostname (host)); +mmc_host_warn (host,"card claims to support voltages below the defined range. These will be ignored.\n" ); ocr &= ~0x7F ; }
@@ -873,8 +872,7 @@ remove: err:mmc_detach_bus (host); -pr_err ("%s: error %d whilst initialising SDIO card\n" , -mmc_hostname (host), err); +mmc_host_err (host,"error %d whilst initialising SDIO card\n" , err);return err; }
drivers/mmc/core/sdio_cis.c +4 -5
@@ -132,8 +132,8 @@ static int cis_tpl_parse(struct mmc_card *card, struct sdio_func *func, ret = -EINVAL ; }if (ret && ret != -EILSEQ && ret != -ENOENT ) { -pr_err ("%s: bad %s tuple 0x%02x (%u bytes)\n" , -mmc_hostname (card->host), tpl_descr, code, size); +mmc_host_err (card->host,"bad %s tuple 0x%02x (%u bytes)\n" , + tpl_descr, code, size); } }else {/* unknown tuple */
@@ -313,9 +313,8 @@ static int sdio_read_cis(struct mmc_card *card, struct sdio_func *func)if (ret == -ENOENT ) {/* warn about unknown tuples */ -pr_warn ("%s: queuing unknown CIS tuple 0x%02x (%u bytes)\n" , -mmc_hostname (card->host), - tpl_code, tpl_link); +mmc_host_warn (card->host,"queuing unknown CIS tuple 0x%02x (%u bytes)\n" , + tpl_code, tpl_link); }/* keep on analyzing tuples */
drivers/mmc/core/sdio_irq.c +3 -4
@@ -97,8 +97,8 @@ static int sdio_irq_thread(void *_host) period = (host->caps &MMC_CAP_SDIO_IRQ ) ?MAX_SCHEDULE_TIMEOUT : idle_period; -pr_debug ("%s: IRQ thread started (poll period = %lu jiffies)\n" , -mmc_hostname (host), period); +mmc_host_debug (host,"IRQ thread started (poll period = %lu jiffies)\n" , + period); do { /*
@@ -157,8 +157,7 @@ static int sdio_irq_thread(void *_host)if (host->caps &MMC_CAP_SDIO_IRQ ) host->ops->enable_sdio_irq (host,0 ); -pr_debug ("%s: IRQ thread exiting with code %d\n" , -mmc_hostname (host), ret); +mmc_host_debug (host,"IRQ thread exiting with code %d\n" , ret);return ret; }
drivers/mmc/host/at91_mci.c +5 -4
@@ -881,8 +881,8 @@ static irqreturn_t at91_mmc_det_irq(int irq, void *_host)*/ if (present != host->present) { host->present = present; -pr_debug ("%s: card %s\n" ,mmc_hostname (host->mmc), - present ?"insert" :"remove" ); +mmc_host_debug (host->mmc,"card %s\n" , + present ?"insert" :"remove" );if (!present) {pr_debug ("****** Resetting SD-card bus width ******\n" );at91_mci_write (host,AT91_MCI_SDCR ,at91_mci_read (host,AT91_MCI_SDCR ) & ~AT91_MCI_SDCBUS );
@@ -910,8 +910,9 @@ static void at91_mci_enable_sdio_irq(struct mmc_host *mmc, int enable) {struct at91mci_host *host =mmc_priv (mmc); -pr_debug ("%s: sdio_irq %c : %s\n" ,mmc_hostname (host->mmc), - host->board->slot_b ?'B' :'A' , enable ?"enable" :"disable" ); +mmc_host_debug (host->mmc,"sdio_irq %c : %s\n" , + host->board->slot_b ?'B' :'A' , + enable ?"enable" :"disable" );at91_mci_write (host, enable ?AT91_MCI_IER :AT91_MCI_IDR , host->board->slot_b ?AT91_MCI_SDIOIRQB :AT91_MCI_SDIOIRQA );
drivers/mmc/host/dw_mmc.c +1 -1
@@ -1712,7 +1712,7 @@ static int __init dw_mci_init_slot(struct dw_mci *host, unsigned int id) host->vmmc =regulator_get (mmc_dev (mmc),"vmmc" );if (IS_ERR (host->vmmc)) { -pr_info ("%s: no vmmc regulator found\n" ,mmc_hostname (mmc)); +mmc_host_info (mmc,"no vmmc regulator found\n" ); host->vmmc =NULL ; }else regulator_enable (host->vmmc);
drivers/mmc/host/msm_sdcc.c +46 -55
205 lines not on this page · raw message
drivers/mmc/host/mvsdio.c +15 -20
@@ -117,9 +117,8 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data) host->pio_size = data->blocks * data->blksz; host->pio_ptr =sg_virt (data->sg);if (!nodma) -pr_debug ("%s: fallback to PIO for data at 0x%p size %d\n" , -mmc_hostname (host->mmc), - host->pio_ptr, host->pio_size); +mmc_host_debug (host->mmc,"fallback to PIO for data at 0x%p size %d\n" , + host->pio_ptr, host->pio_size);return 1 ; }else {dma_addr_t phys_addr;
@@ -470,8 +469,8 @@ static irqreturn_t mvsd_irq(int irq, void *dev)if (mrq->data) err_status =mvsd_finish_data (host, mrq->data, err_status);if (err_status) { -pr_err ("%s: unhandled error status %#04x\n" , -mmc_hostname (host->mmc), err_status); +mmc_host_err (host->mmc,"unhandled error status %#04x\n" , + err_status); cmd->error = -ENOMSG ; }
@@ -488,9 +487,8 @@ static irqreturn_t mvsd_irq(int irq, void *dev)if (irq_handled)return IRQ_HANDLED ; -pr_err ("%s: unhandled interrupt status=0x%04x en=0x%04x pio=%d\n" , -mmc_hostname (host->mmc), intr_status, - host->intr_en, host->pio_size); +mmc_host_err (host->mmc,"unhandled interrupt status=0x%04x en=0x%04x pio=%d\n" , + intr_status, host->intr_en, host->pio_size);return IRQ_NONE ; }
@@ -504,13 +502,11 @@ static void mvsd_timeout_timer(unsigned long data)spin_lock_irqsave (&host->lock, flags); mrq = host->mrq;if (mrq) { -pr_err ("%s: Timeout waiting for hardware interrupt\n" , -mmc_hostname (host->mmc)); -pr_err ("%s: hw_state=0x%04x, intr_status=0x%04x intr_en=0x%04x\n" , -mmc_hostname (host->mmc), -mvsd_read (MVSD_HW_STATE ), -mvsd_read (MVSD_NOR_INTR_STATUS ), -mvsd_read (MVSD_NOR_INTR_EN )); +mmc_host_err (host->mmc,"Timeout waiting for hardware interrupt\n" ); +mmc_host_err (host->mmc,"hw_state=0x%04x, intr_status=0x%04x intr_en=0x%04x\n" , +mvsd_read (MVSD_HW_STATE ), +mvsd_read (MVSD_NOR_INTR_STATUS ), +mvsd_read (MVSD_NOR_INTR_EN )); host->mrq =NULL ;
@@ -801,13 +797,12 @@ static int __init mvsd_probe(struct platform_device *pdev)if (ret) goto out; -pr_notice ("%s: %s driver initialized, " , -mmc_hostname (mmc),DRIVER_NAME ); +mmc_host_notice (mmc,"%s driver initialized, " ,DRIVER_NAME );if (host->gpio_card_detect) -printk ("using GPIO %d for card detection\n" , - host->gpio_card_detect); +pr_cont ("using GPIO %d for card detection\n" , + host->gpio_card_detect);else -printk ("lacking card detect (fall back to polling)\n" ); +pr_cont ("lacking card detect (fall back to polling)\n" );return 0 ; out:
drivers/mmc/host/omap_hsmmc.c +2 -5
@@ -1264,15 +1264,12 @@ static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host) host->reqs_blocked =0 ;if (mmc_slot (host).get_cover_state (host->dev, host->slot_id)) {if (host->protect_card) { -pr_info ("%s: cover is closed, card is now accessible\n" , -mmc_hostname (host->mmc)); +mmc_host_info (host->mmc,"cover is closed, card is now accessible\n" ); host->protect_card =0 ; } }else {if (!host->protect_card) { -pr_info ("%s: cover is open, " -"card is now inaccessible\n" , -mmc_hostname (host->mmc)); +mmc_host_info (host->mmc,"cover is open, card is now inaccessible\n" ); host->protect_card =1 ; } }
drivers/mmc/host/pxamci.c +2 -2
@@ -558,8 +558,8 @@ static void pxamci_dma_irq(int dma, void *devid)if (dcsr &DCSR_ENDINTR ) {writel (BUF_PART_FULL , host->base +MMC_PRTBUF ); }else { -pr_err ("%s: DMA error on channel %d (DCSR=%#x)\n" , -mmc_hostname (host->mmc), dma, dcsr); +mmc_host_err (host->mmc,"DMA error on channel %d (DCSR=%#x)\n" , + dma, dcsr); host->data->error = -EIO ;pxamci_data_done (host,0 ); }
drivers/mmc/host/sdhci.c +33 -48
219 lines not on this page · raw message
drivers/mmc/host/tmio_mmc.c +2 -2
@@ -93,8 +93,8 @@ static int __devinit tmio_mmc_probe(struct platform_device *pdev)if (ret) goto host_remove; -pr_info ("%s at 0x%08lx irq %d\n" ,mmc_hostname (host->mmc), - (unsigned long )host->ctl, irq); +mmc_host_info (host->mmc,"at 0x%08lx irq %d\n" , + (unsigned long )host->ctl, irq);return 0 ;
drivers/mmc/host/tmio_mmc_pio.c +2 -2
@@ -681,8 +681,8 @@ static int tmio_mmc_start_data(struct tmio_mmc_host *host,int blksz_2bytes = pdata->flags &TMIO_MMC_BLKSZ_2BYTES ;if (data->blksz <2 || (data->blksz <4 && !blksz_2bytes)) { -pr_err ("%s: %d byte block unsupported in 4 bit mode\n" , -mmc_hostname (host->mmc), data->blksz); +mmc_host_err (host->mmc,"%d byte block unsupported in 4 bit mode\n" , + data->blksz);return -EINVAL ; } }
drivers/mmc/host/via-sdmmc.c +9 -12
@@ -585,7 +585,7 @@ static void via_sdc_send_command(struct via_crdr_mmc_host *host, cmdctrl |=VIA_CRDR_SDCTRL_RSP_R3 ;break ;default : -pr_err ("%s: cmd->flag is not valid\n" ,mmc_hostname (host->mmc)); +mmc_host_err (host->mmc,"cmd->flag is not valid\n" );break ; }
@@ -840,8 +840,8 @@ static void via_sdc_cmd_isr(struct via_crdr_mmc_host *host, u16 intmask)BUG_ON (intmask ==0 );if (!host->cmd) { -pr_err ("%s: Got command interrupt 0x%x even though no command operation was in progress\n" , -mmc_hostname (host->mmc), intmask); +mmc_host_err (host->mmc,"Got command interrupt 0x%x even though no command operation was in progress\n" , + intmask);return ; }
@@ -918,8 +918,8 @@ static irqreturn_t via_sdc_isr(int irq, void *dev_id) sd_status &= ~(VIA_CRDR_SDSTS_CMD_MASK |VIA_CRDR_SDSTS_DATA_MASK );if (sd_status) { -pr_err ("%s: Unexpected interrupt 0x%x\n" , -mmc_hostname (sdhost->mmc), sd_status); +mmc_host_err (sdhost->mmc,"Unexpected interrupt 0x%x\n" , + sd_status);writew (sd_status, addrbase +VIA_CRDR_SDSTATUS ); }
@@ -942,9 +942,8 @@ static void via_sdc_timeout(unsigned long ulongdata)spin_lock_irqsave (&sdhost->lock, flags);if (sdhost->mrq) { -pr_err ("%s: Timeout waiting for hardware interrupt.cmd:0x%x\n" , -mmc_hostname (sdhost->mmc), - sdhost->mrq->cmd->opcode); +mmc_host_err (sdhost->mmc,"Timeout waiting for hardware interrupt.cmd:0x%x\n" , + sdhost->mrq->cmd->opcode);if (sdhost->data) { writel(VIA_CRDR_DMACTRL_SFTRST,
@@ -1006,8 +1005,7 @@ static void via_sdc_card_detect(struct work_struct *work) status =readw (addrbase +VIA_CRDR_SDSTATUS );if (!(status &VIA_CRDR_SDSTS_SLOTG )) {if (host->mrq) { -pr_err ("%s: Card removed during transfer!\n" , -mmc_hostname (host->mmc)); +mmc_host_err (host->mmc,"Card removed during transfer!\n" ); host->mrq->cmd->error = -ENOMEDIUM ;tasklet_schedule (&host->finish_tasklet); }
@@ -1192,8 +1190,7 @@ static void __devexit via_sd_remove(struct pci_dev *pcidev)mmiowb ();if (sdhost->mrq) { -pr_err ("%s: Controller removed during transfer\n" , -mmc_hostname (sdhost->mmc)); +mmc_host_err (sdhost->mmc,"Controller removed during transfer\n" );/* make sure all DMA is stopped */ writel(VIA_CRDR_DMACTRL_SFTRST,
drivers/mmc/host/wbsd.c +13 -14
@@ -194,7 +194,7 @@ static void wbsd_reset(struct wbsd_host *host) {u8 setup; -pr_err ("%s: Resetting chip\n" ,mmc_hostname (host->mmc)); +mmc_host_err (host->mmc,"Resetting chip\n" );/* * Soft reset of chip (SD/MMC part).
@@ -721,8 +721,8 @@ static void wbsd_finish_data(struct wbsd_host *host, struct mmc_data *data)* Any leftover data? */ if (count) { -pr_err ("%s: Incomplete DMA transfer. %d bytes left.\n" , -mmc_hostname (host->mmc), count); +mmc_host_err (host->mmc,"Incomplete DMA transfer. %d bytes left.\n" , + count);if (!data->error) data->error = -EIO ;
@@ -802,8 +802,8 @@ static void wbsd_request(struct mmc_host *mmc, struct mmc_request *mrq)default :#ifdef CONFIG_MMC_DEBUG -pr_warn ("%s: Data command %d is not supported by this controller\n" , -mmc_hostname (host->mmc), cmd->opcode); +mmc_host_warn (host->mmc,"Data command %d is not supported by this controller\n" , + cmd->opcode);#endif cmd->error = -EINVAL ;
@@ -1027,8 +1027,7 @@ static void wbsd_tasklet_card(unsigned long param) host->flags &= ~WBSD_FCARD_PRESENT ;if (host->mrq) { -pr_err ("%s: Card removed during transfer!\n" , -mmc_hostname (host->mmc)); +mmc_host_err (host->mmc,"Card removed during transfer!\n" );wbsd_reset (host); host->mrq->cmd->error = -ENOMEDIUM ;
@@ -1713,17 +1712,17 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma,mmc_add_host (mmc); -pr_info ("%s: W83L51xD" ,mmc_hostname (mmc)); +mmc_host_info (mmc,"W83L51xD" );if (host->chip_id !=0 ) -printk (" id %x" , (int )host->chip_id); -printk (" at 0x%x irq %d" , (int )host->base, (int )host->irq); +pr_cont (" id %x" , (int )host->chip_id); +pr_cont (" at 0x%x irq %d" , (int )host->base, (int )host->irq);if (host->dma >=0 ) -printk (" dma %d" , (int )host->dma); +pr_cont (" dma %d" , (int )host->dma);else -printk (" FIFO" ); +pr_cont (" FIFO" );if (pnp) -printk (" PnP" ); -printk ("\n" ); +pr_cont (" PnP" ); +pr_cont ("\n" );return 0 ; }
include/linux/mmc/host.h +11 -0
@@ -335,6 +335,17 @@ extern int mmc_add_host(struct mmc_host *);extern void mmc_remove_host (struct mmc_host *);extern void mmc_free_host (struct mmc_host *); +#define mmc_host_err (mmc, fmt, ...) \ + pr_err("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +#define mmc_host_warn (mmc, fmt, ...) \ + pr_warn("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +#define mmc_host_notice (mmc, fmt, ...) \ + pr_notice("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +#define mmc_host_info (mmc, fmt, ...) \ + pr_info("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +#define mmc_host_debug (mmc, fmt, ...) \ + pr_debug("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +static inline void *mmc_priv (struct mmc_host *host) {return (void *)host->private;
Signature · 1 line
1.7.6.405.gc1be0
Re: [PATCH 4/4] mmc: Add mmc_host_<level> logging
2011/11/16 Joe Perches <[email protected]>:
Quoted 75 lines
Centralize the pr_<level> uses of
mmc_hostnameinto specific mmc_host_<level> calls to allow a flexible presentation style and shorten the code a bit.Add mmc_host_<level> macros.
Convert the logging calls from:
pr_<level>("%s: ...",mmc_hostname(foo)
to:
mmc_host_<level>(foo, ...)Add a couple of missing newlines.
Convert bare printks topr_contwhere appropriate. Spelling/typo fix of initialiazed to initialized.Signed-off-by Joe Perches <[email protected]>---
drivers/mmc/card/mmc_test.c | 66 +++++++++++---------------drivers/mmc/core/bus.c| 27 +++++------drivers/mmc/core/core.c| 101 ++++++++++++++++++---------------------drivers/mmc/core/host.c| 13 ++---drivers/mmc/core/mmc.c| 67 ++++++++++---------------drivers/mmc/core/mmc_ops.c| 11 ++--
drivers/mmc/core/sd.c | 62 ++++++++---------------drivers/mmc/core/sdio.c| 10 ++--drivers/mmc/core/sdio_cis.c | 9 ++-- drivers/mmc/core/sdio_irq.c | 7 +-- drivers/mmc/host/at91_mci.c | 9 ++--drivers/mmc/host/dw_mmc.c | 2 +-
drivers/mmc/host/msm_sdcc.c| 101 ++++++++++++++++++---------------------drivers/mmc/host/mvsdio.c| 35 ++++++--------drivers/mmc/host/omap_hsmmc.c| 7 +--drivers/mmc/host/pxamci.c| 4 +-drivers/mmc/host/sdhci.c| 81 +++++++++++++------------------drivers/mmc/host/tmio_mmc.c| 4 +-drivers/mmc/host/tmio_mmc_pio.c| 4 +-drivers/mmc/host/via-sdmmc.c| 21 ++++-----drivers/mmc/host/wbsd.c| 27 +++++-----include/linux/mmc/host.h| 11 ++++22 files changed, 298 insertions(+), 381 deletions(-)drivers/mmc/card/mmc_test.c +1
-2@@ -253,8 +253,7 @@ static int mmc_test_wait_busy(struct mmc_test_card *test) if (!busy && mmc_test_busy(&cmd)) { busy = 1; if (test->card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) - pr_info("%s: Warning: Host did not wait for busy state to end\n", - mmc_hostname(test->card->host)); + mmc_host_info(test->card->host, "Warning: Host did not wait for busy state to end\n"); } } while (mmc_test_busy(&cmd));@@ -554,11 +553,11 @@ static void mmc_test_print_rate(struct mmc_test_card *test, uint64_t bytes, rate = mmc_test_rate(bytes, &ts);iops =
mmc_test_rate(100, &ts); /* I/O ops per sec x 100 */- pr_info("%s: Transfer of %u sectors (%u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS)\n",
-mmc_hostname(test->card->host), sectors, sectors >> 1,
- (sectors & 1 ? ".5" : ""), (unsigned long)ts.tv_sec,
- (unsigned long)ts.tv_nsec, rate / 1000, rate / 1024,
- iops / 100, iops % 100);
+ mmc_host_info(test->card->host, "Transfer of %u sectors (%u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS)\n",
+ sectors, sectors >> 1,
+ (sectors & 1 ? ".5" : ""), (unsigned long)ts.tv_sec,
+ (unsigned long)ts.tv_nsec, rate / 1000, rate / 1024,
+ iops / 100, iops % 100);mmc_test_save_transfer_result(test, 1, sectors, ts, rate, iops); }
drivers/mmc/card/mmc_test.c +0
-0@@ -579,12 +578,12 @@ static void mmc_test_print_avg_rate(struct mmc_test_card *test, uint64_t bytes, rate = mmc_test_rate(tot, &ts);iops =
mmc_test_rate(count * 100, &ts); /* I/O ops per sec x 100 */
Quoted 12 lines
- pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS,
sg_len%d)\n",
-mmc_hostname(test->card->host), count, sectors, count,
- sectors >> 1, (sectors & 1 ? ".5" : ""),
- (unsigned long)ts.tv_sec, (unsigned long)ts.tv_nsec,
- rate / 1000, rate / 1024, iops / 100, iops % 100,
-test->area.sg_len);
+ mmc_host_info(test->card->host, "Transfer of %u x %u sectors (%u x %u%s KiB) took %lu.%09lu seconds (%u kB/s, %u KiB/s, %u.%02u IOPS,sg_len%d)\n",
+ count, sectors, count,
+ sectors >> 1, (sectors & 1 ? ".5" : ""),
+ (unsigned long)ts.tv_sec, (unsigned long)ts.tv_nsec,
+ rate / 1000, rate / 1024, iops / 100, iops % 100,
+test->area.sg_len);
I don't know why pr_info should be surely replaced by mmc_host_info. if it is needed for only host name, I think that existing pr_info/err/debug is sufficient.
Quoted 1,780 lines
mmc_test_save_transfer_result(test, count, sectors, ts, rate, iops); }
drivers/mmc/card/mmc_test.c +8
-12@@ -1407,8 +1406,7 @@ static int mmc_test_multi_read_high(struct mmc_test_card *test) static int mmc_test_no_highmem(struct mmc_test_card *test) { - pr_info("%s: Highmem not configured - test skipped\n", - mmc_hostname(test->card->host)); + mmc_host_info(test->card->host, "Highmem not configured - test skipped\n"); return 0; }@@ -1434,8 +1432,7 @@ static int mmc_test_area_map(struct mmc_test_card *test, unsigned long sz, t->max_seg_sz, &t->sg_len, min_sg_len); } if (err) - pr_info("%s: Failed to map sg list\n", - mmc_hostname(test->card->host)); + mmc_host_info(test->card->host, "Failed to map sg list\n"); return err; }@@ -2689,8 +2686,8 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase) { int i, ret; - pr_info("%s: Starting tests of card %s...\n", - mmc_hostname(test->card->host), mmc_card_id(test->card)); + mmc_host_info(test->card->host, "Starting tests of card %s...\n", + mmc_card_id(test->card)); mmc_claim_host(test->card->host);@@ -2700,16 +2697,14 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase) if (testcase && ((i + 1) != testcase)) continue; - pr_info("%s: Test case %d. %s...\n", - mmc_hostname(test->card->host), i + 1, - mmc_test_cases[i].name); + mmc_host_info(test->card->host, "Test case %d. %s...\n", + i + 1, mmc_test_cases[i].name); if (mmc_test_cases[i].prepare) { ret = mmc_test_cases[i].prepare(test); if (ret) { - pr_info("%s: Result: Prepare stage failed! (%d)\n", - mmc_hostname(test->card->host), - ret); + mmc_host_info(test->card->host, "Result: Prepare stage failed! (%d)\n", + ret); continue; } }@@ -2736,24 +2731,20 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase) ret = mmc_test_cases[i].run(test); switch (ret) {case
RESULT_OK:
- pr_info("%s: Result: OK\n",
-mmc_hostname(test->card->host));
+mmc_host_info(test->card->host, "Result: OK\n"); break;
caseRESULT_FAIL:
- pr_info("%s: Result: FAILED\n",
-mmc_hostname(test->card->host));
+mmc_host_info(test->card->host, "Result: FAILED\n"); break;
caseRESULT_UNSUP_HOST:
- pr_info("%s: Result: UNSUPPORTED (by host)\n",
-mmc_hostname(test->card->host));
+mmc_host_info(test->card->host, "Result: UNSUPPORTED (by host)\n"); break;
caseRESULT_UNSUP_CARD:
- pr_info("%s: Result: UNSUPPORTED (by card)\n",
-mmc_hostname(test->card->host));
+mmc_host_info(test->card->host, "Result: UNSUPPORTED (by card)\n"); break;
default:
- pr_info("%s: Result: ERROR (%d)\n",
-mmc_hostname(test->card->host), ret);
+ mmc_host_info(test->card->host, "Result: ERROR (%d)\n",
+ ret);
}/* Save the result */
drivers/mmc/card/mmc_test.c +2
-3@@ -2763,8 +2754,7 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase) if (mmc_test_cases[i].cleanup) { ret = mmc_test_cases[i].cleanup(test); if (ret) { - pr_info("%s: Warning: Cleanup stage failed! (%d)\n", - mmc_hostname(test->card->host), + mmc_host_info(test->card->host, "Warning: Cleanup stage failed! (%d)\n", ret); } }@@ -2772,7 +2762,7 @@ static void mmc_test_run(struct mmc_test_card *test, int testcase) mmc_release_host(test->card->host); - pr_info("%s: Tests completed\n", mmc_hostname(test->card->host)); + mmc_host_info(test->card->host, "Tests completed\n"); } static void mmc_test_free_result(struct mmc_card *card)drivers/mmc/core/bus.c +12
-15@@ -297,18 +297,16 @@ int mmc_add_card(struct mmc_card *card) } if (mmc_host_is_spi(card->host)) { - pr_info("%s: new %s%s%s card on SPI\n", - mmc_hostname(card->host), - mmc_card_highspeed(card) ? "high speed " : "", - mmc_card_ddr_mode(card) ? "DDR " : "", - type); + mmc_host_info(card->host, "new %s%s%s card on SPI\n", + mmc_card_highspeed(card) ? "high speed " : "", + mmc_card_ddr_mode(card) ? "DDR " : "", + type); } else { - pr_info("%s: new %s%s%s card at address %04x\n", - mmc_hostname(card->host), - mmc_sd_card_uhs(card) ? "ultra high speed " : - mmc_card_highspeed(card) ? "high speed " : "", - mmc_card_ddr_mode(card) ? "DDR " : "", - type, card->rca); + mmc_host_info(card->host, "new %s%s%s card at address %04x\n", + mmc_sd_card_uhs(card) ? "ultra high speed " : + mmc_card_highspeed(card) ? "high speed " : "", + mmc_card_ddr_mode(card) ? "DDR " : "", + type, card->rca); } #ifdef CONFIG_DEBUG_FS@@ -336,11 +334,10 @@ void mmc_remove_card(struct mmc_card *card) if (mmc_card_present(card)) { if (mmc_host_is_spi(card->host)) { - pr_info("%s: SPI card removed\n", - mmc_hostname(card->host)); + mmc_host_info(card->host, "SPI card removed\n"); } else { - pr_info("%s: card %04x removed\n", - mmc_hostname(card->host), card->rca); + mmc_host_info(card->host, "card %04x removed\n", + card->rca); } device_del(&card->dev); }drivers/mmc/core/core.c +29
-30@@ -155,23 +155,23 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq) led_trigger_event(host->led, LED_OFF); - pr_debug("%s: req done (CMD%u): %d: %08x %08x %08x %08x\n", - mmc_hostname(host), cmd->opcode, err, - cmd->resp[0], cmd->resp[1], - cmd->resp[2], cmd->resp[3]); + mmc_host_debug(host, "req done (CMD%u): %d: %08x %08x %08x %08x\n", + cmd->opcode, err, + cmd->resp[0], cmd->resp[1], + cmd->resp[2], cmd->resp[3]); if (mrq->data) { - pr_debug("%s: %d bytes transferred: %d\n", - mmc_hostname(host), - mrq->data->bytes_xfered, mrq->data->error); + mmc_host_debug(host, " %d bytes transferred: %d\n", + mrq->data->bytes_xfered, + mrq->data->error); } if (mrq->stop) { - pr_debug("%s: (CMD%u): %d: %08x %08x %08x %08x\n", - mmc_hostname(host), mrq->stop->opcode, - mrq->stop->error, - mrq->stop->resp[0], mrq->stop->resp[1], - mrq->stop->resp[2], mrq->stop->resp[3]); + mmc_host_debug(host, " (CMD%u): %d: %08x %08x %08x %08x\n", + mrq->stop->opcode, + mrq->stop->error, + mrq->stop->resp[0], mrq->stop->resp[1], + mrq->stop->resp[2], mrq->stop->resp[3]); } if (mrq->done)@@ -191,22 +191,21 @@ mmc_start_request(struct mmc_host *host, struct mmc_request *mrq) struct scatterlist *sg; #endif - pr_debug("%s: starting CMD%u arg %08x flags %08x\n", - mmc_hostname(host), mrq->cmd->opcode, - mrq->cmd->arg, mrq->cmd->flags); + mmc_host_debug(host, "starting CMD%u arg %08x flags %08x\n", + mrq->cmd->opcode, mrq->cmd->arg, mrq->cmd->flags); if (mrq->data) { - pr_debug("%s: blksz %d blocks %d flags %08x tsac %d ms nsac %d\n", - mmc_hostname(host), mrq->data->blksz, - mrq->data->blocks, mrq->data->flags, - mrq->data->timeout_ns / 1000000, - mrq->data->timeout_clks); + mmc_host_debug(host, " blksz %d blocks %d flags %08x tsac %d ms nsac %d\n", + mrq->data->blksz, + mrq->data->blocks, mrq->data->flags, + mrq->data->timeout_ns / 1000000, + mrq->data->timeout_clks); } if (mrq->stop) { - pr_debug("%s: CMD%u arg %08x flags %08x\n", - mmc_hostname(host), mrq->stop->opcode, - mrq->stop->arg, mrq->stop->flags); + mmc_host_debug(host, " CMD%u arg %08x flags %08x\n", + mrq->stop->opcode, + mrq->stop->arg, mrq->stop->flags); } WARN_ON(!host->claimed);@@ -264,8 +263,8 @@ static void mmc_wait_for_req_done(struct mmc_host *host, if (!cmd->error || !cmd->retries) break; - pr_debug("%s: req failed (CMD%u): %d, retrying...\n", - mmc_hostname(host), cmd->opcode, cmd->error); + mmc_host_debug(host, "req failed (CMD%u): %d, retrying...\n", + cmd->opcode, cmd->error); cmd->retries--; cmd->error = 0; host->ops->request(host, mrq);@@ -396,14 +395,14 @@ int mmc_interrupt_hpi(struct mmc_card *card) BUG_ON(!card); if (!card->ext_csd.hpi_en) { - pr_info("%s: HPI enable bit unset\n", mmc_hostname(card->host)); + mmc_host_info(card->host, "HPI enable bit unset\n"); return 1; } mmc_claim_host(card->host); err = mmc_send_status(card, &status); if (err) { - pr_err("%s: Get card status fail\n", mmc_hostname(card->host)); + mmc_host_err(card->host, "Get card status fail\n"); goto out; }@@ -422,15 +421,15 @@ int mmc_interrupt_hpi(struct mmc_card *card)*/ err = mmc_send_hpi_cmd(card, &status); if (err) - pr_debug("%s: abort HPI (%d error)\n", - mmc_hostname(card->host), err); + mmc_host_debug(card->host, "abort HPI (%d error)\n", + err); err = mmc_send_status(card, &status); if (err) break; } while (R1_CURRENT_STATE(status) == R1_STATE_PRG); } else - pr_debug("%s: Left prg-state\n", mmc_hostname(card->host)); + mmc_host_debug(card->host, "Left prg-state\n");out:
mmc_release_host(card->host);drivers/mmc/core/core.c +16
-22@@ -620,8 +619,7 @@ int mmc_host_enable(struct mmc_host *host) host->en_dis_recurs = 0; if (err) { - pr_debug("%s: enable error %d\n", - mmc_hostname(host), err); + mmc_host_debug(host, "enable error %d\n", err); return err; } }@@ -640,8 +638,7 @@ static int mmc_host_do_disable(struct mmc_host *host, int lazy) host->en_dis_recurs = 0; if (err < 0) { - pr_debug("%s: disable error %d\n", - mmc_hostname(host), err); + mmc_host_debug(host, "disable error %d\n", err); return err; } if (err > 0) {@@ -844,10 +841,10 @@ static inline void mmc_set_ios(struct mmc_host *host) { struct mmc_ios *ios = &host->ios; - pr_debug("%s: clock %uHz busmode %u powermode %u cs %u Vdd %u width %u timing %u\n", - mmc_hostname(host), ios->clock, ios->bus_mode, - ios->power_mode, ios->chip_select, ios->vdd, - ios->bus_width, ios->timing); + mmc_host_debug(host, "clock %uHz busmode %u powermode %u cs %u Vdd %u width %u timing %u\n", + ios->clock, ios->bus_mode, + ios->power_mode, ios->chip_select, ios->vdd, + ios->bus_width, ios->timing); if (ios->clock > 0) mmc_set_ungated(host);@@ -1164,8 +1161,7 @@ u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) mmc_set_ios(host); mmc_host_clk_release(host); } else { - pr_warn("%s: host doesn't support card's voltages\n", - mmc_hostname(host)); + mmc_host_warn(host, "host doesn't support card's voltages\n"); ocr = 0; }@@ -1893,8 +1889,8 @@ unsigned int mmc_calc_max_discard(struct mmc_card *card) } else if (max_discard < card->erase_size) { max_discard = 0; } - pr_debug("%s: calculated max. discard sectors %u for timeout %u ms\n", - mmc_hostname(host), max_discard, host->max_discard_to); + mmc_host_debug(host, "calculated max. discard sectors %u for timeout %u ms\n", + max_discard, host->max_discard_to); return max_discard; } EXPORT_SYMBOL(mmc_calc_max_discard);@@ -2006,8 +2002,8 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq) host->f_init = freq; #ifdef CONFIG_MMC_DEBUG - pr_info("%s: %s: trying to init card at %u Hz\n", - mmc_hostname(host), __func__, host->f_init); + mmc_host_info(host, "%s: trying to init card at %u Hz\n", + __func__, host->f_init); #endif mmc_power_up(host);@@ -2142,7 +2138,7 @@ int mmc_power_save_host(struct mmc_host *host) int ret = 0; #ifdef CONFIG_MMC_DEBUG - pr_info("%s: %s: powering down\n", mmc_hostname(host), __func__); + mmc_host_info(host, "%s: powering down\n", __func__); #endif mmc_bus_get(host);@@ -2168,7 +2164,7 @@ int mmc_power_restore_host(struct mmc_host *host) int ret; #ifdef CONFIG_MMC_DEBUG - pr_info("%s: %s: powering up\n", mmc_hostname(host), __func__); + mmc_host_info(host, "%s: powering up\n", __func__); #endif mmc_bus_get(host);@@ -2244,8 +2240,7 @@ int mmc_flush_cache(struct mmc_card *card) err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_FLUSH_CACHE, 1, 0); if (err) - pr_err("%s: cache flush error %d\n", - mmc_hostname(card->host), err); + mmc_host_err(card->host, "cache flush error %d\n", err); } return err;@@ -2274,10 +2269,8 @@ int mmc_cache_ctrl(struct mmc_host *host, u8 enable) err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_CACHE_CTRL, enable, 0); if (err) - pr_err("%s: cache %s error %d\n", - mmc_hostname(card->host), - enable ? "on" : "off", - err); + mmc_host_err(card->host, "cache %s error %d\n", + enable ? "on" : "off", err);else
card->ext_csd.cache_ctrl = enable; }drivers/mmc/core/core.c +2
-2@@ -2375,8 +2368,8 @@ int mmc_resume_host(struct mmc_host *host) BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { - pr_warn("%s: error %d during resume (card was removed?)\n", - mmc_hostname(host), err); + mmc_host_warn(host, "error %d during resume (card was removed?)\n", + err); err = 0; } }drivers/mmc/core/host.c +5
-8@@ -75,8 +75,7 @@ static ssize_t clkgate_delay_store(struct device *dev, host->clkgate_delay = value; spin_unlock_irqrestore(&host->clk_lock, flags); - pr_info("%s: clock gate delay set to %lu ms\n", - mmc_hostname(host), value); + mmc_host_info(host, "clock gate delay set to %lu ms\n", value); return count; }@@ -94,8 +93,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host) unsigned long flags; if (!freq) { - pr_debug("%s: frequency set to 0 in disable function, this means the clock is already disabled\n", - mmc_hostname(host)); + mmc_host_debug(host, "frequency set to 0 in disable function, this means the clock is already disabled\n"); return; } /*@@ -126,7 +124,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host) /* This will set host->ios.clock to 0 */ mmc_gate_clock(host); spin_lock_irqsave(&host->clk_lock, flags); - pr_debug("%s: gated MCI clock\n", mmc_hostname(host)); + mmc_host_debug(host, "gated MCI clock\n"); } spin_unlock_irqrestore(&host->clk_lock, flags); mutex_unlock(&host->clk_gate_mutex);@@ -163,7 +161,7 @@ void mmc_host_clk_hold(struct mmc_host *host) spin_unlock_irqrestore(&host->clk_lock, flags); mmc_ungate_clock(host); spin_lock_irqsave(&host->clk_lock, flags); - pr_debug("%s: ungated MCI clock\n", mmc_hostname(host)); + mmc_host_debug(host, "ungated MCI clock\n"); } host->clk_requests++; spin_unlock_irqrestore(&host->clk_lock, flags);@@ -277,8 +275,7 @@ static inline void mmc_host_clk_sysfs_init(struct mmc_host *host) host->clkgate_delay_attr.attr.name = "clkgate_delay"; host->clkgate_delay_attr.attr.mode = S_IRUGO | S_IWUSR; if (device_create_file(&host->class_dev, &host->clkgate_delay_attr)) - pr_err("%s: Failed to create clkgate_delay sysfs entry\n", - mmc_hostname(host)); + mmc_host_err(host, "Failed to create clkgate_delay sysfs entry\n"); } #elsedrivers/mmc/core/mmc.c +0
-0@@ -102,8 +102,8 @@ static int mmc_decode_cid(struct mmc_card *card) break;default:
- pr_err("%s: card has unknown MMCA version %d\n",
-mmc_hostname(card->host),card->csd.mmca_vsn);
+ mmc_host_err(card->host, "card has unknown MMCA version %d\n",
+ card->csd.mmca_vsn);
return-EINVAL;
}drivers/mmc/core/mmc.c +9
-13@@ -136,8 +136,8 @@ static int mmc_decode_csd(struct mmc_card *card)*/ csd->structure = UNSTUFF_BITS(resp, 126, 2); if (csd->structure == 0) { - pr_err("%s: unrecognised CSD structure version %d\n", - mmc_hostname(card->host), csd->structure); + mmc_host_err(card->host, "unrecognised CSD structure version %d\n", + csd->structure); return -EINVAL; }@@ -196,8 +196,7 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)*/ ext_csd = kmalloc(512, GFP_KERNEL); if (!ext_csd) { - pr_err("%s: could not allocate a buffer to receive the ext_csd\n", - mmc_hostname(card->host)); + mmc_host_err(card->host, "could not allocate a buffer to receive the ext_csd\n"); return -ENOMEM; }@@ -218,11 +217,9 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)* stored in their CSD. */ if (card->csd.capacity == (4096 * 512)) { - pr_err("%s: unable to read EXT_CSD on a possible high capacity card. Card will be ignored.\n", - mmc_hostname(card->host)); + mmc_host_err(card->host, "unable to read EXT_CSD on a possible high capacity card. Card will be ignored.\n"); } else { - pr_warn("%s: unable to read EXT_CSD, performance might suffer\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "unable to read EXT_CSD, performance might suffer\n"); err = 0; } } else@@ -249,9 +246,8 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE]; if (card->csd.structure == 3) { if (card->ext_csd.raw_ext_csd_structure > 2) { - pr_err("%s: unrecognised EXT_CSD structure version %d\n", - mmc_hostname(card->host), - card->ext_csd.raw_ext_csd_structure); + mmc_host_err(card->host, "unrecognised EXT_CSD structure version %d\n", + card->ext_csd.raw_ext_csd_structure); err = -EINVAL; goto out; }@@ -259,8 +255,8 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.rev = ext_csd[EXT_CSD_REV]; if (card->ext_csd.rev > 6) { - pr_err("%s: unrecognised EXT_CSD revision %d\n", - mmc_hostname(card->host), card->ext_csd.rev); + mmc_host_err(card->host, "unrecognised EXT_CSD revision %d\n", + card->ext_csd.rev); err = -EINVAL; goto out; }@@ -305,8 +301,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) break;default:
/* MMC v4 spec says this cannot happen */
- pr_warn("%s: card is mmc v4 but doesn't support any high-speed modes\n",
-mmc_hostname(card->host));
+mmc_host_warn(card->host, "card is mmc v4 but doesn't support any high-speed modes\n"); }card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT];
drivers/mmc/core/mmc.c +0
-0@@ -659,8 +654,7 @@ static int mmc_select_powerclass(struct mmc_card *card, index = EXT_CSD_PWR_CL_200_360; break;default:
- pr_warn("%s: Voltage range not supported for power class\n",
-mmc_hostname(host));
+mmc_host_warn(host, "Voltage range not supported for power class\n"); return-EINVAL;
}drivers/mmc/core/mmc.c +13
-19@@ -899,8 +893,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, goto free_card; if (err) { - pr_warn("%s: switch to highspeed failed\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "switch to highspeed failed\n"); err = 0; } else { mmc_card_set_highspeed(card);@@ -917,8 +910,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, if (err && err != -EBADMSG) goto free_card; if (err) { - pr_warn("%s: Enabling HPI failed\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "Enabling HPI failed\n"); err = 0; } else card->ext_csd.hpi_en = 1;@@ -982,9 +974,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, err = mmc_select_powerclass(card, ext_csd_bits[idx][0], ext_csd); if (err) - pr_err("%s: power class selection to bus width %d failed\n", - mmc_hostname(card->host), - 1 << bus_width); + mmc_host_err(card->host, "power class selection to bus width %d failed\n", + 1 << bus_width); err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH,@@ -1012,9 +1003,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, err = mmc_select_powerclass(card, ext_csd_bits[idx][1], ext_csd); if (err) - pr_err("%s: power class selection to bus width %d ddr %d failed\n", - mmc_hostname(card->host), - 1 << bus_width, ddr); + mmc_host_err(card->host, "power class selection to bus width %d ddr %d failed\n", + 1 << bus_width, ddr); err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH,@@ -1022,9 +1012,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, card->ext_csd.generic_cmd6_time); } if (err) { - pr_warn("%s: switch to bus width %d ddr %d failed\n", - mmc_hostname(card->host), - 1 << bus_width, ddr); + mmc_host_warn(card->host, "switch to bus width %d ddr %d failed\n", + 1 << bus_width, ddr); goto free_card; } else if (ddr) { /*@@ -1187,8 +1176,8 @@ static int mmc_sleep(struct mmc_host *host) if (card && card->ext_csd.rev >= 3) { err = mmc_card_sleepawake(host, 1); if (err < 0) - pr_debug("%s: Error %d while putting card into sleep", - mmc_hostname(host), err); + mmc_host_debug(host, "Error %d while putting card into sleep\n", + err); } return err;@@ -1202,8 +1191,8 @@ static int mmc_awake(struct mmc_host *host) if (card && card->ext_csd.rev >= 3) { err = mmc_card_sleepawake(host, 0); if (err < 0) - pr_debug("%s: Error %d while awaking sleeping card", - mmc_hostname(host), err); + mmc_host_debug(host, "Error %d while awaking sleeping card\n", + err); } return err;@@ -1277,8 +1266,7 @@ int mmc_attach_mmc(struct mmc_host *host)* support. */ if (ocr & 0x7F) { - pr_warn("%s: card claims to support voltages below the defined range. These will be ignored.\n", - mmc_hostname(host)); + mmc_host_warn(host, "card claims to support voltages below the defined range. These will be ignored.\n"); ocr &= ~0x7F; }@@ -1315,8 +1303,7 @@ remove_card:err:
mmc_detach_bus(host);- pr_err("%s: error %d whilst initialising MMC card\n",
-mmc_hostname(host), err);
+mmc_host_err(host, "error %d whilst initialising MMC card\n", err);return err;
}drivers/mmc/core/mmc_ops.c +5
-6@@ -415,8 +415,8 @@ int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, return -EBADMSG; } else { if (status & 0xFDFFA000) - pr_warn("%s: unexpected status %#x after switch\n", - mmc_hostname(card->host), status); + mmc_host_warn(card->host, "unexpected status %#x after switch\n", + status); if (status & R1_SWITCH_ERROR) return -EBADMSG; }@@ -477,8 +477,7 @@ mmc_send_bus_test(struct mmc_card *card, struct mmc_host *host, u8 opcode, else if (len == 4) test_buf = testdata_4bit; else { - pr_err("%s: Invalid bus_width %d\n", - mmc_hostname(host), len); + mmc_host_err(host, "Invalid bus_width %d\n", len); kfree(data_buf); return -EINVAL; }@@ -569,8 +568,8 @@ int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status) err = mmc_wait_for_cmd(card->host, &cmd, 0); if (err) { - pr_warn("%s: error %d interrupting operation. HPI command response %#x\n", - mmc_hostname(card->host), err, cmd.resp[0]); + mmc_host_warn(card->host, "error %d interrupting operation. HPI command response %#x\n", + err, cmd.resp[0]); return err; } if (status)drivers/mmc/core/sd.c +0
-0@@ -166,8 +166,8 @@ static int mmc_decode_csd(struct mmc_card *card) csd->erase_size = 1; break;default:
- pr_err("%s: unrecognised CSD structure version %d\n",
-mmc_hostname(card->host),csd_struct);
+ mmc_host_err(card->host, "unrecognised CSD structure version %d\n",
+ csd_struct);
return-EINVAL;
}drivers/mmc/core/sd.c +5
-8@@ -190,8 +190,8 @@ static int mmc_decode_scr(struct mmc_card *card) scr_struct = UNSTUFF_BITS(resp, 60, 4); if (scr_struct != 0) { - pr_err("%s: unrecognised SCR structure version %d\n", - mmc_hostname(card->host), scr_struct); + mmc_host_err(card->host, "unrecognised SCR structure version %d\n", + scr_struct); return -EINVAL; }@@ -221,8 +221,7 @@ static int mmc_read_ssr(struct mmc_card *card) u32 *ssr; if (!(card->csd.cmdclass & CCC_APP_SPEC)) { - pr_warn("%s: card lacks mandatory SD Status function\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "card lacks mandatory SD Status function\n"); return 0; }@@ -232,8 +231,7 @@ static int mmc_read_ssr(struct mmc_card *card) err = mmc_app_sd_status(card, ssr); if (err) { - pr_warn("%s: problem reading SD Status register\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "problem reading SD Status register\n"); err = 0; goto out; }@@ -256,8 +254,7 @@ static int mmc_read_ssr(struct mmc_card *card) card->ssr.erase_offset = eo * 1000; } } else { - pr_warn("%s: SD Status: Invalid Allocation Unit size\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "SD Status: Invalid Allocation Unit size\n"); }out:
kfree(ssr);drivers/mmc/core/sd.c +13
-26@@ -276,8 +273,7 @@ static int mmc_read_switch(struct mmc_card *card) return 0; if (!(card->csd.cmdclass & CCC_SWITCH)) { - pr_warn("%s: card lacks mandatory switch function, performance might suffer\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "card lacks mandatory switch function, performance might suffer\n"); return 0; }@@ -285,8 +281,7 @@ static int mmc_read_switch(struct mmc_card *card) status = kmalloc(64, GFP_KERNEL); if (!status) { - pr_err("%s: could not allocate a buffer for switch capabilities\n", - mmc_hostname(card->host)); + mmc_host_err(card->host, "could not allocate a buffer for switch capabilities\n"); return -ENOMEM; }@@ -300,8 +295,7 @@ static int mmc_read_switch(struct mmc_card *card) if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) goto out; - pr_warn("%s: problem reading Bus Speed modes\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "problem reading Bus Speed modes\n"); err = 0; goto out;@@ -323,8 +317,7 @@ static int mmc_read_switch(struct mmc_card *card) if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) goto out; - pr_warn("%s: problem reading Driver Strength\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "problem reading Driver Strength\n"); err = 0; goto out;@@ -342,8 +335,7 @@ static int mmc_read_switch(struct mmc_card *card) if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) goto out; - pr_warn("%s: problem reading Current Limit\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "problem reading Current Limit\n"); err = 0; goto out;@@ -382,8 +374,7 @@ int mmc_sd_switch_hs(struct mmc_card *card) status = kmalloc(64, GFP_KERNEL); if (!status) { - pr_err("%s: could not allocate a buffer for switch capabilities\n", - mmc_hostname(card->host)); + mmc_host_err(card->host, "could not allocate a buffer for switch capabilities\n"); return -ENOMEM; }@@ -392,8 +383,7 @@ int mmc_sd_switch_hs(struct mmc_card *card) goto out; if ((status[16] & 0xF) != 1) { - pr_warn("%s: problem switching card into high-speed mode!\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "problem switching card into high-speed mode!\n"); err = 0; } else { err = 1;@@ -457,8 +447,7 @@ static int sd_select_driver_type(struct mmc_card *card, u8 *status) return err; if ((status[15] & 0xF) != drive_strength) { - pr_warn("%s: problem setting drive strength!\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "problem setting drive strength!\n"); return 0; }@@ -536,8 +525,7 @@ static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status) return err; if ((status[16] & 0xF) != card->sd_bus_speed) - pr_warn("%s: problem setting bus speed mode!\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "problem setting bus speed mode!\n"); else { mmc_set_timing(card->host, timing); mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr);@@ -598,8 +586,7 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status) return err; if (((status[15] >> 4) & 0x0F) != current_limit) - pr_warn("%s: problem setting current limit!\n", - mmc_hostname(card->host)); + mmc_host_warn(card->host, "problem setting current limit!\n"); return 0; }@@ -620,8 +607,7 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) status = kmalloc(64, GFP_KERNEL); if (!status) { - pr_err("%s: could not allocate a buffer for switch capabilities\n", - mmc_hostname(card->host)); + mmc_host_err(card->host, "could not allocate a buffer for switch capabilities\n"); return -ENOMEM; }@@ -850,8 +836,7 @@ int mmc_sd_setup_card(struct mmc_host *host, struct mmc_card *card, ro = host->ops->get_ro(host); if (ro < 0) { - pr_warn("%s: host does not support reading read-only switch. assuming write-enable.\n", - mmc_hostname(host)); + mmc_host_warn(host, "host does not support reading read-only switch. assuming write-enable.\n"); } else if (ro > 0) { mmc_card_set_readonly(card); }@@ -1162,15 +1147,13 @@ int mmc_attach_sd(struct mmc_host *host)* support. */ if (ocr & 0x7F) { - pr_warn("%s: card claims to support voltages below the defined range. These will be ignored.\n", - mmc_hostname(host)); + mmc_host_warn(host, "card claims to support voltages below the defined range. These will be ignored.\n"); ocr &= ~0x7F; }if ((ocr &
MMC_VDD_165_195) &&
!(host->ocr_avail_sd &MMC_VDD_165_195)) {
- pr_warn("%s: SD card claims to support the incompletely defined 'low voltage range'. This will be ignored.\n",
-mmc_hostname(host));
+ mmc_host_warn(host, "SD card claims to support the incompletely defined 'low voltage range'. This will be ignored.\n"); ocr &= ~MMC_VDD_165_195;
}drivers/mmc/core/sd.c +0
-0@@ -1207,8 +1190,7 @@ remove_card:err:
mmc_detach_bus(host);- pr_err("%s: error %d whilst initialising SD card\n",
-mmc_hostname(host), err);
+mmc_host_err(host, "error %d whilst initialising SD card\n", err);return err;
}drivers/mmc/core/sdio.c +3
-4@@ -112,8 +112,8 @@ static int sdio_read_cccr(struct mmc_card *card) cccr_vsn = data & 0x0f; if (cccr_vsn > SDIO_CCCR_REV_3_00) { - pr_err("%s: unrecognised CCCR structure version %d\n", - mmc_hostname(card->host), cccr_vsn); + mmc_host_err(card->host, "unrecognised CCCR structure version %d\n", + cccr_vsn); return -EINVAL; }@@ -777,8 +777,7 @@ int mmc_attach_sdio(struct mmc_host *host)* support. */ if (ocr & 0x7F) { - pr_warn("%s: card claims to support voltages below the defined range. These will be ignored.\n", - mmc_hostname(host)); + mmc_host_warn(host, "card claims to support voltages below the defined range. These will be ignored.\n"); ocr &= ~0x7F; }@@ -873,8 +872,7 @@ remove:err:
mmc_detach_bus(host);- pr_err("%s: error %d whilst initialising SDIO card\n",
-mmc_hostname(host), err);
+mmc_host_err(host, "error %d whilst initialising SDIO card\n", err);return err;
}drivers/mmc/core/sdio_cis.c +4
-5@@ -132,8 +132,8 @@ static int cis_tpl_parse(struct mmc_card *card, struct sdio_func *func, ret = -EINVAL; } if (ret && ret != -EILSEQ && ret != -ENOENT) { - pr_err("%s: bad %s tuple 0x%02x (%u bytes)\n", - mmc_hostname(card->host), tpl_descr, code, size); + mmc_host_err(card->host, "bad %s tuple 0x%02x (%u bytes)\n", + tpl_descr, code, size); } } else { /* unknown tuple */@@ -313,9 +313,8 @@ static int sdio_read_cis(struct mmc_card *card, struct sdio_func *func) if (ret == -ENOENT) { /* warn about unknown tuples */ - pr_warn("%s: queuing unknown CIS tuple 0x%02x (%u bytes)\n", - mmc_hostname(card->host), - tpl_code, tpl_link); + mmc_host_warn(card->host, "queuing unknown CIS tuple 0x%02x (%u bytes)\n", + tpl_code, tpl_link); } /* keep on analyzing tuples */drivers/mmc/core/sdio_irq.c +0
-0@@ -97,8 +97,8 @@ static int sdio_irq_thread(void *_host)period = (
host->caps&MMC_CAP_SDIO_IRQ) ?MAX_SCHEDULE_TIMEOUT:idle_period;- pr_debug("%s: IRQ thread started (poll period = %lu jiffies)\n",
- mmc_hostname(host), period);
+ mmc_host_debug(host, "IRQ thread started (poll period = %lu jiffies)\n",
+ period);do {
/*drivers/mmc/core/sdio_irq.c +1
-2@@ -157,8 +157,7 @@ static int sdio_irq_thread(void *_host) if (host->caps & MMC_CAP_SDIO_IRQ) host->ops->enable_sdio_irq(host, 0); - pr_debug("%s: IRQ thread exiting with code %d\n", - mmc_hostname(host), ret); + mmc_host_debug(host, "IRQ thread exiting with code %d\n", ret); return ret; }drivers/mmc/host/at91_mci.c +5
-4@@ -881,8 +881,8 @@ static irqreturn_t at91_mmc_det_irq(int irq, void *_host)*/ if (present != host->present) { host->present = present; - pr_debug("%s: card %s\n", mmc_hostname(host->mmc), - present ? "insert" : "remove"); + mmc_host_debug(host->mmc, "card %s\n", + present ? "insert" : "remove"); if (!present) { pr_debug("****** Resetting SD-card bus width ******\n"); at91_mci_write(host, AT91_MCI_SDCR, at91_mci_read(host, AT91_MCI_SDCR) & ~AT91_MCI_SDCBUS);@@ -910,8 +910,9 @@ static void at91_mci_enable_sdio_irq(struct mmc_host *mmc, int enable) { struct at91mci_host *host = mmc_priv(mmc); - pr_debug("%s: sdio_irq %c : %s\n", mmc_hostname(host->mmc), - host->board->slot_b ? 'B':'A', enable ? "enable" : "disable"); + mmc_host_debug(host->mmc, "sdio_irq %c : %s\n", + host->board->slot_b ? 'B' : 'A', + enable ? "enable" : "disable"); at91_mci_write(host, enable ? AT91_MCI_IER : AT91_MCI_IDR, host->board->slot_b ? AT91_MCI_SDIOIRQB : AT91_MCI_SDIOIRQA);drivers/mmc/host/dw_mmc.c +1
-1@@ -1712,7 +1712,7 @@ static int __init dw_mci_init_slot(struct dw_mci *host, unsigned int id) host->vmmc = regulator_get(mmc_dev(mmc), "vmmc"); if (IS_ERR(host->vmmc)) { - pr_info("%s: no vmmc regulator found\n", mmc_hostname(mmc)); + mmc_host_info(mmc, "no vmmc regulator found\n"); host->vmmc = NULL; } else regulator_enable(host->vmmc);drivers/mmc/host/msm_sdcc.c +7
-8@@ -141,16 +141,15 @@ static void msmsdcc_reset_and_restore(struct msmsdcc_host *host) /* Reset the controller */ ret = clk_reset(host->clk, CLK_RESET_ASSERT); if (ret) - pr_err("%s: Clock assert failed at %u Hz with err %d\n", - mmc_hostname(host->mmc), host->clk_rate, ret); + mmc_host_err(host->mmc, "Clock assert failed at %u Hz with err %d\n", + host->clk_rate, ret); ret = clk_reset(host->clk, CLK_RESET_DEASSERT); if (ret) - pr_err("%s: Clock deassert failed at %u Hz with err %d\n", - mmc_hostname(host->mmc), host->clk_rate, ret); + mmc_host_err(host->mmc, "Clock deassert failed at %u Hz with err %d\n", + host->clk_rate, ret); - pr_info("%s: Controller has been re-initialiazed\n", - mmc_hostname(host->mmc)); + mmc_host_info(host->mmc, "Controller has been re-initialized\n"); /* Restore the contoller state */ writel(host->pwr, host->base + MMCIPOWER);@@ -158,8 +157,8 @@ static void msmsdcc_reset_and_restore(struct msmsdcc_host *host) writel(mci_mask0, host->base + MMCIMASK0); ret = clk_set_rate(host->clk, host->clk_rate); if (ret) - pr_err("%s: Failed to set clk rate %u Hz (%d)\n", - mmc_hostname(host->mmc), host->clk_rate, ret); + mmc_host_err(host->mmc, "Failed to set clk rate %u Hz (%d)\n", + host->clk_rate, ret); }static void
drivers/mmc/host/msm_sdcc.c +17
-21@@ -251,11 +250,11 @@ msmsdcc_dma_complete_tlet(unsigned long data) } else { /* Error or flush */ if (host->dma.result & DMOV_RSLT_ERROR) - pr_err("%s: DMA error (0x%.8x)\n", - mmc_hostname(host->mmc), host->dma.result); + mmc_host_err(host->mmc, "DMA error (0x%.8x)\n", + host->dma.result); if (host->dma.result & DMOV_RSLT_FLUSH) - pr_err("%s: DMA channel flushed (0x%.8x)\n", - mmc_hostname(host->mmc), host->dma.result); + mmc_host_err(host->mmc, "DMA channel flushed (0x%.8x)\n", + host->dma.result); pr_err("Flush data: %.8x %.8x %.8x %.8x %.8x %.8x\n", err.flush[0], err.flush[1], err.flush[2],@@ -389,8 +388,7 @@ static int msmsdcc_config_dma(struct msmsdcc_host *host, struct mmc_data *data) n = dma_map_sg(mmc_dev(host->mmc), host->dma.sg, host->dma.num_ents, host->dma.dir); if (n == 0) { - pr_err("%s: Unable to map in all sg elements\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Unable to map in all sg elements\n"); host->dma.sg = NULL; host->dma.num_ents = 0; return -ENOMEM;@@ -475,8 +473,7 @@ msmsdcc_start_command_deferred(struct msmsdcc_host *host, *c |= MCI_CSPM_MCIABORT; if (host->curr.cmd != NULL) { - pr_err("%s: Overlapping command requests\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Overlapping command requests\n"); } host->curr.cmd = cmd; }@@ -573,24 +570,23 @@ msmsdcc_data_err(struct msmsdcc_host *host, struct mmc_data *data, unsigned int status) { if (status & MCI_DATACRCFAIL) { - pr_err("%s: Data CRC error\n", mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Data CRC error\n"); pr_err("%s: opcode 0x%.8x\n", __func__, data->mrq->cmd->opcode); pr_err("%s: blksz %d, blocks %d\n", __func__, data->blksz, data->blocks); data->error = -EILSEQ; } else if (status & MCI_DATATIMEOUT) { - pr_err("%s: Data timeout\n", mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Data timeout\n"); data->error = -ETIMEDOUT; } else if (status & MCI_RXOVERRUN) { - pr_err("%s: RX overrun\n", mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "RX overrun\n"); data->error = -EIO; } else if (status & MCI_TXUNDERRUN) { - pr_err("%s: TX underrun\n", mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "TX underrun\n"); data->error = -EIO; } else { - pr_err("%s: Unknown error (0x%.8x)\n", - mmc_hostname(host->mmc), status); + mmc_host_err(host->mmc, "Unknown error (0x%.8x)\n", status); data->error = -EIO; } }@@ -751,7 +747,7 @@ static void msmsdcc_do_cmdirq(struct msmsdcc_host *host, uint32_t status) cmd->error = -ETIMEDOUT; } else if (status & MCI_CMDCRCFAIL && cmd->flags & MMC_RSP_CRC) { - pr_err("%s: Command CRC error\n", mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Command CRC error\n"); cmd->error = -EILSEQ; }@@ -960,10 +956,9 @@ static void msmsdcc_setup_gpio(struct msmsdcc_host *host, bool enable) rc = gpio_request(curr->gpio[i].no, curr->gpio[i].name); if (rc) { - pr_err("%s: gpio_request(%d, %s) failed %d\n", - mmc_hostname(host->mmc), - curr->gpio[i].no, - curr->gpio[i].name, rc); + mmc_host_err(host->mmc, "gpio_request(%d, %s) failed %d\n", + curr->gpio[i].no, + curr->gpio[i].name, rc); goto free_gpios; } } else {@@ -996,8 +991,8 @@ msmsdcc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) if (ios->clock != host->clk_rate) { rc = clk_set_rate(host->clk, ios->clock); if (rc < 0) - pr_err("%s: Error setting clock rate (%d)\n", - mmc_hostname(host->mmc), rc); + mmc_host_err(host->mmc, "Error setting clock rate (%d)\n", + rc);else
host->clk_rate =ios->clock; }drivers/mmc/host/msm_sdcc.c +2
-2@@ -1093,8 +1088,8 @@ msmsdcc_check_status(unsigned long data) status = host->plat->status(mmc_dev(host->mmc)); host->eject = !status; if (status ^ host->oldstat) { - pr_info("%s: Slot status change detected (%d -> %d)\n", - mmc_hostname(host->mmc), host->oldstat, status); + mmc_host_info(host->mmc, "Slot status change detected (%d -> %d)\n", + host->oldstat, status); if (status) mmc_detect_change(host->mmc, (5 * HZ) / 2);else
drivers/mmc/host/msm_sdcc.c +20
-24@@ -1123,8 +1118,7 @@ msmsdcc_status_notify_cb(int card_present, void *dev_id) { struct msmsdcc_host *host = dev_id; - pr_debug("%s: card_present %d\n", mmc_hostname(host->mmc), - card_present); + mmc_host_debug(host->mmc, "card_present %d\n", card_present); msmsdcc_check_status((unsigned long) host); }@@ -1321,15 +1315,14 @@ msmsdcc_probe(struct platform_device *pdev) DRIVER_NAME " (slot)", host); if (ret) { - pr_err("%s: Unable to get slot IRQ %d (%d)\n", - mmc_hostname(mmc), host->stat_irq, ret); + mmc_host_err(mmc, "Unable to get slot IRQ %d (%d)\n", + host->stat_irq, ret); goto clk_disable; } } else if (plat->register_status_notify) { plat->register_status_notify(msmsdcc_status_notify_cb, host); } else if (!plat->status) - pr_err("%s: No card detect facilities available\n", - mmc_hostname(mmc)); + mmc_host_err(mmc, "No card detect facilities available\n"); else { init_timer(&host->timer); host->timer.data = (unsigned long)host;@@ -1356,28 +1349,26 @@ msmsdcc_probe(struct platform_device *pdev) mmc_set_drvdata(pdev, mmc); mmc_add_host(mmc); - pr_info("%s: Qualcomm MSM SDCC at 0x%016llx irq %d,%d dma %d\n", - mmc_hostname(mmc), (unsigned long long)memres->start, - (unsigned int) cmd_irqres->start, - (unsigned int) host->stat_irq, host->dma.channel); - pr_info("%s: 4 bit data mode %s\n", mmc_hostname(mmc), - (mmc->caps & MMC_CAP_4_BIT_DATA ? "enabled" : "disabled")); - pr_info("%s: MMC clock %u -> %u Hz, PCLK %u Hz\n", - mmc_hostname(mmc), msmsdcc_fmin, msmsdcc_fmax, host->pclk_rate); - pr_info("%s: Slot eject status = %d\n", mmc_hostname(mmc), host->eject); - pr_info("%s: Power save feature enable = %d\n", - mmc_hostname(mmc), msmsdcc_pwrsave); + mmc_host_info(mmc, "Qualcomm MSM SDCC at 0x%016llx irq %d,%d dma %d\n", + (unsigned long long)memres->start, + (unsigned int) cmd_irqres->start, + (unsigned int) host->stat_irq, host->dma.channel); + mmc_host_info(mmc, "4 bit data mode %s\n", + mmc->caps & MMC_CAP_4_BIT_DATA ? "enabled" : "disabled"); + mmc_host_info(mmc, "MMC clock %u -> %u Hz, PCLK %u Hz\n", + msmsdcc_fmin, msmsdcc_fmax, host->pclk_rate); + mmc_host_info(mmc, "Slot eject status = %d\n", host->eject); + mmc_host_info(mmc, "Power save feature enable = %d\n", msmsdcc_pwrsave); if (host->dma.channel != -1) { - pr_info("%s: DM non-cached buffer at %p, dma_addr 0x%.8x\n", - mmc_hostname(mmc), host->dma.nc, host->dma.nc_busaddr); - pr_info("%s: DM cmd busaddr 0x%.8x, cmdptr busaddr 0x%.8x\n", - mmc_hostname(mmc), host->dma.cmd_busaddr, - host->dma.cmdptr_busaddr); + mmc_host_info(mmc, "DM non-cached buffer at %p, dma_addr 0x%.8x\n", + host->dma.nc, host->dma.nc_busaddr); + mmc_host_info(mmc, "DM cmd busaddr 0x%.8x, cmdptr busaddr 0x%.8x\n", + host->dma.cmd_busaddr, host->dma.cmdptr_busaddr); } else - pr_info("%s: PIO transfer enabled\n", mmc_hostname(mmc)); + mmc_host_info(mmc, "PIO transfer enabled\n"); if (host->timer.function) - pr_info("%s: Polling status mode enabled\n", mmc_hostname(mmc)); + mmc_host_info(mmc, "Polling status mode enabled\n"); return 0;cmd_irq_free:
drivers/mmc/host/mvsdio.c +14
-19@@ -117,9 +117,8 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data) host->pio_size = data->blocks * data->blksz; host->pio_ptr = sg_virt(data->sg); if (!nodma) - pr_debug("%s: fallback to PIO for data at 0x%p size %d\n", - mmc_hostname(host->mmc), - host->pio_ptr, host->pio_size); + mmc_host_debug(host->mmc, "fallback to PIO for data at 0x%p size %d\n", + host->pio_ptr, host->pio_size); return 1; } else { dma_addr_t phys_addr;@@ -470,8 +469,8 @@ static irqreturn_t mvsd_irq(int irq, void *dev) if (mrq->data) err_status = mvsd_finish_data(host, mrq->data, err_status); if (err_status) { - pr_err("%s: unhandled error status %#04x\n", - mmc_hostname(host->mmc), err_status); + mmc_host_err(host->mmc, "unhandled error status %#04x\n", + err_status); cmd->error = -ENOMSG; }@@ -488,9 +487,8 @@ static irqreturn_t mvsd_irq(int irq, void *dev) if (irq_handled) return IRQ_HANDLED; - pr_err("%s: unhandled interrupt status=0x%04x en=0x%04x pio=%d\n", - mmc_hostname(host->mmc), intr_status, - host->intr_en, host->pio_size); + mmc_host_err(host->mmc, "unhandled interrupt status=0x%04x en=0x%04x pio=%d\n", + intr_status, host->intr_en, host->pio_size); return IRQ_NONE; }@@ -504,13 +502,11 @@ static void mvsd_timeout_timer(unsigned long data) spin_lock_irqsave(&host->lock, flags); mrq = host->mrq; if (mrq) { - pr_err("%s: Timeout waiting for hardware interrupt\n", - mmc_hostname(host->mmc)); - pr_err("%s: hw_state=0x%04x, intr_status=0x%04x intr_en=0x%04x\n", - mmc_hostname(host->mmc), - mvsd_read(MVSD_HW_STATE), - mvsd_read(MVSD_NOR_INTR_STATUS), - mvsd_read(MVSD_NOR_INTR_EN)); + mmc_host_err(host->mmc, "Timeout waiting for hardware interrupt\n"); + mmc_host_err(host->mmc, "hw_state=0x%04x, intr_status=0x%04x intr_en=0x%04x\n", + mvsd_read(MVSD_HW_STATE), + mvsd_read(MVSD_NOR_INTR_STATUS), + mvsd_read(MVSD_NOR_INTR_EN)); host->mrq = NULL;@@ -801,13 +797,12 @@ static int __init mvsd_probe(struct platform_device *pdev) if (ret) goto out; - pr_notice("%s: %s driver initialized, ", - mmc_hostname(mmc), DRIVER_NAME); + mmc_host_notice(mmc, "%s driver initialized, ", DRIVER_NAME); if (host->gpio_card_detect) - printk("using GPIO %d for card detection\n", - host->gpio_card_detect); + pr_cont("using GPIO %d for card detection\n", + host->gpio_card_detect);else
-printk("lacking card detect (fall back to polling)\n");
+pr_cont("lacking card detect (fall back to polling)\n"); return 0;out:
drivers/mmc/host/omap_hsmmc.c +2
-5@@ -1264,15 +1264,12 @@ static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host) host->reqs_blocked = 0; if (mmc_slot(host).get_cover_state(host->dev, host->slot_id)) { if (host->protect_card) { - pr_info("%s: cover is closed, card is now accessible\n", - mmc_hostname(host->mmc)); + mmc_host_info(host->mmc, "cover is closed, card is now accessible\n"); host->protect_card = 0; } } else { if (!host->protect_card) { - pr_info("%s: cover is open, " - "card is now inaccessible\n", - mmc_hostname(host->mmc)); + mmc_host_info(host->mmc, "cover is open, card is now inaccessible\n"); host->protect_card = 1; } }drivers/mmc/host/pxamci.c +2
-2@@ -558,8 +558,8 @@ static void pxamci_dma_irq(int dma, void *devid) if (dcsr & DCSR_ENDINTR) { writel(BUF_PART_FULL, host->base + MMC_PRTBUF); } else { - pr_err("%s: DMA error on channel %d (DCSR=%#x)\n", - mmc_hostname(host->mmc), dma, dcsr); + mmc_host_err(host->mmc, "DMA error on channel %d (DCSR=%#x)\n", + dma, dcsr); host->data->error = -EIO; pxamci_data_done(host, 0); }drivers/mmc/host/sdhci.c +7
-10@@ -202,8 +202,8 @@ static void sdhci_reset(struct sdhci_host *host, u8 mask) /* hw clears the bit when it's done */ while (sdhci_readb(host, SDHCI_SOFTWARE_RESET) & mask) { if (timeout == 0) { - pr_err("%s: Reset 0x%x never completed.\n", - mmc_hostname(host->mmc), (int)mask); + mmc_host_err(host->mmc, "Reset 0x%x never completed\n", + (int)mask); sdhci_dumpregs(host); return; }@@ -679,8 +679,8 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) } if (count >= 0xF) { - pr_warn("%s: Too large timeout requested for CMD%d!\n", - mmc_hostname(host->mmc), cmd->opcode); + mmc_host_warn(host->mmc, "Too large timeout requested for CMD%d!\n", + cmd->opcode); count = 0xE; }@@ -972,8 +972,7 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) { if (timeout == 0) { - pr_err("%s: Controller never released inhibit bit(s)\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Controller never released inhibit bit(s)\n"); sdhci_dumpregs(host); cmd->error = -EIO; tasklet_schedule(&host->finish_tasklet);@@ -994,8 +993,7 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) sdhci_set_transfer_mode(host, cmd); if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) { - pr_err("%s: Unsupported response type!\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Unsupported response type!\n"); cmd->error = -EINVAL; tasklet_schedule(&host->finish_tasklet); return;@@ -1154,8 +1152,7 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL)) & SDHCI_CLOCK_INT_STABLE)) { if (timeout == 0) { - pr_err("%s: Internal clock never stabilised\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Internal clock never stabilised\n"); sdhci_dumpregs(host); return; }@@ -1912,10 +1909,8 @@ static void sdhci_tasklet_card(unsigned long param) /* Check host->mrq first in case we are runtime suspended */if (
host->mrq&&
!(sdhci_readl(host,SDHCI_PRESENT_STATE) &SDHCI_CARD_PRESENT)) {
- pr_err("%s: Card removed during transfer!\n",
-mmc_hostname(host->mmc));
- pr_err("%s: Resetting controller.\n",
-mmc_hostname(host->mmc));
+mmc_host_err(host->mmc, "Card removed during transfer!\n");
+mmc_host_err(host->mmc, "Resetting controller.\n");sdhci_reset(host,
SDHCI_RESET_CMD);sdhci_reset(host, SDHCI_RESET_DATA);drivers/mmc/host/sdhci.c +12
-15@@ -2003,8 +1998,7 @@ static void sdhci_timeout_timer(unsigned long data) spin_lock_irqsave(&host->lock, flags); if (host->mrq) { - pr_err("%s: Timeout waiting for hardware interrupt\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Timeout waiting for hardware interrupt\n"); sdhci_dumpregs(host); if (host->data) {@@ -2049,8 +2043,8 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask) BUG_ON(intmask == 0); if (!host->cmd) { - pr_err("%s: Got command interrupt 0x%08x even though no command operation was in progress\n", - mmc_hostname(host->mmc), (unsigned)intmask); + mmc_host_err(host->mmc, "Got command interrupt 0x%08x even though no command operation was in progress\n", + (unsigned)intmask); sdhci_dumpregs(host); return; }@@ -2147,8 +2141,8 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) } } - pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress\n", - mmc_hostname(host->mmc), (unsigned)intmask); + mmc_host_err(host->mmc, "Got data interrupt 0x%08x even though no data operation was in progress\n", + (unsigned)intmask); sdhci_dumpregs(host); return;@@ -2163,7 +2157,7 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) != MMC_BUS_TEST_R) host->data->error = -EILSEQ; else if (intmask & SDHCI_INT_ADMA_ERROR) { - pr_err("%s: ADMA error\n", mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "ADMA error\n"); sdhci_show_adma_error(host); host->data->error = -EIO; }@@ -2226,8 +2220,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) if (host->runtime_suspended) { spin_unlock(&host->lock); - pr_warn("%s: got irq while runtime suspended\n", - mmc_hostname(host->mmc)); + mmc_host_warn(host->mmc, "got irq while runtime suspended\n"); return IRQ_HANDLED; }@@ -2283,8 +2276,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) intmask &= ~SDHCI_INT_ERROR; if (intmask & SDHCI_INT_BUS_POWER) { - pr_err("%s: Card is consuming too much power!\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Card is consuming too much power!\n"); sdhci_writel(host, SDHCI_INT_BUS_POWER, SDHCI_INT_STATUS); }@@ -2296,8 +2288,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) intmask &= ~SDHCI_INT_CARD_INT; if (intmask) { - pr_err("%s: Unexpected interrupt 0x%08x.\n", - mmc_hostname(host->mmc), intmask); + mmc_host_err(host->mmc, "Unexpected interrupt 0x%08x\n", + intmask); sdhci_dumpregs(host); sdhci_writel(host, intmask, SDHCI_INT_STATUS);@@ -2537,8 +2529,8 @@ int sdhci_add_host(struct sdhci_host *host) host->version = (host->version & SDHCI_SPEC_VER_MASK) >> SDHCI_SPEC_VER_SHIFT; if (host->version > SDHCI_SPEC_300) { - pr_err("%s: Unknown controller version (%d). You may experience problems.\n", - mmc_hostname(mmc), host->version); + mmc_host_err(mmc, "Unknown controller version (%d). You may experience problems.\n", + host->version); }caps[0] = (
host->quirks&SDHCI_QUIRK_MISSING_CAPS) ?host->caps:drivers/mmc/host/sdhci.c +1
-2@@ -2573,8 +2565,7 @@ int sdhci_add_host(struct sdhci_host *host) if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { if (host->ops->enable_dma) { if (host->ops->enable_dma(host)) { - pr_warn("%s: No suitable DMA available. Falling back to PIO.\n", - mmc_hostname(mmc)); + mmc_host_warn(mmc, "No suitable DMA available. Falling back to PIO.\n");host->flags &=
~(SDHCI_USE_SDMA |SDHCI_USE_ADMA); }drivers/mmc/host/sdhci.c +1
-2@@ -2592,8 +2583,7 @@ int sdhci_add_host(struct sdhci_host *host) if (!host->adma_desc || !host->align_buffer) { kfree(host->adma_desc); kfree(host->align_buffer); - pr_warn("%s: Unable to allocate ADMA buffers. Falling back to standard DMA.\n", - mmc_hostname(mmc)); + mmc_host_warn(mmc, "Unable to allocate ADMA buffers. Falling back to standard DMA.\n"); host->flags &= ~SDHCI_USE_ADMA; } }@@ -2619,8 +2609,7 @@ int sdhci_add_host(struct sdhci_host *host)if (
host->max_clk== 0 ||host->quirks&SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN) {
if (!host->ops->get_max_clock) {
- pr_err("%s: Hardware doesn't specify base clock frequency\n",
- mmc_hostname(mmc));
+mmc_host_err(mmc, "Hardware doesn't specify base clock frequency\n"); return-ENODEV;
}
host->max_clk =host->ops->get_max_clock(host);drivers/mmc/host/sdhci.c +2
-4@@ -2665,8 +2654,7 @@ int sdhci_add_host(struct sdhci_host *host) host->timeout_clk = host->ops->get_timeout_clock(host); } else if (!(host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) { - pr_err("%s: Hardware doesn't specify timeout clock frequency\n", - mmc_hostname(mmc)); + mmc_host_err(mmc, "Hardware doesn't specify timeout clock frequency\n"); return -ENODEV; } }@@ -2833,8 +2821,7 @@ int sdhci_add_host(struct sdhci_host *host) mmc->ocr_avail_mmc &= host->ocr_avail_mmc; if (mmc->ocr_avail == 0) { - pr_err("%s: Hardware doesn't report any support voltages\n", - mmc_hostname(mmc)); + mmc_host_err(mmc, "Hardware doesn't report any support voltages\n"); return -ENODEV; }@@ -2881,8 +2868,7 @@ int sdhci_add_host(struct sdhci_host *host)mmc->max_blk_size = (caps[0] &
SDHCI_MAX_BLOCK_MASK) >>SDHCI_MAX_BLOCK_SHIFT;
if (mmc->max_blk_size>= 3) {
- pr_warn("%s: Invalid maximum block size, assuming 512 bytes\n",
-mmc_hostname(mmc));
+mmc_host_warn(mmc, "Invalid maximum block size, assuming 512 bytes\n");mmc->max_blk_size= 0;
}
}drivers/mmc/host/sdhci.c +6
-7@@ -2920,7 +2906,7 @@ int sdhci_add_host(struct sdhci_host *host) host->vmmc = regulator_get(mmc_dev(mmc), "vmmc"); if (IS_ERR(host->vmmc)) { - pr_info("%s: no vmmc regulator found\n", mmc_hostname(mmc)); + mmc_host_info(mmc, "no vmmc regulator found\n"); host->vmmc = NULL; } else { regulator_enable(host->vmmc);@@ -2949,10 +2935,10 @@ int sdhci_add_host(struct sdhci_host *host) mmc_add_host(mmc); - pr_info("%s: SDHCI controller on %s [%s] using %s\n", - mmc_hostname(mmc), host->hw_name, dev_name(mmc_dev(mmc)), - (host->flags & SDHCI_USE_ADMA) ? "ADMA" : - (host->flags & SDHCI_USE_SDMA) ? "DMA" : "PIO"); + mmc_host_info(mmc, "SDHCI controller on %s [%s] using %s\n", + host->hw_name, dev_name(mmc_dev(mmc)), + (host->flags & SDHCI_USE_ADMA) ? "ADMA" : + (host->flags & SDHCI_USE_SDMA) ? "DMA" : "PIO"); sdhci_enable_card_detection(host);@@ -2982,8 +2968,7 @@ void sdhci_remove_host(struct sdhci_host *host, int dead) host->flags |= SDHCI_DEVICE_DEAD; if (host->mrq) { - pr_err("%s: Controller removed during transfer!\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Controller removed during transfer!\n"); host->mrq->cmd->error = -ENOMEDIUM; tasklet_schedule(&host->finish_tasklet);drivers/mmc/host/tmio_mmc.c +2
-2@@ -93,8 +93,8 @@ static int __devinit tmio_mmc_probe(struct platform_device *pdev) if (ret) goto host_remove; - pr_info("%s at 0x%08lx irq %d\n", mmc_hostname(host->mmc), - (unsigned long)host->ctl, irq); + mmc_host_info(host->mmc, "at 0x%08lx irq %d\n", + (unsigned long)host->ctl, irq); return 0;drivers/mmc/host/tmio_mmc_pio.c +2
-2@@ -681,8 +681,8 @@ static int tmio_mmc_start_data(struct tmio_mmc_host *host, int blksz_2bytes = pdata->flags & TMIO_MMC_BLKSZ_2BYTES; if (data->blksz < 2 || (data->blksz < 4 && !blksz_2bytes)) { - pr_err("%s: %d byte block unsupported in 4 bit mode\n", - mmc_hostname(host->mmc), data->blksz); + mmc_host_err(host->mmc, "%d byte block unsupported in 4 bit mode\n", + data->blksz); return -EINVAL; } }drivers/mmc/host/via-sdmmc.c +0
-0@@ -585,7 +585,7 @@ static void via_sdc_send_command(struct via_crdr_mmc_host *host, cmdctrl |= VIA_CRDR_SDCTRL_RSP_R3; break;default:
-pr_err("%s: cmd->flag is not valid\n", mmc_hostname(host->mmc));
+mmc_host_err(host->mmc, "cmd->flag is not valid\n"); break;
}drivers/mmc/host/via-sdmmc.c +8
-11@@ -840,8 +840,8 @@ static void via_sdc_cmd_isr(struct via_crdr_mmc_host *host, u16 intmask) BUG_ON(intmask == 0); if (!host->cmd) { - pr_err("%s: Got command interrupt 0x%x even though no command operation was in progress\n", - mmc_hostname(host->mmc), intmask); + mmc_host_err(host->mmc, "Got command interrupt 0x%x even though no command operation was in progress\n", + intmask); return; }@@ -918,8 +918,8 @@ static irqreturn_t via_sdc_isr(int irq, void *dev_id) sd_status &= ~(VIA_CRDR_SDSTS_CMD_MASK | VIA_CRDR_SDSTS_DATA_MASK); if (sd_status) { - pr_err("%s: Unexpected interrupt 0x%x\n", - mmc_hostname(sdhost->mmc), sd_status); + mmc_host_err(sdhost->mmc, "Unexpected interrupt 0x%x\n", + sd_status); writew(sd_status, addrbase + VIA_CRDR_SDSTATUS); }@@ -942,9 +942,8 @@ static void via_sdc_timeout(unsigned long ulongdata) spin_lock_irqsave(&sdhost->lock, flags); if (sdhost->mrq) { - pr_err("%s: Timeout waiting for hardware interrupt.cmd:0x%x\n", - mmc_hostname(sdhost->mmc), - sdhost->mrq->cmd->opcode); + mmc_host_err(sdhost->mmc, "Timeout waiting for hardware interrupt.cmd:0x%x\n", + sdhost->mrq->cmd->opcode); if (sdhost->data) { writel(VIA_CRDR_DMACTRL_SFTRST,@@ -1006,8 +1005,7 @@ static void via_sdc_card_detect(struct work_struct *work) status = readw(addrbase + VIA_CRDR_SDSTATUS); if (!(status & VIA_CRDR_SDSTS_SLOTG)) { if (host->mrq) { - pr_err("%s: Card removed during transfer!\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Card removed during transfer!\n"); host->mrq->cmd->error = -ENOMEDIUM; tasklet_schedule(&host->finish_tasklet); }@@ -1192,8 +1190,7 @@ static void __devexit via_sd_remove(struct pci_dev *pcidev) mmiowb(); if (sdhost->mrq) { - pr_err("%s: Controller removed during transfer\n", - mmc_hostname(sdhost->mmc)); + mmc_host_err(sdhost->mmc, "Controller removed during transfer\n"); /* make sure all DMA is stopped */ writel(VIA_CRDR_DMACTRL_SFTRST,drivers/mmc/host/wbsd.c +3
-3@@ -194,7 +194,7 @@ static void wbsd_reset(struct wbsd_host *host) { u8 setup; - pr_err("%s: Resetting chip\n", mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Resetting chip\n"); /** Soft reset of chip (SD/MMC part). @@ -721,8 +721,8 @@ static void wbsd_finish_data(struct wbsd_host *host, struct mmc_data *data)* Any leftover data? */ if (count) { - pr_err("%s: Incomplete DMA transfer. %d bytes left.\n", - mmc_hostname(host->mmc), count); + mmc_host_err(host->mmc, "Incomplete DMA transfer. %d bytes left.\n", + count); if (!data->error) data->error = -EIO;@@ -802,8 +802,8 @@ static void wbsd_request(struct mmc_host *mmc, struct mmc_request *mrq)default:
#ifdefCONFIG_MMC_DEBUG
- pr_warn("%s: Data command %d is not supported by this controller\n",
-mmc_hostname(host->mmc),cmd->opcode);
+ mmc_host_warn(host->mmc, "Data command %d is not supported by this controller\n",
+cmd->opcode);
#endif
cmd->error =-EINVAL;drivers/mmc/host/wbsd.c +5
-6@@ -1027,8 +1027,7 @@ static void wbsd_tasklet_card(unsigned long param) host->flags &= ~WBSD_FCARD_PRESENT; if (host->mrq) { - pr_err("%s: Card removed during transfer!\n", - mmc_hostname(host->mmc)); + mmc_host_err(host->mmc, "Card removed during transfer!\n"); wbsd_reset(host); host->mrq->cmd->error = -ENOMEDIUM;@@ -1713,17 +1712,17 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma, mmc_add_host(mmc); - pr_info("%s: W83L51xD", mmc_hostname(mmc)); + mmc_host_info(mmc, "W83L51xD"); if (host->chip_id != 0) - printk(" id %x", (int)host->chip_id); - printk(" at 0x%x irq %d", (int)host->base, (int)host->irq); + pr_cont(" id %x", (int)host->chip_id); + pr_cont(" at 0x%x irq %d", (int)host->base, (int)host->irq); if (host->dma >= 0) - printk(" dma %d", (int)host->dma); + pr_cont(" dma %d", (int)host->dma);else
-printk(" FIFO");
+pr_cont(" FIFO");
if (pnp)
-printk(" PnP");
-printk("\n");
+pr_cont(" PnP");
+pr_cont("\n");return 0;
}include/linux/mmc/host.h +11
-1@@ -335,6 +335,17 @@ extern int mmc_add_host(struct mmc_host *); extern void mmc_remove_host(struct mmc_host *); extern void mmc_free_host(struct mmc_host *); +#define mmc_host_err (mmc, fmt, ...) \ + pr_err("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +#define mmc_host_warn (mmc, fmt, ...) \ + pr_warn("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +#define mmc_host_notice (mmc, fmt, ...) \ + pr_notice("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +#define mmc_host_info (mmc, fmt, ...) \ + pr_info("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) +#define mmc_host_debug (mmc, fmt, ...) \ + pr_debug("%s: " fmt, mmc_hostname(mmc), ##__VA_ARGS__) + static inline void *mmc_priv(struct mmc_host *host) { return (void *)host->private; --1.7.6.405.gc1be0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] mmc: Add mmc_host_<level> logging
Quoted 8 lines · NamJae Jeon
2011/11/16 Joe Perches <[email protected]>:
Quoted 3 lines
Centralize the pr_<level> uses of
mmc_hostnameinto specific mmc_host_<level> calls to allow a flexible presentation style and shorten the code a bit.I don't know why
pr_infoshould be surely replaced bymmc_host_info. if it is needed for only host name, I think that existing pr_info/err/debug is sufficient.
Please trim your replies and read the patch description.
Re: [PATCH 4/4] mmc: Add mmc_host_<level> logging
2011/11/16 Joe Perches <[email protected]>:
Quoted 11 lines · NamJae Jeon
Quoted 8 lines
2011/11/16 Joe Perches <[email protected]>:
Quoted 3 lines
Centralize the pr_<level> uses of
mmc_hostnameinto specific mmc_host_<level> calls to allow a flexible presentation style and shorten the code a bit.I don't know why
pr_infoshould be surely replaced bymmc_host_info. if it is needed for only host name, I think that existing pr_info/err/debug is sufficient.Please trim your replies and read the patch description.
my concern is that they feel confuse when coder add print code because they should use mmc_host<level> for hostname, and pr_<level> is used in the other case.
Quoted 3 lines
Re: [PATCH 4/4] mmc: Add mmc_host_<level> logging
Quoted 6 lines · NamJae Jeon
2011/11/16 Joe Perches <[email protected]>:
Quoted 5 lines · NamJae Jeon
Quoted 4 lines
2011/11/16 Joe Perches <[email protected]>:
Quoted 3 lines
Centralize the pr_<level> uses of
mmc_hostnameinto specific mmc_host_<level> calls to allow a flexible presentation style and shorten the code a bit.
Quoted 7 lines
Quoted 4 lines
Quoted 3 lines
I don't know why
pr_infoshould be surely replaced bymmc_host_info. if it is needed for only host name, I think that existing pr_info/err/debug is sufficient.Please trim your replies and read the patch description.
my concern is that they feel confuse when coder add print code because they should use mmc_host<level> for hostname, and pr_<level> is used in the other case.
That's one point of view.
It is the same issue though as using dev_<level>
when you have a struct device * and also using
pr_<level> otherwise.
Re: [PATCH 4/4] mmc: Add mmc_host_<level> logging
In reply to Joe PerchesQuoted 5 lines · Joe Perches
Centralize the pr_<level> uses of
mmc_hostnameinto specific mmc_host_<level> calls to allow a flexible presentation style and shorten the code a bit.drivers/mmc/host/msm_sdcc.c | 101 ++++++++++++++++++---------------------
The MSM ones at least are quite straightforward, so I'm fine with this part of the change.
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
Re: [PATCH 4/4] mmc: Add mmc_host_<level> logging
In reply to Joe Perches2011/11/16 Joe Perches <[email protected]>:
Quoted 10 lines
Centralize the pr_<level> uses of
mmc_hostnameinto specific mmc_host_<level> calls to allow a flexible presentation style and shorten the code a bit.Add mmc_host_<level> macros.
Convert the logging calls from:
? ? ? ?pr_<level>("%s: ...",mmc_hostname(foo)
to:
? ? ? ?mmc_host_<level>(foo, ...)
Quoted 5 lines
Add a couple of missing newlines.
Convert bare printks topr_contwhere appropriate. Spelling/typo fix of initialiazed to initialized.Signed-off-by Joe Perches <[email protected]>
Quoted 1 line
---