From raghavendra.koushik@wipro.com Mon Mar 1 00:20:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 00:20:31 -0800 (PST) Received: from wiproecmx1.wipro.com (wiproecmx1.wipro.com [164.164.31.5]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i218K2KO023263 for ; Mon, 1 Mar 2004 00:20:06 -0800 Received: from ec-vwall-wd (ec-vwall-wd.wipro.com [10.200.52.125]) by wiproecmx1.wipro.com (8.12.9-20031013/8.12.9) with SMTP id i216LgYO008604 for ; Mon, 1 Mar 2004 11:51:42 +0530 (IST) Received: from blr-ec-bh3.wipro.com ([10.200.50.93]) by ec-vwall-wd with InterScan Messaging Security Suite; Mon, 01 Mar 2004 11:52:55 +0530 Received: from blr-m3-msg.wipro.com ([10.114.50.99]) by blr-ec-bh3.wipro.com with Microsoft SMTPSVC(5.0.2195.6713); Mon, 1 Mar 2004 11:51:40 +0530 X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Subject: RE: Submission #3 for S2io 10GbE driver Date: Mon, 1 Mar 2004 11:51:40 +0530 Message-ID: <4223A04BF7D1B941A25246ADD0462FF50115AD10@blr-m3-msg.wipro.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Submission #3 for S2io 10GbE driver Thread-Index: AcP+OJoiC17+ieJTSVmICXn6FsK2lQBHAAIw From: To: , Cc: , , , , X-OriginalArrivalTime: 01 Mar 2004 06:21:40.0703 (UTC) FILETIME=[759CF6F0:01C3FF55] Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i218K2KO023263 X-archive-position: 3678 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@wipro.com Precedence: bulk X-list: netdev Jeff, Regarding Point # 37 >>37) kill all of this: >> >>+/* OS related system calls */ >>+ >>+#ifndef readq >>+static inline u64 read64(void *addr) >>+{ >>+ u64 ret = 0; >>+ ret = readl(addr + 4); >>+ (u64) ret <<= 32; >>+ (u64) ret |= readl(addr); [....] I agree that read/write(32,16,8) are not used so can be eliminated, but the read/write64 macros are essential because not all platforms have defined the readq and writeq system calls. i386 for example doesn't have readq/writeq and to write into the 64 bit registers of the NIC, I use 2 successive 32 bits (readl/writel) operation to achieve the 64 bit equivalent. This procedure does work on all the platforms that we have tested on. Regards Koushik -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Sunday, February 29, 2004 1:52 AM To: Leonid Grossman Cc: netdev@oss.sgi.com; 'Stephen Hemminger'; 'Christoph Hellwig'; 'ravinandan arakali'; raghavendra.koushik@s2io.com Subject: Re: Submission #3 for S2io 10GbE driver Looking a lot better. A few merge issues remain, and some operational ones as well. There are 39 issues in this review, but IMO they are mostly minor issues that don't require much thought or work. Comments: 0) to repeat myself from an earlier review... grumble... You CANNOT use NETIF_F_HW_CSUM, when your hardware does not provide the checksum value. You must use NETIF_F_IP_CSUM. Your use of NETIF_F_HW_CSUM + CHECKSUM_UNNECESSARY is flat out incorrect. 1) the makefile is for out-of-tree stuff. The proper makefile will be much smaller. So just submit a proper in-tree Makefile. 2) (in general) we don't want the compatibility stuff in-tree, that's for out-of-tree as well. 3) just submit a patch to include/linux/pci_ids.h instead of the following +/* VENDOR and DEVICE ID of XENA. */ +#ifndef PCI_VENDOR_ID_S2IO +#define PCI_VENDOR_ID_S2IO 0x17D5 +#define PCI_DEVICE_ID_S2IO_WIN 0x5731 +#define PCI_DEVICE_ID_S2IO_UNI 0x5831 +#endif 4) just delete the SET_NETDEV_DEV(), FREE_NETDEV, and IRQ_NONE compatibility defines. these are in 2.4 just like 2.6. 5) Many PCI posting bugs remain. FixMacAddress is an excellent illustration: + write64(&bar0->gpio_control, 0x0040600000000000ULL); + udelay(10); + write64(&bar0->gpio_control, 0x0000600000000000ULL); + udelay(10); + write64(&bar0->gpio_control, 0x0020600000000000ULL); + udelay(10); + write64(&bar0->gpio_control, 0x0060600000000000ULL); + udelay(10); The delay is _not_ guaranteed at all, because you do not know when that write64() will actually be sent to the PCI bus. Only a read[bwl,64] is guaranteed to flush the write to the PCI device. So, the above code does not function as you would expect, on all platforms. 6) More examples of PCI posting bugs, in startNic: + write64(&bar0->mc_rldram_mrs, val64); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ / 10); and + write64(&bar0->dtx_control, 0x8007051500000000ULL); + udelay(50); + write64(&bar0->dtx_control, 0x80070515000000E0ULL); + udelay(50); + write64(&bar0->dtx_control, 0x80070515001F00E4ULL); + udelay(50); 7) for fragmented skb's, you should be using pci_map_page() not pci_map_single(). Example in drivers/net/tg3.c. 8) (style) in alarmIntrHandler, due to line wrapping, Lindent has rendered the 'do' loop rather unreadable. 9) you cannot sleep inside the interrupt handler. Therefore the schedule_timeout() in alarmIntrHandler is very wrong. 10) never use a plain constant when calling schedule_timeout(), such as in waitForCmdComplete. Always calculate the desired delay based on the HZ constant. Otherwise, your delay varies depending on platform. HZ represents one second, in jiffies. So half a second delay would be "HZ / 2", etc. Also, when fixing, be careful that your HZ-based calculation will never evaluate to zero. 11) ditto s2io_reset 12) ditto s2io_close. etc. 13) in s2io_xmit, kfree the skb (drop it) if you don't have enough free space to queue it. this is normally a BUG condition, since proper use of netif_{start,stop,wake}_queue() will guarantee that s2io_xmit will only be called when there is free space to queue another skb. 14) spin_lock(), not spin_lock_irqsave(), in your interrupt handler. spin_lock_irqsave() is normally used in any of three cases: (1) don't know whether you're in an ISR or not, (2) definitely not in an ISR, or (3) your ISR is called from more than one hardware interrupt. None of these three is the case. 15) does s2io_get_stats need locking? 16) (style) If you are going to comment each function, you might as well do it in the "kernel-doc" style, which allows the comments to be picked up by automated tools. The format is /** * function_name - short description * @argument1: argument 1 description * @argument2: argument 2 description * ... * SOMETHING: * blah blah blah * SOMETHING ELSE: * blah blah blah The "ALL_CAPS:" indicates a new section/paragraph, in the document. Once this is done, you may add a stub document to Documentation/DocBook/ and then create your driver's nicely-formatted documentation using "make pdfdocs", "make psdocs", or "make htmldocs". 17) this define belongs in include/linux/ethtool.h, if it's not there already... +#define SPEED_10000 10000 18) remove #ifdefs such as +#if defined(ETHTOOL_GREGS) + info->regdump_len = XENA_REG_SPACE; +#endif since this exists in both 2.4 and 2.6 kernels. 19) ditto: +#ifdef ETHTOOL_PHYS_ID 20) for the ethtool EEPROM and register dumps, it would be nice to submit a patch to me for ethtool (http://sf.net/projects/gkernel/), which generates a verbose dump rather than a bunch of hex numbers incomprehensible to the user. This is a long, boring, but easy task suitable to an intern, so I understand if it's not done immediately ;-) 21) s2io_ethtool_nway_reset should restart PHY autonegotiation, not reset the entire card 22) eliminate s2io_ethtool_get_link, it duplicates a generic (and equivalent) function in net/core/ethtool.c 23) ditto, for the s2io_ethtool_{get,set}_{sg,rx,tx}_csum stuff 24) don't explicitly set members to NULL in netdev_ethtool_ops 25) the update to s2io_tx_watchdog still leaves something to be desired. You are no longer performing the could-take-a-long-time card reset inside of spin_lock_bh()... you are now doing it inside the timer interrupt :( Move this to process context by using schedule_work() [2.6] or schedule_task [2.4] 27) Unconditional netif_wake_queue() in s2io_link() still unfixed. You must check for room for additional TX, before calling netif_{start,wake}_queue(). Consider what happens if the link goes down under the TX-full condition [netif_stop_queue]... instant bug. 28) do NOT specify PCI latency timer value as non-zero. pci_set_master() chooses an appropriate latency timer value. It is acceptable to leave this in as an option, as long as the module option's default is zero: +static u8 latency_timer = 0xff; 29) (style) don't bother casting a void pointer: +/* Private member variable initialized to s2io NIC structure */ + sp = (nic_t *) dev->priv; 30) redundant assignment of 'sp': + dev->irq = pdev->irq; + dev->base_addr = (unsigned long) sp->bar0; + sp = (nic_t *) dev->priv; 31) kill the #ifdef +#ifdef SET_ETHTOOL_OPS + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); +#endif This one is particularly silly, because SET_ETHTOOL_OPS() is -designed- to eliminate ifdefs. A driver wishing to be compatible will provide its own SET_ETHTOOL_OPS definition, guaranteeing it can be used unconditionally in the driver code here. 32) mark s2io_starter with "__init" 33) kill this: +#ifndef ETH_ALEN +#define ETH_ALEN 6 +#endif 34) the definitions of SUCCESS and FAILURE are incorrect. The driver should return 0 on success, and a negative errno-based error code on failure. -EBUSY, -EOPNOTSUPP, etc. 35) kill this: +#ifndef SUPPORTED_10000baseT_Full +#define SUPPORTED_10000baseT_Full (1 << 12) +#endif 36) (feature addition) you have a ton of NIC-specific statistics. You should make those available to users, via ethtool. 37) kill all of this: +/* OS related system calls */ + +#ifndef readq +static inline u64 read64(void *addr) +{ + u64 ret = 0; + ret = readl(addr + 4); + (u64) ret <<= 32; + (u64) ret |= readl(addr); + + return ret; +} +#else +static inline u64 read64(void *addr) +{ + u64 ret = readq(addr); + return ret; +} +#endif +#define read32(addr, ret) ret = readl(addr); +#define read16(addr, ret) ret = readw(addr); +#define read8(addr, ret) ret = readb(addr); + +#ifndef writeq +static inline void write64(void *addr, u64 val) +{ + writel((u32) (val), addr); + writel((u32) (val >> 32), (addr + 4)); +} +#else +#define write64(addr, ret) writeq(ret,(void *)addr) +#endif +#define write32(addr, ret) writel(ret,(void *)addr); +#define write16(addr, ret) writew(ret,(void *)addr); +#define write8(addr, ret) writeb(ret,(void *)addr); 38) sysctl_xframe.conf belongs somewhere in Documentation/* From davem@redhat.com Mon Mar 1 00:35:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 00:35:51 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i218ZZKO023862 for ; Mon, 1 Mar 2004 00:35:36 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id i218ZRb14780; Mon, 1 Mar 2004 03:35:27 -0500 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i218ZQ827288; Mon, 1 Mar 2004 03:35:26 -0500 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i218ZLeF001017; Mon, 1 Mar 2004 03:35:21 -0500 Date: Mon, 1 Mar 2004 00:35:25 -0800 From: "David S. Miller" To: Bart De Schuymer Cc: ebtables-devel@lists.sourceforge.net, netdev@oss.sgi.com Subject: Re: [PATCH] 2.6.3 fix vlan-encapsulated fragmented IP traffic Message-Id: <20040301003525.522d6db2.davem@redhat.com> In-Reply-To: <200403010806.29759.bdschuym@pandora.be> References: <200402291914.53578.bdschuym@pandora.be> <20040229215421.0ca987e8.davem@redhat.com> <200403010806.29759.bdschuym@pandora.be> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3679 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Mon, 1 Mar 2004 08:06:29 +0100 Bart De Schuymer wrote: > > I'm really concerned, btw, that this is going to propagate to other places > > as well, what if something that gets handled this way gets sent over an > > IPIP tunnel via some route, and then IPIP has to make all of these crazy > > adjustments too? That's going too far and we'll have to find a better > > way if that is the case. > > I'm not sure how IPIP tunnels are implemented, but I'm assuming they strip the > first IP header like the vlan code strips the vlan header when a vlan-packet > arrives on a vlan-enabled device. Then there should be no problem with this. Let us say that on input, br strips the 4 bytes as you say, iptables looks at the thing and rewrites the IP source/destination address or whatever, and this causes the packet to actually get forwarded out via a different IP route, and let us say that this new IP route causes the packet to go out via an IPIP tunnel device, which must do all the same kind of crap the code you're patching here does, that is determine the LL header size etc. in order to make sure there is enough headroom to slap on the new IP encapsulating header. If you can show that this kind of scenerio would never be generated in the cases where br-netfilter is involved, then fine. From maz@misterjones.org Mon Mar 1 02:12:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 02:12:33 -0800 (PST) Received: from young-lust.wild-wind.fr.eu.org (lopsy-lu.misterjones.org [62.4.18.26]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21ACIKO028984 for ; Mon, 1 Mar 2004 02:12:19 -0800 Received: from hina.wild-wind.fr.eu.org ([192.168.70.139]) by young-lust.wild-wind.fr.eu.org with esmtp (Exim 3.35 #1 (Debian)) id 1AxkP8-0002RZ-00; Mon, 01 Mar 2004 11:12:06 +0100 Received: from maz by hina.wild-wind.fr.eu.org with local (Exim 3.36 #1 (Debian)) id 1AxkP8-0002qy-00; Mon, 01 Mar 2004 11:12:06 +0100 To: pawel.sokolowski@muflon.linux.pl Cc: netdev@oss.sgi.com Subject: Re: 2.6.4-rc1 + hp100 EISA, not working Organization: Metropolis -- Nowhere X-Attribution: maz Reply-to: mzyngier@freesurf.fr References: From: Marc Zyngier Date: Mon, 01 Mar 2004 11:12:06 +0100 Message-ID: In-Reply-To: (Pawe's message of "Sun, 29 Feb 2004 22:06:16 +0100 (CET)") Lines: 17 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 3680 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mzyngier@freesurf.fr Precedence: bulk X-list: netdev >>>>> "Pawel" == Pawe writes: Pawel> I don't know if it's related to this problem but at earlier stage of Pawel> booting I'm getting following messages: Pawel> EISA: Probing bus 0 at eisa0 Pawel> EISA: Mainboard HWPC061 detected. Pawel> EISA: slot 2 : HWP1940 detected (disabled). Pawel> EISA: Detected 1 card. Try passing 'eisa_bus.enable_dev=2' to your kernel parameters. Your card is tagged as unconfigured by BIOS, and thus is skipped by the probing logic. See Documentation/eisa.txt for details. M. -- Places change, faces change. Life is so very strange. From maz@misterjones.org Mon Mar 1 02:25:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 02:26:01 -0800 (PST) Received: from young-lust.wild-wind.fr.eu.org (lopsy-lu.misterjones.org [62.4.18.26]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21APaKO031009 for ; Mon, 1 Mar 2004 02:25:37 -0800 Received: from hina.wild-wind.fr.eu.org ([192.168.70.139]) by young-lust.wild-wind.fr.eu.org with esmtp (Exim 3.35 #1 (Debian)) id 1Axkc1-0002T1-00; Mon, 01 Mar 2004 11:25:25 +0100 Received: from maz by hina.wild-wind.fr.eu.org with local (Exim 3.36 #1 (Debian)) id 1Axkc1-0002rb-00; Mon, 01 Mar 2004 11:25:25 +0100 To: pawel.sokolowski@muflon.linux.pl Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: 2.6.4-rc1 + hp100 EISA, not working Organization: Metropolis -- Nowhere X-Attribution: maz Reply-to: mzyngier@freesurf.fr References: From: Marc Zyngier Date: Mon, 01 Mar 2004 11:25:25 +0100 Message-ID: In-Reply-To: (Pawe's message of "Sun, 29 Feb 2004 22:06:16 +0100 (CET)") Lines: 26 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 3681 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mzyngier@freesurf.fr Precedence: bulk X-list: netdev >>>>> "Pawel" == Pawe writes: Pawel> On 2.6.3 it just Oopsed and didn't work. On 2.6.4-rc1 it does Pawel> not oops but it doesn't work (neither as module nor as build in kernel). Note that hp100 in 2.6.4-rc1 is still broken wrt EISA probing, since it lacks the terminating entry in the EISA ID list. This one-liner should take care of random crashes that are often reported to LKML : ===== drivers/net/hp100.c 1.24 vs edited ===== --- 1.24/drivers/net/hp100.c Wed Feb 18 13:39:41 2004 +++ edited/drivers/net/hp100.c Mon Mar 1 11:18:00 2004 @@ -201,6 +201,7 @@ { "HWP1990" }, /* HP J2577 */ { "CPX0301" }, /* ReadyLink ENET100-VG4 */ { "CPX0401" }, /* FreedomLine 100/VG */ + { "" } /* Mandatory final entry ! */ }; MODULE_DEVICE_TABLE(eisa, hp100_eisa_tbl); #endif Jeff, would you please push this to Linus ? M. -- Places change, faces change. Life is so very strange. From kashyapv@us.ibm.com Mon Mar 1 03:10:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 03:11:00 -0800 (PST) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21BAiKO001251 for ; Mon, 1 Mar 2004 03:10:50 -0800 Received: from westrelay03.boulder.ibm.com (westrelay03.boulder.ibm.com [9.17.195.12]) by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i21B9sSL792938; Mon, 1 Mar 2004 06:09:54 -0500 Received: from w-vkashyap95.des.sequent.com (d03av01.boulder.ibm.com [9.17.193.81]) by westrelay03.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i21B9bJc186488; Mon, 1 Mar 2004 04:09:50 -0700 Date: Mon, 1 Mar 2004 02:11:11 -0800 (Pacific Standard Time) From: Vivek Kashyap To: "David S. Miller" cc: Ronghua Zhang , , Subject: Re: [PATCH] proportional share accept() In-Reply-To: <20040229220513.68eed11f.davem@redhat.com> Message-ID: X-X-Sender: kashyapv@imap.linux.ibm.com MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 3682 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kashyapv@us.ibm.com Precedence: bulk X-list: netdev On Sun, 29 Feb 2004, David S. Miller wrote: > On Thu, 26 Feb 2004 17:08:23 -0500 (EST) > Ronghua Zhang wrote: > > > www.cs.virginia.edu/~rz5b/research/kernel-qos.htm > > I looked at this, it's basically netfilter TCP port rewriting > which knows about per-socket quotas and limits. > > You could write this as a 10 line netfilter module, with zero > modifications to any of the core net/ipv4 TCP code at all. > And that's how I'd like to see something like this done. Multiple sockets can be forwarded the requests either at an alternative port or address using netfilter. However one has to now mangle the data packets too since the client is still talking to the advertised port (and address). I've modified the earlier post to remove the sysctl and removed the use of STFQ/virtual clock and instead used 'weighted round robin' in tcp_accept(). The solution is very much per socket. The default is to have only one queue that is active. If the shares (simple ratios) are set then the packets are accept()ed in a WRR fashion. Since all work is done in context of a single socket no additional locks have to be held. If the shares are unset then the processing reverts to single queue mode. The per queue backlog is to avoid lower priority requests from filling up the synq and thereby blocking the higher priority requests. Also the iptables' MARK target is quite lightweight. Vivek ----------------------------------------------------------------------------- diff -urN linux-2.6.3_old/include/linux/tcp.h linux-2.6.3/include/linux/tcp.h --- linux-2.6.3_old/include/linux/tcp.h 2004-02-17 19:57:52.000000000 -0800 +++ linux-2.6.3/include/linux/tcp.h 2004-02-29 22:01:11.000000000 -0800 @@ -128,6 +128,10 @@ #define TCP_INFO 11 /* Information about this connection. */ #define TCP_QUICKACK 12 /* Block/reenable quick acks */ +#ifdef CONFIG_ACCEPT_QUEUES +#define TCP_ACCEPTQ_SHARE 13 /* Set accept queue share */ +#endif + #define TCPI_OPT_TIMESTAMPS 1 #define TCPI_OPT_SACK 2 #define TCPI_OPT_WSCALE 4 @@ -185,6 +189,18 @@ __u32 tcpi_reordering; }; +#ifdef CONFIG_ACCEPT_QUEUES + +#define NUM_ACCEPT_QUEUES 8 /* Must be power of 2 */ + +struct tcp_acceptq_info { + unsigned char acceptq_shares; + unsigned long acceptq_wait_time; + unsigned int acceptq_qcount; + unsigned int acceptq_count; +}; +#endif + #ifdef __KERNEL__ #include @@ -362,8 +378,9 @@ /* FIFO of established children */ struct open_request *accept_queue; - struct open_request *accept_queue_tail; - +#ifndef CONFIG_ACCEPT_QUEUES + struct open_request *accept_queue_tail; +#endif int write_pending; /* A write to socket waits to start. */ unsigned int keepalive_time; /* time before keep alive takes place */ @@ -388,6 +405,22 @@ __u32 rtt; __u32 rtt_min; /* minimum observed RTT */ } westwood; + +#ifdef CONFIG_ACCEPT_QUEUES + /* move to listen opt... */ + char class_index; + struct { + struct open_request *aq_head; + struct open_request *aq_tail; + unsigned int aq_cnt; + unsigned int aq_ratio; + unsigned int aq_count; + unsigned int aq_qcount; + unsigned int aq_backlog; + unsigned int aq_wait_time; + int aq_valid; + } acceptq[NUM_ACCEPT_QUEUES]; +#endif }; /* WARNING: don't change the layout of the members in tcp_sock! */ diff -urN linux-2.6.3_old/include/net/tcp.h linux-2.6.3/include/net/tcp.h --- linux-2.6.3_old/include/net/tcp.h 2004-02-17 19:57:16.000000000 -0800 +++ linux-2.6.3/include/net/tcp.h 2004-02-29 21:32:44.000000000 -0800 @@ -639,6 +639,10 @@ struct tcp_v6_open_req v6_req; #endif } af; +#ifdef CONFIG_ACCEPT_QUEUES + unsigned long acceptq_time_stamp; + int acceptq_class; +#endif }; /* SLAB cache for open requests. */ @@ -1688,6 +1692,69 @@ return tcp_win_from_space(sk->sk_rcvbuf); } +#ifdef CONFIG_ACCEPT_QUEUES +static inline void tcp_acceptq_removed(struct sock *sk, int class) +{ + tcp_sk(sk)->acceptq[class].aq_backlog--; +} + +static inline void tcp_acceptq_added(struct sock *sk, int class) +{ + tcp_sk(sk)->acceptq[class].aq_backlog++; +} + +static inline int tcp_acceptq_is_full(struct sock *sk, int class) +{ + return tcp_sk(sk)->acceptq[class].aq_backlog > + sk->sk_max_ack_backlog; +} + +static inline void tcp_set_acceptq(struct tcp_opt *tp, struct open_request *req) +{ + int class = req->acceptq_class; + int prev_class; + + if (!tp->acceptq[class].aq_ratio) { + req->acceptq_class = 0; + class = 0; + } + + tp->acceptq[class].aq_qcount++; + req->acceptq_time_stamp = jiffies; + + if (tp->acceptq[class].aq_tail) { + req->dl_next = tp->acceptq[class].aq_tail->dl_next; + tp->acceptq[class].aq_tail->dl_next = req; + tp->acceptq[class].aq_tail = req; + } else { /* if first request in the class */ + tp->acceptq[class].aq_head = req; + tp->acceptq[class].aq_tail = req; + + prev_class = class - 1; + while (prev_class >= 0) { + if (tp->acceptq[prev_class].aq_tail) + break; + prev_class--; + } + if (prev_class < 0) { + req->dl_next = tp->accept_queue; + tp->accept_queue = req; + } + else { + req->dl_next = tp->acceptq[prev_class].aq_tail->dl_next; + tp->acceptq[prev_class].aq_tail->dl_next = req; + } + } +} +static inline void tcp_acceptq_queue(struct sock *sk, struct open_request *req, + struct sock *child) +{ + tcp_set_acceptq(tcp_sk(sk),req); + req->sk = child; + tcp_acceptq_added(sk,req->acceptq_class); +} + +#else static inline void tcp_acceptq_removed(struct sock *sk) { sk->sk_ack_backlog--; @@ -1720,16 +1787,55 @@ req->dl_next = NULL; } +#endif + struct tcp_listen_opt { u8 max_qlen_log; /* log_2 of maximal queued SYNs */ int qlen; +#ifdef CONFIG_ACCEPT_QUEUES + int qlen_young[NUM_ACCEPT_QUEUES]; +#else int qlen_young; +#endif int clock_hand; u32 hash_rnd; struct open_request *syn_table[TCP_SYNQ_HSIZE]; }; +#ifdef CONFIG_ACCEPT_QUEUES +static inline void +tcp_synq_removed(struct sock *sk, struct open_request *req) +{ + struct tcp_listen_opt *lopt = tcp_sk(sk)->listen_opt; + + if (--lopt->qlen == 0) + tcp_delete_keepalive_timer(sk); + if (req->retrans == 0) + lopt->qlen_young[req->acceptq_class]--; +} + +static inline void tcp_synq_added(struct sock *sk, struct open_request *req) +{ + struct tcp_listen_opt *lopt = tcp_sk(sk)->listen_opt; + + if (lopt->qlen++ == 0) + tcp_reset_keepalive_timer(sk, TCP_TIMEOUT_INIT); + lopt->qlen_young[req->acceptq_class]++; +} + +static inline int tcp_synq_len(struct sock *sk) +{ + return tcp_sk(sk)->listen_opt->qlen; +} + +static inline int tcp_synq_young(struct sock *sk, int class) +{ + return tcp_sk(sk)->listen_opt->qlen_young[class]; +} + +#else + static inline void tcp_synq_removed(struct sock *sk, struct open_request *req) { @@ -1759,6 +1865,7 @@ { return tcp_sk(sk)->listen_opt->qlen_young; } +#endif static inline int tcp_synq_is_full(struct sock *sk) { diff -urN linux-2.6.3_old/net/ipv4/Kconfig linux-2.6.3/net/ipv4/Kconfig --- linux-2.6.3_old/net/ipv4/Kconfig 2004-02-17 19:59:05.000000000 -0800 +++ linux-2.6.3/net/ipv4/Kconfig 2004-02-29 13:41:58.000000000 -0800 @@ -379,5 +379,28 @@ If unsure, say Y. +config ACCEPT_QUEUES + bool "IP: TCP Multiple accept queues support" + depends on INET && NETFILTER + ---help--- + Support multiple accept queues per listening socket. If you say Y + here, multiple accept queues will be configured per listening + socket. + + Each queue is mapped to a priority class. Incoming connection + requests can be classified (see iptables(8), MARK target), depending + on the packet's src/dest address or other parameters, into one of + the priority classes. The requests are then queued to the relevant + accept queue. + + Each of the queues can be assigned a weight. The accept()ance + of packets is then scheduled in accordance with the weight + assigned to the priority class. + + Be sure to enable "Network packet filtering" if you wish + to use this feature. + + If unsure, say N. + source "net/ipv4/ipvs/Kconfig" diff -urN linux-2.6.3_old/net/ipv4/tcp.c linux-2.6.3/net/ipv4/tcp.c --- linux-2.6.3_old/net/ipv4/tcp.c 2004-02-17 19:57:21.000000000 -0800 +++ linux-2.6.3/net/ipv4/tcp.c 2004-03-01 00:47:47.000000000 -0800 @@ -534,13 +534,34 @@ int tcp_listen_start(struct sock *sk) { +#ifdef CONFIG_ACCEPT_QUEUES + int i = 0; +#endif struct inet_opt *inet = inet_sk(sk); struct tcp_opt *tp = tcp_sk(sk); struct tcp_listen_opt *lopt; sk->sk_max_ack_backlog = 0; sk->sk_ack_backlog = 0; - tp->accept_queue = tp->accept_queue_tail = NULL; + tp->accept_queue = NULL; +#ifdef CONFIG_ACCEPT_QUEUES + tp->class_index = 0; + for (i=0; i < NUM_ACCEPT_QUEUES; i++) { + tp->acceptq[i].aq_tail = NULL; + tp->acceptq[i].aq_head = NULL; + tp->acceptq[i].aq_wait_time = 0; + tp->acceptq[i].aq_qcount = 0; + tp->acceptq[i].aq_count = 0; + if (i == 0) { + tp->acceptq[i].aq_valid = 1; + tp->acceptq[i].aq_ratio = 1; + } + else { + tp->acceptq[i].aq_valid = 0; + tp->acceptq[i].aq_ratio = 0; + } + } +#endif tp->syn_wait_lock = RW_LOCK_UNLOCKED; tcp_delack_init(tp); @@ -600,7 +621,13 @@ write_lock_bh(&tp->syn_wait_lock); tp->listen_opt = NULL; write_unlock_bh(&tp->syn_wait_lock); - tp->accept_queue = tp->accept_queue_tail = NULL; +#ifdef CONFIG_ACCEPT_QUEUES + for (i = 0; i < NUM_ACCEPT_QUEUES; i++) + tp->acceptq[i].aq_head = tp->acceptq[i].aq_tail = NULL; +#else + tp->accept_queue_tail = NULL; +#endif + tp->accept_queue = NULL; if (lopt->qlen) { for (i = 0; i < TCP_SYNQ_HSIZE; i++) { @@ -646,7 +673,11 @@ local_bh_enable(); sock_put(child); +#ifdef CONFIG_ACCEPT_QUEUES + tcp_acceptq_removed(sk, req->acceptq_class); +#else tcp_acceptq_removed(sk); +#endif tcp_openreq_fastfree(req); } BUG_TRAP(!sk->sk_ack_backlog); @@ -2230,6 +2261,10 @@ struct open_request *req; struct sock *newsk; int error; +#ifdef CONFIG_ACCEPT_QUEUES + int prev_class = 0; + int first; +#endif lock_sock(sk); @@ -2243,7 +2278,6 @@ /* Find already established connection */ if (!tp->accept_queue) { long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); - /* If this is a non blocking socket don't sleep */ error = -EAGAIN; if (!timeo) @@ -2254,12 +2288,46 @@ goto out; } +#ifndef CONFIG_ACCEPT_QUEUES req = tp->accept_queue; if ((tp->accept_queue = req->dl_next) == NULL) tp->accept_queue_tail = NULL; - newsk = req->sk; tcp_acceptq_removed(sk); +#else + first = tp->class_index; + /* We should always have request queued here. The accept_queue + * is already checked for NULL above. + */ + while(!tp->acceptq[first].aq_head) { + tp->acceptq[first].aq_cnt = 0; + first = ++first & ~NUM_ACCEPT_QUEUES; + } + req = tp->acceptq[first].aq_head; + tp->acceptq[first].aq_qcount--; + tp->acceptq[first].aq_count++; + tp->acceptq[first].aq_wait_time+=(jiffies - req->acceptq_time_stamp); + + for (prev_class= first-1 ; prev_class >=0; prev_class--) + if (tp->acceptq[prev_class].aq_tail) + break; + if (prev_class>=0) + tp->acceptq[prev_class].aq_tail->dl_next = req->dl_next; + else + tp->accept_queue = req->dl_next; + + if (req == tp->acceptq[first].aq_tail) + tp->acceptq[first].aq_head = tp->acceptq[first].aq_tail = NULL; + else + tp->acceptq[first].aq_head = req->dl_next; + + if((++(tp->acceptq[first].aq_cnt)) >= tp->acceptq[first].aq_ratio){ + tp->acceptq[first].aq_cnt = 0; + tp->class_index = ++first & ~NUM_ACCEPT_QUEUES; + } + tcp_acceptq_removed(sk, req->acceptq_class); +#endif + newsk = req->sk; tcp_openreq_fastfree(req); BUG_TRAP(newsk->sk_state != TCP_SYN_RECV); release_sock(sk); @@ -2429,6 +2497,49 @@ } } break; + +#ifdef CONFIG_ACCEPT_QUEUES + case TCP_ACCEPTQ_SHARE: + { + char share_wt[NUM_ACCEPT_QUEUES]; + int i,j; + + if (sk->sk_state != TCP_LISTEN) + return -EOPNOTSUPP; + + if (copy_from_user(share_wt,optval, optlen)) { + err = -EFAULT; + break; + } + j = 0; + for (i = 0; i < NUM_ACCEPT_QUEUES; i++) { + if (share_wt[i]) { + if (!j) + j = share_wt[i]; + else if (share_wt[i] < j) { + j = share_wt[i]; + } + tp->acceptq[i].aq_valid = 1; + } + else + tp->acceptq[i].aq_valid = 0; + + } + if (j == 0) { + /* Class 0 is always valid. If nothing is + * specified set class 0 as 1. + */ + share_wt[0] = 1; + tp->acceptq[0].aq_valid = 1; + j = 1; + } + for (i=0; i < NUM_ACCEPT_QUEUES; i++) { + tp->acceptq[i].aq_ratio = share_wt[i]/j; + tp->acceptq[i].aq_cnt = 0; + } + } + break; +#endif default: err = -ENOPROTOOPT; @@ -2555,6 +2666,41 @@ case TCP_QUICKACK: val = !tp->ack.pingpong; break; + +#ifdef CONFIG_ACCEPT_QUEUES + case TCP_ACCEPTQ_SHARE: { + struct tcp_acceptq_info tinfo[NUM_ACCEPT_QUEUES]; + int i; + + if (sk->sk_state != TCP_LISTEN) + return -EOPNOTSUPP; + + if (get_user(len, optlen)) + return -EFAULT; + + memset(tinfo, 0, sizeof(tinfo)); + + for(i=0; i < NUM_ACCEPT_QUEUES; i++) { + tinfo[i].acceptq_wait_time = + tp->acceptq[i].aq_wait_time/(HZ/USER_HZ); + tinfo[i].acceptq_qcount = tp->acceptq[i].aq_qcount; + tinfo[i].acceptq_count = tp->acceptq[i].aq_count; + if (tp->acceptq[i].aq_valid) + tinfo[i].acceptq_shares=tp->acceptq[i].aq_ratio; + else + tinfo[i].acceptq_shares = 0; + } + + len = min_t(unsigned int, len, sizeof(tinfo)); + if (put_user(len, optlen)) + return -EFAULT; + + if (copy_to_user(optval, (char *)tinfo, len)) + return -EFAULT; + + return 0; + } +#endif default: return -ENOPROTOOPT; }; diff -urN linux-2.6.3_old/net/ipv4/tcp_ipv4.c linux-2.6.3/net/ipv4/tcp_ipv4.c --- linux-2.6.3_old/net/ipv4/tcp_ipv4.c 2004-02-17 19:57:22.000000000 -0800 +++ linux-2.6.3/net/ipv4/tcp_ipv4.c 2004-02-29 23:59:09.000000000 -0800 @@ -916,7 +916,11 @@ lopt->syn_table[h] = req; write_unlock(&tp->syn_wait_lock); +#ifdef CONFIG_ACCEPT_QUEUES + tcp_synq_added(sk, req); +#else tcp_synq_added(sk); +#endif } @@ -1413,6 +1417,9 @@ __u32 daddr = skb->nh.iph->daddr; __u32 isn = TCP_SKB_CB(skb)->when; struct dst_entry *dst = NULL; +#ifdef CONFIG_ACCEPT_QUEUES + int class = 0; +#endif #ifdef CONFIG_SYN_COOKIES int want_cookie = 0; #else @@ -1437,12 +1444,32 @@ goto drop; } +#ifdef CONFIG_ACCEPT_QUEUES + class = (skb->nfmark <= 0) ? 0 : + ((skb->nfmark > NUM_ACCEPT_QUEUES) ? NUM_ACCEPT_QUEUES: + skb->nfmark); + /* + * Accept only if the class has shares set or if the default class + * i.e. class 0 has shares + */ + if (!(tcp_sk(sk)->acceptq[class].aq_valid)) { + if (tcp_sk(sk)->acceptq[0].aq_valid) + class = 0; + else + goto drop; + } +#endif + /* Accept backlog is full. If we have already queued enough * of warm entries in syn queue, drop request. It is better than * clogging syn queue with openreqs with exponentially increasing * timeout. */ +#ifdef CONFIG_ACCEPT_QUEUES + if (tcp_acceptq_is_full(sk, class) && tcp_synq_young(sk, class) > 1) +#else if (tcp_acceptq_is_full(sk) && tcp_synq_young(sk) > 1) +#endif goto drop; req = tcp_openreq_alloc(); @@ -1472,7 +1499,10 @@ tp.tstamp_ok = tp.saw_tstamp; tcp_openreq_init(req, &tp, skb); - +#ifdef CONFIG_ACCEPT_QUEUES + req->acceptq_class = class; + req->acceptq_time_stamp = jiffies; +#endif req->af.v4_req.loc_addr = daddr; req->af.v4_req.rmt_addr = saddr; req->af.v4_req.opt = tcp_v4_save_options(sk, skb); @@ -1567,7 +1597,11 @@ struct tcp_opt *newtp; struct sock *newsk; +#ifdef CONFIG_ACCEPT_QUEUES + if (tcp_acceptq_is_full(sk, req->acceptq_class)) +#else if (tcp_acceptq_is_full(sk)) +#endif goto exit_overflow; if (!dst && (dst = tcp_v4_route_req(sk, req)) == NULL) diff -urN linux-2.6.3_old/net/ipv4/tcp_minisocks.c linux-2.6.3/net/ipv4/tcp_minisocks.c --- linux-2.6.3_old/net/ipv4/tcp_minisocks.c 2004-02-17 19:58:56.000000000 -0800 +++ linux-2.6.3/net/ipv4/tcp_minisocks.c 2004-02-29 21:49:34.000000000 -0800 @@ -779,7 +779,14 @@ newtp->num_sacks = 0; newtp->urg_data = 0; newtp->listen_opt = NULL; +#ifdef CONFIG_ACCEPT_QUEUES + newtp->accept_queue = NULL; + memset(newtp->acceptq, 0,sizeof(newtp->acceptq)); + newtp->class_index = 0; + +#else newtp->accept_queue = newtp->accept_queue_tail = NULL; +#endif /* Deinitialize syn_wait_lock to trap illegal accesses. */ memset(&newtp->syn_wait_lock, 0, sizeof(newtp->syn_wait_lock)); diff -urN linux-2.6.3_old/net/ipv4/tcp_timer.c linux-2.6.3/net/ipv4/tcp_timer.c --- linux-2.6.3_old/net/ipv4/tcp_timer.c 2004-02-17 19:59:28.000000000 -0800 +++ linux-2.6.3/net/ipv4/tcp_timer.c 2004-02-27 17:38:55.000000000 -0800 @@ -498,7 +498,16 @@ * ones are about to clog our table. */ if (lopt->qlen>>(lopt->max_qlen_log-1)) { +#ifdef CONFIG_ACCEPT_QUEUES + int young = 0; + + for(i=0; i < NUM_ACCEPT_QUEUES; i++) + young += lopt->qlen_young[i]; + + young <<= 1; +#else int young = (lopt->qlen_young<<1); +#endif while (thresh > 2) { if (lopt->qlen < young) @@ -524,9 +533,12 @@ unsigned long timeo; if (req->retrans++ == 0) - lopt->qlen_young--; - timeo = min((TCP_TIMEOUT_INIT << req->retrans), - TCP_RTO_MAX); +#ifdef CONFIG_ACCEPT_QUEUES + lopt->qlen_young[req->acceptq_class]--; +#else + lopt->qlen_young--; +#endif + timeo = min((TCP_TIMEOUT_INIT << req->retrans), TCP_RTO_MAX); req->expires = now + timeo; reqp = &req->dl_next; continue; @@ -538,7 +550,11 @@ write_unlock(&tp->syn_wait_lock); lopt->qlen--; if (req->retrans == 0) - lopt->qlen_young--; +#ifdef CONFIG_ACCEPT_QUEUES + lopt->qlen_young[req->acceptq_class]--; +#else + lopt->qlen_young--; +#endif tcp_openreq_free(req); continue; } From raghavendra.koushik@wipro.com Mon Mar 1 05:05:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 05:06:09 -0800 (PST) Received: from wiproecmx2.wipro.com (wiproecmx2.wipro.com [164.164.31.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21D5aKO007752 for ; Mon, 1 Mar 2004 05:05:40 -0800 Received: from ec-vwall-wd (ec-vwall-wd.wipro.com [10.200.52.125]) by wiproecmx2.wipro.com (8.12.9-20031013/8.12.9) with SMTP id i21D5SlU019929 for ; Mon, 1 Mar 2004 18:35:29 +0530 (IST) Received: from blr-ec-bh3.wipro.com ([10.200.50.93]) by ec-vwall-wd with InterScan Messaging Security Suite; Mon, 01 Mar 2004 18:36:43 +0530 Received: from blr-m3-msg.wipro.com ([10.114.50.99]) by blr-ec-bh3.wipro.com with Microsoft SMTPSVC(5.0.2195.6713); Mon, 1 Mar 2004 18:35:27 +0530 X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Subject: RE: Submission #3 for S2io 10GbE driver Date: Mon, 1 Mar 2004 18:35:27 +0530 Message-ID: <4223A04BF7D1B941A25246ADD0462FF50115ADF9@blr-m3-msg.wipro.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Submission #3 for S2io 10GbE driver Thread-Index: AcP/Wff/fbVBm5XxRUWIKOkRQoO4BgAM6D6A From: To: , , Cc: X-OriginalArrivalTime: 01 Mar 2004 13:05:27.0554 (UTC) FILETIME=[DDF10E20:01C3FF8D] Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i21D5aKO007752 X-archive-position: 3683 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@wipro.com Precedence: bulk X-list: netdev Hi Leonid, This automated signature will be gone from tomorrow. Our IMG guys are working on it and hopefully by then all mails going out from the s2io guys will not have this "Confidentiality Notice" :-). I have a few more questions to Jeff but I'am holding on to them till this is addressed. Just wanted to keep you posted on this issue. Regards Koushik -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Monday, March 01, 2004 12:24 PM To: Raghavendra Koushik (WT01 - EMBEDDED & PRODUCT ENGINEERING SOLUTIONS) Cc: leonid.grossman@s2io.com; netdev@oss.sgi.com; shemminger@osdl.org; hch@infradead.org; ravinandan.arakali@s2io.com; raghavendra.koushik@s2io.com Subject: Re: Submission #3 for S2io 10GbE driver raghavendra.koushik@wipro.com wrote: > Jeff, > Regarding Point # 37 > > >>>37) kill all of this: >>> >>>+/* OS related system calls */ >>>+ >>>+#ifndef readq >>>+static inline u64 read64(void *addr) >>>+{ >>>+ u64 ret = 0; >>>+ ret = readl(addr + 4); >>>+ (u64) ret <<= 32; >>>+ (u64) ret |= readl(addr); > > [....] > > I agree that read/write(32,16,8) are not used so can be eliminated, > but the read/write64 macros are essential because not all platforms > have defined the readq and writeq system calls. i386 for example > doesn't have readq/writeq and to write into the 64 bit registers of > the NIC, I use 2 successive 32 bits (readl/writel) operation to > achieve the 64 bit equivalent. This procedure does work on all the > platforms that we have tested on. The code should use the kernel API -- readq/writeq -- not define its own API. With regards to the missing readq/writeq on some architectures... Short term, if some arches do not provide readq/writeq, provide your own definition (i.e. rename your write64 to a conditionally-defined writeq). Long term, all Linux platforms need to provide readq/writeq, so we need to modify the architectures with the missing pieces. > Confidentiality Notice > > The information contained in this electronic message and any > attachments to this message are intended for the exclusive use of the > addressee(s) and may contain confidential or privileged information. > If you are not the intended recipient, please notify the sender at > Wipro or Mailadmin@wipro.com immediately and destroy all copies of > this message and any attachments. Oh really? ;-) You should talk to your lawyers and sysadmins about sending email to open source people and lists... Regards, Jeff From leonid.grossman@s2io.com Mon Mar 1 07:27:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 07:27:16 -0800 (PST) Received: from ns1.s2io.com (ns1.s2io.com [216.209.86.101]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21FR8KO012355 for ; Mon, 1 Mar 2004 07:27:08 -0800 Received: from guinness.s2io.com (gateway.s2io.com [216.209.86.98]) by ns1.s2io.com (8.12.10/8.12.10) with ESMTP id i21FQxjF013510; Mon, 1 Mar 2004 10:26:59 -0500 (EST) Received: from lgt40 ([10.16.16.116]) by guinness.s2io.com (8.12.6/8.12.6) with ESMTP id i21FQvKK028157; Mon, 1 Mar 2004 10:26:57 -0500 (EST) From: "Leonid Grossman" To: , , Cc: Subject: RE: Submission #3 for S2io 10GbE driver Date: Mon, 1 Mar 2004 07:24:25 -0800 Message-ID: <000001c3ffa1$48643490$7410100a@S2IOtech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook, Build 10.0.2627 Importance: Normal In-Reply-To: <4223A04BF7D1B941A25246ADD0462FF50115ADF9@blr-m3-msg.wipro.com> X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 X-Spam-Score: -101 X-Spam-Outlook-Score: () X-Spam-Features: IN_REP_TO,QUOTED_EMAIL_TEXT,USER_IN_WHITELIST X-Scanned-By: MIMEDefang 2.34 X-archive-position: 3684 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: leonid.grossman@s2io.com Precedence: bulk X-list: netdev > -----Original Message----- > From: raghavendra.koushik@wipro.com > [mailto:raghavendra.koushik@wipro.com] > Sent: Monday, March 01, 2004 5:05 AM > To: leonid.grossman@s2io.com; netdev@oss.sgi.com; > ravinandan.arakali@s2io.com > Cc: sriram.rapuru@wipro.com > Subject: RE: Submission #3 for S2io 10GbE driver > > > > Hi Leonid, > > > This automated signature will be gone from tomorrow. Our > IMG guys are working on it and hopefully by then all mails > going out from > > the s2io guys will not have this "Confidentiality Notice" > :-). I have a few more questions to Jeff but I'am holding on > to them till this is addressed. Just wanted to keep you > posted on this issue. Sounds good, thanks! There are cases when the notice is required by Wipro of course, but in general it's either a nuisance or plain illegal. Let me know if you need any help from my end to get it removed; alternative would be to use private (or s2io) addresses for Talking to open lists. Leonid > > Regards > Koushik > > > -----Original Message----- > From: Jeff Garzik [mailto:jgarzik@pobox.com] > > Sent: Monday, March 01, 2004 12:24 PM > To: Raghavendra Koushik (WT01 - EMBEDDED & PRODUCT > ENGINEERING SOLUTIONS) > Cc: leonid.grossman@s2io.com; netdev@oss.sgi.com; > shemminger@osdl.org; hch@infradead.org; > ravinandan.arakali@s2io.com; raghavendra.koushik@s2io.com > Subject: Re: Submission #3 for S2io 10GbE driver > > > raghavendra.koushik@wipro.com wrote: > > Jeff, > > Regarding Point # 37 > > > > > > > >>>37) kill all of this: > >>> > >>>+/* OS related system calls */ > >>>+ > >>>+#ifndef readq > >>>+static inline u64 read64(void *addr) > >>>+{ > >>>+ u64 ret = 0; > >>>+ ret = readl(addr + 4); > >>>+ (u64) ret <<= 32; > >>>+ (u64) ret |= readl(addr); > > > > > [....] > > > > > I agree that read/write(32,16,8) are not used so can be eliminated, > > > but the read/write64 macros are essential because not all platforms > > > have defined the readq and writeq system calls. i386 for example > > > doesn't have readq/writeq and to write into the 64 bit registers of > > > the NIC, I use 2 successive 32 bits (readl/writel) operation to > > > achieve the 64 bit equivalent. This procedure does work on all the > > > platforms that we have tested on. > > The code should use the kernel API -- readq/writeq -- not > define its own > > API. With regards to the missing readq/writeq on some > architectures... > > Short term, if some arches do not provide readq/writeq, > provide your own > > definition (i.e. rename your write64 to a > conditionally-defined writeq). > > Long term, all Linux platforms need to provide readq/writeq, > so we need > > to modify the architectures with the missing pieces. > > > > Confidentiality Notice > > > > > The information contained in this electronic message and any > > > attachments to this message are intended for the exclusive > use of the > > > addressee(s) and may contain confidential or privileged information. > > > If you are not the intended recipient, please notify the sender at > > > Wipro or Mailadmin@wipro.com immediately and destroy all copies of > > > this message and any attachments. > > Oh really? ;-) You should talk to your lawyers and sysadmins about > > sending email to open source people and lists... > > Regards, > > Jeff > > > > > Confidentiality Notice > > > The information contained in this electronic message and any > attachments to this message are intended for the exclusive > use of the addressee(s) and may contain confidential or > privileged information. If you are not the intended > recipient, please notify the sender at Wipro or > Mailadmin@wipro.com immediately and destroy all copies of > this message and any attachments. > From kevin.curtis@farsite.co.uk Mon Mar 1 08:06:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 08:06:27 -0800 (PST) Received: from relay5.ftech.net (relay5.ftech.net [195.200.0.100]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21G6IKO013777 for ; Mon, 1 Mar 2004 08:06:19 -0800 Received: from opal.ftech.net ([212.32.16.127] helo=mailgate.ftech.net) by relay5.ftech.net with esmtp (Exim 3.36-ftechp12 #2) id 1Axntj-0006Yq-00; Mon, 01 Mar 2004 13:55:55 +0000 Received: from pc1.faradsl.ftech.co.uk ([212.32.46.162] helo=GENERAL.hq.farsitecommunications.com) by mailgate.ftech.net with esmtp (Exim 3.36-ftechp12 #1) id 1AxntY-00014J-00; Mon, 01 Mar 2004 13:55:44 +0000 Subject: RE: Update FarSync WAN driver in 2.6 Date: Mon, 1 Mar 2004 13:55:44 -0000 Message-ID: <7C078C66B7752B438B88E11E5E20E72E25CC1A@general.hq.farsitecommunications.com> X-MS-Has-Attach: yes MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C3FF94.E3FBAD9A" X-MS-TNEF-Correlator: Thread-Topic: Update FarSync WAN driver in 2.6 Thread-Index: AcP+9VRqHpr28/PlTpO8fXe/3pey7gAeAfzQAAnIc7A= From: "Kevin Curtis" content-class: urn:content-classes:message To: "Kevin Curtis" , "Jeff Garzik" X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 Cc: , X-archive-position: 3685 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kevin.curtis@farsite.co.uk Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------_=_NextPart_001_01C3FF94.E3FBAD9A Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Here is the modified patch. It installs against 2.6.4-pre1 Best get it in quick before net_device is given back to the hdlc layer again :-> Kevin -----Original Message----- From: Kevin Curtis=20 Sent: 01 March 2004 09:15 To: 'Jeff Garzik'; Kevin Curtis Cc: netdev@oss.sgi.com; davem@redhat.com Subject: RE: Update FarSync WAN driver in 2.6 Hi, looks as though the 2.6.4-pre1 patch has changed farsync.c, which is probably why the patch will not apply. I would re-work the patch against this release. What is the status of the 2.4.x patch that I sent a while back? I still need to make one more change to it. I need to know if to resend the whole patch, or a n additional patch with the change? Kevin -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com]=20 Sent: 29 February 2004 18:53 To: Kevin Curtis Cc: netdev@oss.sgi.com; davem@redhat.com Subject: Re: Update FarSync WAN driver in 2.6 hum... Patch looks OK to appy, but does not apply against the latest=20 2.6.x kernel. Also, it is possible to split your patch into two pieces: one patch=20 with nothing but indentation/whitespace cleanups, and the other patch=20 with functional changes? Jeff ------_=_NextPart_001_01C3FF94.E3FBAD9A Content-Type: application/octet-stream; name="farsync2.6.patch" Content-Transfer-Encoding: base64 Content-Description: farsync2.6.patch Content-Disposition: attachment; filename="farsync2.6.patch" ZGlmZiAtdXJOIGxpbnV4LTIuNi40LXByZTEtb3JpZy9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5j IGxpbnV4L2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKLS0tIGxpbnV4LTIuNi40LXByZTEtb3Jp Zy9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCTIwMDQtMDMtMDEgMDk6MTc6MDguMDAwMDAwMDAw ICswMDAwCisrKyBsaW51eC9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCTIwMDQtMDMtMDEgMTI6 NTQ6MjIuMjk5Mjg1NzUyICswMDAwCkBAIC0xLDkgKzEsOSBAQAogLyoKLSAqICAgICAgRmFyU3lu YyBYMjEgZHJpdmVyIGZvciBMaW51eCAoZ2VuZXJpYyBIRExDIHZlcnNpb24pCisgKiAgICAgIEZh clN5bmMgV0FOIGRyaXZlciBmb3IgTGludXggKDIuNi54IGtlcm5lbCB2ZXJzaW9uKQogICoKICAq ICAgICAgQWN0dWFsbHkgc3luYyBkcml2ZXIgZm9yIFguMjEsIFYuMzUgYW5kIFYuMjQgb24gRmFy U3luYyBULXNlcmllcyBjYXJkcwogICoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAxIEZhclNp dGUgQ29tbXVuaWNhdGlvbnMgTHRkLgorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBG YXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4KICAqICAgICAgd3d3LmZhcnNpdGUuY28udWsKICAq CiAgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IKQEAgLTExLDExICsxMSwxMyBAQAogICogICAgICBhcyBwdWJsaXNoZWQg YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqICAgICAg MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K ICAqCi0gKiAgICAgIEF1dGhvcjogUi5KLkR1bmxvcCAgICAgIDxib2IuZHVubG9wQGZhcnNpdGUu Y28udWs+CisgKiAgICAgIEF1dGhvcjogICAgICBSLkouRHVubG9wICAgIDxib2IuZHVubG9wQGZh cnNpdGUuY28udWs+CisgKiAgICAgIE1haW50YWluZXI6ICBLZXZpbiBDdXJ0aXMgIDxrZXZpbi5j dXJ0aXNAZmFyc2l0ZS5jby51az4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAj aW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2lu Y2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUg PGxpbnV4L2luaXQuaD4KQEAgLTI1LDQ5ICsyNyw2MiBAQAogCiAjaW5jbHVkZSAiZmFyc3luYy5o IgogCi0KIC8qCiAgKiAgICAgIE1vZHVsZSBpbmZvCiAgKi8KIE1PRFVMRV9BVVRIT1IoIlIuSi5E dW5sb3AgPGJvYi5kdW5sb3BAZmFyc2l0ZS5jby51az4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigi RmFyU3luYyBULVNlcmllcyBYMjEgZHJpdmVyLiBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4i KTsKK01PRFVMRV9ERVNDUklQVElPTigiRmFyU3luYyBULVNlcmllcyBXQU4gZHJpdmVyLiBGYXJT aXRlIENvbW11bmljYXRpb25zIEx0ZC4iKTsKK01PRFVMRV9QQVJNKGZzdF90eHFfbG93LCAiaSIp OworTU9EVUxFX1BBUk0oZnN0X3R4cV9oaWdoLCAiaSIpOworTU9EVUxFX1BBUk0oZnN0X21heF9y ZWFkcywgImkiKTsKK01PRFVMRV9QQVJNKGZzdF9leGNsdWRlZF9jYXJkcywgImkiKTsKK01PRFVM RV9QQVJNKGZzdF9leGNsdWRlZF9saXN0LCAiMC0zMmkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwi KTsKIAogLyogICAgICBEcml2ZXIgY29uZmlndXJhdGlvbiBhbmQgZ2xvYmFsIHBhcmFtZXRlcnMK ICAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8K IAotLyogICAgICBOdW1iZXIgb2YgcG9ydHMgKHBlciBjYXJkKSBzdXBwb3J0ZWQKKy8qICAgICAg TnVtYmVyIG9mIHBvcnRzIChwZXIgY2FyZCkgYW5kIGNhcmRzIHN1cHBvcnRlZAogICovCiAjZGVm aW5lIEZTVF9NQVhfUE9SVFMgICAgICAgICAgIDQKLQotCi0vKiAgICAgIFBDSSB2ZW5kb3IgYW5k IGRldmljZSBJRHMKLSAqLwotI2RlZmluZSBGU0NfUENJX1ZFTkRPUl9JRCAgICAgICAweDE2MTkg IC8qIEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkICovCi0jZGVmaW5lIFQyUF9QQ0lfREVWSUNF X0lEICAgICAgIDB4MDQwMCAgLyogVDJQIFgyMSAyIHBvcnQgY2FyZCAqLwotI2RlZmluZSBUNFBf UENJX0RFVklDRV9JRCAgICAgICAweDA0NDAgIC8qIFQ0UCBYMjEgNCBwb3J0IGNhcmQgKi8KLQor I2RlZmluZSBGU1RfTUFYX0NBUkRTICAgICAgICAgICAzMgogCiAvKiAgICAgIERlZmF1bHQgcGFy YW1ldGVycyBmb3IgdGhlIGxpbmsKICAqLwotI2RlZmluZSBGU1RfVFhfUVVFVUVfTEVOICAgICAg ICAxMDAgICAgIC8qIEF0IDhNYnBzIGEgbG9uZ2VyIHF1ZXVlIGxlbmd0aCBpcwotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzZWZ1bCwgdGhlIHN5bmNwcHAgbW9k dWxlIGZvcmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRo aXMgZG93biBhc3N1bWluZyBhIHNsb3dlciBsaW5lIEkKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKiBndWVzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlNUX01BWF9NVFUgICAgICAgICAgICAgODAwMCAgICAv KiBIdWdlIGJ1dCBwb3NzaWJsZSAqLwotI2RlZmluZSBGU1RfREVGX01UVSAgICAgICAgICAgICAx NTAwICAgIC8qIENvbW1vbiBzYW5lIHZhbHVlICovCisjZGVmaW5lIEZTVF9UWF9RVUVVRV9MRU4g ICAgICAgIDEwMAkvKiBBdCA4TWJwcyBhIGxvbmdlciBxdWV1ZSBsZW5ndGggaXMKKwkJCQkJICog dXNlZnVsLCB0aGUgc3luY3BwcCBtb2R1bGUgZm9yY2VzCisJCQkJCSAqIHRoaXMgZG93biBhc3N1 bWluZyBhIHNsb3dlciBsaW5lIEkKKwkJCQkJICogZ3Vlc3MuCisJCQkJCSAqLworI2RlZmluZSBG U1RfVFhRX0RFUFRIICAgICAgICAgICAxNgkvKiBUaGlzIG9uZSBpcyBmb3IgdGhlIGJ1ZmZlcmlu ZworCQkJCQkgKiBvZiBmcmFtZXMgb24gdGhlIHdheSBkb3duIHRvIHRoZSBjYXJkCisJCQkJCSAq IHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhlIGNhcmQgYnVzeQorCQkJCQkgKiBhbmQgbWF4aW1pc2Ug dGhyb3VnaHB1dAorCQkJCQkgKi8KKyNkZWZpbmUgRlNUX0hJR0hfV0FURVJfTUFSSyAgICAgMTIJ LyogUG9pbnQgYXQgd2hpY2ggd2UgZmxvdyBjb250cm9sCisJCQkJCSAqIG5ldHdvcmsgbGF5ZXIg Ki8KKyNkZWZpbmUgRlNUX0xPV19XQVRFUl9NQVJLICAgICAgOAkvKiBQb2ludCBhdCB3aGljaCB3 ZSByZW1vdmUgZmxvdworCQkJCQkgKiBjb250cm9sIGZyb20gbmV0d29yayBsYXllciAqLworI2Rl ZmluZSBGU1RfTUFYX01UVSAgICAgICAgICAgICA4MDAwCS8qIEh1Z2UgYnV0IHBvc3NpYmxlICov CisjZGVmaW5lIEZTVF9ERUZfTVRVICAgICAgICAgICAgIDE1MDAJLyogQ29tbW9uIHNhbmUgdmFs dWUgKi8KIAogI2RlZmluZSBGU1RfVFhfVElNRU9VVCAgICAgICAgICAoMipIWikKIAotCiAjaWZk ZWYgQVJQSFJEX1JBV0hETEMKLSNkZWZpbmUgQVJQSFJEX01ZVFlQRSAgIEFSUEhSRF9SQVdIRExD ICAvKiBSYXcgZnJhbWVzICovCisjZGVmaW5lIEFSUEhSRF9NWVRZUEUgICBBUlBIUkRfUkFXSERM QwkvKiBSYXcgZnJhbWVzICovCiAjZWxzZQotI2RlZmluZSBBUlBIUkRfTVlUWVBFICAgQVJQSFJE X0hETEMgICAgIC8qIENpc2NvLUhETEMgKGtlZXBhbGl2ZXMgZXRjKSAqLworI2RlZmluZSBBUlBI UkRfTVlUWVBFICAgQVJQSFJEX0hETEMJLyogQ2lzY28tSERMQyAoa2VlcGFsaXZlcyBldGMpICov CiAjZW5kaWYKIAorLyoKKyAqIE1vZHVsZXMgcGFyYW1ldGVycyBhbmQgYXNzb2NpYXRlZCB2YXJh aWJsZXMKKyAqLworaW50IGZzdF90eHFfbG93ID0gRlNUX0xPV19XQVRFUl9NQVJLOworaW50IGZz dF90eHFfaGlnaCA9IEZTVF9ISUdIX1dBVEVSX01BUks7CitpbnQgZnN0X21heF9yZWFkcyA9IDc7 CitpbnQgZnN0X2V4Y2x1ZGVkX2NhcmRzID0gMDsKK2ludCBmc3RfZXhjbHVkZWRfbGlzdFtGU1Rf TUFYX0NBUkRTXTsKIAogLyogICAgICBDYXJkIHNoYXJlZCBtZW1vcnkgbGF5b3V0CiAgKiAgICAg ID09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTg0LDU4ICs5OSw1NyBAQAogICogICAgICBi ZSB1c2VkIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgZ290IG91dCBvZiBzdGVwIHdpdGggdGhl IGZpcm13YXJlCiAgKiAgICAgIGNvbnRhaW5lZCBpbiB0aGUgLkNERSBmaWxlcy4KICAqLwotI2Rl ZmluZSBTTUNfVkVSU0lPTiAxMQorI2RlZmluZSBTTUNfVkVSU0lPTiAyNAogCi0jZGVmaW5lIEZT VF9NRU1TSVpFIDB4MTAwMDAwICAgIC8qIFNpemUgb2YgY2FyZCBtZW1vcnkgKDFNYikgKi8KKyNk ZWZpbmUgRlNUX01FTVNJWkUgMHgxMDAwMDAJLyogU2l6ZSBvZiBjYXJkIG1lbW9yeSAoMU1iKSAq LwogCi0jZGVmaW5lIFNNQ19CQVNFIDB4MDAwMDIwMDBMICAgIC8qIEJhc2Ugb2Zmc2V0IG9mIHRo ZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBtYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCi0jZGVmaW5lIEJGTV9CQVNFIDB4MDAw MTAwMDBMICAgIC8qIEJhc2Ugb2Zmc2V0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBETUEK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnVmZmVycyAqLworI2RlZmluZSBT TUNfQkFTRSAweDAwMDAyMDAwTAkvKiBCYXNlIG9mZnNldCBvZiB0aGUgc2hhcmVkIG1lbW9yeSB3 aW5kb3cgbWFpbgorCQkJCSAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCisjZGVmaW5lIEJG TV9CQVNFIDB4MDAwMTAwMDBMCS8qIEJhc2Ugb2Zmc2V0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHdp bmRvdyBETUEKKwkJCQkgKiBidWZmZXJzICovCiAKLSNkZWZpbmUgTEVOX1RYX0JVRkZFUiA4MTky ICAgICAgLyogU2l6ZSBvZiBwYWNrZXQgYnVmZmVycyAqLworI2RlZmluZSBMRU5fVFhfQlVGRkVS IDgxOTIJLyogU2l6ZSBvZiBwYWNrZXQgYnVmZmVycyAqLwogI2RlZmluZSBMRU5fUlhfQlVGRkVS IDgxOTIKIAotI2RlZmluZSBMRU5fU01BTExfVFhfQlVGRkVSIDI1NiAvKiBTaXplIG9mIG9ic29s ZXRlIGJ1ZmZzIHVzZWQgZm9yIERPUyBkaWFncyAqLworI2RlZmluZSBMRU5fU01BTExfVFhfQlVG RkVSIDI1NgkvKiBTaXplIG9mIG9ic29sZXRlIGJ1ZmZzIHVzZWQgZm9yIERPUyBkaWFncyAqLwog I2RlZmluZSBMRU5fU01BTExfUlhfQlVGRkVSIDI1NgogCi0jZGVmaW5lIE5VTV9UWF9CVUZGRVIg MiAgICAgICAgIC8qIE11c3QgYmUgcG93ZXIgb2YgMi4gRml4ZWQgYnkgZmlybXdhcmUgKi8KKyNk ZWZpbmUgTlVNX1RYX0JVRkZFUiAyCQkvKiBNdXN0IGJlIHBvd2VyIG9mIDIuIEZpeGVkIGJ5IGZp cm13YXJlICovCiAjZGVmaW5lIE5VTV9SWF9CVUZGRVIgOAogCiAvKiBJbnRlcnJ1cHQgcmV0cnkg dGltZSBpbiBtaWxsaXNlY29uZHMgKi8KICNkZWZpbmUgSU5UX1JFVFJZX1RJTUUgMgogCi0KIC8q ICAgICAgVGhlIEFtMTg2Q0gvQ0MgcHJvY2Vzc29ycyBzdXBwb3J0IGEgU21hcnRETUEgbW9kZSB1 c2luZyBjaXJjdWxhciBwb29scwogICogICAgICBvZiBidWZmZXIgZGVzY3JpcHRvcnMuIFRoZSBz dHJ1Y3R1cmUgaXMgYWxtb3N0IGlkZW50aWNhbCB0byB0aGF0IHVzZWQKICAqICAgICAgaW4gdGhl IExBTkNFIEV0aGVybmV0IGNvbnRyb2xsZXJzLiBEZXRhaWxzIGF2YWlsYWJsZSBhcyBQREYgZnJv bSB0aGUKICAqICAgICAgQU1EIHdlYiBzaXRlOiBodHRwOi8vd3d3LmFtZC5jb20vcHJvZHVjdHMv ZXBkL3Byb2Nlc3NvcnMvXAogICogICAgICAgICAgICAgICAgICAgIDIuMTZiaXRjb250LzMuYW0x ODZjeGZhL2EyMTkxNC8yMTkxNC5wZGYKICAqLwotc3RydWN0IHR4ZGVzYyB7ICAgICAgICAgICAg ICAgICAvKiBUcmFuc21pdCBkZXNjcmlwdG9yICovCi0gICAgICAgIHZvbGF0aWxlIHUxNiBsYWRy OyAgICAgIC8qIExvdyBvcmRlciBhZGRyZXNzIG9mIHBhY2tldC4gVGhpcyBpcyBhCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxpbmVhciBhZGRyZXNzIGluIHRoZSBBbTE4NiBt ZW1vcnkgc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAg IHZvbGF0aWxlIHU4ICBoYWRyOyAgICAgIC8qIEhpZ2ggb3JkZXIgYWRkcmVzcy4gTG93IDQgYml0 cyBvbmx5LCBoaWdoIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYml0cyBt dXN0IGJlIHplcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAg IHZvbGF0aWxlIHU4ICBiaXRzOyAgICAgIC8qIFN0YXR1cyBhbmQgY29uZmlnICovCi0gICAgICAg IHZvbGF0aWxlIHUxNiBiY250OyAgICAgIC8qIDJzIGNvbXBsZW1lbnQgb2YgcGFja2V0IHNpemUg aW4gbG93IDE1IGJpdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRyYW5z bWl0IHRlcm1pbmFsIGNvdW50IGludGVycnVwdCBlbmFibGUgaW4KLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICogdG9wIGJpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICovCi0gICAgICAgICAgICAgICAgIHUxNiB1bnVzZWQ7ICAgIC8qIE5vdCB1c2VkIGluIFR4 ICovCitzdHJ1Y3QgdHhkZXNjIHsJCQkvKiBUcmFuc21pdCBkZXNjcmlwdG9yICovCisJdm9sYXRp bGUgdTE2IGxhZHI7CS8qIExvdyBvcmRlciBhZGRyZXNzIG9mIHBhY2tldC4gVGhpcyBpcyBhCisJ CQkJICogbGluZWFyIGFkZHJlc3MgaW4gdGhlIEFtMTg2IG1lbW9yeSBzcGFjZQorCQkJCSAqLwor CXZvbGF0aWxlIHU4IGhhZHI7CS8qIEhpZ2ggb3JkZXIgYWRkcmVzcy4gTG93IDQgYml0cyBvbmx5 LCBoaWdoIDQKKwkJCQkgKiBiaXRzIG11c3QgYmUgemVybworCQkJCSAqLworCXZvbGF0aWxlIHU4 IGJpdHM7CS8qIFN0YXR1cyBhbmQgY29uZmlnICovCisJdm9sYXRpbGUgdTE2IGJjbnQ7CS8qIDJz IGNvbXBsZW1lbnQgb2YgcGFja2V0IHNpemUgaW4gbG93IDE1IGJpdHMuCisJCQkJICogVHJhbnNt aXQgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGVuYWJsZSBpbgorCQkJCSAqIHRvcCBiaXQuCisJ CQkJICovCisJdTE2IHVudXNlZDsJCS8qIE5vdCB1c2VkIGluIFR4ICovCiB9OwogCi1zdHJ1Y3Qg cnhkZXNjIHsgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmUgZGVzY3JpcHRvciAqLwotICAgICAg ICB2b2xhdGlsZSB1MTYgbGFkcjsgICAgICAvKiBMb3cgb3JkZXIgYWRkcmVzcyBvZiBwYWNrZXQg Ki8KLSAgICAgICAgdm9sYXRpbGUgdTggIGhhZHI7ICAgICAgLyogSGlnaCBvcmRlciBhZGRyZXNz ICovCi0gICAgICAgIHZvbGF0aWxlIHU4ICBiaXRzOyAgICAgIC8qIFN0YXR1cyBhbmQgY29uZmln ICovCi0gICAgICAgIHZvbGF0aWxlIHUxNiBiY250OyAgICAgIC8qIDJzIGNvbXBsZW1lbnQgb2Yg YnVmZmVyIHNpemUgaW4gbG93IDE1IGJpdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqIFJlY2VpdmUgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGVuYWJsZSBpbgotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0b3AgYml0LgotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdm9sYXRpbGUgdTE2IG1jbnQ7ICAgICAgLyogTWVz c2FnZSBieXRlIGNvdW50ICgxNSBiaXRzKSAqLworc3RydWN0IHJ4ZGVzYyB7CQkJLyogUmVjZWl2 ZSBkZXNjcmlwdG9yICovCisJdm9sYXRpbGUgdTE2IGxhZHI7CS8qIExvdyBvcmRlciBhZGRyZXNz IG9mIHBhY2tldCAqLworCXZvbGF0aWxlIHU4IGhhZHI7CS8qIEhpZ2ggb3JkZXIgYWRkcmVzcyAq LworCXZvbGF0aWxlIHU4IGJpdHM7CS8qIFN0YXR1cyBhbmQgY29uZmlnICovCisJdm9sYXRpbGUg dTE2IGJjbnQ7CS8qIDJzIGNvbXBsZW1lbnQgb2YgYnVmZmVyIHNpemUgaW4gbG93IDE1IGJpdHMu CisJCQkJICogUmVjZWl2ZSB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgZW5hYmxlIGluCisJCQkJ ICogdG9wIGJpdC4KKwkJCQkgKi8KKwl2b2xhdGlsZSB1MTYgbWNudDsJLyogTWVzc2FnZSBieXRl IGNvdW50ICgxNSBiaXRzKSAqLwogfTsKIAogLyogQ29udmVydCBhIGxlbmd0aCBpbnRvIHRoZSAx NSBiaXQgMidzIGNvbXBsZW1lbnQgKi8KQEAgLTE0Niw1NyArMTYwLDk5IEBACiAjZGVmaW5lIGNu dl9iY250KGxlbikgICAoLShsZW4pKQogCiAvKiBTdGF0dXMgYW5kIGNvbmZpZyBiaXRzIGZvciB0 aGUgYWJvdmUgKi8KLSNkZWZpbmUgRE1BX09XTiAgICAgICAgIDB4ODAgICAgICAgICAgICAvKiBT bWFydERNQSBvd25zIHRoZSBkZXNjcmlwdG9yICovCi0jZGVmaW5lIFRYX1NUUCAgICAgICAgICAw eDAyICAgICAgICAgICAgLyogVHg6IHN0YXJ0IG9mIHBhY2tldCAqLwotI2RlZmluZSBUWF9FTlAg ICAgICAgICAgMHgwMSAgICAgICAgICAgIC8qIFR4OiBlbmQgb2YgcGFja2V0ICovCi0jZGVmaW5l IFJYX0VSUiAgICAgICAgICAweDQwICAgICAgICAgICAgLyogUng6IGVycm9yIChPUiBvZiBuZXh0 IDQgYml0cykgKi8KLSNkZWZpbmUgUlhfRlJBTSAgICAgICAgIDB4MjAgICAgICAgICAgICAvKiBS eDogZnJhbWluZyBlcnJvciAqLwotI2RlZmluZSBSWF9PRkxPICAgICAgICAgMHgxMCAgICAgICAg ICAgIC8qIFJ4OiBvdmVyZmxvdyBlcnJvciAqLwotI2RlZmluZSBSWF9DUkMgICAgICAgICAgMHgw OCAgICAgICAgICAgIC8qIFJ4OiBDUkMgZXJyb3IgKi8KLSNkZWZpbmUgUlhfSEJVRiAgICAgICAg IDB4MDQgICAgICAgICAgICAvKiBSeDogYnVmZmVyIGVycm9yICovCi0jZGVmaW5lIFJYX1NUUCAg ICAgICAgICAweDAyICAgICAgICAgICAgLyogUng6IHN0YXJ0IG9mIHBhY2tldCAqLwotI2RlZmlu ZSBSWF9FTlAgICAgICAgICAgMHgwMSAgICAgICAgICAgIC8qIFJ4OiBlbmQgb2YgcGFja2V0ICov Ci0KKyNkZWZpbmUgRE1BX09XTiAgICAgICAgIDB4ODAJLyogU21hcnRETUEgb3ducyB0aGUgZGVz Y3JpcHRvciAqLworI2RlZmluZSBUWF9TVFAgICAgICAgICAgMHgwMgkvKiBUeDogc3RhcnQgb2Yg cGFja2V0ICovCisjZGVmaW5lIFRYX0VOUCAgICAgICAgICAweDAxCS8qIFR4OiBlbmQgb2YgcGFj a2V0ICovCisjZGVmaW5lIFJYX0VSUiAgICAgICAgICAweDQwCS8qIFJ4OiBlcnJvciAoT1Igb2Yg bmV4dCA0IGJpdHMpICovCisjZGVmaW5lIFJYX0ZSQU0gICAgICAgICAweDIwCS8qIFJ4OiBmcmFt aW5nIGVycm9yICovCisjZGVmaW5lIFJYX09GTE8gICAgICAgICAweDEwCS8qIFJ4OiBvdmVyZmxv dyBlcnJvciAqLworI2RlZmluZSBSWF9DUkMgICAgICAgICAgMHgwOAkvKiBSeDogQ1JDIGVycm9y ICovCisjZGVmaW5lIFJYX0hCVUYgICAgICAgICAweDA0CS8qIFJ4OiBidWZmZXIgZXJyb3IgKi8K KyNkZWZpbmUgUlhfU1RQICAgICAgICAgIDB4MDIJLyogUng6IHN0YXJ0IG9mIHBhY2tldCAqLwor I2RlZmluZSBSWF9FTlAgICAgICAgICAgMHgwMQkvKiBSeDogZW5kIG9mIHBhY2tldCAqLwogCi0v KiBJbnRlcnJ1cHRzIGZyb20gdGhlIGNhcmQgYXJlIGNhdXNlZCBieSB2YXJpb3VzIGV2ZW50cyBh bmQgdGhlc2UgYXJlIHByZXNlbnRlZAorLyogSW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFyZSBj YXVzZWQgYnkgdmFyaW91cyBldmVudHMgd2hpY2ggYXJlIHByZXNlbnRlZAogICogaW4gYSBjaXJj dWxhciBidWZmZXIgYXMgc2V2ZXJhbCBldmVudHMgbWF5IGJlIHByb2Nlc3NlZCBvbiBvbmUgcGh5 c2ljYWwgaW50CiAgKi8KICNkZWZpbmUgTUFYX0NJUkJVRkYgICAgIDMyCiAKIHN0cnVjdCBjaXJi dWZmIHsKLSAgICAgICAgdTggcmRpbmRleDsgICAgICAgICAgICAgLyogcmVhZCwgdGhlbiBpbmNy ZW1lbnQgYW5kIHdyYXAgKi8KLSAgICAgICAgdTggd3JpbmRleDsgICAgICAgICAgICAgLyogd3Jp dGUsIHRoZW4gaW5jcmVtZW50IGFuZCB3cmFwICovCi0gICAgICAgIHU4IGV2bnRidWZmW01BWF9D SVJCVUZGXTsKKwl1OCByZGluZGV4OwkJLyogcmVhZCwgdGhlbiBpbmNyZW1lbnQgYW5kIHdyYXAg Ki8KKwl1OCB3cmluZGV4OwkJLyogd3JpdGUsIHRoZW4gaW5jcmVtZW50IGFuZCB3cmFwICovCisJ dTggZXZudGJ1ZmZbTUFYX0NJUkJVRkZdOwogfTsKIAogLyogSW50ZXJydXB0IGV2ZW50IGNvZGVz LgogICogV2hlcmUgYXBwcm9wcmlhdGUgdGhlIHR3byBsb3cgb3JkZXIgYml0cyBpbmRpY2F0ZSB0 aGUgcG9ydCBudW1iZXIKICAqLwotI2RlZmluZSBDVExBX0NIRyAgICAgICAgMHgxOCAgICAvKiBD b250cm9sIHNpZ25hbCBjaGFuZ2VkICovCisjZGVmaW5lIENUTEFfQ0hHICAgICAgICAweDE4CS8q IENvbnRyb2wgc2lnbmFsIGNoYW5nZWQgKi8KICNkZWZpbmUgQ1RMQl9DSEcgICAgICAgIDB4MTkK ICNkZWZpbmUgQ1RMQ19DSEcgICAgICAgIDB4MUEKICNkZWZpbmUgQ1RMRF9DSEcgICAgICAgIDB4 MUIKIAotI2RlZmluZSBJTklUX0NQTFQgICAgICAgMHgyMCAgICAvKiBJbml0aWFsaXNhdGlvbiBj b21wbGV0ZSAqLwotI2RlZmluZSBJTklUX0ZBSUwgICAgICAgMHgyMSAgICAvKiBJbml0aWFsaXNh dGlvbiBmYWlsZWQgKi8KKyNkZWZpbmUgSU5JVF9DUExUICAgICAgIDB4MjAJLyogSW5pdGlhbGlz YXRpb24gY29tcGxldGUgKi8KKyNkZWZpbmUgSU5JVF9GQUlMICAgICAgIDB4MjEJLyogSW5pdGlh bGlzYXRpb24gZmFpbGVkICovCiAKLSNkZWZpbmUgQUJUQV9TRU5UICAgICAgIDB4MjQgICAgLyog QWJvcnQgc2VudCAqLworI2RlZmluZSBBQlRBX1NFTlQgICAgICAgMHgyNAkvKiBBYm9ydCBzZW50 ICovCiAjZGVmaW5lIEFCVEJfU0VOVCAgICAgICAweDI1CiAjZGVmaW5lIEFCVENfU0VOVCAgICAg ICAweDI2CiAjZGVmaW5lIEFCVERfU0VOVCAgICAgICAweDI3CiAKLSNkZWZpbmUgVFhBX1VOREYg ICAgICAgIDB4MjggICAgLyogVHJhbnNtaXNzaW9uIHVuZGVyZmxvdyAqLworI2RlZmluZSBUWEFf VU5ERiAgICAgICAgMHgyOAkvKiBUcmFuc21pc3Npb24gdW5kZXJmbG93ICovCiAjZGVmaW5lIFRY Ql9VTkRGICAgICAgICAweDI5CiAjZGVmaW5lIFRYQ19VTkRGICAgICAgICAweDJBCiAjZGVmaW5l IFRYRF9VTkRGICAgICAgICAweDJCCiAKKyNkZWZpbmUgRjU2X0lOVCAgICAgICAgIDB4MkMKKyNk ZWZpbmUgTTMyX0lOVCAgICAgICAgIDB4MkQKKworI2RlZmluZSBURTFfQUxNQSAgICAgICAgMHgz MAogCiAvKiBQb3J0IHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24uIFNlZSBmYXJzeW5jLmggZm9yIGZp ZWxkIHZhbHVlcyAqLwogc3RydWN0IHBvcnRfY2ZnIHsKLSAgICAgICAgdTE2ICBsaW5lSW50ZXJm YWNlOyAgICAgLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KLSAgICAgICAgdTggICB4MjVv cDsgICAgICAgICAgICAgLyogVW51c2VkIGF0IHByZXNlbnQgKi8KLSAgICAgICAgdTggICBpbnRl cm5hbENsb2NrOyAgICAgLyogMSA9PiBpbnRlcm5hbCBjbG9jaywgMCA9PiBleHRlcm5hbCAqLwot ICAgICAgICB1MzIgIGxpbmVTcGVlZDsgICAgICAgICAvKiBTcGVlZCBpbiBicHMgKi8KKwl1MTYg bGluZUludGVyZmFjZTsJLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KKwl1OCB4MjVvcDsJ CS8qIFVudXNlZCBhdCBwcmVzZW50ICovCisJdTggaW50ZXJuYWxDbG9jazsJLyogMSA9PiBpbnRl cm5hbCBjbG9jaywgMCA9PiBleHRlcm5hbCAqLworCXU4IHRyYW5zcGFyZW50TW9kZTsJLyogMSA9 PiBvbiwgMCA9PiBvZmYgKi8KKwl1OCBpbnZlcnRDbG9jazsJCS8qIDAgPT4gbm9ybWFsLCAxID0+ IGludmVydGVkICovCisJdTggcGFkQnl0ZXNbNl07CQkvKiBQYWRkaW5nICovCisJdTMyIGxpbmVT cGVlZDsJCS8qIFNwZWVkIGluIGJwcyAqLworfTsKKworLyogVEUxIHBvcnQgcGh5c2ljYWwgY29u ZmlndXJhdGlvbiAqLworc3RydWN0IHN1X2NvbmZpZyB7CisJdTMyIGRhdGFSYXRlOworCXU4IGNs b2NraW5nOworCXU4IGZyYW1pbmc7CisJdTggc3RydWN0dXJlOworCXU4IGludGVyZmFjZTsKKwl1 OCBjb2Rpbmc7CisJdTggbGluZUJ1aWxkT3V0OworCXU4IGVxdWFsaXplcjsKKwl1OCB0cmFuc3Bh cmVudE1vZGU7CisJdTggbG9vcE1vZGU7CisJdTggcmFuZ2U7CisJdTggdHhCdWZmZXJNb2RlOwor CXU4IHJ4QnVmZmVyTW9kZTsKKwl1OCBzdGFydGluZ1Nsb3Q7CisJdTggbG9zVGhyZXNob2xkOwor CXU4IGVuYWJsZUlkbGVDb2RlOworCXU4IGlkbGVDb2RlOworCXU4IHNwYXJlWzQ0XTsKK307CisK Ky8qIFRFMSBTdGF0dXMgKi8KK3N0cnVjdCBzdV9zdGF0dXMgeworCXUzMiByZWNlaXZlQnVmZmVy RGVsYXk7CisJdTMyIGZyYW1pbmdFcnJvckNvdW50OworCXUzMiBjb2RlVmlvbGF0aW9uQ291bnQ7 CisJdTMyIGNyY0Vycm9yQ291bnQ7CisJdTMyIGxpbmVBdHRlbnVhdGlvbjsKKwl1OCBwb3J0U3Rh cnRlZDsKKwl1OCBsb3NzT2ZTaWduYWw7CisJdTggcmVjZWl2ZVJlbW90ZUFsYXJtOworCXU4IGFs YXJtSW5kaWNhdGlvblNpZ25hbDsKKwl1OCBzcGFyZVs0MF07CiB9OwogCiAvKiBGaW5hbGx5IHNs aW5nIGFsbCB0aGUgYWJvdmUgdG9nZXRoZXIgaW50byB0aGUgc2hhcmVkIG1lbW9yeSBzdHJ1Y3R1 cmUuCkBAIC0yMDYsMTU0ICsyNjIsMjE2IEBACiAgKiBTZWUgZmFyc3luYy5oIGZvciBzb21lIGZp ZWxkIHZhbHVlcy4KICAqLwogc3RydWN0IGZzdF9zaGFyZWQgewotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAvKiBETUEgZGVzY3JpcHRvciByaW5ncyAqLwotICAgICAgICBzdHJ1Y3Qg cnhkZXNjIHJ4RGVzY3JSaW5nW0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdOwotICAgICAg ICBzdHJ1Y3QgdHhkZXNjIHR4RGVzY3JSaW5nW0ZTVF9NQVhfUE9SVFNdW05VTV9UWF9CVUZGRVJd OworCS8qIERNQSBkZXNjcmlwdG9yIHJpbmdzICovCisJc3RydWN0IHJ4ZGVzYyByeERlc2NyUmlu Z1tGU1RfTUFYX1BPUlRTXVtOVU1fUlhfQlVGRkVSXTsKKwlzdHJ1Y3QgdHhkZXNjIHR4RGVzY3JS aW5nW0ZTVF9NQVhfUE9SVFNdW05VTV9UWF9CVUZGRVJdOworCisJLyogT2Jzb2xldGUgc21hbGwg YnVmZmVycyAqLworCXU4IHNtYWxsUnhCdWZmZXJbRlNUX01BWF9QT1JUU11bTlVNX1JYX0JVRkZF Ul1bTEVOX1NNQUxMX1JYX0JVRkZFUl07CisJdTggc21hbGxUeEJ1ZmZlcltGU1RfTUFYX1BPUlRT XVtOVU1fVFhfQlVGRkVSXVtMRU5fU01BTExfVFhfQlVGRkVSXTsKIAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAvKiBPYnNvbGV0ZSBzbWFsbCBidWZmZXJzICovCi0gICAgICAgIHU4 ICBzbWFsbFJ4QnVmZmVyW0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdW0xFTl9TTUFMTF9S WF9CVUZGRVJdOwotICAgICAgICB1OCAgc21hbGxUeEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1f VFhfQlVGRkVSXVtMRU5fU01BTExfVFhfQlVGRkVSXTsKKwl1OCB0YXNrU3RhdHVzOwkJLyogMHgw MCA9PiBpbml0aWFsaXNpbmcsIDB4MDEgPT4gcnVubmluZywKKwkJCQkgKiAweEZGID0+IGhhbHRl ZAorCQkJCSAqLwogCi0gICAgICAgIHU4ICB0YXNrU3RhdHVzOyAgICAgICAgIC8qIDB4MDAgPT4g aW5pdGlhbGlzaW5nLCAweDAxID0+IHJ1bm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqIDB4RkYgPT4gaGFsdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqLworCXU4IGludGVycnVwdEhhbmRzaGFrZTsJLyogU2V0IHRvIDB4MDEgYnkgYWRhcHRlciB0 byBzaWduYWwgaW50ZXJydXB0LAorCQkJCSAqIHNldCB0byAweEVFIGJ5IGhvc3QgdG8gYWNrbm93 bGVkZ2UgaW50ZXJydXB0CisJCQkJICovCiAKLSAgICAgICAgdTggIGludGVycnVwdEhhbmRzaGFr ZTsgLyogU2V0IHRvIDB4MDEgYnkgYWRhcHRlciB0byBzaWduYWwgaW50ZXJydXB0LAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXQgdG8gMHhFRSBieSBob3N0IHRvIGFja25v d2xlZGdlIGludGVycnVwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1 MTYgc21jVmVyc2lvbjsJCS8qIE11c3QgbWF0Y2ggU01DX1ZFUlNJT04gKi8KIAotICAgICAgICB1 MTYgc21jVmVyc2lvbjsgICAgICAgICAvKiBNdXN0IG1hdGNoIFNNQ19WRVJTSU9OICovCisJdTMy IHNtY0Zpcm13YXJlVmVyc2lvbjsJLyogMHhJSVZWUlJCQiB3aGVyZSBJSSA9IHByb2R1Y3QgSUQs IFZWID0gbWFqb3IKKwkJCQkgKiB2ZXJzaW9uLCBSUiA9IHJldmlzaW9uIGFuZCBCQiA9IGJ1aWxk CisJCQkJICovCiAKLSAgICAgICAgdTMyIHNtY0Zpcm13YXJlVmVyc2lvbjsgLyogMHhJSVZWUlJC QiB3aGVyZSBJSSA9IHByb2R1Y3QgSUQsIFZWID0gbWFqb3IKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICogdmVyc2lvbiwgUlIgPSByZXZpc2lvbiBhbmQgQkIgPSBidWlsZAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MTYgdHhhX2RvbmU7CQkvKiBPYnNv bGV0ZSBjb21wbGV0aW9uIGZsYWdzICovCisJdTE2IHJ4YV9kb25lOworCXUxNiB0eGJfZG9uZTsK Kwl1MTYgcnhiX2RvbmU7CisJdTE2IHR4Y19kb25lOworCXUxNiByeGNfZG9uZTsKKwl1MTYgdHhk X2RvbmU7CisJdTE2IHJ4ZF9kb25lOwogCi0gICAgICAgIHUxNiB0eGFfZG9uZTsgICAgICAgICAg IC8qIE9ic29sZXRlIGNvbXBsZXRpb24gZmxhZ3MgKi8KLSAgICAgICAgdTE2IHJ4YV9kb25lOwot ICAgICAgICB1MTYgdHhiX2RvbmU7Ci0gICAgICAgIHUxNiByeGJfZG9uZTsKLSAgICAgICAgdTE2 IHR4Y19kb25lOwotICAgICAgICB1MTYgcnhjX2RvbmU7Ci0gICAgICAgIHUxNiB0eGRfZG9uZTsK LSAgICAgICAgdTE2IHJ4ZF9kb25lOworCXUxNiBtYWlsYm94WzRdOwkJLyogRGlhZ25vc3RpY3Mg bWFpbGJveC4gTm90IHVzZWQgKi8KIAotICAgICAgICB1MTYgbWFpbGJveFs0XTsgICAgICAgICAv KiBEaWFnbm9zdGljcyBtYWlsYm94LiBOb3QgdXNlZCAqLworCXN0cnVjdCBjaXJidWZmIGludGVy cnVwdEV2ZW50OwkvKiBpbnRlcnJ1cHQgY2F1c2VzICovCiAKLSAgICAgICAgc3RydWN0IGNpcmJ1 ZmYgaW50ZXJydXB0RXZlbnQ7ICAvKiBpbnRlcnJ1cHQgY2F1c2VzICovCisJdTMyIHYyNElwU3Rz W0ZTVF9NQVhfUE9SVFNdOwkvKiBWLjI0IGNvbnRyb2wgaW5wdXQgc3RhdHVzICovCisJdTMyIHYy NE9wU3RzW0ZTVF9NQVhfUE9SVFNdOwkvKiBWLjI0IGNvbnRyb2wgb3V0cHV0IHN0YXR1cyAqLwog Ci0gICAgICAgIHUzMiB2MjRJcFN0c1tGU1RfTUFYX1BPUlRTXTsgICAgLyogVi4yNCBjb250cm9s IGlucHV0IHN0YXR1cyAqLwotICAgICAgICB1MzIgdjI0T3BTdHNbRlNUX01BWF9QT1JUU107ICAg IC8qIFYuMjQgY29udHJvbCBvdXRwdXQgc3RhdHVzICovCisJc3RydWN0IHBvcnRfY2ZnIHBvcnRD b25maWdbRlNUX01BWF9QT1JUU107CiAKLSAgICAgICAgc3RydWN0IHBvcnRfY2ZnIHBvcnRDb25m aWdbRlNUX01BWF9QT1JUU107CisJdTE2IGNsb2NrU3RhdHVzW0ZTVF9NQVhfUE9SVFNdOwkvKiBs c2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCiAKLSAgICAgICAgdTE2IGNsb2NrU3RhdHVz W0ZTVF9NQVhfUE9SVFNdOyAvKiBsc2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCisJdTE2 IGNhYmxlU3RhdHVzOwkvKiBsc2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCiAKLSAgICAg ICAgdTE2IGNhYmxlU3RhdHVzOyAgICAgICAgICAgICAgICAvKiBsc2I6IDA9PiBwcmVzZW50LCAx PT4gYWJzZW50ICovCisJdTE2IHR4RGVzY3JJbmRleFtGU1RfTUFYX1BPUlRTXTsJLyogdHJhbnNt aXQgZGVzY3JpcHRvciByaW5nIGluZGV4ICovCisJdTE2IHJ4RGVzY3JJbmRleFtGU1RfTUFYX1BP UlRTXTsJLyogcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmcgaW5kZXggKi8KIAotICAgICAgICB1MTYg dHhEZXNjckluZGV4W0ZTVF9NQVhfUE9SVFNdOyAvKiB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcg aW5kZXggKi8KLSAgICAgICAgdTE2IHJ4RGVzY3JJbmRleFtGU1RfTUFYX1BPUlRTXTsgLyogcmVj ZWl2ZSBkZXNjcmlwdG9yIHJpbmcgaW5kZXggKi8KKwl1MTYgcG9ydE1haWxib3hbRlNUX01BWF9Q T1JUU11bMl07CS8qIGNvbW1hbmQsIG1vZGlmaWVyICovCisJdTE2IGNhcmRNYWlsYm94WzRdOwkv KiBOb3QgdXNlZCAqLwogCi0gICAgICAgIHUxNiBwb3J0TWFpbGJveFtGU1RfTUFYX1BPUlRTXVsy XTsgICAgICAvKiBjb21tYW5kLCBtb2RpZmllciAqLwotICAgICAgICB1MTYgY2FyZE1haWxib3hb NF07ICAgICAgICAgICAgICAgICAgICAgLyogTm90IHVzZWQgKi8KKwkvKiBOdW1iZXIgb2YgdGlt ZXMgdGhlIGNhcmQgdGhpbmtzIHRoZSBob3N0IGhhcworCSAqIG1pc3NlZCBhbiBpbnRlcnJ1cHQg Ynkgbm90IGFja25vd2xlZGdpbmcKKwkgKiB3aXRoaW4gMm1TIChJIGd1ZXNzIE5UIGhhcyBwcm9i bGVtcykKKwkgKi8KKwl1MzIgaW50ZXJydXB0UmV0cnlDb3VudDsKIAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdGltZXMgdGhhdCBjYXJkIHRoaW5rcyB0aGUg aG9zdCBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWlzc2VkIGFuIGlu dGVycnVwdCBieSBub3QgYWNrbm93bGVkZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKiB3aXRoaW4gMm1TIChJIGd1ZXNzIE5UIGhhcyBwcm9ibGVtcykKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHUzMiBpbnRlcnJ1cHRSZXRyeUNvdW50 OworCS8qIERyaXZlciBwcml2YXRlIGRhdGEgdXNlZCBhcyBhbiBJRC4gV2UnbGwgbm90CisJICog dXNlIHRoaXMgYXMgSSdkIHJhdGhlciBrZWVwIHN1Y2ggdGhpbmdzCisJICogaW4gbWFpbiBtZW1v cnkgcmF0aGVyIHRoYW4gb24gdGhlIFBDSSBidXMKKwkgKi8KKwl1MzIgcG9ydEhhbmRsZVtGU1Rf TUFYX1BPUlRTXTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEcml2ZXIg cHJpdmF0ZSBkYXRhIHVzZWQgYXMgYW4gSUQuIFdlJ2xsIG5vdAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKiB1c2UgdGhpcyBvbiBMaW51eCBJJ2QgcmF0aGVyIGtlZXAgc3VjaCB0 aGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW4gbWFpbiBtZW1vcnkg cmF0aGVyIHRoYW4gb24gdGhlIFBDSSBidXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICovCi0gICAgICAgIHUzMiBwb3J0SGFuZGxlW0ZTVF9NQVhfUE9SVFNdOworCS8qIENvdW50 IG9mIFR4IHVuZGVyZmxvd3MgZm9yIHN0YXRzICovCisJdTMyIHRyYW5zbWl0QnVmZmVyVW5kZXJm bG93W0ZTVF9NQVhfUE9SVFNdOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q IENvdW50IG9mIFR4IHVuZGVyZmxvd3MgZm9yIHN0YXRzICovCi0gICAgICAgIHUzMiB0cmFuc21p dEJ1ZmZlclVuZGVyZmxvd1tGU1RfTUFYX1BPUlRTXTsKKwkvKiBEZWJvdW5jZWQgVi4yNCBjb250 cm9sIGlucHV0IHN0YXR1cyAqLworCXUzMiB2MjREZWJvdW5jZWRTdHNbRlNUX01BWF9QT1JUU107 CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVib3VuY2VkIFYuMjQgY29u dHJvbCBpbnB1dCBzdGF0dXMgKi8KLSAgICAgICAgdTMyIHYyNERlYm91bmNlZFN0c1tGU1RfTUFY X1BPUlRTXTsKKwkvKiBBZGFwdGVyIGRlYm91bmNlIHRpbWVycy4gRG9uJ3QgdG91Y2ggKi8KKwl1 MzIgY3RzVGltZXJbRlNUX01BWF9QT1JUU107CisJdTMyIGN0c1RpbWVyUnVuW0ZTVF9NQVhfUE9S VFNdOworCXUzMiBkY2RUaW1lcltGU1RfTUFYX1BPUlRTXTsKKwl1MzIgZGNkVGltZXJSdW5bRlNU X01BWF9QT1JUU107CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRhcHRl ciBkZWJvdW5jZSB0aW1lcnMuIERvbid0IHRvdWNoICovCi0gICAgICAgIHUzMiBjdHNUaW1lcltG U1RfTUFYX1BPUlRTXTsKLSAgICAgICAgdTMyIGN0c1RpbWVyUnVuW0ZTVF9NQVhfUE9SVFNdOwot ICAgICAgICB1MzIgZGNkVGltZXJbRlNUX01BWF9QT1JUU107Ci0gICAgICAgIHUzMiBkY2RUaW1l clJ1bltGU1RfTUFYX1BPUlRTXTsKKwl1MzIgbnVtYmVyT2ZQb3J0czsJLyogTnVtYmVyIG9mIHBv cnRzIGRldGVjdGVkIGF0IHN0YXJ0dXAgKi8KIAotICAgICAgICB1MzIgbnVtYmVyT2ZQb3J0czsg ICAgICAvKiBOdW1iZXIgb2YgcG9ydHMgZGV0ZWN0ZWQgYXQgc3RhcnR1cCAqLworCXUxNiBfcmVz ZXJ2ZWRbNjRdOwogCi0gICAgICAgIHUxNiBfcmVzZXJ2ZWRbNjRdOworCXUxNiBjYXJkTW9kZTsJ CS8qIEJpdC1tYXNrIHRvIGVuYWJsZSBmZWF0dXJlczoKKwkJCQkgKiBCaXQgMDogMSBlbmFibGVz IExFRCBpZGVudGlmeSBtb2RlCisJCQkJICovCiAKLSAgICAgICAgdTE2IGNhcmRNb2RlOyAgICAg ICAgICAgLyogQml0LW1hc2sgdG8gZW5hYmxlIGZlYXR1cmVzOgotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKiBCaXQgMDogMSBlbmFibGVzIExFRCBpZGVudGlmeSBtb2RlCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXUxNiBwb3J0U2NoZWR1bGVPZmZzZXQ7 CiAKLSAgICAgICAgdTE2IHBvcnRTY2hlZHVsZU9mZnNldDsKKwlzdHJ1Y3Qgc3VfY29uZmlnIHN1 Q29uZmlnOwkvKiBURTEgQml0cyAqLworCXN0cnVjdCBzdV9zdGF0dXMgc3VTdGF0dXM7CiAKLSAg ICAgICAgdTMyIGVuZE9mU21jU2lnbmF0dXJlOyAgLyogZW5kT2ZTbWNTaWduYXR1cmUgTVVTVCBi ZSB0aGUgbGFzdCBtZW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog dGhlIHN0cnVjdHVyZSBhbmQgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2hhcmVkCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAqIG1lbW9yeS4gQWRhcHRlciBjb2RlIGluaXRpYWxpemVz IGl0cyB2YWx1ZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFTkRfU0lH LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgZW5kT2ZTbWNTaWdu YXR1cmU7CS8qIGVuZE9mU21jU2lnbmF0dXJlIE1VU1QgYmUgdGhlIGxhc3QgbWVtYmVyIG9mCisJ CQkJICogdGhlIHN0cnVjdHVyZSBhbmQgbWFya3MgdGhlIGVuZCBvZiBzaGFyZWQKKwkJCQkgKiBt ZW1vcnkuIEFkYXB0ZXIgY29kZSBpbml0aWFsaXplcyBpdCBhcworCQkJCSAqIEVORF9TSUcuCisJ CQkJICovCiB9OwogCiAvKiBlbmRPZlNtY1NpZ25hdHVyZSB2YWx1ZSAqLwogI2RlZmluZSBFTkRf U0lHICAgICAgICAgICAgICAgICAweDEyMzQ1Njc4CiAKIC8qIE1haWxib3ggdmFsdWVzLiAocG9y dE1haWxib3gpICovCi0jZGVmaW5lIE5PUCAgICAgICAgICAgICAwICAgICAgIC8qIE5vIG9wZXJh dGlvbiAqLwotI2RlZmluZSBBQ0sgICAgICAgICAgICAgMSAgICAgICAvKiBQb3NpdGl2ZSBhY2tu b3dsZWRnZW1lbnQgdG8gUEMgZHJpdmVyICovCi0jZGVmaW5lIE5BSyAgICAgICAgICAgICAyICAg ICAgIC8qIE5lZ2F0aXZlIGFja25vd2xlZGdlbWVudCB0byBQQyBkcml2ZXIgKi8KLSNkZWZpbmUg U1RBUlRQT1JUICAgICAgIDMgICAgICAgLyogU3RhcnQgYW4gSERMQyBwb3J0ICovCi0jZGVmaW5l IFNUT1BQT1JUICAgICAgICA0ICAgICAgIC8qIFN0b3AgYW4gSERMQyBwb3J0ICovCi0jZGVmaW5l IEFCT1JUVFggICAgICAgICA1ICAgICAgIC8qIEFib3J0IHRoZSB0cmFuc21pdHRlciBmb3IgYSBw b3J0ICovCi0jZGVmaW5lIFNFVFYyNE8gICAgICAgICA2ICAgICAgIC8qIFNldCBWMjQgb3V0cHV0 cyAqLworI2RlZmluZSBOT1AgICAgICAgICAgICAgMAkvKiBObyBvcGVyYXRpb24gKi8KKyNkZWZp bmUgQUNLICAgICAgICAgICAgIDEJLyogUG9zaXRpdmUgYWNrbm93bGVkZ2VtZW50IHRvIFBDIGRy aXZlciAqLworI2RlZmluZSBOQUsgICAgICAgICAgICAgMgkvKiBOZWdhdGl2ZSBhY2tub3dsZWRn ZW1lbnQgdG8gUEMgZHJpdmVyICovCisjZGVmaW5lIFNUQVJUUE9SVCAgICAgICAzCS8qIFN0YXJ0 IGFuIEhETEMgcG9ydCAqLworI2RlZmluZSBTVE9QUE9SVCAgICAgICAgNAkvKiBTdG9wIGFuIEhE TEMgcG9ydCAqLworI2RlZmluZSBBQk9SVFRYICAgICAgICAgNQkvKiBBYm9ydCB0aGUgdHJhbnNt aXR0ZXIgZm9yIGEgcG9ydCAqLworI2RlZmluZSBTRVRWMjRPICAgICAgICAgNgkvKiBTZXQgVjI0 IG91dHB1dHMgKi8KKworLyogUExYIENoaXAgUmVnaXN0ZXIgT2Zmc2V0cyAqLworI2RlZmluZSBD TlRSTF85MDUyICAgICAgMHg1MAkvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIENOVFJM XzkwNTQgICAgICAweDZjCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KIAorI2RlZmluZSBJTlRDU1Jf OTA1MiAgICAgMHg0YwkvKiBJbnRlcnJ1cHQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgKi8KKyNk ZWZpbmUgSU5UQ1NSXzkwNTQgICAgIDB4NjgJLyogSW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzIHJl Z2lzdGVyICovCisKKy8qIDkwNTQgRE1BIFJlZ2lzdGVycyAqLworLyoKKyAqIE5vdGUgdGhhdCB3 ZSB3aWxsIGJlIHVzaW5nIERNQSBDaGFubmVsIDAgZm9yIGNvcHlpbmcgcnggZGF0YQorICogYW5k IENoYW5uZWwgMSBmb3IgY29weWluZyB0eCBkYXRhCisgKi8KKyNkZWZpbmUgRE1BTU9ERTAgICAg ICAgIDB4ODAKKyNkZWZpbmUgRE1BUEFEUjAgICAgICAgIDB4ODQKKyNkZWZpbmUgRE1BTEFEUjAg ICAgICAgIDB4ODgKKyNkZWZpbmUgRE1BU0laMCAgICAgICAgIDB4OGMKKyNkZWZpbmUgRE1BRFBS MCAgICAgICAgIDB4OTAKKyNkZWZpbmUgRE1BTU9ERTEgICAgICAgIDB4OTQKKyNkZWZpbmUgRE1B UEFEUjEgICAgICAgIDB4OTgKKyNkZWZpbmUgRE1BTEFEUjEgICAgICAgIDB4OWMKKyNkZWZpbmUg RE1BU0laMSAgICAgICAgIDB4YTAKKyNkZWZpbmUgRE1BRFBSMSAgICAgICAgIDB4YTQKKyNkZWZp bmUgRE1BQ1NSMCAgICAgICAgIDB4YTgKKyNkZWZpbmUgRE1BQ1NSMSAgICAgICAgIDB4YTkKKyNk ZWZpbmUgRE1BQVJCICAgICAgICAgIDB4YWMKKyNkZWZpbmUgRE1BVEhSICAgICAgICAgIDB4YjAK KyNkZWZpbmUgRE1BREFDMCAgICAgICAgIDB4YjQKKyNkZWZpbmUgRE1BREFDMSAgICAgICAgIDB4 YjgKKyNkZWZpbmUgRE1BTUFSQlIgICAgICAgIDB4YWMKKworI2RlZmluZSBGU1RfTUlOX0RNQV9M RU4gNjQKKyNkZWZpbmUgRlNUX1JYX0RNQV9JTlQgIDB4MDEKKyNkZWZpbmUgRlNUX1RYX0RNQV9J TlQgIDB4MDIKKyNkZWZpbmUgRlNUX0NBUkRfSU5UICAgIDB4MDQKIAogLyogTGFyZ2VyIGJ1ZmZl cnMgYXJlIHBvc2l0aW9uZWQgaW4gbWVtb3J5IGF0IG9mZnNldCBCRk1fQkFTRSAqLwogc3RydWN0 IGJ1Zl93aW5kb3cgewotICAgICAgICB1OCB0eEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1fVFhf QlVGRkVSXVtMRU5fVFhfQlVGRkVSXTsKLSAgICAgICAgdTggcnhCdWZmZXJbRlNUX01BWF9QT1JU U11bTlVNX1JYX0JVRkZFUl1bTEVOX1JYX0JVRkZFUl07CisJdTggdHhCdWZmZXJbRlNUX01BWF9Q T1JUU11bTlVNX1RYX0JVRkZFUl1bTEVOX1RYX0JVRkZFUl07CisJdTggcnhCdWZmZXJbRlNUX01B WF9QT1JUU11bTlVNX1JYX0JVRkZFUl1bTEVOX1JYX0JVRkZFUl07CiB9OwogCiAvKiBDYWxjdWxh dGUgb2Zmc2V0IG9mIGEgYnVmZmVyIG9iamVjdCB3aXRoaW4gdGhlIHNoYXJlZCBtZW1vcnkgd2lu ZG93ICovCi0jZGVmaW5lIEJVRl9PRkZTRVQoWCkgICBvZmZzZXRvZihzdHJ1Y3QgYnVmX3dpbmRv dywgWCkKKyNkZWZpbmUgQlVGX09GRlNFVChYKSAgICgodW5zaWduZWQgaW50KSYoKChzdHJ1Y3Qg YnVmX3dpbmRvdyAqKUJGTV9CQVNFKS0+WCkpCiAKICNwcmFnbWEgcGFjaygpCiAKLQogLyogICAg ICBEZXZpY2UgZHJpdmVyIHByaXZhdGUgaW5mb3JtYXRpb24KICAqICAgICAgPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CiAgKi8KIC8qICAgICAgUGVyIHBvcnQgKGxpbmUgb3IgY2hh bm5lbCkgaW5mb3JtYXRpb24KICAqLwogc3RydWN0IGZzdF9wb3J0X2luZm8gewotICAgICAgICBz dHJ1Y3QgbmV0X2RldmljZSAgICAgICpkZXY7Ci0gICAgICAgIHN0cnVjdCBmc3RfY2FyZF9pbmZv ICAgKmNhcmQ7ICAgLyogQ2FyZCB3ZSdyZSBhc3NvY2lhdGVkIHdpdGggKi8KLSAgICAgICAgaW50 ICAgICAgICAgICAgICAgICAgICAgaW5kZXg7ICAvKiBQb3J0IGluZGV4IG9uIHRoZSBjYXJkICov Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIGh3aWY7ICAgLyogTGluZSBoYXJkd2Fy ZSAobGluZUludGVyZmFjZSBjb3B5KSAqLwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAg ICBydW47ICAgIC8qIFBvcnQgaXMgcnVubmluZyAqLwotICAgICAgICBpbnQgICAgICAgICAgICAg ICAgICAgICByeHBvczsgIC8qIE5leHQgUnggYnVmZmVyIHRvIHVzZSAqLwotICAgICAgICBpbnQg ICAgICAgICAgICAgICAgICAgICB0eHBvczsgIC8qIE5leHQgVHggYnVmZmVyIHRvIHVzZSAqLwot ICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0eGlwb3M7IC8qIE5leHQgVHggYnVmZmVy IHRvIGNoZWNrIGZvciBmcmVlICovCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIHR4 Y250OyAgLyogQ291bnQgb2YgVHggYnVmZmVycyBpbiB1c2UgKi8KKyAgICAgICAgc3RydWN0IG5l dF9kZXZpY2UgKmRldjsgLyogRGV2aWNlIHN0cnVjdCAtIG11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1 Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsJLyogQ2FyZCB3ZSdyZSBhc3NvY2lhdGVkIHdpdGggKi8K KwlpbnQgaW5kZXg7CQkvKiBQb3J0IGluZGV4IG9uIHRoZSBjYXJkICovCisJaW50IGh3aWY7CQkv KiBMaW5lIGhhcmR3YXJlIChsaW5lSW50ZXJmYWNlIGNvcHkpICovCisJaW50IHJ1bjsJCS8qIFBv cnQgaXMgcnVubmluZyAqLworCWludCBtb2RlOwkJLyogTm9ybWFsIG9yIEZhclN5bmMgcmF3ICov CisJaW50IHJ4cG9zOwkJLyogTmV4dCBSeCBidWZmZXIgdG8gdXNlICovCisJaW50IHR4cG9zOwkJ LyogTmV4dCBUeCBidWZmZXIgdG8gdXNlICovCisJaW50IHR4aXBvczsJCS8qIE5leHQgVHggYnVm ZmVyIHRvIGNoZWNrIGZvciBmcmVlICovCisJaW50IHN0YXJ0OwkJLyogSW5kaWNhdGlvbiBvZiBz dGFydC9zdG9wIHRvIG5ldHdvcmsgKi8KKwkvKgorCSAqIEEgc2l4dGVlbiBlbnRyeSB0cmFuc21p dCBxdWV1ZQorCSAqLworCWludCB0eHFzOwkJLyogaW5kZXggdG8gZ2V0IG5leHQgYnVmZmVyIHRv IHR4ICovCisJaW50IHR4cWU7CQkvKiBpbmRleCB0byBxdWV1ZSBuZXh0IHBhY2tldCAqLworCXN0 cnVjdCBza19idWZmICp0eHFbRlNUX1RYUV9ERVBUSF07CS8qIFRoZSBxdWV1ZSAqLworCWludCBy eHFkZXB0aDsKIH07CiAKIC8qICAgICAgUGVyIGNhcmQgaW5mb3JtYXRpb24KICAqLwogc3RydWN0 IGZzdF9jYXJkX2luZm8gewotICAgICAgICBjaGFyICAgICAgICAgICptZW07ICAgICAgICAgICAg IC8qIENhcmQgbWVtb3J5IG1hcHBlZCB0byBrZXJuZWwgc3BhY2UgKi8KLSAgICAgICAgY2hhciAg ICAgICAgICAqY3RsbWVtOyAgICAgICAgICAvKiBDb250cm9sIG1lbW9yeSBmb3IgUENJIGNhcmRz ICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIHBoeXNfbWVtOyAgICAgICAgLyogUGh5c2ljYWwg bWVtb3J5IHdpbmRvdyBhZGRyZXNzICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIHBoeXNfY3Rs bWVtOyAgICAgLyogUGh5c2ljYWwgY29udHJvbCBtZW1vcnkgYWRkcmVzcyAqLwotICAgICAgICB1 bnNpZ25lZCBpbnQgICBpcnE7ICAgICAgICAgICAgIC8qIEludGVycnVwdCByZXF1ZXN0IGxpbmUg bnVtYmVyICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIG5wb3J0czsgICAgICAgICAgLyogTnVt YmVyIG9mIHNlcmlhbCBwb3J0cyAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICB0eXBlOyAgICAg ICAgICAgIC8qIFR5cGUgaW5kZXggb2YgY2FyZCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICBz dGF0ZTsgICAgICAgICAgIC8qIFN0YXRlIG9mIGNhcmQgKi8KLSAgICAgICAgc3BpbmxvY2tfdCAg ICAgY2FyZF9sb2NrOyAgICAgICAvKiBMb2NrIGZvciBTTVAgYWNjZXNzICovCi0gICAgICAgIHVu c2lnbmVkIHNob3J0IHBjaV9jb25mOyAgICAgICAgLyogUENJIGNhcmQgY29uZmlnIGluIEkvTyBz cGFjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlciBw b3J0IGluZm8gKi8KLSAgICAgICAgc3RydWN0IGZzdF9wb3J0X2luZm8gcG9ydHNbIEZTVF9NQVhf UE9SVFMgXTsKKwljaGFyICptZW07CQkvKiBDYXJkIG1lbW9yeSBtYXBwZWQgdG8ga2VybmVsIHNw YWNlICovCisJY2hhciAqY3RsbWVtOwkJLyogQ29udHJvbCBtZW1vcnkgZm9yIFBDSSBjYXJkcyAq LworCXVuc2lnbmVkIGludCBwaHlzX21lbTsJLyogUGh5c2ljYWwgbWVtb3J5IHdpbmRvdyBhZGRy ZXNzICovCisJdW5zaWduZWQgaW50IHBoeXNfY3RsbWVtOwkvKiBQaHlzaWNhbCBjb250cm9sIG1l bW9yeSBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGlycTsJLyogSW50ZXJydXB0IHJlcXVlc3Qg bGluZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgbnBvcnRzOwkvKiBOdW1iZXIgb2Ygc2VyaWFs IHBvcnRzICovCisJdW5zaWduZWQgaW50IHR5cGU7CS8qIFR5cGUgaW5kZXggb2YgY2FyZCAqLwor CXVuc2lnbmVkIGludCBzdGF0ZTsJLyogU3RhdGUgb2YgY2FyZCAqLworCXNwaW5sb2NrX3QgY2Fy ZF9sb2NrOwkvKiBMb2NrIGZvciBTTVAgYWNjZXNzICovCisJdW5zaWduZWQgc2hvcnQgcGNpX2Nv bmY7CS8qIFBDSSBjYXJkIGNvbmZpZyBpbiBJL08gc3BhY2UgKi8KKwkvKiBQZXIgcG9ydCBpbmZv ICovCisJc3RydWN0IGZzdF9wb3J0X2luZm8gcG9ydHNbRlNUX01BWF9QT1JUU107CisJc3RydWN0 IHBjaV9kZXYgKmRldmljZTsJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHBjaSBkZXZpY2UgKi8K KwlpbnQgY2FyZF9ubzsJCS8qIEluc3Qgb2YgdGhlIGNhcmQgb24gdGhlIHN5c3RlbSAqLworCWlu dCBmYW1pbHk7CQkvKiBUeFAgb3IgVHhVICovCisJaW50IGRtYXJ4X2luX3Byb2dyZXNzOworCWlu dCBkbWF0eF9pbl9wcm9ncmVzczsKKwl1bnNpZ25lZCBsb25nIGludF9jb3VudDsKKwl1bnNpZ25l ZCBsb25nIGludF90aW1lX2F2ZTsKKwl2b2lkICpyeF9kbWFfaGFuZGxlX2hvc3Q7CisJZG1hX2Fk ZHJfdCByeF9kbWFfaGFuZGxlX2NhcmQ7CisJdm9pZCAqdHhfZG1hX2hhbmRsZV9ob3N0OworCWRt YV9hZGRyX3QgdHhfZG1hX2hhbmRsZV9jYXJkOworCXN0cnVjdCBza19idWZmICpkbWFfc2tiX3J4 OworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpkbWFfcG9ydF9yeDsKKwlzdHJ1Y3QgZnN0X3BvcnRf aW5mbyAqZG1hX3BvcnRfdHg7CisJaW50IGRtYV9sZW5fcng7CisJaW50IGRtYV9sZW5fdHg7CisJ aW50IGRtYV90eHBvczsKKwlpbnQgZG1hX3J4cG9zOwogfTsKIAogLyogQ29udmVydCBhbiBIRExD IGRldmljZSBwb2ludGVyIGludG8gYSBwb3J0IGluZm8gcG9pbnRlciBhbmQgc2ltaWxhciAqLwpA QCAtMzgwLDcgKzQ5OCw2IEBACiAjZGVmaW5lIEZTVF9XUlcoQyxFLFcpICB3cml0ZXcgKChXKSwg KEMpLT5tZW0gKyBXSU5fT0ZGU0VUKEUpKQogI2RlZmluZSBGU1RfV1JMKEMsRSxMKSAgd3JpdGVs ICgoTCksIChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKIAotCiAvKgogICogICAgICBEZWJ1ZyBz dXBwb3J0CiAgKi8KQEAgLTM5OSwzMCArNTE2LDE1MSBAQAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwcmludGsgKCBLRVJOX0RFQlVHIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkK IAogI2Vsc2UKLSMgZGVmaW5lIGRiZyhYLi4uKSAgICAgIC8qIE5PUCAqLworI2RlZmluZSBkYmco WC4uLikJCS8qIE5PUCAqLwogI2VuZGlmCiAKLQogLyogICAgICBQcmludGluZyBzaG9ydCBjdXRz CiAgKi8KICNkZWZpbmUgcHJpbnRrX2VycihmbXQsQS4uLikgICAgcHJpbnRrICggS0VSTl9FUlIg ICAgIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkKICNkZWZpbmUgcHJpbnRrX3dhcm4oZm10LEEu Li4pICAgcHJpbnRrICggS0VSTl9XQVJOSU5HIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkKICNk ZWZpbmUgcHJpbnRrX2luZm8oZm10LEEuLi4pICAgcHJpbnRrICggS0VSTl9JTkZPICAgIEZTVF9O QU1FICI6ICIgZm10LCAjIyBBICkKIAotCiAvKgogICogICAgICBQQ0kgSUQgbG9va3VwIHRhYmxl CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBmc3RfcGNpX2Rldl9pZFtdID0gewot ICAgICAgICB7IEZTQ19QQ0lfVkVORE9SX0lELCBUMlBfUENJX0RFVklDRV9JRCwgUENJX0FOWV9J RCwgUENJX0FOWV9JRCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBGU1RfVFlQRV9UMlAgfSwKLSAgICAgICAgeyBGU0NfUENJX1ZFTkRPUl9JRCwgVDRQX1BD SV9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNUX1RZUEVfVDRQIH0sCi0gICAgICAgIHsgMCwg fSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kICovCitzdGF0aWMgc3RydWN0IHBjaV9k ZXZpY2VfaWQgZnN0X3BjaV9kZXZfaWRbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORE9S X0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMlAsIFBDSV9BTllfSUQsIAorCSBQ Q0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UMlB9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lU RSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1Q0UCwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQs IDAsIDAsIEZTVF9UWVBFX1Q0UH0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVW SUNFX0lEX0ZBUlNJVEVfVDFVLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNU X1RZUEVfVDFVfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFS U0lURV9UMlUsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UMlV9 LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1Q0VSwg UENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1Q0VX0sCisKKwl7UENJ X1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVEUxLCBQQ0lfQU5ZX0lE LCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVEUxfSwKKworCXtQQ0lfVkVORE9SX0lE X0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9URTFDLCBQQ0lfQU5ZX0lELCAKKwkgUENJ X0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVEUxfSwKKwl7MCx9CQkJLyogRW5kICovCiB9OwogCi1N T0RVTEVfREVWSUNFX1RBQkxFICggcGNpLCBmc3RfcGNpX2Rldl9pZCApOworTU9EVUxFX0RFVklD RV9UQUJMRShwY2ksIGZzdF9wY2lfZGV2X2lkKTsKKworLyoKKyAqICAgICAgRGV2aWNlIERyaXZl ciBXb3JrIFF1ZXVlcworICoKKyAqICAgICAgU28gdGhhdCB3ZSBkb24ndCBzcGVuZCB0b28gbXVj aCB0aW1lIHByb2Nlc3NpbmcgZXZlbnRzIGluIHRoZSAKKyAqICAgICAgSW50ZXJydXB0IFNlcnZp Y2Ugcm91dGluZSwgd2Ugd2lsbCBkZWNsYXJlIGEgd29yayBxdWV1ZSBwZXIgQ2FyZCAKKyAqICAg ICAgYW5kIG1ha2UgdGhlIElTUiBzY2hlZHVsZSBhIHRhc2sgaW4gdGhlIHF1ZXVlIGZvciBsYXRl ciBleGVjdXRpb24uCisgKiAgICAgIEluIHRoZSAyLjQgS2VybmVsIHdlIHVzZWQgdG8gdXNlIHRo ZSBpbW1lZGlhdGUgcXVldWUgZm9yIEJIJ3MKKyAqICAgICAgTm93IHRoYXQgdGhleSBhcmUgZ29u ZSwgdGFza2xldHMgc2VlbSB0byBiZSBtdWNoIGJldHRlciB0aGFuIHdvcmsgCisgKiAgICAgIHF1 ZXVlcy4KKyAqLworCitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl90eChzdHJ1Y3QgZnN0X2Nh cmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl9yeChzdHJ1Y3QgZnN0 X2NhcmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBmc3RfcHJvY2Vzc190eF93b3JrX3EodW5z aWduZWQgbG9uZyB3b3JrX3EpOworc3RhdGljIHZvaWQgZnN0X3Byb2Nlc3NfaW50X3dvcmtfcSh1 bnNpZ25lZCBsb25nIHdvcmtfcSk7CisKK0RFQ0xBUkVfVEFTS0xFVChmc3RfdHhfdGFzaywgZnN0 X3Byb2Nlc3NfdHhfd29ya19xLCAwKTsKK0RFQ0xBUkVfVEFTS0xFVChmc3RfaW50X3Rhc2ssIGZz dF9wcm9jZXNzX2ludF93b3JrX3EsIDApOworCitzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqZnN0X2Nh cmRfYXJyYXlbRlNUX01BWF9DQVJEU107CitzcGlubG9ja190IGZzdF93b3JrX3FfbG9jazsKK3U2 NCBmc3Rfd29ya190eHE7Cit1NjQgZnN0X3dvcmtfaW50cTsKKworc3RhdGljIHZvaWQKK2ZzdF9x X3dvcmtfaXRlbSh1NjQgKiBxdWV1ZSwgaW50IGNhcmRfaW5kZXgpCit7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKwl1NjQgbWFzazsKKworCS8qCisJICogR3JhYiB0aGUgcXVldWUgZXhjbHVzaXZl bHkKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7CisK KwkvKgorCSAqIE1ha2luZyBhbiBlbnRyeSBpbiB0aGUgcXVldWUgaXMgc2ltcGx5IGEgbWF0dGVy IG9mIHNldHRpbmcKKwkgKiBhIGJpdCBmb3IgdGhlIGNhcmQgaW5kaWNhdGluZyB0aGF0IHRoZXJl IGlzIHdvcmsgdG8gZG8gaW4gdGhlCisJICogYm90dG9tIGhhbGYgZm9yIHRoZSBjYXJkLiAgTm90 ZSB0aGUgbGltaXRhdGlvbiBvZiA2NCBjYXJkcy4KKwkgKiBUaGF0IG91Z2h0IHRvIGJlIGVub3Vn aAorCSAqLworCW1hc2sgPSAxIDw8IGNhcmRfaW5kZXg7CisJKnF1ZXVlIHw9IG1hc2s7CisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRp YyB2b2lkCitmc3RfcHJvY2Vzc190eF93b3JrX3EodW5zaWduZWQgbG9uZyAvKnZvaWQgKiovd29y a19xKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IHdvcmtfdHhxOworCWludCBpOwor CisJLyoKKwkgKiBHcmFiIHRoZSBxdWV1ZSBleGNsdXNpdmVseQorCSAqLworCWRiZyhEQkdfVFgs ICJmc3RfcHJvY2Vzc190eF93b3JrX3FcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmc3Rfd29y a19xX2xvY2ssIGZsYWdzKTsKKwl3b3JrX3R4cSA9IGZzdF93b3JrX3R4cTsKKwlmc3Rfd29ya190 eHEgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzdF93b3JrX3FfbG9jaywgZmxhZ3Mp OworCisJLyoKKwkgKiBDYWxsIHRoZSBib3R0b20gaGFsZiBmb3IgZWFjaCBjYXJkIHdpdGggd29y ayB3YWl0aW5nCisJICovCisJZm9yIChpID0gMDsgaSA8IEZTVF9NQVhfQ0FSRFM7IGkrKykgewor CQlpZiAod29ya190eHEgJiAweDAxKSB7CisJCQlpZiAoZnN0X2NhcmRfYXJyYXlbaV0gIT0gTlVM TCkgeworCQkJCWRiZyhEQkdfVFgsICJDYWxsaW5nIHR4IGJoIGZvciBjYXJkICVkXG4iLCBpKTsK KwkJCQlkb19ib3R0b21faGFsZl90eChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQl9CisJCX0KKwkJ d29ya190eHEgPSB3b3JrX3R4cSA+PiAxOworCX0KK30KIAorc3RhdGljIHZvaWQKK2ZzdF9wcm9j ZXNzX2ludF93b3JrX3EodW5zaWduZWQgbG9uZyAvKnZvaWQgKiovd29ya19xKQoreworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJdTY0IHdvcmtfaW50cTsKKwlpbnQgaTsKKworCS8qCisJICogR3Jh YiB0aGUgcXVldWUgZXhjbHVzaXZlbHkKKwkgKi8KKwlkYmcoREJHX0lOVFIsICJmc3RfcHJvY2Vz c19pbnRfd29ya19xXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9sb2NrLCBm bGFncyk7CisJd29ya19pbnRxID0gZnN0X3dvcmtfaW50cTsKKwlmc3Rfd29ya19pbnRxID0gMDsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKKworCS8q CisJICogQ2FsbCB0aGUgYm90dG9tIGhhbGYgZm9yIGVhY2ggY2FyZCB3aXRoIHdvcmsgd2FpdGlu ZworCSAqLworCWZvciAoaSA9IDA7IGkgPCBGU1RfTUFYX0NBUkRTOyBpKyspIHsKKwkJaWYgKHdv cmtfaW50cSAmIDB4MDEpIHsKKwkJCWlmIChmc3RfY2FyZF9hcnJheVtpXSAhPSBOVUxMKSB7CisJ CQkJZGJnKERCR19JTlRSLAorCQkJCSAgICAiQ2FsbGluZyByeCAmIHR4IGJoIGZvciBjYXJkICVk XG4iLCBpKTsKKwkJCQlkb19ib3R0b21faGFsZl9yeChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQkJ ZG9fYm90dG9tX2hhbGZfdHgoZnN0X2NhcmRfYXJyYXlbaV0pOworCQkJfQorCQl9CisJCXdvcmtf aW50cSA9IHdvcmtfaW50cSA+PiAxOworCX0KK30KIAogLyogICAgICBDYXJkIGNvbnRyb2wgZnVu Y3Rpb25zCiAgKiAgICAgID09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQzMiwxMDA1ICs2NzAs MTcyNSBAQAogICogVXNlZCB0byBiZSBhIHNpbXBsZSB3cml0ZSB0byBjYXJkIGNvbnRyb2wgc3Bh Y2UgYnV0IGEgZ2xpdGNoIGluIHRoZSBsYXRlc3QKICAqIEFNRCBBbTE4NkNIIHByb2Nlc3NvciBt ZWFucyB0aGF0IHdlIG5vdyBoYXZlIHRvIGRvIGl0IGJ5IGFzc2VydGluZyBhbmQgZGUtCiAgKiBh c3NlcnRpbmcgdGhlIFBMWCBjaGlwIFBDSSBBZGFwdGVyIFNvZnR3YXJlIFJlc2V0LiBCaXQgMzAg aW4gQ05UUkwgcmVnaXN0ZXIKLSAqIGF0IG9mZnNldCAweDUwLgorICogYXQgb2Zmc2V0IDkwNTJf Q05UUkwuICBOb3RlIHRoZSB1cGRhdGVzIGZvciB0aGUgVFhVLgogICovCiBzdGF0aWMgaW5saW5l IHZvaWQKLWZzdF9jcHVyZXNldCAoIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkICkKK2ZzdF9j cHVyZXNldChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKIHsKLSAgICAgICAgdW5zaWduZWQg aW50IHJlZ3ZhbDsKKwl1bnNpZ25lZCBjaGFyIGludGVycnVwdF9saW5lX3JlZ2lzdGVyOworCXVu c2lnbmVkIGxvbmcgaiA9IGppZmZpZXMgKyAxOworCXVuc2lnbmVkIGludCByZWd2YWw7CisKKwlp ZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCWlmIChwY2lfcmVhZF9jb25m aWdfYnl0ZQorCQkgICAgKGNhcmQtPmRldmljZSwgUENJX0lOVEVSUlVQVF9MSU5FLCAmaW50ZXJy dXB0X2xpbmVfcmVnaXN0ZXIpKSB7CisJCQlkYmcoREJHX0FTUywKKwkJCSAgICAiRXJyb3IgaW4g cmVhZGluZyBpbnRlcnJ1cHQgbGluZSByZWdpc3RlclxuIik7CisJCX0KKwkJLyoKKwkJICogQXNz ZXJ0IFBMWCBzb2Z0d2FyZSByZXNldCBhbmQgQW0xODYgaGFyZHdhcmUgcmVzZXQKKwkJICogYW5k IHRoZW4gZGVhc3NlcnQgdGhlIFBMWCBzb2Z0d2FyZSByZXNldCBidXQgMTg2IHN0aWxsIGluIHJl c2V0CisJCSAqLworCQlvdXR3KDB4NDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsg Mik7CisJCW91dHcoMHgwNDBmLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsKKwkJ LyoKKwkJICogV2UgYXJlIGRlbGF5aW5nIGhlcmUgdG8gYWxsb3cgdGhlIDkwNTQgdG8gcmVzZXQg aXRzZWxmCisJCSAqLworCQlqID0gamlmZmllcyArIDE7CisJCXdoaWxlIChqaWZmaWVzIDwgaikK KwkJCS8qIERvIG5vdGhpbmcgKi8gOworCQlvdXR3KDB4MjQwZiwgY2FyZC0+cGNpX2NvbmYgKyBD TlRSTF85MDU0ICsgMik7CisJCS8qCisJCSAqIFdlIGFyZSBkZWxheWluZyBoZXJlIHRvIGFsbG93 IHRoZSA5MDU0IHRvIHJlbG9hZCBpdHMgZWVwcm9tCisJCSAqLworCQlqID0gamlmZmllcyArIDE7 CisJCXdoaWxlIChqaWZmaWVzIDwgaikKKwkJCS8qIERvIG5vdGhpbmcgKi8gOworCQlvdXR3KDB4 MDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisKKwkJaWYgKHBjaV93cml0 ZV9jb25maWdfYnl0ZQorCQkgICAgKGNhcmQtPmRldmljZSwgUENJX0lOVEVSUlVQVF9MSU5FLCBp bnRlcnJ1cHRfbGluZV9yZWdpc3RlcikpIHsKKwkJCWRiZyhEQkdfQVNTLAorCQkJICAgICJFcnJv ciBpbiB3cml0aW5nIGludGVycnVwdCBsaW5lIHJlZ2lzdGVyXG4iKTsKKwkJfQogCi0gICAgICAg IHJlZ3ZhbCA9IGlubCAoIGNhcmQtPnBjaV9jb25mICsgMHg1MCApOworCX0gZWxzZSB7CisJCXJl Z3ZhbCA9IGlubChjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTIpOwogCi0gICAgICAgIG91dGwg KCByZWd2YWwgfCAgMHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyAweDUwICk7Ci0gICAgICAg IG91dGwgKCByZWd2YWwgJiB+MHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyAweDUwICk7CisJ CW91dGwocmVndmFsIHwgMHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUyKTsK KwkJb3V0bChyZWd2YWwgJiB+MHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUy KTsKKwl9CiB9CiAKIC8qICAgICAgUmVsZWFzZSB0aGUgcHJvY2Vzc29yIGZyb20gcmVzZXQKICAq Lwogc3RhdGljIGlubGluZSB2b2lkCi1mc3RfY3B1cmVsZWFzZSAoIHN0cnVjdCBmc3RfY2FyZF9p bmZvICpjYXJkICkKK2ZzdF9jcHVyZWxlYXNlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQog ewotICAgICAgICAodm9pZCkgcmVhZGIgKCBjYXJkLT5jdGxtZW0gKTsKKwlpZiAoY2FyZC0+ZmFt aWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCS8qCisJCSAqIEZvcmNlIHBvc3RlZCB3cml0ZXMg dG8gY29tcGxldGUKKwkJICovCisJCSh2b2lkKSByZWFkYihjYXJkLT5tZW0pOworCisJCS8qCisJ CSAqIFJlbGVhc2UgTFJFU0VUIERPID0gMQorCQkgKiBUaGVuIHJlbGVhc2UgTG9jYWwgSG9sZCwg RE8gPSAxCisJCSAqLworCQlvdXR3KDB4MDQwZSwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0 ICsgMik7CisJCW91dHcoMHgwNDBmLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsK Kwl9IGVsc2UgeworCQkodm9pZCkgcmVhZGIoY2FyZC0+Y3RsbWVtKTsKKwl9CiB9CiAKIC8qICAg ICAgQ2xlYXIgdGhlIGNhcmRzIGludGVycnVwdCBmbGFnCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9p ZAotZnN0X2NsZWFyX2ludHIgKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCApCitmc3RfY2xl YXJfaW50cihzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+ZmFtaWx5 ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCSh2b2lkKSByZWFkYihjYXJkLT5jdGxtZW0pOworCX0g ZWxzZSB7CisJCS8qIFBva2UgdGhlIGFwcHJvcHJpYXRlIFBMWCBjaGlwIHJlZ2lzdGVyIChzYW1l IGFzIGVuYWJsaW5nIGludGVycnVwdHMpCisJCSAqLworCQlvdXR3KDB4MDU0MywgY2FyZC0+cGNp X2NvbmYgKyBJTlRDU1JfOTA1Mik7CisJfQorfQorCisvKiAgICAgIEVuYWJsZSBjYXJkIGludGVy cnVwdHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfZW5hYmxlX2ludHIoc3RydWN0IGZz dF9jYXJkX2luZm8gKmNhcmQpCiB7Ci0gICAgICAgIC8qIFBva2UgdGhlIGFwcHJvcHJpYXRlIFBM WCBjaGlwIHJlZ2lzdGVyIChzYW1lIGFzIGVuYWJsaW5nIGludGVycnVwdHMpCi0gICAgICAgICAq LwotICAgICAgICBvdXR3ICggMHgwNTQzLCBjYXJkLT5wY2lfY29uZiArIDB4NEMgKTsKKwlpZiAo Y2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCW91dGwoMHgwZjBjMDkwMCwgY2Fy ZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1NCk7CisJfSBlbHNlIHsKKwkJb3V0dygweDA1NDMsIGNh cmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTIpOworCX0KIH0KIAogLyogICAgICBEaXNhYmxlIGNh cmQgaW50ZXJydXB0cwogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWZzdF9kaXNhYmxlX2ludHIg KCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCApCitmc3RfZGlzYWJsZV9pbnRyKHN0cnVjdCBm c3RfY2FyZF9pbmZvICpjYXJkKQoreworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9U WFUpIHsKKwkJb3V0bCgweDAwMDAwMDAwLCBjYXJkLT5wY2lfY29uZiArIElOVENTUl85MDU0KTsK Kwl9IGVsc2UgeworCQlvdXR3KDB4MDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1Mik7 CisJfQorfQorCisvKiAgICAgIFByb2Nlc3MgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gcGFzcyBh IHJlY2lldmVkIGZyYW1lIHVwIHRoZSBzdGFjaworICovCitzdGF0aWMgdm9pZAorZnN0X3Byb2Nl c3Nfcnhfc3RhdHVzKGludCByeF9zdGF0dXMsIGNoYXIgKm5hbWUpCiB7Ci0gICAgICAgIG91dHcg KCAweDAwMDAsIGNhcmQtPnBjaV9jb25mICsgMHg0QyApOworCXN3aXRjaCAocnhfc3RhdHVzKSB7 CisJY2FzZSBORVRfUlhfU1VDQ0VTUzoKKwkJeworCQkJLyoKKwkJCSAqIE5vdGhpbmcgdG8gZG8g aGVyZQorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fTE9XOgorCQl7 CisJCQlkYmcoREJHX0FTUywgIiVzOiBSZWNlaXZlIExvdyBDb25nZXN0aW9uXG4iLCBuYW1lKTsK KwkJCWJyZWFrOworCQl9CisKKwljYXNlIE5FVF9SWF9DTl9NT0Q6CisJCXsKKwkJCWRiZyhEQkdf QVNTLCAiJXM6IFJlY2VpdmUgTW9kZXJhdGUgQ29uZ2VzdGlvblxuIiwgbmFtZSk7CisJCQlicmVh azsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fSElHSDoKKwkJeworCQkJZGJnKERCR19BU1MsICIl czogUmVjZWl2ZSBIaWdoIENvbmdlc3Rpb25cbiIsIG5hbWUpOworCQkJYnJlYWs7CisJCX0KKwor CWNhc2UgTkVUX1JYX0RST1A6CisJCXsKKwkJCWRiZyhEQkdfQVNTLCAiJXM6IFJlY2VpdmVkIHBh Y2tldCBkcm9wcGVkXG4iLCBuYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQogfQogCisvKiAgICAg IEluaXRpbGFpc2UgRE1BIGZvciBQTFggOTA1NAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2Zz dF9pbml0X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwkvKgorCSAqIFRoaXMg aXMgb25seSByZXF1aXJlZCBmb3IgdGhlIFBMWCA5MDU0CisJICovCisJaWYgKGNhcmQtPmZhbWls eSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCSAgICAgICAgcGNpX3NldF9tYXN0ZXIoY2FyZC0+ZGV2 aWNlKTsKKwkJb3V0bCgweDAwMDIwNDQxLCBjYXJkLT5wY2lfY29uZiArIERNQU1PREUwKTsKKwkJ b3V0bCgweDAwMDIwNDQxLCBjYXJkLT5wY2lfY29uZiArIERNQU1PREUxKTsKKwkJb3V0bCgweDAs IGNhcmQtPnBjaV9jb25mICsgRE1BVEhSKTsKKwl9Cit9CisKKy8qICAgICAgVHggZG1hIGNvbXBs ZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X3R4X2RtYV9jb21wbGV0ZShzdHJ1 Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAg ICBpbnQgbGVuLCBpbnQgdHhwb3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRf dG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3Rh dHMoZGV2KTsKKworCS8qCisJICogRXZlcnl0aGluZyBpcyBub3cgc2V0LCBqdXN0IHRlbGwgdGhl IGNhcmQgdG8gZ28KKwkgKi8KKwlkYmcoREJHX1RYLCAiZnN0X3R4X2RtYV9jb21wbGV0ZVxuIik7 CisJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twb3J0LT5pbmRleF1bdHhwb3NdLmJpdHMsCisJ CURNQV9PV04gfCBUWF9TVFAgfCBUWF9FTlApOworCXN0YXRzLT50eF9wYWNrZXRzKys7CisJc3Rh dHMtPnR4X2J5dGVzICs9IGxlbjsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKK30KKwor LyogICAgICBSeCBkbWEgY29tcGxldGUgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkCitmc3Rf cnhfZG1hX2NvbXBsZXRlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydCwKKwkJICAgIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IsIGludCBy eHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0 cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlpbnQgcGk7 CisJaW50IHJ4X3N0YXR1czsKKworCWRiZyhEQkdfVFgsICJmc3RfcnhfZG1hX2NvbXBsZXRlXG4i KTsKKwlwaSA9IHBvcnQtPmluZGV4OworCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgY2FyZC0+ cnhfZG1hX2hhbmRsZV9ob3N0LCBsZW4pOworCisJLyogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3Ig Ki8KKwlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOwor CisJLyogVXBkYXRlIHN0YXRzICovCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhf Ynl0ZXMgKz0gbGVuOworCisJLyogUHVzaCB1cHN0cmVhbSAqLworCWRiZyhEQkdfUlgsICJQdXNo aW5nIHRoZSBmcmFtZSB1cCB0aGUgc3RhY2tcbiIpOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0 YTsKKwlza2ItPmRldiA9IGRldjsKKwlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKSB7CisJCS8q CisJCSAqIE1hcmsgaXQgZm9yIG91ciBvd24gcmF3IHNvY2tldHMgaW50ZXJmYWNlCisJCSAqLwor CQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQ1VTVCk7CisJCXNrYi0+cGt0X3R5cGUgPSBQ QUNLRVRfSE9TVDsKKwl9IGVsc2UgeworCQlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5z KHNrYiwgc2tiLT5kZXYpOworCX0KKwlyeF9zdGF0dXMgPSBuZXRpZl9yeChza2IpOworCWZzdF9w cm9jZXNzX3J4X3N0YXR1cyhyeF9zdGF0dXMsIHBvcnRfdG9fZGV2KHBvcnQpLT5uYW1lKTsKKwlp ZiAocnhfc3RhdHVzID09IE5FVF9SWF9EUk9QKQorCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCWRl di0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKKy8qCisgKiAgICAgIFJlY2VpdmUgYSBmcmFtZSB0 aHJvdWdoIHRoZSBETUEKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfcnhfZG1hKHN0cnVj dCBmc3RfY2FyZF9pbmZvICpjYXJkLCB1bnNpZ25lZCBjaGFyICpza2IsCisJICAgdW5zaWduZWQg Y2hhciAqbWVtLCBpbnQgbGVuKQoreworCS8qCisJICogVGhpcyByb3V0aW5lIHdpbGwgc2V0dXAg dGhlIERNQSBhbmQgc3RhcnQgaXQKKwkgKi8KKworCWRiZyhEQkdfUlgsICJJbiBmc3RfcnhfZG1h ICVwICVwICVkXG4iLCBza2IsIG1lbSwgbGVuKTsKKwlpZiAoY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jl c3MpIHsKKwkJZGJnKERCR19BU1MsICJJbiBmc3RfcnhfZG1hIHdoaWxlIGRtYSBpbiBwcm9ncmVz c1xuIik7CisJfQorCisJb3V0bCgodW5zaWduZWQgbG9uZykgc2tiLCBjYXJkLT5wY2lfY29uZiAr IERNQVBBRFIwKTsJLyogQ29weSB0byBoZXJlICovCisJb3V0bCgodW5zaWduZWQgbG9uZykgbWVt LCBjYXJkLT5wY2lfY29uZiArIERNQUxBRFIwKTsJLyogZnJvbSBoZXJlICovCisJb3V0bChsZW4s IGNhcmQtPnBjaV9jb25mICsgRE1BU0laMCk7CS8qIGZvciB0aGlzIGxlbmd0aCAqLworCW91dGwo MHgwMDAwMDAwMGMsIGNhcmQtPnBjaV9jb25mICsgRE1BRFBSMCk7CS8qIEluIHRoaXMgZGlyZWN0 aW9uICovCisKKwkvKgorCSAqIFdlIHVzZSB0aGUgZG1hcnhfaW5fcHJvZ3Jlc3MgZmxhZyB0byBm bGFnIHRoZSBjaGFubmVsIGFzIGJ1c3kKKwkgKi8KKwljYXJkLT5kbWFyeF9pbl9wcm9ncmVzcyA9 IDE7CisJb3V0YigweDAzLCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjApOwkvKiBTdGFydCB0aGUg dHJhbnNmZXIgKi8KK30KKworLyoKKyAqICAgICAgU2VuZCBhIGZyYW1lIHRocm91Z2ggdGhlIERN QQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF90eF9kbWEoc3RydWN0IGZzdF9jYXJkX2lu Zm8gKmNhcmQsIHVuc2lnbmVkIGNoYXIgKnNrYiwKKwkgICB1bnNpZ25lZCBjaGFyICptZW0sIGlu dCBsZW4pCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgd2lsbCBzZXR1cCB0aGUgRE1BIGFuZCBz dGFydCBpdC4KKwkgKi8KKworCWRiZyhEQkdfVFgsICJJbiBmc3RfdHhfZG1hICVwICVwICVkXG4i LCBza2IsIG1lbSwgbGVuKTsKKwlpZiAoY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MpIHsKKwkJZGJn KERCR19BU1MsICJJbiBmc3RfdHhfZG1hIHdoaWxlIGRtYSBpbiBwcm9ncmVzc1xuIik7CisJfQor CisJb3V0bCgodW5zaWduZWQgbG9uZykgc2tiLCBjYXJkLT5wY2lfY29uZiArIERNQVBBRFIxKTsJ LyogQ29weSBmcm9tIGhlcmUgKi8KKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBtZW0sIGNhcmQtPnBj aV9jb25mICsgRE1BTEFEUjEpOwkvKiB0byBoZXJlICovCisJb3V0bChsZW4sIGNhcmQtPnBjaV9j b25mICsgRE1BU0laMSk7CS8qIGZvciB0aGlzIGxlbmd0aCAqLworCW91dGwoMHgwMDAwMDAwMDQs IGNhcmQtPnBjaV9jb25mICsgRE1BRFBSMSk7CS8qIEluIHRoaXMgZGlyZWN0aW9uICovCisKKwkv KgorCSAqIFdlIHVzZSB0aGUgZG1hdHhfaW5fcHJvZ3Jlc3MgdG8gZmxhZyB0aGUgY2hhbm5lbCBh cyBidXN5CisJICovCisJY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MgPSAxOworCW91dGIoMHgwMywg Y2FyZC0+cGNpX2NvbmYgKyBETUFDU1IxKTsJLyogU3RhcnQgdGhlIHRyYW5zZmVyICovCit9CiAK IC8qICAgICAgSXNzdWUgYSBNYWlsYm94IGNvbW1hbmQgZm9yIGEgcG9ydC4KICAqICAgICAgTm90 ZSB3ZSBpc3N1ZSB0aGVtIG9uIGEgZmlyZSBhbmQgZm9yZ2V0IGJhc2lzLCBub3QgZXhwZWN0aW5n IHRvIHNlZSBhbgogICogICAgICBlcnJvciBhbmQgbm90IHdhaXRpbmcgZm9yIGNvbXBsZXRpb24u CiAgKi8KIHN0YXRpYyB2b2lkCi1mc3RfaXNzdWVfY21kICggc3RydWN0IGZzdF9wb3J0X2luZm8g KnBvcnQsIHVuc2lnbmVkIHNob3J0IGNtZCApCitmc3RfaXNzdWVfY21kKHN0cnVjdCBmc3RfcG9y dF9pbmZvICpwb3J0LCB1bnNpZ25lZCBzaG9ydCBjbWQpCiB7Ci0gICAgICAgIHN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBtYnZhbDsKLSAgICAgICAg dW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgaW50IHNhZmV0eTsKLQotICAgICAgICBjYXJk ID0gcG9ydC0+Y2FyZDsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUgKCAmY2FyZC0+Y2FyZF9s b2NrLCBmbGFncyApOwotICAgICAgICBtYnZhbCA9IEZTVF9SRFcgKCBjYXJkLCBwb3J0TWFpbGJv eFtwb3J0LT5pbmRleF1bMF0pOwotCi0gICAgICAgIHNhZmV0eSA9IDA7Ci0gICAgICAgIC8qIFdh aXQgZm9yIGFueSBwcmV2aW91cyBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0gICAgICAgIHdoaWxl ICggbWJ2YWwgPiBOQUsgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0gICAgICAgICAgICAgICAg c2NoZWR1bGVfdGltZW91dCAoIDEgKTsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2 ZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoICsr c2FmZXR5ID4gMTAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAg ICAgcHJpbnRrX2VyciAoIk1haWxib3ggc2FmZXR5IHRpbWVvdXRcbiIpOwotICAgICAgICAgICAg ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorCXN0cnVjdCBmc3RfY2FyZF9p bmZvICpjYXJkOworCXVuc2lnbmVkIHNob3J0IG1idmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisJaW50IHNhZmV0eTsKKworCWNhcmQgPSBwb3J0LT5jYXJkOworCXNwaW5fbG9ja19pcnFzYXZl KCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwltYnZhbCA9IEZTVF9SRFcoY2FyZCwgcG9ydE1h aWxib3hbcG9ydC0+aW5kZXhdWzBdKTsKKworCXNhZmV0eSA9IDA7CisJLyogV2FpdCBmb3IgYW55 IHByZXZpb3VzIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAobWJ2YWwgPiBOQUspIHsK KwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCXNj aGVkdWxlX3RpbWVvdXQoMSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ss IGZsYWdzKTsKKworCQlpZiAoKytzYWZldHkgPiAyMDAwKSB7CisJCQlwcmludGtfZXJyKCJNYWls Ym94IHNhZmV0eSB0aW1lb3V0XG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWJ2YWwgPSBGU1Rf UkRXKGNhcmQsIHBvcnRNYWlsYm94W3BvcnQtPmluZGV4XVswXSk7CisJfQorCWlmIChzYWZldHkg PiAwKSB7CisJCWRiZyhEQkdfQ01ELCAiTWFpbGJveCBjbGVhciBhZnRlciAlZCBqaWZmaWVzXG4i LCBzYWZldHkpOworCX0KKwlpZiAobWJ2YWwgPT0gTkFLKSB7CisJCWRiZyhEQkdfQ01ELCAiaXNz dWVfY21kOiBwcmV2aW91cyBjb21tYW5kIHdhcyBOQUsnZFxuIik7CisJfQogCi0gICAgICAgICAg ICAgICAgbWJ2YWwgPSBGU1RfUkRXICggY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhdWzBd KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHNhZmV0eSA+IDAgKQotICAgICAgICB7Ci0gICAg ICAgICAgICAgICAgZGJnICggREJHX0NNRCwiTWFpbGJveCBjbGVhciBhZnRlciAlZCBqaWZmaWVz XG4iLCBzYWZldHkgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIG1idmFsID09IE5BSyApCi0g ICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfQ01ELCJpc3N1ZV9jbWQ6IHByZXZp b3VzIGNvbW1hbmQgd2FzIE5BSydkXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZTVF9XUlcg KCBjYXJkLCBwb3J0TWFpbGJveFtwb3J0LT5pbmRleF1bMF0sIGNtZCApOwotCi0gICAgICAgIGlm ICggY21kID09IEFCT1JUVFggfHwgY21kID09IFNUQVJUUE9SVCApCi0gICAgICAgIHsKLSAgICAg ICAgICAgICAgICBwb3J0LT50eHBvcyAgPSAwOwotICAgICAgICAgICAgICAgIHBvcnQtPnR4aXBv cyA9IDA7Ci0gICAgICAgICAgICAgICAgcG9ydC0+dHhjbnQgID0gMDsKLSAgICAgICAgfQorCUZT VF9XUlcoY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhdWzBdLCBjbWQpOwogCi0gICAgICAg IHNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCAmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyApOwotfQor CWlmIChjbWQgPT0gQUJPUlRUWCB8fCBjbWQgPT0gU1RBUlRQT1JUKSB7CisJCXBvcnQtPnR4cG9z ID0gMDsKKwkJcG9ydC0+dHhpcG9zID0gMDsKKwkJcG9ydC0+c3RhcnQgPSAwOworCX0KIAorCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworfQogCiAvKiAg ICAgIFBvcnQgb3V0cHV0IHNpZ25hbHMgY29udHJvbAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQK LWZzdF9vcF9yYWlzZSAoIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LCB1bnNpZ25lZCBpbnQg b3V0cHV0cyApCitmc3Rfb3BfcmFpc2Uoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsIHVuc2ln bmVkIGludCBvdXRwdXRzKQogewotICAgICAgICBvdXRwdXRzIHw9IEZTVF9SREwgKCBwb3J0LT5j YXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0pOwotICAgICAgICBGU1RfV1JMICggcG9ydC0+Y2Fy ZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdLCBvdXRwdXRzICk7CisJb3V0cHV0cyB8PSBGU1RfUkRM KHBvcnQtPmNhcmQsIHYyNE9wU3RzW3BvcnQtPmluZGV4XSk7CisJRlNUX1dSTChwb3J0LT5jYXJk LCB2MjRPcFN0c1twb3J0LT5pbmRleF0sIG91dHB1dHMpOwogCi0gICAgICAgIGlmICggcG9ydC0+ cnVuICkKLSAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9ydCwgU0VUVjI0TyApOwor CWlmIChwb3J0LT5ydW4pCisJCWZzdF9pc3N1ZV9jbWQocG9ydCwgU0VUVjI0Tyk7CiB9CiAKIHN0 YXRpYyBpbmxpbmUgdm9pZAotZnN0X29wX2xvd2VyICggc3RydWN0IGZzdF9wb3J0X2luZm8gKnBv cnQsIHVuc2lnbmVkIGludCBvdXRwdXRzICkKK2ZzdF9vcF9sb3dlcihzdHJ1Y3QgZnN0X3BvcnRf aW5mbyAqcG9ydCwgdW5zaWduZWQgaW50IG91dHB1dHMpCiB7Ci0gICAgICAgIG91dHB1dHMgPSB+ b3V0cHV0cyAmIEZTVF9SREwgKCBwb3J0LT5jYXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0pOwot ICAgICAgICBGU1RfV1JMICggcG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdLCBvdXRw dXRzICk7CisJb3V0cHV0cyA9IH5vdXRwdXRzICYgRlNUX1JETChwb3J0LT5jYXJkLCB2MjRPcFN0 c1twb3J0LT5pbmRleF0pOworCUZTVF9XUkwocG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5k ZXhdLCBvdXRwdXRzKTsKIAotICAgICAgICBpZiAoIHBvcnQtPnJ1biApCi0gICAgICAgICAgICAg ICAgZnN0X2lzc3VlX2NtZCAoIHBvcnQsIFNFVFYyNE8gKTsKKwlpZiAocG9ydC0+cnVuKQorCQlm c3RfaXNzdWVfY21kKHBvcnQsIFNFVFYyNE8pOwogfQogCi0KIC8qCiAgKiAgICAgIFNldHVwIHBv cnQgUnggYnVmZmVycwogICovCiBzdGF0aWMgdm9pZAotZnN0X3J4X2NvbmZpZyAoIHN0cnVjdCBm c3RfcG9ydF9pbmZvICpwb3J0ICkKK2ZzdF9yeF9jb25maWcoc3RydWN0IGZzdF9wb3J0X2luZm8g KnBvcnQpCiB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgcGk7Ci0gICAgICAgIHVuc2ln bmVkIGludCBvZmZzZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHN0 cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwotCi0gICAgICAgIHBpICAgPSBwb3J0LT5pbmRleDsK LSAgICAgICAgY2FyZCA9IHBvcnQtPmNhcmQ7Ci0gICAgICAgIHNwaW5fbG9ja19pcnFzYXZlICgg JmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MgKTsKLSAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgTlVN X1JYX0JVRkZFUiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBC VUZfT0ZGU0VUICggcnhCdWZmZXJbcGldW2ldWzBdKTsKLQotICAgICAgICAgICAgICAgIEZTVF9X UlcgKCBjYXJkLCByeERlc2NyUmluZ1twaV1baV0ubGFkciwgKHUxNikgb2Zmc2V0ICk7Ci0gICAg ICAgICAgICAgICAgRlNUX1dSQiAoIGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtpXS5oYWRyLCAodTgp KCBvZmZzZXQgPj4gMTYgKSk7Ci0gICAgICAgICAgICAgICAgRlNUX1dSVyAoIGNhcmQsIHJ4RGVz Y3JSaW5nW3BpXVtpXS5iY250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNudl9iY250ICggTEVOX1JYX0JVRkZFUiApKTsKLSAgICAgICAgICAgICAgICBGU1RfV1JX ICggY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLm1jbnQsIDAgKTsKLSAgICAgICAgICAgICAgICBG U1RfV1JCICggY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLmJpdHMsIERNQV9PV04gKTsKLSAgICAg ICAgfQotICAgICAgICBwb3J0LT5yeHBvcyAgPSAwOwotICAgICAgICBzcGluX3VubG9ja19pcnFy ZXN0b3JlICggJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MgKTsKKwlpbnQgaTsKKwlpbnQgcGk7CisJ dW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwljYXJkID0gcG9ydC0+Y2Fy ZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChp ID0gMDsgaSA8IE5VTV9SWF9CVUZGRVI7IGkrKykgeworCQlvZmZzZXQgPSBCVUZfT0ZGU0VUKHJ4 QnVmZmVyW3BpXVtpXVswXSk7CisKKwkJRlNUX1dSVyhjYXJkLCByeERlc2NyUmluZ1twaV1baV0u bGFkciwgKHUxNikgb2Zmc2V0KTsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1baV0u aGFkciwgKHU4KSAob2Zmc2V0ID4+IDE2KSk7CisJCUZTVF9XUlcoY2FyZCwgcnhEZXNjclJpbmdb cGldW2ldLmJjbnQsIGNudl9iY250KExFTl9SWF9CVUZGRVIpKTsKKwkJRlNUX1dSVyhjYXJkLCBy eERlc2NyUmluZ1twaV1baV0ubWNudCwgTEVOX1JYX0JVRkZFUik7CisJCUZTVF9XUkIoY2FyZCwg cnhEZXNjclJpbmdbcGldW2ldLmJpdHMsIERNQV9PV04pOworCX0KKwlwb3J0LT5yeHBvcyA9IDA7 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiB9CiAK LQogLyoKICAqICAgICAgU2V0dXAgcG9ydCBUeCBidWZmZXJzCiAgKi8KIHN0YXRpYyB2b2lkCi1m c3RfdHhfY29uZmlnICggc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQgKQorZnN0X3R4X2NvbmZp ZyhzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAg IGludCBwaTsKLSAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgICAgICAgdW5zaWduZWQg bG9uZyBmbGFnczsKLSAgICAgICAgc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7Ci0KLSAgICAg ICAgcGkgICA9IHBvcnQtPmluZGV4OwotICAgICAgICBjYXJkID0gcG9ydC0+Y2FyZDsKLSAgICAg ICAgc3Bpbl9sb2NrX2lycXNhdmUgKCAmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyApOwotICAgICAg ICBmb3IgKCBpID0gMCA7IGkgPCBOVU1fVFhfQlVGRkVSIDsgaSsrICkKLSAgICAgICAgewotICAg ICAgICAgICAgICAgIG9mZnNldCA9IEJVRl9PRkZTRVQgKCB0eEJ1ZmZlcltwaV1baV1bMF0pOwot Ci0gICAgICAgICAgICAgICAgRlNUX1dSVyAoIGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtpXS5sYWRy LCAodTE2KSBvZmZzZXQgKTsKLSAgICAgICAgICAgICAgICBGU1RfV1JCICggY2FyZCwgdHhEZXNj clJpbmdbcGldW2ldLmhhZHIsICh1OCkoIG9mZnNldCA+PiAxNiApKTsKLSAgICAgICAgICAgICAg ICBGU1RfV1JXICggY2FyZCwgdHhEZXNjclJpbmdbcGldW2ldLmJjbnQsIDAgKTsKLSAgICAgICAg ICAgICAgICBGU1RfV1JCICggY2FyZCwgdHhEZXNjclJpbmdbcGldW2ldLmJpdHMsIDAgKTsKLSAg ICAgICAgfQotICAgICAgICBwb3J0LT50eHBvcyAgPSAwOwotICAgICAgICBwb3J0LT50eGlwb3Mg PSAwOwotICAgICAgICBwb3J0LT50eGNudCAgPSAwOwotICAgICAgICBzcGluX3VubG9ja19pcnFy ZXN0b3JlICggJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MgKTsKKwlpbnQgaTsKKwlpbnQgcGk7CisJ dW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwljYXJkID0gcG9ydC0+Y2Fy ZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChp ID0gMDsgaSA8IE5VTV9UWF9CVUZGRVI7IGkrKykgeworCQlvZmZzZXQgPSBCVUZfT0ZGU0VUKHR4 QnVmZmVyW3BpXVtpXVswXSk7CisKKwkJRlNUX1dSVyhjYXJkLCB0eERlc2NyUmluZ1twaV1baV0u bGFkciwgKHUxNikgb2Zmc2V0KTsKKwkJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twaV1baV0u aGFkciwgKHU4KSAob2Zmc2V0ID4+IDE2KSk7CisJCUZTVF9XUlcoY2FyZCwgdHhEZXNjclJpbmdb cGldW2ldLmJjbnQsIDApOworCQlGU1RfV1JCKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtpXS5iaXRz LCAwKTsKKwl9CisJcG9ydC0+dHhwb3MgPSAwOworCXBvcnQtPnR4aXBvcyA9IDA7CisJcG9ydC0+ c3RhcnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxh Z3MpOwogfQogCisvKiAgICAgIFRFMSBBbGFybSBjaGFuZ2UgaW50ZXJydXB0IGV2ZW50CisgKi8K K3N0YXRpYyB2b2lkCitmc3RfaW50cl90ZTFfYWxhcm0oc3RydWN0IGZzdF9jYXJkX2luZm8gKmNh cmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCXU4IGxvczsKKwl1OCBycmE7CisJ dTggYWlzOworCisJbG9zID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5sb3NzT2ZTaWduYWwpOwor CXJyYSA9IEZTVF9SREIoY2FyZCwgc3VTdGF0dXMucmVjZWl2ZVJlbW90ZUFsYXJtKTsKKwlhaXMg PSBGU1RfUkRCKGNhcmQsIHN1U3RhdHVzLmFsYXJtSW5kaWNhdGlvblNpZ25hbCk7CisKKwlpZiAo bG9zKSB7CisJCS8qCisJCSAqIExvc3QgdGhlIGxpbmsKKwkJICovCisJCWlmIChuZXRpZl9jYXJy aWVyX29rKHBvcnRfdG9fZGV2KHBvcnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiTmV0IGNhcnJp ZXIgb2ZmXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJ fQorCX0gZWxzZSB7CisJCS8qCisJCSAqIExpbmsgYXZhaWxhYmxlCisJCSAqLworCQlpZiAoIW5l dGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJO ZXQgY2FycmllciBvblxuIik7CisJCQluZXRpZl9jYXJyaWVyX29uKHBvcnRfdG9fZGV2KHBvcnQp KTsKKwkJfQorCX0KKworCWlmIChsb3MpCisJCWRiZyhEQkdfSU5UUiwgIkFzc2VydCBMT1MgQWxh cm1cbiIpOworCWVsc2UKKwkJZGJnKERCR19JTlRSLCAiRGUtYXNzZXJ0IExPUyBBbGFybVxuIik7 CisJaWYgKHJyYSkKKwkJZGJnKERCR19JTlRSLCAiQXNzZXJ0IFJSQSBBbGFybVxuIik7CisJZWxz ZQorCQlkYmcoREJHX0lOVFIsICJEZS1hc3NlcnQgUlJBIEFsYXJtXG4iKTsKKworCWlmIChhaXMp CisJCWRiZyhEQkdfSU5UUiwgIkFzc2VydCBBSVMgQWxhcm1cbiIpOworCWVsc2UKKwkJZGJnKERC R19JTlRSLCAiRGUtYXNzZXJ0IEFJUyBBbGFybVxuIik7Cit9CiAKIC8qICAgICAgQ29udHJvbCBz aWduYWwgY2hhbmdlIGludGVycnVwdCBldmVudAogICovCi1zdGF0aWMgaXJxcmV0dXJuX3QKLWZz dF9pbnRyX2N0bGNoZyAoIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydCApCitzdGF0aWMgdm9pZAorZnN0X2ludHJfY3RsY2hnKHN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKIHsKLSAgICAgICAg aW50IHNpZ25hbHM7CisJaW50IHNpZ25hbHM7CiAKLSAgICAgICAgc2lnbmFscyA9IEZTVF9SREwg KCBjYXJkLCB2MjREZWJvdW5jZWRTdHNbcG9ydC0+aW5kZXhdKTsKKwlzaWduYWxzID0gRlNUX1JE TChjYXJkLCB2MjREZWJvdW5jZWRTdHNbcG9ydC0+aW5kZXhdKTsKIAotICAgICAgICBpZiAoIHNp Z25hbHMgJiAoKCBwb3J0LT5od2lmID09IFgyMSApID8gSVBTVFNfSU5ESUNBVEUgOiBJUFNUU19E Q0QgKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggISBuZXRpZl9jYXJyaWVyX29r ICggcG9ydF90b19kZXYgKCBwb3J0ICkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAg ICAgICAgICAgICAgIGRiZyAoIERCR19JTlRSLCJEQ0QgYWN0aXZlXG4iKTsKLSAgICAgICAgICAg ICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb24gKCBwb3J0X3RvX2RldiAoIHBvcnQgKSk7Ci0g ICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAg ICAgICAgICAgICAgIGlmICggbmV0aWZfY2Fycmllcl9vayAoIHBvcnRfdG9fZGV2ICggcG9ydCAp KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYmcgKCBEQkdf SU5UUiwiRENEIGxvc3RcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfY2Fycmll cl9vZmYgKCBwb3J0X3RvX2RldiAoIHBvcnQgKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg ICB9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChzaWduYWxzICYgKCgocG9ydC0+aHdpZiA9 PSBYMjEpIHx8IChwb3J0LT5od2lmID09IFgyMUQpKQorCQkgICAgICAgPyBJUFNUU19JTkRJQ0FU RSA6IElQU1RTX0RDRCkpIHsKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHBvcnRfdG9fZGV2KHBv cnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiRENEIGFjdGl2ZVxuIik7CisJCQluZXRpZl9jYXJy aWVyX29uKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChuZXRpZl9j YXJyaWVyX29rKHBvcnRfdG9fZGV2KHBvcnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiRENEIGxv c3RcbiIpOworCQkJbmV0aWZfY2Fycmllcl9vZmYocG9ydF90b19kZXYocG9ydCkpOworCQl9CisJ fQorfQorCisvKiAgICAgIExvZyBSeCBFcnJvcnMKKyAqLworc3RhdGljIHZvaWQKK2ZzdF9sb2df cnhfZXJyb3Ioc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZv ICpwb3J0LAorCQkgdW5zaWduZWQgY2hhciBkbWFiaXRzLCBpbnQgcnhwLCB1bnNpZ25lZCBzaG9y dCBsZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOwor CXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCS8q IAorCSAqIEluY3JlbWVudCB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY291bnRlcgorCSAqLworCXN0 YXRzLT5yeF9lcnJvcnMrKzsKKwlpZiAoZG1hYml0cyAmIFJYX09GTE8pIHsKKwkJc3RhdHMtPnJ4 X2ZpZm9fZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggZmlmbyBlcnJvciBvbiBjYXJkICVk IHBvcnQgJWQgYnVmZmVyICVkXG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgs IHJ4cCk7CisJfQorCWlmIChkbWFiaXRzICYgUlhfQ1JDKSB7CisJCXN0YXRzLT5yeF9jcmNfZXJy b3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggY3JjIGVycm9yIG9uIGNhcmQgJWQgcG9ydCAlZFxu IiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwl9CisJaWYgKGRtYWJpdHMg JiBSWF9GUkFNKSB7CisJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1Ms ICJSeCBmcmFtZSBlcnJvciBvbiBjYXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJk X25vLCBwb3J0LT5pbmRleCk7CisJfQorCWlmIChkbWFiaXRzID09IChSWF9TVFAgfCBSWF9FTlAp KSB7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggbGVu Z3RoIGVycm9yICglZCkgb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgbGVuLCBjYXJkLT5j YXJkX25vLCBwb3J0LT5pbmRleCk7CisJfQogfQogCisvKiAgICAgIFJ4IEVycm9yIFJlY292ZXJ5 CisgKi8KK3N0YXRpYyB2b2lkCitmc3RfcmVjb3Zlcl9yeF9lcnJvcihzdHJ1Y3QgZnN0X2NhcmRf aW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAgICAgdW5zaWduZWQg Y2hhciBkbWFiaXRzLCBpbnQgcnhwLCB1bnNpZ25lZCBzaG9ydCBsZW4pCit7CisJaW50IGk7CisJ aW50IHBpOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwkvKiAKKwkgKiBEaXNjYXJkIGJ1ZmZlciBk ZXNjcmlwdG9ycyB1bnRpbCB3ZSBzZWUgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIG5leHQgZnJhbWUu ICBOb3RlIHRoYXQgZm9yIGxvbmcgZnJhbWVzIHRoaXMgY291bGQgYmUgaW4KKwkgKiBhIHN1YnNl cXVlbnQgaW50ZXJydXB0LiAKKwkgKi8KKwlpID0gMDsKKwl3aGlsZSAoKGRtYWJpdHMgJiAoRE1B X09XTiB8IFJYX1NUUCkpID09IDApIHsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1b cnhwXS5iaXRzLCBETUFfT1dOKTsKKwkJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJ CWlmICgrK2kgPiBOVU1fUlhfQlVGRkVSKSB7CisJCQlkYmcoREJHX0FTUywgImludHJfcng6IERp c2NhcmRpbmcgbW9yZSBidWZzIgorCQkJICAgICIgdGhhbiB3ZSBoYXZlXG4iKTsKKwkJCWJyZWFr OworCQl9CisJCWRtYWJpdHMgPSBGU1RfUkRCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJp dHMpOworCQlkYmcoREJHX0FTUywgIkRNQSBCaXRzIG9mIG5leHQgYnVmZmVyIHdhcyAleFxuIiwg ZG1hYml0cyk7CisJfQorCWRiZyhEQkdfQVNTLCAiVGhlcmUgd2VyZSAlZCBzdWJzZXF1ZW50IGJ1 ZmZlcnMgaW4gZXJyb3JcbiIsIGkpOworCisJLyogRGlzY2FyZCB0aGUgdGVybWluYWwgYnVmZmVy ICovCisJaWYgKCEoZG1hYml0cyAmIERNQV9PV04pKSB7CisJCUZTVF9XUkIoY2FyZCwgcnhEZXNj clJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisJCXJ4cCA9IChyeHArMSkgJSBOVU1fUlhf QlVGRkVSOworCX0KKwlwb3J0LT5yeHBvcyA9IHJ4cDsKKwlyZXR1cm47CisKK30KIAogLyogICAg ICBSeCBjb21wbGV0ZSBpbnRlcnJ1cHQKICAqLwogc3RhdGljIHZvaWQKLWZzdF9pbnRyX3J4ICgg c3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0ICkK K2ZzdF9pbnRyX3J4KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRf aW5mbyAqcG9ydCkKIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBkbWFiaXRzOwotICAgICAgICBp bnQgcGk7Ci0gICAgICAgIGludCByeHA7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbjsKLSAg ICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyIGRtYWJpdHM7CisJaW50 IHBpOworCWludCByeHA7CisJaW50IHJ4X3N0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBsZW47CisJ c3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19k ZXYocG9ydCk7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhk ZXYpOwotICAgICAgICBpbnQgaTsKIAorCS8qIENoZWNrIHdlIGhhdmUgYSBidWZmZXIgdG8gcHJv Y2VzcyAqLworCXBpID0gcG9ydC0+aW5kZXg7CisJcnhwID0gcG9ydC0+cnhwb3M7CisJZG1hYml0 cyA9IEZTVF9SREIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cyk7CisJaWYgKGRtYWJp dHMgJiBETUFfT1dOKSB7CisJCWRiZyhEQkdfUlggfCBEQkdfSU5UUiwgImludHJfcng6IE5vIGJ1 ZmZlciBwb3J0ICVkIHBvcyAlZFxuIiwKKwkJICAgIHBpLCByeHApOworCQlyZXR1cm47CisJfQor CWlmIChjYXJkLT5kbWFyeF9pbl9wcm9ncmVzcykgeworCQlyZXR1cm47CisJfQogCi0gICAgICAg IC8qIENoZWNrIHdlIGhhdmUgYSBidWZmZXIgdG8gcHJvY2VzcyAqLwotICAgICAgICBwaSAgPSBw b3J0LT5pbmRleDsKLSAgICAgICAgcnhwID0gcG9ydC0+cnhwb3M7Ci0gICAgICAgIGRtYWJpdHMg PSBGU1RfUkRCICggY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cyApOwotICAgICAgICBp ZiAoIGRtYWJpdHMgJiBETUFfT1dOICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGRiZyAo IERCR19SWCB8IERCR19JTlRSLCJpbnRyX3J4OiBObyBidWZmZXIgcG9ydCAlZCBwb3MgJWRcbiIs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGksIHJ4cCApOwotICAg ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdldCBidWZmZXIg bGVuZ3RoICovCi0gICAgICAgIGxlbiA9IEZTVF9SRFcgKCBjYXJkLCByeERlc2NyUmluZ1twaV1b cnhwXS5tY250ICk7Ci0gICAgICAgIC8qIERpc2NhcmQgdGhlIENSQyAqLwotICAgICAgICBsZW4g LT0gMjsKLQotICAgICAgICAvKiBDaGVjayBidWZmZXIgbGVuZ3RoIGFuZCBmb3Igb3RoZXIgZXJy b3JzLiBXZSBpbnNpc3Qgb24gb25lIHBhY2tldAotICAgICAgICAgKiBpbiBvbmUgYnVmZmVyLiBU aGlzIHNpbXBsaWZpZXMgdGhpbmdzIGdyZWF0bHkgYW5kIHNpbmNlIHdlJ3ZlCi0gICAgICAgICAq IGFsbG9jYXRlZCA4SyBpdCBzaG91bGRuJ3QgYmUgYSByZWFsIHdvcmxkIGxpbWl0YXRpb24KLSAg ICAgICAgICovCi0gICAgICAgIGRiZyAoIERCR19SWCwiaW50cl9yeDogJWQsJWQ6IGZsYWdzICV4 IGxlbiAlZFxuIiwgcGksIHJ4cCwgZG1hYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBsZW4gKTsKLSAgICAgICAgaWYgKCBkbWFiaXRzICE9ICggUlhfU1RQIHwg UlhfRU5QICkgfHwgbGVuID4gTEVOX1JYX0JVRkZFUiAtIDIgKQotICAgICAgICB7Ci0gICAgICAg ICAgICAgICAgc3RhdHMtPnJ4X2Vycm9ycysrOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRl IGVycm9yIHN0YXRzIGFuZCBkaXNjYXJkIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIGlmICgg ZG1hYml0cyAmIFJYX09GTE8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAg ICAgICAgIHN0YXRzLT5yeF9maWZvX2Vycm9ycysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAg ICAgICAgICAgICBpZiAoIGRtYWJpdHMgJiBSWF9DUkMgKQotICAgICAgICAgICAgICAgIHsKLSAg ICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLT5yeF9jcmNfZXJyb3JzKys7Ci0gICAgICAgICAg ICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggZG1hYml0cyAmIFJYX0ZSQU0gKQotICAgICAg ICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLT5yeF9mcmFtZV9lcnJv cnMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCBkbWFiaXRzID09 ICggUlhfU1RQIHwgUlhfRU5QICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAg ICAgICAgICAgc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKLSAgICAgICAgICAgICAgICB9CisJ LyogR2V0IGJ1ZmZlciBsZW5ndGggKi8KKwlsZW4gPSBGU1RfUkRXKGNhcmQsIHJ4RGVzY3JSaW5n W3BpXVtyeHBdLm1jbnQpOworCS8qIERpc2NhcmQgdGhlIENSQyAqLworCWxlbiAtPSAyOworCWlm IChsZW4gPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIHNlZW1zIHRvIGhhcHBlbiBvbiB0aGUgVEUx IGludGVyZmFjZSBzb21ldGltZXMKKwkJICogc28gdGhyb3cgdGhlIGZyYW1lIGF3YXkgYW5kIGxv ZyB0aGUgZXZlbnQuCisJCSAqLworCQlwcmludGtfZXJyKCJGcmFtZSByZWNlaXZlZCB3aXRoIDAg bGVuZ3RoLiBDYXJkICVkIFBvcnQgJWRcbiIsCisJCQkgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5p bmRleCk7CisJCS8qIFJldHVybiBkZXNjcmlwdG9yIHRvIGNhcmQgKi8KKwkJRlNUX1dSQihjYXJk LCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCQlyeHAgPSAocnhwKzEp ICUgTlVNX1JYX0JVRkZFUjsKKwkJcG9ydC0+cnhwb3MgPSByeHA7CisJCXJldHVybjsKKwl9CiAK LSAgICAgICAgICAgICAgICAvKiBEaXNjYXJkIGJ1ZmZlciBkZXNjcmlwdG9ycyB1bnRpbCB3ZSBz ZWUgdGhlIGVuZCBvZiBwYWNrZXQKLSAgICAgICAgICAgICAgICAgKiBtYXJrZXIKLSAgICAgICAg ICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICB3aGls ZSAoKCBkbWFiaXRzICYgKCBETUFfT1dOIHwgUlhfRU5QICkpID09IDAgKQotICAgICAgICAgICAg ICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZTVF9XUkIgKCBjYXJkLCByeERlc2NyUmlu Z1twaV1bcnhwXS5iaXRzLCBETUFfT1dOICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAo ICsrcnhwID49IE5VTV9SWF9CVUZGRVIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByeHAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCArK2kgPiBOVU1fUlhfQlVG RkVSICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZGJnICggREJHX0FTUywiaW50cl9yeDogRGlzY2FyZGluZyBtb3JlIGJ1ZnMiCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoYW4gd2Ug aGF2ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZG1hYml0cyA9IEZT VF9SREIgKCBjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzICk7Ci0gICAgICAgICAgICAg ICAgfQorCS8qIENoZWNrIGJ1ZmZlciBsZW5ndGggYW5kIGZvciBvdGhlciBlcnJvcnMuIFdlIGlu c2lzdCBvbiBvbmUgcGFja2V0CisJICogaW4gb25lIGJ1ZmZlci4gVGhpcyBzaW1wbGlmaWVzIHRo aW5ncyBncmVhdGx5IGFuZCBzaW5jZSB3ZSd2ZQorCSAqIGFsbG9jYXRlZCA4SyBpdCBzaG91bGRu J3QgYmUgYSByZWFsIHdvcmxkIGxpbWl0YXRpb24KKwkgKi8KKwlkYmcoREJHX1JYLCAiaW50cl9y eDogJWQsJWQ6IGZsYWdzICV4IGxlbiAlZFxuIiwgcGksIHJ4cCwgZG1hYml0cywgbGVuKTsKKwlp ZiAoZG1hYml0cyAhPSAoUlhfU1RQIHwgUlhfRU5QKSB8fCBsZW4gPiBMRU5fUlhfQlVGRkVSIC0g MikgeworCQlmc3RfbG9nX3J4X2Vycm9yKGNhcmQsIHBvcnQsIGRtYWJpdHMsIHJ4cCwgbGVuKTsK KwkJZnN0X3JlY292ZXJfcnhfZXJyb3IoY2FyZCwgcG9ydCwgZG1hYml0cywgcnhwLCBsZW4pOwor CQlyZXR1cm47CisJfQogCi0gICAgICAgICAgICAgICAgLyogRGlzY2FyZCB0aGUgdGVybWluYWwg YnVmZmVyICovCi0gICAgICAgICAgICAgICAgaWYgKCAhICggZG1hYml0cyAmIERNQV9PV04gKSkK LSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGU1RfV1JCICggY2Fy ZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTiApOwotICAgICAgICAgICAgICAg ICAgICAgICAgaWYgKCArK3J4cCA+PSBOVU1fUlhfQlVGRkVSICkKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcnhwID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg ICAgcG9ydC0+cnhwb3MgPSByeHA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9 Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgU0tCICovCi0gICAgICAgIGlmICgoIHNrYiA9IGRldl9h bGxvY19za2IgKCBsZW4gKSkgPT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBk YmcgKCBEQkdfUlgsImludHJfcng6IGNhbid0IGFsbG9jYXRlIGJ1ZmZlclxuIik7Ci0KLSAgICAg ICAgICAgICAgICBzdGF0cy0+cnhfZHJvcHBlZCsrOwotCi0gICAgICAgICAgICAgICAgLyogUmV0 dXJuIGRlc2NyaXB0b3IgdG8gY2FyZCAqLwotICAgICAgICAgICAgICAgIEZTVF9XUkIgKCBjYXJk LCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOICk7Ci0KLSAgICAgICAgICAgICAg ICBpZiAoICsrcnhwID49IE5VTV9SWF9CVUZGRVIgKQotICAgICAgICAgICAgICAgICAgICAgICAg cG9ydC0+cnhwb3MgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAg ICAgICAgIHBvcnQtPnJ4cG9zID0gcnhwOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg ICAgfQotCi0gICAgICAgIG1lbWNweV9mcm9taW8gKCBza2JfcHV0ICggc2tiLCBsZW4gKSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWVtICsgQlVGX09GRlNFVCAoIHJ4 QnVmZmVyW3BpXVtyeHBdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVu ICk7Ci0KLSAgICAgICAgLyogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgRlNU X1dSQiAoIGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04gKTsKLSAgICAg ICAgaWYgKCArK3J4cCA+PSBOVU1fUlhfQlVGRkVSICkKLSAgICAgICAgICAgICAgICBwb3J0LT5y eHBvcyA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwb3J0LT5yeHBvcyA9IHJ4 cDsKLQotICAgICAgICAvKiBVcGRhdGUgc3RhdHMgKi8KLSAgICAgICAgc3RhdHMtPnJ4X3BhY2tl dHMrKzsKLSAgICAgICAgc3RhdHMtPnJ4X2J5dGVzICs9IGxlbjsKLQotICAgICAgICAvKiBQdXNo IHVwc3RyZWFtICovCi0gICAgICAgIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLSAgICAgICAg c2tiLT5kZXYgPSBkZXY7Ci0gICAgICAgIHNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMo c2tiLCBza2ItPmRldik7Ci0gICAgICAgIG5ldGlmX3J4ICggc2tiICk7CisJLyogQWxsb2NhdGUg U0tCICovCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbikpID09IE5VTEwpIHsKKwkJZGJn KERCR19SWCwgImludHJfcng6IGNhbid0IGFsbG9jYXRlIGJ1ZmZlclxuIik7CisKKwkJc3RhdHMt PnJ4X2Ryb3BwZWQrKzsKKworCQkvKiBSZXR1cm4gZGVzY3JpcHRvciB0byBjYXJkICovCisJCUZT VF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisKKwkJcnhw ID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJCXBvcnQtPnJ4cG9zID0gcnhwOworCQlyZXR1 cm47CisJfQogCi0gICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJLyoKKwkgKiBXZSBr bm93IHRoZSBsZW5ndGggd2UgbmVlZCB0byByZWNlaXZlLCBsZW4uCisJICogSXQncyBub3Qgd29y dGggdXNpbmcgdGhlIERNQSBmb3IgcmVhZHMgb2YgbGVzcyB0aGFuCisJICogRlNUX01JTl9ETUFf TEVOCisJICovCisKKwlpZiAoKGxlbiA8IEZTVF9NSU5fRE1BX0xFTikgfHwgKGNhcmQtPmZhbWls eSA9PSBGU1RfRkFNSUxZX1RYUCkpIHsKKwkJbWVtY3B5X2Zyb21pbyhza2JfcHV0KHNrYiwgbGVu KSwKKwkJCSAgICAgIGNhcmQtPm1lbSArIEJVRl9PRkZTRVQocnhCdWZmZXJbcGldW3J4cF1bMF0p LAorCQkJICAgICAgbGVuKTsKKworCQkvKiBSZXNldCBidWZmZXIgZGVzY3JpcHRvciAqLworCQlG U1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOworCisJCS8q IFVwZGF0ZSBzdGF0cyAqLworCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQlzdGF0cy0+cnhfYnl0 ZXMgKz0gbGVuOworCisJCS8qIFB1c2ggdXBzdHJlYW0gKi8KKwkJZGJnKERCR19SWCwgIlB1c2hp bmcgZnJhbWUgdXAgdGhlIHN0YWNrXG4iKTsKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwor CQlza2ItPmRldiA9IGRldjsKKwkJaWYgKHBvcnQtPm1vZGUgPT0gRlNUX1JBVykgeworCQkJLyoK KwkJCSAqIE1hcmsgaXQgZm9yIG91ciBvd24gcmF3IHNvY2tldHMgaW50ZXJmYWNlCisJCQkgKi8K KwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DVVNUKTsKKwkJCXNrYi0+cGt0X3R5cGUg PSBQQUNLRVRfSE9TVDsKKwkJfSBlbHNlIHsKKwkJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVf dHJhbnMoc2tiLCBza2ItPmRldik7CisJCX0KKwkJcnhfc3RhdHVzID0gbmV0aWZfcngoc2tiKTsK KwkJZnN0X3Byb2Nlc3Nfcnhfc3RhdHVzKHJ4X3N0YXR1cywgcG9ydF90b19kZXYocG9ydCktPm5h bWUpOworCQlpZiAocnhfc3RhdHVzID09IE5FVF9SWF9EUk9QKSB7CisJCQlzdGF0cy0+cnhfZHJv cHBlZCsrOworCQl9CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkJY2Fy ZC0+ZG1hX3NrYl9yeCA9IHNrYjsKKwkJY2FyZC0+ZG1hX3BvcnRfcnggPSBwb3J0OworCQljYXJk LT5kbWFfbGVuX3J4ID0gbGVuOworCQljYXJkLT5kbWFfcnhwb3MgPSByeHA7CisJCWZzdF9yeF9k bWEoY2FyZCwgKGNoYXIgKikgY2FyZC0+cnhfZG1hX2hhbmRsZV9jYXJkLAorCQkJICAgKGNoYXIg KikgQlVGX09GRlNFVChyeEJ1ZmZlcltwaV1bcnhwXVswXSksIGxlbik7CisJfQorCWlmIChyeHAg IT0gcG9ydC0+cnhwb3MpIHsKKwkJZGJnKERCR19BU1MsICJBYm91dCB0byBpbmNyZW1lbnQgcnhw b3MgYnkgbW9yZSB0aGFuIDFcbiIpOworCQlkYmcoREJHX0FTUywgInJ4cCA9ICVkIHJ4cG9zID0g JWRcbiIsIHJ4cCwgcG9ydC0+cnhwb3MpOworCX0KKwlyeHAgPSAocnhwKzEpICUgTlVNX1JYX0JV RkZFUjsKKwlwb3J0LT5yeHBvcyA9IHJ4cDsKIH0KIAorLyoKKyAqICAgICAgVGhlIGJvdHRvbSBo YWxmcyB0byB0aGUgSVNSCisgKgorICovCisKK3N0YXRpYyB2b2lkCitkb19ib3R0b21faGFsZl90 eChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAq cG9ydDsKKwlpbnQgcGk7CisJaW50IHR4cV9sZW5ndGg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0 IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCisJLyoKKwkgKiAgRmluZCBhIGZyZWUgYnVmZmVy IGZvciB0aGUgdHJhbnNtaXQKKwkgKiAgU3RlcCB0aHJvdWdoIGVhY2ggcG9ydCBvbiB0aGlzIGNh cmQKKwkgKi8KKworCWRiZyhEQkdfVFgsICJkb19ib3R0b21faGFsZl90eFxuIik7CisJZm9yIChw aSA9IDAsIHBvcnQgPSBjYXJkLT5wb3J0czsgcGkgPCBjYXJkLT5ucG9ydHM7IHBpKyssIHBvcnQr KykgeworCQlpZiAoIXBvcnQtPnJ1bikKKwkJCWNvbnRpbnVlOworCisgICAgICAgICAgICAgICAg ZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisgICAgICAgICAgICAgICAgc3RhdHMgPSBoZGxjX3N0 YXRzKGRldik7CisJCXdoaWxlICghCisJCSAgICAgICAoRlNUX1JEQihjYXJkLCB0eERlc2NyUmlu Z1twaV1bcG9ydC0+dHhwb3NdLmJpdHMpICYKKwkJCURNQV9PV04pCisgICAgICAgICAgICAgICAg ICAgICAgICYmICEoY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MpKSB7CisJCQkvKgorCQkJICogVGhl cmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgdHhkb25lIGV2ZW50IHBlci1zZQorCQkJICogV2Ugc2Vl bSB0byBoYXZlIHRvIGRlZHVjZSBpdCwgYnkgY2hlY2tpbmcgdGhlIERNQV9PV04KKwkJCSAqIGJp dCBvbiB0aGUgbmV4dCBidWZmZXIgd2UgdGhpbmsgd2UgY2FuIHVzZQorCQkJICovCisJCQlzcGlu X2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQlpZiAoKHR4cV9sZW5n dGggPSBwb3J0LT50eHFlIC0gcG9ydC0+dHhxcykgPCAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlz IGlzIHRoZSBjYXNlIHdoZXJlIG9uZSBoYXMgd3JhcHBlZCBhbmQgdGhlCisJCQkJICogbWF0aHMg Z2l2ZXMgdXMgYSBuZWdhdGl2ZSBudW1iZXIKKwkJCQkgKi8KKwkJCQl0eHFfbGVuZ3RoID0gdHhx X2xlbmd0aCArIEZTVF9UWFFfREVQVEg7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCWlmICh0eHFfbGVuZ3RoID4gMCkgeworCQkJ CS8qCisJCQkJICogVGhlcmUgaXMgc29tZXRoaW5nIHRvIHNlbmQKKwkJCQkgKi8KKwkJCQlzcGlu X2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQkJc2tiID0gcG9ydC0+ dHhxW3BvcnQtPnR4cXNdOworCQkJCXBvcnQtPnR4cXMrKzsKKwkJCQlpZiAocG9ydC0+dHhxcyA9 PSBGU1RfVFhRX0RFUFRIKSB7CisJCQkJCXBvcnQtPnR4cXMgPSAwOworCQkJCX0KKwkJCQlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCQkvKgorCQkJ CSAqIGNvcHkgdGhlIGRhdGEgYW5kIHNldCB0aGUgcmVxdWlyZWQgaW5kaWNhdG9ycyBvbiB0aGUK KwkJCQkgKiBjYXJkLgorCQkJCSAqLworCQkJCUZTVF9XUlcoY2FyZCwgdHhEZXNjclJpbmdbcGld W3BvcnQtPnR4cG9zXS5iY250LAorCQkJCQljbnZfYmNudChza2ItPmxlbikpOworCQkJCWlmICgo c2tiLT5sZW4gPCBGU1RfTUlOX0RNQV9MRU4pCisJCQkJICAgIHx8IChjYXJkLT5mYW1pbHkgPT0g RlNUX0ZBTUlMWV9UWFApKSB7CisJCQkJCS8qIEVucXVldWUgdGhlIHBhY2tldCB3aXRoIG5vcm1h bCBpbyAqLworCQkJCQltZW1jcHlfdG9pbyhjYXJkLT5tZW0gKworCQkJCQkJICAgIEJVRl9PRkZT RVQodHhCdWZmZXJbcGldCisJCQkJCQkJICAgICAgIFtwb3J0LT4KKwkJCQkJCQkJdHhwb3NdWzBd KSwKKwkJCQkJCSAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCQkJRlNUX1dSQihjYXJkLAor CQkJCQkJdHhEZXNjclJpbmdbcGldW3BvcnQtPnR4cG9zXS4KKwkJCQkJCWJpdHMsCisJCQkJCQlE TUFfT1dOIHwgVFhfU1RQIHwgVFhfRU5QKTsKKwkJCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJ CQkJc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJCQlkZXYtPnRyYW5zX3N0YXJ0ID0g amlmZmllczsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBPciBkbyBpdCB0aHJvdWdoIGRtYSAqLwor CQkJCQltZW1jcHkoY2FyZC0+dHhfZG1hX2hhbmRsZV9ob3N0LAorCQkJCQkgICAgICAgc2tiLT5k YXRhLCBza2ItPmxlbik7CisJCQkJCWNhcmQtPmRtYV9wb3J0X3R4ID0gcG9ydDsKKwkJCQkJY2Fy ZC0+ZG1hX2xlbl90eCA9IHNrYi0+bGVuOworCQkJCQljYXJkLT5kbWFfdHhwb3MgPSBwb3J0LT50 eHBvczsKKwkJCQkJZnN0X3R4X2RtYShjYXJkLAorCQkJCQkJICAgKGNoYXIgKikgY2FyZC0+CisJ CQkJCQkgICB0eF9kbWFfaGFuZGxlX2NhcmQsCisJCQkJCQkgICAoY2hhciAqKQorCQkJCQkJICAg QlVGX09GRlNFVCh0eEJ1ZmZlcltwaV0KKwkJCQkJCQkgICAgICBbcG9ydC0+dHhwb3NdWzBdKSwK KwkJCQkJCSAgIHNrYi0+bGVuKTsKKwkJCQl9CisJCQkJaWYgKCsrcG9ydC0+dHhwb3MgPj0gTlVN X1RYX0JVRkZFUikKKwkJCQkJcG9ydC0+dHhwb3MgPSAwOworCQkJCS8qCisJCQkJICogSWYgd2Ug aGF2ZSBmbG93IGNvbnRyb2wgb24sIGNhbiB3ZSBub3cgcmVsZWFzZSBpdD8KKwkJCQkgKi8KKwkJ CQlpZiAocG9ydC0+c3RhcnQpIHsKKwkJCQkJaWYgKHR4cV9sZW5ndGggPCBmc3RfdHhxX2xvdykg eworCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShwb3J0X3RvX2RldgorCQkJCQkJCQkgKHBvcnQpKTsK KwkJCQkJCXBvcnQtPnN0YXJ0ID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlkZXZfa2ZyZWVfc2ti KHNrYik7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogTm90aGluZyB0byBzZW5kIHNvIGJy ZWFrIG91dCBvZiB0aGUgd2hpbGUgbG9vcAorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9 CisJfQorfQorCitzdGF0aWMgdm9pZAorZG9fYm90dG9tX2hhbGZfcngoc3RydWN0IGZzdF9jYXJk X2luZm8gKmNhcmQpCit7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJaW50IHBpOwor CWludCByeF9jb3VudCA9IDA7CisKKwkvKiBDaGVjayBmb3IgcnggY29tcGxldGlvbnMgb24gYWxs IHBvcnRzIG9uIHRoaXMgY2FyZCAqLworCWRiZyhEQkdfUlgsICJkb19ib3R0b21faGFsZl9yeFxu Iik7CisJZm9yIChwaSA9IDAsIHBvcnQgPSBjYXJkLT5wb3J0czsgcGkgPCBjYXJkLT5ucG9ydHM7 IHBpKyssIHBvcnQrKykgeworCQlpZiAoIXBvcnQtPnJ1bikKKwkJCWNvbnRpbnVlOworCisJCXdo aWxlICghKEZTVF9SREIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3BvcnQtPnJ4cG9zXS5iaXRzKQor CQkJICYgRE1BX09XTikgJiYgIShjYXJkLT5kbWFyeF9pbl9wcm9ncmVzcykpIHsKKwkJCWlmIChy eF9jb3VudCA+IGZzdF9tYXhfcmVhZHMpIHsKKwkJCQkvKgorCQkJCSAqIERvbid0IHNwZW5kIGZv cmV2ZXIgaW4gcmVjZWl2ZSBwcm9jZXNzaW5nCisJCQkJICogU2NoZWR1bGUgYW5vdGhlciBldmVu dAorCQkJCSAqLworCQkJCWZzdF9xX3dvcmtfaXRlbSgmZnN0X3dvcmtfaW50cSwgY2FyZC0+Y2Fy ZF9ubyk7CisJCQkJdGFza2xldF9zY2hlZHVsZSgmZnN0X2ludF90YXNrKTsKKwkJCQlicmVhazsJ LyogTGVhdmUgdGhlIGxvb3AgKi8KKwkJCX0KKwkJCWZzdF9pbnRyX3J4KGNhcmQsIHBvcnQpOwor CQkJcnhfY291bnQrKzsKKwkJfQorCX0KK30KIAogLyoKICAqICAgICAgVGhlIGludGVycnVwdCBz ZXJ2aWNlIHJvdXRpbmUKICAqICAgICAgRGV2X2lkIGlzIG91ciBmc3RfY2FyZF9pbmZvIHBvaW50 ZXIKICAqLwotc3RhdGljIGlycXJldHVybl90Ci1mc3RfaW50ciAoIGludCBpcnEsIHZvaWQgKmRl dl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKQoraXJxcmV0dXJuX3QKK2ZzdF9pbnRyKGludCBp cnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gICAgICAgIHN0cnVj dCBmc3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9y dDsKLSAgICAgICAgaW50IHJkaWR4OyAgICAgICAgICAgICAgICAgICAgICAvKiBFdmVudCBidWZm ZXIgaW5kaWNlcyAqLwotICAgICAgICBpbnQgd3JpZHg7Ci0gICAgICAgIGludCBldmVudDsgICAg ICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIGV2ZW50IGZvciBwcm9jZXNzaW5nICovCi0gICAg ICAgIGludCBwaTsKLQotICAgICAgICBpZiAoKCBjYXJkID0gZGV2X2lkICkgPT0gTlVMTCApCi0g ICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfSU5UUiwiaW50cjogc3B1cmlvdXMg JWRcbiIsIGlycSApOwotICAgICAgICAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKLSAgICAgICAg fQotCi0gICAgICAgIGRiZyAoIERCR19JTlRSLCJpbnRyOiAlZCAlcFxuIiwgaXJxLCBjYXJkICk7 Ci0KLSAgICAgICAgc3Bpbl9sb2NrICggJmNhcmQtPmNhcmRfbG9jayApOwotCi0gICAgICAgIC8q IENsZWFyIGFuZCByZXByaW1lIHRoZSBpbnRlcnJ1cHQgc291cmNlICovCi0gICAgICAgIGZzdF9j bGVhcl9pbnRyICggY2FyZCApOwotCi0gICAgICAgIC8qIFNldCB0aGUgc29mdHdhcmUgYWNrbm93 bGVkZ2UgKi8KLSAgICAgICAgRlNUX1dSQiAoIGNhcmQsIGludGVycnVwdEhhbmRzaGFrZSwgMHhF RSApOwotCi0gICAgICAgIC8qIERyYWluIHRoZSBldmVudCBxdWV1ZSAqLwotICAgICAgICByZGlk eCA9IEZTVF9SREIgKCBjYXJkLCBpbnRlcnJ1cHRFdmVudC5yZGluZGV4ICk7Ci0gICAgICAgIHdy aWR4ID0gRlNUX1JEQiAoIGNhcmQsIGludGVycnVwdEV2ZW50LndyaW5kZXggKTsKLSAgICAgICAg d2hpbGUgKCByZGlkeCAhPSB3cmlkeCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBldmVu dCA9IEZTVF9SREIgKCBjYXJkLCBpbnRlcnJ1cHRFdmVudC5ldm50YnVmZltyZGlkeF0pOwotCi0g ICAgICAgICAgICAgICAgcG9ydCA9ICZjYXJkLT5wb3J0c1tldmVudCAmIDB4MDNdOwotCi0gICAg ICAgICAgICAgICAgZGJnICggREJHX0lOVFIsImludHI6ICV4XG4iLCBldmVudCApOwotCi0gICAg ICAgICAgICAgICAgc3dpdGNoICggZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAg ICAgICAgICBjYXNlIENUTEFfQ0hHOgotICAgICAgICAgICAgICAgIGNhc2UgQ1RMQl9DSEc6Ci0g ICAgICAgICAgICAgICAgY2FzZSBDVExDX0NIRzoKLSAgICAgICAgICAgICAgICBjYXNlIENUTERf Q0hHOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwb3J0LT5ydW4gKQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBmc3RfaW50cl9jdGxjaGcgKCBjYXJkLCBwb3J0ICk7Ci0g ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQUJU QV9TRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgQUJUQl9TRU5UOgotICAgICAgICAgICAgICAg IGNhc2UgQUJUQ19TRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgQUJURF9TRU5UOgotICAgICAg ICAgICAgICAgICAgICAgICAgZGJnICggREJHX1RYLCJBYm9ydCBjb21wbGV0ZSBwb3J0ICVkXG4i LCBldmVudCAmIDB4MDMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCXN0cnVj dCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCWlu dCByZGlkeDsJCS8qIEV2ZW50IGJ1ZmZlciBpbmRpY2VzICovCisJaW50IHdyaWR4OworCWludCBl dmVudDsJCS8qIEFjdHVhbCBldmVudCBmb3IgcHJvY2Vzc2luZyAqLworCXVuc2lnbmVkIGludCBk bWFfaW50Y3NyID0gMDsKKwl1bnNpZ25lZCBpbnQgZG9fY2FyZF9pbnRlcnJ1cHQ7CisJdW5zaWdu ZWQgaW50IGludF9yZXRyeV9jb3VudDsKKworCWlmICgoY2FyZCA9IGRldl9pZCkgPT0gTlVMTCkg eworCQlkYmcoREJHX0lOVFIsICJpbnRyOiBzcHVyaW91cyAlZFxuIiwgaXJxKTsKKwkJcmV0dXJu IElSUV9OT05FOworCX0KIAotICAgICAgICAgICAgICAgIGNhc2UgVFhBX1VOREY6Ci0gICAgICAg ICAgICAgICAgY2FzZSBUWEJfVU5ERjoKLSAgICAgICAgICAgICAgICBjYXNlIFRYQ19VTkRGOgot ICAgICAgICAgICAgICAgIGNhc2UgVFhEX1VOREY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAv KiBEaWZmaWN1bHQgdG8gc2VlIGhvdyB3ZSdkIGdldCB0aGlzIGdpdmVuIHRoYXQgd2UKLSAgICAg ICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBsb2FkIHVwIHRoZSBlbnRpcmUgcGFja2V0IGZv ciBETUEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAg ICAgIGRiZyAoIERCR19UWCwiVHggdW5kZXJmbG93IHBvcnQgJWRcbiIsIGV2ZW50ICYgMHgwMyAp OwotICAgICAgICAgICAgICAgICAgICAgICAgaGRsY19zdGF0cyhwb3J0X3RvX2Rldihwb3J0KSkt PnR4X2Vycm9ycysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaGRsY19zdGF0cyhwb3J0X3Rv X2Rldihwb3J0KSktPnR4X2ZpZm9fZXJyb3JzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBi cmVhazsKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgaW50ZXJydXB0IHdhcyBmb3IgdGhp cyBjYXJkCisJICogcmV0dXJuIGlmIG5vdAorCSAqIE5vdGUgdGhhdCB0aGUgY2FsbCB0byBjbGVh ciB0aGUgaW50ZXJydXB0IGlzIGltcG9ydGFudAorCSAqLworCWRiZyhEQkdfSU5UUiwgImludHI6 ICVkICVwXG4iLCBpcnEsIGNhcmQpOworCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVOTklORykg eworCQlwcmludGtfZXJyCisJCSAgICAoIkludGVycnVwdCByZWNlaXZlZCBmb3IgY2FyZCAlZCBp biBhIG5vbiBydW5uaW5nIHN0YXRlICglZClcbiIsCisJCSAgICAgY2FyZC0+Y2FyZF9ubywgY2Fy ZC0+c3RhdGUpOworCisJCS8qIAorCQkgKiBJdCBpcyBwb3NzaWJsZSB0byByZWFsbHkgYmUgcnVu bmluZywgaS5lLiB3ZSBoYXZlIHJlLWxvYWRlZAorCQkgKiBhIHJ1bm5pbmcgY2FyZAorCQkgKiBD bGVhciBhbmQgcmVwcmltZSB0aGUgaW50ZXJydXB0IHNvdXJjZSAKKwkJICovCisJCWZzdF9jbGVh cl9pbnRyKGNhcmQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQogCi0gICAgICAgICAgICAg ICAgY2FzZSBJTklUX0NQTFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYmcgKCBEQkdfSU5J VCwiQ2FyZCBpbml0IE9LIGludHJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7 CisJLyogQ2xlYXIgYW5kIHJlcHJpbWUgdGhlIGludGVycnVwdCBzb3VyY2UgKi8KKwlmc3RfY2xl YXJfaW50cihjYXJkKTsKIAotICAgICAgICAgICAgICAgIGNhc2UgSU5JVF9GQUlMOgotICAgICAg ICAgICAgICAgICAgICAgICAgZGJnICggREJHX0lOSVQsIkNhcmQgaW5pdCBGQUlMRUQgaW50clxu Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9JRkFJTEVEOwot ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJLyoKKwkgKiBJcyB0aGUgaW50ZXJydXB0 IGZvciB0aGlzIGNhcmQgKGhhbmRzaGFrZSA9PSAxKQorCSAqLworCWRvX2NhcmRfaW50ZXJydXB0 ID0gMDsKKwlpZiAoRlNUX1JEQihjYXJkLCBpbnRlcnJ1cHRIYW5kc2hha2UpID09IDEpIHsKKwkJ ZG9fY2FyZF9pbnRlcnJ1cHQgKz0gRlNUX0NBUkRfSU5UOworCQkvKiBTZXQgdGhlIHNvZnR3YXJl IGFja25vd2xlZGdlICovCisJCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0SGFuZHNoYWtlLCAweEVF KTsKKwl9CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQkvKgorCQkg KiBJcyBpdCBhIERNQSBJbnRlcnJ1cHQKKwkJICovCisJCWRtYV9pbnRjc3IgPSBpbmwoY2FyZC0+ cGNpX2NvbmYgKyBJTlRDU1JfOTA1NCk7CisJCWlmIChkbWFfaW50Y3NyICYgMHgwMDIwMDAwMCkg eworCQkJLyoKKwkJCSAqIERNQSBDaGFubmVsIDAgKFJ4IHRyYW5zZmVyIGNvbXBsZXRlKQorCQkJ ICovCisJCQlkYmcoREJHX1JYLCAiRE1BIFJ4IHhmZXIgY29tcGxldGVcbiIpOworCQkJb3V0Yigw eDgsIGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMCk7CisJCQlmc3RfcnhfZG1hX2NvbXBsZXRlKGNh cmQsIGNhcmQtPmRtYV9wb3J0X3J4LAorCQkJCQkgICAgY2FyZC0+ZG1hX2xlbl9yeCwgY2FyZC0+ ZG1hX3NrYl9yeCwKKwkJCQkJICAgIGNhcmQtPmRtYV9yeHBvcyk7CisJCQljYXJkLT5kbWFyeF9p bl9wcm9ncmVzcyA9IDA7CisJCQlkb19jYXJkX2ludGVycnVwdCArPSBGU1RfUlhfRE1BX0lOVDsK KwkJfQorCQlpZiAoZG1hX2ludGNzciAmIDB4MDA0MDAwMDApIHsKKwkJCS8qCisJCQkgKiBETUEg Q2hhbm5lbCAxIChUeCB0cmFuc2ZlciBjb21wbGV0ZSkKKwkJCSAqLworCQkJZGJnKERCR19UWCwg IkRNQSBUeCB4ZmVyIGNvbXBsZXRlXG4iKTsKKwkJCW91dGIoMHg4LCBjYXJkLT5wY2lfY29uZiAr IERNQUNTUjEpOworCQkJZnN0X3R4X2RtYV9jb21wbGV0ZShjYXJkLCBjYXJkLT5kbWFfcG9ydF90 eCwKKwkJCQkJICAgIGNhcmQtPmRtYV9sZW5fdHgsIGNhcmQtPmRtYV90eHBvcyk7CisJCQljYXJk LT5kbWF0eF9pbl9wcm9ncmVzcyA9IDA7CisJCQlkb19jYXJkX2ludGVycnVwdCArPSBGU1RfVFhf RE1BX0lOVDsKKwkJfQorCX0KIAotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAg ICAgICAgICAgICAgICBwcmludGtfZXJyICgiaW50cjogdW5rbm93biBjYXJkIGV2ZW50IGNvZGUu IGlnbm9yZWRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg ICAgICAgfQorCS8qCisJICogSGF2ZSB3ZSBiZWVuIG1pc3NpbmcgSW50ZXJydXB0cworCSAqLwor CWludF9yZXRyeV9jb3VudCA9IEZTVF9SREwoY2FyZCwgaW50ZXJydXB0UmV0cnlDb3VudCk7CisJ aWYgKGludF9yZXRyeV9jb3VudCkgeworCQlkYmcoREJHX0FTUywgIkNhcmQgJWQgaW50X3JldHJ5 X2NvdW50IGlzICAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIGludF9yZXRyeV9jb3VudCk7 CisJCUZTVF9XUkwoY2FyZCwgaW50ZXJydXB0UmV0cnlDb3VudCwgMCk7CisJfQogCi0gICAgICAg ICAgICAgICAgLyogQnVtcCBhbmQgd3JhcCB0aGUgaW5kZXggKi8KLSAgICAgICAgICAgICAgICBp ZiAoICsrcmRpZHggPj0gTUFYX0NJUkJVRkYgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmRp ZHggPSAwOwotICAgICAgICB9Ci0gICAgICAgIEZTVF9XUkIgKCBjYXJkLCBpbnRlcnJ1cHRFdmVu dC5yZGluZGV4LCByZGlkeCApOwotCi0gICAgICAgIGZvciAoIHBpID0gMCwgcG9ydCA9IGNhcmQt PnBvcnRzIDsgcGkgPCBjYXJkLT5ucG9ydHMgOyBwaSsrLCBwb3J0KysgKQotICAgICAgICB7Ci0g ICAgICAgICAgICAgICAgaWYgKCAhIHBvcnQtPnJ1biApCi0gICAgICAgICAgICAgICAgICAgICAg ICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciByeCBjb21wbGV0aW9u cyAqLwotICAgICAgICAgICAgICAgIHdoaWxlICggISAoIEZTVF9SREIgKCBjYXJkLCByeERlc2Ny UmluZ1twaV1bcG9ydC0+cnhwb3NdLmJpdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgRE1BX09XTiApKQotICAgICAg ICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzdF9pbnRyX3J4ICggY2FyZCwg cG9ydCApOwotICAgICAgICAgICAgICAgIH0KKwlpZiAoIWRvX2NhcmRfaW50ZXJydXB0KSB7CisJ CXJldHVybiBJUlFfSEFORExFRDsKKwl9CiAKLSAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3Ig VHggY29tcGxldGlvbnMgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoIHBvcnQtPnR4Y250ID4g MCAmJiAhICggRlNUX1JEQiAoIGNhcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eERlc2Ny UmluZ1twaV1bcG9ydC0+dHhpcG9zXS5iaXRzICkgJiBETUFfT1dOICkpCi0gICAgICAgICAgICAg ICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1wb3J0LT50eGNudDsKLSAgICAgICAgICAg ICAgICAgICAgICAgIGlmICggKytwb3J0LT50eGlwb3MgPj0gTlVNX1RYX0JVRkZFUiApCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnR4aXBvcyA9IDA7Ci0gICAgICAgICAg ICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlICggcG9ydF90b19kZXYgKCBwb3J0ICkpOwot ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCS8qIFNjZWhkdWxlIHRoZSBib3R0b20gaGFs ZiBvZiB0aGUgSVNSICovCisJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29ya19pbnRxLCBjYXJkLT5j YXJkX25vKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfaW50X3Rhc2spOworCisJLyogRHJhaW4g dGhlIGV2ZW50IHF1ZXVlICovCisJcmRpZHggPSBGU1RfUkRCKGNhcmQsIGludGVycnVwdEV2ZW50 LnJkaW5kZXgpICYgMHgxZjsKKwl3cmlkeCA9IEZTVF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQu d3JpbmRleCkgJiAweDFmOworCXdoaWxlIChyZGlkeCAhPSB3cmlkeCkgeworCQlldmVudCA9IEZT VF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQuZXZudGJ1ZmZbcmRpZHhdKTsKKwkJcG9ydCA9ICZj YXJkLT5wb3J0c1tldmVudCAmIDB4MDNdOworCisJCWRiZyhEQkdfSU5UUiwgIlByb2Nlc3Npbmcg SW50ZXJydXB0IGV2ZW50OiAleFxuIiwgZXZlbnQpOworCisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJ Y2FzZSBURTFfQUxNQToKKwkJCWRiZyhEQkdfSU5UUiwgIlRFMSBBbGFybSBpbnRyXG4iKTsKKwkJ CWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJfdGUxX2FsYXJtKGNhcmQsIHBvcnQpOworCQkJ YnJlYWs7CisKKwkJY2FzZSBDVExBX0NIRzoKKwkJY2FzZSBDVExCX0NIRzoKKwkJY2FzZSBDVExD X0NIRzoKKwkJY2FzZSBDVExEX0NIRzoKKwkJCWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJf Y3RsY2hnKGNhcmQsIHBvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQlRBX1NFTlQ6CisJCWNh c2UgQUJUQl9TRU5UOgorCQljYXNlIEFCVENfU0VOVDoKKwkJY2FzZSBBQlREX1NFTlQ6CisJCQlk YmcoREJHX1RYLCAiQWJvcnQgY29tcGxldGUgcG9ydCAlZFxuIiwgcG9ydC0+aW5kZXgpOworCQkJ YnJlYWs7CisKKwkJY2FzZSBUWEFfVU5ERjoKKwkJY2FzZSBUWEJfVU5ERjoKKwkJY2FzZSBUWENf VU5ERjoKKwkJY2FzZSBUWERfVU5ERjoKKwkJCS8qIERpZmZpY3VsdCB0byBzZWUgaG93IHdlJ2Qg Z2V0IHRoaXMgZ2l2ZW4gdGhhdCB3ZQorCQkJICogYWx3YXlzIGxvYWQgdXAgdGhlIGVudGlyZSBw YWNrZXQgZm9yIERNQS4KKwkJCSAqLworCQkJZGJnKERCR19UWCwgIlR4IHVuZGVyZmxvdyBwb3J0 ICVkXG4iLCBwb3J0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZGxjX3N0YXRz KHBvcnRfdG9fZGV2KHBvcnQpKS0+dHhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAg ICBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKS0+dHhfZmlmb19lcnJvcnM7CisJCQlkYmco REJHX0FTUywgIlR4IHVuZGVyZmxvdyBvbiBjYXJkICVkIHBvcnQgJWRcbiIsCisJCQkgICAgY2Fy ZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTklUX0NQTFQ6 CisJCQlkYmcoREJHX0lOSVQsICJDYXJkIGluaXQgT0sgaW50clxuIik7CisJCQlicmVhazsKKwor CQljYXNlIElOSVRfRkFJTDoKKwkJCWRiZyhEQkdfSU5JVCwgIkNhcmQgaW5pdCBGQUlMRUQgaW50 clxuIik7CisJCQljYXJkLT5zdGF0ZSA9IEZTVF9JRkFJTEVEOworCQkJYnJlYWs7CisKKwkJZGVm YXVsdDoKKwkJCXByaW50a19lcnIoImludHI6IHVua25vd24gY2FyZCBldmVudCAlZC4gaWdub3Jl ZFxuIiwKKwkJCQkgICBldmVudCk7CisJCQlicmVhazsKKwkJfQogCi0gICAgICAgIHNwaW5fdW5s b2NrICggJmNhcmQtPmNhcmRfbG9jayApOwotCXJldHVybiBJUlFfSEFORExFRDsKKwkJLyogQnVt cCBhbmQgd3JhcCB0aGUgaW5kZXggKi8KKwkJaWYgKCsrcmRpZHggPj0gTUFYX0NJUkJVRkYpCisJ CQlyZGlkeCA9IDA7CisJfQorCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0RXZlbnQucmRpbmRleCwg cmRpZHgpOworICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLQogLyogICAgICBDaGVj ayB0aGF0IHRoZSBzaGFyZWQgbWVtb3J5IGNvbmZpZ3VyYXRpb24gaXMgb25lIHRoYXQgd2UgY2Fu IGhhbmRsZQogICogICAgICBhbmQgdGhhdCBzb21lIGJhc2ljIHBhcmFtZXRlcnMgYXJlIGNvcnJl Y3QKICAqLwogc3RhdGljIHZvaWQKLWNoZWNrX3N0YXJ0ZWRfb2sgKCBzdHJ1Y3QgZnN0X2NhcmRf aW5mbyAqY2FyZCApCitjaGVja19zdGFydGVkX29rKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJk KQogewotICAgICAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgICAgICAvKiBDaGVjayBzdHJ1Y3R1 cmUgdmVyc2lvbiBhbmQgZW5kIG1hcmtlciAqLwotICAgICAgICBpZiAoIEZTVF9SRFcgKCBjYXJk LCBzbWNWZXJzaW9uICkgIT0gU01DX1ZFUlNJT04gKQotICAgICAgICB7Ci0gICAgICAgICAgICAg ICAgcHJpbnRrX2VyciAoIkJhZCBzaGFyZWQgbWVtb3J5IHZlcnNpb24gJWQgZXhwZWN0ZWQgJWRc biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTVF9SRFcgKCBjYXJkLCBzbWNW ZXJzaW9uICksIFNNQ19WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgY2FyZC0+c3RhdGUgPSBG U1RfQkFEVkVSU0lPTjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAg ICAgaWYgKCBGU1RfUkRMICggY2FyZCwgZW5kT2ZTbWNTaWduYXR1cmUgKSAhPSBFTkRfU0lHICkK LSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50a19lcnIgKCJNaXNzaW5nIHNoYXJlZCBt ZW1vcnkgc2lnbmF0dXJlXG4iKTsKLSAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9C QURWRVJTSU9OOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAv KiBGaXJtd2FyZSBzdGF0dXMgZmxhZywgMHgwMCA9IGluaXRpYWxpc2luZywgMHgwMSA9IE9LLCAw eEZGID0gZmFpbCAqLwotICAgICAgICBpZiAoKCBpID0gRlNUX1JEQiAoIGNhcmQsIHRhc2tTdGF0 dXMgKSkgPT0gMHgwMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9 IEZTVF9SVU5OSU5HOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBpID09IDB4RkYgKQot ICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIkZpcm13YXJlIGluaXRpYWxp c2F0aW9uIGZhaWxlZC4gQ2FyZCBoYWx0ZWRcbiIpOwotICAgICAgICAgICAgICAgIGNhcmQtPnN0 YXRlID0gRlNUX0hBTFRFRDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAg ICAgICAgZWxzZSBpZiAoIGkgIT0gMHgwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBw cmludGtfZXJyICgiVW5rbm93biBmaXJtd2FyZSBzdGF0dXMgMHgleFxuIiwgaSApOwotICAgICAg ICAgICAgICAgIGNhcmQtPnN0YXRlID0gRlNUX0hBTFRFRDsKLSAgICAgICAgICAgICAgICByZXR1 cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGNoZWNrIHRoZSBudW1iZXIgb2Yg cG9ydHMgcmVwb3J0ZWQgYnkgZmlybXdhcmUgYWdhaW5zdCB0aGUKLSAgICAgICAgICogbnVtYmVy IHdlIGFzc3VtZWQgYXQgY2FyZCBkZXRlY3Rpb24uIFNob3VsZCBuZXZlciBoYXBwZW4gd2l0aAot ICAgICAgICAgKiBleGlzdGluZyBmaXJtd2FyZSBldGMgc28gd2UganVzdCByZXBvcnQgaXQgZm9y IHRoZSBtb21lbnQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIEZTVF9SREwgKCBjYXJkLCBu dW1iZXJPZlBvcnRzICkgIT0gY2FyZC0+bnBvcnRzICkKLSAgICAgICAgewotICAgICAgICAgICAg ICAgIHByaW50a193YXJuICgiUG9ydCBjb3VudCBtaXNtYXRjaC4iCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICIgRmlybXdhcmUgdGhpbmtzICVkIHdlIHNheSAlZFxuIiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNUX1JETCAoIGNhcmQsIG51bWJlck9mUG9ydHMg KSwgY2FyZC0+bnBvcnRzICk7Ci0gICAgICAgIH0KLX0KKwkvKiBDaGVjayBzdHJ1Y3R1cmUgdmVy c2lvbiBhbmQgZW5kIG1hcmtlciAqLworCWlmIChGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pICE9 IFNNQ19WRVJTSU9OKSB7CisJCXByaW50a19lcnIoIkJhZCBzaGFyZWQgbWVtb3J5IHZlcnNpb24g JWQgZXhwZWN0ZWQgJWRcbiIsCisJCQkgICBGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pLCBTTUNf VkVSU0lPTik7CisJCWNhcmQtPnN0YXRlID0gRlNUX0JBRFZFUlNJT047CisJCXJldHVybjsKKwl9 CisJaWYgKEZTVF9SREwoY2FyZCwgZW5kT2ZTbWNTaWduYXR1cmUpICE9IEVORF9TSUcpIHsKKwkJ cHJpbnRrX2VycigiTWlzc2luZyBzaGFyZWQgbWVtb3J5IHNpZ25hdHVyZVxuIik7CisJCWNhcmQt PnN0YXRlID0gRlNUX0JBRFZFUlNJT047CisJCXJldHVybjsKKwl9CisJLyogRmlybXdhcmUgc3Rh dHVzIGZsYWcsIDB4MDAgPSBpbml0aWFsaXNpbmcsIDB4MDEgPSBPSywgMHhGRiA9IGZhaWwgKi8K KwlpZiAoKGkgPSBGU1RfUkRCKGNhcmQsIHRhc2tTdGF0dXMpKSA9PSAweDAxKSB7CisJCWNhcmQt PnN0YXRlID0gRlNUX1JVTk5JTkc7CisJfSBlbHNlIGlmIChpID09IDB4RkYpIHsKKwkJcHJpbnRr X2VycigiRmlybXdhcmUgaW5pdGlhbGlzYXRpb24gZmFpbGVkLiBDYXJkIGhhbHRlZFxuIik7CisJ CWNhcmQtPnN0YXRlID0gRlNUX0hBTFRFRDsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaSAhPSAw eDAwKSB7CisJCXByaW50a19lcnIoIlVua25vd24gZmlybXdhcmUgc3RhdHVzIDB4JXhcbiIsIGkp OworCQljYXJkLT5zdGF0ZSA9IEZTVF9IQUxURUQ7CisJCXJldHVybjsKKwl9CiAKKwkvKiBGaW5h bGx5IGNoZWNrIHRoZSBudW1iZXIgb2YgcG9ydHMgcmVwb3J0ZWQgYnkgZmlybXdhcmUgYWdhaW5z dCB0aGUKKwkgKiBudW1iZXIgd2UgYXNzdW1lZCBhdCBjYXJkIGRldGVjdGlvbi4gU2hvdWxkIG5l dmVyIGhhcHBlbiB3aXRoCisJICogZXhpc3RpbmcgZmlybXdhcmUgZXRjIHNvIHdlIGp1c3QgcmVw b3J0IGl0IGZvciB0aGUgbW9tZW50LgorCSAqLworCWlmIChGU1RfUkRMKGNhcmQsIG51bWJlck9m UG9ydHMpICE9IGNhcmQtPm5wb3J0cykgeworCQlwcmludGtfd2FybigiUG9ydCBjb3VudCBtaXNt YXRjaCBvbiBjYXJkICVkLiIKKwkJCSAgICAiIEZpcm13YXJlIHRoaW5rcyAlZCB3ZSBzYXkgJWRc biIsIGNhcmQtPmNhcmRfbm8sCisJCQkgICAgRlNUX1JETChjYXJkLCBudW1iZXJPZlBvcnRzKSwg Y2FyZC0+bnBvcnRzKTsKKwl9Cit9CiAKIHN0YXRpYyBpbnQKLXNldF9jb25mX2Zyb21faW5mbyAo IHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwK LSAgICAgICAgICAgICAgICBzdHJ1Y3QgZnN0aW9jX2luZm8gKmluZm8gKQorc2V0X2NvbmZfZnJv bV9pbmZvKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAq cG9ydCwKKwkJICAgc3RydWN0IGZzdGlvY19pbmZvICppbmZvKQogewotICAgICAgICBpbnQgZXJy OworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBteV9mcmFtaW5nOwogCi0gICAgICAgIC8qIFNl dCB0aGluZ3MgYWNjb3JkaW5nIHRvIHRoZSB1c2VyIHNldCB2YWxpZCBmbGFncy4KLSAgICAgICAg ICogU2V2ZXJhbCBvZiB0aGUgb2xkIG9wdGlvbnMgaGF2ZSBiZWVuIGludmFsaWRhdGVkL3JlcGxh Y2VkIGJ5IHRoZQotICAgICAgICAgKiBnZW5lcmljIEhETEMgcGFja2FnZS4KLSAgICAgICAgICov Ci0gICAgICAgIGVyciA9IDA7Ci0gICAgICAgIGlmICggaW5mby0+dmFsaWQgJiBGU1RWQUxfUFJP VE8gKQotICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgIGlmICggaW5mby0+ dmFsaWQgJiBGU1RWQUxfQ0FCTEUgKQotICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0g ICAgICAgIGlmICggaW5mby0+dmFsaWQgJiBGU1RWQUxfU1BFRUQgKQotICAgICAgICAgICAgICAg IGVyciA9IC1FSU5WQUw7CisJLyogU2V0IHRoaW5ncyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIgc2V0 IHZhbGlkIGZsYWdzIAorCSAqIFNldmVyYWwgb2YgdGhlIG9sZCBvcHRpb25zIGhhdmUgYmVlbiBp bnZhbGlkYXRlZC9yZXBsYWNlZCBieSB0aGUgCisJICogZ2VuZXJpYyBoZGxjIHBhY2thZ2UuCisJ ICovCisJZXJyID0gMDsKKwlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfUFJPVE8pIHsKKwkJaWYg KGluZm8tPnByb3RvID09IEZTVF9SQVcpCisJCQlwb3J0LT5tb2RlID0gRlNUX1JBVzsKKwkJZWxz ZQorCQkJcG9ydC0+bW9kZSA9IEZTVF9HRU5fSERMQzsKKwl9CisKKwlpZiAoaW5mby0+dmFsaWQg JiBGU1RWQUxfQ0FCTEUpCisJCWVyciA9IC1FSU5WQUw7CisKKwlpZiAoaW5mby0+dmFsaWQgJiBG U1RWQUxfU1BFRUQpCisJCWVyciA9IC1FSU5WQUw7CiAKLSAgICAgICAgaWYgKCBpbmZvLT52YWxp ZCAmIEZTVFZBTF9NT0RFICkKLSAgICAgICAgICAgICAgICBGU1RfV1JXICggY2FyZCwgY2FyZE1v ZGUsIGluZm8tPmNhcmRNb2RlICk7CisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1BIQVNFKQor CQlGU1RfV1JCKGNhcmQsIHBvcnRDb25maWdbcG9ydC0+aW5kZXhdLmludmVydENsb2NrLAorCQkJ aW5mby0+aW52ZXJ0Q2xvY2spOworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9NT0RFKQorCQlG U1RfV1JXKGNhcmQsIGNhcmRNb2RlLCBpbmZvLT5jYXJkTW9kZSk7CisJaWYgKGluZm8tPnZhbGlk ICYgRlNUVkFMX1RFMSkgeworCQlGU1RfV1JMKGNhcmQsIHN1Q29uZmlnLmRhdGFSYXRlLCBpbmZv LT5saW5lU3BlZWQpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmNsb2NraW5nLCBpbmZvLT5j bG9ja1NvdXJjZSk7CisJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0UxOworCQlpZiAoaW5mby0+ZnJh bWluZyA9PSBFMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0UxOworCQlpZiAoaW5mby0+ZnJh bWluZyA9PSBUMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX1QxOworCQlpZiAoaW5mby0+ZnJh bWluZyA9PSBKMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0oxOworCQlGU1RfV1JCKGNhcmQs IHN1Q29uZmlnLmZyYW1pbmcsIG15X2ZyYW1pbmcpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmln LnN0cnVjdHVyZSwgaW5mby0+c3RydWN0dXJlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5p bnRlcmZhY2UsIGluZm8tPmludGVyZmFjZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuY29k aW5nLCBpbmZvLT5jb2RpbmcpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmxpbmVCdWlsZE91 dCwgaW5mby0+bGluZUJ1aWxkT3V0KTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5lcXVhbGl6 ZXIsIGluZm8tPmVxdWFsaXplcik7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcudHJhbnNwYXJl bnRNb2RlLCBpbmZvLT50cmFuc3BhcmVudE1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmln Lmxvb3BNb2RlLCBpbmZvLT5sb29wTW9kZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcucmFu Z2UsIGluZm8tPnJhbmdlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy50eEJ1ZmZlck1vZGUs IGluZm8tPnR4QnVmZmVyTW9kZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcucnhCdWZmZXJN b2RlLCBpbmZvLT5yeEJ1ZmZlck1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnN0YXJ0 aW5nU2xvdCwgaW5mby0+c3RhcnRpbmdTbG90KTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5s b3NUaHJlc2hvbGQsIGluZm8tPmxvc1RocmVzaG9sZCk7CisJCWlmIChpbmZvLT5pZGxlQ29kZSkK KwkJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuZW5hYmxlSWRsZUNvZGUsIDEpOworCQllbHNlCisJ CQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmVuYWJsZUlkbGVDb2RlLCAwKTsKKwkJRlNUX1dSQihj YXJkLCBzdUNvbmZpZy5pZGxlQ29kZSwgaW5mby0+aWRsZUNvZGUpOworI2lmIEZTVF9ERUJVRwor CQlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfVEUxKSB7CisJCQlwcmludGsoIlNldHRpbmcgVEUx IGRhdGFcbiIpOworCQkJcHJpbnRrKCJMaW5lIFNwZWVkID0gJWRcbiIsIGluZm8tPmxpbmVTcGVl ZCk7CisJCQlwcmludGsoIlN0YXJ0IHNsb3QgPSAlZFxuIiwgaW5mby0+c3RhcnRpbmdTbG90KTsK KwkJCXByaW50aygiQ2xvY2sgc291cmNlID0gJWRcbiIsIGluZm8tPmNsb2NrU291cmNlKTsKKwkJ CXByaW50aygiRnJhbWluZyA9ICVkXG4iLCBteV9mcmFtaW5nKTsKKwkJCXByaW50aygiU3RydWN0 dXJlID0gJWRcbiIsIGluZm8tPnN0cnVjdHVyZSk7CisJCQlwcmludGsoImludGVyZmFjZSA9ICVk XG4iLCBpbmZvLT5pbnRlcmZhY2UpOworCQkJcHJpbnRrKCJDb2RpbmcgPSAlZFxuIiwgaW5mby0+ Y29kaW5nKTsKKwkJCXByaW50aygiTGluZSBidWlsZCBvdXQgPSAlZFxuIiwgaW5mby0+bGluZUJ1 aWxkT3V0KTsKKwkJCXByaW50aygiRXF1YWxpc2VyID0gJWRcbiIsIGluZm8tPmVxdWFsaXplcik7 CisJCQlwcmludGsoIlRyYW5zcGFyZW50IG1vZGUgPSAlZFxuIiwKKwkJCSAgICAgICBpbmZvLT50 cmFuc3BhcmVudE1vZGUpOworCQkJcHJpbnRrKCJMb29wIG1vZGUgPSAlZFxuIiwgaW5mby0+bG9v cE1vZGUpOworCQkJcHJpbnRrKCJSYW5nZSA9ICVkXG4iLCBpbmZvLT5yYW5nZSk7CisJCQlwcmlu dGsoIlR4IEJ1ZmZlciBtb2RlID0gJWRcbiIsIGluZm8tPnR4QnVmZmVyTW9kZSk7CisJCQlwcmlu dGsoIlJ4IEJ1ZmZlciBtb2RlID0gJWRcbiIsIGluZm8tPnJ4QnVmZmVyTW9kZSk7CisJCQlwcmlu dGsoIkxPUyBUaHJlc2hvbGQgPSAlZFxuIiwgaW5mby0+bG9zVGhyZXNob2xkKTsKKwkJCXByaW50 aygiSWRsZSBDb2RlID0gJWRcbiIsIGluZm8tPmlkbGVDb2RlKTsKKwkJfQorI2VuZGlmCisJfQog I2lmIEZTVF9ERUJVRwotICAgICAgICBpZiAoIGluZm8tPnZhbGlkICYgRlNUVkFMX0RFQlVHICkK LSAgICAgICAgICAgICAgICBmc3RfZGVidWdfbWFzayA9IGluZm8tPmRlYnVnOworCWlmIChpbmZv LT52YWxpZCAmIEZTVFZBTF9ERUJVRykgeworCQlmc3RfZGVidWdfbWFzayA9IGluZm8tPmRlYnVn OworCX0KICNlbmRpZgogCi0gICAgICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAog c3RhdGljIHZvaWQKLWdhdGhlcl9jb25mX2luZm8gKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2Fy ZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCi0gICAgICAgICAgICAgICAgc3RydWN0IGZz dGlvY19pbmZvICppbmZvICkKK2dhdGhlcl9jb25mX2luZm8oc3RydWN0IGZzdF9jYXJkX2luZm8g KmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCQkgc3RydWN0IGZzdGlvY19pbmZv ICppbmZvKQogewotICAgICAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgICAgICBtZW1zZXQgKCBp bmZvLCAwLCBzaXplb2YgKCBzdHJ1Y3QgZnN0aW9jX2luZm8gKSk7CisJbWVtc2V0KGluZm8sIDAs IHNpemVvZiAoc3RydWN0IGZzdGlvY19pbmZvKSk7CiAKLSAgICAgICAgaSA9IHBvcnQtPmluZGV4 OwotICAgICAgICBpbmZvLT5ucG9ydHMgPSBjYXJkLT5ucG9ydHM7Ci0gICAgICAgIGluZm8tPnR5 cGUgICA9IGNhcmQtPnR5cGU7Ci0gICAgICAgIGluZm8tPnN0YXRlICA9IGNhcmQtPnN0YXRlOwot ICAgICAgICBpbmZvLT5wcm90byAgPSBGU1RfR0VOX0hETEM7Ci0gICAgICAgIGluZm8tPmluZGV4 ICA9IGk7CisJaSA9IHBvcnQtPmluZGV4OworCWluZm8tPmtlcm5lbFZlcnNpb24gPSBMSU5VWF9W RVJTSU9OX0NPREU7CisJaW5mby0+bnBvcnRzID0gY2FyZC0+bnBvcnRzOworCWluZm8tPnR5cGUg PSBjYXJkLT50eXBlOworCWluZm8tPnN0YXRlID0gY2FyZC0+c3RhdGU7CisJaW5mby0+cHJvdG8g PSBGU1RfR0VOX0hETEM7CisJaW5mby0+aW5kZXggPSBpOwogI2lmIEZTVF9ERUJVRwotICAgICAg ICBpbmZvLT5kZWJ1ZyAgPSBmc3RfZGVidWdfbWFzazsKKwlpbmZvLT5kZWJ1ZyA9IGZzdF9kZWJ1 Z19tYXNrOwogI2VuZGlmCiAKLSAgICAgICAgLyogT25seSBtYXJrIGluZm9ybWF0aW9uIGFzIHZh bGlkIGlmIGNhcmQgaXMgcnVubmluZy4KLSAgICAgICAgICogQ29weSB0aGUgZGF0YSBhbnl3YXkg aW4gY2FzZSBpdCBpcyB1c2VmdWwgZm9yIGRpYWdub3N0aWNzCi0gICAgICAgICAqLwotICAgICAg ICBpbmZvLT52YWxpZAotICAgICAgICAgICAgICAgID0gKCggY2FyZC0+c3RhdGUgPT0gRlNUX1JV Tk5JTkcgKSA/IEZTVFZBTF9BTEwgOiBGU1RWQUxfQ0FSRCApCisJLyogT25seSBtYXJrIGluZm9y bWF0aW9uIGFzIHZhbGlkIGlmIGNhcmQgaXMgcnVubmluZy4KKwkgKiBDb3B5IHRoZSBkYXRhIGFu eXdheSBpbiBjYXNlIGl0IGlzIHVzZWZ1bCBmb3IgZGlhZ25vc3RpY3MKKwkgKi8KKwlpbmZvLT52 YWxpZCA9ICgoY2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpID8gRlNUVkFMX0FMTCA6IEZTVFZB TF9DQVJEKQogI2lmIEZTVF9ERUJVRwotICAgICAgICAgICAgICAgIHwgRlNUVkFMX0RFQlVHCisJ ICAgIHwgRlNUVkFMX0RFQlVHCiAjZW5kaWYKLSAgICAgICAgICAgICAgICA7CisJICAgIDsKIAot ICAgICAgICBpbmZvLT5saW5lSW50ZXJmYWNlID0gRlNUX1JEVyAoIGNhcmQsIHBvcnRDb25maWdb aV0ubGluZUludGVyZmFjZSApOwotICAgICAgICBpbmZvLT5pbnRlcm5hbENsb2NrID0gRlNUX1JE QiAoIGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxDbG9jayApOwotICAgICAgICBpbmZvLT5s aW5lU3BlZWQgICAgID0gRlNUX1JETCAoIGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkICk7 Ci0gICAgICAgIGluZm8tPnYyNElwU3RzICAgICAgPSBGU1RfUkRMICggY2FyZCwgdjI0SXBTdHNb aV0gKTsKLSAgICAgICAgaW5mby0+djI0T3BTdHMgICAgICA9IEZTVF9SREwgKCBjYXJkLCB2MjRP cFN0c1tpXSApOwotICAgICAgICBpbmZvLT5jbG9ja1N0YXR1cyAgID0gRlNUX1JEVyAoIGNhcmQs IGNsb2NrU3RhdHVzW2ldICk7Ci0gICAgICAgIGluZm8tPmNhYmxlU3RhdHVzICAgPSBGU1RfUkRX ICggY2FyZCwgY2FibGVTdGF0dXMgKTsKLSAgICAgICAgaW5mby0+Y2FyZE1vZGUgICAgICA9IEZT VF9SRFcgKCBjYXJkLCBjYXJkTW9kZSApOwotICAgICAgICBpbmZvLT5zbWNGaXJtd2FyZVZlcnNp b24gID0gRlNUX1JETCAoIGNhcmQsIHNtY0Zpcm13YXJlVmVyc2lvbiApOworCWluZm8tPmxpbmVJ bnRlcmZhY2UgPSBGU1RfUkRXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSk7CisJ aW5mby0+aW50ZXJuYWxDbG9jayA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5h bENsb2NrKTsKKwlpbmZvLT5saW5lU3BlZWQgPSBGU1RfUkRMKGNhcmQsIHBvcnRDb25maWdbaV0u bGluZVNwZWVkKTsKKwlpbmZvLT5pbnZlcnRDbG9jayA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZp Z1tpXS5pbnZlcnRDbG9jayk7CisJaW5mby0+djI0SXBTdHMgPSBGU1RfUkRMKGNhcmQsIHYyNElw U3RzW2ldKTsKKwlpbmZvLT52MjRPcFN0cyA9IEZTVF9SREwoY2FyZCwgdjI0T3BTdHNbaV0pOwor CWluZm8tPmNsb2NrU3RhdHVzID0gRlNUX1JEVyhjYXJkLCBjbG9ja1N0YXR1c1tpXSk7CisJaW5m by0+Y2FibGVTdGF0dXMgPSBGU1RfUkRXKGNhcmQsIGNhYmxlU3RhdHVzKTsKKwlpbmZvLT5jYXJk TW9kZSA9IEZTVF9SRFcoY2FyZCwgY2FyZE1vZGUpOworCWluZm8tPnNtY0Zpcm13YXJlVmVyc2lv biA9IEZTVF9SREwoY2FyZCwgc21jRmlybXdhcmVWZXJzaW9uKTsKKworCS8qCisJICogVGhlIFQy VSBjYW4gcmVwb3J0IGNhYmxlIHByZXNlbmNlIGZvciBib3RoIEEgb3IgQgorCSAqIGluIGJpdHMg MCBhbmQgMSBvZiBjYWJsZVN0YXR1cy4gIFNlZSB3aGljaCBwb3J0IHdlIGFyZSBhbmQgCisJICog ZG8gdGhlIG1hcHBpbmcuCisJICovCisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RY VSkgeworCQlpZiAocG9ydC0+aW5kZXggPT0gMCkgeworCQkJLyoKKwkJCSAqIFBvcnQgQQorCQkJ ICovCisJCQlpbmZvLT5jYWJsZVN0YXR1cyA9IGluZm8tPmNhYmxlU3RhdHVzICYgMTsKKwkJfSBl bHNlIHsKKwkJCS8qCisJCQkgKiBQb3J0IEIKKwkJCSAqLworCQkJaW5mby0+Y2FibGVTdGF0dXMg PSBpbmZvLT5jYWJsZVN0YXR1cyA+PiAxOworCQkJaW5mby0+Y2FibGVTdGF0dXMgPSBpbmZvLT5j YWJsZVN0YXR1cyAmIDE7CisJCX0KKwl9CisJLyoKKwkgKiBTb21lIGFkZGl0aW9uYWwgYml0cyBp ZiB3ZSBhcmUgVEUxCisJICovCisJaWYgKGNhcmQtPnR5cGUgPT0gRlNUX1RZUEVfVEUxKSB7CisJ CWluZm8tPmxpbmVTcGVlZCA9IEZTVF9SREwoY2FyZCwgc3VDb25maWcuZGF0YVJhdGUpOworCQlp bmZvLT5jbG9ja1NvdXJjZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuY2xvY2tpbmcpOworCQlp bmZvLT5mcmFtaW5nID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5mcmFtaW5nKTsKKwkJaW5mby0+ c3RydWN0dXJlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5zdHJ1Y3R1cmUpOworCQlpbmZvLT5p bnRlcmZhY2UgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmludGVyZmFjZSk7CisJCWluZm8tPmNv ZGluZyA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuY29kaW5nKTsKKwkJaW5mby0+bGluZUJ1aWxk T3V0ID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5saW5lQnVpbGRPdXQpOworCQlpbmZvLT5lcXVh bGl6ZXIgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmVxdWFsaXplcik7CisJCWluZm8tPmxvb3BN b2RlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5sb29wTW9kZSk7CisJCWluZm8tPnJhbmdlID0g RlNUX1JEQihjYXJkLCBzdUNvbmZpZy5yYW5nZSk7CisJCWluZm8tPnR4QnVmZmVyTW9kZSA9IEZT VF9SREIoY2FyZCwgc3VDb25maWcudHhCdWZmZXJNb2RlKTsKKwkJaW5mby0+cnhCdWZmZXJNb2Rl ID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5yeEJ1ZmZlck1vZGUpOworCQlpbmZvLT5zdGFydGlu Z1Nsb3QgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLnN0YXJ0aW5nU2xvdCk7CisJCWluZm8tPmxv c1RocmVzaG9sZCA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcubG9zVGhyZXNob2xkKTsKKwkJaWYg KEZTVF9SREIoY2FyZCwgc3VDb25maWcuZW5hYmxlSWRsZUNvZGUpKQorCQkJaW5mby0+aWRsZUNv ZGUgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmlkbGVDb2RlKTsKKwkJZWxzZQorCQkJaW5mby0+ aWRsZUNvZGUgPSAwOworCQlpbmZvLT5yZWNlaXZlQnVmZmVyRGVsYXkgPQorCQkgICAgRlNUX1JE TChjYXJkLCBzdVN0YXR1cy5yZWNlaXZlQnVmZmVyRGVsYXkpOworCQlpbmZvLT5mcmFtaW5nRXJy b3JDb3VudCA9CisJCSAgICBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmZyYW1pbmdFcnJvckNvdW50 KTsKKwkJaW5mby0+Y29kZVZpb2xhdGlvbkNvdW50ID0KKwkJICAgIEZTVF9SREwoY2FyZCwgc3VT dGF0dXMuY29kZVZpb2xhdGlvbkNvdW50KTsKKwkJaW5mby0+Y3JjRXJyb3JDb3VudCA9IEZTVF9S REwoY2FyZCwgc3VTdGF0dXMuY3JjRXJyb3JDb3VudCk7CisJCWluZm8tPmxpbmVBdHRlbnVhdGlv biA9IEZTVF9SREwoY2FyZCwgc3VTdGF0dXMubGluZUF0dGVudWF0aW9uKTsKKwkJaW5mby0+bG9z c09mU2lnbmFsID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5sb3NzT2ZTaWduYWwpOworCQlpbmZv LT5yZWNlaXZlUmVtb3RlQWxhcm0gPQorCQkgICAgRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5yZWNl aXZlUmVtb3RlQWxhcm0pOworCQlpbmZvLT5hbGFybUluZGljYXRpb25TaWduYWwgPQorCQkgICAg RlNUX1JEQihjYXJkLCBzdVN0YXR1cy5hbGFybUluZGljYXRpb25TaWduYWwpOworCX0KIH0KIAot CiBzdGF0aWMgaW50Ci1mc3Rfc2V0X2lmYWNlICggc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQs IHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAotICAgICAgICAgICAgICAgIHN0cnVjdCBpZnJl cSAqaWZyICkKK2ZzdF9zZXRfaWZhY2Uoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVj dCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCSAgICAgIHN0cnVjdCBpZnJlcSAqaWZyKQogewotICAg ICAgICBzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOwotICAgICAgICBpbnQgaTsKKwlzeW5jX3Nl cmlhbF9zZXR0aW5ncyBzeW5jOworCWludCBpOworCisJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNp emUgIT0gc2l6ZW9mIChzeW5jKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY29w eV9mcm9tX3VzZXIKKwkgICAgKCZzeW5jLCBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5j LCBzaXplb2YgKHN5bmMpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAKLSAgICAgICAgaWYg KGNvcHlfZnJvbV91c2VyICgmc3luYywgaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYywK LQkJCSAgICBzaXplb2YgKHN5bmMpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsK LQotICAgICAgICBpZiAoIHN5bmMubG9vcGJhY2sgKQotICAgICAgICAgICAgICAgIHJldHVybiAt RUlOVkFMOwotCi0gICAgICAgIGkgPSBwb3J0LT5pbmRleDsKLQotICAgICAgICBzd2l0Y2ggKGlm ci0+aWZyX3NldHRpbmdzLnR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBJRl9JRkFDRV9W MzU6Ci0gICAgICAgICAgICAgICAgRlNUX1dSVyAoIGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUlu dGVyZmFjZSwgVjM1ICk7Ci0gICAgICAgICAgICAgICAgcG9ydC0+aHdpZiA9IFYzNTsKLSAgICAg ICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIElGX0lGQUNFX1YyNDoKLSAgICAgICAg ICAgICAgICBGU1RfV1JXICggY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBWMjQg KTsKLSAgICAgICAgICAgICAgICBwb3J0LT5od2lmID0gVjI0OwotICAgICAgICAgICAgICAgIGJy ZWFrOwotCi0gICAgICAgIGNhc2UgSUZfSUZBQ0VfWDIxOgotICAgICAgICAgICAgICAgIEZTVF9X UlcgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFgyMSApOwotICAgICAgICAg ICAgICAgIHBvcnQtPmh3aWYgPSBYMjE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAg ICAgY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQot ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAg ICB9Ci0KLSAgICAgICAgc3dpdGNoICggc3luYy5jbG9ja190eXBlICkKLSAgICAgICAgewotICAg ICAgICBjYXNlIENMT0NLX0VYVDoKLSAgICAgICAgICAgICAgICBGU1RfV1JCICggY2FyZCwgcG9y dENvbmZpZ1tpXS5pbnRlcm5hbENsb2NrLCBFWFRDTEsgKTsKLSAgICAgICAgICAgICAgICBicmVh azsKLQotICAgICAgICBjYXNlIENMT0NLX0lOVDoKLSAgICAgICAgICAgICAgICBGU1RfV1JCICgg Y2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5hbENsb2NrLCBJTlRDTEsgKTsKLSAgICAgICAgICAg ICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAt RUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIEZTVF9XUkwgKCBjYXJkLCBwb3J0Q29uZmlnW2ld LmxpbmVTcGVlZCwgc3luYy5jbG9ja19yYXRlICk7Ci0gICAgICAgIHJldHVybiAwOworCWlmIChz eW5jLmxvb3BiYWNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWkgPSBwb3J0LT5pbmRleDsKKwor CXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfSUZBQ0VfVjM1Ogor CQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgVjM1KTsKKwkJcG9y dC0+aHdpZiA9IFYzNTsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX1YyNDoKKwkJRlNUX1dS VyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFYyNCk7CisJCXBvcnQtPmh3aWYg PSBWMjQ7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9YMjE6CisJCUZTVF9XUlcoY2FyZCwg cG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBYMjEpOworCQlwb3J0LT5od2lmID0gWDIxOwor CQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfWDIxRDoKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29u ZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFgyMUQpOworCQlwb3J0LT5od2lmID0gWDIxRDsKKwkJYnJl YWs7CisKKwljYXNlIElGX0lGQUNFX1QxOgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0u bGluZUludGVyZmFjZSwgVDEpOworCQlwb3J0LT5od2lmID0gVDE7CisJCWJyZWFrOworCisJY2Fz ZSBJRl9JRkFDRV9FMToKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZh Y2UsIEUxKTsKKwkJcG9ydC0+aHdpZiA9IEUxOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0Vf U1lOQ19TRVJJQUw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJc3dpdGNoIChzeW5jLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0VYVDoKKwkJRlNU X1dSQihjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2ssIEVYVENMSyk7CisJCWJyZWFr OworCisJY2FzZSBDTE9DS19JTlQ6CisJCUZTVF9XUkIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRl cm5hbENsb2NrLCBJTlRDTEspOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlO VkFMOworCX0KKwlGU1RfV1JMKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkLCBzeW5jLmNs b2NrX3JhdGUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1mc3RfZ2V0X2lmYWNlICgg c3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAot ICAgICAgICAgICAgICAgIHN0cnVjdCBpZnJlcSAqaWZyICkKK2ZzdF9nZXRfaWZhY2Uoc3RydWN0 IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCSAgICAg IHN0cnVjdCBpZnJlcSAqaWZyKQogewotICAgICAgICBzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5j OwotICAgICAgICBpbnQgaTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOworCWludCBpOwor CisJLyogRmlyc3QgY2hlY2sgd2hhdCBsaW5lIHR5cGUgaXMgc2V0LCB3ZSdsbCBkZWZhdWx0IHRv IHJlcG9ydGluZyBYLjIxCisJICogaWYgbm90aGluZyBpcyBzZXQgYXMgSUZfSUZBQ0VfU1lOQ19T RVJJQUwgaW1wbGllcyBpdCBjYW4ndCBiZQorCSAqIGNoYW5nZWQKKwkgKi8KKwlzd2l0Y2ggKHBv cnQtPmh3aWYpIHsKKwljYXNlIEUxOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZB Q0VfRTE7CisJCWJyZWFrOworCWNhc2UgVDE6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJ Rl9JRkFDRV9UMTsKKwkJYnJlYWs7CisJY2FzZSBWMzU6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5 cGUgPSBJRl9JRkFDRV9WMzU7CisJCWJyZWFrOworCWNhc2UgVjI0OgorCQlpZnItPmlmcl9zZXR0 aW5ncy50eXBlID0gSUZfSUZBQ0VfVjI0OworCQlicmVhazsKKwljYXNlIFgyMUQ6CisJCWlmci0+ aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9YMjFEOworCQlicmVhazsKKwljYXNlIFgyMToK KwlkZWZhdWx0OgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfWDIxOworCQli cmVhazsKKwl9CisJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPT0gMCkgeworCQlyZXR1cm4g MDsJLyogb25seSB0eXBlIHJlcXVlc3RlZCAqLworCX0KKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3Mu c2l6ZSA8IHNpemVvZiAoc3luYykpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0gICAgICAg IC8qIEZpcnN0IGNoZWNrIHdoYXQgbGluZSB0eXBlIGlzIHNldCwgd2UnbGwgZGVmYXVsdCB0byBy ZXBvcnRpbmcgWC4yMQotICAgICAgICAgKiBpZiBub3RoaW5nIGlzIHNldCBhcyBJRl9JRkFDRV9T WU5DX1NFUklBTCBpbXBsaWVzIGl0IGNhbid0IGJlCi0gICAgICAgICAqIGNoYW5nZWQKLSAgICAg ICAgICovCi0gICAgICAgIHN3aXRjaCAoIHBvcnQtPmh3aWYgKQotICAgICAgICB7Ci0gICAgICAg IGNhc2UgVjM1OgotICAgICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9J RkFDRV9WMzU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVjI0OgotICAg ICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9WMjQ7Ci0gICAg ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWDIxOgotICAgICAgICBkZWZhdWx0Ogot ICAgICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9YMjE7Ci0g ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCWlmIChpZnItPmlmcl9zZXR0aW5n cy5zaXplIDwgc2l6ZW9mKHN5bmMpKSB7Ci0JCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXpl b2Yoc3luYyk7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KLQkJcmV0dXJuIC1FTk9CVUZTOwotCX0K LQotICAgICAgICBpID0gcG9ydC0+aW5kZXg7Ci0gICAgICAgIHN5bmMuY2xvY2tfcmF0ZSA9IEZT VF9SREwgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVTcGVlZCApOwotICAgICAgICAvKiBMdWNr eSBjYXJkIGFuZCBsaW51eCB1c2Ugc2FtZSBlbmNvZGluZyBoZXJlICovCi0gICAgICAgIHN5bmMu Y2xvY2tfdHlwZSA9IEZTVF9SREIgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2sg KTsKLSAgICAgICAgc3luYy5sb29wYmFjayA9IDA7Ci0KLSAgICAgICAgaWYgKGNvcHlfdG9fdXNl ciAoaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYywgJnN5bmMsCi0JCQkgIHNpemVvZihz eW5jKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJaSA9IHBvcnQtPmluZGV4 OworCXN5bmMuY2xvY2tfcmF0ZSA9IEZTVF9SREwoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lU3Bl ZWQpOworCS8qIEx1Y2t5IGNhcmQgYW5kIGxpbnV4IHVzZSBzYW1lIGVuY29kaW5nIGhlcmUgKi8K KwlzeW5jLmNsb2NrX3R5cGUgPSBGU1RfUkRCKGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxD bG9jaykgPT0KKwkgICAgSU5UQ0xLID8gQ0xPQ0tfSU5UIDogQ0xPQ0tfRVhUOworCXN5bmMubG9v cGJhY2sgPSAwOwogCi0gICAgICAgIHJldHVybiAwOwotfQorCWlmIChjb3B5X3RvX3VzZXIoaWZy LT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYywgJnN5bmMsIHNpemVvZiAoc3luYykpKSB7CisJ CXJldHVybiAtRUZBVUxUOworCX0KIAorCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplb2Yg KHN5bmMpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50Ci1mc3RfaW9jdGwgKCBzdHJ1Y3Qg bmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCApCitmc3RfaW9jdGwo c3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7Ci0g ICAgICAgIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICBzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydDsKLSAgICAgICAgc3RydWN0IGZzdGlvY193cml0ZSB3cnRoZHI7Ci0gICAg ICAgIHN0cnVjdCBmc3Rpb2NfaW5mbyBpbmZvOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdz OwotCi0gICAgICAgIGRiZyAoIERCR19JT0NUTCwiaW9jdGw6ICV4LCAlcFxuIiwgY21kLCBpZnIt Pmlmcl9kYXRhICk7Ci0KLSAgICAgICAgcG9ydCA9IGRldl90b19wb3J0ICggZGV2ICk7Ci0gICAg ICAgIGNhcmQgPSBwb3J0LT5jYXJkOwotCi0gICAgICAgIGlmICggIWNhcGFibGUgKCBDQVBfTkVU X0FETUlOICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKLQotICAgICAgICBzd2l0 Y2ggKCBjbWQgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRlNUQ1BVUkVTRVQ6Ci0gICAgICAg ICAgICAgICAgZnN0X2NwdXJlc2V0ICggY2FyZCApOwotICAgICAgICAgICAgICAgIGNhcmQtPnN0 YXRlID0gRlNUX1JFU0VUOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNh c2UgRlNUQ1BVUkVMRUFTRToKLSAgICAgICAgICAgICAgICBmc3RfY3B1cmVsZWFzZSAoIGNhcmQg KTsKLSAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9TVEFSVElORzsKLSAgICAgICAg ICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBjYXNlIEZTVFdSSVRFOiAgICAgICAgICAgICAg ICAgIC8qIENvZGUgd3JpdGUgKGRvd25sb2FkKSAqLwotCi0gICAgICAgICAgICAgICAgLyogRmly c3QgY29weSBpbiB0aGUgaGVhZGVyIHdpdGggdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGRhdGEK LSAgICAgICAgICAgICAgICAgKiB0byB3cml0ZQotICAgICAgICAgICAgICAgICAqLwotICAgICAg ICAgICAgICAgIGlmICggaWZyLT5pZnJfZGF0YSA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICB7 Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAg ICB9Ci0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlciAoICZ3cnRoZHIsIGlmci0+ aWZyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9m ICggc3RydWN0IGZzdGlvY193cml0ZSApKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAg ICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICB9CisJc3RydWN0 IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3Ry dWN0IGZzdGlvY193cml0ZSB3cnRoZHI7CisJc3RydWN0IGZzdGlvY19pbmZvIGluZm87CisJdW5z aWduZWQgbG9uZyBmbGFnczsKIAotICAgICAgICAgICAgICAgIC8qIFNhbml0eSBjaGVjayB0aGUg cGFyYW1ldGVycy4gV2UgZG9uJ3Qgc3VwcG9ydCBwYXJ0aWFsIHdyaXRlcwotICAgICAgICAgICAg ICAgICAqIHdoZW4gZ29pbmcgb3ZlciB0aGUgdG9wCi0gICAgICAgICAgICAgICAgICovCi0gICAg ICAgICAgICAgICAgaWYgKCB3cnRoZHIuc2l6ZSA+IEZTVF9NRU1TSVpFIHx8IHdydGhkci5vZmZz ZXQgPiBGU1RfTUVNU0laRQotCQkJCXx8IHdydGhkci5zaXplICsgd3J0aGRyLm9mZnNldCA+IEZT VF9NRU1TSVpFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gLUVOWElPOwotICAgICAgICAgICAgICAgIH0KKwlkYmcoREJHX0lPQ1RMLCAiaW9jdGw6 ICV4LCAlcFxuIiwgY21kLCBpZnItPmlmcl9kYXRhKTsKIAotICAgICAgICAgICAgICAgIC8qIE5v dyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBjYXJkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgd2ls bCBwcm9iYWJseSBicmVhayBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCi0gICAgICAgICAgICAgICAg ICogSSdsbCBmaXggaXQgd2hlbiBJIGhhdmUgc29tZXRoaW5nIHRvIHRlc3Qgb24uCi0gICAgICAg ICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlciAoIGNhcmQt Pm1lbSArIHdydGhkci5vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm ci0+aWZyX2RhdGEgKyBzaXplb2YgKCBzdHJ1Y3QgZnN0aW9jX3dyaXRlICksCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHdydGhkci5zaXplICkpCi0gICAgICAgICAgICAgICAgewot ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAg fQorCXBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmQgPSBwb3J0LT5jYXJkOwogCi0gICAg ICAgICAgICAgICAgLyogV3JpdGVzIHRvIHRoZSBtZW1vcnkgb2YgYSBjYXJkIGluIHRoZSByZXNl dCBzdGF0ZSBjb25zdGl0dXRlCi0gICAgICAgICAgICAgICAgICogYSBkb3dubG9hZAotICAgICAg ICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICggY2FyZC0+c3RhdGUgPT0gRlNUX1JF U0VUICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5z dGF0ZSA9IEZTVF9ET1dOTE9BRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg cmV0dXJuIDA7CisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJN OwogCi0gICAgICAgIGNhc2UgRlNUR0VUQ09ORjoKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRlNU Q1BVUkVTRVQ6CisJCWZzdF9jcHVyZXNldChjYXJkKTsKKwkJY2FyZC0+c3RhdGUgPSBGU1RfUkVT RVQ7CisJCXJldHVybiAwOwogCi0gICAgICAgICAgICAgICAgLyogSWYgY2FyZCBoYXMganVzdCBi ZWVuIHN0YXJ0ZWQgY2hlY2sgdGhlIHNoYXJlZCBtZW1vcnkgY29uZmlnCi0gICAgICAgICAgICAg ICAgICogdmVyc2lvbiBhbmQgbWFya2VyCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAg ICAgICAgaWYgKCBjYXJkLT5zdGF0ZSA9PSBGU1RfU1RBUlRJTkcgKQotICAgICAgICAgICAgICAg IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3N0YXJ0ZWRfb2sgKCBjYXJkICk7Ci0K LSAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGV2ZXJ5dGhpbmcgY2hlY2tlZCBvdXQgZW5h YmxlIGNhcmQgaW50ZXJydXB0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjYXJk LT5zdGF0ZSA9PSBGU1RfUlVOTklORyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlICggJmNhcmQtPmNh cmRfbG9jaywgZmxhZ3MgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnN0X2Ns ZWFyX2ludHIgKCBjYXJkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTVF9X UkIgKCBjYXJkLCBpbnRlcnJ1cHRIYW5kc2hha2UsIDB4RUUgKTsKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ss Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZmxhZ3MgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg ICAgICB9CisJY2FzZSBGU1RDUFVSRUxFQVNFOgorCQlmc3RfY3B1cmVsZWFzZShjYXJkKTsKKwkJ Y2FyZC0+c3RhdGUgPSBGU1RfU1RBUlRJTkc7CisJCXJldHVybiAwOwogCi0gICAgICAgICAgICAg ICAgaWYgKCBpZnItPmlmcl9kYXRhID09IE5VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAg ICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KKwlj YXNlIEZTVFdSSVRFOgkJLyogQ29kZSB3cml0ZSAoZG93bmxvYWQpICovCiAKLSAgICAgICAgICAg ICAgICBnYXRoZXJfY29uZl9pbmZvICggY2FyZCwgcG9ydCwgJmluZm8gKTsKKwkJLyogRmlyc3Qg Y29weSBpbiB0aGUgaGVhZGVyIHdpdGggdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGRhdGEKKwkJ ICogdG8gd3JpdGUKKwkJICovCisJCWlmIChpZnItPmlmcl9kYXRhID09IE5VTEwpIHsKKwkJCXJl dHVybiAtRUlOVkFMOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmd3J0aGRyLCBpZnItPmlm cl9kYXRhLAorCQkJCSAgIHNpemVvZiAoc3RydWN0IGZzdGlvY193cml0ZSkpKSB7CisJCQlyZXR1 cm4gLUVGQVVMVDsKKwkJfQogCi0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X3RvX3VzZXIgKCBp ZnItPmlmcl9kYXRhLCAmaW5mbywgc2l6ZW9mICggaW5mbyApKSkKLSAgICAgICAgICAgICAgICB7 Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAg ICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCS8qIFNhbml0eSBjaGVjayB0aGUgcGFy YW1ldGVycy4gV2UgZG9uJ3Qgc3VwcG9ydCBwYXJ0aWFsIHdyaXRlcworCQkgKiB3aGVuIGdvaW5n IG92ZXIgdGhlIHRvcAorCQkgKi8KKwkJaWYgKHdydGhkci5zaXplID4gRlNUX01FTVNJWkUgfHwg d3J0aGRyLm9mZnNldCA+IEZTVF9NRU1TSVpFCisJCSAgICB8fCB3cnRoZHIuc2l6ZSArIHdydGhk ci5vZmZzZXQgPiBGU1RfTUVNU0laRSkgeworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQogCi0gICAg ICAgIGNhc2UgRlNUU0VUQ09ORjoKKwkJLyogTm93IGNvcHkgdGhlIGRhdGEgdG8gdGhlIGNhcmQu CisJCSAqIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCisJ CSAqIEknbGwgZml4IGl0IHdoZW4gSSBoYXZlIHNvbWV0aGluZyB0byB0ZXN0IG9uLgorCQkgKi8K KwkJaWYgKGNvcHlfZnJvbV91c2VyKGNhcmQtPm1lbSArIHdydGhkci5vZmZzZXQsCisJCQkJICAg aWZyLT5pZnJfZGF0YSArIHNpemVvZiAoc3RydWN0IGZzdGlvY193cml0ZSksCisJCQkJICAgd3J0 aGRyLnNpemUpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQogCi0gICAgICAgICAgICAgICAg LyogTW9zdCBvZiB0aGUgc2V0dGluZyBoYXZlIGJlZW4gbW92ZWQgdG8gdGhlIGdlbmVyaWMgaW9j dGxzCi0gICAgICAgICAgICAgICAgICogdGhpcyBqdXN0IGNvdmVycyBkZWJ1ZyBhbmQgYm9hcmQg aWRlbnQgbW9kZSBub3cKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAo IGNvcHlfZnJvbV91c2VyICggJmluZm8sICBpZnItPmlmcl9kYXRhLCBzaXplb2YgKCBpbmZvICkp KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZB VUxUOwotICAgICAgICAgICAgICAgIH0KKwkJLyogV3JpdGVzIHRvIHRoZSBtZW1vcnkgb2YgYSBj YXJkIGluIHRoZSByZXNldCBzdGF0ZSBjb25zdGl0dXRlCisJCSAqIGEgZG93bmxvYWQKKwkJICov CisJCWlmIChjYXJkLT5zdGF0ZSA9PSBGU1RfUkVTRVQpIHsKKwkJCWNhcmQtPnN0YXRlID0gRlNU X0RPV05MT0FEOworCQl9CisJCXJldHVybiAwOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNl dF9jb25mX2Zyb21faW5mbyAoIGNhcmQsIHBvcnQsICZpbmZvICk7CisJY2FzZSBGU1RHRVRDT05G OgogCi0gICAgICAgIGNhc2UgU0lPQ1dBTkRFVjoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGlm ci0+aWZyX3NldHRpbmdzLnR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAg IGNhc2UgSUZfR0VUX0lGQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZzdF9n ZXRfaWZhY2UgKCBjYXJkLCBwb3J0LCBpZnIgKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgSUZf SUZBQ0VfU1lOQ19TRVJJQUw6Ci0gICAgICAgICAgICAgICAgY2FzZSBJRl9JRkFDRV9WMzU6Ci0g ICAgICAgICAgICAgICAgY2FzZSBJRl9JRkFDRV9WMjQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBJ Rl9JRkFDRV9YMjE6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnN0X3NldF9pZmFj ZSAoIGNhcmQsIHBvcnQsIGlmciApOworCQkvKiBJZiBjYXJkIGhhcyBqdXN0IGJlZW4gc3RhcnRl ZCBjaGVjayB0aGUgc2hhcmVkIG1lbW9yeSBjb25maWcKKwkJICogdmVyc2lvbiBhbmQgbWFya2Vy CisJCSAqLworCQlpZiAoY2FyZC0+c3RhdGUgPT0gRlNUX1NUQVJUSU5HKSB7CisJCQljaGVja19z dGFydGVkX29rKGNhcmQpOwogCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiBoZGxjX2lvY3RsICggZGV2LCBpZnIsIGNtZCApOwotICAgICAg ICAgICAgICAgIH0KKwkJCS8qIElmIGV2ZXJ5dGhpbmcgY2hlY2tlZCBvdXQgZW5hYmxlIGNhcmQg aW50ZXJydXB0cyAqLworCQkJaWYgKGNhcmQtPnN0YXRlID09IEZTVF9SVU5OSU5HKSB7CisJCQkJ c3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJCWZzdF9lbmFi bGVfaW50cihjYXJkKTsKKwkJCQlGU1RfV1JCKGNhcmQsIGludGVycnVwdEhhbmRzaGFrZSwgMHhF RSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7 CisJCQl9CisJCX0KIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8qIE5vdCBv bmUgb2Ygb3Vycy4gUGFzcyB0aHJvdWdoIHRvIEhETEMgcGFja2FnZSAqLwotICAgICAgICAgICAg ICAgIHJldHVybiBoZGxjX2lvY3RsICggZGV2LCBpZnIsIGNtZCApOwotICAgICAgICB9Ci19CisJ CWlmIChpZnItPmlmcl9kYXRhID09IE5VTEwpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAK KwkJZ2F0aGVyX2NvbmZfaW5mbyhjYXJkLCBwb3J0LCAmaW5mbyk7CiAKLXN0YXRpYyB2b2lkCi1m c3Rfb3BlbnBvcnQgKCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCApCi17Ci0gICAgICAgIGlu dCBzaWduYWxzOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZpbmZvLCBzaXpl b2YgKGluZm8pKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CiAKLSAg ICAgICAgLyogT25seSBpbml0IHRoaW5ncyBpZiBjYXJkIGlzIGFjdHVhbGx5IHJ1bm5pbmcuIFRo aXMgYWxsb3dzIG9wZW4gdG8KLSAgICAgICAgICogc3VjY2VlZCBmb3IgZG93bmxvYWRzIGV0Yy4K LSAgICAgICAgICovCi0gICAgICAgIGlmICggcG9ydC0+Y2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5J TkcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBwb3J0LT5ydW4gKQotICAgICAg ICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRiZyAoIERCR19PUEVOLCJvcGVu OiBmb3VuZCBwb3J0IGFscmVhZHkgcnVubmluZ1xuIik7CisJY2FzZSBGU1RTRVRDT05GOgogCi0g ICAgICAgICAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9ydCwgU1RPUFBPUlQgKTsK LSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnJ1biA9IDA7Ci0gICAgICAgICAgICAgICAg fQorCQkvKgorCQkgKiBNb3N0IG9mIHRoZSBzZXR0aW5ncyBoYXZlIGJlZW4gbW92ZWQgdG8gdGhl IGdlbmVyaWMgaW9jdGxzCisJCSAqIHRoaXMganVzdCBjb3ZlcnMgZGVidWcgYW5kIGJvYXJkIGlk ZW50IG5vdworCQkgKi8KKworCQlpZiAoY2FyZC0+c3RhdGUgIT0gRlNUX1JVTk5JTkcpIHsKKwkJ CXByaW50a19lcnIKKwkJCSAgICAoIkF0dGVtcHQgdG8gY29uZmlndXJlIGNhcmQgJWQgaW4gbm9u LXJ1bm5pbmcgc3RhdGUgKCVkKVxuIiwKKwkJCSAgICAgY2FyZC0+Y2FyZF9ubywgY2FyZC0+c3Rh dGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBp ZnItPmlmcl9kYXRhLCBzaXplb2YgKGluZm8pKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0K IAotICAgICAgICAgICAgICAgIGZzdF9yeF9jb25maWcgKCBwb3J0ICk7Ci0gICAgICAgICAgICAg ICAgZnN0X3R4X2NvbmZpZyAoIHBvcnQgKTsKLSAgICAgICAgICAgICAgICBmc3Rfb3BfcmFpc2Ug KCBwb3J0LCBPUFNUU19SVFMgfCBPUFNUU19EVFIgKTsKKwkJcmV0dXJuIHNldF9jb25mX2Zyb21f aW5mbyhjYXJkLCBwb3J0LCAmaW5mbyk7CiAKLSAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21k ICggcG9ydCwgU1RBUlRQT1JUICk7Ci0gICAgICAgICAgICAgICAgcG9ydC0+cnVuID0gMTsKKwlj YXNlIFNJT0NXQU5ERVY6CisJCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCQlj YXNlIElGX0dFVF9JRkFDRToKKwkJCXJldHVybiBmc3RfZ2V0X2lmYWNlKGNhcmQsIHBvcnQsIGlm cik7CisKKwkJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDoKKwkJY2FzZSBJRl9JRkFDRV9WMzU6 CisJCWNhc2UgSUZfSUZBQ0VfVjI0OgorCQljYXNlIElGX0lGQUNFX1gyMToKKwkJY2FzZSBJRl9J RkFDRV9YMjFEOgorCQljYXNlIElGX0lGQUNFX1QxOgorCQljYXNlIElGX0lGQUNFX0UxOgorCQkJ cmV0dXJuIGZzdF9zZXRfaWZhY2UoY2FyZCwgcG9ydCwgaWZyKTsKKworCQljYXNlIElGX1BST1RP X1JBVzoKKwkJCXBvcnQtPm1vZGUgPSBGU1RfUkFXOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBJ Rl9HRVRfUFJPVE86CisJCQlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKSB7CisJCQkJaWZyLT5p ZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX1JBVzsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJ CXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJCWRlZmF1bHQ6CisJCQlwb3J0 LT5tb2RlID0gRlNUX0dFTl9IRExDOworCQkJZGJnKERCR19JT0NUTCwgIlBhc3NpbmcgdGhpcyB0 eXBlIHRvIGhkbGMgJXhcbiIsCisJCQkgICAgaWZyLT5pZnJfc2V0dGluZ3MudHlwZSk7CisJCQly ZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwkJfQogCi0gICAgICAgICAgICAgICAg c2lnbmFscyA9IEZTVF9SREwgKCBwb3J0LT5jYXJkLCB2MjREZWJvdW5jZWRTdHNbcG9ydC0+aW5k ZXhdKTsKLSAgICAgICAgICAgICAgICBpZiAoIHNpZ25hbHMgJiAoKCBwb3J0LT5od2lmID09IFgy MSApID8gSVBTVFNfSU5ESUNBVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDogSVBTVFNfRENEICkpCi0gICAgICAgICAgICAgICAgICAgICAg ICBuZXRpZl9jYXJyaWVyX29uICggcG9ydF90b19kZXYgKCBwb3J0ICkpOwotICAgICAgICAgICAg ICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb2ZmICggcG9y dF90b19kZXYgKCBwb3J0ICkpOwotICAgICAgICB9CisJZGVmYXVsdDoKKwkJLyogTm90IG9uZSBv ZiBvdXJzLiBQYXNzIHRocm91Z2ggdG8gSERMQyBwYWNrYWdlICovCisJCXJldHVybiBoZGxjX2lv Y3RsKGRldiwgaWZyLCBjbWQpOworCX0KIH0KIAogc3RhdGljIHZvaWQKLWZzdF9jbG9zZXBvcnQg KCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCApCitmc3Rfb3BlbnBvcnQoc3RydWN0IGZzdF9w b3J0X2luZm8gKnBvcnQpCiB7Ci0gICAgICAgIGlmICggcG9ydC0+Y2FyZC0+c3RhdGUgPT0gRlNU X1JVTk5JTkcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBwb3J0LT5ydW4gKQot ICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnJ1biA9IDA7 Ci0gICAgICAgICAgICAgICAgICAgICAgICBmc3Rfb3BfbG93ZXIgKCBwb3J0LCBPUFNUU19SVFMg fCBPUFNUU19EVFIgKTsKKwlpbnQgc2lnbmFsczsKKwlpbnQgdHhxX2xlbmd0aDsKKworCS8qIE9u bHkgaW5pdCB0aGluZ3MgaWYgY2FyZCBpcyBhY3R1YWxseSBydW5uaW5nLiBUaGlzIGFsbG93cyBv cGVuIHRvCisJICogc3VjY2VlZCBmb3IgZG93bmxvYWRzIGV0Yy4KKwkgKi8KKwlpZiAocG9ydC0+ Y2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpIHsKKwkJaWYgKHBvcnQtPnJ1bikgeworCQkJZGJn KERCR19PUEVOLCAib3BlbjogZm91bmQgcG9ydCBhbHJlYWR5IHJ1bm5pbmdcbiIpOworCisJCQlm c3RfaXNzdWVfY21kKHBvcnQsIFNUT1BQT1JUKTsKKwkJCXBvcnQtPnJ1biA9IDA7CisJCX0KKwor CQlmc3RfcnhfY29uZmlnKHBvcnQpOworCQlmc3RfdHhfY29uZmlnKHBvcnQpOworCQlmc3Rfb3Bf cmFpc2UocG9ydCwgT1BTVFNfUlRTIHwgT1BTVFNfRFRSKTsKKworCQlmc3RfaXNzdWVfY21kKHBv cnQsIFNUQVJUUE9SVCk7CisJCXBvcnQtPnJ1biA9IDE7CisKKwkJc2lnbmFscyA9IEZTVF9SREwo cG9ydC0+Y2FyZCwgdjI0RGVib3VuY2VkU3RzW3BvcnQtPmluZGV4XSk7CisJCWlmIChzaWduYWxz ICYgKCgocG9ydC0+aHdpZiA9PSBYMjEpIHx8IChwb3J0LT5od2lmID09IFgyMUQpKQorCQkJICAg ICAgID8gSVBTVFNfSU5ESUNBVEUgOiBJUFNUU19EQ0QpKQorCQkJbmV0aWZfY2Fycmllcl9vbihw b3J0X3RvX2Rldihwb3J0KSk7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBvcnRfdG9f ZGV2KHBvcnQpKTsKKworCQl0eHFfbGVuZ3RoID0gcG9ydC0+dHhxZSAtIHBvcnQtPnR4cXM7CisJ CXBvcnQtPnR4cWUgPSAwOworCQlwb3J0LT50eHFzID0gMDsKKwl9CiAKLSAgICAgICAgICAgICAg ICAgICAgICAgIGZzdF9pc3N1ZV9jbWQgKCBwb3J0LCBTVE9QUE9SVCApOwotICAgICAgICAgICAg ICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAg ICAgICAgICAgICAgICAgZGJnICggREJHX09QRU4sImNsb3NlOiBwb3J0IG5vdCBydW5uaW5nXG4i KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIH0KIAorc3RhdGljIHZvaWQKK2ZzdF9j bG9zZXBvcnQoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJaWYgKHBvcnQtPmNhcmQt PnN0YXRlID09IEZTVF9SVU5OSU5HKSB7CisJCWlmIChwb3J0LT5ydW4pIHsKKwkJCXBvcnQtPnJ1 biA9IDA7CisJCQlmc3Rfb3BfbG93ZXIocG9ydCwgT1BTVFNfUlRTIHwgT1BTVFNfRFRSKTsKKwor CQkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVE9QUE9SVCk7CisJCX0gZWxzZSB7CisJCQlkYmcoREJH X09QRU4sICJjbG9zZTogcG9ydCBub3QgcnVubmluZ1xuIik7CisJCX0KKwl9Cit9CiAKIHN0YXRp YyBpbnQKLWZzdF9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitmc3Rfb3BlbihzdHJ1 Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgICAgICBpbnQgZXJyOworCWludCBlcnI7CisJc3Ry dWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CiAKLSAgICAgICAgZXJyID0gaGRsY19vcGVuIChkZXYp OwotICAgICAgICBpZiAoIGVyciApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwlwb3J0 ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkK KyAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisJaWYgKHBvcnQtPm1vZGUgIT0gRlNUX1JBVykg eworCQllcnIgPSBoZGxjX29wZW4oZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJ fQogCi0gICAgICAgIGZzdF9vcGVucG9ydCAoIGRldl90b19wb3J0ICggZGV2ICkpOwotICAgICAg ICBuZXRpZl93YWtlX3F1ZXVlICggZGV2ICk7Ci0gICAgICAgIHJldHVybiAwOworCWZzdF9vcGVu cG9ydChwb3J0KTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CiB9CiAKIHN0 YXRpYyBpbnQKLWZzdF9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorZnN0X2Nsb3Nl KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIG5ldGlmX3N0b3BfcXVldWUgKCBk ZXYgKTsKLSAgICAgICAgZnN0X2Nsb3NlcG9ydCAoIGRldl90b19wb3J0ICggZGV2ICkpOwotICAg ICAgICBoZGxjX2Nsb3NlICggZGV2ICk7Ci0gICAgICAgIHJldHVybiAwOworCXN0cnVjdCBmc3Rf cG9ydF9pbmZvICpwb3J0OworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXVuc2lnbmVk IGNoYXIgdHhfZG1hX2RvbmU7CisJdW5zaWduZWQgY2hhciByeF9kbWFfZG9uZTsKKworCXBvcnQg PSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmQgPSBwb3J0LT5jYXJkOworCisJdHhfZG1hX2RvbmUg PSBpbmIoY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IxKTsKKwlyeF9kbWFfZG9uZSA9IGluYihjYXJk LT5wY2lfY29uZiArIERNQUNTUjApOworCWRiZyhEQkdfT1BFTiwKKwkgICAgIlBvcnQgQ2xvc2U6 IHR4X2RtYV9pbl9wcm9ncmVzcyA9ICVkICgleCkgcnhfZG1hX2luX3Byb2dyZXNzID0gJWQgKCV4 KVxuIiwKKwkgICAgY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MsIHR4X2RtYV9kb25lLCBjYXJkLT5k bWFyeF9pbl9wcm9ncmVzcywKKwkgICAgcnhfZG1hX2RvbmUpOworCisJbmV0aWZfc3RvcF9xdWV1 ZShkZXYpOworCWZzdF9jbG9zZXBvcnQoZGV2X3RvX3BvcnQoZGV2KSk7CisJaWYgKHBvcnQtPm1v ZGUgIT0gRlNUX1JBVykgeworCQloZGxjX2Nsb3NlKGRldik7CisJfQorCW1vZHVsZV9wdXQoVEhJ U19NT0RVTEUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1mc3RfYXR0YWNoICggc3Ry dWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsIHVuc2lnbmVkIHNo b3J0IHBhcml0eSApCitmc3RfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVk IHNob3J0IGVuY29kaW5nLCB1bnNpZ25lZCBzaG9ydCBwYXJpdHkpCiB7Ci0gICAgICAgIC8qIFNl dHRpbmcgY3VycmVudGx5IGZpeGVkIGluIEZhclN5bmMgY2FyZCBzbyB3ZSBjaGVjayBhbmQgZm9y Z2V0ICovCi0gICAgICAgIGlmICggZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaIHx8IHBhcml0eSAh PSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZB TDsKLSAgICAgICAgcmV0dXJuIDA7CisJLyoKKwkgKiBTZXR0aW5nIGN1cnJlbnRseSBmaXhlZCBp biBGYXJTeW5jIGNhcmQgc28gd2UgY2hlY2sgYW5kIGZvcmdldAorCSAqLworCWlmIChlbmNvZGlu ZyAhPSBFTkNPRElOR19OUlogfHwgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpCisJ CXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkCi1mc3RfdHhf dGltZW91dCAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorZnN0X3R4X3RpbWVvdXQoc3RydWN0 IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICAgICAgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7 CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNh cmQ7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOwog Ci0gICAgICAgIGRiZyAoIERCR19JTlRSIHwgREJHX1RYLCJ0eF90aW1lb3V0XG4iKTsKLQotICAg ICAgICBwb3J0ID0gZGV2X3RvX3BvcnQgKCBkZXYgKTsKLQotICAgICAgICBzdGF0cy0+dHhfZXJy b3JzKys7Ci0gICAgICAgIHN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOwotCi0gICAgICAgIGlm ICggcG9ydC0+dHhjbnQgPiAwICkKLSAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9y dCwgQUJPUlRUWCApOwotCi0gICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotICAg ICAgICBuZXRpZl93YWtlX3F1ZXVlICggZGV2ICk7CisJcG9ydCA9IGRldl90b19wb3J0KGRldik7 CisJY2FyZCA9IHBvcnQtPmNhcmQ7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9h Ym9ydGVkX2Vycm9ycysrOworCWRiZyhEQkdfQVNTLCAiVHggdGltZW91dCBjYXJkICVkIHBvcnQg JWRcbiIsCisJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwlmc3RfaXNzdWVfY21k KHBvcnQsIEFCT1JUVFgpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZf d2FrZV9xdWV1ZShkZXYpOworCXBvcnQtPnN0YXJ0ID0gMDsKIH0KIAotCiBzdGF0aWMgaW50Ci1m c3Rfc3RhcnRfeG1pdCAoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpk ZXYgKQorZnN0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZp Y2UgKmRldikKIHsKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydDsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0 YXRzKGRldik7Ci0gICAgICAgIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICBz dHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKLSAgICAgICAgdW5zaWduZWQgY2hhciBkbWFiaXRz OwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICBpbnQgcGk7Ci0gICAgICAg IGludCB0eHA7Ci0KLSAgICAgICAgcG9ydCA9IGRldl90b19wb3J0ICggZGV2ICk7Ci0gICAgICAg IGNhcmQgPSBwb3J0LT5jYXJkOwotCi0gICAgICAgIC8qIERyb3AgcGFja2V0IHdpdGggZXJyb3Ig aWYgd2UgZG9uJ3QgaGF2ZSBjYXJyaWVyICovCi0gICAgICAgIGlmICggISBuZXRpZl9jYXJyaWVy X29rICggZGV2ICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiICgg c2tiICk7Ci0gICAgICAgICAgICAgICAgc3RhdHMtPnR4X2Vycm9ycysrOwotICAgICAgICAgICAg ICAgIHN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOwotICAgICAgICAgICAgICAgIHJldHVybiAw OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRHJvcCBpdCBpZiBpdCdzIHRvbyBiaWchIE1UVSBm YWlsdXJlID8gKi8KLSAgICAgICAgaWYgKCBza2ItPmxlbiA+IExFTl9UWF9CVUZGRVIgKQotICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgZGJnICggREJHX1RYLCJQYWNrZXQgdG9vIGxhcmdlICVk IHZzICVkXG4iLCBza2ItPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIExFTl9UWF9CVUZGRVIgKTsKLSAgICAgICAgICAgICAgICBkZXZfa2ZyZWVf c2tiICggc2tiICk7Ci0gICAgICAgICAgICAgICAgc3RhdHMtPnR4X2Vycm9ycysrOwotICAgICAg ICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgd2UgaGF2 ZSBhIGJ1ZmZlciAqLwotICAgICAgICBwaSA9IHBvcnQtPmluZGV4OwotICAgICAgICBzcGluX2xv Y2tfaXJxc2F2ZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0gICAgICAgIHR4cCA9IHBv cnQtPnR4cG9zOwotICAgICAgICBkbWFiaXRzID0gRlNUX1JEQiAoIGNhcmQsIHR4RGVzY3JSaW5n W3BpXVt0eHBdLmJpdHMgKTsKLSAgICAgICAgaWYgKCBkbWFiaXRzICYgRE1BX09XTiApCi0gICAg ICAgIHsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlICggJmNhcmQtPmNh cmRfbG9jaywgZmxhZ3MgKTsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfVFgsIk91dCBvZiBU eCBidWZmZXJzXG4iKTsKLSAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiICggc2tiICk7Ci0g ICAgICAgICAgICAgICAgc3RhdHMtPnR4X2Vycm9ycysrOwotICAgICAgICAgICAgICAgIHJldHVy biAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICggKytwb3J0LT50eHBvcyA+PSBOVU1fVFhfQlVG RkVSICkKLSAgICAgICAgICAgICAgICBwb3J0LT50eHBvcyA9IDA7Ci0KLSAgICAgICAgaWYgKCAr K3BvcnQtPnR4Y250ID49IE5VTV9UWF9CVUZGRVIgKQotICAgICAgICAgICAgICAgIG5ldGlmX3N0 b3BfcXVldWUgKCBkZXYgKTsKLQotICAgICAgICAvKiBSZWxlYXNlIHRoZSBjYXJkIGxvY2sgYmVm b3JlIHdlIGNvcHkgdGhlIGRhdGEgYXMgd2Ugbm93IGhhdmUKLSAgICAgICAgICogZXhjbHVzaXZl IGFjY2VzcyB0byB0aGUgYnVmZmVyLgotICAgICAgICAgKi8KLSAgICAgICAgc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0KLSAgICAgICAgLyogRW5x dWV1ZSB0aGUgcGFja2V0ICovCi0gICAgICAgIG1lbWNweV90b2lvICggY2FyZC0+bWVtICsgQlVG X09GRlNFVCAoIHR4QnVmZmVyW3BpXVt0eHBdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4gKTsKLSAgICAgICAg RlNUX1dSVyAoIGNhcmQsIHR4RGVzY3JSaW5nW3BpXVt0eHBdLmJjbnQsIGNudl9iY250ICggc2ti LT5sZW4gKSk7Ci0gICAgICAgIEZTVF9XUkIgKCBjYXJkLCB0eERlc2NyUmluZ1twaV1bdHhwXS5i aXRzLCBETUFfT1dOIHwgVFhfU1RQIHwgVFhfRU5QICk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsK KwlpbnQgdHhxX2xlbmd0aDsKIAotICAgICAgICBzdGF0cy0+dHhfcGFja2V0cysrOwotICAgICAg ICBzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJcG9ydCA9IGRldl90b19wb3J0KGRldik7 CisJY2FyZCA9IHBvcnQtPmNhcmQ7CisJZGJnKERCR19UWCwgImZzdF9zdGFydF94bWl0OiBsZW5n dGggPSAlZFxuIiwgc2tiLT5sZW4pOworCisJLyogRHJvcCBwYWNrZXQgd2l0aCBlcnJvciBpZiB3 ZSBkb24ndCBoYXZlIGNhcnJpZXIgKi8KKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkgewor CQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJc3RhdHMtPnR4 X2NhcnJpZXJfZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLAorCQkgICAgIlRyaWVkIHRvIHRyYW5z bWl0IGJ1dCBubyBjYXJyaWVyIG9uIGNhcmQgJWQgcG9ydCAlZFxuIiwKKwkJICAgIGNhcmQtPmNh cmRfbm8sIHBvcnQtPmluZGV4KTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgICAgIGRldl9rZnJl ZV9za2IgKCBza2IgKTsKKwkvKiBEcm9wIGl0IGlmIGl0J3MgdG9vIGJpZyEgTVRVIGZhaWx1cmUg PyAqLworCWlmIChza2ItPmxlbiA+IExFTl9UWF9CVUZGRVIpIHsKKwkJZGJnKERCR19BU1MsICJQ YWNrZXQgdG9vIGxhcmdlICVkIHZzICVkXG4iLCBza2ItPmxlbiwKKwkJICAgIExFTl9UWF9CVUZG RVIpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJcmV0 dXJuIDA7CisJfQogCi0gICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotICAgICAg ICByZXR1cm4gMDsKLX0KKwkvKgorCSAqIFdlIGFyZSBhbHdheXMgZ29pbmcgdG8gcXVldWUgdGhl IHBhY2tldAorCSAqIHNvIHRoYXQgdGhlIGJvdHRvbSBoYWxmIGlzIHRoZSBvbmx5IHBsYWNlIHdl IHR4IGZyb20KKwkgKiBDaGVjayB0aGVyZSBpcyByb29tIGluIHRoZSBwb3J0IHR4cQorCSAqLwor CXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlpZiAoKHR4cV9s ZW5ndGggPSBwb3J0LT50eHFlIC0gcG9ydC0+dHhxcykgPCAwKSB7CisJCS8qCisJCSAqIFRoaXMg aXMgdGhlIGNhc2Ugd2hlcmUgdGhlIG5leHQgZnJlZSBoYXMgd3JhcHBlZCBidXQgdGhlCisJCSAq IGxhc3QgdXNlZCBoYXNuJ3QKKwkJICovCisJCXR4cV9sZW5ndGggPSB0eHFfbGVuZ3RoICsgRlNU X1RYUV9ERVBUSDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2Nr LCBmbGFncyk7CisJaWYgKHR4cV9sZW5ndGggPiBmc3RfdHhxX2hpZ2gpIHsKKwkJLyoKKwkJICog V2UgaGF2ZSBnb3QgZW5vdWdoIGJ1ZmZlcnMgaW4gdGhlIHBpcGVsaW5lLiAgQXNrIHRoZSBuZXR3 b3JrCisJCSAqIGxheWVyIHRvIHN0b3Agc2VuZGluZyBmcmFtZXMgZG93bgorCQkgKi8KKwkJbmV0 aWZfc3RvcF9xdWV1ZShkZXYpOworCQlwb3J0LT5zdGFydCA9IDE7CS8qIEknbSB1c2luZyB0aGlz IHRvIHNpZ25hbCBzdG9wIHNlbnQgdXAgKi8KKwl9CisKKwlpZiAodHhxX2xlbmd0aCA9PSBGU1Rf VFhRX0RFUFRIIC0gMSkgeworCQkvKgorCQkgKiBUaGlzIHNob3VsZG4ndCBoYXZlIGhhcHBlbmVk IGJ1dCBzdWNoIGlzIGxpZmUKKwkJICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMt PnR4X2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlR4IHF1ZXVlIG92ZXJmbG93IGNhcmQgJWQg cG9ydCAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwkJcmV0dXJu IDA7CisJfQorCisJLyoKKwkgKiBxdWV1ZSB0aGUgYnVmZmVyCisJICovCisJc3Bpbl9sb2NrX2ly cXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCXBvcnQtPnR4cVtwb3J0LT50eHFlXSA9 IHNrYjsKKwlwb3J0LT50eHFlKys7CisJaWYgKHBvcnQtPnR4cWUgPT0gRlNUX1RYUV9ERVBUSCkK KwkJcG9ydC0+dHhxZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9s b2NrLCBmbGFncyk7CisKKwkvKiBTY2VoZHVsZSB0aGUgYm90dG9tIGhhbGYgd2hpY2ggbm93IGRv ZXMgdHJhbnNtaXQgcHJvY2Vzc2luZyAqLworCWZzdF9xX3dvcmtfaXRlbSgmZnN0X3dvcmtfdHhx LCBjYXJkLT5jYXJkX25vKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfdHhfdGFzayk7CiAKKwly ZXR1cm4gMDsKK30KIAogLyoKICAqICAgICAgQ2FyZCBzZXR1cCBoYXZpbmcgY2hlY2tlZCBoYXJk d2FyZSByZXNvdXJjZXMuCkBAIC0xNDQwLDIyICsyMzk4LDI2IEBACiAgKiAgICAgIGRpc2FibGVk LgogICovCiBzdGF0aWMgY2hhciAqdHlwZV9zdHJpbmdzW10gX19kZXZpbml0ZGF0YSA9IHsKLSAg ICAgICAgIm5vIGhhcmR3YXJlIiwgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgbmV2ZXIgYmUg c2VlbiAqLwotICAgICAgICAiRmFyU3luYyBUMlAiLAotICAgICAgICAiRmFyU3luYyBUNFAiCisJ Im5vIGhhcmR3YXJlIiwJCS8qIFNob3VsZCBuZXZlciBiZSBzZWVuICovCisJIkZhclN5bmMgVDJQ IiwKKwkiRmFyU3luYyBUNFAiLAorCSJGYXJTeW5jIFQxVSIsCisJIkZhclN5bmMgVDJVIiwKKwki RmFyU3luYyBUNFUiLAorCSJGYXJTeW5jIFRFMSIKIH07CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5p dAotZnN0X2luaXRfY2FyZCAoIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkICkKK2ZzdF9pbml0 X2NhcmQoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCiB7Ci0gICAgICAgIGludCBpOwotICAg ICAgICBpbnQgZXJyOworCWludCBpOworCWludCBlcnI7CiAKLSAgICAgICAgLyogV2UncmUgd29y a2luZyBvbiBhIG51bWJlciBvZiBwb3J0cyBiYXNlZCBvbiB0aGUgY2FyZCBJRC4gSWYgdGhlCi0g ICAgICAgICAqIGZpcm13YXJlIGRldGVjdHMgc29tZXRoaW5nIGRpZmZlcmVudCBsYXRlciAoc2hv dWxkIG5ldmVyIGhhcHBlbikKLSAgICAgICAgICogd2UnbGwgaGF2ZSB0byByZXZpc2UgaXQgaW4g c29tZSB3YXkgdGhlbi4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IGNh cmQtPm5wb3J0cyA7IGkrKyApIHsKKwkvKiBXZSdyZSB3b3JraW5nIG9uIGEgbnVtYmVyIG9mIHBv cnRzIGJhc2VkIG9uIHRoZSBjYXJkIElELiBJZiB0aGUKKwkgKiBmaXJtd2FyZSBkZXRlY3RzIHNv bWV0aGluZyBkaWZmZXJlbnQgbGF0ZXIgKHNob3VsZCBuZXZlciBoYXBwZW4pCisJICogd2UnbGwg aGF2ZSB0byByZXZpc2UgaXQgaW4gc29tZSB3YXkgdGhlbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBp IDwgY2FyZC0+bnBvcnRzOyBpKyspIHsKICAgICAgICAgICAgICAgICBlcnIgPSByZWdpc3Rlcl9o ZGxjX2RldmljZShjYXJkLT5wb3J0c1tpXS5kZXYpOwogICAgICAgICAgICAgICAgIGlmIChlcnIg PCAwKSB7CiAJCQlpbnQgajsKQEAgLTE0NjgsNjIgKzI0MzAsMTIwIEBACiAgICAgICAgICAgICAg ICAgICAgICAgICBjYXJkLT5ucG9ydHMgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJl YWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICB9CisJfQogCi0gICAgICAgIHByaW50ayAo IEtFUk5fSU5GTyAiJXMtJXM6ICVzIElSUSVkLCAlZCBwb3J0c1xuIiwKLSAgICAgICAgICAgICAg ICAgICAgICAgIHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1swXSktPm5hbWUsCi0gICAgICAgICAg ICAgICAgICAgICAgICBwb3J0X3RvX2RldigmY2FyZC0+cG9ydHNbY2FyZC0+bnBvcnRzLTFdKS0+ bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RyaW5nc1tjYXJkLT50eXBlXSwg Y2FyZC0+aXJxLCBjYXJkLT5ucG9ydHMgKTsKKwlwcmludGtfaW5mbygiJXMtJXM6ICVzIElSUSVk LCAlZCBwb3J0c1xuIiwKKwkgICAgICAgcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzWzBdKS0+bmFt ZSwKKwkgICAgICAgcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzW2NhcmQtPm5wb3J0cyAtIDFdKS0+ bmFtZSwKKwkgICAgICAgdHlwZV9zdHJpbmdzW2NhcmQtPnR5cGVdLCBjYXJkLT5pcnEsIGNhcmQt Pm5wb3J0cyk7CiB9CiAKLQogLyoKICAqICAgICAgSW5pdGlhbGlzZSBjYXJkIHdoZW4gZGV0ZWN0 ZWQuCiAgKiAgICAgIFJldHVybnMgMCB0byBpbmRpY2F0ZSBzdWNjZXNzLCBvciBlcnJubyBvdGhl cndpc2UuCiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0Ci1mc3RfYWRkX29uZSAoIHN0cnVjdCBw Y2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICkKK2ZzdF9hZGRf b25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50 KQogewotICAgICAgICBzdGF0aWMgaW50IGZpcnN0dGltZV9kb25lID0gMDsKLSAgICAgICAgc3Ry dWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7Ci0gICAgICAgIGludCBlcnIgPSAwOworCXN0YXRpYyBp bnQgZmlyc3R0aW1lX2RvbmUgPSAwOworCXN0YXRpYyBpbnQgbm9fb2ZfY2FyZHNfYWRkZWQgPSAw OworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCWludCBlcnIgPSAwOwogCWludCBpOwog Ci0gICAgICAgIGlmICggISBmaXJzdHRpbWVfZG9uZSApCi0gICAgICAgIHsKLSAgICAgICAgICAg ICAgICBwcmludGsgKCBLRVJOX0lORk8gIkZhclN5bmMgWDIxIGRyaXZlciAiIEZTVF9VU0VSX1ZF UlNJT04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoYykgMjAwMSBGYXJTaXRl IENvbW11bmljYXRpb25zIEx0ZC5cbiIpOwotICAgICAgICAgICAgICAgIGZpcnN0dGltZV9kb25l ID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIGRyaXZlciBwcml2YXRlIGRh dGEgKi8KLSAgICAgICAgY2FyZCA9IGttYWxsb2MgKCBzaXplb2YgKCBzdHJ1Y3QgZnN0X2NhcmRf aW5mbyApLCAgR0ZQX0tFUk5FTCk7Ci0gICAgICAgIGlmIChjYXJkID09IE5VTEwpCi0gICAgICAg IHsKLSAgICAgICAgICAgICAgICBwcmludGtfZXJyICgiRmFyU3luYyBjYXJkIGZvdW5kIGJ1dCBp bnN1ZmZpY2llbnQgbWVtb3J5IGZvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IiBkcml2ZXIgc3RvcmFnZVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0g ICAgICAgIH0KLSAgICAgICAgbWVtc2V0ICggY2FyZCwgMCwgc2l6ZW9mICggc3RydWN0IGZzdF9j YXJkX2luZm8gKSk7Ci0KLSAgICAgICAgLyogVHJ5IHRvIGVuYWJsZSB0aGUgZGV2aWNlICovCi0g ICAgICAgIGlmICgoIGVyciA9IHBjaV9lbmFibGVfZGV2aWNlICggcGRldiApKSAhPSAwICkKLSAg ICAgICAgewotICAgICAgICAgICAgICAgIHByaW50a19lcnIgKCJGYWlsZWQgdG8gZW5hYmxlIGNh cmQuIEVyciAlZFxuIiwgLWVyciApOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZnJlZV9j YXJkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmVjb3JkIGluZm8gd2UgbmVlZCovCi0gICAg ICAgIGNhcmQtPmlycSAgICAgICAgID0gcGRldi0+aXJxOwotICAgICAgICBjYXJkLT5wY2lfY29u ZiAgICA9IHBjaV9yZXNvdXJjZV9zdGFydCAoIHBkZXYsIDEgKTsKLSAgICAgICAgY2FyZC0+cGh5 c19tZW0gICAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKCBwZGV2LCAyICk7Ci0gICAgICAgIGNhcmQt PnBoeXNfY3RsbWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0ICggcGRldiwgMyApOworCWlmICghZmly c3R0aW1lX2RvbmUpIHsKKwkJcHJpbnRrX2luZm8oIkZhclN5bmMgV0FOIGRyaXZlciAiIEZTVF9V U0VSX1ZFUlNJT04KKwkJICAgICAgICIgKGMpIDIwMDEtMjAwNCBGYXJTaXRlIENvbW11bmljYXRp b25zIEx0ZC5cbiIpOworCQlmaXJzdHRpbWVfZG9uZSA9IDE7CisJCWRiZyhEQkdfQVNTLCAiVGhl IHZhbHVlIG9mIGRlYnVnIG1hc2sgaXMgJXhcbiIsIGZzdF9kZWJ1Z19tYXNrKTsKKwl9CisKKwkv KgorCSAqIFdlIGFyZSBnb2luZyB0byBiZSBjbGV2ZXIgYW5kIGFsbG93IGNlcnRhaW4gY2FyZHMg bm90IHRvIGJlCisJICogY29uZmlndXJlZC4gIEFuIGV4Y2x1ZGUgbGlzdCBjYW4gYmUgcHJvdmlk ZWQgaW4gL2V0Yy9tb2R1bGVzLmNvbmYKKwkgKi8KKwlpZiAoZnN0X2V4Y2x1ZGVkX2NhcmRzICE9 IDApIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIGNhcmRzIHRvIGV4Y2x1ZGUKKwkJICoKKwkJICov CisJCWZvciAoaSA9IDA7IGkgPCBmc3RfZXhjbHVkZWRfY2FyZHM7IGkrKykgeworCQkJaWYgKChw ZGV2LT5kZXZmbikgPj4gMyA9PSBmc3RfZXhjbHVkZWRfbGlzdFtpXSkgeworCQkJCXByaW50a19p bmZvKCJGYXJTeW5jIFBDSSBkZXZpY2UgJWQgbm90IGFzc2lnbmVkXG4iLAorCQkJCSAgICAgICAo cGRldi0+ZGV2Zm4pID4+IDMpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCX0KKwl9CisK KwkvKiBBbGxvY2F0ZSBkcml2ZXIgcHJpdmF0ZSBkYXRhICovCisJY2FyZCA9IGttYWxsb2Moc2l6 ZW9mIChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChjYXJkID09IE5V TEwpIHsKKwkJcHJpbnRrX2VycigiRmFyU3luYyBjYXJkIGZvdW5kIGJ1dCBpbnN1ZmZpY2llbnQg bWVtb3J5IGZvciIKKwkJCSAgICIgZHJpdmVyIHN0b3JhZ2VcbiIpOworCQlyZXR1cm4gLUVOT01F TTsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZiAoc3RydWN0IGZzdF9jYXJkX2luZm8pKTsK KworCS8qIFRyeSB0byBlbmFibGUgdGhlIGRldmljZSAqLworCWlmICgoZXJyID0gcGNpX2VuYWJs ZV9kZXZpY2UocGRldikpICE9IDApIHsKKwkJcHJpbnRrX2VycigiRmFpbGVkIHRvIGVuYWJsZSBj YXJkLiBFcnIgJWRcbiIsIC1lcnIpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9 CisKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIkZhclN5bmMiKSkgIT0w KSB7CisJICAgICAgICBwcmludGtfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaW9ucy4gRXJy ICVkXG4iLCAtZXJyKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShjYXJk KTsKKwkgICAgICAgIHJldHVybiBlcnI7CisJfQorCisJLyogR2V0IHZpcnR1YWwgYWRkcmVzc2Vz IG9mIG1lbW9yeSByZWdpb25zICovCisJY2FyZC0+cGNpX2NvbmYgPSBwY2lfcmVzb3VyY2Vfc3Rh cnQocGRldiwgMSk7CisJY2FyZC0+cGh5c19tZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwg Mik7CisJY2FyZC0+cGh5c19jdGxtZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyk7CisJ aWYgKChjYXJkLT5tZW0gPSBpb3JlbWFwKGNhcmQtPnBoeXNfbWVtLCBGU1RfTUVNU0laRSkpID09 IE5VTEwpIHsKKwkJcHJpbnRrX2VycigiUGh5c2ljYWwgbWVtb3J5IHJlbWFwIGZhaWxlZFxuIik7 CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2 KTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoKGNhcmQtPmN0 bG1lbSA9IGlvcmVtYXAoY2FyZC0+cGh5c19jdGxtZW0sIDB4MTApKSA9PSBOVUxMKSB7CisJCXBy aW50a19lcnIoIkNvbnRyb2wgbWVtb3J5IHJlbWFwIGZhaWxlZFxuIik7CisJCXBjaV9yZWxlYXNl X3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJa2ZyZWUoY2Fy ZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkYmcoREJHX1BDSSwgImtlcm5lbCBtZW0gJXAs IGN0bG1lbSAlcFxuIiwgY2FyZC0+bWVtLCBjYXJkLT5jdGxtZW0pOwogCi0gICAgICAgIGNhcmQt PnR5cGUgICAgICAgID0gZW50LT5kcml2ZXJfZGF0YTsKLSAgICAgICAgY2FyZC0+bnBvcnRzICAg ICAgPSAoIGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDJQICkgPyAyIDogNDsKKwkvKiBS ZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEocGRldi0+ aXJxLCBmc3RfaW50ciwgU0FfU0hJUlEsIEZTVF9ERVZfTkFNRSwgY2FyZCkpIHsKKwkJcHJpbnRr X2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGludGVycnVwdCAlZFxuIiwgY2FyZC0+aXJxKTsKKwkJ cGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwor CQlpb3VubWFwKGNhcmQtPmN0bG1lbSk7CisJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJa2ZyZWUo Y2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KIAotICAgICAgICBjYXJkLT5zdGF0ZSAgICAg ICA9IEZTVF9VTklOSVQ7CisJLyogUmVjb3JkIGluZm8gd2UgbmVlZCAqLworCWNhcmQtPmlycSA9 IHBkZXYtPmlycTsKKwljYXJkLT50eXBlID0gZW50LT5kcml2ZXJfZGF0YTsKKwljYXJkLT5mYW1p bHkgPSAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDJQKSB8fAorCQkJKGVudC0+ZHJp dmVyX2RhdGEgPT0gRlNUX1RZUEVfVDRQKSkKKwkgICAgPyBGU1RfRkFNSUxZX1RYUCA6IEZTVF9G QU1JTFlfVFhVOworCWlmICgoZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9UMVUpIHx8CisJ ICAgIChlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1RFMSkpCisJCWNhcmQtPm5wb3J0cyA9 IDE7CisJZWxzZQorCQljYXJkLT5ucG9ydHMgPSAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZ UEVfVDJQKSB8fAorCQkJCShlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyVSkpID8gMiA6 IDQ7CiAKKwljYXJkLT5zdGF0ZSA9IEZTVF9VTklOSVQ7CiAgICAgICAgIHNwaW5fbG9ja19pbml0 ICggJmNhcmQtPmNhcmRfbG9jayApOwogCiAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IGNhcmQt Pm5wb3J0cyA7IGkrKyApIHsKQEAgLTE1MzMsNyArMjU1MywxMyBAQAogCQkJd2hpbGUgKGktLSkK IAkJCQlmcmVlX25ldGRldihjYXJkLT5wb3J0c1tpXS5kZXYpOwogCQkJcHJpbnRrX2VyciAoIkZh clN5bmM6IG91dCBvZiBtZW1vcnlcbiIpOwotCQkJZ290byBlcnJvcl9mcmVlX2NhcmQ7CisgICAg ICAgICAgICAgICAgICAgICAgICBmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworICAgICAgICAg ICAgICAgICAgICAgICAgcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyAgICAgICAgICAgICAg ICAgICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyAgICAgICAgICAgICAgICAgICAg ICAgIGlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvdW5t YXAoY2FyZC0+bWVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGNhcmQpOworICAg ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAkJY2FyZC0+cG9ydHNb aV0uZGV2ICAgID0gZGV2OwogICAgICAgICAgICAgICAgIGNhcmQtPnBvcnRzW2ldLmNhcmQgICA9 IGNhcmQ7CkBAIC0xNTY0LDEyOCArMjU5MCw5NSBAQAogICAgICAgICAgICAgICAgIGhkbGMtPnht aXQgICA9IGZzdF9zdGFydF94bWl0OwogCX0KIAotICAgICAgICBkYmcgKCBEQkdfUENJLCJ0eXBl ICVkIG5wb3J0cyAlZCBpcnEgJWRcbiIsIGNhcmQtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAg ICAgICBjYXJkLT5ucG9ydHMsIGNhcmQtPmlycSApOwotICAgICAgICBkYmcgKCBEQkdfUENJLCJj b25mICUwNHggbWVtICUwOHggY3RsbWVtICUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAg ICBjYXJkLT5wY2lfY29uZiwgY2FyZC0+cGh5c19tZW0sIGNhcmQtPnBoeXNfY3RsbWVtICk7Ci0K LSAgICAgICAgLyogQ2hlY2sgd2UgY2FuIGdldCBhY2Nlc3MgdG8gdGhlIG1lbW9yeSBhbmQgSS9P IHJlZ2lvbnMgKi8KLSAgICAgICAgaWYgKCAhIHJlcXVlc3RfcmVnaW9uICggY2FyZC0+cGNpX2Nv bmYsIDB4ODAsIlBMWCBjb25maWcgcmVncyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAg cHJpbnRrX2VyciAoIlVuYWJsZSB0byBnZXQgY29uZmlnIEkvTyBAIDB4JTA0WFxuIiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPnBjaV9jb25m ICk7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVOT0RFVjsKLSAgICAgICAgICAgICAgICBnb3Rv IGVycm9yX2ZyZWVfcG9ydHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhIHJlcXVlc3RfbWVt X3JlZ2lvbiAoIGNhcmQtPnBoeXNfbWVtLCBGU1RfTUVNU0laRSwiU2hhcmVkIFJBTSIpKQotICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIlVuYWJsZSB0byBnZXQgbWFpbiBt ZW1vcnkgQCAweCUwOFhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjYXJkLT5waHlzX21lbSApOwotICAgICAgICAgICAgICAgIGVyciA9IC1FTk9E RVY7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZWxlYXNlX2lvOwotICAgICAgICB9Ci0g ICAgICAgIGlmICggISByZXF1ZXN0X21lbV9yZWdpb24gKCBjYXJkLT5waHlzX2N0bG1lbSwgMHgx MCwiQ29udHJvbCBtZW1vcnkiKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50a19l cnIgKCJVbmFibGUgdG8gZ2V0IGNvbnRyb2wgbWVtb3J5IEAgMHglMDhYXG4iLAotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+cGh5c19jdGxtZW0g KTsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRU5PREVWOwotICAgICAgICAgICAgICAgIGdvdG8g ZXJyb3JfcmVsZWFzZV9tZW07Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIEdldCB2aXJ0dWFs IGFkZHJlc3NlcyBvZiBtZW1vcnkgcmVnaW9ucyAqLwotICAgICAgICBpZiAoKCBjYXJkLT5tZW0g PSBpb3JlbWFwICggY2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFICkpID09IE5VTEwgKQotICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIlBoeXNpY2FsIG1lbW9yeSByZW1h cCBmYWlsZWRcbiIpOwotICAgICAgICAgICAgICAgIGVyciA9IC1FTk9ERVY7Ci0gICAgICAgICAg ICAgICAgZ290byBlcnJvcl9yZWxlYXNlX2N0bG1lbTsKLSAgICAgICAgfQotICAgICAgICBpZiAo KCBjYXJkLT5jdGxtZW0gPSBpb3JlbWFwICggY2FyZC0+cGh5c19jdGxtZW0sIDB4MTAgKSkgPT0g TlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGtfZXJyICgiQ29udHJvbCBt ZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRU5PREVWOwot ICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfdW5tYXBfbWVtOwotICAgICAgICB9Ci0gICAgICAg IGRiZyAoIERCR19QQ0ksImtlcm5lbCBtZW0gJXAsIGN0bG1lbSAlcFxuIiwgY2FyZC0+bWVtLCBj YXJkLT5jdGxtZW0pOwotCi0gICAgICAgIC8qIFJlc2V0IHRoZSBjYXJkJ3MgcHJvY2Vzc29yICov Ci0gICAgICAgIGZzdF9jcHVyZXNldCAoIGNhcmQgKTsKLSAgICAgICAgY2FyZC0+c3RhdGUgPSBG U1RfUkVTRVQ7Ci0KLSAgICAgICAgLyogUmVnaXN0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyICov Ci0gICAgICAgIGlmICggcmVxdWVzdF9pcnEgKCBjYXJkLT5pcnEsIGZzdF9pbnRyLCBTQV9TSElS USwgRlNUX0RFVl9OQU1FLCBjYXJkICkpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgICAgIHBy aW50a19lcnIgKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW50ZXJydXB0ICVkXG4iLCBjYXJkLT5pcnEg KTsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRU5PREVWOwotICAgICAgICAgICAgICAgIGdvdG8g ZXJyb3JfdW5tYXBfY3RsbWVtOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmVjb3JkIGRyaXZl ciBkYXRhIGZvciBsYXRlciB1c2UgKi8KLSAgICAgICAgcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNh cmQpOwotCi0gICAgICAgIC8qIFJlbWFpbmRlciBvZiBjYXJkIHNldHVwICovCi0gICAgICAgIGZz dF9pbml0X2NhcmQgKCBjYXJkICk7Ci0KLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAg ICAgICAgICAvKiBTdWNjZXNzICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC8qIEZhaWx1cmUuIFJlbGVhc2UgcmVzb3VyY2VzICovCi1lcnJvcl91bm1hcF9j dGxtZW06Ci0gICAgICAgIGlvdW5tYXAgKCBjYXJkLT5jdGxtZW0gKTsKLQotZXJyb3JfdW5tYXBf bWVtOgotICAgICAgICBpb3VubWFwICggY2FyZC0+bWVtICk7Ci0KLWVycm9yX3JlbGVhc2VfY3Rs bWVtOgotICAgICAgICByZWxlYXNlX21lbV9yZWdpb24gKCBjYXJkLT5waHlzX2N0bG1lbSwgMHgx MCApOwotCi1lcnJvcl9yZWxlYXNlX21lbToKLSAgICAgICAgcmVsZWFzZV9tZW1fcmVnaW9uICgg Y2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFICk7Ci0KLWVycm9yX3JlbGVhc2VfaW86Ci0gICAg ICAgIHJlbGVhc2VfcmVnaW9uICggY2FyZC0+cGNpX2NvbmYsIDB4ODAgKTsKLQotZXJyb3JfZnJl ZV9wb3J0czoKLQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnBvcnRzOyBpKyspCi0JCWZyZWVfbmV0 ZGV2KGNhcmQtPnBvcnRzW2ldLmRldik7Ci1lcnJvcl9mcmVlX2NhcmQ6Ci0gICAgICAgIGtmcmVl ICggY2FyZCApOwotICAgICAgICByZXR1cm4gZXJyOwotfQorCWNhcmQtPmRldmljZSA9IHBkZXY7 CiAKKwlkYmcoREJHX1BDSSwgInR5cGUgJWQgbnBvcnRzICVkIGlycSAlZFxuIiwgY2FyZC0+dHlw ZSwKKwkgICAgY2FyZC0+bnBvcnRzLCBjYXJkLT5pcnEpOworCWRiZyhEQkdfUENJLCAiY29uZiAl MDR4IG1lbSAlMDh4IGN0bG1lbSAlMDh4XG4iLAorCSAgICBjYXJkLT5wY2lfY29uZiwgY2FyZC0+ cGh5c19tZW0sIGNhcmQtPnBoeXNfY3RsbWVtKTsKKworCS8qIFJlc2V0IHRoZSBjYXJkJ3MgcHJv Y2Vzc29yICovCisJZnN0X2NwdXJlc2V0KGNhcmQpOworCWNhcmQtPnN0YXRlID0gRlNUX1JFU0VU OworCisJLyogSW5pdGlhbGlzZSBETUEgKGlmIHJlcXVpcmVkKSAqLworCWZzdF9pbml0X2RtYShj YXJkKTsKKworCS8qIFJlY29yZCBkcml2ZXIgZGF0YSBmb3IgbGF0ZXIgdXNlICovCisJcGNpX3Nl dF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCisJLyogUmVtYWluZGVyIG9mIGNhcmQgc2V0dXAgKi8K Kwlmc3RfY2FyZF9hcnJheVtub19vZl9jYXJkc19hZGRlZF0gPSBjYXJkOworCWNhcmQtPmNhcmRf bm8gPSBub19vZl9jYXJkc19hZGRlZCsrOwkvKiBSZWNvcmQgaW5zdGFuY2UgYW5kIGJ1bXAgaXQg Ki8KKwlmc3RfaW5pdF9jYXJkKGNhcmQpOworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlM WV9UWFUpIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSBkbWEgYnVmZmVyIGZvciB0cmFuc21pdCBh bmQgcmVjZWl2ZXMKKwkJICovCisJCWNhcmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCA9CisJCSAgICBw Y2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCQkgJmNh cmQtPnJ4X2RtYV9oYW5kbGVfY2FyZCk7CisJCWlmIChjYXJkLT5yeF9kbWFfaGFuZGxlX2hvc3Qg PT0gTlVMTCkgeworCQkJcHJpbnRrX2VycigiQ291bGQgbm90IGFsbG9jYXRlIHJ4IGRtYSBidWZm ZXJcbiIpOworCQkJZnN0X2Rpc2FibGVfaW50cihjYXJkKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lv bnMocGRldik7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlpb3VubWFwKGNhcmQt PmN0bG1lbSk7CisJCQlpb3VubWFwKGNhcmQtPm1lbSk7CisJCQlrZnJlZShjYXJkKTsKKwkJCXJl dHVybiAtRU5PTUVNOworCQl9CisJCWNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCA9CisJCSAgICBw Y2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCQkgJmNh cmQtPnR4X2RtYV9oYW5kbGVfY2FyZCk7CisJCWlmIChjYXJkLT50eF9kbWFfaGFuZGxlX2hvc3Qg PT0gTlVMTCkgeworCQkJcHJpbnRrX2VycigiQ291bGQgbm90IGFsbG9jYXRlIHR4IGRtYSBidWZm ZXJcbiIpOworCQkJZnN0X2Rpc2FibGVfaW50cihjYXJkKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lv bnMocGRldik7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlpb3VubWFwKGNhcmQt PmN0bG1lbSk7CisJCQlpb3VubWFwKGNhcmQtPm1lbSk7CisJCQlrZnJlZShjYXJkKTsKKwkJCXJl dHVybiAtRU5PTUVNOworCQl9CisJfQorCXJldHVybiAwOwkJLyogU3VjY2VzcyAqLworfQogCiAv KgogICogICAgICBDbGVhbnVwIGFuZCBjbG9zZSBkb3duIGEgY2FyZAogICovCiBzdGF0aWMgdm9p ZCBfX2RldmV4aXQKLWZzdF9yZW1vdmVfb25lICggc3RydWN0IHBjaV9kZXYgKnBkZXYgKQorZnN0 X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0gICAgICAgIHN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOwotICAgICAgICBpbnQgaTsKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAq Y2FyZDsKKwlpbnQgaTsKIAotICAgICAgICBjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwor CWNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLSAgICAgICAgZm9yICggaSA9IDAgOyBp IDwgY2FyZC0+bnBvcnRzIDsgaSsrICkKLSAgICAgICAgeworCWZvciAoaSA9IDA7IGkgPCBjYXJk LT5ucG9ydHM7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYo JmNhcmQtPnBvcnRzW2ldKTsKLSAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNl KGRldik7Ci0gICAgICAgIH0KLQotICAgICAgICBmc3RfZGlzYWJsZV9pbnRyICggY2FyZCApOwot ICAgICAgICBmcmVlX2lycSAoIGNhcmQtPmlycSwgY2FyZCApOwotCi0gICAgICAgIGlvdW5tYXAg KCBjYXJkLT5jdGxtZW0gKTsKLSAgICAgICAgaW91bm1hcCAoIGNhcmQtPm1lbSApOwotCi0gICAg ICAgIHJlbGVhc2VfbWVtX3JlZ2lvbiAoIGNhcmQtPnBoeXNfY3RsbWVtLCAweDEwICk7Ci0gICAg ICAgIHJlbGVhc2VfbWVtX3JlZ2lvbiAoIGNhcmQtPnBoeXNfbWVtLCBGU1RfTUVNU0laRSApOwot ICAgICAgICByZWxlYXNlX3JlZ2lvbiAoIGNhcmQtPnBjaV9jb25mLCAweDgwICk7CisJCXVucmVn aXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnBv cnRzOyBpKyspCi0JCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzW2ldLmRldik7CisJZnN0X2Rpc2Fi bGVfaW50cihjYXJkKTsKKwlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwogCi0gICAgICAgIGtm cmVlICggY2FyZCApOworCWlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKwlpb3VubWFwKGNhcmQtPm1l bSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZT VF9GQU1JTFlfVFhVKSB7CisJCS8qCisJCSAqIEZyZWUgZG1hIGJ1ZmZlcnMKKwkJICovCisJCXBj aV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+ZGV2aWNlLCBGU1RfTUFYX01UVSwKKwkJCQkgICAgY2Fy ZC0+cnhfZG1hX2hhbmRsZV9ob3N0LAorCQkJCSAgICBjYXJkLT5yeF9kbWFfaGFuZGxlX2NhcmQp OworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPmRldmljZSwgRlNUX01BWF9NVFUsCisJCQkJ ICAgIGNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCwKKwkJCQkgICAgY2FyZC0+dHhfZG1hX2hhbmRs ZV9jYXJkKTsKKwl9CisJZnN0X2NhcmRfYXJyYXlbY2FyZC0+Y2FyZF9ub10gPSBOVUxMOwogfQog CiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZnN0X2RyaXZlciA9IHsKQEAgLTE3MDAsMTUgKzI2 OTMsMjAgQEAKIHN0YXRpYyBpbnQgX19pbml0CiBmc3RfaW5pdCh2b2lkKQogewotICAgICAgICBy ZXR1cm4gcGNpX21vZHVsZV9pbml0ICggJmZzdF9kcml2ZXIgKTsKKwlpbnQgaTsKKworCWZvciAo aSA9IDA7IGkgPCBGU1RfTUFYX0NBUkRTOyBpKyspCisJCWZzdF9jYXJkX2FycmF5W2ldID0gTlVM TDsKKwlzcGluX2xvY2tfaW5pdCgmZnN0X3dvcmtfcV9sb2NrKTsKKwlyZXR1cm4gcGNpX21vZHVs ZV9pbml0KCZmc3RfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CiBmc3RfY2xlYW51 cF9tb2R1bGUodm9pZCkKIHsKLSAgICAgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyICggJmZzdF9k cml2ZXIgKTsKKwlwcmludGtfaW5mbygiRmFyU3luYyBXQU4gZHJpdmVyIHVubG9hZGluZ1xuIik7 CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZmc3RfZHJpdmVyKTsKIH0KIAotbW9kdWxlX2luaXQg KCBmc3RfaW5pdCApOwotbW9kdWxlX2V4aXQgKCBmc3RfY2xlYW51cF9tb2R1bGUgKTsKLQorbW9k dWxlX2luaXQoZnN0X2luaXQpOworbW9kdWxlX2V4aXQoZnN0X2NsZWFudXBfbW9kdWxlKTsKZGlm ZiAtdXJOIGxpbnV4LTIuNi40LXByZTEtb3JpZy9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5oIGxp bnV4L2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmgKLS0tIGxpbnV4LTIuNi40LXByZTEtb3JpZy9k cml2ZXJzL25ldC93YW4vZmFyc3luYy5oCTIwMDQtMDMtMDEgMDk6MTc6MDguMDAwMDAwMDAwICsw MDAwCisrKyBsaW51eC9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5oCTIwMDQtMDMtMDEgMDk6MjU6 MjUuMDAwMDAwMDAwICswMDAwCkBAIC0zMiw4ICszMiwxMyBAQAogICogICAgICBBIHNob3J0IGNv bW1vbiBwcmVmaXggaXMgdXNlZnVsIGZvciByb3V0aW5lcyB3aXRoaW4gdGhlIGRyaXZlciB0byBh dm9pZAogICogICAgICBjb25mbGljdCB3aXRoIG90aGVyIHNpbWlsYXIgZHJpdmVycyBhbmQgSSBj aG9zZW4gdG8gdXNlICJmc3RfIiBmb3IgdGhpcwogICogICAgICBwdXJwb3NlIChGYXJTaXRlIFQt c2VyaWVzKS4KKyAqCisgKiAgICAgIEZpbmFsbHkgdGhlIGRldmljZSBkcml2ZXIgbmVlZHMgYSBz aG9ydCBuZXR3b3JrIGludGVyZmFjZSBuYW1lLiBTaW5jZQorICogICAgICAiaGRsYyIgaXMgYWxy ZWFkeSBpbiB1c2UgSSd2ZSBjaG9zZW4gdGhlIGV2ZW4gbGVzcyBpbmZvcm1hdGl2ZSAic3luYyIK KyAqICAgICAgZm9yIHRoZSBwcmVzZW50LgogICovCiAjZGVmaW5lIEZTVF9OQU1FICAgICAgICAg ICAgICAgICJmc3QiICAgICAgICAgICAvKiBJbiBkZWJ1Zy9pbmZvIGV0YyAqLworI2RlZmluZSBG U1RfTkRFVl9OQU1FICAgICAgICAgICAic3luYyIgICAgICAgICAgLyogRm9yIG5ldCBpbnRlcmZh Y2UgKi8KICNkZWZpbmUgRlNUX0RFVl9OQU1FICAgICAgICAgICAgImZhcnN5bmMiICAgICAgIC8q IEZvciBtaXNjIGludGVyZmFjZXMgKi8KIAogCkBAIC00NSw3ICs1MCw3IEBACiAgKiAgICAgIGhh dmUgaW5kaXZpZHVhbCB2ZXJzaW9ucyAob3IgSURzKSB0aGF0IG1vdmUgbXVjaCBmYXN0ZXIgdGhh biB0aGUKICAqICAgICAgdGhlIHJlbGVhc2UgdmVyc2lvbiBhcyBpbmRpdmlkdWFsIHVwZGF0ZXMg YXJlIHRyYWNrZWQuCiAgKi8KLSNkZWZpbmUgRlNUX1VTRVJfVkVSU0lPTiAgICAgICAgIjAuMDki CisjZGVmaW5lIEZTVF9VU0VSX1ZFUlNJT04gICAgICAgICIxLjA0IgogCiAKIC8qICAgICAgSW9j dGwgY2FsbCBjb21tYW5kIHZhbHVlcwpAQCAtMTAwLDYgKzEwNSw3IEBACiAgICAgICAgIHVuc2ln bmVkIGludCAgIHN0YXRlOyAgICAgICAgICAgLyogU3RhdGUgb2YgY2FyZCAqLwogICAgICAgICB1 bnNpZ25lZCBpbnQgICBpbmRleDsgICAgICAgICAgIC8qIEluZGV4IG9mIHBvcnQgaW9jdGwgd2Fz IGlzc3VlZCBvbiAqLwogICAgICAgICB1bnNpZ25lZCBpbnQgICBzbWNGaXJtd2FyZVZlcnNpb247 CisgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtlcm5lbFZlcnNpb247ICAgLyogV2hhdCBLZXJuZWwg dmVyc2lvbiB3ZSBhcmUgd29ya2luZyB3aXRoICovCiAgICAgICAgIHVuc2lnbmVkIHNob3J0IGxp bmVJbnRlcmZhY2U7ICAgLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KICAgICAgICAgdW5z aWduZWQgY2hhciAgcHJvdG87ICAgICAgICAgICAvKiBMaW5lIHByb3RvY29sICovCiAgICAgICAg IHVuc2lnbmVkIGNoYXIgIGludGVybmFsQ2xvY2s7ICAgLyogMSA9PiBpbnRlcm5hbCBjbG9jaywg MCA9PiBleHRlcm5hbCAqLwpAQCAtMTEwLDYgKzExNiwzMSBAQAogICAgICAgICB1bnNpZ25lZCBz aG9ydCBjYWJsZVN0YXR1czsgICAgIC8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQgKi8K ICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2FyZE1vZGU7ICAgICAgICAvKiBsc2I6IExFRCBpZCBt b2RlICovCiAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlYnVnOyAgICAgICAgICAgLyogRGVidWcg ZmxhZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgdHJhbnNwYXJlbnRNb2RlOyAvKiBOb3Qg dXNlZCBhbHdheXMgMCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpbnZlcnRDbG9jazsgICAg IC8qIEludmVydCBjbG9jayBmZWF0dXJlIGZvciBzeW5jaW5nICovCisgICAgICAgIHVuc2lnbmVk IGNoYXIgIHN0YXJ0aW5nU2xvdDsgICAgLyogVGltZSBzbG90IHRvIHVzZSBmb3Igc3RhcnQgb2Yg dHggKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgY2xvY2tTb3VyY2U7ICAgICAvKiBFeHRlcm5h bCBvciBpbnRlcm5hbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBmcmFtaW5nOyAgICAgICAg IC8qIEUxLCBUMSBvciBKMSAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBzdHJ1Y3R1cmU7ICAg ICAgIC8qIHVuZnJhbWVkLCBkb3VibGUsIGNyYzQsIGY0LCBmMTIsICovCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZjI0IGY3MiAqLworICAgICAgICB1bnNpZ25l ZCBjaGFyICBpbnRlcmZhY2U7ICAgICAgIC8qIHJqNDhjIG9yIGJuYyAqLworICAgICAgICB1bnNp Z25lZCBjaGFyICBjb2Rpbmc7ICAgICAgICAgIC8qIGhkYjMgYjh6cyAqLworICAgICAgICB1bnNp Z25lZCBjaGFyICBsaW5lQnVpbGRPdXQ7ICAgIC8qIDAsIC03LjUsIC0xNSwgLTIyICovCisgICAg ICAgIHVuc2lnbmVkIGNoYXIgIGVxdWFsaXplcjsgICAgICAgLyogc2hvcnQgb3IgbG9uIGhhdWwg c2V0dGluZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgbG9vcE1vZGU7ICAgICAgICAvKiB2 YXJpb3VzIGxvb3BiYWNrcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICByYW5nZTsgICAgICAg ICAgIC8qIGNhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgdHhCdWZmZXJN b2RlOyAgICAvKiB0eCBlbGFzdGljIGJ1ZmZlciBkZXB0aCAqLworICAgICAgICB1bnNpZ25lZCBj aGFyICByeEJ1ZmZlck1vZGU7ICAgIC8qIHJ4IGVsYXN0aWMgYnVmZmVyIGRlcHRoICovCisgICAg ICAgIHVuc2lnbmVkIGNoYXIgIGxvc1RocmVzaG9sZDsgICAgLyogQXR0ZW51YXRpb24gb24gTE9T IHNpZ25hbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpZGxlQ29kZTsgICAgICAgIC8qIFZh bHVlIHRvIHNlbmQgYXMgaWRsZSB0aW1lc2xvdCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBy ZWNlaXZlQnVmZmVyRGVsYXk7IC8qIGRlbGF5IHRocm8gcnggYnVmZmVyIHRpbWVzbG90cyAqLwor ICAgICAgICB1bnNpZ25lZCBpbnQgICBmcmFtaW5nRXJyb3JDb3VudDsgLyogZnJhbWluZyBlcnJv cnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgY29kZVZpb2xhdGlvbkNvdW50OyAvKiBjb2Rl IHZpb2xhdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgY3JjRXJyb3JDb3VudDsgICAv KiBDUkMgZXJyb3JzICovCisgICAgICAgIGludCAgICAgICAgICAgIGxpbmVBdHRlbnVhdGlvbjsg LyogaW4gZEIqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb3NzT2ZTaWduYWw7CisgICAgICAg IHVuc2lnbmVkIHNob3J0IHJlY2VpdmVSZW1vdGVBbGFybTsKKyAgICAgICAgdW5zaWduZWQgc2hv cnQgYWxhcm1JbmRpY2F0aW9uU2lnbmFsOwogfTsKIAogLyogInZhbGlkIiBiaXRtYXNrICovCkBA IC0xMzEsMTMgKzE2MiwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqLwogI2RlZmluZSBGU1RWQUxfUFJPVE8gICAgMHgwMDAwMDIwMCAgICAgIC8qIHByb3Rv ICovCiAjZGVmaW5lIEZTVFZBTF9NT0RFICAgICAweDAwMDAwNDAwICAgICAgLyogY2FyZE1vZGUg Ki8KKyNkZWZpbmUgRlNUVkFMX1BIQVNFICAgIDB4MDAwMDA4MDAgICAgICAvKiBDbG9jayBwaGFz ZSAqLworI2RlZmluZSBGU1RWQUxfVEUxICAgICAgMHgwMDAwMTAwMCAgICAgIC8qIFQxRTEgQ29u ZmlndXJhdGlvbiAqLwogI2RlZmluZSBGU1RWQUxfREVCVUcgICAgMHg4MDAwMDAwMCAgICAgIC8q IGRlYnVnICovCi0jZGVmaW5lIEZTVFZBTF9BTEwgICAgICAweDAwMDAwN0ZGICAgICAgLyogTm90 ZTogZG9lcyBub3QgaW5jbHVkZSBERUJVRyBmbGFnICovCisjZGVmaW5lIEZTVFZBTF9BTEwgICAg ICAweDAwMDAxRkZGICAgICAgLyogTm90ZTogZG9lcyBub3QgaW5jbHVkZSBERUJVRyBmbGFnICov CiAKIC8qICJ0eXBlIiAqLwogI2RlZmluZSBGU1RfVFlQRV9OT05FICAgMCAgICAgICAgICAgICAg IC8qIFByb2JhYmx5IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KICNkZWZpbmUgRlNUX1RZUEVfVDJQ ICAgIDEgICAgICAgICAgICAgICAvKiBUMlAgWDIxIDIgcG9ydCBjYXJkICovCiAjZGVmaW5lIEZT VF9UWVBFX1Q0UCAgICAyICAgICAgICAgICAgICAgLyogVDRQIFgyMSA0IHBvcnQgY2FyZCAqLwor I2RlZmluZSBGU1RfVFlQRV9UMVUgICAgMyAgICAgICAgICAgICAgIC8qIFQxVSBYMjEgMSBwb3J0 IGNhcmQgKi8KKyNkZWZpbmUgRlNUX1RZUEVfVDJVICAgIDQgICAgICAgICAgICAgICAvKiBUMlUg WDIxIDIgcG9ydCBjYXJkICovCisjZGVmaW5lIEZTVF9UWVBFX1Q0VSAgICA1ICAgICAgICAgICAg ICAgLyogVDRVIFgyMSA0IHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9URTEgICAgNiAg ICAgICAgICAgICAgIC8qIFQxRTEgWDIxIDEgcG9ydCBjYXJkICovCisKKy8qICJmYW1pbHkiICov CisjZGVmaW5lIEZTVF9GQU1JTFlfVFhQICAwICAgICAgICAgICAgICAgLyogVDJQIG9yIFQ0UCAq LworI2RlZmluZSBGU1RfRkFNSUxZX1RYVSAgMSAgICAgICAgICAgICAgIC8qIFQxVSBvciBUMlUg b3IgVDRVICovCiAKIC8qICJzdGF0ZSIgKi8KICNkZWZpbmUgRlNUX1VOSU5JVCAgICAgIDAgICAg ICAgICAgICAgICAvKiBSYXcgdW5pbml0aWFsaXNlZCBzdGF0ZSBmb2xsb3dpbmcKQEAgLTE1NSw2 ICsxOTYsMTAgQEAKICNkZWZpbmUgVjI0ICAgICAgICAgICAgIDEKICNkZWZpbmUgWDIxICAgICAg ICAgICAgIDIKICNkZWZpbmUgVjM1ICAgICAgICAgICAgIDMKKyNkZWZpbmUgWDIxRCAgICAgICAg ICAgIDQKKyNkZWZpbmUgVDEgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRTEgICAgICAgICAgICAg IDYKKyNkZWZpbmUgSjEgICAgICAgICAgICAgIDcKIAogLyogInByb3RvIiAqLwogI2RlZmluZSBG U1RfSERMQyAgICAgICAgMSAgICAgICAgICAgICAgIC8qIENpc2NvIGNvbXBhdGlibGUgSERMQyAq LwpAQCAtMTg3LDYgKzIzMiw5NyBAQAogLyogImNhcmRNb2RlIiBiaXRtYXNrICovCiAjZGVmaW5l IENBUkRfTU9ERV9JREVOVElGWSAgICAgIDB4MDAwMQogCisvKiAKKyAqIENvbnN0YW50cyBmb3Ig VDEvRTEgY29uZmlndXJhdGlvbgorICovCisKKy8qCisgKiBDbG9jayBzb3VyY2UKKyAqLworI2Rl ZmluZSBDTE9DS0lOR19TTEFWRSAgICAgICAwCisjZGVmaW5lIENMT0NLSU5HX01BU1RFUiAgICAg IDEKKworLyoKKyAqIEZyYW1pbmcKKyAqLworI2RlZmluZSBGUkFNSU5HX0UxICAgICAgICAgICAw CisjZGVmaW5lIEZSQU1JTkdfSjEgICAgICAgICAgIDEKKyNkZWZpbmUgRlJBTUlOR19UMSAgICAg ICAgICAgMgorCisvKgorICogU3RydWN0dXJlCisgKi8KKyNkZWZpbmUgU1RSVUNUVVJFX1VORlJB TUVEICAgMAorI2RlZmluZSBTVFJVQ1RVUkVfRTFfRE9VQkxFICAxCisjZGVmaW5lIFNUUlVDVFVS RV9FMV9DUkM0ICAgIDIKKyNkZWZpbmUgU1RSVUNUVVJFX0UxX0NSQzRNICAgMworI2RlZmluZSBT VFJVQ1RVUkVfVDFfNCAgICAgICA0CisjZGVmaW5lIFNUUlVDVFVSRV9UMV8xMiAgICAgIDUKKyNk ZWZpbmUgU1RSVUNUVVJFX1QxXzI0ICAgICAgNgorI2RlZmluZSBTVFJVQ1RVUkVfVDFfNzIgICAg ICA3CisKKy8qCisgKiBJbnRlcmZhY2UKKyAqLworI2RlZmluZSBJTlRFUkZBQ0VfUko0OEMgICAg ICAwCisjZGVmaW5lIElOVEVSRkFDRV9CTkMgICAgICAgIDEKKworLyoKKyAqIENvZGluZworICov CisKKyNkZWZpbmUgQ09ESU5HX0hEQjMgICAgICAgICAgMAorI2RlZmluZSBDT0RJTkdfTlJaICAg ICAgICAgICAxCisjZGVmaW5lIENPRElOR19DTUkgICAgICAgICAgIDIKKyNkZWZpbmUgQ09ESU5H X0NNSV9IREIzICAgICAgMworI2RlZmluZSBDT0RJTkdfQ01JX0I4WlMgICAgICA0CisjZGVmaW5l IENPRElOR19BTUkgICAgICAgICAgIDUKKyNkZWZpbmUgQ09ESU5HX0FNSV9aQ1MgICAgICAgNgor I2RlZmluZSBDT0RJTkdfQjhaUyAgICAgICAgICA3CisKKy8qCisgKiBMaW5lIEJ1aWxkIE91dAor ICovCisjZGVmaW5lIExCT18wZEIgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEJPXzdkQjUgICAg ICAgICAgICAgMQorI2RlZmluZSBMQk9fMTVkQiAgICAgICAgICAgICAyCisjZGVmaW5lIExCT18y MmRCNSAgICAgICAgICAgIDMKKworLyoKKyAqIFJhbmdlIGZvciBsb25nIGhhdWwgdDEgPiA2NTVm dAorICovCisjZGVmaW5lIFJBTkdFXzBfMTMzX0ZUICAgICAgIDAKKyNkZWZpbmUgUkFOR0VfMF80 MF9NICAgICAgICAgUkFOR0VfMF8xMzNfRlQKKyNkZWZpbmUgUkFOR0VfMTMzXzI2Nl9GVCAgICAg MQorI2RlZmluZSBSQU5HRV80MF84MV9NICAgICAgICBSQU5HRV8xMzNfMjY2X0ZUCisjZGVmaW5l IFJBTkdFXzI2Nl8zOTlfRlQgICAgIDIKKyNkZWZpbmUgUkFOR0VfODFfMTIyX00gICAgICAgUkFO R0VfMjY2XzM5OV9GVAorI2RlZmluZSBSQU5HRV8zOTlfNTMzX0ZUICAgICAzCisjZGVmaW5lIFJB TkdFXzEyMl8xNjJfTSAgICAgICBSQU5HRV8zOTlfNTMzX0ZUCisjZGVmaW5lIFJBTkdFXzUzM182 NTVfRlQgICAgIDQKKyNkZWZpbmUgUkFOR0VfMTYyXzIwMF9NICAgICAgUkFOR0VfNTMzXzY1NV9G VAorLyoKKyAqIFJlY2VpdmUgRXF1YWxpc2VyCisgKi8KKyNkZWZpbmUgRVFVQUxJWkVSX1NIT1JU ICAgICAgMAorI2RlZmluZSBFUVVBTElaRVJfTE9ORyAgICAgICAxCisKKy8qCisgKiBMb29wIG1v ZGVzCisgKi8KKyNkZWZpbmUgTE9PUF9OT05FICAgICAgICAgICAgMAorI2RlZmluZSBMT09QX0xP Q0FMICAgICAgICAgICAxCisjZGVmaW5lIExPT1BfUEFZTE9BRF9FWENfVFMwIDIKKyNkZWZpbmUg TE9PUF9QQVlMT0FEX0lOQ19UUzAgMworI2RlZmluZSBMT09QX1JFTU9URSAgICAgICAgICA0CisK Ky8qCisgKiBCdWZmZXIgbW9kZXMKKyAqLworI2RlZmluZSBCVUZGRVJfMl9GUkFNRSAgICAgICAw CisjZGVmaW5lIEJVRkZFUl8xX0ZSQU1FICAgICAgIDEKKyNkZWZpbmUgQlVGRkVSXzk2X0JJVCAg ICAgICAgMgorI2RlZmluZSBCVUZGRVJfTk9ORSAgICAgICAgICAzCiAKIC8qICAgICAgRGVidWcg c3VwcG9ydAogICoKZGlmZiAtdXJOIGxpbnV4LTIuNi40LXByZTEtb3JpZy9pbmNsdWRlL2xpbnV4 L2lmLmggbGludXgvaW5jbHVkZS9saW51eC9pZi5oCi0tLSBsaW51eC0yLjYuNC1wcmUxLW9yaWcv aW5jbHVkZS9saW51eC9pZi5oCTIwMDQtMDMtMDEgMDk6MTc6MzYuMDAwMDAwMDAwICswMDAwCisr KyBsaW51eC9pbmNsdWRlL2xpbnV4L2lmLmgJMjAwNC0wMy0wMSAwOToyNToyNS4wMDAwMDAwMDAg KzAwMDAKQEAgLTYyLDYgKzYyLDcgQEAKICNkZWZpbmUgSUZfSUZBQ0VfVDEJMHgxMDAzCQkvKiBU MSB0ZWxjbyBzZXJpYWwgaW50ZXJmYWNlCSovCiAjZGVmaW5lIElGX0lGQUNFX0UxCTB4MTAwNAkJ LyogRTEgdGVsY28gc2VyaWFsIGludGVyZmFjZQkqLwogI2RlZmluZSBJRl9JRkFDRV9TWU5DX1NF UklBTCAweDEwMDUJLyogY2FuJ3QgYmUgc2V0IGJ5IHNvZnR3YXJlCSovCisjZGVmaW5lIElGX0lG QUNFX1gyMUQgICAweDEwMDYgICAgICAgICAgLyogWC4yMSBEdWFsIENsb2NraW5nIChGYXJTaXRl KSAqLwogCiAvKiBGb3IgZGVmaW5pdGlvbnMgc2VlIGhkbGMuaCAqLwogI2RlZmluZSBJRl9QUk9U T19IRExDCTB4MjAwMAkJLyogcmF3IEhETEMgcHJvdG9jb2wJCSovCkBAIC03Niw2ICs3Nyw3IEBA CiAjZGVmaW5lIElGX1BST1RPX0ZSX0RFTF9FVEhfUFZDIDB4MjAwOQkvKiAgRGVsZXRlIEZSIEV0 aGVybmV0LWJyaWRnZWQgUFZDICovCiAjZGVmaW5lIElGX1BST1RPX0ZSX1BWQwkweDIwMEEJCS8q IGZvciByZWFkaW5nIFBWQyBzdGF0dXMJKi8KICNkZWZpbmUgSUZfUFJPVE9fRlJfRVRIX1BWQyAw eDIwMEIKKyNkZWZpbmUgSUZfUFJPVE9fUkFXICAgIDB4MjAwQyAgICAgICAgICAvKiBSQVcgU29j a2V0ICAgICAgICAgICAgICAgICAgICovCiAKIAogLyoKZGlmZiAtdXJOIGxpbnV4LTIuNi40LXBy ZTEtb3JpZy9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBsaW51eC9pbmNsdWRlL2xpbnV4L3BjaV9p ZHMuaAotLS0gbGludXgtMi42LjQtcHJlMS1vcmlnL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCTIw MDQtMDMtMDEgMDk6MTc6MzUuMDAwMDAwMDAwICswMDAwCisrKyBsaW51eC9pbmNsdWRlL2xpbnV4 L3BjaV9pZHMuaAkyMDA0LTAzLTAxIDA5OjI1OjI1LjAwMDAwMDAwMCArMDAwMApAQCAtMTg1NCw2 ICsxODU0LDE1IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFDUk9MSU5LX01DQ1I4CTB4MjAw MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BQ1JPTElOS19NQ0NSCTB4MjAwMQogCisjZGVmaW5l IFBDSV9WRU5ET1JfSURfRkFSU0lURSAgICAgICAgICAgMHgxNjE5CisjZGVmaW5lIFBDSV9ERVZJ Q0VfSURfRkFSU0lURV9UMlAgICAgICAgMHgwNDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkFS U0lURV9UNFAgICAgICAgMHgwNDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMVUg ICAgICAgMHgwNjEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMlUgICAgICAgMHgw NjIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UNFUgICAgICAgMHgwNjQwCisjZGVm aW5lIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9URTEgICAgICAgMHgxNjEwCisjZGVmaW5lIFBDSV9E RVZJQ0VfSURfRkFSU0lURV9URTFDICAgICAgMHgxNjEyCisKICNkZWZpbmUgUENJX1ZFTkRPUl9J RF9BTFRJTUEJCTB4MTczYgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMVElNQV9BQzEwMDAJMHgw M2U4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxUSU1BX0FDMTAwMQkweDAzZTkK ------_=_NextPart_001_01C3FF94.E3FBAD9A-- From jgarzik@pobox.com Mon Mar 1 10:45:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 10:45:40 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21IjZKO020532 for ; Mon, 1 Mar 2004 10:45:36 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:2406 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1AxsQ1-0004fH-LB; Mon, 01 Mar 2004 18:45:33 +0000 Message-ID: <404384C1.1040700@pobox.com> Date: Mon, 01 Mar 2004 13:45:21 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: mzyngier@freesurf.fr CC: pawel.sokolowski@muflon.linux.pl, netdev@oss.sgi.com Subject: Re: 2.6.4-rc1 + hp100 EISA, not working References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3687 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 10 Lines: 3 applied From bdschuym@pandora.be Mon Mar 1 11:20:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 11:21:02 -0800 (PST) Received: from elektra.telenet-ops.be (elektra.telenet-ops.be [195.130.132.49]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21JKlKO021526 for ; Mon, 1 Mar 2004 11:20:48 -0800 Received: from localhost (apate.telenet-ops.be [195.130.132.57]) by elektra.telenet-ops.be (Postfix) with SMTP id 4996033EAC; Mon, 1 Mar 2004 19:47:40 +0100 (MET) Received: from 192.168.0.138 (D5762B56.kabel.telenet.be [213.118.43.86]) by apate.telenet-ops.be (Postfix) with ESMTP id 9A6F337EA5; Mon, 1 Mar 2004 19:47:39 +0100 (MET) From: Bart De Schuymer To: "David S. Miller" Subject: Re: [PATCH] 2.6.3 fix vlan-encapsulated fragmented IP traffic Date: Mon, 1 Mar 2004 19:47:51 +0100 User-Agent: KMail/1.5 Cc: ebtables-devel@lists.sourceforge.net, netdev@oss.sgi.com References: <200402291914.53578.bdschuym@pandora.be> <200403010806.29759.bdschuym@pandora.be> <20040301003525.522d6db2.davem@redhat.com> In-Reply-To: <20040301003525.522d6db2.davem@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200403011947.51621.bdschuym@pandora.be> X-archive-position: 3688 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bdschuym@pandora.be Precedence: bulk X-list: netdev Content-Length: 1898 Lines: 36 On Monday 01 March 2004 09:35, David S. Miller wrote: > Let us say that on input, br strips the 4 bytes as you say, iptables looks > at the thing and rewrites the IP source/destination address or whatever, > and this causes the packet to actually get forwarded out via a different IP > route, and let us say that this new IP route causes the packet to go out > via an IPIP tunnel device, which must do all the same kind of crap the code > you're patching here does, that is determine the LL header size etc. in > order to make sure there is enough headroom to slap on the new IP > encapsulating header. > > If you can show that this kind of scenerio would never be generated in the > cases where br-netfilter is involved, then fine. The IPIP code does dev->hard_header_len=LL_MAX_HEADER+sizeof(struct iphdr); so there's no problem there because the macro LL_RESERVED_SPACE uses that value. There should never be a problem like that with routing. When routing IP packets, skb->protocol will always be set to ETH_P_IP, so nf_bridge_pad doesn't do anything. Obviously, adding a normal Ethernet device and, say, a vlan-enabled device as bridge ports of the same bridge is bound to give problems because full Ethernet frames will arrive on the normal device and there's no room to insert a vlan header before sending them onto the vlan-enabled port. For IP packets we might be able to fix this when ip_conntrack is loaded by using fragmenting, but I don't think this currently works. I'll have to experiment. Note that changing the IP destination in a vlan-embedded packet makes the bridge code pass the packet up to higher layers (unless it can still be bridged), but the vlan header is not yet stripped. So only if the bridge device itself is vlan-enabled, will the packet be able to be routed. But first the vlan tag will be stripped (by the vlan-enabled bridge device). cheers, Bart From vda@port.imtp.ilyichevsk.odessa.ua Mon Mar 1 14:13:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 14:14:08 -0800 (PST) Received: from port.imtp.ilyichevsk.odessa.ua (168.imtp.Ilyichevsk.Odessa.UA [195.66.192.168] (may be forged)) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21MDmKO028020 for ; Mon, 1 Mar 2004 14:13:52 -0800 Received: (qmail 12527 invoked by alias); 1 Mar 2004 22:01:54 -0000 Received: from unknown (1.0.3.9) by 0 (195.66.192.168) with ESMTP; 01 Mar 2004 22:01:54 -0000 From: Denis Vlasenko To: "john" , Andrewm@uow.edu.au, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: Problems getting a stable 100 megabit connection with linksys etherfast switch Date: Tue, 2 Mar 2004 00:01:47 +0200 User-Agent: KMail/1.5.4 References: <20040229212053.M47845@spots.ca> In-Reply-To: <20040229212053.M47845@spots.ca> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200403020001.48026.vda@port.imtp.ilyichevsk.odessa.ua> X-archive-position: 3690 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: vda@port.imtp.ilyichevsk.odessa.ua Precedence: bulk X-list: netdev Content-Length: 717 Lines: 22 On Sunday 29 February 2004 23:30, john wrote: > Hi, > > I am having problems getting a stable connection with my linux machines > when trying to connect them at 100 megabit speeds to a linksys etherfast > switch. > > > I have attached some diagnostic outputs for your review. I hope that > someone can help me with this problem. > > I believe using a managed switch will solve the problem, but I don't want > to have to spend $1000.00 to fix this problem, when I should be able to > obtain a stable connection with the equipment I am currently using. Try half duplex. You seldom do lots of xfers in both directions at once, so half duplex is not a big loss. Use tcpdump to see what's going on on the wire. -- vda From falcon@muflon.linux.pl Mon Mar 1 15:04:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 15:04:24 -0800 (PST) Received: from don.falconne.eu.org (postfix@pc74.torun.sdi.tpnet.pl [213.25.214.74]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i21N4KKO029271 for ; Mon, 1 Mar 2004 15:04:20 -0800 Received: from localhost (localhost [127.0.0.1]) by don.falconne.eu.org (Postfix) with ESMTP id 8B5D51BB8D9A; Tue, 2 Mar 2004 00:04:11 +0100 (CET) Received: from don.falconne.eu.org ([127.0.0.1]) by localhost (don.falconne.eu.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 27704-08; Tue, 2 Mar 2004 00:04:11 +0100 (CET) Received: from pc74.torun.sdi.tpnet.pl (pc74.torun.sdi.tpnet.pl [213.25.214.74]) by don.falconne.eu.org (Postfix) with ESMTP id 611B11BB8D99; Tue, 2 Mar 2004 00:04:11 +0100 (CET) Date: Tue, 2 Mar 2004 00:04:11 +0100 (CET) From: Pawel Sokolowski X-X-Sender: falcon@don.falconne.eu.org Reply-To: pawel.sokolowski@muflon.linux.pl To: Marc Zyngier Cc: netdev@oss.sgi.com Subject: Re: 2.6.4-rc1 + hp100 EISA, not working In-Reply-To: Message-ID: References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=iso-8859-2 X-Virus-Scanned: by amavisd-new-20030616-p7 (Debian) at don.falconne.eu.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i21N4KKO029271 X-archive-position: 3691 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: falcon@muflon.linux.pl Precedence: bulk X-list: netdev Content-Length: 1560 Lines: 36 I've seen things you people wouldn't believe. You writing: >Pawel> I don't know if it's related to this problem but at earlier stage of >Pawel> booting I'm getting following messages: >Pawel> EISA: Probing bus 0 at eisa0 >Pawel> EISA: Mainboard HWPC061 detected. >Pawel> EISA: slot 2 : HWP1940 detected (disabled). >Pawel> EISA: Detected 1 card. >Try passing 'eisa_bus.enable_dev=2' to your kernel parameters. Your >card is tagged as unconfigured by BIOS, and thus is skipped by the >probing logic. See Documentation/eisa.txt for details. This machine has RAM BIOS booted from floppy. I ran it and EISA configure utility to check this once more. Card is enabled and not locked. I added eisa_bus.enable_dev=2 parameter but it didn't help much. I'm getting: EISA: Probing bus 0 at eisa0 EISA: Mainboard HWPC061 detected. EISA: slot 2 : HWP1940 detected (forced enabled). EISA: Detected 1 card. I added this final entry you mailed but nothing changed. Still - module loads and unloads cleanly and without any warnings on 2.6.4-rc1. But does nothing - not a single line in logs/dmesg after it's loaded. Card does not work after modprobe, I can't get interface up. If you need more details or some config files, please, let me know. -- ,d$$$$$P.d$$b d$P ,gd$$$$$,gd$$$$g. ,$$$b._$$P RLU #172534 ggggggggggggg. ggs ,gg ,gg ,gg ggp,ggggg Pawe³ Soko³owski d$P""""'""""Y$$. d$P d$P d$P ,d$Pd$P `Y$$P falcon@muflon.linux.pl d$P Y$$d$$$$$P`Y$$$$$'`Y$$$$$P'd$P d$P Replicant (M) Des: Falcon From lists@mdiehl.de Mon Mar 1 16:47:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 01 Mar 2004 16:47:15 -0800 (PST) Received: from bart.webpack.hosteurope.de (bart.one-2-one.net [217.115.142.76]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i220l7KO002757 for ; Mon, 1 Mar 2004 16:47:10 -0800 Received: from notebook.home.mdiehl.de (pD9E949D9.dip0.t-ipconnect.de [217.233.73.217]) (authenticated) by bart.webpack.hosteurope.de (8.11.6/8.11.6) with ESMTP id i21NI4v29513; Tue, 2 Mar 2004 00:18:05 +0100 Received: from notebook.home.mdiehl.de (localhost.localdomain [127.0.0.1]) by notebook.home.mdiehl.de (8.12.1/8.12.1) with ESMTP id i21NMM5E001721; Tue, 2 Mar 2004 00:22:23 +0100 Received: from localhost (martin@localhost) by notebook.home.mdiehl.de (8.12.1/8.12.1/Submit) with ESMTP id i21NML15001718; Tue, 2 Mar 2004 00:22:22 +0100 X-Authentication-Warning: notebook.home.mdiehl.de: martin owned process doing -bs Date: Tue, 2 Mar 2004 00:22:21 +0100 (CET) From: Martin Diehl X-X-Sender: martin@notebook.home.mdiehl.de To: Stephen Hemminger cc: Jean Tourrilhes , Subject: Re: [RFT] stir4200 - new version In-Reply-To: <20040227154452.680613b7@dell_ss3.pdx.osdl.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 3692 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lists@mdiehl.de Precedence: bulk X-list: netdev Content-Length: 7649 Lines: 276 On Fri, 27 Feb 2004, Stephen Hemminger wrote: > Here is the latest stir4200 driver for testing. The diff is against 2.6.3-bk9. Thanks Stephen, some feedback here, while we are fighting with the usb-issues... > The major change is getting rid of using the receive interrupt pipe. > I could never get it to work reliably with FIR; it would miss frames. > Performance is way better. Agreed, I get better performance too. I still believe the interrupt rx-urb would be the better approach due to the latencies. The bulk-urb resubmitted by a timer needs: 1 msec for submission + up to 2 msec for completion (uhci) + poll-timer delay + timer latency. Even with HZ=1000 I believe it's not possible to guarantee a min poll rate < 4 msec. At FIR with a lot of transparency-escapes the fifo get filled at a rate of 1MB/sec so it might be overrun meanwhile. Maybe some double-buffering would help... > Still not reliable in FIR with large packet sizes.. Yep, I don't see some significant change wrt. to the FIFO stalls/lockups. Additionally, the new issues with ohci-hcd are now - let's see... > + if (isfir(speed)) > + len = STIR_IRDA_HEADER + 16 + 2 + 2*skb->len + 8 + 2; > + else > + len = STIR_IRDA_HEADER + 163 + 2*skb->len + 4 + 1; off-by-one: in SIR there is also a BOF between the XBOF and data > + nskb = dev_alloc_skb(len); > + if (likely(nskb)) { > + if (isfir(speed)) > + len = wrap_fir_skb(skb, nskb->data); > + else > + len = wrap_sir_skb(skb, nskb->data, len); > + > + skb_put(nskb, len); IMHO the tx-skb for wrapped data doesn't work: skb->data will be used as usb transfer buffer. However, usb-rules are the transfer buffer must be a separate kmalloc-entity, because we need to have it both physically continous and cacheline-aligned. I don't think the second promision is held by skb->data due to headroom f.e.? > +static int fifo_txwait(struct stir_cb *stir, int space) > { > __u8 regs[3]; [...] > + /* Read FIFO status and count */ > + while ((err = read_reg(stir, REG_FIFOCTL, regs, 3)) == 3) { This breakes with usb. The regs argument is used as data buffer in usb_control_msg - so we would end up doing DMA to the stack. We need a separate kmalloc-object here. > [stir_trasnmit_thread] > > } > > complete_and_exit (&stir->thr_exited, 0); AFAICS we are racing with the poll-timer here which might resubmit the rx-urb. IMHO calling receive_stop before completing should do the job. Below my current patch which I'm using on top of your version. I've done some perfomrance/stability testing with ohci/ehci. SIR seems just fine like it was with the last version. FIR performance is definedly faster, but I don't yet understand why. Still lots of fifo lockups. But if it's working it's rather good now: about 200KB/s tx and up to 350 KB/s rx, with 2KB frames and window=7 - provided it doesn't stop in the middle ;-) Martin ------------------------- --- v2.6.3-bk9-md/drivers/net/irda/stir4200.c.sh-20040227 Sat Feb 28 20:02:44 2004 +++ v2.6.3-bk9-md/drivers/net/irda/stir4200.c Mon Mar 1 21:41:13 2004 @@ -323,13 +323,15 @@ static unsigned wrap_sir_skb(struct sk_b /* * Take raw data and encapsulate as appropriate into - * a new socket buffer. + * a new tx buffer and give it back to the caller. */ -static struct sk_buff *wrap_skb(struct sk_buff *skb, unsigned speed) +static u8 *wrap_skb(struct sk_buff *skb, unsigned speed, int *wraplen) { - struct sk_buff *nskb; + u8 *tx_buff; unsigned len; + *wraplen = 0; + /* * need enough space for worst case * In addition to the stir-header we need 1 byte for each BOF+EOF @@ -343,19 +345,17 @@ static struct sk_buff *wrap_skb(struct s if (isfir(speed)) len = STIR_IRDA_HEADER + 16 + 2 + 2*skb->len + 8 + 2; else - len = STIR_IRDA_HEADER + 163 + 2*skb->len + 4 + 1; + len = STIR_IRDA_HEADER + 163 + 1 + 2*skb->len + 4 + 1; - nskb = dev_alloc_skb(len); - if (likely(nskb)) { + tx_buff = kmalloc(len, GFP_KERNEL); + if (likely(tx_buff)) { if (isfir(speed)) - len = wrap_fir_skb(skb, nskb->data); + *wraplen = wrap_fir_skb(skb, tx_buff); else - len = wrap_sir_skb(skb, nskb->data, len); - - skb_put(nskb, len); + *wraplen = wrap_sir_skb(skb, tx_buff, len); } - return nskb; + return tx_buff; } /* @@ -643,7 +643,14 @@ static int stir_hard_xmit(struct sk_buff static int fifo_txwait(struct stir_cb *stir, int space) { int err; - __u8 regs[3]; + u8 *regs; + + regs = kmalloc(3, GFP_KERNEL); + if (regs == NULL) { + /* low on memory - just wait one whole 500ms window */ + mdelay(500); + return -ENOMEM; + } /* Read FIFO status and count */ while ((err = read_reg(stir, REG_FIFOCTL, regs, 3)) == 3) { @@ -665,40 +672,46 @@ static int fifo_txwait(struct stir_cb *s goto clear_fifo; } + err = 0; + /* is fifo receiving already, or empty */ if (!(regs[0] & FIFOCTL_DIR) || (regs[0] & FIFOCTL_EMPTY)) - return 0; + goto out; - if (signal_pending(current)) - return -EINTR; + if (signal_pending(current)) { + err = -EINTR; + goto out; + } /* shutting down? */ if (!netif_running(stir->netdev) - || !netif_device_present(stir->netdev)) - return -ESHUTDOWN; + || !netif_device_present(stir->netdev)) { + err = -ESHUTDOWN; + goto out; + } /* only waiting for some space */ if (space >= 0 && STIR_FIFO_SIZE - 4 > space + count) - return 0; + goto out; /* estimate transfer time for remaining chars */ wait_ms((count * 8000) / stir->speed); } warn("%s: FIFO register read error: %d", stir->netdev->name, err); - - return err; + goto out; clear_fifo: err = write_reg(stir, REG_FIFOCTL, FIFOCTL_CLR); if (err) - return err; + goto out; err = write_reg(stir, REG_FIFOCTL, 0); - if (err) - return err; - return 0; +out: + kfree(regs); + + return err; } @@ -765,37 +778,44 @@ static void receive_stop(struct stir_cb stir->stats.collisions++; } /* - * Wrap data in socket buffer and send it. + * Wrap data from skb to usb transmit buffer and send it. */ static void stir_send(struct stir_cb *stir, struct sk_buff *skb) { - struct sk_buff *wskb = wrap_skb(skb, stir->speed); + u8 *tx_buff; + int wraplen; - if (unlikely(!wskb)) { + tx_buff = wrap_skb(skb, stir->speed, &wraplen); + + if (unlikely(!tx_buff)) { stir->stats.tx_errors++; return; } + if (unlikely(wraplen < STIR_IRDA_HEADER)) + goto out; + /* if receiving, need to turnaround */ if (stir->rx_receiving) { receive_stop(stir); turnaround_delay(stir, irda_get_mtt(skb)); } - else if (fifo_txwait(stir, wskb->len)) + else if (fifo_txwait(stir, wraplen)) goto out; /* shutdown or error don't send */ stir->stats.tx_packets++; stir->stats.tx_bytes += skb->len; stir->netdev->trans_start = jiffies; - pr_debug("send %d (%d)\n", skb->len, wskb->len); + pr_debug("send %d (%d)\n", skb->len, wraplen); + if (usb_bulk_msg(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1), - wskb->data, wskb->len, + tx_buff, wraplen, NULL, MSECS_TO_JIFFIES(TRANSMIT_TIMEOUT))) stir->stats.tx_errors++; out: - dev_kfree_skb(wskb); + kfree(tx_buff); } /* @@ -870,6 +890,10 @@ static int stir_transmit_thread(void *ar spin_unlock(&stir->tx_lock); } + /* need to del_timer_sync and unlink the urb */ + if (stir->rx_receiving) + receive_stop(stir); + complete_and_exit (&stir->thr_exited, 0); } @@ -1022,7 +1046,6 @@ static int stir_net_close(struct net_dev wait_for_completion(&stir->thr_exited); /* Mop up receive urb's */ - usb_unlink_urb(stir->rx_urb); usb_free_urb(stir->rx_urb); kfree(stir->rx_data); kfree_skb(stir->rx_buff.skb); From rddunlap@xenotime.net Tue Mar 2 02:35:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 02:36:16 -0800 (PST) Received: from bianca.affordablehost.com (bianca.affordablehost.com [216.46.192.8]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22AZtKO019637 for ; Tue, 2 Mar 2004 02:35:56 -0800 Received: from wbar2.sea1-4-5-045-142.sea1.dsl-verizon.net ([4.5.45.142] helo=midway.verizon.net) by bianca.affordablehost.com with smtp (Exim 4.24) id 1AvVgz-0005xz-Hk; Tue, 24 Feb 2004 01:05:17 -0500 Date: Mon, 23 Feb 2004 22:01:56 -0800 From: "Randy.Dunlap" To: akpm Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: [PATCH] skfddi: missing comma Message-Id: <20040223220156.1e618c03.rddunlap@xenotime.net> Organization: YPO4 X-Mailer: Sylpheed version 0.9.8a (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - bianca.affordablehost.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - xenotime.net X-archive-position: 3693 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@xenotime.net Precedence: bulk X-list: netdev Content-Length: 677 Lines: 27 Do you already have this? // linux-263-feb23 diffstat:= drivers/net/skfp/skfddi.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -Naurp ./drivers/net/skfp/skfddi.c~skfddi ./drivers/net/skfp/skfddi.c --- ./drivers/net/skfp/skfddi.c~skfddi 2004-02-23 16:07:11.000000000 -0800 +++ ./drivers/net/skfp/skfddi.c 2004-02-23 21:44:12.000000000 -0800 @@ -262,7 +262,7 @@ static int skfp_init_one(struct pci_dev #endif err = pci_request_regions(pdev, "skfddi"); if (err) { - printk(KERN_ERR "Cannot allocate resources for adapter %s\n" + printk(KERN_ERR "Cannot allocate resources for adapter %s\n", pci_name(pdev)); goto err_out1; } -- ~Randy From rmk@arm.linux.org.uk Tue Mar 2 04:10:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 04:11:15 -0800 (PST) Received: from caramon.arm.linux.org.uk (caramon.arm.linux.org.uk [212.18.232.186]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22CArKO024775 for ; Tue, 2 Mar 2004 04:10:57 -0800 Received: from flint.arm.linux.org.uk ([2002:d412:e8ba:1:201:2ff:fe14:8fad]) by caramon.arm.linux.org.uk with asmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.30) id 1Ay8jT-000808-Hl; Tue, 02 Mar 2004 12:10:43 +0000 Received: from rmk by flint.arm.linux.org.uk with local (Exim 4.30) id 1Ay8jS-0002da-No; Tue, 02 Mar 2004 12:10:42 +0000 Date: Tue, 2 Mar 2004 12:10:42 +0000 From: Russell King To: "Randy.Dunlap" Cc: jgarzik , netdev@oss.sgi.com Subject: Re: [janitor] remove casts in drivers/net/arm/ Message-ID: <20040302121042.A9931@flint.arm.linux.org.uk> References: <20040229142516.3d218ed0.rddunlap@osdl.org> <20040229143436.4bb884ee.rddunlap@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040229143436.4bb884ee.rddunlap@osdl.org>; from rddunlap@osdl.org on Sun, Feb 29, 2004 at 02:34:36PM -0800 X-archive-position: 3694 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rmk@arm.linux.org.uk Precedence: bulk X-list: netdev Content-Length: 1232 Lines: 28 On Sun, Feb 29, 2004 at 02:34:36PM -0800, Randy.Dunlap wrote: > drivers/net/arm/am79c961a.c | 18 +++++++++--------- > drivers/net/arm/ether1.c | 18 +++++++++--------- > drivers/net/arm/ether3.c | 18 +++++++++--------- > drivers/net/arm/etherh.c | 4 ++-- > 4 files changed, 29 insertions(+), 29 deletions(-) I think we should really consider using netdev_priv() in all these places so the compiler knows that 'dev' and 'priv' are related. > diff -puN drivers/net/arm/am79c961a.c~net_arm_casts drivers/net/arm/am79c961a.c > --- linux-263-229/drivers/net/arm/am79c961a.c~net_arm_casts 2004-02-29 13:53:00.000000000 -0800 > +++ linux-263-229-rddunlap/drivers/net/arm/am79c961a.c 2004-02-29 13:53:00.000000000 -0800 > @@ -196,7 +196,7 @@ am79c961_ramtest(struct net_device *dev, > static void > am79c961_init_for_open(struct net_device *dev) > { > - struct dev_priv *priv = (struct dev_priv *)dev->priv; > + struct dev_priv *priv = dev->priv; > unsigned long flags; > unsigned char *p; > u_int hdr_addr, first_free_addr; -- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/ 2.6 Serial core From nicolas.crochu@sgam.com Tue Mar 2 07:19:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 07:19:16 -0800 (PST) Received: from mail.sgam.fr (mail.sgam.com [194.119.92.19]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22FJ7KO007580 for ; Tue, 2 Mar 2004 07:19:08 -0800 Received: from fr-mailapp1.fr.sgam.socgen (mailapp1 [10.15.1.14]) by mail.sgam.fr (8.12.10/8.12.10) with ESMTP id i22FItSX004622; Tue, 2 Mar 2004 16:18:55 +0100 (MET) Received: from UC1293.fr.sgam.socgen ([10.50.5.53]) by fr-mailapp1.fr.sgam.socgen with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2657.72) id 1XZHQNWW; Tue, 2 Mar 2004 16:18:58 +0100 Subject: r8169 driver & -mm4 From: crochu nicolas To: romieu@fr.zoreil.com Cc: jgarzik@pobox.com, netdev@oss.sgi.com Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-flc8tQegn8umS13h857g" Message-Id: <1078240740.1781.24.camel@pinacola> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.4-8mdk Date: Tue, 02 Mar 2004 16:19:00 +0100 X-archive-position: 3695 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: nicolas.crochu@sgam.com Precedence: bulk X-list: netdev Content-Length: 3425 Lines: 104 --=-flc8tQegn8umS13h857g Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hi, Since i compiled the latest 2.6.3-mm4, without PREEMP, without SMP, and without ACPI, my laptop is almost working flawlessly. But, i was surprised when i unplugged the RJ45 cable, in=20 /var/log/messages, i got : [...] Mar 2 10:48:43 pinacola kernel: r8169: eth0: Reset RTL8169s PHY [...] then, even if i plug the cable again, i got=20 [...] Mar 2 10:48:43 pinacola kernel: r8169: eth0: Reset RTL8169s PHY Mar 2 10:49:14 pinacola last message repeated 2561 times Mar 2 10:50:14 pinacola last message repeated 5084 times Mar 2 10:50:39 pinacola last message repeated 2049 times [...] I could not even ping any host. i had to do a=20 ifdown eth0=20 ifup eth0 To be able to ping the world again.=20 C.Nicolas. lspci --------------------------------------------- 00:00.0 Host bridge: Intel Corp. 82865G/PE/P Processor to I/O Controller (rev 02) 00:01.0 PCI bridge: Intel Corp. 82865G/PE/P Processor to AGP Controller (rev 02) 00:1d.0 USB Controller: Intel Corp. 82801EB USB (rev 02) 00:1d.1 USB Controller: Intel Corp. 82801EB USB (rev 02) 00:1d.2 USB Controller: Intel Corp. 82801EB USB (rev 02) 00:1d.3 USB Controller: Intel Corp. 82801EB USB (rev 02) 00:1d.7 USB Controller: Intel Corp. 82801EB USB2 (rev 02) 00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB/EB PCI Bridge (rev c2) 00:1f.0 ISA bridge: Intel Corp. 82801EB LPC Interface Controller (rev 02) 00:1f.1 IDE interface: Intel Corp. 82801EB Ultra ATA Storage Controller (rev 02) 00:1f.3 SMBus: Intel Corp. 82801EB SMBus Controller (rev 02) 00:1f.5 Multimedia audio controller: Intel Corp. 82801EB AC'97 Audio Controller (rev 02) 00:1f.6 Modem: Intel Corp. 82801EB AC'97 Modem Controller (rev 02) 01:00.0 VGA compatible controller: ATI Technologies Inc: Unknown device 4e50 03:00.0 CardBus bridge: ENE Technology Inc CB1410 Cardbus Controller 03:01.0 FireWire (IEEE 1394): Texas Instruments TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link) 03:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8169 (rev 10) /var/log/syslog ------------------------------------------ [...] Mar 2 09:20:48 pinacola kernel: PCI: Found IRQ 5 for device 0000:03:03.0 Mar 2 09:20:48 pinacola kernel: eth0: Identified chip type is 'RTL8169s/8110s'. Mar 2 09:20:48 pinacola kernel: eth0: RTL8169 at 0xe18ab800, 00:90:f5:27:36:0f, IRQ 5 Mar 2 09:20:48 pinacola kernel: eth0: Auto-negotiation Enabled. Mar 2 09:20:48 pinacola kernel: eth0: 100Mbps Full-duplex operation. [...] /proc/interrupts ------------------------------- CPU0 0: 25045424 XT-PIC timer 1: 58693 XT-PIC i8042 2: 0 XT-PIC cascade 5: 310068 XT-PIC Intel ICH5, uhci_hcd, ehci_hcd, eth0 11: 3 XT-PIC ohci1394, uhci_hcd, uhci_hcd, uhci_hcd 12: 417208 XT-PIC i8042 14: 32038 XT-PIC ide0 15: 23920 XT-PIC ide1 NMI: 0 ERR: 0 --=-flc8tQegn8umS13h857g Content-Type: application/pgp-signature; name=signature.asc Content-Description: Ceci est une partie de message =?ISO-8859-1?Q?num=E9riquement?= =?ISO-8859-1?Q?_sign=E9e?= -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (GNU/Linux) iD8DBQBARKXkxsSeKWK8V4QRAgAkAJwMQ/Clz3U6JGITfqDu6K/8fG+1WQCgujQI C77qdHy+DvMHfFc80CX+G04= =rLq4 -----END PGP SIGNATURE----- --=-flc8tQegn8umS13h857g-- From raghavendra.koushik@wipro.com Tue Mar 2 07:22:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 07:22:39 -0800 (PST) Received: from wiproecmx2.wipro.com (wiproecmx2.wipro.com [164.164.31.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22FMTKO008053 for ; Tue, 2 Mar 2004 07:22:31 -0800 Received: from ec-vwall-wd (ec-vwall-wd.wipro.com [10.200.52.125]) by wiproecmx2.wipro.com (8.12.9-20031013/8.12.9) with SMTP id i22DkOlU012206 for ; Tue, 2 Mar 2004 19:16:25 +0530 (IST) Received: from blr-ec-bh2.wipro.com ([10.200.50.92]) by ec-vwall-wd with InterScan Messaging Security Suite; Tue, 02 Mar 2004 19:17:41 +0530 Received: from blr-m3-msg.wipro.com ([10.114.50.99]) by blr-ec-bh2.wipro.com with Microsoft SMTPSVC(5.0.2195.6713); Tue, 2 Mar 2004 19:16:23 +0530 X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Subject: RE: Submission #3 for S2io 10GbE driver Date: Tue, 2 Mar 2004 19:16:22 +0530 Message-ID: <4223A04BF7D1B941A25246ADD0462FF50115AFCF@blr-m3-msg.wipro.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Submission #3 for S2io 10GbE driver Thread-Index: AcP/Wff/fbVBm5XxRUWIKOkRQoO4BgA+F2xQ From: To: Cc: , , , , , X-OriginalArrivalTime: 02 Mar 2004 13:46:23.0266 (UTC) FILETIME=[C012B820:01C4005C] Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i22FMTKO008053 X-archive-position: 3696 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: raghavendra.koushik@wipro.com Precedence: bulk X-list: netdev Content-Length: 3416 Lines: 97 Hi Jeff, Really sorry about that "confidentiality notice" that gets attached. I have asked my sysAdmin to get rid of it. He has promised to do so ASAP. Hope this mail does not have it attached at the end :-). If at all the message still persists please ignore it as inconsequential to our discussion. I Have a few more questions. >>4) just delete the SET_NETDEV_DEV(), FREE_NETDEV, and IRQ_NONE >>compatibility defines. these are in 2.4 just like 2.6. Not all 2.4 kernels have them yet right? but since this driver is going into 2.6 kernel if you want all these backward compatibility macros eliminated I can do that. >>13) in s2io_xmit, kfree the skb (drop it) if you don't have enough free >>space to queue it. this is normally a BUG condition, since proper use >>of netif_{start,stop,wake}_queue() will guarantee that s2io_xmit will >>only be called when there is free space to queue another skb. On returning error (non zero) from s2io_xmit, I think the calling function frees the skb. How s2io_xmit works is when I get a packet for Tx and I find that all the Tx descriptors are owned by the NIC, I stop the queue and return error. So I wouldn't know before hand whether free queue space is available or not. Regards Koushik -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Monday, March 01, 2004 12:24 PM To: Raghavendra Koushik (WT01 - EMBEDDED & PRODUCT ENGINEERING SOLUTIONS) Cc: leonid.grossman@s2io.com; netdev@oss.sgi.com; shemminger@osdl.org; hch@infradead.org; ravinandan.arakali@s2io.com; raghavendra.koushik@s2io.com Subject: Re: Submission #3 for S2io 10GbE driver raghavendra.koushik@wipro.com wrote: > Jeff, > Regarding Point # 37 > > >>>37) kill all of this: >>> >>>+/* OS related system calls */ >>>+ >>>+#ifndef readq >>>+static inline u64 read64(void *addr) >>>+{ >>>+ u64 ret = 0; >>>+ ret = readl(addr + 4); >>>+ (u64) ret <<= 32; >>>+ (u64) ret |= readl(addr); > > [....] > > I agree that read/write(32,16,8) are not used so can be eliminated, > but the read/write64 macros are essential because not all platforms > have defined the readq and writeq system calls. i386 for example > doesn't have readq/writeq and to write into the 64 bit registers of > the NIC, I use 2 successive 32 bits (readl/writel) operation to > achieve the 64 bit equivalent. This procedure does work on all the > platforms that we have tested on. The code should use the kernel API -- readq/writeq -- not define its own API. With regards to the missing readq/writeq on some architectures... Short term, if some arches do not provide readq/writeq, provide your own definition (i.e. rename your write64 to a conditionally-defined writeq). Long term, all Linux platforms need to provide readq/writeq, so we need to modify the architectures with the missing pieces. > Confidentiality Notice > > The information contained in this electronic message and any > attachments to this message are intended for the exclusive use of the > addressee(s) and may contain confidential or privileged information. > If you are not the intended recipient, please notify the sender at > Wipro or Mailadmin@wipro.com immediately and destroy all copies of > this message and any attachments. Oh really? ;-) You should talk to your lawyers and sysadmins about sending email to open source people and lists... Regards, Jeff From jgarzik@pobox.com Tue Mar 2 10:47:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 10:47:29 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22IlNKO017345 for ; Tue, 2 Mar 2004 10:47:24 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:2916 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1AyEvJ-00021D-LL; Tue, 02 Mar 2004 18:47:21 +0000 Message-ID: <4044D6AD.9090209@pobox.com> Date: Tue, 02 Mar 2004 13:47:09 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: raghavendra.koushik@wipro.com CC: leonid.grossman@s2io.com, netdev@oss.sgi.com, shemminger@osdl.org, hch@infradead.org, ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com Subject: Re: Submission #3 for S2io 10GbE driver References: <4223A04BF7D1B941A25246ADD0462FF50115AFCF@blr-m3-msg.wipro.com> In-Reply-To: <4223A04BF7D1B941A25246ADD0462FF50115AFCF@blr-m3-msg.wipro.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3697 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 2496 Lines: 70 raghavendra.koushik@wipro.com wrote: > Hi Jeff, > > Really sorry about that "confidentiality notice" that gets attached. > I have asked my sysAdmin to get rid of it. He has promised to do so ASAP. > Hope this mail does not have it attached at the end :-). If at all the > message still persists please ignore it as inconsequential to our discussion. > > I Have a few more questions. > > >>>4) just delete the SET_NETDEV_DEV(), FREE_NETDEV, and IRQ_NONE >>>compatibility defines. these are in 2.4 just like 2.6. > > > Not all 2.4 kernels have them yet right? but since this driver is going Correct. But when I merge this driver into 2.4, it will be latest 2.4 (which contains these definitions). The vendor (s2io) is expected to maintain any old-kernel compatibility outside the kernel. For example, if you submitting the s2io driver for inclusion in my employer's product, Red Hat Enterprise Linux, then you would submit with the compatibility gunk. > into 2.6 kernel if you want all these backward compatibility macros eliminated > I can do that. Yes, please. >>>13) in s2io_xmit, kfree the skb (drop it) if you don't have enough free >>>space to queue it. this is normally a BUG condition, since proper use >>>of netif_{start,stop,wake}_queue() will guarantee that s2io_xmit will >>>only be called when there is free space to queue another skb. > > > On returning error (non zero) from s2io_xmit, I think the calling function frees > the skb. Not correct in all cases, this is why the driver should drop the skb and free it. Several existing drivers get this wrong, in fact :/ > How s2io_xmit works is when I get a packet for Tx and I find that all the > Tx descriptors are owned by the NIC, I stop the queue and return error. > So I wouldn't know before hand whether free queue space is available or not. This is incorrect, and definitely an issue that needs to be addressed. As I said, the model is, the driver calls netif_stop_queue() after queueing a packet, when it knows there is no more room for a full packet. The tg3 driver does it like this: ...queue an skb to hardware... if (TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1)) netif_stop_queue(dev); Therefore you guarantee the queue is stopped until you are 100% certain that another skb (up to MAX_SKB_FRAGS + "main frag" fragments) may be queued to hardware. You do -not- want to figure out "after the fact" that you cannot queue the skb you were just passed. Jeff From rddunlap@osdl.org Tue Mar 2 11:03:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 11:03:31 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22J3RKO018460 for ; Tue, 2 Mar 2004 11:03:27 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i22J3CE14185; Tue, 2 Mar 2004 11:03:13 -0800 Date: Tue, 2 Mar 2004 11:02:37 -0800 From: "Randy.Dunlap" To: Jeff Garzik Cc: rmk@arm.linux.org.uk, netdev@oss.sgi.com Subject: Re: [janitor] remove casts in drivers/net/arm/ Message-Id: <20040302110237.0f580736.rddunlap@osdl.org> In-Reply-To: <4044D86C.70709@pobox.com> References: <20040229142516.3d218ed0.rddunlap@osdl.org> <20040229143436.4bb884ee.rddunlap@osdl.org> <20040302121042.A9931@flint.arm.linux.org.uk> <4044D86C.70709@pobox.com> Organization: OSDL X-Mailer: Sylpheed version 0.9.4 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3698 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 938 Lines: 31 On Tue, 02 Mar 2004 13:54:36 -0500 Jeff Garzik wrote: | Russell King wrote: | > On Sun, Feb 29, 2004 at 02:34:36PM -0800, Randy.Dunlap wrote: | > | >> drivers/net/arm/am79c961a.c | 18 +++++++++--------- | >> drivers/net/arm/ether1.c | 18 +++++++++--------- | >> drivers/net/arm/ether3.c | 18 +++++++++--------- | >> drivers/net/arm/etherh.c | 4 ++-- | >> 4 files changed, 29 insertions(+), 29 deletions(-) | > | > | > I think we should really consider using netdev_priv() in all these places | > so the compiler knows that 'dev' and 'priv' are related. | | | Good point. I respectfully disagree, but if the maintainter won't merge them as is, so be it. I have trouble understanding why this: return (char *)dev + ((sizeof(struct net_device) + 31) & ~31); is better than using a structure->field, i.e., dev->priv Can one of you enlighten me? Using dev->priv shows that 'dev' and 'priv' are related. -- ~Randy From rddunlap@osdl.org Tue Mar 2 11:18:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 11:18:50 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22JIiKO019727 for ; Tue, 2 Mar 2004 11:18:44 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i22JHaE17628; Tue, 2 Mar 2004 11:17:36 -0800 Date: Tue, 2 Mar 2004 11:17:00 -0800 From: "Randy.Dunlap" To: Jeff Garzik Cc: rmk@arm.linux.org.uk, netdev@oss.sgi.com Subject: Re: [janitor] remove casts in drivers/net/arm/ Message-Id: <20040302111700.76c0b381.rddunlap@osdl.org> In-Reply-To: <4044DB78.7040309@pobox.com> References: <20040229142516.3d218ed0.rddunlap@osdl.org> <20040229143436.4bb884ee.rddunlap@osdl.org> <20040302121042.A9931@flint.arm.linux.org.uk> <4044D86C.70709@pobox.com> <20040302110237.0f580736.rddunlap@osdl.org> <4044DB78.7040309@pobox.com> Organization: OSDL X-Mailer: Sylpheed version 0.9.4 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3699 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 1382 Lines: 42 On Tue, 02 Mar 2004 14:07:36 -0500 Jeff Garzik wrote: | Randy.Dunlap wrote: | > On Tue, 02 Mar 2004 13:54:36 -0500 Jeff Garzik wrote: | > | > | Russell King wrote: | > | > On Sun, Feb 29, 2004 at 02:34:36PM -0800, Randy.Dunlap wrote: | > | > | > | >> drivers/net/arm/am79c961a.c | 18 +++++++++--------- | > | >> drivers/net/arm/ether1.c | 18 +++++++++--------- | > | >> drivers/net/arm/ether3.c | 18 +++++++++--------- | > | >> drivers/net/arm/etherh.c | 4 ++-- | > | >> 4 files changed, 29 insertions(+), 29 deletions(-) | > | > | > | > | > | > I think we should really consider using netdev_priv() in all these places | > | > so the compiler knows that 'dev' and 'priv' are related. | > | | > | | > | Good point. | > | > I respectfully disagree, but if the maintainter won't merge | > them as is, so be it. | > | > I have trouble understanding why this: | > return (char *)dev + ((sizeof(struct net_device) + 31) & ~31); | > is better than using a structure->field, i.e., | > dev->priv | > | > Can one of you enlighten me? | | | One is an additional pointer load and dereference, and one is a constant | offset from the beginning of the dev structure, calculated at compile | time. netdev_priv() provides the same results as dev->priv but at less | cost. OK, thanks, I see. I think it's ugly, but you'll get updated patches anyway. -- ~Randy From jgarzik@pobox.com Tue Mar 2 11:29:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 11:29:22 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22JTFKO020334 for ; Tue, 2 Mar 2004 11:29:16 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:2967 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1AyFZq-0002k5-RQ; Tue, 02 Mar 2004 19:29:14 +0000 Message-ID: <4044E07E.8000409@pobox.com> Date: Tue, 02 Mar 2004 14:29:02 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Randy.Dunlap" CC: rmk@arm.linux.org.uk, netdev@oss.sgi.com Subject: Re: [janitor] remove casts in drivers/net/arm/ References: <20040229142516.3d218ed0.rddunlap@osdl.org> <20040229143436.4bb884ee.rddunlap@osdl.org> <20040302121042.A9931@flint.arm.linux.org.uk> <4044D86C.70709@pobox.com> <20040302110237.0f580736.rddunlap@osdl.org> <4044DB78.7040309@pobox.com> <20040302111700.76c0b381.rddunlap@osdl.org> In-Reply-To: <20040302111700.76c0b381.rddunlap@osdl.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3700 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 1747 Lines: 56 Randy.Dunlap wrote: > On Tue, 02 Mar 2004 14:07:36 -0500 Jeff Garzik wrote: > > | Randy.Dunlap wrote: > | > On Tue, 02 Mar 2004 13:54:36 -0500 Jeff Garzik wrote: > | > > | > | Russell King wrote: > | > | > On Sun, Feb 29, 2004 at 02:34:36PM -0800, Randy.Dunlap wrote: > | > | > > | > | >> drivers/net/arm/am79c961a.c | 18 +++++++++--------- > | > | >> drivers/net/arm/ether1.c | 18 +++++++++--------- > | > | >> drivers/net/arm/ether3.c | 18 +++++++++--------- > | > | >> drivers/net/arm/etherh.c | 4 ++-- > | > | >> 4 files changed, 29 insertions(+), 29 deletions(-) > | > | > > | > | > > | > | > I think we should really consider using netdev_priv() in all these places > | > | > so the compiler knows that 'dev' and 'priv' are related. > | > | > | > | > | > | Good point. > | > > | > I respectfully disagree, but if the maintainter won't merge > | > them as is, so be it. > | > > | > I have trouble understanding why this: > | > return (char *)dev + ((sizeof(struct net_device) + 31) & ~31); > | > is better than using a structure->field, i.e., > | > dev->priv > | > > | > Can one of you enlighten me? > | > | > | One is an additional pointer load and dereference, and one is a constant > | offset from the beginning of the dev structure, calculated at compile > | time. netdev_priv() provides the same results as dev->priv but at less > | cost. > > OK, thanks, I see. > I think it's ugly, but you'll get updated patches anyway. I wasn't rejecting your patches. In fact, I want to apply your cast patches separate from any netdev_priv() cleanup. netdev_priv() should be a separate item on the janitor todo list. RMK however is free to reject these patches for drivers/net/arm/ of course... Jeff From brazilnut@us.ibm.com Tue Mar 2 11:30:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 11:30:06 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22JTxKO020447 for ; Tue, 2 Mar 2004 11:29:59 -0800 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e34.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i22JTqrj089502; Tue, 2 Mar 2004 14:29:52 -0500 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.193.82]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i22JToHN096462; Tue, 2 Mar 2004 12:29:51 -0700 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i22JRiJ11750; Tue, 2 Mar 2004 11:27:44 -0800 From: Don Fry Message-Id: <200403021927.i22JRiJ11750@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.6.4-rc1] pcnet32 correct names for changes To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Tue, 2 Mar 2004 11:27:44 -0800 (PST) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 3701 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 947 Lines: 22 This patch corrects the names of contributors of changes to the pcnet32 driver. --- linux-2.6.4-rc1/drivers/net/good.pcnet32.c Tue Mar 2 09:44:22 2004 +++ linux-2.6.4-rc1/drivers/net/pcnet32.c Tue Mar 2 11:24:43 2004 @@ -225,10 +225,12 @@ * v1.27b Sep 30 2002 Kent Yoder * Added timer for cable connection state changes. * v1.28 20 Feb 2004 Don Fry - * Jon Lewis , Chinmay Albal + * Jon Mason , Chinmay Albal * Now uses ethtool_ops, netif_msg_* and generic_mii_ioctl. * Fixes bogus 'Bus master arbitration failure', pci_[un]map_single * length errors, and transmit hangs. Cleans up after errors in open. + * Jim Lewis added ethernet loopback test. + * Thomas Munck Steenholdt non-mii ioctl corrections. */ -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Tue Mar 2 11:31:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 11:31:11 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22JV0KO021042 for ; Tue, 2 Mar 2004 11:31:00 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e34.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i22JUrrj443198; Tue, 2 Mar 2004 14:30:53 -0500 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.193.82]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i22JUq65092062; Tue, 2 Mar 2004 12:30:52 -0700 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i22JSkv11760; Tue, 2 Mar 2004 11:28:46 -0800 From: Don Fry Message-Id: <200403021928.i22JSkv11760@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.4.25] pcnet32 correct names for changes To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Tue, 2 Mar 2004 11:28:46 -0800 (PST) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 3702 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 930 Lines: 23 This patch corrects the names of contributors of changes to the pcnet32 driver. --- linux-2.4.25/drivers/net/good.pcnet32.c Wed Feb 25 12:07:48 2004 +++ linux-2.4.25/drivers/net/pcnet32.c Tue Mar 2 11:24:03 2004 @@ -224,10 +224,12 @@ * FD auto negotiate error workaround for xSeries250 * clean up and using new mii module * v1.28 20 Feb 2004 Don Fry - * Jon Lewis , Chinmay Albal + * Jon Mason , Chinmay Albal * Now uses ethtool_ops, netif_msg_* and generic_mii_ioctl. * Fixes bogus 'Bus master arbitration failure', pci_[un]map_single * length errors, and transmit hangs. Cleans up after errors in open. + * Jim Lewis added ethernet loopback test. + * Thomas Munck Steenholdt non-mii ioctl corrections. */ -- Don Fry brazilnut@us.ibm.com From rmk@arm.linux.org.uk Tue Mar 2 11:36:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 11:36:16 -0800 (PST) Received: from caramon.arm.linux.org.uk (caramon.arm.linux.org.uk [212.18.232.186]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22JaBKO021494 for ; Tue, 2 Mar 2004 11:36:12 -0800 Received: from flint.arm.linux.org.uk ([2002:d412:e8ba:1:201:2ff:fe14:8fad]) by caramon.arm.linux.org.uk with asmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.30) id 1AyFgT-00009o-58; Tue, 02 Mar 2004 19:36:05 +0000 Received: from rmk by flint.arm.linux.org.uk with local (Exim 4.30) id 1AyFgS-0006oI-B1; Tue, 02 Mar 2004 19:36:04 +0000 Date: Tue, 2 Mar 2004 19:36:04 +0000 From: Russell King To: Jeff Garzik Cc: "Randy.Dunlap" , netdev@oss.sgi.com Subject: Re: [janitor] remove casts in drivers/net/arm/ Message-ID: <20040302193604.G12353@flint.arm.linux.org.uk> References: <20040229142516.3d218ed0.rddunlap@osdl.org> <20040229143436.4bb884ee.rddunlap@osdl.org> <20040302121042.A9931@flint.arm.linux.org.uk> <4044D86C.70709@pobox.com> <20040302110237.0f580736.rddunlap@osdl.org> <4044DB78.7040309@pobox.com> <20040302111700.76c0b381.rddunlap@osdl.org> <4044E07E.8000409@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <4044E07E.8000409@pobox.com>; from jgarzik@pobox.com on Tue, Mar 02, 2004 at 02:29:02PM -0500 X-archive-position: 3703 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rmk@arm.linux.org.uk Precedence: bulk X-list: netdev Content-Length: 703 Lines: 21 On Tue, Mar 02, 2004 at 02:29:02PM -0500, Jeff Garzik wrote: > I wasn't rejecting your patches. > > In fact, I want to apply your cast patches separate from any > netdev_priv() cleanup. > > netdev_priv() should be a separate item on the janitor todo list. > > RMK however is free to reject these patches for drivers/net/arm/ of > course... I'm easy - I probably won't look at this until post-2.6.4 anyway. However, it seems a bit silly to produce two patches changing the exact same lines when one patch would do. -- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/ 2.6 Serial core From shemminger@osdl.org Tue Mar 2 12:06:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 12:06:06 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22K61KO022534 for ; Tue, 2 Mar 2004 12:06:01 -0800 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i22K52E30099; Tue, 2 Mar 2004 12:05:02 -0800 Date: Tue, 2 Mar 2004 12:05:01 -0800 From: Stephen Hemminger To: "David S. Miller" Cc: Jean Tourrilhes , netdev@oss.sgi.com, Irda Users Subject: [PATCH] stir4200 update for 2.6.4-rc1 Message-Id: <20040302120501.7fa8f698@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.9claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3704 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 28092 Lines: 1025 New revision of the Sigmatel irda driver. This version has much better performance and doesn't drop frames in FIR mode. Tested with both UHCI and EHCI/OHCI against nsc-ircc on laptop. Thanks to Martin for additional testing and feedback. * Receiver: - changed from interrupt to bulk URB. Queue's one bulk urb per USB tick (1ms). - FIR unpack now uses get_unaligned and cpu32_le instead of explicit shifts - FIR unpack copies small frames * Transmitter: - pack data into io buffer. Since irda is half duplex can use same buffer for transmit and receive. - use xchange and wait_event for synchronization * Other: - use USB format messages rather than IRDA (ugly) - clean up USB startup - reset device on network open to clear up stuck state - handle FIFO errors - disconnect cleanup (from viro) - don't DMA onto stack when reading fifo status David, please apply. There maybe more small tweaks later as it gets wider usage. --- linux-2.6/drivers/net/irda/stir4200.c 2004-02-18 14:14:14.000000000 -0800 +++ test-2.6/drivers/net/irda/stir4200.c 2004-03-02 11:11:21.413890216 -0800 @@ -49,12 +49,14 @@ #include #include #include +#include #include #include #include #include #include -#include +#include +#include MODULE_AUTHOR("Stephen Hemminger "); MODULE_DESCRIPTION("IrDA-USB Dongle Driver for SigmaTel STIr4200"); @@ -72,15 +74,11 @@ static int tx_power = 0; /* 0 = highest module_param(tx_power, int, 0); MODULE_PARM_DESC(tx_power, "Set Transmitter power (0-3, 0 is highest power)"); -static int rx_interval = 5; /* milliseconds */ -module_param(rx_interval, int, 0); -MODULE_PARM_DESC(rx_interval, "Receive polling interval (ms)"); - #define STIR_IRDA_HEADER 4 #define CTRL_TIMEOUT 100 /* milliseconds */ #define TRANSMIT_TIMEOUT 200 /* milliseconds */ #define STIR_FIFO_SIZE 4096 -#define NUM_RX_URBS 2 +#define FIFO_REGS_SIZE 3 enum FirChars { FIR_CE = 0x7d, @@ -167,36 +165,26 @@ enum StirTestMask { TEST_TSTOSC = 0x0F, }; -enum StirState { - STIR_STATE_RECEIVING=0, - STIR_STATE_TXREADY, -}; - struct stir_cb { struct usb_device *usbdev; /* init: probe_irda */ struct net_device *netdev; /* network layer */ struct irlap_cb *irlap; /* The link layer we are binded to */ struct net_device_stats stats; /* network statistics */ struct qos_info qos; - unsigned long state; unsigned speed; /* Current speed */ wait_queue_head_t thr_wait; /* transmit thread wakeup */ struct completion thr_exited; pid_t thr_pid; - unsigned int tx_bulkpipe; - void *tx_data; /* wrapped data out */ - unsigned tx_len; - unsigned tx_newspeed; - unsigned tx_mtt; + struct sk_buff *tx_pending; + void *io_buf; /* transmit/receive buffer */ + __u8 *fifo_status; - unsigned int rx_intpipe; iobuff_t rx_buff; /* receive unwrap state machine */ - struct timespec rx_time; - - struct urb *rx_urbs[NUM_RX_URBS]; - void *rx_data[NUM_RX_URBS]; + struct timeval rx_time; + int receiving; + struct urb *rx_urb; }; @@ -209,9 +197,6 @@ static struct usb_device_id dongles[] = MODULE_DEVICE_TABLE(usb, dongles); -static int fifo_txwait(struct stir_cb *stir, unsigned space); -static void stir_usb_receive(struct urb *urb, struct pt_regs *regs); - /* Send control message to set dongle register */ static int write_reg(struct stir_cb *stir, __u16 reg, __u8 value) { @@ -239,6 +224,11 @@ static inline int read_reg(struct stir_c MSECS_TO_JIFFIES(CTRL_TIMEOUT)); } +static inline int isfir(u32 speed) +{ + return (speed == 4000000); +} + /* * Prepare a FIR IrDA frame for transmission to the USB dongle. The * FIR transmit frame is documented in the datasheet. It consists of @@ -333,8 +323,8 @@ static void fir_eof(struct stir_cb *stir { iobuff_t *rx_buff = &stir->rx_buff; int len = rx_buff->len - 4; + struct sk_buff *skb, *nskb; __u32 fcs; - struct sk_buff *nskb; if (unlikely(len <= 0)) { pr_debug("%s: short frame len %d\n", @@ -345,41 +335,46 @@ static void fir_eof(struct stir_cb *stir return; } - fcs = rx_buff->data[len] | - rx_buff->data[len+1] << 8 | - rx_buff->data[len+2] << 16 | - rx_buff->data[len+3] << 24; - - if (unlikely(fcs != ~(crc32_le(~0, rx_buff->data, len)))) { - pr_debug("%s: crc error\n", stir->netdev->name); - irda_device_set_media_busy(stir->netdev, TRUE); + fcs = ~(crc32_le(~0, rx_buff->data, len)); + if (fcs != le32_to_cpu(get_unaligned((u32 *)(rx_buff->data+len)))) { + pr_debug("crc error calc 0x%x len %d\n", fcs, len); stir->stats.rx_errors++; stir->stats.rx_crc_errors++; return; } - /* If can't get new buffer, just drop and reuse */ - nskb = dev_alloc_skb(IRDA_SKB_MAX_MTU); - if (unlikely(!nskb)) - ++stir->stats.rx_dropped; - else { - struct sk_buff *oskb = rx_buff->skb; + /* if frame is short then just copy it */ + if (len < IRDA_RX_COPY_THRESHOLD) { + nskb = dev_alloc_skb(len + 1); + if (unlikely(!nskb)) { + ++stir->stats.rx_dropped; + return; + } + skb_reserve(nskb, 1); + skb = nskb; + memcpy(nskb->data, rx_buff->data, len); + } else { + nskb = dev_alloc_skb(rx_buff->truesize); + if (unlikely(!nskb)) { + ++stir->stats.rx_dropped; + return; + } skb_reserve(nskb, 1); + skb = rx_buff->skb; + rx_buff->skb = nskb; + rx_buff->head = nskb->data; + } - /* Set correct length in socket buffer */ - skb_put(oskb, len); + skb_put(skb, len); - oskb->mac.raw = oskb->data; - oskb->protocol = htons(ETH_P_IRDA); - oskb->dev = stir->netdev; + skb->mac.raw = skb->data; + skb->protocol = htons(ETH_P_IRDA); + skb->dev = stir->netdev; - netif_rx(oskb); + netif_rx(skb); - stir->stats.rx_packets++; - stir->stats.rx_bytes += len; - rx_buff->skb = nskb; - rx_buff->head = nskb->data; - } + stir->stats.rx_packets++; + stir->stats.rx_bytes += len; rx_buff->data = rx_buff->head; rx_buff->len = 0; @@ -402,7 +397,6 @@ static void stir_fir_chars(struct stir_c continue; /* Now receiving frame */ rx_buff->state = BEGIN_FRAME; - rx_buff->in_frame = TRUE; /* Time to initialize receive buffer */ rx_buff->data = rx_buff->head; @@ -424,6 +418,7 @@ static void stir_fir_chars(struct stir_c if (byte == FIR_EOF) continue; rx_buff->state = INSIDE_FRAME; + rx_buff->in_frame = TRUE; /* fall through */ case INSIDE_FRAME: @@ -461,7 +456,6 @@ static void stir_fir_chars(struct stir_c error_recovery: ++stir->stats.rx_errors; - irda_device_set_media_busy(stir->netdev, TRUE); rx_buff->state = OUTSIDE_FRAME; rx_buff->in_frame = FALSE; } @@ -478,11 +472,6 @@ static void stir_sir_chars(struct stir_c &stir->rx_buff, bytes[i]); } -static inline int isfir(u32 speed) -{ - return (speed == 4000000); -} - static inline void unwrap_chars(struct stir_cb *stir, const __u8 *bytes, int length) { @@ -519,25 +508,31 @@ static int change_speed(struct stir_cb * int i, err; __u8 mode; - pr_debug("%s: change speed %d\n", stir->netdev->name, speed); for (i = 0; i < ARRAY_SIZE(stir_modes); ++i) { if (speed == stir_modes[i].speed) goto found; } - ERROR("%s: invalid speed %d\n", stir->netdev->name, speed); + warn("%s: invalid speed %d", stir->netdev->name, speed); return -EINVAL; found: - pr_debug("%s: speed change from %d to %d\n", - stir->netdev->name, stir->speed, speed); + pr_debug("speed change from %d to %d\n", stir->speed, speed); + + /* sometimes needed to get chip out of stuck state */ + err = usb_reset_device(stir->usbdev); + if (err) + goto out; + + /* Reset modulator */ + err = write_reg(stir, REG_CTRL1, CTRL1_SRESET); + if (err) + goto out; - /* Make sure any previous Tx is really finished. This happens - * when we answer an incomming request ; the ua:rsp and the - * speed change are bundled together, so we need to wait until - * the packet we just submitted has been sent. Jean II */ - if (fifo_txwait(stir, 0)) - return -EIO; + /* Undocumented magic to tweak the DPLL */ + err = write_reg(stir, REG_DPLL, 0x15); + if (err) + goto out; /* Set clock */ err = write_reg(stir, REG_PDCLK, stir_modes[i].pdclk); @@ -564,33 +559,13 @@ static int change_speed(struct stir_cb * goto out; err = write_reg(stir, REG_CTRL1, (tx_power & 3) << 1); - - out: - stir->speed = speed; - return err; -} - -static int stir_reset(struct stir_cb *stir) -{ - int err; - - /* reset state */ - stir->rx_buff.in_frame = FALSE; - stir->rx_buff.state = OUTSIDE_FRAME; - stir->speed = -1; - - /* Undocumented magic to tweak the DPLL */ - err = write_reg(stir, REG_DPLL, 0x15); if (err) goto out; /* Reset sensitivity */ err = write_reg(stir, REG_CTRL2, (rx_sensitivity & 7) << 5); - if (err) - goto out; - - err = change_speed(stir, 9600); out: + stir->speed = speed; return err; } @@ -606,48 +581,62 @@ static int stir_hard_xmit(struct sk_buff /* the IRDA wrapping routines don't deal with non linear skb */ SKB_LINEAR_ASSERT(skb); - if (unlikely(skb->len) == 0) /* speed change only */ - stir->tx_len = 0; - else if (isfir(stir->speed)) - stir->tx_len = wrap_fir_skb(skb, stir->tx_data); - else - stir->tx_len = wrap_sir_skb(skb, stir->tx_data); - - stir->stats.tx_packets++; - stir->stats.tx_bytes += skb->len; - - stir->tx_mtt = irda_get_mtt(skb); - stir->tx_newspeed = irda_get_next_speed(skb); - - if (!test_and_set_bit(STIR_STATE_TXREADY, &stir->state)) - wake_up(&stir->thr_wait); + skb = xchg(&stir->tx_pending, skb); + wake_up(&stir->thr_wait); + + /* this should never happen unless stop/wakeup problem */ + if (unlikely(skb)) { + WARN_ON(1); + dev_kfree_skb(skb); + } - dev_kfree_skb(skb); return 0; } /* * Wait for the transmit FIFO to have space for next data + * + * If space < 0 then wait till FIFO completely drains. + * FYI: can take up to 13 seconds at 2400baud. */ -static int fifo_txwait(struct stir_cb *stir, unsigned space) +static int fifo_txwait(struct stir_cb *stir, int space) { int err; - unsigned count; - __u8 regs[3]; - unsigned long timeout = jiffies + HZ/10; + unsigned long count, status; + /* Read FIFO status and count */ for(;;) { - /* Read FIFO status and count */ - err = read_reg(stir, REG_FIFOCTL, regs, 3); - if (unlikely(err != 3)) { - WARNING("%s: FIFO register read error: %d\n", - stir->netdev->name, err); + err = read_reg(stir, REG_FIFOCTL, stir->fifo_status, + FIFO_REGS_SIZE); + if (unlikely(err != FIFO_REGS_SIZE)) { + warn("%s: FIFO register read error: %d", + stir->netdev->name, err); + return err; } + status = stir->fifo_status[0]; + count = (unsigned)(stir->fifo_status[2] & 0x1f) << 8 + | stir->fifo_status[1]; + + pr_debug("fifo status 0x%lx count %lu\n", status, count); + + /* error when receive/transmit fifo gets confused */ + if (status & FIFOCTL_RXERR) { + stir->stats.rx_fifo_errors++; + stir->stats.rx_errors++; + break; + } + + if (status & FIFOCTL_TXERR) { + stir->stats.tx_fifo_errors++; + stir->stats.tx_errors++; + break; + } + /* is fifo receiving already, or empty */ - if (!(regs[0] & FIFOCTL_DIR) - || (regs[0] & FIFOCTL_EMPTY)) + if (!(status & FIFOCTL_DIR) + || (status & FIFOCTL_EMPTY)) return 0; if (signal_pending(current)) @@ -658,40 +647,37 @@ static int fifo_txwait(struct stir_cb *s || !netif_device_present(stir->netdev)) return -ESHUTDOWN; - count = (unsigned)(regs[2] & 0x1f) << 8 | regs[1]; - - pr_debug("%s: fifo status 0x%x count %u\n", - stir->netdev->name, regs[0], count); - /* only waiting for some space */ - if (space && STIR_FIFO_SIZE - 4 > space + count) + if (space >= 0 && STIR_FIFO_SIZE - 4 > space + count) return 0; - if (time_after(jiffies, timeout)) { - WARNING("%s: transmit fifo timeout status=0x%x count=%d\n", - stir->netdev->name, regs[0], count); - ++stir->stats.tx_errors; - irda_device_set_media_busy(stir->netdev, TRUE); - return -ETIMEDOUT; - } - /* estimate transfer time for remaining chars */ wait_ms((count * 8000) / stir->speed); } + + err = write_reg(stir, REG_FIFOCTL, FIFOCTL_CLR); + if (err) + return err; + err = write_reg(stir, REG_FIFOCTL, 0); + if (err) + return err; + + return 0; } /* Wait for turnaround delay before starting transmit. */ -static void turnaround_delay(long us, const struct timespec *last) +static void turnaround_delay(const struct stir_cb *stir, long us) { long ticks; - struct timespec now = CURRENT_TIME; + struct timeval now; if (us <= 0) return; - us -= (now.tv_sec - last->tv_sec) * USEC_PER_SEC; - us -= (now.tv_nsec - last->tv_nsec) / NSEC_PER_USEC; + do_gettimeofday(&now); + us -= (now.tv_sec - stir->rx_time.tv_sec) * USEC_PER_SEC; + us -= now.tv_usec - stir->rx_time.tv_usec; if (us < 10) return; @@ -707,77 +693,60 @@ static void turnaround_delay(long us, co * Start receiver by submitting a request to the receive pipe. * If nothing is available it will return after rx_interval. */ -static void receive_start(struct stir_cb *stir) +static int receive_start(struct stir_cb *stir) { - int i; - - if (test_and_set_bit(STIR_STATE_RECEIVING, &stir->state)) - return; - - if (fifo_txwait(stir, 0)) - return; - - for (i = 0; i < NUM_RX_URBS; i++) { - struct urb *urb = stir->rx_urbs[i]; - - usb_fill_int_urb(urb, stir->usbdev, stir->rx_intpipe, - stir->rx_data[i], STIR_FIFO_SIZE, - stir_usb_receive, stir, rx_interval); - - if (usb_submit_urb(urb, GFP_KERNEL)) - urb->status = -EINVAL; - } + /* reset state */ + stir->receiving = 1; - if (i == 0) { - /* if nothing got queued, then just retry next time */ - if (net_ratelimit()) - WARNING("%s: no receive buffers avaiable\n", - stir->netdev->name); + stir->rx_buff.in_frame = FALSE; + stir->rx_buff.state = OUTSIDE_FRAME; - clear_bit(STIR_STATE_RECEIVING, &stir->state); - } + stir->rx_urb->status = 0; + return usb_submit_urb(stir->rx_urb, GFP_KERNEL); } /* Stop all pending receive Urb's */ static void receive_stop(struct stir_cb *stir) { - int i; + stir->receiving = 0; + usb_unlink_urb(stir->rx_urb); - for (i = 0; i < NUM_RX_URBS; i++) { - struct urb *urb = stir->rx_urbs[i]; - usb_unlink_urb(urb); - } + if (stir->rx_buff.in_frame) + stir->stats.collisions++; } - -/* Send wrapped data (in tx_data) to device */ -static void stir_send(struct stir_cb *stir) +/* + * Wrap data in socket buffer and send it. + */ +static void stir_send(struct stir_cb *stir, struct sk_buff *skb) { - int rc; + unsigned wraplen; + int first_frame = 0; - if (test_and_clear_bit(STIR_STATE_RECEIVING, &stir->state)) { + /* if receiving, need to turnaround */ + if (stir->receiving) { receive_stop(stir); - - turnaround_delay(stir->tx_mtt, &stir->rx_time); - - if (stir->rx_buff.in_frame) - ++stir->stats.collisions; + turnaround_delay(stir, irda_get_mtt(skb)); + first_frame = 1; } - else if (fifo_txwait(stir, stir->tx_len)) - return; /* shutdown or major errors */ + if (isfir(stir->speed)) + wraplen = wrap_fir_skb(skb, stir->io_buf); + else + wraplen = wrap_sir_skb(skb, stir->io_buf); + + /* check for space available in fifo */ + if (!first_frame) + fifo_txwait(stir, wraplen); + + stir->stats.tx_packets++; + stir->stats.tx_bytes += skb->len; stir->netdev->trans_start = jiffies; + pr_debug("send %d (%d)\n", skb->len, wraplen); - pr_debug("%s: send %d\n", stir->netdev->name, stir->tx_len); - rc = usb_bulk_msg(stir->usbdev, - stir->tx_bulkpipe, - stir->tx_data, stir->tx_len, - NULL, MSECS_TO_JIFFIES(TRANSMIT_TIMEOUT)); - - if (unlikely(rc)) { - WARNING("%s: usb bulk message failed %d\n", - stir->netdev->name, rc); + if (usb_bulk_msg(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1), + stir->io_buf, wraplen, + NULL, MSECS_TO_JIFFIES(TRANSMIT_TIMEOUT))) stir->stats.tx_errors++; - } } /* @@ -787,7 +756,7 @@ static int stir_transmit_thread(void *ar { struct stir_cb *stir = arg; struct net_device *dev = stir->netdev; - DECLARE_WAITQUEUE(wait, current); + struct sk_buff *skb; daemonize("%s", dev->name); allow_signal(SIGTERM); @@ -796,44 +765,58 @@ static int stir_transmit_thread(void *ar && netif_device_present(dev) && !signal_pending(current)) { - /* make swsusp happy with our thread */ + /* if suspending, then power off and wait */ if (current->flags & PF_FREEZE) { - receive_stop(stir); + if (stir->receiving) + receive_stop(stir); + else + fifo_txwait(stir, -1); write_reg(stir, REG_CTRL1, CTRL1_TXPWD|CTRL1_RXPWD); refrigerator(PF_IOTHREAD); - stir_reset(stir); + if (change_speed(stir, stir->speed)) + break; } /* if something to send? */ - if (test_and_clear_bit(STIR_STATE_TXREADY, &stir->state)) { - unsigned new_speed = stir->tx_newspeed; - - /* Note that we may both send a packet and - * change speed in some cases. Jean II */ - - if (stir->tx_len != 0) - stir_send(stir); - - if (stir->speed != new_speed) - change_speed(stir, new_speed); - - netif_wake_queue(stir->netdev); + skb = xchg(&stir->tx_pending, NULL); + if (skb) { + unsigned new_speed = irda_get_next_speed(skb); + netif_wake_queue(dev); + + if (skb->len > 0) + stir_send(stir, skb); + dev_kfree_skb(skb); + + if (stir->speed != new_speed) { + if (fifo_txwait(stir, -1) || + change_speed(stir, new_speed)) + break; + } continue; } - if (irda_device_txqueue_empty(dev)) - receive_start(stir); + /* nothing to send? start receiving */ + if (!stir->receiving + && irda_device_txqueue_empty(dev)) { + /* Wait otherwise chip gets confused. */ + if (fifo_txwait(stir, -1)) + break; + + if (unlikely(receive_start(stir))) { + if (net_ratelimit()) + info("%s: receive usb submit failed", + stir->netdev->name); + stir->receiving = 0; + wait_ms(10); + continue; + } + } - set_task_state(current, TASK_INTERRUPTIBLE); - add_wait_queue(&stir->thr_wait, &wait); - if (test_bit(STIR_STATE_TXREADY, &stir->state)) - __set_task_state(current, TASK_RUNNING); - else - schedule_timeout(HZ/10); - remove_wait_queue(&stir->thr_wait, &wait); + /* sleep if nothing to send */ + wait_event_interruptible(stir->thr_wait, stir->tx_pending); } complete_and_exit (&stir->thr_exited, 0); @@ -841,48 +824,34 @@ static int stir_transmit_thread(void *ar /* - * Receive wrapped data into rx_data buffer. - * This chip doesn't block until data is available, we just have - * to read the FIFO perodically (ugh). + * USB bulk receive completion callback. + * Wakes up every ms (usb round trip) with wrapped + * data. */ -static void stir_usb_receive(struct urb *urb, struct pt_regs *regs) +static void stir_rcv_irq(struct urb *urb, struct pt_regs *regs) { struct stir_cb *stir = urb->context; int err; + /* in process of stopping, just drop data */ if (!netif_running(stir->netdev)) return; - switch (urb->status) { - case 0: - if(urb->actual_length > 0) { - pr_debug("%s: receive %d\n", - stir->netdev->name, urb->actual_length); - unwrap_chars(stir, urb->transfer_buffer, - urb->actual_length); - - stir->netdev->last_rx = jiffies; - stir->rx_time = CURRENT_TIME; - } - break; - - case -ECONNRESET: /* killed but pending */ - case -ENOENT: /* killed but not in use */ - case -ESHUTDOWN: - /* These are normal errors when URB is cancelled */ - stir->rx_buff.in_frame = FALSE; - stir->rx_buff.state = OUTSIDE_FRAME; + /* unlink, shutdown, unplug, other nasties */ + if (urb->status != 0) return; - default: - WARNING("%s: received status %d\n", stir->netdev->name, - urb->status); - stir->stats.rx_errors++; - urb->status = 0; + if (urb->actual_length > 0) { + pr_debug("receive %d\n", urb->actual_length); + unwrap_chars(stir, urb->transfer_buffer, + urb->actual_length); + + stir->netdev->last_rx = jiffies; + do_gettimeofday(&stir->rx_time); } /* kernel thread is stopping receiver don't resubmit */ - if (!test_bit(STIR_STATE_RECEIVING, &stir->state)) + if (!stir->receiving) return; /* resubmit existing urb */ @@ -890,14 +859,13 @@ static void stir_usb_receive(struct urb /* in case of error, the kernel thread will restart us */ if (err) { - WARNING("%s: usb receive submit error: %d\n", + warn("%s: usb receive submit error: %d", stir->netdev->name, err); - urb->status = -ENOENT; + stir->receiving = 0; wake_up(&stir->thr_wait); } } - /* * Function stir_net_open (dev) * @@ -906,50 +874,50 @@ static void stir_usb_receive(struct urb static int stir_net_open(struct net_device *netdev) { struct stir_cb *stir = netdev->priv; - int i, err; - char hwname[16]; + int err; + char hwname[16]; - err = stir_reset(stir); + err = usb_clear_halt(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1)); + if (err) + goto err_out1; + err = usb_clear_halt(stir->usbdev, usb_rcvbulkpipe(stir->usbdev, 2)); if (err) goto err_out1; - err = -ENOMEM; - - /* Note: Max SIR frame possible is 4273 */ - stir->tx_data = kmalloc(STIR_FIFO_SIZE, GFP_KERNEL); - if (!stir->tx_data) { - ERROR("%s(), alloc failed for rxbuf!\n", __FUNCTION__); + err = change_speed(stir, 9600); + if (err) goto err_out1; - } + + err = -ENOMEM; /* Initialize for SIR/FIR to copy data directly into skb. */ + stir->receiving = 0; stir->rx_buff.truesize = IRDA_SKB_MAX_MTU; stir->rx_buff.skb = dev_alloc_skb(IRDA_SKB_MAX_MTU); - if (!stir->rx_buff.skb) { - ERROR("%s(), dev_alloc_skb() failed for rxbuf!\n", - __FUNCTION__); - goto err_out2; - } + if (!stir->rx_buff.skb) + goto err_out1; + skb_reserve(stir->rx_buff.skb, 1); stir->rx_buff.head = stir->rx_buff.skb->data; - stir->rx_time = CURRENT_TIME; + do_gettimeofday(&stir->rx_time); - /* Allocate N receive buffer's and urbs */ - for (i = 0; i < NUM_RX_URBS; i++) { - stir->rx_urbs[i] = usb_alloc_urb(0, GFP_KERNEL); - if (!stir->rx_urbs[i]){ - ERROR("%s(), usb_alloc_urb failed\n", __FUNCTION__); - goto err_out3; - } + stir->rx_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!stir->rx_urb) + goto err_out2; - stir->rx_data[i] = kmalloc(STIR_FIFO_SIZE, GFP_KERNEL); - if (!stir->rx_data) { - usb_free_urb(stir->rx_urbs[i]); - ERROR("%s(), alloc failed for rxbuf!\n", __FUNCTION__); - goto err_out3; - } - } + stir->io_buf = kmalloc(STIR_FIFO_SIZE, GFP_KERNEL); + if (!stir->io_buf) + goto err_out3; + usb_fill_bulk_urb(stir->rx_urb, stir->usbdev, + usb_rcvbulkpipe(stir->usbdev, 2), + stir->io_buf, STIR_FIFO_SIZE, + stir_rcv_irq, stir); + + stir->fifo_status = kmalloc(FIFO_REGS_SIZE, GFP_KERNEL); + if (!stir->fifo_status) + goto err_out4; + /* * Now that everything should be initialized properly, * Open new IrLAP layer instance to take care of us... @@ -958,8 +926,8 @@ static int stir_net_open(struct net_devi sprintf(hwname, "usb#%d", stir->usbdev->devnum); stir->irlap = irlap_open(netdev, &stir->qos, hwname); if (!stir->irlap) { - ERROR("%s(): irlap_open failed\n", __FUNCTION__); - goto err_out3; + err("irlap_open failed"); + goto err_out5; } /** Start kernel thread for transmit. */ @@ -967,25 +935,24 @@ static int stir_net_open(struct net_devi CLONE_FS|CLONE_FILES); if (stir->thr_pid < 0) { err = stir->thr_pid; - WARNING("%s: unable to start kernel thread\n", - stir->netdev->name); - goto err_out4; + err("unable to start kernel thread"); + goto err_out6; } netif_start_queue(netdev); return 0; - err_out4: + err_out6: irlap_close(stir->irlap); + err_out5: + kfree(stir->fifo_status); + err_out4: + kfree(stir->io_buf); err_out3: - while(--i >= 0) { - usb_free_urb(stir->rx_urbs[i]); - kfree(stir->rx_data[i]); - } - kfree_skb(stir->rx_buff.skb); + usb_free_urb(stir->rx_urb); err_out2: - kfree(stir->tx_data); + kfree_skb(stir->rx_buff.skb); err_out1: return err; } @@ -999,7 +966,6 @@ static int stir_net_open(struct net_devi static int stir_net_close(struct net_device *netdev) { struct stir_cb *stir = netdev->priv; - int i; /* Stop transmit processing */ netif_stop_queue(netdev); @@ -1007,15 +973,13 @@ static int stir_net_close(struct net_dev /* Kill transmit thread */ kill_proc(stir->thr_pid, SIGTERM, 1); wait_for_completion(&stir->thr_exited); - kfree(stir->tx_data); - - clear_bit(STIR_STATE_RECEIVING, &stir->state); - receive_stop(stir); + kfree(stir->fifo_status); - for (i = 0; i < NUM_RX_URBS; i++) { - usb_free_urb(stir->rx_urbs[i]); - kfree(stir->rx_data[i]); - } + /* Mop up receive urb's */ + usb_unlink_urb(stir->rx_urb); + + kfree(stir->io_buf); + usb_free_urb(stir->rx_urb); kfree_skb(stir->rx_buff.skb); /* Stop and remove instance of IrLAP */ @@ -1057,7 +1021,7 @@ static int stir_net_ioctl(struct net_dev case SIOCGRECEIVING: /* Only approximately true */ - irq->ifr_receiving = test_bit(STIR_STATE_RECEIVING, &stir->state); + irq->ifr_receiving = stir->receiving; break; default: @@ -1077,53 +1041,6 @@ static struct net_device_stats *stir_net } /* - * Parse the various endpoints and find the one we need. - * - * The endpoint are the pipes used to communicate with the USB device. - * The spec defines 2 endpoints of type bulk transfer, one in, and one out. - * These are used to pass frames back and forth with the dongle. - */ -static int stir_setup_usb(struct stir_cb *stir, struct usb_interface *intf) -{ - struct usb_device *usbdev = interface_to_usbdev(intf); - const struct usb_host_interface *interface - = &intf->altsetting[intf->act_altsetting]; - const struct usb_endpoint_descriptor *ep_in = NULL; - const struct usb_endpoint_descriptor *ep_out = NULL; - int i; - - if (interface->desc.bNumEndpoints != 2) { - WARNING("%s: expected two endpoints\n", __FUNCTION__); - return -ENODEV; - } - - for(i = 0; i < interface->desc.bNumEndpoints; i++) { - const struct usb_endpoint_descriptor *ep - = &interface->endpoint[i].desc; - - if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) - == USB_ENDPOINT_XFER_BULK) { - /* We need to find an IN and an OUT */ - if ((ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) - ep_in = ep; - else - ep_out = ep; - } else - WARNING("%s: unknown endpoint type 0x%x\n", - __FUNCTION__, ep->bmAttributes); - } - - if (!ep_in || !ep_out) - return -EIO; - - stir->tx_bulkpipe = usb_sndbulkpipe(usbdev, - ep_out->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); - stir->rx_intpipe = usb_rcvintpipe(usbdev, - ep_in->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); - return 0; -} - -/* * This routine is called by the USB subsystem for each new device * in the system. We need to check if the device is ours, and in * this case start handling it. @@ -1149,9 +1066,9 @@ static int stir_probe(struct usb_interfa stir->netdev = net; stir->usbdev = dev; - ret = stir_setup_usb(stir, intf); + ret = usb_reset_configuration(dev); if (ret != 0) { - ERROR("%s(), Bogus endpoints...\n", __FUNCTION__); + err("usb reset configuration failed"); goto err_out2; } @@ -1180,10 +1097,6 @@ static int stir_probe(struct usb_interfa net->get_stats = stir_net_get_stats; net->do_ioctl = stir_net_ioctl; - ret = stir_reset(stir); - if (ret) - goto err_out2; - ret = register_netdev(net); if (ret != 0) goto err_out2; @@ -1206,23 +1119,14 @@ err_out1: static void stir_disconnect(struct usb_interface *intf) { struct stir_cb *stir = usb_get_intfdata(intf); - struct net_device *net; - usb_set_intfdata(intf, NULL); if (!stir) return; - /* Stop transmitter */ - net = stir->netdev; - netif_device_detach(net); - - /* Remove netdevice */ - unregister_netdev(net); - - /* No longer attached to USB bus */ - stir->usbdev = NULL; + unregister_netdev(stir->netdev); + free_netdev(stir->netdev); - free_netdev(net); + usb_set_intfdata(intf, NULL); } From dmitry_sem@mail.ru Tue Mar 2 12:48:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 12:48:25 -0800 (PST) Received: from mx1.mail.ru (mx1.mail.ru [194.67.23.21]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22Km8KO026452 for ; Tue, 2 Mar 2004 12:48:09 -0800 Received: from [195.133.237.213] (port=3025 helo=dmitry) by mx1.mail.ru with smtp id 1AyGo9-0001tZ-00 for netdev@oss.sgi.com; Tue, 02 Mar 2004 23:48:05 +0300 Message-ID: <002701c40097$bcc3d970$0107a8c0@dmitry> From: "Dmitry Semyonov" To: Subject: ethernet patch Date: Tue, 2 Mar 2004 23:46:37 +0300 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0019_01C400B0.9A46C5B0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-Spam: Not detected X-archive-position: 3705 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dmitry_sem@mail.ru Precedence: bulk X-list: netdev Content-Length: 3153 Lines: 74 This is a multi-part message in MIME format. ------=_NextPart_000_0019_01C400B0.9A46C5B0 Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: 7bit Hello, It seems there is a problem in the network layer of the 2.6.3 kernel. When IFF_NOARP is enabled on the device, the first outgoing packet is getting lost. I tried the following configuration: two computers are connected with the network cable. On both sides ARP is switched off on the network adapters, and MAC addresses are configured manually using the arp utility. When I ping one computer from another, I am getting ping replies only starting from the third one. The reason is the following: network layer is caching hardware (ethernet) headers. When I send a packet, this cache is examined for the proper header. If it is not found, the arp table is examined too. The data from the arp table is used for constructing the header for the packet (eth_header() in eth.c) and creating a cache entry (eth_hard_header() in eth.c). The cache entry is created correctly, but the header for outgoing packet in case of IFF_NOARP switched on the device is filled with zero destination address (MAC). So this packet is then lost. Next time the cache entry is used, and the packets are send correctly. So when I am pinging one computer from another the first ping request is lost so there is no answer for it. The second ping request gets to the other computer, and it sends a reply, wich is lost on the other side. And only for the third packet I get a reply from the other computer. This causes for example internet pages open very slowly on the links with ARP turned off, because the first request is lost, and it takes a while when the client resends it. Please, include the attached patch in the kernel. It fixes this problem on the 2.6.3 kernel. The same problem is in the 2.4.18 kernel. I verified it on both 2.6.3 and 2.4.18 kernels and they work fine after the correction. Thank you. Dmitry ------=_NextPart_000_0019_01C400B0.9A46C5B0 Content-Type: application/octet-stream; name="patch-2.6.3-ethernet" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="patch-2.6.3-ethernet" --- linux-2.6.3/net/ethernet/eth.c 2004-02-18 06:58:03.000000000 +0300=0A= +++ linux-2.6.3-patched/net/ethernet/eth.c 2004-03-02 21:15:46.000000000 = +0300=0A= @@ -31,6 +31,7 @@=0A= * older network drivers and IFF_ALLMULTI.=0A= * Christer Weinigel : Better rebuild header message.=0A= * Andrew Morton : 26Feb01: kill ether_setup() - use = netdev_boot_setup().=0A= + * Dmitry Semenov : 29Feb04: eth_header() - bug fix for = IFF_NOARP devices=0A= *=0A= * This program is free software; you can redistribute it and/or=0A= * modify it under the terms of the GNU General Public License=0A= @@ -101,7 +102,7 @@=0A= * Anyway, the loopback-device should never use this function... =0A= */=0A= =0A= - if (dev->flags & (IFF_LOOPBACK|IFF_NOARP)) =0A= + if (dev->flags & IFF_LOOPBACK) =0A= {=0A= memset(eth->h_dest, 0, dev->addr_len);=0A= return ETH_HLEN;=0A= ------=_NextPart_000_0019_01C400B0.9A46C5B0-- From jgarzik@pobox.com Tue Mar 2 12:54:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 12:54:55 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22KskKO026841 for ; Tue, 2 Mar 2004 12:54:49 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:2940 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1AyFF6-0002HD-01; Tue, 02 Mar 2004 19:07:48 +0000 Message-ID: <4044DB78.7040309@pobox.com> Date: Tue, 02 Mar 2004 14:07:36 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Randy.Dunlap" CC: rmk@arm.linux.org.uk, netdev@oss.sgi.com Subject: Re: [janitor] remove casts in drivers/net/arm/ References: <20040229142516.3d218ed0.rddunlap@osdl.org> <20040229143436.4bb884ee.rddunlap@osdl.org> <20040302121042.A9931@flint.arm.linux.org.uk> <4044D86C.70709@pobox.com> <20040302110237.0f580736.rddunlap@osdl.org> In-Reply-To: <20040302110237.0f580736.rddunlap@osdl.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3706 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 1180 Lines: 39 Randy.Dunlap wrote: > On Tue, 02 Mar 2004 13:54:36 -0500 Jeff Garzik wrote: > > | Russell King wrote: > | > On Sun, Feb 29, 2004 at 02:34:36PM -0800, Randy.Dunlap wrote: > | > > | >> drivers/net/arm/am79c961a.c | 18 +++++++++--------- > | >> drivers/net/arm/ether1.c | 18 +++++++++--------- > | >> drivers/net/arm/ether3.c | 18 +++++++++--------- > | >> drivers/net/arm/etherh.c | 4 ++-- > | >> 4 files changed, 29 insertions(+), 29 deletions(-) > | > > | > > | > I think we should really consider using netdev_priv() in all these places > | > so the compiler knows that 'dev' and 'priv' are related. > | > | > | Good point. > > I respectfully disagree, but if the maintainter won't merge > them as is, so be it. > > I have trouble understanding why this: > return (char *)dev + ((sizeof(struct net_device) + 31) & ~31); > is better than using a structure->field, i.e., > dev->priv > > Can one of you enlighten me? One is an additional pointer load and dereference, and one is a constant offset from the beginning of the dev structure, calculated at compile time. netdev_priv() provides the same results as dev->priv but at less cost. Jeff From scott.feldman@intel.com Tue Mar 2 13:17:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 13:17:35 -0800 (PST) Received: from hermes.hd.intel.com (fmr09.intel.com [192.52.57.35]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22LHLKO028916 for ; Tue, 2 Mar 2004 13:17:23 -0800 Received: from petasus.hd.intel.com (petasus.hd.intel.com [10.127.45.3]) by hermes.hd.intel.com (8.12.9-20030918-01/8.12.9/d: large-outer.mc,v 1.9 2004/01/09 00:55:23 root Exp $) with ESMTP id i22LGeGh028479; Tue, 2 Mar 2004 21:16:40 GMT Received: from orsmsxvs041.jf.intel.com (orsmsxvs041.jf.intel.com [192.168.65.54]) by petasus.hd.intel.com (8.12.9-20030918-01/8.12.9/d: large-inner.mc,v 1.10 2004/03/01 19:22:27 root Exp $) with SMTP id i22LG6X3016233; Tue, 2 Mar 2004 21:16:34 GMT Received: from orsmsx332.amr.corp.intel.com ([192.168.65.60]) by orsmsxvs041.jf.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004030213163408179 ; Tue, 02 Mar 2004 13:16:34 -0800 Received: from orsmsx402.amr.corp.intel.com ([192.168.65.208]) by orsmsx332.amr.corp.intel.com with Microsoft SMTPSVC(5.0.2195.6713); Tue, 2 Mar 2004 13:16:34 -0800 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 Subject: RE: Submission #3 for S2io 10GbE driver Date: Tue, 2 Mar 2004 13:16:33 -0800 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Submission #3 for S2io 10GbE driver Thread-Index: AcQAhvva3gJRrh/5Tx6Fvh3gg2fA7wABFdSA From: "Feldman, Scott" To: "Jeff Garzik" , Cc: , , , , , X-OriginalArrivalTime: 02 Mar 2004 21:16:34.0431 (UTC) FILETIME=[A3FB68F0:01C4009B] X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i22LHLKO028916 X-archive-position: 3707 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev Content-Length: 1220 Lines: 52 > This is incorrect, and definitely an issue that needs to be addressed. > > As I said, the model is, the driver calls netif_stop_queue() after > queueing a packet, when it knows there is no more room for a full > packet. The tg3 driver does it like this: > > ...queue an skb to hardware... > if (TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1)) > netif_stop_queue(dev); > > Therefore you guarantee the queue is stopped until you are > 100% certain that another skb (up to MAX_SKB_FRAGS + "main frag" > fragments) may be queued to hardware. > > You do -not- want to figure out "after the fact" that you > cannot queue the skb you were just passed. But tg3 checks this case also and returns 1: /* This is a hard error, log it. */ if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { netif_stop_queue(dev); ... return 1; } Does this code path happen? Using tg3 for reference, can we say this is the ideal model? dev->hard_start if(!space_avail) stop_queue return 1; queue skb if(!space_avail) stop_queue return 0; tx_clean if(queue_stopped && space_avail) wake_queue -scott From jgarzik@pobox.com Tue Mar 2 13:21:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 13:21:31 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22LLRKO029354 for ; Tue, 2 Mar 2004 13:21:28 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:3017 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1AyHKI-0004dN-Ll; Tue, 02 Mar 2004 21:21:18 +0000 Message-ID: <4044FABE.9070408@pobox.com> Date: Tue, 02 Mar 2004 16:21:02 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Feldman, Scott" CC: raghavendra.koushik@wipro.com, leonid.grossman@s2io.com, netdev@oss.sgi.com, shemminger@osdl.org, hch@infradead.org, ravinandan.arakali@s2io.com, raghavendra.koushik@s2io.com Subject: Re: Submission #3 for S2io 10GbE driver References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3708 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 1517 Lines: 49 Feldman, Scott wrote: >>This is incorrect, and definitely an issue that needs to be addressed. >> >>As I said, the model is, the driver calls netif_stop_queue() after >>queueing a packet, when it knows there is no more room for a full >>packet. The tg3 driver does it like this: >> >> ...queue an skb to hardware... >> if (TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1)) >> netif_stop_queue(dev); >> >>Therefore you guarantee the queue is stopped until you are >>100% certain that another skb (up to MAX_SKB_FRAGS + "main frag" >>fragments) may be queued to hardware. >> >>You do -not- want to figure out "after the fact" that you >>cannot queue the skb you were just passed. > > > But tg3 checks this case also and returns 1: > > /* This is a hard error, log it. */ > if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + > 1))) { > netif_stop_queue(dev); > ... > return 1; > } > > Does this code path happen? You snipped the important printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n", dev->name); It's a BUG because it should never happen. tg3 needs to kfree the skb too, leading to my comment "some existing drivers get this wrong too". Requeueing the skb only occurs in -some- packet schedulers, not all. So drivers cannot depend on the net stack doing what you want in all cases. Conditional correct behavior or leak.. :/ Jeff From greearb@candelatech.com Tue Mar 2 13:33:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 13:33:24 -0800 (PST) Received: from ns1.wanfear.com (ns1.wanfear.com [207.212.57.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22LXIKO029844 for ; Tue, 2 Mar 2004 13:33:18 -0800 Received: from candelatech.com (evrtwa1-ar2-4-35-049-074.evrtwa1.dsl-verizon.net [4.35.49.74]) (authenticated bits=0) by ns1.wanfear.com (8.12.10/8.12.10) with ESMTP id i22LX7PR025406; Tue, 2 Mar 2004 13:33:08 -0800 Message-ID: <4044FD93.8030006@candelatech.com> Date: Tue, 02 Mar 2004 13:33:07 -0800 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040113 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jeff Garzik CC: "Feldman, Scott" , netdev@oss.sgi.com Subject: Re: Submission #3 for S2io 10GbE driver References: <4044FABE.9070408@pobox.com> In-Reply-To: <4044FABE.9070408@pobox.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3709 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Content-Length: 1131 Lines: 29 Jeff Garzik wrote: > tg3 needs to kfree the skb too, leading to my comment "some existing > drivers get this wrong too". Requeueing the skb only occurs in -some- > packet schedulers, not all. So drivers cannot depend on the net stack > doing what you want in all cases. Conditional correct behavior or > leak.. :/ I see lots of hard-start-xmit errors for e1000 and e100 in 2.4.25, and it's very nice to be able to retry. Lets fix the broken callers instead of making the drivers less useful. You can see this yourself with pktgen. Here is the code in pktgen where I see the printouts...if this is my bug, please let me know! spin_lock_bh(&odev->xmit_lock); if (!netif_queue_stopped(odev)) { if (odev->hard_start_xmit(next->skb, odev)) { if (net_ratelimit()) { printk(KERN_INFO "Hard xmit error\n"); } Ben -- Ben Greear Candela Technologies Inc http://www.candelatech.com From jgarzik@pobox.com Tue Mar 2 13:38:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 13:38:26 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22LcLKO030370 for ; Tue, 2 Mar 2004 13:38:22 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:3033 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1AyHag-0004rw-8E; Tue, 02 Mar 2004 21:38:14 +0000 Message-ID: <4044FEBA.2050807@pobox.com> Date: Tue, 02 Mar 2004 16:38:02 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Ben Greear CC: "Feldman, Scott" , netdev@oss.sgi.com Subject: Re: Submission #3 for S2io 10GbE driver References: <4044FABE.9070408@pobox.com> <4044FD93.8030006@candelatech.com> In-Reply-To: <4044FD93.8030006@candelatech.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3710 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 286 Lines: 13 Ben Greear wrote: > I see lots of hard-start-xmit errors for e1000 and e100 in 2.4.25, > and it's very nice to be able to retry. Lets fix the broken callers > instead of making the drivers less useful. Let's fix the broken drivers first. Like I said, it's a BUG condition. Jeff From scott.feldman@intel.com Tue Mar 2 13:48:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 13:48:22 -0800 (PST) Received: from hermes.hd.intel.com (fmr09.intel.com [192.52.57.35]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22LmDKO030776 for ; Tue, 2 Mar 2004 13:48:14 -0800 Received: from petasus.hd.intel.com (petasus.hd.intel.com [10.127.45.3]) by hermes.hd.intel.com (8.12.9-20030918-01/8.12.9/d: large-outer.mc,v 1.9 2004/01/09 00:55:23 root Exp $) with ESMTP id i22LltGh006642; Tue, 2 Mar 2004 21:47:55 GMT Received: from orsmsxvs041.jf.intel.com (orsmsxvs041.jf.intel.com [192.168.65.54]) by petasus.hd.intel.com (8.12.9-20030918-01/8.12.9/d: large-inner.mc,v 1.10 2004/03/01 19:22:27 root Exp $) with SMTP id i22LlfWv024997; Tue, 2 Mar 2004 21:47:50 GMT Received: from orsmsx332.amr.corp.intel.com ([192.168.65.60]) by orsmsxvs041.jf.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004030213474912833 ; Tue, 02 Mar 2004 13:47:49 -0800 Received: from orsmsx402.amr.corp.intel.com ([192.168.65.208]) by orsmsx332.amr.corp.intel.com with Microsoft SMTPSVC(5.0.2195.6713); Tue, 2 Mar 2004 13:47:49 -0800 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 Subject: RE: Submission #3 for S2io 10GbE driver Date: Tue, 2 Mar 2004 13:47:48 -0800 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Submission #3 for S2io 10GbE driver Thread-Index: AcQAnrQAi0gwbIz1RAOBqg7briW++wAAJwZw From: "Feldman, Scott" To: "Jeff Garzik" , "Ben Greear" Cc: X-OriginalArrivalTime: 02 Mar 2004 21:47:49.0811 (UTC) FILETIME=[01CBB030:01C400A0] X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i22LmDKO030776 X-archive-position: 3711 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev Content-Length: 374 Lines: 13 > Let's fix the broken drivers first. Ok, e100 v3 is same model as tg3, and we think tg3 is correct, so we think e100 v3 is correct as well. Ben, e100 v3 probably isn't given you the effect you had with previous driver versions. It'll stop the queue and never return a skb (unless we hit that BUG case). e1000/ixgb need some work to bring them into this model. -scott From greearb@candelatech.com Tue Mar 2 14:21:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 02 Mar 2004 14:21:55 -0800 (PST) Received: from ns1.wanfear.com (ns1.wanfear.com [207.212.57.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i22MLkKO031594 for ; Tue, 2 Mar 2004 14:21:46 -0800 Received: from candelatech.com (evrtwa1-ar2-4-35-049-074.evrtwa1.dsl-verizon.net [4.35.49.74]) (authenticated bits=0) by ns1.wanfear.com (8.12.10/8.12.10) with ESMTP id i22MLdPR027167; Tue, 2 Mar 2004 14:21:40 -0800 Message-ID: <404508EC.8060200@candelatech.com> Date: Tue, 02 Mar 2004 14:21:32 -0800 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040113 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Feldman, Scott" CC: netdev@oss.sgi.com Subject: Re: Submission #3 for S2io 10GbE driver References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3712 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Content-Length: 681 Lines: 29 Feldman, Scott wrote: >>Let's fix the broken drivers first. > > > Ok, e100 v3 is same model as tg3, and we think tg3 is correct, so we > think e100 v3 is correct as well. > > Ben, e100 v3 probably isn't given you the effect you had with previous > driver versions. It'll stop the queue and never return a skb (unless we > hit that BUG case). Ok. Since I can retry it's not a big problem anyway. I'm porting stuff forward to 2.6 and will re-test there sometime soon. > e1000/ixgb need some work to bring them into this model. Cool, looking forward to it! Ben > > -scott > -- Ben Greear Candela Technologies Inc http://www.candelatech.com From jt@bougret.hpl.hp.com Wed Mar 3 18:35:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Mar 2004 18:35:40 -0800 (PST) Received: from palrel10.hp.com (palrel10.hp.com [156.153.255.245]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i242ZPKO007184 for ; Wed, 3 Mar 2004 18:35:25 -0800 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel10.hp.com (Postfix) with ESMTP id 3BAF41C01103; Wed, 3 Mar 2004 18:35:25 -0800 (PST) Received: from bougret.hpl.hp.com (bougret.hpl.hp.com [15.4.92.227]) by tomil.hpl.hp.com (8.9.3 (PHNE_29774)/8.9.3 HPLabs Timeshare Server) with ESMTP id SAA26490; Wed, 3 Mar 2004 18:35:24 -0800 (PST) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1Ayiho-000542-00; Wed, 03 Mar 2004 18:35:24 -0800 Date: Wed, 3 Mar 2004 18:35:24 -0800 To: "David S. Miller" , Jeff Garzik , netdev@oss.sgi.com, Linux kernel mailing list Subject: [PATCH 2.6] Intersil Prism54 wireless driver Message-ID: <20040304023524.GA19453@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="mP3DRpeJDSE+ciuQ" Content-Disposition: inline User-Agent: Mutt/1.3.28i Organisation: HP Labs Palo Alto Address: HP Labs, 1U-17, 1501 Page Mill road, Palo Alto, CA 94304, USA. E-mail: jt@hpl.hp.com From: Jean Tourrilhes X-archive-position: 3718 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jt@bougret.hpl.hp.com Precedence: bulk X-list: netdev Content-Length: 59675 Lines: 836 --mP3DRpeJDSE+ciuQ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave & Jeff, The attached .bz2 file is a patch for 2.6.3 adding the Intersil Prism54 wireless driver. Sorry for the attachement, the file is rather big, if you want inline+plaintext, I'll send that personal to you. I've been using this driver with great success on 2.6.3 and 2.6.4-rc1 (SMP). This driver support various popular CardBus and PCI 802.11g cards (54 Mb/s) based on the Intersil PrismGT/PrismDuette chipset. I would like this driver to go into 2.6.X. However, I understand that it's lot's of code to review. Have fun... Jean --mP3DRpeJDSE+ciuQ Content-Type: application/octet-stream Content-Disposition: attachment; filename="patch-2.6.3-prism54-cvs20040304.bz2" Content-Transfer-Encoding: base64 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 --mP3DRpeJDSE+ciuQ-- From jt@bougret.hpl.hp.com Wed Mar 3 18:49:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Mar 2004 18:49:36 -0800 (PST) Received: from palrel12.hp.com (palrel12.hp.com [156.153.255.237]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i242nXKO008887 for ; Wed, 3 Mar 2004 18:49:33 -0800 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel12.hp.com (Postfix) with ESMTP id C3DDD1C00F05; Wed, 3 Mar 2004 18:49:32 -0800 (PST) Received: from bougret.hpl.hp.com (bougret.hpl.hp.com [15.4.92.227]) by tomil.hpl.hp.com (8.9.3 (PHNE_29774)/8.9.3 HPLabs Timeshare Server) with ESMTP id SAA27036; Wed, 3 Mar 2004 18:49:32 -0800 (PST) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1AyivU-00059I-00; Wed, 03 Mar 2004 18:49:32 -0800 Date: Wed, 3 Mar 2004 18:49:32 -0800 To: Jeff Garzik Cc: "David S. Miller" , netdev@oss.sgi.com, Linux kernel mailing list Subject: Re: [PATCH 2.6] Intersil Prism54 wireless driver Message-ID: <20040304024932.GA19781@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com References: <20040304023524.GA19453@bougret.hpl.hp.com> <40469683.3000609@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40469683.3000609@pobox.com> User-Agent: Mutt/1.3.28i Organisation: HP Labs Palo Alto Address: HP Labs, 1U-17, 1501 Page Mill road, Palo Alto, CA 94304, USA. E-mail: jt@hpl.hp.com From: Jean Tourrilhes X-archive-position: 3719 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jt@bougret.hpl.hp.com Precedence: bulk X-list: netdev Content-Length: 1197 Lines: 32 On Wed, Mar 03, 2004 at 09:37:55PM -0500, Jeff Garzik wrote: > Jean Tourrilhes wrote: > > Hi Dave & Jeff, > > > > The attached .bz2 file is a patch for 2.6.3 adding the > >Intersil Prism54 wireless driver. Sorry for the attachement, the file > >is rather big, if you want inline+plaintext, I'll send that personal > >to you. > > I've been using this driver with great success on 2.6.3 and > >2.6.4-rc1 (SMP). This driver support various popular CardBus and PCI > >802.11g cards (54 Mb/s) based on the Intersil PrismGT/PrismDuette > >chipset. > > I would like this driver to go into 2.6.X. However, I > >understand that it's lot's of code to review. > > > I would like it to go into 2.6 too :) I'm glad somebody submitted it. > > I'll review it this weekend... and hopefully some other netdev denizens > will review as well and post their comments. > > Jeff By the way, I should note that during my test I had difficulties to associate with Aironet cards, but it looked like it was a firmware related issue (firmware timing out). The rest work fine (managed to Lucent, Ad-Hoc to another Prism54, scanning, WE). Actually, this is the driver I used to develop ifrename. Have fun... Jean From jgarzik@pobox.com Wed Mar 3 19:08:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Mar 2004 19:08:36 -0800 (PST) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i2438UKO010376 for ; Wed, 3 Mar 2004 19:08:33 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:33319 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1AyjDp-0000bN-C6; Thu, 04 Mar 2004 03:08:29 +0000 Message-ID: <40469DA1.9090502@pobox.com> Date: Wed, 03 Mar 2004 22:08:17 -0500 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Pavel Roskin CC: Jean Tourrilhes , Netdev Subject: Re: linux-wireless mailing list References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3720 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 2785 Lines: 68 Pavel Roskin wrote: > Hello! > > I believe the developers of Linux wireless drivers need a separate mailing > list, preferably called linux-wireless at vger.kernel.org. I don't expect > it to have heavy traffic, but there should be a definitive forum for > discussing issues common for wireless drivers on Linux. I do not object to such a list, but I would respectfully request that all development matters be cross-posted to netdev@oss.sgi.com. That's where the network developers hang out. Now I present my opinions :) > I expect following topics to be discussed: > > Wireless Extensions. I highly respect Jean Tourrilhes who is doing this > work. I believe that driver and userspace developers should use this > forum to discuss their needs and to provide feedback to Jean. The wireless extensions are utility -- they work, but are not beautiful. I am presently writing the driver for the RealTek wireless card, and in the process creating a small wireless driver API. The ideal is to avoid ioctls, and instead to present extensible, type-safe interfaces. This is what I would like wireless extensions to morph into. > Handling of 802.11 frames. We may need common code to convert 802.11 > frames to 802.3 and possibly other standards. Maybe some standards for > 802.11 encapsulation and bridging could be discussed as well. Absolutely. David Miller, Arnaldo Carvalho de Melo, and myself all seem to feel that a net/802_11 directory and associated code would be useful. There is definitely an area for code commonality across drivers. > Sniffing. We need a common standard how to pass raw frames and additional > information to the userspace. There are several de facto standards, but > the lack of communication between developers makes those standards less > useful. For example, Prism2 headers were meant as highly extensible, but > libpcap expects them to be of fixed size. It's an obvious failure to > communicate the intentions of the standard. Agreed. > Encryption. There are wireless specific encryption issues. Host based > WEP support needs RC4 cipher in the kernel. There's not much to discuss > here, but the lack of RC4 in the kernel may indicate that Linux wireless > developers are not acting together to make it happen. The patch does > exist. Send the patch to netdev! ;-) This should be the easy part. > Other interfaces between drivers and the userspace. There should be one > place to discuss whether wireless drivers should be using > netif_carrier_on/off, ethtool and mii-tool support. Again, there is not > much to discuss, but it's much much worse if the same questions are > discussed in different forums and every driver takes its own approach. netdev is that place ;-) Best regards and welcome, Jeff From arekm@pld-linux.org Wed Mar 3 19:19:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Mar 2004 19:19:34 -0800 (PST) Received: from maja.beep.pl (exim@smtp.sys.beep.pl [195.245.198.13]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i243JRKO011872 for ; Wed, 3 Mar 2004 19:19:30 -0800 Received: from [156.17.236.105] (helo=arm.t19.ds.pwr.wroc.pl ident=arekm) by maja.beep.pl with asmtp (TLSv1:RC4-MD5:128) (Exim 4.30) id 1AyiDY-000752-Ua; Thu, 04 Mar 2004 03:04:09 +0100 From: Arkadiusz Miskiewicz Organization: SelfOrganizing To: lkml Subject: ip a flush problem on 2.6 kernels (fine on 2.4 kernels) Date: Thu, 4 Mar 2004 03:08:15 +0100 User-Agent: KMail/1.6.1 Cc: netdev@oss.sgi.com MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-2" Message-Id: <200403040308.15880.arekm@pld-linux.org> X-Authenticated-Id: arekm Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i243JRKO011872 X-archive-position: 3721 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: arekm@pld-linux.org Precedence: bulk X-list: netdev Content-Length: 975 Lines: 26 The problem is that ip a a 192.168.0.1/24 dev eth0 ip link set eth0 down ip a flush dev eth0 Here on my vanilla 2.6.2 it locks eating CPU - it does netlink communication over and over. This ,,hang'' doesn't happen when interface is in UP state. Also doesn't happen on 2.4 kernels. I've tried it on different 2.6 kernels (one from fedora, one from PLD) with different versions of iproute2 (usually latest). Friend tried it also with iproute2 from slackware - same result. Same happens when using lo interface instead of ethX. More description in RH bugzilla: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=116982 ps. doing that on Broadcom Corporation BCM4401 100Base-T ethX interface (using b44 driver) causes lock (but sysrq works) on 2.4.25 kernel. Would be nice if someone with that hardware could verify this. -- Arkadiusz Mi¶kiewicz CS at FoE, Wroclaw University of Technology arekm.pld-linux.org, 1024/3DB19BBD, JID: arekm.jabber.org, PLD/Linux From falcon@muflon.linux.pl Wed Mar 3 21:04:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Mar 2004 21:04:33 -0800 (PST) Received: from don.falconne.eu.org (postfix@pc74.torun.sdi.tpnet.pl [213.25.214.74]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i2454SKO023768 for ; Wed, 3 Mar 2004 21:04:29 -0800 Received: from localhost (localhost [127.0.0.1]) by don.falconne.eu.org (Postfix) with ESMTP id D5C171C154C4; Thu, 4 Mar 2004 06:04:24 +0100 (CET) Received: from don.falconne.eu.org ([127.0.0.1]) by localhost (don.falconne.eu.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 17823-08; Thu, 4 Mar 2004 06:04:24 +0100 (CET) Received: from pc74.torun.sdi.tpnet.pl (pc74.torun.sdi.tpnet.pl [213.25.214.74]) by don.falconne.eu.org (Postfix) with ESMTP id 8B9D21C00A8B; Thu, 4 Mar 2004 06:04:24 +0100 (CET) Date: Thu, 4 Mar 2004 06:04:24 +0100 (CET) From: Pawel Sokolowski X-X-Sender: falcon@don.falconne.eu.org Reply-To: pawel.sokolowski@muflon.linux.pl To: Stephen Hemminger Cc: mzyngier@freesurf.fr, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: 2.6.4-rc1 + hp100 EISA, not working In-Reply-To: <20040303122541.4dbcf0fc@dell_ss3.pdx.osdl.net> Message-ID: References: <20040303122541.4dbcf0fc@dell_ss3.pdx.osdl.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=iso-8859-2 X-Virus-Scanned: by amavisd-new-20030616-p7 (Debian) at don.falconne.eu.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i2454SKO023768 X-archive-position: 3723 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: falcon@muflon.linux.pl Precedence: bulk X-list: netdev Content-Length: 1866 Lines: 45 I've seen things you people wouldn't believe. You writing: >> Pawel> On 2.6.3 it just Oopsed and didn't work. On 2.6.4-rc1 it does >> Pawel> not oops but it doesn't work (neither as module nor as build in kernel). >> Note that hp100 in 2.6.4-rc1 is still broken wrt EISA probing, since >> it lacks the terminating entry in the EISA ID list. This one-liner >> should take care of random crashes that are often reported to LKML : >> >> ===== drivers/net/hp100.c 1.24 vs edited ===== >> --- 1.24/drivers/net/hp100.c Wed Feb 18 13:39:41 2004 >> +++ edited/drivers/net/hp100.c Mon Mar 1 11:18:00 2004 >> @@ -201,6 +201,7 @@ >> { "HWP1990" }, /* HP J2577 */ >> { "CPX0301" }, /* ReadyLink ENET100-VG4 */ >> { "CPX0401" }, /* FreedomLine 100/VG */ >> + { "" } /* Mandatory final entry ! */ >> }; >> MODULE_DEVICE_TABLE(eisa, hp100_eisa_tbl); >> #endif > >It could be that there is a typo in the hp100 eisa device list, the following > >--- linux-2.6/drivers/eisa/eisa-bus.c 2004-01-23 09:38:19.000000000 -0800 >+++ tcp-2.6/drivers/eisa/eisa-bus.c 2004-03-03 12:23:53.604252800 -0800 [...] >+ printk(KERN_DEBUG "eisa_bus_match dev sig='%s' state=0x%x eids=%s\n", >+ edev->id.sig, edev->state, eids ? eids->sig : ""); With eisa_bus.enable_dev=2 I'm getting: eisa_bus_match dev sig='HWPC061' state=0x1 eids=HWPF180 eisa_bus_match dev sig='HWP1940' state=0x3 eids=HWPF180 without: eisa_bus_match dev sig='HWPC061' state=0x1 eids=HWPF180 eisa_bus_match dev sig='HWP1940' state=0x0 eids=HWPF180 when modprobing hp100. -- ,d$$$$$P.d$$b d$P ,gd$$$$$,gd$$$$g. ,$$$b._$$P RLU #172534 ggggggggggggg. ggs ,gg ,gg ,gg ggp,ggggg Pawe³ Soko³owski d$P""""'""""Y$$. d$P d$P d$P ,d$Pd$P `Y$$P falcon@muflon.linux.pl d$P Y$$d$$$$$P`Y$$$$$'`Y$$$$$P'd$P d$P Replicant (M) Des: Falcon From proski@gnu.org Wed Mar 3 23:09:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 03 Mar 2004 23:09:49 -0800 (PST) Received: from cmail.srv.hcvlny.cv.net (cmail.srv.hcvlny.cv.net [167.206.112.40]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i2479iKO000744 for ; Wed, 3 Mar 2004 23:09:45 -0800 Received: from portland (ool-435328fe.dyn.optonline.net [67.83.40.254]) by cmail.srv.hcvlny.cv.net (iPlanet Messaging Server 5.2 HotFix 1.16 (built May 14 2003)) with ESMTP id <0HU100LXNIHITM@cmail.srv.hcvlny.cv.net> for netdev@oss.sgi.com; Thu, 04 Mar 2004 02:08:06 -0500 (EST) Date: Thu, 04 Mar 2004 02:08:08 -0500 (EST) From: Pavel Roskin Subject: Re: linux-wireless mailing list In-reply-to: <20040303233343.GA14803@bougret.hpl.hp.com> X-X-Sender: proski@portland.hansa.lan To: jt@hpl.hp.com Cc: linux-net@vger.kernel.org, netdev@oss.sgi.com Message-id: MIME-version: 1.0 Content-type: TEXT/PLAIN; charset=US-ASCII Content-transfer-encoding: 7BIT References: <20040303233343.GA14803@bougret.hpl.hp.com> X-archive-position: 3725 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: proski@gnu.org Precedence: bulk X-list: netdev Content-Length: 7278 Lines: 157 On Wed, 3 Mar 2004, Jean Tourrilhes wrote: > On Wed, Mar 03, 2004 at 05:28:30PM -0500, Pavel Roskin wrote: > > Hello! > > > > I believe the developers of Linux wireless drivers need a separate mailing > > list, preferably called linux-wireless at vger.kernel.org. I don't expect > > it to have heavy traffic, but there should be a definitive forum for > > discussing issues common for wireless drivers on Linux. > [snip] > Why does this matter ? If those driver maintainers don't feel > part of the Kernel, they probably won't feel part of the "Linux > wireless driver" group that you are trying to create. > Those maintainers are already busy with bug reports and > users. They would need a good incentive too coordinate such > activities across drivers. Avoiding more work later is a pretty good incentive. If the driver turns out to be inconsistent with others, it will have to be changed, perhaps retaining the original code for backward compatibility. > Fortunately, those maintainers know about the common good and > always take the path of least resistance. If someone provide the > infrastructure, they will eventually buy into it. Actually, the new > developpers are more likely to use it than those who already have > working solutions. > Look at the firmware download support. Manuel did a good job > of talking with the various driver authors and come up with a useful > solution, and it's a great success. Firmware download support was a major achievement, and it was not limited to networking, let alone wireless networking. Manuel did a great job. There are often much smaller issues, often so minor that I don't want to bother you personally. Today's example - when the card connects to an access point and changes its ESSID (because the desired ESSID is "any"), should the driver send an wireless event for BSSID only or also for ESSID? I know, you are a great guy and you will answer me, but I don't want to be the fifth person to ask you that in private. I don't want to check drivers for the hardware I don't have trying to understand what they would do in this situation. > Coming back to your point. It seems to me that what we need is > motivated people willing to push specific cross-driver activities and > coordinate those with the driver maintainers. It would be natural for userspace developers and distribution maintainers to promote specific interfaces and standards, but it would be too much to expect them to negotiate with different driver developers trying to explain the same thing over an over again. It would be easier for them to post to linux-wireless and see the discussion. If I as a driver (co-)maintainer don't read that list, the decision will be made without me, and then (kismet|airsnort|xsupplicant) maintainers with came to harass me so I implement what other _driver_ developers have agreed to. Seems like a good incentive to pay attention :-) > The mailing list you propose may help those people to acheive > their goal. But, without such people, it probably won't take off, > because driver maintainers are just too busy. > But, of course, I would be happy to be wrong ;-) Having a list will help less motivated and more busy people reach the audience they want to reach and achieve the goals they want to achieve. I hope so. > > I expect following topics to be discussed: > > > > Wireless Extensions. I highly respect Jean Tourrilhes who is doing this > > work. I believe that driver and userspace developers should use this > > forum to discuss their needs and to provide feedback to Jean. > > I can tell you already : WPA. Yes. Also, since Wireless Extensions define monitor mode (as one of the modes), I would expect to see a definition of what it is, including frame format. Maybe I want too much. > > Handling of 802.11 frames. We may need common code to convert 802.11 > > frames to 802.3 and possibly other standards. Maybe some standards for > > 802.11 encapsulation and bridging could be discussed as well. > > Yes, this is a sore point. Rather than starting from scratch I > believe you should start from code in an existing driver (such as > HostAP or MadWifi). > Note that there are two separate parts, support of 802.2 (all > the SNAP encapsualtion business), which is also useful for 802.3 > networks, and support of 802.11 framing. I believe that Arnaldo was > working on 802.2 support (as part of IPX stuff). That's the part I don't know well. I feel uneasy that David Gibson tries to invent something in the Orinoco driver, and I'm one of very few people who can comment early on those efforts, yet I know too little about the networking site of things to provide useful feedback. If the linux-wireless list existed, I would have some assurance that we are not doing something that's not going to be accepted by other drivers. > Actually, you remind me that I should ask Jouni to push his > driver in the kernel. I believe it can happen after RC4 goes to the kernel and HostAP uses crypto API (optionally in the standalone version to keep Linux 2.4 compatibility). > > Sniffing. We need a common standard how to pass raw frames and additional > > information to the userspace. There are several de facto standards, but > > the lack of communication between developers makes those standards less > > useful. For example, Prism2 headers were meant as highly extensible, but > > libpcap expects them to be of fixed size. It's an obvious failure to > > communicate the intentions of the standard. > > Software never get it right on the first try. That's a bug > report on libpcap. If you break libpcap, they will notice soon enough. I don't want somebody to tell me that Orinoco does it wrong because all other drivers use 144 bytes per header. If it happens, I want to show a link to a thread where it was discussed. Sure, it's not a as good as a written standard, but if it's the official linux-wireless list, interested persons are supposed to comment before it's to late. Without the list, I'll have to ask linux-wlan-ng team to write a standard, then go to libpcap guys to persuade them to implement the standard as described by the inventors of Prism2 headers. > > Encryption. There are wireless specific encryption issues. Host based > > WEP support needs RC4 cipher in the kernel. There's not much to discuss > > here, but the lack of RC4 in the kernel may indicate that Linux wireless > > developers are not acting together to make it happen. The patch does > > exist. > > I've never seen this patch. Was it sent to the Crypto guys ? http://sourceforge.net/mailarchive/message.php?msg_id=7298902 I'll ask Jon Oberheide where he sent it. > > I believe linux-net@vger.kernel.org is the right place to ask because > > Wireless almost inevitably assumes networking. I'll appreciate if > > somebody with enough weight in the kernel development supports this issue. > > Or at least please let me know where else I should ask and whose support I > > need to have. > > Don't get me wrong, I'm supportive, I just wanted to set a bit > of context. I can't host mailing lists at HP, and SourceForge is not > really reliable. I posted this proposal because I felt that many people think this way and somebody should post it. -- Regards, Pavel Roskin From davem@redhat.com Thu Mar 4 00:10:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 00:10:40 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i248ATKO005832 for ; Thu, 4 Mar 2004 00:10:30 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id i2487Pb22957; Thu, 4 Mar 2004 03:07:25 -0500 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i2487P832684; Thu, 4 Mar 2004 03:07:25 -0500 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i2487HeF013987; Thu, 4 Mar 2004 03:07:17 -0500 Date: Thu, 4 Mar 2004 00:07:23 -0800 From: "David S. Miller" To: Stephen Hemminger Cc: jt@bougret.hpl.hp.com, netdev@oss.sgi.com, irda-users@lists.sourceforge.net Subject: Re: [PATCH] stir4200 update for 2.6.4-rc1 Message-Id: <20040304000723.07b265ef.davem@redhat.com> In-Reply-To: <20040302120501.7fa8f698@dell_ss3.pdx.osdl.net> References: <20040302120501.7fa8f698@dell_ss3.pdx.osdl.net> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3727 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 27 Lines: 2 Applied, thanks everyone. From davem@redhat.com Thu Mar 4 01:41:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 01:42:00 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i249fqKO019816 for ; Thu, 4 Mar 2004 01:41:52 -0800 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id i249aKb21270; Thu, 4 Mar 2004 04:36:20 -0500 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i249aK826574; Thu, 4 Mar 2004 04:36:20 -0500 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i249aBeF016878; Thu, 4 Mar 2004 04:36:13 -0500 Date: Thu, 4 Mar 2004 01:36:18 -0800 From: "David S. Miller" To: Julian Anastasov Cc: niv@us.ibm.com, ak@suse.de, ruddk@us.ibm.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, chester.f.johnson@intel.com Subject: Re: PMTU issues due to TOS field manipulation (for DSCP) Message-Id: <20040304013618.31a827ba.davem@redhat.com> In-Reply-To: References: <20031212003143.062598e9.davem@redhat.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3728 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 238 Lines: 7 Julian, I'd like to bring this back to life. Can you post a new version of the ip_rt_ignore_tos patch against current 2.6.x? We'll discuss and integrate just like for the ARP stuff. Sorry for sitting on this for so long, been busy... From johnp@marine-boy.nu Thu Mar 4 04:44:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 04:44:07 -0800 (PST) Received: from ocelot.spots.ab.ca (ocelot.spots.ab.ca [209.115.174.244]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24Ci3KO024986 for ; Thu, 4 Mar 2004 04:44:04 -0800 Received: from spots.ca (localhost [127.0.0.1]) by ocelot.spots.ab.ca (8.12.8/8.12.8) with ESMTP id i24Ci0X2015179; Thu, 4 Mar 2004 05:44:00 -0700 From: "john" To: Denis Vlasenko , Andrewm@uow.edu.au, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: Problems getting a stable 100 megabit connection with linksys etherfast switch Date: Thu, 4 Mar 2004 05:44:00 -0700 Message-Id: <20040304123913.M97501@marine-boy.nu> In-Reply-To: <200403020001.48026.vda@port.imtp.ilyichevsk.odessa.ua> References: <20040229212053.M47845@spots.ca> <200403020001.48026.vda@port.imtp.ilyichevsk.odessa.ua> X-Mailer: Open WebMail 2.30 20040103 X-OriginatingIP: 209.115.173.10 (johnp) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-Virus-Scanned: clamd / ClamAV version 0.67, clamav-milter version 0.66n X-archive-position: 3729 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: johnp@marine-boy.nu Precedence: bulk X-list: netdev Content-Length: 1008 Lines: 37 Hi Denis, Turns out I had a cable problem. Some of the patch cables that I made, had the wrong pinout. After replacing them, the connection is stable at 100baseTx-FD. Thanks John On Tue, 2 Mar 2004 00:01:47 +0200, Denis Vlasenko wrote > On Sunday 29 February 2004 23:30, john wrote: > > Hi, > > > > I am having problems getting a stable connection with my linux machines > > when trying to connect them at 100 megabit speeds to a linksys etherfast > > switch. > > > > > > I have attached some diagnostic outputs for your review. I hope that > > someone can help me with this problem. > > > > I believe using a managed switch will solve the problem, but I don't want > > to have to spend $1000.00 to fix this problem, when I should be able to > > obtain a stable connection with the equipment I am currently using. > > Try half duplex. You seldom do lots of xfers in both directions at > once, so half duplex is not a big loss. > > Use tcpdump to see what's going on on the wire. > -- > vda -- From ak@suse.de Thu Mar 4 05:49:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 05:49:05 -0800 (PST) Received: from Cantor.suse.de (ns.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24DmpKO003024 for ; Thu, 4 Mar 2004 05:48:51 -0800 Received: from hermes.suse.de (Hermes.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id B3ED1283580; Thu, 4 Mar 2004 14:13:16 +0100 (CET) Date: Thu, 4 Mar 2004 14:13:19 +0100 From: Andi Kleen To: Arkadiusz Miskiewicz Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: ip a flush problem on 2.6 kernels (fine on 2.4 kernels) Message-Id: <20040304141319.2d1cb112.ak@suse.de> In-Reply-To: <200403040308.15880.arekm@pld-linux.org> References: <200403040308.15880.arekm@pld-linux.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3730 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev Content-Length: 1010 Lines: 39 On Thu, 4 Mar 2004 03:08:15 +0100 Arkadiusz Miskiewicz wrote: > The problem is that > > ip a a 192.168.0.1/24 dev eth0 > ip link set eth0 down > ip a flush dev eth0 > > Here on my vanilla 2.6.2 it locks eating CPU - it does netlink > communication over and over. This ,,hang'' doesn't happen when > interface is in UP state. Also doesn't happen on 2.4 kernels. I fixed it with this patch for iproute2 here. It's not clear to me at all how it ever worked before. The loop seems to be just wrong. -Andi diff -u iproute2/ip/ipaddress.c~ iproute2/ip/ipaddress.c --- iproute2/ip/ipaddress.c~ 2004-03-07 20:54:52.000000000 +0100 +++ iproute2/ip/ipaddress.c 2004-03-07 21:02:12.000000000 +0100 @@ -623,6 +623,9 @@ fflush(stdout); return 0; } +#if 1 + break; +#else round++; if (flush_update() < 0) exit(1); @@ -630,6 +633,7 @@ printf("\n*** Round %d, deleting %d addresses ***\n", round, filter.flushed); fflush(stdout); } +#endif } } From werner@almesberger.net Thu Mar 4 06:18:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 06:18:15 -0800 (PST) Received: from host.almesberger.net (almesberger.net [63.105.73.238]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24EI5KO007869 for ; Thu, 4 Mar 2004 06:18:05 -0800 Received: from almesberger.net (vpnwa-home [10.200.0.2]) by host.almesberger.net (8.11.6/8.9.3) with ESMTP id i24EI2F29857; Thu, 4 Mar 2004 06:18:02 -0800 Received: (from werner@localhost) by almesberger.net (8.11.6/8.11.6) id i24EI0T23133; Thu, 4 Mar 2004 11:18:00 -0300 Date: Thu, 4 Mar 2004 11:17:59 -0300 From: Werner Almesberger To: netdev@oss.sgi.com, tcpcp-general@lists.sourceforge.net Subject: TCP connection passing, version 7 Message-ID: <20040304111759.A22625@almesberger.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-archive-position: 3732 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: wa@almesberger.net Precedence: bulk X-list: netdev Content-Length: 1222 Lines: 38 Back among the living: http://tcpcp.sourceforge.net/tcpcp-7.tar.gz md5sum 60a10b219ab363258d56d2f01f28edfa tcpcp is a mechanism to pass ownership of a TCP connection endpoint from one application to another, without the knowledge of the other peer. The project has been dormant for about a year, but now that I have the suitable testing tool with umlsim, it's time to restart it. This release updates the patch to the 2.6.3 kernel. I've also removed all the UML-related testing infrastructure, which is now obsolete. The complete list of changes is below. There's also a new Web site for the project, at http://tcpcp.sourceforge.net/ - Werner ----------------------------------- CHANGES ----------------------------------- Version 7 (4-MAR-2004) ---------------------- - Makefile: changed upload target to SourceForge upload procedure - removed "umlrun" subsystem - removed UML build - upgraded to the 2.6.3 kernel - renamed original kernel source directory from *.orig to *-orig -- _________________________________________________________________________ / Werner Almesberger, Buenos Aires, Argentina wa@almesberger.net / /_http://www.almesberger.net/____________________________________________/ From shemminger@osdl.org Thu Mar 4 09:27:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 09:27:12 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24HR9KO020627 for ; Thu, 4 Mar 2004 09:27:10 -0800 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i24HQoE14159; Thu, 4 Mar 2004 09:26:50 -0800 Date: Thu, 4 Mar 2004 09:26:50 -0800 From: Stephen Hemminger To: pawel.sokolowski@muflon.linux.pl Cc: falcon@muflon.linux.pl, mzyngier@freesurf.fr, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: 2.6.4-rc1 + hp100 EISA, not working Message-Id: <20040304092650.2575fd1c@dell_ss3.pdx.osdl.net> In-Reply-To: References: <20040303122541.4dbcf0fc@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.9claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3733 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 374 Lines: 13 > eisa_bus_match dev sig='HWPC061' state=0x1 eids=HWPF180 > eisa_bus_match dev sig='HWP1940' state=0x3 eids=HWPF180 > > without: > > eisa_bus_match dev sig='HWPC061' state=0x1 eids=HWPF180 > eisa_bus_match dev sig='HWP1940' state=0x0 eids=HWPF180 > > when modprobing hp100. The name HWP1940 is in the table, so that looks okay. Can you build with HP100_DEBUG defined? From jt@bougret.hpl.hp.com Thu Mar 4 09:34:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 09:34:17 -0800 (PST) Received: from palrel13.hp.com (palrel13.hp.com [156.153.255.238]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24HYFKO023176 for ; Thu, 4 Mar 2004 09:34:15 -0800 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel13.hp.com (Postfix) with ESMTP id 16EC11C015DD; Thu, 4 Mar 2004 09:34:15 -0800 (PST) Received: from bougret.hpl.hp.com (bougret.hpl.hp.com [15.4.92.227]) by tomil.hpl.hp.com (8.9.3 (PHNE_29774)/8.9.3 HPLabs Timeshare Server) with ESMTP id JAA05857; Thu, 4 Mar 2004 09:34:11 -0800 (PST) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1Aywja-00016E-00; Thu, 04 Mar 2004 09:34:10 -0800 Date: Thu, 4 Mar 2004 09:34:10 -0800 To: Jeff Garzik Cc: Pavel Roskin , Netdev Subject: Re: linux-wireless mailing list Message-ID: <20040304173410.GA4197@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com References: <40469DA1.9090502@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40469DA1.9090502@pobox.com> User-Agent: Mutt/1.3.28i Organisation: HP Labs Palo Alto Address: HP Labs, 1U-17, 1501 Page Mill road, Palo Alto, CA 94304, USA. E-mail: jt@hpl.hp.com From: Jean Tourrilhes X-archive-position: 3734 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jt@bougret.hpl.hp.com Precedence: bulk X-list: netdev Content-Length: 1391 Lines: 32 On Wed, Mar 03, 2004 at 10:08:17PM -0500, Jeff Garzik wrote: > > The wireless extensions are utility -- they work, but are not beautiful. > I am presently writing the driver for the RealTek wireless card, and > in the process creating a small wireless driver API. The ideal is to > avoid ioctls, and instead to present extensible, type-safe interfaces. > This is what I would like wireless extensions to morph into. Just for the record. The new driver API of WE is no longer tied to ioctls. The goal was to change the external API to RtNetlink, but I got distracted. But, you could imagine plugging the driver API to a file system (there is so many of them, take your pick). I believe that migrating the external API to RtNetlink would address 99% of your concerns, isn't it ? If this is the case, then we could work to make this happen. I've always say that the mechanism of the API does not matter, what matter is the standardisation of the parameters and data types. > Absolutely. David Miller, Arnaldo Carvalho de Melo, and myself all seem > to feel that a net/802_11 directory and associated code would be useful. > There is definitely an area for code commonality across drivers. 1) Please don't start from scratch. 2) Please keep the 802.2 and 802.11 part separated. Actually, getting 802.2 alone would be so useful. > Best regards and welcome, > > Jeff Jean From brazilnut@us.ibm.com Thu Mar 4 10:31:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 10:31:48 -0800 (PST) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24IVjKO003948 for ; Thu, 4 Mar 2004 10:31:45 -0800 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e1.ny.us.ibm.com (8.12.10/NS PXFA) with ESMTP id i24IVcZ2368546; Thu, 4 Mar 2004 13:31:38 -0500 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i24IVaKf112012; Thu, 4 Mar 2004 13:31:36 -0500 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i24AVCg01582; Thu, 4 Mar 2004 02:31:12 -0800 From: Don Fry Message-Id: <200403041031.i24AVCg01582@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.6.4-rc2] netdevice.h add netif_msg_init helper To: jgarzik@pobox.com, netdev@oss.sgi.com Date: Thu, 4 Mar 2004 02:31:11 -0800 (PST) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 3735 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch adds a helper function to initialize the debug bit mask for use with netif_msg_*. --- linux-2.6.4-rc2/include/linux/orig.netdevice.h Thu Mar 4 09:59:08 2004 +++ linux-2.6.4-rc2/include/linux/netdevice.h Thu Mar 4 10:01:19 2004 @@ -774,6 +774,16 @@ #define netif_msg_hw(p) ((p)->msg_enable & NETIF_MSG_HW) #define netif_msg_wol(p) ((p)->msg_enable & NETIF_MSG_WOL) +static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits) +{ + if (debug_value < 0) /* use default */ + return default_msg_enable_bits; + if (debug_value == 0) /* no output */ + return 0; + /* set low N bits */ + return(((debug_value >= (sizeof(u32)*8)) ? 0 : (1 << debug_value)) - 1); +} + /* Schedule rx intr now? */ static inline int netif_rx_schedule_prep(struct net_device *dev) -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Thu Mar 4 11:06:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 11:06:17 -0800 (PST) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24J69KO013734 for ; Thu, 4 Mar 2004 11:06:16 -0800 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e1.ny.us.ibm.com (8.12.10/NS PXFA) with ESMTP id i24J63Z2416400; Thu, 4 Mar 2004 14:06:03 -0500 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i24J6CIe101066; Thu, 4 Mar 2004 14:06:12 -0500 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i24B5bZ01272; Thu, 4 Mar 2004 03:05:37 -0800 From: Don Fry Message-Id: <200403041105.i24B5bZ01272@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.6.4-rc2] netdevice.h add netif_msg_init helper To: jgarzik@pobox.com, netdev@oss.sgi.com Date: Thu, 4 Mar 2004 03:05:37 -0800 (PST) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 3736 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch adds a helper function to initialize the debug bit mask for use with netif_msg_*. When the debug_value is out of range it returns the default_msg_enable_bits. --- linux-2.6.4-rc2/include/linux/orig.netdevice.h Thu Mar 4 09:59:08 2004 +++ linux-2.6.4-rc2/include/linux/netdevice.h Thu Mar 4 10:56:19 2004 @@ -774,6 +774,17 @@ #define netif_msg_hw(p) ((p)->msg_enable & NETIF_MSG_HW) #define netif_msg_wol(p) ((p)->msg_enable & NETIF_MSG_WOL) +static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits) +{ + /* use default */ + if (debug_value < 0 || debug_value > (sizeof(u32) * 8)) + return default_msg_enable_bits; + if (debug_value == 0) /* no output */ + return 0; + /* set low N bits */ + return(((debug_value == (sizeof(u32)*8)) ? 0 : (1 << debug_value)) - 1); +} + /* Schedule rx intr now? */ static inline int netif_rx_schedule_prep(struct net_device *dev) -- Don Fry brazilnut@us.ibm.com From kashyapv@us.ibm.com Thu Mar 4 12:52:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 12:52:46 -0800 (PST) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24KqaKO011793 for ; Thu, 4 Mar 2004 12:52:43 -0800 Received: from westrelay03.boulder.ibm.com (westrelay03.boulder.ibm.com [9.17.195.12]) by e34.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i24KqIrj335024; Thu, 4 Mar 2004 15:52:18 -0500 Received: from DYN319495.beaverton.ibm.com (d03av03.boulder.ibm.com [9.17.193.83]) by westrelay03.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i24KqHQc192546; Thu, 4 Mar 2004 13:52:18 -0700 Date: Thu, 4 Mar 2004 12:51:18 -0800 (PST) From: Vivek Kashyap X-X-Sender: kashyapv@dyn319495.beaverton.ibm.com To: "David S. Miller" cc: Ronghua Zhang , Subject: Re: [PATCH] proportional share accept() In-Reply-To: <20040227141321.04e2ffb4.davem@redhat.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 3737 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kashyapv@us.ibm.com Precedence: bulk X-list: netdev The following results show the efficacy of the patch for proportional share accept queues. I utilised Apache with no changes in configuration. Then used httperf to on three different machines. Did not change any parameters on the server or the client machines. Ran httperf to get the default test.html page repeatedly: /httperf --server xx.xx.xx.xx --port 80 --uri /test.html --rate 2000 \ --num-conn 100000 --num-call 1 --timeout 5 Three clients simultaneously bombarded the server. When the shares patch is not used the three clients get about equal service. With the proportional shares patch the favoured client gets a proportional number of its requests services in much shorter time. With port redirection the results are much poorer. The conntrack module is randomly dropping some of the requests too since its hash table gets full. The application will further require modification to provide proportional shares which is much more work. 1. The results without utilising the shares are: Total: connections 41993 requests 37195 replies 36951 test-duration 52.984 s Reply rate [replies/s]: min 646.1 avg 723.0 max 946.5 stddev 95.1 (10 samples) Reply time [ms]: response 151.3 transfer 0.0 Total: connections 41972 requests 37132 replies 37081 test-duration 52.996 s Reply rate [replies/s]: min 674.7 avg 724.9 max 805.3 stddev 35.1 (10 samples) Reply time [ms]: response 95.0 transfer 0.0 Total: connections 47171 requests 43037 replies 42991 test-duration 53.122 s Reply rate [replies/s]: min 777.2 avg 844.2 max 895.1 stddev 39.3 (10 samples) Reply time [ms]: response 92.1 transfer 0.0 2. With proportional share patch: The shares are were assigned in the ratio: 1:3:6. The results are listed in order: Total: connections 21566 requests 14695 replies 14251 test-duration 52.947 s Reply rate [replies/s]: min 208.0 avg 268.0 max 730.0 stddev 162.4 (10 samples) Reply time [ms]: response 518.3 transfer 0.0 Total: connections 41016 requests 34110 replies 34060 test-duration 52.981 s Reply rate [replies/s]: min 632.9 avg 667.9 max 707.5 stddev 20.1 (10 samples) Reply time [ms]: response 204.4 transfer 0.0 Total: connections 71264 requests 67089 replies 67008 test-duration 53.003 s Reply rate [replies/s]: min 1214.3 avg 1323.1 max 1366.7 stddev 44.2 (10 samples) Reply time [ms]: response 110.5 transfer 0.0 3. Port redirect test As a test case then modified httpd.conf to listen on three ports 8081/82/83. Used iptables REDIRECT target to forward the packets to these ports. The clients still communicate with port 80. As expected the results are not as good. Total: connections 33104 requests 27385 replies 26845 test-duration 54.992 s Reply rate [replies/s]: min 325.8 avg 534.9 max 868.5 stddev 205.0 (10 samples) Reply time [ms]: response 300.1 transfer 0.0 Total: connections 28022 requests 21536 replies 21391 test-duration 54.994 s Reply rate [replies/s]: min 2.0 avg 427.8 max 686.8 stddev 211.7 (10 samples) Reply time [ms]: response 309.8 transfer 0.0 Total: connections 27452 requests 21045 replies 20907 test-duration 54.992 s Reply rate [replies/s]: min 1.4 avg 418.1 max 632.7 stddev 208.2 (10 samples) Reply time [ms]: response 310.0 transfer 0.0 Vivek From ja@ssi.bg Thu Mar 4 12:56:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 12:56:44 -0800 (PST) Received: from u.domain.uli (ja.mac.ssi.bg [217.79.71.194]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24KuaKO013115 for ; Thu, 4 Mar 2004 12:56:39 -0800 Received: from localhost (localhost [127.0.0.1]) by u.domain.uli (8.12.10/8.12.10) with ESMTP id i24KuQml003257; Thu, 4 Mar 2004 22:56:26 +0200 Date: Thu, 4 Mar 2004 22:56:26 +0200 (EET) From: Julian Anastasov X-X-Sender: ja@u.domain.uli To: "David S. Miller" cc: niv@us.ibm.com, ak@suse.de, ruddk@us.ibm.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, chester.f.johnson@intel.com Subject: Re: PMTU issues due to TOS field manipulation (for DSCP) In-Reply-To: <20040304013618.31a827ba.davem@redhat.com> Message-ID: References: <20031212003143.062598e9.davem@redhat.com> <20040304013618.31a827ba.davem@redhat.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 3738 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ja@ssi.bg Precedence: bulk X-list: netdev Hello, On Thu, 4 Mar 2004, David S. Miller wrote: > Julian, I'd like to bring this back to life. Can you post a new version > of the ip_rt_ignore_tos patch against current 2.6.x? Done. Essentially, this patch combines the last posted two diff files: http://www.ssi.bg/~ja/tmp/tos-6.diff > We'll discuss and integrate just like for the ARP stuff. > > Sorry for sitting on this for so long, been busy... np, the remaining questions are: - do we need to walk all tos values for ip_rt_redirect in the same way as for ip_rt_frag_needed, if yes, how to name this flag? icmp_redirect_tos_mode? match_tos_on_redirect? May be pmtu_mode can be renamed to match_tos_on_pmtu? - from another thread: whether ICMP redirects modify only routes via gateway when shared_media is ON: http://marc.theaimsgroup.com/?l=linux-netdev&m=107109827516060&w=2 At the final I'll change some doc files to explain the new flags. Regards -- Julian Anastasov From rddunlap@osdl.org Thu Mar 4 13:15:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:15:44 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24LFfKO016331 for ; Thu, 4 Mar 2004 13:15:41 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i24LFaE27525 for ; Thu, 4 Mar 2004 13:15:36 -0800 Date: Thu, 4 Mar 2004 13:14:43 -0800 From: "Randy.Dunlap" To: netdev Subject: [janitor] "Lots of unnecessary casts in drivers can be removed" Message-Id: <20040304131443.62c34eaf.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.9.4 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3740 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 806 Lines: 33 [resend] Dave Jones wrote: - Lots of unnecessary casts in drivers can be removed. (from the KJ TODO list). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From: Carlo Perassi Carlo sent patches to remove unneeded casts from 90 files. Most of them are in drivers/net/ and will follow... (not one per file but grouped into families). and Russell King wrote about the first round of patches: } I think we should really consider using netdev_priv() in all these places } so the compiler knows that 'dev' and 'priv' are related. so this set of patches in round 2 teaches net drivers to use netdev_priv() in addition to eliminating the unneeded casts. Here they are again.... Please apply/merge to 2.6.4-rc-current. Built as much as I have possible, and running with eepro100. -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:18:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:18:15 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24LIDKO016997 for ; Thu, 4 Mar 2004 13:18:13 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i24LI7E28606 for ; Thu, 4 Mar 2004 13:18:07 -0800 Date: Thu, 4 Mar 2004 13:17:15 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in appletalk & fc Message-Id: <20040304131715.757b7f48.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.9.4 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3741 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 5982 Lines: 182 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/appletalk/cops.c | 26 +++++++-------- linux-264-302-priv-rddunlap/drivers/net/fc/iph5526.c | 8 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff -puN drivers/net/appletalk/cops.c~net_atalk_fc_casts drivers/net/appletalk/cops.c --- linux-264-302-priv/drivers/net/appletalk/cops.c~net_atalk_fc_casts 2004-03-02 15:16:36.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/appletalk/cops.c 2004-03-02 15:27:01.000000000 -0800 @@ -333,7 +333,7 @@ static int __init cops_probe1(struct net dev->base_addr = ioaddr; - lp = (struct cops_local *)dev->priv; + lp = netdev_priv(dev); memset(lp, 0, sizeof(struct cops_local)); spin_lock_init(&lp->lock); @@ -422,7 +422,7 @@ static int __init cops_irq (int ioaddr, */ static int cops_open(struct net_device *dev) { - struct cops_local *lp = (struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); if(dev->irq==0) { @@ -456,7 +456,7 @@ static int cops_open(struct net_device * */ static int cops_jumpstart(struct net_device *dev) { - struct cops_local *lp = (struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); /* * Once the card has the firmware loaded and has acquired @@ -490,7 +490,7 @@ static void tangent_wait_reset(int ioadd */ static void cops_reset(struct net_device *dev, int sleep) { - struct cops_local *lp = (struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); int ioaddr=dev->base_addr; if(lp->board==TANGENT) @@ -525,7 +525,7 @@ static void cops_load (struct net_device { struct ifreq ifr; struct ltfirmware *ltf= (struct ltfirmware *)&ifr.ifr_data; - struct cops_local *lp=(struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); int ioaddr=dev->base_addr; int length, i = 0; @@ -618,7 +618,7 @@ static void cops_load (struct net_device */ static int cops_nodeid (struct net_device *dev, int nodeid) { - struct cops_local *lp = (struct cops_local *) dev->priv; + struct cops_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; if(lp->board == DAYNA) @@ -730,7 +730,7 @@ static irqreturn_t cops_interrupt(int ir int boguscount = 0; ioaddr = dev->base_addr; - lp = (struct cops_local *)dev->priv; + lp = netdev_priv(dev); if(lp->board==DAYNA) { @@ -765,7 +765,7 @@ static void cops_rx(struct net_device *d int pkt_len = 0; int rsp_type = 0; struct sk_buff *skb = NULL; - struct cops_local *lp = dev->priv; + struct cops_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int boguscount = 0; unsigned long flags; @@ -869,7 +869,7 @@ static void cops_rx(struct net_device *d static void cops_timeout(struct net_device *dev) { - struct cops_local *lp = (struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; lp->stats.tx_errors++; @@ -891,7 +891,7 @@ static void cops_timeout(struct net_devi static int cops_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct cops_local *lp = (struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; unsigned long flags; @@ -966,7 +966,7 @@ static int cops_hard_header(struct sk_bu static int cops_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - struct cops_local *lp = (struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); struct sockaddr_at *sa = (struct sockaddr_at *)&ifr->ifr_addr; struct atalk_addr *aa = (struct atalk_addr *)&lp->node_addr; @@ -1002,7 +1002,7 @@ static int cops_ioctl(struct net_device static int cops_close(struct net_device *dev) { - struct cops_local *lp = (struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); /* If we were running polled, yank the timer. */ @@ -1019,7 +1019,7 @@ static int cops_close(struct net_device */ static struct net_device_stats *cops_get_stats(struct net_device *dev) { - struct cops_local *lp = (struct cops_local *)dev->priv; + struct cops_local *lp = netdev_priv(dev); return &lp->stats; } diff -puN drivers/net/fc/iph5526.c~net_atalk_fc_casts drivers/net/fc/iph5526.c --- linux-264-302-priv/drivers/net/fc/iph5526.c~net_atalk_fc_casts 2004-03-02 15:16:36.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/fc/iph5526.c 2004-03-02 15:30:14.000000000 -0800 @@ -238,7 +238,7 @@ int __init iph5526_probe(struct net_devi static int __init iph5526_probe_pci(struct net_device *dev) { - struct fc_info *fi = (struct fc_info *)dev->priv; + struct fc_info *fi = netdev_priv(dev); fi->dev = dev; dev->base_addr = fi->base_addr; dev->irq = fi->irq; @@ -2908,7 +2908,7 @@ static int iph5526_close(struct net_devi static void iph5526_timeout(struct net_device *dev) { - struct fc_info *fi = (struct fc_info*)dev->priv; + struct fc_info *fi = netdev_priv(dev); printk(KERN_WARNING "%s: timed out on send.\n", dev->name); fi->fc_stats.rx_dropped++; dev->trans_start = jiffies; @@ -2917,7 +2917,7 @@ static void iph5526_timeout(struct net_d static int iph5526_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct fc_info *fi = (struct fc_info*)dev->priv; + struct fc_info *fi = netdev_priv(dev); int status = 0; short type = 0; u_long flags; @@ -3688,7 +3688,7 @@ int count = 0, j; static struct net_device_stats * iph5526_get_stats(struct net_device *dev) { -struct fc_info *fi = (struct fc_info*)dev->priv; +struct fc_info *fi = netdev_priv(dev); return (struct net_device_stats *) &fi->fc_stats; } _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:18:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:18:31 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24LIRKO017100 for ; Thu, 4 Mar 2004 13:18:28 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i24LIME28644 for ; Thu, 4 Mar 2004 13:18:22 -0800 Date: Thu, 4 Mar 2004 13:17:30 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in tap/tun/plip/loop/skel Message-Id: <20040304131730.19dfeef9.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.9.4 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3742 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 14353 Lines: 425 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/ethertap.c | 12 +++--- linux-264-302-priv-rddunlap/drivers/net/isa-skeleton.c | 18 ++++----- linux-264-302-priv-rddunlap/drivers/net/loopback.c | 2 - linux-264-302-priv-rddunlap/drivers/net/plip.c | 32 ++++++++--------- linux-264-302-priv-rddunlap/drivers/net/tun.c | 22 +++++------ 5 files changed, 43 insertions(+), 43 deletions(-) diff -puN drivers/net/ethertap.c~net_generic_casts drivers/net/ethertap.c --- linux-264-302-priv/drivers/net/ethertap.c~net_generic_casts 2004-03-03 10:33:04.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/ethertap.c 2004-03-03 10:53:18.000000000 -0800 @@ -121,7 +121,7 @@ out: static int ethertap_open(struct net_device *dev) { - struct net_local *lp = (struct net_local*)dev->priv; + struct net_local *lp = netdev_priv(dev); if (ethertap_debug > 2) printk(KERN_DEBUG "%s: Doing ethertap_open()...", dev->name); @@ -150,7 +150,7 @@ static unsigned ethertap_mc_hash(__u8 *d static void set_multicast_list(struct net_device *dev) { unsigned groups = ~0; - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (!(dev->flags&(IFF_NOARP|IFF_PROMISC|IFF_ALLMULTI))) { struct dev_mc_list *dmi; @@ -176,7 +176,7 @@ static void set_multicast_list(struct ne static int ethertap_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); #ifdef CONFIG_ETHERTAP_MC struct ethhdr *eth = (struct ethhdr*)skb->data; #endif @@ -234,7 +234,7 @@ static int ethertap_start_xmit(struct sk static __inline__ int ethertap_rx_skb(struct sk_buff *skb, struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); #ifdef CONFIG_ETHERTAP_MC struct ethhdr *eth = (struct ethhdr*)(skb->data + 2); #endif @@ -320,7 +320,7 @@ static void ethertap_rx(struct sock *sk, static int ethertap_close(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); struct sock *sk = lp->nl; if (ethertap_debug > 2) @@ -338,7 +338,7 @@ static int ethertap_close(struct net_dev static struct net_device_stats *ethertap_get_stats(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); return &lp->stats; } diff -puN drivers/net/isa-skeleton.c~net_generic_casts drivers/net/isa-skeleton.c --- linux-264-302-priv/drivers/net/isa-skeleton.c~net_generic_casts 2004-03-03 10:33:04.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/isa-skeleton.c 2004-03-03 10:54:41.000000000 -0800 @@ -303,7 +303,7 @@ static int __init netcard_probe1(struct } #endif /* jumpered DMA */ - np = (struct net_local *)dev->priv; + np = netdev_priv(dev); spin_lock_init(&np->lock); dev->open = net_open; @@ -326,7 +326,7 @@ out: static void net_tx_timeout(struct net_device *dev) { - struct net_local *np = (struct net_local *)dev->priv; + struct net_local *np = netdev_priv(dev); printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name, tx_done(dev) ? "IRQ conflict" : "network cable problem"); @@ -361,7 +361,7 @@ static void net_tx_timeout(struct net_de static int net_open(struct net_device *dev) { - struct net_local *np = (struct net_local *)dev->priv; + struct net_local *np = netdev_priv(dev); int ioaddr = dev->base_addr; /* * This is used if the interrupt line can turned off (shared). @@ -399,7 +399,7 @@ net_open(struct net_device *dev) */ static int net_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct net_local *np = (struct net_local *)dev->priv; + struct net_local *np = netdev_priv(dev); int ioaddr = dev->base_addr; short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; unsigned char *buf = skb->data; @@ -465,7 +465,7 @@ static int net_send_packet(struct sk_buf */ void net_tx(struct net_device *dev) { - struct net_local *np = (struct net_local *)dev->priv; + struct net_local *np = netdev_priv(dev); int entry; /* This protects us from concurrent execution of @@ -508,7 +508,7 @@ static irqreturn_t net_interrupt(int irq ioaddr = dev->base_addr; - np = (struct net_local *)dev->priv; + np = netdev_priv(dev); status = inw(ioaddr + 0); if (status == 0) @@ -539,7 +539,7 @@ out: static void net_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int boguscount = 10; @@ -591,7 +591,7 @@ net_rx(struct net_device *dev) static int net_close(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; lp->open_time = 0; @@ -620,7 +620,7 @@ net_close(struct net_device *dev) */ static struct net_device_stats *net_get_stats(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); short ioaddr = dev->base_addr; /* Update the statistics from the device registers. */ diff -puN drivers/net/loopback.c~net_generic_casts drivers/net/loopback.c --- linux-264-302-priv/drivers/net/loopback.c~net_generic_casts 2004-03-03 10:33:04.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/loopback.c 2004-03-03 10:42:24.000000000 -0800 @@ -123,7 +123,7 @@ static void emulate_large_send_offload(s */ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) { - struct net_device_stats *stats = (struct net_device_stats *)dev->priv; + struct net_device_stats *stats = netdev_priv(dev); skb_orphan(skb); diff -puN drivers/net/plip.c~net_generic_casts drivers/net/plip.c --- linux-264-302-priv/drivers/net/plip.c~net_generic_casts 2004-03-03 10:33:04.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/plip.c 2004-03-03 10:52:24.000000000 -0800 @@ -280,7 +280,7 @@ inline static unsigned char read_status static void plip_init_netdev(struct net_device *dev) { - struct net_local *nl = dev->priv; + struct net_local *nl = netdev_priv(dev); /* Then, override parts of it */ dev->hard_start_xmit = plip_tx_packet; @@ -323,7 +323,7 @@ plip_init_netdev(struct net_device *dev) static void plip_kick_bh(struct net_device *dev) { - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); if (nl->is_deferred) schedule_work(&nl->immediate); @@ -366,7 +366,7 @@ static plip_func connection_state_table[ static void plip_bh(struct net_device *dev) { - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); struct plip_local *snd = &nl->snd_data; struct plip_local *rcv = &nl->rcv_data; plip_func f; @@ -384,7 +384,7 @@ plip_bh(struct net_device *dev) static void plip_timer_bh(struct net_device *dev) { - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); if (!(atomic_read (&nl->kill_timer))) { plip_interrupt (-1, dev, NULL); @@ -917,7 +917,7 @@ plip_interrupt(int irq, void *dev_id, st return; } - nl = (struct net_local *)dev->priv; + nl = netdev_priv(dev); rcv = &nl->rcv_data; spin_lock_irq (&nl->lock); @@ -961,7 +961,7 @@ plip_interrupt(int irq, void *dev_id, st static int plip_tx_packet(struct sk_buff *skb, struct net_device *dev) { - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); struct plip_local *snd = &nl->snd_data; if (netif_queue_stopped(dev)) @@ -1021,7 +1021,7 @@ plip_hard_header(struct sk_buff *skb, st unsigned short type, void *daddr, void *saddr, unsigned len) { - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); int ret; if ((ret = nl->orig_hard_header(skb, dev, type, daddr, saddr, len)) >= 0) @@ -1033,7 +1033,7 @@ plip_hard_header(struct sk_buff *skb, st int plip_hard_header_cache(struct neighbour *neigh, struct hh_cache *hh) { - struct net_local *nl = (struct net_local *)neigh->dev->priv; + struct net_local *nl = neigh->dev->priv; int ret; if ((ret = nl->orig_hard_header_cache(neigh, hh)) == 0) @@ -1057,7 +1057,7 @@ int plip_hard_header_cache(struct neighb static int plip_open(struct net_device *dev) { - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); struct in_device *in_dev; /* Grab the port */ @@ -1116,7 +1116,7 @@ plip_open(struct net_device *dev) static int plip_close(struct net_device *dev) { - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); struct plip_local *snd = &nl->snd_data; struct plip_local *rcv = &nl->rcv_data; @@ -1163,7 +1163,7 @@ static int plip_preempt(void *handle) { struct net_device *dev = (struct net_device *)handle; - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); /* Stand our ground if a datagram is on the wire */ if (nl->connection != PLIP_CN_NONE) { @@ -1179,7 +1179,7 @@ static void plip_wakeup(void *handle) { struct net_device *dev = (struct net_device *)handle; - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); if (nl->port_owner) { /* Why are we being woken up? */ @@ -1207,7 +1207,7 @@ plip_wakeup(void *handle) static struct net_device_stats * plip_get_stats(struct net_device *dev) { - struct net_local *nl = (struct net_local *)dev->priv; + struct net_local *nl = netdev_priv(dev); struct net_device_stats *r = &nl->enet_stats; return r; @@ -1216,7 +1216,7 @@ plip_get_stats(struct net_device *dev) static int plip_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct net_local *nl = (struct net_local *) dev->priv; + struct net_local *nl = netdev_priv(dev); struct plipconf *pc = (struct plipconf *) &rq->ifr_data; switch(pc->pcmd) { @@ -1288,7 +1288,7 @@ static void plip_attach (struct parport "which is fairly inefficient!\n", port->name); } - nl = dev->priv; + nl = netdev_priv(dev); nl->pardev = parport_register_device(port, name, plip_preempt, plip_wakeup, plip_interrupt, 0, dev); @@ -1348,7 +1348,7 @@ static void __exit plip_cleanup_module ( for (i=0; i < PLIP_MAX; i++) { if ((dev = dev_plip[i])) { - struct net_local *nl = dev->priv; + struct net_local *nl = netdev_priv(dev); unregister_netdev(dev); if (nl->port_owner) parport_release(nl->pardev); diff -puN drivers/net/tun.c~net_generic_casts drivers/net/tun.c --- linux-264-302-priv/drivers/net/tun.c~net_generic_casts 2004-03-03 10:33:04.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tun.c 2004-03-03 10:44:01.000000000 -0800 @@ -70,7 +70,7 @@ static int tun_net_close(struct net_devi /* Net device start xmit */ static int tun_net_xmit(struct sk_buff *skb, struct net_device *dev) { - struct tun_struct *tun = (struct tun_struct *)dev->priv; + struct tun_struct *tun = netdev_priv(dev); DBG(KERN_INFO "%s: tun_net_xmit %d\n", tun->dev->name, skb->len); @@ -113,14 +113,14 @@ static void tun_net_mclist(struct net_de static struct net_device_stats *tun_net_stats(struct net_device *dev) { - struct tun_struct *tun = (struct tun_struct *)dev->priv; + struct tun_struct *tun = netdev_priv(dev); return &tun->stats; } /* Initialize net device. */ static void tun_net_init(struct net_device *dev) { - struct tun_struct *tun = (struct tun_struct *)dev->priv; + struct tun_struct *tun = netdev_priv(dev); switch (tun->flags & TUN_TYPE_MASK) { case TUN_TUN_DEV: @@ -153,7 +153,7 @@ static void tun_net_init(struct net_devi /* Poll */ static unsigned int tun_chr_poll(struct file *file, poll_table * wait) { - struct tun_struct *tun = (struct tun_struct *)file->private_data; + struct tun_struct *tun = file->private_data; unsigned int mask = POLLOUT | POLLWRNORM; if (!tun) @@ -217,7 +217,7 @@ static __inline__ ssize_t tun_get_user(s static ssize_t tun_chr_writev(struct file * file, const struct iovec *iv, unsigned long count, loff_t *pos) { - struct tun_struct *tun = (struct tun_struct *)file->private_data; + struct tun_struct *tun = file->private_data; unsigned long i; size_t len; @@ -279,7 +279,7 @@ static __inline__ ssize_t tun_put_user(s static ssize_t tun_chr_readv(struct file *file, const struct iovec *iv, unsigned long count, loff_t *pos) { - struct tun_struct *tun = (struct tun_struct *)file->private_data; + struct tun_struct *tun = file->private_data; DECLARE_WAITQUEUE(wait, current); struct sk_buff *skb; ssize_t len, ret = 0; @@ -341,7 +341,7 @@ static ssize_t tun_chr_read(struct file static void tun_setup(struct net_device *dev) { - struct tun_struct *tun = dev->priv; + struct tun_struct *tun = netdev_priv(dev); skb_queue_head_init(&tun->readq); init_waitqueue_head(&tun->read_wait); @@ -413,7 +413,7 @@ static int tun_set_iff(struct file *file if (!dev) return -ENOMEM; - tun = dev->priv; + tun = netdev_priv(dev); tun->dev = dev; tun->flags = flags; @@ -455,7 +455,7 @@ static int tun_set_iff(struct file *file static int tun_chr_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct tun_struct *tun = (struct tun_struct *)file->private_data; + struct tun_struct *tun = file->private_data; if (cmd == TUNSETIFF && !tun) { struct ifreq ifr; @@ -527,7 +527,7 @@ static int tun_chr_ioctl(struct inode *i static int tun_chr_fasync(int fd, struct file *file, int on) { - struct tun_struct *tun = (struct tun_struct *)file->private_data; + struct tun_struct *tun = file->private_data; int ret; if (!tun) @@ -558,7 +558,7 @@ static int tun_chr_open(struct inode *in static int tun_chr_close(struct inode *inode, struct file *file) { - struct tun_struct *tun = (struct tun_struct *)file->private_data; + struct tun_struct *tun = file->private_data; if (!tun) return 0; _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:18:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:18:52 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24LImKO017352 for ; Thu, 4 Mar 2004 13:18:48 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i24LIhE28690 for ; Thu, 4 Mar 2004 13:18:43 -0800 Date: Thu, 4 Mar 2004 13:17:51 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in /hamradio/ Message-Id: <20040304131751.1443cf90.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.9.4 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3743 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 10069 Lines: 287 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/hamradio/baycom_epp.c | 24 +++++----- linux-264-302-priv-rddunlap/drivers/net/hamradio/baycom_par.c | 12 ++--- linux-264-302-priv-rddunlap/drivers/net/hamradio/baycom_ser_fdx.c | 10 ++-- linux-264-302-priv-rddunlap/drivers/net/hamradio/baycom_ser_hdx.c | 10 ++-- 4 files changed, 28 insertions(+), 28 deletions(-) diff -puN drivers/net/hamradio/baycom_epp.c~net_hamradio_casts drivers/net/hamradio/baycom_epp.c --- linux-264-302-priv/drivers/net/hamradio/baycom_epp.c~net_hamradio_casts 2004-03-02 15:41:21.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/hamradio/baycom_epp.c 2004-03-02 15:49:09.000000000 -0800 @@ -646,7 +646,7 @@ static int transmit(struct baycom_state static void do_rxpacket(struct net_device *dev) { - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); struct sk_buff *skb; unsigned char *cp; unsigned pktlen; @@ -705,7 +705,7 @@ static void do_rxpacket(struct net_devic static int receive(struct net_device *dev, int cnt) { - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); struct parport *pp = bc->pdev->port; unsigned int bitbuf, notbitstream, bitstream, numbits, state; unsigned char tmp[128]; @@ -790,7 +790,7 @@ static void epp_bh(struct net_device *de int cnt, cnt2; baycom_paranoia_check_void(dev, "epp_bh"); - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (!bc->work_running) return; baycom_int_freq(bc); @@ -908,7 +908,7 @@ static int baycom_send_packet(struct sk_ struct baycom_state *bc; baycom_paranoia_check(dev, "baycom_send_packet", 0); - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (skb->data[0] != 0) { do_kiss_params(bc, skb->data, skb->len); dev_kfree_skb(skb); @@ -944,7 +944,7 @@ static struct net_device_stats *baycom_g struct baycom_state *bc; baycom_paranoia_check(dev, "baycom_get_stats", NULL); - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); /* * Get the current statistics. This may be called with the * card open or closed. @@ -960,7 +960,7 @@ static void epp_wakeup(void *handle) struct baycom_state *bc; baycom_paranoia_check_void(dev, "epp_wakeup"); - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); printk(KERN_DEBUG "baycom_epp: %s: why am I being woken up?\n", dev->name); if (!parport_claim(bc->pdev)) printk(KERN_DEBUG "baycom_epp: %s: I'm broken.\n", dev->name); @@ -987,7 +987,7 @@ static int epp_open(struct net_device *d unsigned long tstart; baycom_paranoia_check(dev, "epp_open", -ENXIO); - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); pp = parport_find_base(dev->base_addr); if (!pp) { printk(KERN_ERR "%s: parport at 0x%lx unknown\n", bc_drvname, dev->base_addr); @@ -1102,7 +1102,7 @@ static int epp_close(struct net_device * unsigned char tmp[1]; baycom_paranoia_check(dev, "epp_close", -EINVAL); - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); pp = bc->pdev->port; bc->work_running = 0; flush_scheduled_work(); @@ -1163,7 +1163,7 @@ static int baycom_ioctl(struct net_devic struct hdlcdrv_ioctl hi; baycom_paranoia_check(dev, "baycom_ioctl", -EINVAL); - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (cmd != SIOCDEVPRIVATE) return -ENOIOCTLCMD; if (get_user(cmd, (int *)ifr->ifr_data)) @@ -1290,7 +1290,7 @@ static void baycom_probe(struct net_devi /* * not a real probe! only initialize data structures */ - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); /* * initialize the baycom_state struct */ @@ -1351,7 +1351,7 @@ MODULE_LICENSE("GPL"); static void __init baycom_epp_dev_setup(struct net_device *dev) { - struct baycom_state *bc = dev->priv; + struct baycom_state *bc = netdev_priv(dev); /* * initialize part of the baycom_state struct @@ -1415,7 +1415,7 @@ static void __exit cleanup_baycomepp(voi struct net_device *dev = baycom_device[i]; if (dev) { - struct baycom_state *bc = dev->priv; + struct baycom_state *bc = netdev_priv(dev); if (bc->magic == BAYCOM_MAGIC) { unregister_netdev(dev); free_netdev(dev); diff -puN drivers/net/hamradio/baycom_par.c~net_hamradio_casts drivers/net/hamradio/baycom_par.c --- linux-264-302-priv/drivers/net/hamradio/baycom_par.c~net_hamradio_casts 2004-03-02 15:41:21.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/hamradio/baycom_par.c 2004-03-02 15:46:19.000000000 -0800 @@ -272,7 +272,7 @@ static __inline__ void par96_rx(struct n static void par96_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); if (!dev || !bc || bc->hdrv.magic != HDLCDRV_MAGIC) return; @@ -302,7 +302,7 @@ static void par96_interrupt(int irq, voi static void par96_wakeup(void *handle) { struct net_device *dev = (struct net_device *)handle; - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); printk(KERN_DEBUG "baycom_par: %s: why am I being woken up?\n", dev->name); if (!parport_claim(bc->pdev)) @@ -313,7 +313,7 @@ static void par96_wakeup(void *handle) static int par96_open(struct net_device *dev) { - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); struct parport *pp; if (!dev || !bc) @@ -362,7 +362,7 @@ static int par96_open(struct net_device static int par96_close(struct net_device *dev) { - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); struct parport *pp; if (!dev || !bc) @@ -424,7 +424,7 @@ static int baycom_ioctl(struct net_devic printk(KERN_ERR "bc_ioctl: invalid device struct\n"); return -EINVAL; } - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (cmd != SIOCDEVPRIVATE) return -ENOIOCTLCMD; @@ -524,7 +524,7 @@ static int __init init_baycompar(void) if (IS_ERR(dev)) break; - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (set_hw && baycom_setmode(bc, mode[i])) set_hw = 0; found++; diff -puN drivers/net/hamradio/baycom_ser_fdx.c~net_hamradio_casts drivers/net/hamradio/baycom_ser_fdx.c --- linux-264-302-priv/drivers/net/hamradio/baycom_ser_fdx.c~net_hamradio_casts 2004-03-02 15:41:21.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/hamradio/baycom_ser_fdx.c 2004-03-02 15:44:37.000000000 -0800 @@ -281,7 +281,7 @@ static __inline__ void ser12_rx(struct n static irqreturn_t ser12_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); struct timeval tv; unsigned char iir, msr; unsigned int txcount = 0; @@ -407,7 +407,7 @@ static enum uart ser12_check_uart(unsign static int ser12_open(struct net_device *dev) { - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); enum uart u; if (!dev || !bc) @@ -466,7 +466,7 @@ static int ser12_open(struct net_device static int ser12_close(struct net_device *dev) { - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); if (!dev || !bc) return -EINVAL; @@ -536,7 +536,7 @@ static int baycom_ioctl(struct net_devic printk(KERN_ERR "bc_ioctl: invalid device struct\n"); return -EINVAL; } - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (cmd != SIOCDEVPRIVATE) return -ENOIOCTLCMD; @@ -644,7 +644,7 @@ static int __init init_baycomserfdx(void if (IS_ERR(dev)) break; - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (set_hw && baycom_setmode(bc, mode[i])) set_hw = 0; bc->baud = baud[i]; diff -puN drivers/net/hamradio/baycom_ser_hdx.c~net_hamradio_casts drivers/net/hamradio/baycom_ser_hdx.c --- linux-264-302-priv/drivers/net/hamradio/baycom_ser_hdx.c~net_hamradio_casts 2004-03-02 15:41:21.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/hamradio/baycom_ser_hdx.c 2004-03-02 15:49:54.000000000 -0800 @@ -375,7 +375,7 @@ static inline void ser12_rx(struct net_d static irqreturn_t ser12_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); unsigned char iir; if (!dev || !bc || bc->hdrv.magic != HDLCDRV_MAGIC) @@ -468,7 +468,7 @@ static enum uart ser12_check_uart(unsign static int ser12_open(struct net_device *dev) { - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); enum uart u; if (!dev || !bc) @@ -511,7 +511,7 @@ static int ser12_open(struct net_device static int ser12_close(struct net_device *dev) { - struct baycom_state *bc = (struct baycom_state *)dev->priv; + struct baycom_state *bc = netdev_priv(dev); if (!dev || !bc) return -EINVAL; @@ -576,7 +576,7 @@ static int baycom_ioctl(struct net_devic printk(KERN_ERR "bc_ioctl: invalid device struct\n"); return -EINVAL; } - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (cmd != SIOCDEVPRIVATE) return -ENOIOCTLCMD; @@ -681,7 +681,7 @@ static int __init init_baycomserhdx(void if (IS_ERR(dev)) break; - bc = (struct baycom_state *)dev->priv; + bc = netdev_priv(dev); if (set_hw && baycom_setmode(bc, mode[i])) set_hw = 0; found++; _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:19:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:19:10 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24LJ2KO017593 for ; Thu, 4 Mar 2004 13:19:03 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i24LIvE28737 for ; Thu, 4 Mar 2004 13:18:57 -0800 Date: Thu, 4 Mar 2004 13:18:05 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in net/ intel drivers Message-Id: <20040304131805.2e3af4eb.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.9.4 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3744 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 29112 Lines: 840 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/82596.c | 28 +++++----- linux-264-302-priv-rddunlap/drivers/net/eepro.c | 28 +++++----- linux-264-302-priv-rddunlap/drivers/net/eepro100.c | 52 +++++++++---------- linux-264-302-priv-rddunlap/drivers/net/eexpress.c | 34 ++++++------ linux-264-302-priv-rddunlap/drivers/net/lasi_82596.c | 36 ++++++------- 5 files changed, 89 insertions(+), 89 deletions(-) diff -puN drivers/net/82596.c~net_intel_casts drivers/net/82596.c --- linux-264-302-priv/drivers/net/82596.c~net_intel_casts 2004-03-03 11:59:08.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/82596.c 2004-03-03 12:03:40.000000000 -0800 @@ -458,7 +458,7 @@ static inline int wait_cfg(struct net_de static void i596_display_data(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); struct i596_cmd *cmd; struct i596_rfd *rfd; struct i596_rbd *rbd; @@ -528,7 +528,7 @@ static irqreturn_t i596_error(int irq, v static inline void init_rx_bufs(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *)dev->priv; + struct i596_private *lp = netdev_priv(dev); int i; struct i596_rfd *rfd; struct i596_rbd *rbd; @@ -579,7 +579,7 @@ static inline void init_rx_bufs(struct n static inline void remove_rx_bufs(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *)dev->priv; + struct i596_private *lp = netdev_priv(dev); struct i596_rbd *rbd; int i; @@ -593,7 +593,7 @@ static inline void remove_rx_bufs(struct static void rebuild_rx_bufs(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); int i; /* Ensure rx frame/buffer descriptors are tidy */ @@ -612,7 +612,7 @@ static void rebuild_rx_bufs(struct net_d static int init_i596_mem(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); #if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) short ioaddr = dev->base_addr; #endif @@ -765,7 +765,7 @@ failed: static inline int i596_rx(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *)dev->priv; + struct i596_private *lp = netdev_priv(dev); struct i596_rfd *rfd; struct i596_rbd *rbd; int frames = 0; @@ -960,7 +960,7 @@ static inline void i596_reset(struct net static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); int ioaddr = dev->base_addr; unsigned long flags; @@ -1030,7 +1030,7 @@ static int i596_open(struct net_device * static void i596_tx_timeout (struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); int ioaddr = dev->base_addr; /* Transmitter timeout, serious problems. */ @@ -1059,7 +1059,7 @@ static void i596_tx_timeout (struct net_ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); struct tx_cmd *tx_cmd; struct i596_tbd *tbd; short length = skb->len; @@ -1245,7 +1245,7 @@ struct net_device * __init i82596_probe( dev->priv = (void *)(dev->mem_start); - lp = (struct i596_private *) dev->priv; + lp = netdev_priv(dev); DEB(DEB_INIT,printk(KERN_DEBUG "%s: lp at 0x%08lx (%d bytes), lp->scb at 0x%08lx\n", dev->name, (unsigned long)lp, sizeof(struct i596_private), (unsigned long)&lp->scb)); @@ -1305,7 +1305,7 @@ static irqreturn_t i596_interrupt(int ir } ioaddr = dev->base_addr; - lp = (struct i596_private *) dev->priv; + lp = netdev_priv(dev); spin_lock (&lp->lock); @@ -1448,7 +1448,7 @@ static irqreturn_t i596_interrupt(int ir static int i596_close(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); unsigned long flags; netif_stop_queue(dev); @@ -1495,7 +1495,7 @@ static int i596_close(struct net_device static struct net_device_stats * i596_get_stats(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); return &lp->stats; } @@ -1506,7 +1506,7 @@ static struct net_device_stats * static void set_multicast_list(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); int config = 0, cnt; DEB(DEB_MULTI,printk(KERN_DEBUG "%s: set multicast list, %d entries, promisc %s, allmulti %s\n", diff -puN drivers/net/eepro100.c~net_intel_casts drivers/net/eepro100.c --- linux-264-302-priv/drivers/net/eepro100.c~net_intel_casts 2004-03-03 11:59:08.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/eepro100.c 2004-03-03 12:05:18.000000000 -0800 @@ -839,7 +839,7 @@ static int __devinit speedo_found1(struc dev->irq = pdev->irq; - sp = dev->priv; + sp = netdev_priv(dev); sp->pdev = pdev; sp->msg_enable = DEBUG; sp->acpi_pwr = acpi_idle_state; @@ -995,7 +995,7 @@ static void mdio_write(struct net_device static int speedo_open(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; int retval; @@ -1082,7 +1082,7 @@ speedo_open(struct net_device *dev) /* Start the chip hardware after a full reset. */ static void speedo_resume(struct net_device *dev) { - struct speedo_private *sp = dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; /* Start with a Tx threshold of 256 (0x..20.... 8 byte units). */ @@ -1162,7 +1162,7 @@ static void speedo_resume(struct net_dev static void speedo_rx_soft_reset(struct net_device *dev) { - struct speedo_private *sp = dev->priv; + struct speedo_private *sp = netdev_priv(dev); struct RxFD *rfd; long ioaddr; @@ -1194,7 +1194,7 @@ speedo_rx_soft_reset(struct net_device * static void speedo_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; int phy_num = sp->phy[0] & 0x1f; @@ -1239,7 +1239,7 @@ static void speedo_timer(unsigned long d static void speedo_show_state(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); int i; if (netif_msg_pktdata(sp)) { @@ -1282,7 +1282,7 @@ static void speedo_show_state(struct net static void speedo_init_rx_ring(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); struct RxFD *rxf, *last_rxf = NULL; dma_addr_t last_rxf_dma = 0 /* to shut up the compiler */; int i; @@ -1330,7 +1330,7 @@ speedo_init_rx_ring(struct net_device *d static void speedo_purge_tx(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); int entry; while ((int)(sp->cur_tx - sp->dirty_tx) > 0) { @@ -1362,7 +1362,7 @@ static void speedo_purge_tx(struct net_d static void reset_mii(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); /* Reset the MII transceiver, suggested by Fred Young @ scalable.com. */ if ((sp->phy[0] & 0x8000) == 0) { @@ -1385,7 +1385,7 @@ static void reset_mii(struct net_device static void speedo_tx_timeout(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; int status = inw(ioaddr + SCBStatus); unsigned long flags; @@ -1447,7 +1447,7 @@ static void speedo_tx_timeout(struct net static int speedo_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; int entry; @@ -1518,7 +1518,7 @@ speedo_start_xmit(struct sk_buff *skb, s static void speedo_tx_buffer_gc(struct net_device *dev) { unsigned int dirty_tx; - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); dirty_tx = sp->dirty_tx; while ((int)(sp->cur_tx - dirty_tx) > 0) { @@ -1585,7 +1585,7 @@ static irqreturn_t speedo_interrupt(int unsigned int handled = 0; ioaddr = dev->base_addr; - sp = (struct speedo_private *)dev->priv; + sp = netdev_priv(dev); #ifndef final_version /* A lock to prevent simultaneous entry on SMP machines. */ @@ -1677,7 +1677,7 @@ static irqreturn_t speedo_interrupt(int static inline struct RxFD *speedo_rx_alloc(struct net_device *dev, int entry) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); struct RxFD *rxf; struct sk_buff *skb; /* Get a fresh skbuff to replace the consumed one. */ @@ -1704,7 +1704,7 @@ static inline struct RxFD *speedo_rx_all static inline void speedo_rx_link(struct net_device *dev, int entry, struct RxFD *rxf, dma_addr_t rxf_dma) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); rxf->status = cpu_to_le32(0xC0000001); /* '1' for driver use only. */ rxf->link = 0; /* None yet. */ rxf->count = cpu_to_le32(PKT_BUF_SZ << 16); @@ -1718,7 +1718,7 @@ static inline void speedo_rx_link(struct static int speedo_refill_rx_buf(struct net_device *dev, int force) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); int entry; struct RxFD *rxf; @@ -1760,7 +1760,7 @@ static int speedo_refill_rx_buf(struct n static void speedo_refill_rx_buffers(struct net_device *dev, int force) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); /* Refill the RX ring. */ while ((int)(sp->cur_rx - sp->dirty_rx) > 0 && @@ -1770,7 +1770,7 @@ static void speedo_refill_rx_buffers(str static int speedo_rx(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); int entry = sp->cur_rx % RX_RING_SIZE; int rx_work_limit = sp->dirty_rx + RX_RING_SIZE - sp->cur_rx; int alloc_ok = 1; @@ -1884,7 +1884,7 @@ static int speedo_close(struct net_device *dev) { long ioaddr = dev->base_addr; - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); int i; netdevice_stop(dev); @@ -1962,7 +1962,7 @@ speedo_close(struct net_device *dev) static struct net_device_stats * speedo_get_stats(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; /* Update only if the previous dump finished. */ @@ -1995,7 +1995,7 @@ speedo_get_stats(struct net_device *dev) static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) { u32 ethcmd; - struct speedo_private *sp = dev->priv; + struct speedo_private *sp = netdev_priv(dev); if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) return -EFAULT; @@ -2070,7 +2070,7 @@ static int netdev_ethtool_ioctl(struct n static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; int phy = sp->phy[0] & 0x1f; int saved_acpi; @@ -2121,7 +2121,7 @@ static int speedo_ioctl(struct net_devic */ static void set_rx_mode(struct net_device *dev) { - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; struct descriptor *last_cmd; char new_rx_mode; @@ -2313,7 +2313,7 @@ static void set_rx_mode(struct net_devic static int eepro100_suspend(struct pci_dev *pdev, u32 state) { struct net_device *dev = pci_get_drvdata (pdev); - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; pci_save_state(pdev, sp->pm_state); @@ -2333,7 +2333,7 @@ static int eepro100_suspend(struct pci_d static int eepro100_resume(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata (pdev); - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); long ioaddr = dev->base_addr; pci_restore_state(pdev, sp->pm_state); @@ -2363,7 +2363,7 @@ static int eepro100_resume(struct pci_de static void __devexit eepro100_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata (pdev); - struct speedo_private *sp = (struct speedo_private *)dev->priv; + struct speedo_private *sp = netdev_priv(dev); unregister_netdev(dev); diff -puN drivers/net/eepro.c~net_intel_casts drivers/net/eepro.c --- linux-264-302-priv/drivers/net/eepro.c~net_intel_casts 2004-03-03 11:59:08.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/eepro.c 2004-03-03 12:06:42.000000000 -0800 @@ -662,7 +662,7 @@ static void eepro_recalc (struct net_dev { struct eepro_local * lp; - lp = dev->priv; + lp = netdev_priv(dev); lp->xmt_ram = RAM_SIZE - lp->rcv_ram; if (lp->eepro == LAN595FX_10ISA) { @@ -682,7 +682,7 @@ static void eepro_recalc (struct net_dev /* prints boot-time info */ static void eepro_print_info (struct net_device *dev) { - struct eepro_local * lp = dev->priv; + struct eepro_local * lp = netdev_priv(dev); int i; const char * ifmap[] = {"AUI", "10Base2", "10BaseT"}; @@ -769,7 +769,7 @@ static int __init eepro_probe1(struct ne if ((inb(ioaddr + ID_REG) & R_ROBIN_BITS) != (counter + 0x40)) goto exit; - lp = (struct eepro_local *)dev->priv; + lp = netdev_priv(dev); memset(lp, 0, sizeof(struct eepro_local)); lp->xmt_bar = XMT_BAR_PRO; lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_PRO; @@ -932,7 +932,7 @@ static int eepro_open(struct net_device unsigned short temp_reg, old8, old9; int irqMask; int i, ioaddr = dev->base_addr; - struct eepro_local *lp = (struct eepro_local *)dev->priv; + struct eepro_local *lp = netdev_priv(dev); if (net_debug > 3) printk(KERN_DEBUG "%s: entering eepro_open routine.\n", dev->name); @@ -1106,7 +1106,7 @@ static int eepro_open(struct net_device static void eepro_tx_timeout (struct net_device *dev) { - struct eepro_local *lp = (struct eepro_local *) dev->priv; + struct eepro_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; /* if (net_debug > 1) */ @@ -1122,7 +1122,7 @@ static void eepro_tx_timeout (struct net static int eepro_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct eepro_local *lp = (struct eepro_local *)dev->priv; + struct eepro_local *lp = netdev_priv(dev); unsigned long flags; int ioaddr = dev->base_addr; short length = skb->len; @@ -1187,7 +1187,7 @@ eepro_interrupt(int irq, void *dev_id, s return IRQ_NONE; } - lp = (struct eepro_local *)dev->priv; + lp = netdev_priv(dev); spin_lock(&lp->lock); @@ -1235,7 +1235,7 @@ eepro_interrupt(int irq, void *dev_id, s static int eepro_close(struct net_device *dev) { - struct eepro_local *lp = (struct eepro_local *)dev->priv; + struct eepro_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; short temp_reg; @@ -1280,7 +1280,7 @@ static int eepro_close(struct net_device static struct net_device_stats * eepro_get_stats(struct net_device *dev) { - struct eepro_local *lp = (struct eepro_local *)dev->priv; + struct eepro_local *lp = netdev_priv(dev); return &lp->stats; } @@ -1290,7 +1290,7 @@ eepro_get_stats(struct net_device *dev) static void set_multicast_list(struct net_device *dev) { - struct eepro_local *lp = (struct eepro_local *)dev->priv; + struct eepro_local *lp = netdev_priv(dev); short ioaddr = dev->base_addr; unsigned short mode; struct dev_mc_list *dmi=dev->mc_list; @@ -1424,7 +1424,7 @@ read_eeprom(int ioaddr, int location, st { int i; unsigned short retval = 0; - struct eepro_local *lp = dev->priv; + struct eepro_local *lp = netdev_priv(dev); short ee_addr = ioaddr + lp->eeprom_reg; int read_cmd = location | EE_READ_CMD; short ctrl_val = EECS ; @@ -1468,7 +1468,7 @@ read_eeprom(int ioaddr, int location, st static int hardware_send_packet(struct net_device *dev, void *buf, short length) { - struct eepro_local *lp = (struct eepro_local *)dev->priv; + struct eepro_local *lp = netdev_priv(dev); short ioaddr = dev->base_addr; unsigned status, tx_available, last, end; @@ -1553,7 +1553,7 @@ hardware_send_packet(struct net_device * static void eepro_rx(struct net_device *dev) { - struct eepro_local *lp = (struct eepro_local *)dev->priv; + struct eepro_local *lp = netdev_priv(dev); short ioaddr = dev->base_addr; short boguscount = 20; short rcv_car = lp->rx_start; @@ -1651,7 +1651,7 @@ eepro_rx(struct net_device *dev) static void eepro_transmit_interrupt(struct net_device *dev) { - struct eepro_local *lp = (struct eepro_local *)dev->priv; + struct eepro_local *lp = netdev_priv(dev); short ioaddr = dev->base_addr; short boguscount = 25; short xmt_status; diff -puN drivers/net/eexpress.c~net_intel_casts drivers/net/eexpress.c --- linux-264-302-priv/drivers/net/eexpress.c~net_intel_casts 2004-03-03 11:59:08.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/eexpress.c 2004-03-03 12:07:35.000000000 -0800 @@ -452,7 +452,7 @@ static int eexp_open(struct net_device * { int ret; unsigned short ioaddr = dev->base_addr; - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); #if NET_DEBUG > 6 printk(KERN_DEBUG "%s: eexp_open()\n", dev->name); @@ -515,7 +515,7 @@ static int eexp_open(struct net_device * static int eexp_close(struct net_device *dev) { unsigned short ioaddr = dev->base_addr; - struct net_local *lp = dev->priv; + struct net_local *lp = netdev_priv(dev); int irq = dev->irq; @@ -541,7 +541,7 @@ static int eexp_close(struct net_device static struct net_device_stats *eexp_stats(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); return &lp->stats; } @@ -553,7 +553,7 @@ static struct net_device_stats *eexp_sta static void unstick_cu(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short ioaddr = dev->base_addr; if (lp->started) @@ -627,7 +627,7 @@ static void unstick_cu(struct net_device static void eexp_timeout(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); #ifdef CONFIG_SMP unsigned long flags; #endif @@ -667,7 +667,7 @@ static void eexp_timeout(struct net_devi */ static int eexp_xmit(struct sk_buff *buf, struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); short length = buf->len; #ifdef CONFIG_SMP unsigned long flags; @@ -728,7 +728,7 @@ static unsigned short eexp_start_irq(str unsigned short status) { unsigned short ack_cmd = SCB_ack(status); - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short ioaddr = dev->base_addr; if ((dev->flags & IFF_UP) && !(lp->started & STARTED_CU)) { short diag_status, tdr_status; @@ -806,7 +806,7 @@ static irqreturn_t eexp_irq(int irq, voi return IRQ_NONE; } - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); ioaddr = dev->base_addr; spin_lock(&lp->lock); @@ -925,7 +925,7 @@ static void eexp_hw_set_interface(struct static void eexp_hw_rx_pio(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short rx_block = lp->rx_ptr; unsigned short boguscount = lp->num_rx_bufs; unsigned short ioaddr = dev->base_addr; @@ -1022,7 +1022,7 @@ static void eexp_hw_rx_pio(struct net_de static void eexp_hw_tx_pio(struct net_device *dev, unsigned short *buf, unsigned short len) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short ioaddr = dev->base_addr; if (LOCKUP16 || lp->width) { @@ -1090,7 +1090,7 @@ static int __init eexp_hw_probe(struct n unsigned int memory_size; int i; unsigned short xsum = 0; - struct net_local *lp = dev->priv; + struct net_local *lp = netdev_priv(dev); printk("%s: EtherExpress 16 at %#x ",dev->name,ioaddr); @@ -1262,7 +1262,7 @@ static unsigned short __init eexp_hw_rea static unsigned short eexp_hw_lasttxstat(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short tx_block = lp->tx_reap; unsigned short status; @@ -1332,7 +1332,7 @@ static unsigned short eexp_hw_lasttxstat static void eexp_hw_txrestart(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short ioaddr = dev->base_addr; lp->last_tx_restart = lp->tx_link; @@ -1377,7 +1377,7 @@ static void eexp_hw_txrestart(struct net static void eexp_hw_txinit(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short tx_block = TX_BUF_START; unsigned short curtbuf; unsigned short ioaddr = dev->base_addr; @@ -1419,7 +1419,7 @@ static void eexp_hw_txinit(struct net_de static void eexp_hw_rxinit(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short rx_block = lp->rx_buf_start; unsigned short ioaddr = dev->base_addr; @@ -1478,7 +1478,7 @@ static void eexp_hw_rxinit(struct net_de static void eexp_hw_init586(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned short ioaddr = dev->base_addr; int i; @@ -1639,7 +1639,7 @@ static void eexp_set_multicast(struct net_device *dev) { unsigned short ioaddr = dev->base_addr; - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int kick = 0, i; if ((dev->flags & IFF_PROMISC) != lp->was_promisc) { outw(CONF_PROMISC & ~31, ioaddr+SM_PTR); diff -puN drivers/net/lasi_82596.c~net_intel_casts drivers/net/lasi_82596.c --- linux-264-302-priv/drivers/net/lasi_82596.c~net_intel_casts 2004-03-03 11:59:08.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/lasi_82596.c 2004-03-03 12:10:55.000000000 -0800 @@ -426,7 +426,7 @@ static inline void CA(struct net_device static inline void MPU_PORT(struct net_device *dev, int c, dma_addr_t x) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); u32 v = (u32) (c) | (u32) (x); u16 a, b; @@ -481,7 +481,7 @@ static inline int wait_cmd(struct net_de static void i596_display_data(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); struct i596_cmd *cmd; struct i596_rfd *rfd; struct i596_rbd *rbd; @@ -541,7 +541,7 @@ static void i596_error(int irq, void *de static inline void init_rx_bufs(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *)dev->priv; + struct i596_private *lp = netdev_priv(dev); int i; struct i596_rfd *rfd; struct i596_rbd *rbd; @@ -595,7 +595,7 @@ static inline void init_rx_bufs(struct n static inline void remove_rx_bufs(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *)dev->priv; + struct i596_private *lp = netdev_priv(dev); struct i596_rbd *rbd; int i; @@ -612,7 +612,7 @@ static inline void remove_rx_bufs(struct static void rebuild_rx_bufs(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); int i; /* Ensure rx frame/buffer descriptors are tidy */ @@ -633,7 +633,7 @@ static void rebuild_rx_bufs(struct net_d static int init_i596_mem(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); unsigned long flags; disable_irq(dev->irq); /* disable IRQs from LAN */ @@ -727,7 +727,7 @@ failed: static inline int i596_rx(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *)dev->priv; + struct i596_private *lp = netdev_priv(dev); struct i596_rfd *rfd; struct i596_rbd *rbd; int frames = 0; @@ -939,7 +939,7 @@ static inline void i596_reset(struct net static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); unsigned long flags; DEB(DEB_ADDCMD,printk("i596_add_cmd cmd_head %p\n", lp->cmd_head)); @@ -987,7 +987,7 @@ static void i596_add_cmd(struct net_devi device list */ static int i596_test(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); volatile int *tint; u32 data; @@ -1041,7 +1041,7 @@ out: static void i596_tx_timeout (struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); /* Transmitter timeout, serious problems. */ DEB(DEB_ERRORS,printk("%s: transmit timed out, status resetting.\n", @@ -1070,7 +1070,7 @@ static void i596_tx_timeout (struct net_ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); struct tx_cmd *tx_cmd; struct i596_tbd *tbd; short length = skb->len; @@ -1219,7 +1219,7 @@ static int __devinit i82596_probe(struct dev->priv = (void *)(dev->mem_start); - lp = (struct i596_private *) dev->priv; + lp = netdev_priv(dev); DEB(DEB_INIT,printk ("%s: lp at 0x%08lx (%d bytes), lp->scb at 0x%08lx\n", dev->name, (unsigned long)lp, sizeof(struct i596_private), (unsigned long)&lp->scb)); @@ -1249,7 +1249,7 @@ static irqreturn_t i596_interrupt(int ir return IRQ_NONE; } - lp = (struct i596_private *) dev->priv; + lp = netdev_priv(dev); spin_lock (&lp->lock); @@ -1395,7 +1395,7 @@ static irqreturn_t i596_interrupt(int ir static int i596_close(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); unsigned long flags; netif_stop_queue(dev); @@ -1429,7 +1429,7 @@ static int i596_close(struct net_device static struct net_device_stats * i596_get_stats(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); return &lp->stats; } @@ -1440,7 +1440,7 @@ static struct net_device_stats * static void set_multicast_list(struct net_device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = netdev_priv(dev); int config = 0, cnt; DEB(DEB_MULTI,printk("%s: set multicast list, %d entries, promisc %s, allmulti %s\n", dev->name, dev->mc_count, dev->flags & IFF_PROMISC ? "ON" : "OFF", dev->flags & IFF_ALLMULTI ? "ON" : "OFF")); @@ -1540,7 +1540,7 @@ lan_init_chip(struct parisc_device *dev) retval = register_netdev(netdevice); if (retval) { - struct i596_private *lp = netdevice->priv; + struct i596_private *lp = netdev_priv(netdevice); printk(KERN_WARNING __FILE__ ": register_netdevice ret'd %d\n", retval); dma_free_noncoherent(lp->dev, sizeof(struct i596_private), (void *)netdevice->mem_start, lp->dma_addr); @@ -1594,7 +1594,7 @@ static void __exit lasi_82596_exit(void) unregister_netdev(netdevice); - lp = (struct i596_private *) netdevice->priv; + lp = netdev_priv(netdevice); dma_free_noncoherent(lp->dev, sizeof(struct i596_private), (void *)netdevice->mem_start, lp->dma_addr); free_netdev(netdevice); _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:19:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:19:35 -0800 (PST) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24LJSKO018009 for ; Thu, 4 Mar 2004 13:19:29 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i24LJNE28969 for ; Thu, 4 Mar 2004 13:19:23 -0800 Date: Thu, 4 Mar 2004 13:18:31 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in net/ lance drivers Message-Id: <20040304131831.1a33fb96.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.9.4 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 3745 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 29833 Lines: 806 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/7990.c | 22 +++++----- linux-264-302-priv-rddunlap/drivers/net/a2065.c | 26 ++++++------ linux-264-302-priv-rddunlap/drivers/net/atari_pamsnet.c | 12 ++--- linux-264-302-priv-rddunlap/drivers/net/bagetlance.c | 20 ++++----- linux-264-302-priv-rddunlap/drivers/net/declance.c | 26 ++++++------ linux-264-302-priv-rddunlap/drivers/net/hplance.c | 10 ++-- linux-264-302-priv-rddunlap/drivers/net/sun3lance.c | 18 ++++---- linux-264-302-priv-rddunlap/drivers/net/sunlance.c | 34 ++++++++-------- 8 files changed, 84 insertions(+), 84 deletions(-) diff -puN drivers/net/7990.c~net_lance_casts drivers/net/7990.c --- linux-264-302-priv/drivers/net/7990.c~net_lance_casts 2004-03-03 12:20:02.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/7990.c 2004-03-03 12:28:46.000000000 -0800 @@ -99,7 +99,7 @@ static void load_csrs (struct lance_priv /* Set up the Lance Rx and Tx rings and the init block */ static void lance_init_ring (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile struct lance_init_block *aib; /* for LANCE_ADDR computations */ int leptr; @@ -216,7 +216,7 @@ static int init_restart_lance (struct la static int lance_reset (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); int status; DECLARE_LL; @@ -236,7 +236,7 @@ static int lance_reset (struct net_devic static int lance_rx (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile struct lance_rx_desc *rd; unsigned char bits; @@ -316,7 +316,7 @@ static int lance_rx (struct net_device * static int lance_tx (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile struct lance_tx_desc *td; int i, j; @@ -401,7 +401,7 @@ static irqreturn_t lance_interrupt (int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); int csr0; DECLARE_LL; @@ -457,7 +457,7 @@ lance_interrupt (int irq, void *dev_id, int lance_open (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); int res; DECLARE_LL; @@ -474,7 +474,7 @@ int lance_open (struct net_device *dev) int lance_close (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); DECLARE_LL; netif_stop_queue (dev); @@ -499,7 +499,7 @@ void lance_tx_timeout(struct net_device int lance_start_xmit (struct sk_buff *skb, struct net_device *dev) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; int entry, skblen, len; static int outs; @@ -556,7 +556,7 @@ int lance_start_xmit (struct sk_buff *sk struct net_device_stats *lance_get_stats (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); return &lp->stats; } @@ -564,7 +564,7 @@ struct net_device_stats *lance_get_stats /* taken from the depca driver via a2065.c */ static void lance_load_multicast (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile u16 *mcast_table = (u16 *)&ib->filter; struct dev_mc_list *dmi=dev->mc_list; @@ -601,7 +601,7 @@ static void lance_load_multicast (struct void lance_set_multicast (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; int stopped; DECLARE_LL; diff -puN drivers/net/a2065.c~net_lance_casts drivers/net/a2065.c --- linux-264-302-priv/drivers/net/a2065.c~net_lance_casts 2004-03-03 12:20:02.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/a2065.c 2004-03-03 12:27:50.000000000 -0800 @@ -164,7 +164,7 @@ static void load_csrs (struct lance_priv /* Setup the Lance Rx and Tx rings */ static void lance_init_ring (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile struct lance_init_block *aib; /* for LANCE_ADDR computations */ int leptr; @@ -265,7 +265,7 @@ static int init_restart_lance (struct la static int lance_rx (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile struct lance_regs *ll = lp->ll; volatile struct lance_rx_desc *rd; @@ -342,7 +342,7 @@ static int lance_rx (struct net_device * static int lance_tx (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile struct lance_regs *ll = lp->ll; volatile struct lance_tx_desc *td; @@ -433,7 +433,7 @@ lance_interrupt (int irq, void *dev_id, dev = (struct net_device *) dev_id; - lp = (struct lance_private *) dev->priv; + lp = netdev_priv(dev); ll = lp->ll; ll->rap = LE_CSR0; /* LANCE Controller Status */ @@ -481,7 +481,7 @@ struct net_device *last_dev = 0; static int lance_open (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_regs *ll = lp->ll; int ret; @@ -506,7 +506,7 @@ static int lance_open (struct net_device static int lance_close (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_regs *ll = lp->ll; netif_stop_queue(dev); @@ -522,7 +522,7 @@ static int lance_close (struct net_devic static inline int lance_reset (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_regs *ll = lp->ll; int status; @@ -545,7 +545,7 @@ static inline int lance_reset (struct ne static void lance_tx_timeout(struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_regs *ll = lp->ll; printk(KERN_ERR "%s: transmit timed out, status %04x, reset\n", @@ -556,7 +556,7 @@ static void lance_tx_timeout(struct net_ static int lance_start_xmit (struct sk_buff *skb, struct net_device *dev) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_regs *ll = lp->ll; volatile struct lance_init_block *ib = lp->init_block; int entry, skblen, len; @@ -624,7 +624,7 @@ static int lance_start_xmit (struct sk_b static struct net_device_stats *lance_get_stats (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); return &lp->stats; } @@ -632,7 +632,7 @@ static struct net_device_stats *lance_ge /* taken from the depca driver */ static void lance_load_multicast (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile u16 *mcast_table = (u16 *)&ib->filter; struct dev_mc_list *dmi=dev->mc_list; @@ -668,7 +668,7 @@ static void lance_load_multicast (struct static void lance_set_multicast (struct net_device *dev) { - struct lance_private *lp = (struct lance_private *) dev->priv; + struct lance_private *lp = netdev_priv(dev); volatile struct lance_init_block *ib = lp->init_block; volatile struct lance_regs *ll = lp->ll; @@ -748,7 +748,7 @@ static int __devinit a2065_init_one(stru } SET_MODULE_OWNER(dev); - priv = dev->priv; + priv = netdev_priv(dev); r1->name = dev->name; r2->name = dev->name; diff -puN drivers/net/atari_pamsnet.c~net_lance_casts drivers/net/atari_pamsnet.c --- linux-264-302-priv/drivers/net/atari_pamsnet.c~net_lance_casts 2004-03-03 12:20:02.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/atari_pamsnet.c 2004-03-03 12:25:05.000000000 -0800 @@ -667,7 +667,7 @@ struct net_device * __init pamsnet_probe */ static int pamsnet_open(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (pamsnet_debug > 0) printk("pamsnet_open\n"); @@ -696,7 +696,7 @@ pamsnet_open(struct net_device *dev) { static int pamsnet_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned long flags; /* Block a timer-based transmit from overlapping. This could better be @@ -742,7 +742,7 @@ pamsnet_send_packet(struct sk_buff *skb, */ static void pamsnet_poll_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int boguscount; int pkt_len; struct sk_buff *skb; @@ -817,7 +817,7 @@ pamsnet_poll_rx(struct net_device *dev) static void pamsnet_tick(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if( pamsnet_debug > 0 && (lp->open_time++ & 7) == 8 ) printk("pamsnet_tick: %ld\n", lp->open_time); @@ -832,7 +832,7 @@ pamsnet_tick(unsigned long data) { */ static int pamsnet_close(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (pamsnet_debug > 0) printk("pamsnet_close, open_time=%ld\n", lp->open_time); @@ -859,7 +859,7 @@ pamsnet_close(struct net_device *dev) { */ static struct net_device_stats *net_get_stats(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); return &lp->stats; } diff -puN drivers/net/bagetlance.c~net_lance_casts drivers/net/bagetlance.c --- linux-264-302-priv/drivers/net/bagetlance.c~net_lance_casts 2004-03-03 12:20:02.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/bagetlance.c 2004-03-03 12:30:25.000000000 -0800 @@ -594,7 +594,7 @@ static int __init lance_probe1( struct n return( 0 ); probe_ok: - lp = (struct lance_private *)dev->priv; + lp = netdev_priv(dev); MEM = (struct lance_memory *)memaddr; IO = lp->iobase = (struct lance_ioreg *)ioaddr; dev->base_addr = (unsigned long)ioaddr; /* informational only */ @@ -736,7 +736,7 @@ static int __init lance_probe1( struct n static int lance_open( struct net_device *dev ) -{ struct lance_private *lp = (struct lance_private *)dev->priv; +{ struct lance_private *lp = netdev_priv(dev); struct lance_ioreg *IO = lp->iobase; int i; @@ -778,7 +778,7 @@ static int lance_open( struct net_device static void lance_init_ring( struct net_device *dev ) -{ struct lance_private *lp = (struct lance_private *)dev->priv; +{ struct lance_private *lp = netdev_priv(dev); int i; unsigned offset; @@ -834,7 +834,7 @@ static void lance_init_ring( struct net_ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev ) -{ struct lance_private *lp = (struct lance_private *)dev->priv; +{ struct lance_private *lp = netdev_priv(dev); struct lance_ioreg *IO = lp->iobase; int entry, len; struct lance_tx_head *head; @@ -988,7 +988,7 @@ stati