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 @@ static irqreturn_t lance_interrupt( int return IRQ_NONE; } - lp = (struct lance_private *)dev->priv; + lp = netdev_priv(dev); IO = lp->iobase; AREG = CSR0; @@ -1101,7 +1101,7 @@ static irqreturn_t lance_interrupt( int static int lance_rx( struct net_device *dev ) -{ struct lance_private *lp = (struct lance_private *)dev->priv; +{ struct lance_private *lp = netdev_priv(dev); int entry = lp->cur_rx & RX_RING_MOD_MASK; int i; @@ -1225,7 +1225,7 @@ static int lance_rx( 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); struct lance_ioreg *IO = lp->iobase; dev->start = 0; @@ -1247,7 +1247,7 @@ static int lance_close( struct net_devic 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; } @@ -1261,7 +1261,7 @@ static struct net_device_stats *lance_ge static void set_multicast_list( 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; if (!dev->start) @@ -1303,7 +1303,7 @@ static void set_multicast_list( struct n static int lance_set_mac_address( struct net_device *dev, void *addr ) -{ struct lance_private *lp = (struct lance_private *)dev->priv; +{ struct lance_private *lp = netdev_priv(dev); struct sockaddr *saddr = addr; int i; diff -puN drivers/net/declance.c~net_lance_casts drivers/net/declance.c --- linux-264-302-priv/drivers/net/declance.c~net_lance_casts 2004-03-03 12:20:02.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/declance.c 2004-03-03 12:29:44.000000000 -0800 @@ -433,7 +433,7 @@ void cp_from_buf(const int type, void *t /* 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; int leptr; int i; @@ -530,7 +530,7 @@ static int init_restart_lance(struct lan 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; volatile struct lance_rx_desc *rd = 0; unsigned char bits; @@ -617,7 +617,7 @@ static int lance_rx(struct net_device *d static void 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; volatile struct lance_regs *ll = lp->ll; volatile struct lance_tx_desc *td; @@ -709,7 +709,7 @@ static irqreturn_t lance_interrupt(const 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); volatile struct lance_regs *ll = lp->ll; int csr0; @@ -757,7 +757,7 @@ struct net_device *last_dev = 0; static int lance_open(struct net_device *dev) { volatile struct lance_init_block *ib = (struct lance_init_block *) (dev->mem_start); - 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 = 0; @@ -822,7 +822,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); @@ -856,7 +856,7 @@ static int lance_close(struct net_device 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; @@ -873,7 +873,7 @@ static inline int lance_reset(struct net 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", @@ -884,7 +884,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 = (struct lance_init_block *) (dev->mem_start); int entry, skblen, len; @@ -936,7 +936,7 @@ static int lance_start_xmit(struct sk_bu 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; } @@ -982,7 +982,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; volatile struct lance_regs *ll = lp->ll; @@ -1048,7 +1048,7 @@ static int __init dec_lance_init(const i * alloc_etherdev ensures the data structures used by the LANCE * are aligned. */ - lp = (struct lance_private *) dev->priv; + lp = netdev_priv(dev); spin_lock_init(&lp->lock); lp->type = type; @@ -1287,7 +1287,7 @@ static void __exit dec_lance_cleanup(voi { while (root_lance_dev) { struct net_device *dev = root_lance_dev; - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); unregister_netdev(dev); #ifdef CONFIG_TC if (lp->slot >= 0) diff -puN drivers/net/hplance.c~net_lance_casts drivers/net/hplance.c --- linux-264-302-priv/drivers/net/hplance.c~net_lance_casts 2004-03-03 12:20:02.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/hplance.c 2004-03-03 12:24:34.000000000 -0800 @@ -63,7 +63,7 @@ static struct hplance_private *root_hpla static void cleanup_card(struct net_device *dev) { - struct hplance_private *lp = dev->priv; + struct hplance_private *lp = netdev_priv(dev); dio_unconfig_board(lp->scode); } @@ -97,7 +97,7 @@ struct net_device * __init hplance_probe dio_config_board(scode); hplance_init(dev, scode); if (!register_netdev(dev)) { - struct hplance_private *lp = dev->priv; + struct hplance_private *lp = netdev_priv(dev); lp->next_module = root_hplance_dev; root_hplance_dev = lp; return dev; @@ -141,7 +141,7 @@ static void __init hplance_init(struct n printk("%c%2.2x", i == 0 ? ' ' : ':', dev->dev_addr[i]); } - lp = (struct hplance_private *)dev->priv; + lp = netdev_priv(dev); lp->lance.name = (char*)name; /* discards const, shut up gcc */ lp->lance.ll = (struct lance_regs *)(va + HPLANCE_REGOFF); lp->lance.init_block = (struct lance_init_block *)(va + HPLANCE_MEMOFF); /* CPU addr */ @@ -195,7 +195,7 @@ static unsigned short hplance_readrdp(vo static int hplance_open(struct net_device *dev) { int status; - struct hplance_private *lp = (struct hplance_private *)dev->priv; + struct hplance_private *lp = netdev_priv(dev); struct hplance_reg *hpregs = (struct hplance_reg *)lp->base; status = lance_open(dev); /* call generic lance open code */ @@ -209,7 +209,7 @@ static int hplance_open(struct net_devic static int hplance_close(struct net_device *dev) { - struct hplance_private *lp = (struct hplance_private *)dev->priv; + struct hplance_private *lp = netdev_priv(dev); struct hplance_reg *hpregs = (struct hplance_reg *)lp->base; out_8(&(hpregs->status), 8); /* disable interrupts at boardlevel */ lance_close(dev); diff -puN drivers/net/sun3lance.c~net_lance_casts drivers/net/sun3lance.c --- linux-264-302-priv/drivers/net/sun3lance.c~net_lance_casts 2004-03-03 12:20:02.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/sun3lance.c 2004-03-03 12:31:02.000000000 -0800 @@ -332,7 +332,7 @@ static int __init lance_probe( struct ne return 0; } - lp = (struct lance_private *)dev->priv; + lp = netdev_priv(dev); /* XXX - leak? */ MEM = dvma_malloc_align(sizeof(struct lance_memory), 0x10000); @@ -402,7 +402,7 @@ static int __init lance_probe( struct ne static int lance_open( struct net_device *dev ) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); int i; DPRINTK( 2, ( "%s: lance_open()\n", dev->name )); @@ -439,7 +439,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; lp->lock = 0; @@ -499,7 +499,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); int entry, len; struct lance_tx_head *head; unsigned long flags; @@ -646,7 +646,7 @@ static int lance_start_xmit( struct sk_b static irqreturn_t lance_interrupt( int irq, void *dev_id, struct pt_regs *fp) { struct net_device *dev = dev_id; - struct lance_private *lp = dev->priv; + struct lance_private *lp = netdev_priv(dev); int csr0; static int in_interrupt; @@ -772,7 +772,7 @@ static irqreturn_t lance_interrupt( int /* get packet, toss into skbuff */ static int lance_rx( struct net_device *dev ) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); int entry = lp->new_rx; /* If we own the next entry, it's a new packet. Send it up. */ @@ -870,7 +870,7 @@ static int lance_rx( 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); netif_stop_queue(dev); @@ -888,7 +888,7 @@ static int lance_close( struct net_devic 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; } @@ -904,7 +904,7 @@ static struct net_device_stats *lance_ge /* completely untested on a sun3 */ static void set_multicast_list( struct net_device *dev ) { - struct lance_private *lp = (struct lance_private *)dev->priv; + struct lance_private *lp = netdev_priv(dev); if(netif_queue_stopped(dev)) /* Only possible if board is already started */ diff -puN drivers/net/sunlance.c~net_lance_casts drivers/net/sunlance.c --- linux-264-302-priv/drivers/net/sunlance.c~net_lance_casts 2004-03-03 12:20:02.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/sunlance.c 2004-03-03 12:26:43.000000000 -0800 @@ -313,7 +313,7 @@ static void load_csrs(struct lance_priva /* Setup the Lance Rx and Tx rings */ static void lance_init_ring_dvma(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; dma_addr_t aib = lp->init_block_dvma; __u32 leptr; @@ -370,7 +370,7 @@ static void lance_init_ring_dvma(struct static void lance_init_ring_pio(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; u32 leptr; int i; @@ -500,7 +500,7 @@ static int init_restart_lance(struct lan static void lance_rx_dvma(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; u8 bits; @@ -563,7 +563,7 @@ static void lance_rx_dvma(struct net_dev static void lance_tx_dvma(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 i, j; @@ -673,7 +673,7 @@ static void lance_piocopy_to_skb(struct static void lance_rx_pio(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; @@ -735,7 +735,7 @@ static void lance_rx_pio(struct net_devi static void lance_tx_pio(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 i, j; @@ -816,7 +816,7 @@ out: 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; sbus_writew(LE_CSR0, lp->lregs + RAP); @@ -915,7 +915,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_init_block *ib = lp->init_block; int status = 0; @@ -968,7 +968,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); netif_stop_queue(dev); del_timer_sync(&lp->multicast_timer); @@ -981,7 +981,7 @@ static int lance_close(struct net_device 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; STOP_LANCE(lp); @@ -1102,7 +1102,7 @@ static void lance_piozero(volatile void 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); printk(KERN_ERR "%s: transmit timed out, status %04x, reset\n", dev->name, sbus_readw(lp->lregs + RDP)); @@ -1112,7 +1112,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_init_block *ib = lp->init_block; int entry, skblen, len; @@ -1165,7 +1165,7 @@ static int lance_start_xmit(struct sk_bu 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; } @@ -1173,7 +1173,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; @@ -1223,7 +1223,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; u16 mode; @@ -1291,7 +1291,7 @@ static void lance_free_hwresources(struc /* Ethtool support... */ static void sparc_lance_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct lance_private *lp = dev->priv; + struct lance_private *lp = netdev_priv(dev); strcpy(info->driver, "sunlance"); strcpy(info->version, "2.02"); @@ -1325,7 +1325,7 @@ static int __init sparc_lance_init(struc if (!dev) return -ENOMEM; - lp = dev->priv; + lp = netdev_priv(dev); if (sparc_lance_debug && version_printed++ == 0) printk (KERN_INFO "%s", version); _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:19:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:19:47 -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 i24LJfKO018203 for ; Thu, 4 Mar 2004 13:19: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 i24LJaE28994 for ; Thu, 4 Mar 2004 13:19:36 -0800 Date: Thu, 4 Mar 2004 13:18:43 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in net/pcmcia/ drivers Message-Id: <20040304131843.5126ab7f.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: 3746 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: 24146 Lines: 673 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/pcmcia/3c574_cs.c | 28 +++--- linux-264-302-priv-rddunlap/drivers/net/pcmcia/3c589_cs.c | 26 ++--- linux-264-302-priv-rddunlap/drivers/net/pcmcia/com20020_cs.c | 6 - linux-264-302-priv-rddunlap/drivers/net/pcmcia/fmvj18x_cs.c | 22 ++-- linux-264-302-priv-rddunlap/drivers/net/pcmcia/ibmtr_cs.c | 8 - linux-264-302-priv-rddunlap/drivers/net/pcmcia/smc91c92_cs.c | 50 +++++------ 6 files changed, 70 insertions(+), 70 deletions(-) diff -puN drivers/net/pcmcia/3c574_cs.c~net_pcmcia_casts drivers/net/pcmcia/3c574_cs.c --- linux-264-302-priv/drivers/net/pcmcia/3c574_cs.c~net_pcmcia_casts 2004-03-02 15:57:38.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/pcmcia/3c574_cs.c 2004-03-02 16:02:45.000000000 -0800 @@ -283,7 +283,7 @@ static dev_link_t *tc574_attach(void) dev = alloc_etherdev(sizeof(struct el3_private)); if (!dev) return NULL; - lp = dev->priv; + lp = netdev_priv(dev); link = &lp->link; link->priv = dev; @@ -388,7 +388,7 @@ static void tc574_config(dev_link_t *lin { client_handle_t handle = link->handle; struct net_device *dev = link->priv; - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); tuple_t tuple; cisparse_t parse; unsigned short buf[32]; @@ -733,7 +733,7 @@ static void mdio_write(ioaddr_t ioaddr, /* Reset and restore all of the 3c574 registers. */ static void tc574_reset(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); int i, ioaddr = dev->base_addr; unsigned long flags; @@ -814,7 +814,7 @@ static void tc574_reset(struct net_devic static int el3_open(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); dev_link_t *link = &lp->link; if (!DEV_OK(link)) @@ -837,7 +837,7 @@ static int el3_open(struct net_device *d static void el3_tx_timeout(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name); @@ -852,7 +852,7 @@ static void el3_tx_timeout(struct net_de static void pop_tx_status(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; int i; @@ -877,7 +877,7 @@ static void pop_tx_status(struct net_dev static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev) { ioaddr_t ioaddr = dev->base_addr; - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); unsigned long flags; DEBUG(3, "%s: el3_start_xmit(length = %ld) called, " @@ -909,7 +909,7 @@ static int el3_start_xmit(struct sk_buff static irqreturn_t el3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr, status; int work_budget = max_interrupt_work; int handled = 0; @@ -1002,7 +1002,7 @@ static irqreturn_t el3_interrupt(int irq static void media_check(unsigned long arg) { struct net_device *dev = (struct net_device *) arg; - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; unsigned long flags; unsigned short /* cable, */ media, partner; @@ -1074,7 +1074,7 @@ reschedule: static struct net_device_stats *el3_get_stats(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); if (netif_device_present(dev)) { unsigned long flags; @@ -1091,7 +1091,7 @@ static struct net_device_stats *el3_get_ */ static void update_stats(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; u8 rx, tx, up; @@ -1128,7 +1128,7 @@ static void update_stats(struct net_devi static int el3_rx(struct net_device *dev, int worklimit) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; short rx_status; @@ -1190,7 +1190,7 @@ static struct ethtool_ops netdev_ethtool /* Provide ioctl() calls to examine the MII xcvr state. */ static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; u16 *data = (u16 *)&rq->ifr_data; int phy = lp->phys & 0x1f; @@ -1259,7 +1259,7 @@ static void set_rx_mode(struct net_devic static int el3_close(struct net_device *dev) { ioaddr_t ioaddr = dev->base_addr; - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); dev_link_t *link = &lp->link; DEBUG(2, "%s: shutting down ethercard.\n", dev->name); diff -puN drivers/net/pcmcia/3c589_cs.c~net_pcmcia_casts drivers/net/pcmcia/3c589_cs.c --- linux-264-302-priv/drivers/net/pcmcia/3c589_cs.c~net_pcmcia_casts 2004-03-02 15:57:38.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/pcmcia/3c589_cs.c 2004-03-02 16:03:51.000000000 -0800 @@ -196,7 +196,7 @@ static dev_link_t *tc589_attach(void) dev = alloc_etherdev(sizeof(struct el3_private)); if (!dev) return NULL; - lp = dev->priv; + lp = netdev_priv(dev); link = &lp->link; link->priv = dev; @@ -304,7 +304,7 @@ static void tc589_config(dev_link_t *lin { client_handle_t handle = link->handle; struct net_device *dev = link->priv; - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); tuple_t tuple; cisparse_t parse; u16 buf[32], *phys_addr; @@ -526,7 +526,7 @@ static u16 read_eeprom(ioaddr_t ioaddr, */ static void tc589_set_xcvr(struct net_device *dev, int if_port) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; EL3WINDOW(0); @@ -648,7 +648,7 @@ static int el3_config(struct net_device static int el3_open(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); dev_link_t *link = &lp->link; if (!DEV_OK(link)) @@ -672,7 +672,7 @@ static int el3_open(struct net_device *d static void el3_tx_timeout(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; printk(KERN_WARNING "%s: Transmit timed out!\n", dev->name); @@ -687,7 +687,7 @@ static void el3_tx_timeout(struct net_de static void pop_tx_status(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; int i; @@ -741,7 +741,7 @@ static int el3_start_xmit(struct sk_buff static irqreturn_t el3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr, status; int i = 0, handled = 1; @@ -826,7 +826,7 @@ static irqreturn_t el3_interrupt(int irq static void media_check(unsigned long arg) { struct net_device *dev = (struct net_device *)(arg); - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; u16 media, errs; unsigned long flags; @@ -906,7 +906,7 @@ reschedule: static struct net_device_stats *el3_get_stats(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); unsigned long flags; dev_link_t *link = &lp->link; @@ -928,7 +928,7 @@ static struct net_device_stats *el3_get_ */ static void update_stats(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; DEBUG(2, "%s: updating the statistics.\n", dev->name); @@ -955,7 +955,7 @@ static void update_stats(struct net_devi static int el3_rx(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; int worklimit = 32; short rx_status; @@ -1009,7 +1009,7 @@ static int el3_rx(struct net_device *dev static void set_multicast_list(struct net_device *dev) { - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); dev_link_t *link = &lp->link; ioaddr_t ioaddr = dev->base_addr; u16 opts = SetRxFilter | RxStation | RxBroadcast; @@ -1024,7 +1024,7 @@ static void set_multicast_list(struct ne static int el3_close(struct net_device *dev) { - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); dev_link_t *link = &lp->link; ioaddr_t ioaddr = dev->base_addr; diff -puN drivers/net/pcmcia/com20020_cs.c~net_pcmcia_casts drivers/net/pcmcia/com20020_cs.c --- linux-264-302-priv/drivers/net/pcmcia/com20020_cs.c~net_pcmcia_casts 2004-03-02 15:57:38.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/pcmcia/com20020_cs.c 2004-03-02 16:04:30.000000000 -0800 @@ -179,7 +179,7 @@ static dev_link_t *com20020_attach(void) memset(info, 0, sizeof(struct com20020_dev_t)); memset(link, 0, sizeof(struct dev_link_t)); - lp = dev->priv; + lp = netdev_priv(dev); lp->timeout = timeout; lp->backplane = backplane; lp->clockp = clockp; @@ -394,7 +394,7 @@ static void com20020_config(dev_link_t * goto failed; } - lp = dev->priv; + lp = netdev_priv(dev); lp->card_name = "PCMCIA COM20020"; lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */ @@ -492,7 +492,7 @@ static int com20020_event(event_t event, pcmcia_request_configuration(link->handle, &link->conf); if (link->open) { int ioaddr = dev->base_addr; - struct arcnet_local *lp = (struct arcnet_local *)dev->priv; + struct arcnet_local *lp = netdev_priv(dev); ARCRESET; } } diff -puN drivers/net/pcmcia/fmvj18x_cs.c~net_pcmcia_casts drivers/net/pcmcia/fmvj18x_cs.c --- linux-264-302-priv/drivers/net/pcmcia/fmvj18x_cs.c~net_pcmcia_casts 2004-03-02 15:57:38.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/pcmcia/fmvj18x_cs.c 2004-03-02 16:05:23.000000000 -0800 @@ -256,7 +256,7 @@ static dev_link_t *fmvj18x_attach(void) dev = alloc_etherdev(sizeof(local_info_t)); if (!dev) return NULL; - lp = dev->priv; + lp = netdev_priv(dev); link = &lp->link; link->priv = dev; @@ -394,7 +394,7 @@ static void fmvj18x_config(dev_link_t *l { client_handle_t handle = link->handle; struct net_device *dev = link->priv; - local_info_t *lp = dev->priv; + local_info_t *lp = netdev_priv(dev); tuple_t tuple; cisparse_t parse; u_short buf[32]; @@ -803,7 +803,7 @@ module_exit(exit_fmvj18x_cs); static irqreturn_t fjn_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; - local_info_t *lp = dev->priv; + local_info_t *lp = netdev_priv(dev); ioaddr_t ioaddr; unsigned short tx_stat, rx_stat; @@ -862,7 +862,7 @@ static irqreturn_t fjn_interrupt(int irq static void fjn_tx_timeout(struct net_device *dev) { - struct local_info_t *lp = (struct local_info_t *)dev->priv; + struct local_info_t *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; printk(KERN_NOTICE "%s: transmit timed out with status %04x, %s?\n", @@ -892,7 +892,7 @@ static void fjn_tx_timeout(struct net_de static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct local_info_t *lp = (struct local_info_t *)dev->priv; + struct local_info_t *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; short length = skb->len; @@ -966,7 +966,7 @@ static int fjn_start_xmit(struct sk_buff static void fjn_reset(struct net_device *dev) { - struct local_info_t *lp = (struct local_info_t *)dev->priv; + struct local_info_t *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; int i; @@ -1052,7 +1052,7 @@ static void fjn_reset(struct net_device static void fjn_rx(struct net_device *dev) { - struct local_info_t *lp = (struct local_info_t *)dev->priv; + struct local_info_t *lp = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; int boguscount = 10; /* 5 -> 10: by agy 19940922 */ @@ -1181,7 +1181,7 @@ static int fjn_config(struct net_device static int fjn_open(struct net_device *dev) { - struct local_info_t *lp = (struct local_info_t *)dev->priv; + struct local_info_t *lp = netdev_priv(dev); dev_link_t *link = &lp->link; DEBUG(4, "fjn_open('%s').\n", dev->name); @@ -1206,7 +1206,7 @@ static int fjn_open(struct net_device *d static int fjn_close(struct net_device *dev) { - struct local_info_t *lp = (struct local_info_t *)dev->priv; + struct local_info_t *lp = netdev_priv(dev); dev_link_t *link = &lp->link; ioaddr_t ioaddr = dev->base_addr; @@ -1239,7 +1239,7 @@ static int fjn_close(struct net_device * static struct net_device_stats *fjn_get_stats(struct net_device *dev) { - local_info_t *lp = (local_info_t *)dev->priv; + local_info_t *lp = netdev_priv(dev); return &lp->stats; } /* fjn_get_stats */ @@ -1252,7 +1252,7 @@ static struct net_device_stats *fjn_get_ static void set_rx_mode(struct net_device *dev) { ioaddr_t ioaddr = dev->base_addr; - struct local_info_t *lp = (struct local_info_t *)dev->priv; + struct local_info_t *lp = netdev_priv(dev); u_char mc_filter[8]; /* Multicast hash filter */ u_long flags; int i; diff -puN drivers/net/pcmcia/ibmtr_cs.c~net_pcmcia_casts drivers/net/pcmcia/ibmtr_cs.c --- linux-264-302-priv/drivers/net/pcmcia/ibmtr_cs.c~net_pcmcia_casts 2004-03-02 15:57:38.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/pcmcia/ibmtr_cs.c 2004-03-02 16:06:03.000000000 -0800 @@ -178,7 +178,7 @@ static dev_link_t *ibmtr_attach(void) link = &info->link; link->priv = info; - info->ti = dev->priv; + info->ti = netdev_priv(dev); link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; link->io.NumPorts1 = 4; @@ -256,7 +256,7 @@ static void ibmtr_detach(dev_link_t *lin unregister_netdev(dev); { - struct tok_info *ti = (struct tok_info *)dev->priv; + struct tok_info *ti = netdev_priv(dev); del_timer_sync(&(ti->tr_timer)); } if (link->state & DEV_CONFIG) @@ -287,7 +287,7 @@ static void ibmtr_config(dev_link_t *lin client_handle_t handle = link->handle; ibmtr_dev_t *info = link->priv; struct net_device *dev = info->dev; - struct tok_info *ti = dev->priv; + struct tok_info *ti = netdev_priv(dev); tuple_t tuple; cisparse_t parse; win_req_t req; @@ -412,7 +412,7 @@ static void ibmtr_release(dev_link_t *li pcmcia_release_io(link->handle, &link->io); pcmcia_release_irq(link->handle, &link->irq); if (link->win) { - struct tok_info *ti = dev->priv; + struct tok_info *ti = netdev_priv(dev); iounmap((void *)ti->mmio); pcmcia_release_window(link->win); pcmcia_release_window(info->sram_win_handle); diff -puN drivers/net/pcmcia/smc91c92_cs.c~net_pcmcia_casts drivers/net/pcmcia/smc91c92_cs.c --- linux-264-302-priv/drivers/net/pcmcia/smc91c92_cs.c~net_pcmcia_casts 2004-03-02 15:57:38.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/pcmcia/smc91c92_cs.c 2004-03-02 16:07:05.000000000 -0800 @@ -327,7 +327,7 @@ static dev_link_t *smc91c92_attach(void) dev = alloc_etherdev(sizeof(struct smc_private)); if (!dev) return NULL; - smc = dev->priv; + smc = netdev_priv(dev); link = &smc->link; link->priv = dev; @@ -483,7 +483,7 @@ static int next_tuple(client_handle_t ha static int mhz_3288_power(dev_link_t *link) { struct net_device *dev = link->priv; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); u_char tmp; /* Read the ISR twice... */ @@ -505,7 +505,7 @@ static int mhz_3288_power(dev_link_t *li static int mhz_mfc_config(dev_link_t *link) { struct net_device *dev = link->priv; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); tuple_t tuple; cisparse_t parse; u_char buf[255]; @@ -618,7 +618,7 @@ static int mhz_setup(dev_link_t *link) static void mot_config(dev_link_t *link) { struct net_device *dev = link->priv; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; ioaddr_t iouart = link->io.BasePort2; @@ -894,7 +894,7 @@ static void smc91c92_config(dev_link_t * { client_handle_t handle = link->handle; struct net_device *dev = link->priv; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); tuple_t tuple; cisparse_t parse; u_short buf[32]; @@ -1069,7 +1069,7 @@ static void smc91c92_release(dev_link_t pcmcia_release_irq(link->handle, &link->irq); if (link->win) { struct net_device *dev = link->priv; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); iounmap(smc->base); pcmcia_release_window(link->win); } @@ -1091,7 +1091,7 @@ static int smc91c92_event(event_t event, { dev_link_t *link = args->client_data; struct net_device *dev = link->priv; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); int i; DEBUG(1, "smc91c92_event(0x%06x)\n", event); @@ -1240,7 +1240,7 @@ static void smc_dump(struct net_device * static int smc_open(struct net_device *dev) { - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); dev_link_t *link = &smc->link; #ifdef PCMCIA_DEBUG @@ -1277,7 +1277,7 @@ static int smc_open(struct net_device *d static int smc_close(struct net_device *dev) { - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); dev_link_t *link = &smc->link; ioaddr_t ioaddr = dev->base_addr; @@ -1314,7 +1314,7 @@ static int smc_close(struct net_device * static void smc_hardware_send_packet(struct net_device * dev) { - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); struct sk_buff *skb = smc->saved_skb; ioaddr_t ioaddr = dev->base_addr; u_char packet_no; @@ -1379,7 +1379,7 @@ static void smc_hardware_send_packet(str static void smc_tx_timeout(struct net_device *dev) { - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; printk(KERN_NOTICE "%s: SMC91c92 transmit timed out, " @@ -1394,7 +1394,7 @@ static void smc_tx_timeout(struct net_de static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; u_short num_pages; short time_out, ir; @@ -1460,7 +1460,7 @@ static int smc_start_xmit(struct sk_buff static void smc_tx_err(struct net_device * dev) { - struct smc_private *smc = (struct smc_private *)dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; int saved_packet = inw(ioaddr + PNR_ARR) & 0xff; int packet_no = inw(ioaddr + FIFO_PORTS) & 0x7f; @@ -1504,7 +1504,7 @@ static void smc_tx_err(struct net_device static void smc_eph_irq(struct net_device *dev) { - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; u_short card_stats, ephs; @@ -1539,7 +1539,7 @@ static void smc_eph_irq(struct net_devic static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr; u_short saved_bank, saved_pointer, mask, status; unsigned int handled = 1; @@ -1657,7 +1657,7 @@ irq_done: static void smc_rx(struct net_device *dev) { - struct smc_private *smc = (struct smc_private *)dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; int rx_status; int packet_length; /* Caution: not frame length, rather words @@ -1725,7 +1725,7 @@ static void smc_rx(struct net_device *de static struct net_device_stats *smc_get_stats(struct net_device *dev) { - struct smc_private *smc = (struct smc_private *)dev->priv; + struct smc_private *smc = netdev_priv(dev); /* Nothing to update - the 91c92 is a pretty primative chip. */ return &smc->stats; } @@ -1765,7 +1765,7 @@ static void fill_multicast_tbl(int count static void set_rx_mode(struct net_device *dev) { ioaddr_t ioaddr = dev->base_addr; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); u_int multicast_table[ 2 ] = { 0, }; unsigned long flags; u_short rx_cfg_setting; @@ -1804,7 +1804,7 @@ static void set_rx_mode(struct net_devic static int s9k_config(struct net_device *dev, struct ifmap *map) { - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { if (smc->cfg & CFG_MII_SELECT) return -EOPNOTSUPP; @@ -1830,7 +1830,7 @@ static int s9k_config(struct net_device */ static void smc_set_xcvr(struct net_device *dev, int if_port) { - struct smc_private *smc = (struct smc_private *)dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; u_short saved_bank; @@ -1855,7 +1855,7 @@ static void smc_set_xcvr(struct net_devi static void smc_reset(struct net_device *dev) { ioaddr_t ioaddr = dev->base_addr; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); int i; DEBUG(0, "%s: smc91c92 reset called.\n", dev->name); @@ -1930,7 +1930,7 @@ static void smc_reset(struct net_device static void media_check(u_long arg) { struct net_device *dev = (struct net_device *) arg; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); ioaddr_t ioaddr = dev->base_addr; u_short i, media, saved_bank; u_short link; @@ -2044,7 +2044,7 @@ reschedule: static int smc_link_ok(struct net_device *dev) { ioaddr_t ioaddr = dev->base_addr; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); if (smc->cfg & CFG_MII_SELECT) { return mii_link_ok(&smc->mii_if); @@ -2109,7 +2109,7 @@ static int smc_netdev_set_ecmd(struct ne static int smc_ethtool_ioctl (struct net_device *dev, void *useraddr) { u32 ethcmd; - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); if (get_user(ethcmd, (u32 *)useraddr)) return -EFAULT; @@ -2202,7 +2202,7 @@ static int smc_ethtool_ioctl (struct net static int smc_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) { - struct smc_private *smc = dev->priv; + struct smc_private *smc = netdev_priv(dev); struct mii_ioctl_data *mii; int rc = 0; u_short saved_bank; _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:19:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:20:08 -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 i24LJuKO018440 for ; Thu, 4 Mar 2004 13:19:58 -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 i24LJoE29052 for ; Thu, 4 Mar 2004 13:19:50 -0800 Date: Thu, 4 Mar 2004 13:18:58 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in 3com net drivers Message-Id: <20040304131858.14057195.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: 3747 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: 24213 Lines: 741 | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/3c501.c | 16 +++---- linux-264-302-priv-rddunlap/drivers/net/3c507.c | 18 ++++---- linux-264-302-priv-rddunlap/drivers/net/3c509.c | 34 ++++++++-------- linux-264-302-priv-rddunlap/drivers/net/3c527.c | 38 +++++++++--------- linux-264-302-priv-rddunlap/drivers/net/3c59x.c | 50 ++++++++++++------------ 5 files changed, 78 insertions(+), 78 deletions(-) diff -puN drivers/net/3c501.c~net_3cxyz_casts drivers/net/3c501.c --- linux-264-302-priv/drivers/net/3c501.c~net_3cxyz_casts 2004-03-03 11:10:48.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/3c501.c 2004-03-03 11:12:56.000000000 -0800 @@ -306,7 +306,7 @@ static int __init el1_probe1(struct net_ printk(KERN_DEBUG "%s", version); memset(dev->priv, 0, sizeof(struct net_local)); - lp=dev->priv; + lp = netdev_priv(dev); spin_lock_init(&lp->lock); /* @@ -341,7 +341,7 @@ static int el_open(struct net_device *de { int retval; int ioaddr = dev->base_addr; - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned long flags; if (el_debug > 2) @@ -371,7 +371,7 @@ static int el_open(struct net_device *de static void el_timeout(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; if (el_debug) @@ -411,7 +411,7 @@ static void el_timeout(struct net_device static int el_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); int ioaddr = dev->base_addr; unsigned long flags; @@ -524,7 +524,7 @@ static irqreturn_t el_interrupt(int irq, int axsr; /* Aux. status reg. */ ioaddr = dev->base_addr; - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); spin_lock(&lp->lock); @@ -698,7 +698,7 @@ out: static void el_receive(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 pkt_len; struct sk_buff *skb; @@ -764,7 +764,7 @@ static void el_receive(struct net_device static void el_reset(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; if (el_debug> 2) @@ -828,7 +828,7 @@ static int el1_close(struct net_device * static struct net_device_stats *el1_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/3c507.c~net_3cxyz_casts drivers/net/3c507.c --- linux-264-302-priv/drivers/net/3c507.c~net_3cxyz_casts 2004-03-03 11:10:48.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/3c507.c 2004-03-03 11:16:05.000000000 -0800 @@ -441,7 +441,7 @@ static int __init el16_probe1(struct net if (net_debug) printk(version); - lp = dev->priv; + lp = netdev_priv(dev); memset(lp, 0, sizeof(*lp)); spin_lock_init(&lp->lock); @@ -471,7 +471,7 @@ static int el16_open(struct net_device * static void el16_tx_timeout (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; unsigned long shmem = dev->mem_start; @@ -501,7 +501,7 @@ static void el16_tx_timeout (struct net_ static int el16_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); int ioaddr = dev->base_addr; unsigned long flags; short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; @@ -546,7 +546,7 @@ static irqreturn_t el16_interrupt(int ir } ioaddr = dev->base_addr; - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); shmem = dev->mem_start; spin_lock(&lp->lock); @@ -660,7 +660,7 @@ static int el16_close(struct net_device closed. */ static struct net_device_stats *el16_get_stats(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); /* ToDo: decide if there are any useful statistics from the SCB. */ @@ -670,7 +670,7 @@ static struct net_device_stats *el16_get /* Initialize the Rx-block list. */ static void init_rx_bufs(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned long write_ptr; unsigned short SCB_base = SCB_BASE; @@ -713,7 +713,7 @@ static void init_rx_bufs(struct net_devi static void init_82586_mem(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; unsigned long shmem = dev->mem_start; @@ -771,7 +771,7 @@ static void init_82586_mem(struct net_de static void hardware_send_packet(struct net_device *dev, void *buf, short length, short pad) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); short ioaddr = dev->base_addr; ushort tx_block = lp->tx_head; unsigned long write_ptr = dev->mem_start + tx_block; @@ -820,7 +820,7 @@ static void hardware_send_packet(struct static void el16_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned long shmem = dev->mem_start; ushort rx_head = lp->rx_head; ushort rx_tail = lp->rx_tail; diff -puN drivers/net/3c509.c~net_3cxyz_casts drivers/net/3c509.c --- linux-264-302-priv/drivers/net/3c509.c~net_3cxyz_casts 2004-03-03 11:10:48.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/3c509.c 2004-03-03 11:19:54.000000000 -0800 @@ -304,7 +304,7 @@ static int nopnp; static int __init el3_common_init(struct net_device *dev) { - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); short i; int err; @@ -355,7 +355,7 @@ static int __init el3_common_init(struct static void el3_common_remove (struct net_device *dev) { - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); (void) lp; /* Keep gcc quiet... */ #ifdef CONFIG_PM @@ -575,7 +575,7 @@ no_pnp: dev->base_addr = ioaddr; dev->irq = irq; dev->if_port = if_port; - lp = dev->priv; + lp = netdev_priv(dev); #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800) lp->dev = &idev->dev; #endif @@ -671,7 +671,7 @@ static int __init el3_mca_probe(struct d dev->base_addr = ioaddr; dev->irq = irq; dev->if_port = if_port; - lp = dev->priv; + lp = netdev_priv(dev); lp->dev = device; lp->type = EL3_MCA; device->driver_data = dev; @@ -732,7 +732,7 @@ static int __init el3_eisa_probe (struct dev->base_addr = ioaddr; dev->irq = irq; dev->if_port = if_port; - lp = dev->priv; + lp = netdev_priv(dev); lp->dev = device; lp->type = EL3_EISA; eisa_set_drvdata (edev, dev); @@ -829,7 +829,7 @@ el3_open(struct net_device *dev) static void el3_tx_timeout (struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); int ioaddr = dev->base_addr; /* Transmitter timeout, serious problems. */ @@ -849,7 +849,7 @@ el3_tx_timeout (struct net_device *dev) static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); int ioaddr = dev->base_addr; unsigned long flags; @@ -943,7 +943,7 @@ el3_interrupt(int irq, void *dev_id, str return IRQ_NONE; } - lp = (struct el3_private *)dev->priv; + lp = netdev_priv(dev); spin_lock(&lp->lock); ioaddr = dev->base_addr; @@ -975,7 +975,7 @@ el3_interrupt(int irq, void *dev_id, str outw(AckIntr | RxEarly, ioaddr + EL3_CMD); } if (status & TxComplete) { /* Really Tx error. */ - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); short tx_status; int i = 4; @@ -1022,7 +1022,7 @@ el3_interrupt(int irq, void *dev_id, str static struct net_device_stats * el3_get_stats(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); unsigned long flags; /* @@ -1043,7 +1043,7 @@ el3_get_stats(struct net_device *dev) */ static void update_stats(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); int ioaddr = dev->base_addr; if (el3_debug > 5) @@ -1073,7 +1073,7 @@ static void update_stats(struct net_devi static int el3_rx(struct net_device *dev) { - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); int ioaddr = dev->base_addr; short rx_status; @@ -1145,7 +1145,7 @@ static void set_multicast_list(struct net_device *dev) { unsigned long flags; - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); int ioaddr = dev->base_addr; if (el3_debug > 1) { @@ -1172,7 +1172,7 @@ static int el3_close(struct net_device *dev) { int ioaddr = dev->base_addr; - struct el3_private *lp = (struct el3_private *)dev->priv; + struct el3_private *lp = netdev_priv(dev); if (el3_debug > 2) printk("%s: Shutting down ethercard.\n", dev->name); @@ -1317,7 +1317,7 @@ static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) { u32 ethcmd; - struct el3_private *lp = dev->priv; + struct el3_private *lp = netdev_priv(dev); /* dev_ioctl() in ../../net/core/dev.c has already checked capable(CAP_NET_ADMIN), so don't bother with that here. */ @@ -1558,7 +1558,7 @@ el3_suspend(struct pm_dev *pdev) return -EINVAL; dev = (struct net_device *)pdev->data; - lp = (struct el3_private *)dev->priv; + lp = netdev_priv(dev); ioaddr = dev->base_addr; spin_lock_irqsave(&lp->lock, flags); @@ -1585,7 +1585,7 @@ el3_resume(struct pm_dev *pdev) return -EINVAL; dev = (struct net_device *)pdev->data; - lp = (struct el3_private *)dev->priv; + lp = netdev_priv(dev); ioaddr = dev->base_addr; spin_lock_irqsave(&lp->lock, flags); diff -puN drivers/net/3c527.c~net_3cxyz_casts drivers/net/3c527.c --- linux-264-302-priv/drivers/net/3c527.c~net_3cxyz_casts 2004-03-03 11:10:48.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/3c527.c 2004-03-03 11:37:11.000000000 -0800 @@ -226,7 +226,7 @@ static struct ethtool_ops netdev_ethtool static void cleanup_card(struct net_device *dev) { - struct mc32_local *lp=dev->priv; + struct mc32_local *lp = netdev_priv(dev); unsigned slot = lp->slot; mca_mark_as_unused(slot); mca_set_adapter_name(slot, NULL); @@ -307,7 +307,7 @@ static int __init mc32_probe1(struct net int i, err; u8 POS; u32 base; - struct mc32_local *lp = dev->priv; + struct mc32_local *lp = netdev_priv(dev); static u16 mca_io_bases[]={ 0x7280,0x7290, 0x7680,0x7690, @@ -573,7 +573,7 @@ static inline void mc32_ready_poll(struc static int mc32_command_nowait(struct net_device *dev, u16 cmd, void *data, int len) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int ret = -1; @@ -619,7 +619,7 @@ static int mc32_command_nowait(struct ne static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int ret = 0; @@ -671,7 +671,7 @@ static int mc32_command(struct net_devic static void mc32_start_transceiver(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; /* Ignore RX overflow on device closure */ @@ -706,7 +706,7 @@ static void mc32_start_transceiver(struc static void mc32_halt_transceiver(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; mc32_ready_poll(dev); @@ -743,7 +743,7 @@ static void mc32_halt_transceiver(struct static int mc32_load_rx_ring(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); int i; u16 rx_base; volatile struct skb_header *p; @@ -792,7 +792,7 @@ static int mc32_load_rx_ring(struct net_ static void mc32_flush_rx_ring(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); int i; for(i=0; i < RX_RING_LEN; i++) @@ -824,7 +824,7 @@ static void mc32_flush_rx_ring(struct ne static void mc32_load_tx_ring(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); volatile struct skb_header *p; int i; u16 tx_base; @@ -861,7 +861,7 @@ static void mc32_load_tx_ring(struct net static void mc32_flush_tx_ring(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); int i; for (i=0; i < TX_RING_LEN; i++) @@ -899,7 +899,7 @@ static void mc32_flush_tx_ring(struct ne static int mc32_open(struct net_device *dev) { int ioaddr = dev->base_addr; - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); u8 one=1; u8 regs; u16 descnumbuffs[2] = {TX_RING_LEN, RX_RING_LEN}; @@ -1022,7 +1022,7 @@ static void mc32_timeout(struct net_devi static int mc32_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); u32 head = atomic_read(&lp->tx_ring_head); volatile struct skb_header *p, *np; @@ -1092,7 +1092,7 @@ static int mc32_send_packet(struct sk_bu static void mc32_update_stats(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); volatile struct mc32_stats *st = lp->stats; u32 rx_errors=0; @@ -1143,7 +1143,7 @@ static void mc32_update_stats(struct net static void mc32_rx_ring(struct net_device *dev) { - struct mc32_local *lp=dev->priv; + struct mc32_local *lp = netdev_priv(dev); volatile struct skb_header *p; u16 rx_ring_tail; u16 rx_old_tail; @@ -1236,7 +1236,7 @@ static void mc32_rx_ring(struct net_devi static void mc32_tx_ring(struct net_device *dev) { - struct mc32_local *lp=(struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); volatile struct skb_header *np; /* @@ -1333,7 +1333,7 @@ static irqreturn_t mc32_interrupt(int ir } ioaddr = dev->base_addr; - lp = (struct mc32_local *)dev->priv; + lp = netdev_priv(dev); /* See whats cooking */ @@ -1450,7 +1450,7 @@ static irqreturn_t mc32_interrupt(int ir static int mc32_close(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; u8 regs; @@ -1499,7 +1499,7 @@ static int mc32_close(struct net_device static struct net_device_stats *mc32_get_stats(struct net_device *dev) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); mc32_update_stats(dev); return &lp->net_stats; @@ -1531,7 +1531,7 @@ static struct net_device_stats *mc32_get static void do_mc32_set_multicast_list(struct net_device *dev, int retry) { - struct mc32_local *lp = (struct mc32_local *)dev->priv; + struct mc32_local *lp = netdev_priv(dev); u16 filt = (1<<2); /* Save Bad Packets, for stats purposes */ if (dev->flags&IFF_PROMISC) diff -puN drivers/net/3c59x.c~net_3cxyz_casts drivers/net/3c59x.c --- linux-264-302-priv/drivers/net/3c59x.c~net_3cxyz_casts 2004-03-03 11:10:48.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/3c59x.c 2004-03-03 11:26:59.000000000 -0800 @@ -1013,7 +1013,7 @@ static int vortex_eisa_remove (struct de BUG(); } - vp = dev->priv; + vp = netdev_priv(dev); ioaddr = dev->base_addr; unregister_netdev (dev); @@ -1115,7 +1115,7 @@ static int __devinit vortex_probe1(struc } SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, gendev); - vp = dev->priv; + vp = netdev_priv(dev); option = global_options; @@ -1516,7 +1516,7 @@ static void vortex_up(struct net_device *dev) { long ioaddr = dev->base_addr; - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); unsigned int config; int i; @@ -1714,7 +1714,7 @@ vortex_up(struct net_device *dev) static int vortex_open(struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); int i; int retval; @@ -1772,7 +1772,7 @@ static void vortex_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; int next_tick = 60*HZ; int ok = 0; @@ -1898,7 +1898,7 @@ leave_media_alone: static void vortex_tx_timeout(struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; printk(KERN_ERR "%s: transmit timed out, tx_status %2.2x status %4.4x.\n", @@ -1968,7 +1968,7 @@ static void vortex_tx_timeout(struct net static void vortex_error(struct net_device *dev, int status) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; int do_tx_reset = 0, reset_mask = 0; unsigned char tx_status = 0; @@ -2070,7 +2070,7 @@ vortex_error(struct net_device *dev, int static int vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; /* Put out the doubleword header... */ @@ -2125,7 +2125,7 @@ vortex_start_xmit(struct sk_buff *skb, s static int boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; /* Calculate the next Tx descriptor entry. */ int entry = vp->cur_tx % TX_RING_SIZE; @@ -2225,7 +2225,7 @@ static irqreturn_t vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr; int status; int work_done = max_interrupt_work; @@ -2330,7 +2330,7 @@ static irqreturn_t boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr; int status; int work_done = max_interrupt_work; @@ -2455,7 +2455,7 @@ handler_exit: static int vortex_rx(struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; int i; short rx_status; @@ -2525,7 +2525,7 @@ static int vortex_rx(struct net_device * static int boomerang_rx(struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); int entry = vp->cur_rx % RX_RING_SIZE; long ioaddr = dev->base_addr; int rx_status; @@ -2627,7 +2627,7 @@ static void rx_oom_timer(unsigned long arg) { struct net_device *dev = (struct net_device *)arg; - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); spin_lock_irq(&vp->lock); if ((vp->cur_rx - vp->dirty_rx) == RX_RING_SIZE) /* This test is redundant, but makes me feel good */ @@ -2642,7 +2642,7 @@ rx_oom_timer(unsigned long arg) static void vortex_down(struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; netif_stop_queue (dev); @@ -2678,7 +2678,7 @@ vortex_down(struct net_device *dev) static int vortex_close(struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; int i; @@ -2740,7 +2740,7 @@ static void dump_tx_ring(struct net_device *dev) { if (vortex_debug > 0) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; if (vp->full_bus_master_tx) { @@ -2773,7 +2773,7 @@ dump_tx_ring(struct net_device *dev) static struct net_device_stats *vortex_get_stats(struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); unsigned long flags; if (netif_device_present(dev)) { /* AKPM: Used to be netif_running */ @@ -2793,7 +2793,7 @@ static struct net_device_stats *vortex_g */ static void update_stats(long ioaddr, struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); int old_window = inw(ioaddr + EL3_CMD); if (old_window == 0xffff) /* Chip suspended or ejected. */ @@ -2834,7 +2834,7 @@ static void update_stats(long ioaddr, st static void vortex_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct vortex_private *vp = dev->priv; + struct vortex_private *vp = netdev_priv(dev); strcpy(info->driver, DRV_NAME); strcpy(info->version, DRV_VERSION); @@ -2855,7 +2855,7 @@ static struct ethtool_ops vortex_ethtool static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; int phy = vp->phys[0] & 0x1f; @@ -2942,7 +2942,7 @@ static void mdio_sync(long ioaddr, int b static int mdio_read(struct net_device *dev, int phy_id, int location) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); int i; long ioaddr = dev->base_addr; int read_cmd = (0xf6 << 10) | (phy_id << 5) | location; @@ -2976,7 +2976,7 @@ static int mdio_read(struct net_device * static void mdio_write(struct net_device *dev, int phy_id, int location, int value) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; int write_cmd = 0x50020000 | (phy_id << 23) | (location << 18) | value; long mdio_addr = ioaddr + Wn4_PhysicalMgmt; @@ -3010,7 +3010,7 @@ static void mdio_write(struct net_device /* Set Wake-On-LAN mode and put the board into D3 (power-down) state. */ static void acpi_set_WOL(struct net_device *dev) { - struct vortex_private *vp = (struct vortex_private *)dev->priv; + struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; /* Power up on: 1==Downloaded Filter, 2==Magic Packets, 4==Link Status. */ @@ -3036,7 +3036,7 @@ static void __devexit vortex_remove_one BUG(); } - vp = dev->priv; + vp = netdev_priv(dev); /* AKPM: FIXME: we should have * if (vp->cb_fn_base) iounmap(vp->cb_fn_base); _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:20:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:20:20 -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 i24LK7KO018666 for ; Thu, 4 Mar 2004 13:20:07 -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 i24LK2E29127 for ; Thu, 4 Mar 2004 13:20:02 -0800 Date: Thu, 4 Mar 2004 13:19:09 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in net/tokenring/ drivers Message-Id: <20040304131909.068e41ed.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: 3748 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: 41211 Lines: 1159 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/tokenring/abyss.c | 6 linux-264-302-priv-rddunlap/drivers/net/tokenring/madgemc.c | 6 linux-264-302-priv-rddunlap/drivers/net/tokenring/proteon.c | 4 linux-264-302-priv-rddunlap/drivers/net/tokenring/skisa.c | 4 linux-264-302-priv-rddunlap/drivers/net/tokenring/smctr.c | 174 +++++------ linux-264-302-priv-rddunlap/drivers/net/tokenring/tms380tr.c | 54 +-- 6 files changed, 124 insertions(+), 124 deletions(-) diff -puN drivers/net/tokenring/abyss.c~net_token_casts drivers/net/tokenring/abyss.c --- linux-264-302-priv/drivers/net/tokenring/abyss.c~net_token_casts 2004-03-02 16:30:16.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tokenring/abyss.c 2004-03-02 16:33:00.000000000 -0800 @@ -154,7 +154,7 @@ static int __devinit abyss_attach(struct printk(":%2.2x", dev->dev_addr[i]); printk("\n"); - tp = dev->priv; + tp = netdev_priv(dev); tp->setnselout = abyss_setnselout_pins; tp->sifreadb = abyss_sifreadb; tp->sifreadw = abyss_sifreadw; @@ -188,7 +188,7 @@ err_out_trdev: static unsigned short abyss_setnselout_pins(struct net_device *dev) { unsigned short val = 0; - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(tp->DataRate == SPEED_4) val |= 0x01; /* Set 4Mbps */ @@ -398,7 +398,7 @@ static void abyss_read_eeprom(struct net unsigned short val; int i; - tp = (struct net_local *)dev->priv; + tp = netdev_priv(dev); ioaddr = dev->base_addr; /* Must enable glue chip first */ diff -puN drivers/net/tokenring/madgemc.c~net_token_casts drivers/net/tokenring/madgemc.c --- linux-264-302-priv/drivers/net/tokenring/madgemc.c~net_token_casts 2004-03-02 16:30:16.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tokenring/madgemc.c 2004-03-02 16:33:28.000000000 -0800 @@ -365,7 +365,7 @@ static int __init madgemc_probe(void) return 0; return -1; } - tp = (struct net_local *)dev->priv; + tp = netdev_priv(dev); /* * The MC16 is physically a 32bit card. However, Madge @@ -504,7 +504,7 @@ static irqreturn_t madgemc_interrupt(int unsigned short madgemc_setnselout_pins(struct net_device *dev) { unsigned char reg1; - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); reg1 = inb(dev->base_addr + MC_CONTROL_REG1); @@ -731,7 +731,7 @@ static int madgemc_mcaproc(char *buf, in } len += sprintf(buf+len, "-------\n"); if (curcard) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int i; len += sprintf(buf+len, "Card Revision: %d\n", curcard->cardrev); diff -puN drivers/net/tokenring/proteon.c~net_token_casts drivers/net/tokenring/proteon.c --- linux-264-302-priv/drivers/net/tokenring/proteon.c~net_token_casts 2004-03-02 16:30:16.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tokenring/proteon.c 2004-03-02 16:34:30.000000000 -0800 @@ -158,7 +158,7 @@ static int __init setup_card(struct net_ printk(":%2.2x", dev->dev_addr[j]); printk("\n"); - tp = (struct net_local *)dev->priv; + tp = netdev_priv(dev); tp->setnselout = proteon_setnselout_pins; tp->sifreadb = proteon_sifreadb; @@ -316,7 +316,7 @@ unsigned short proteon_setnselout_pins(s static int proteon_open(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned short val = 0; int i; diff -puN drivers/net/tokenring/skisa.c~net_token_casts drivers/net/tokenring/skisa.c --- linux-264-302-priv/drivers/net/tokenring/skisa.c~net_token_casts 2004-03-02 16:30:16.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tokenring/skisa.c 2004-03-02 16:35:01.000000000 -0800 @@ -175,7 +175,7 @@ static int __init setup_card(struct net_ printk(":%2.2x", dev->dev_addr[j]); printk("\n"); - tp = (struct net_local *)dev->priv; + tp = netdev_priv(dev); tp->setnselout = sk_isa_setnselout_pins; tp->sifreadb = sk_isa_sifreadb; @@ -332,7 +332,7 @@ unsigned short sk_isa_setnselout_pins(st static int sk_isa_open(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned short val = 0; unsigned short oldval; int i; diff -puN drivers/net/tokenring/smctr.c~net_token_casts drivers/net/tokenring/smctr.c --- linux-264-302-priv/drivers/net/tokenring/smctr.c~net_token_casts 2004-03-02 16:30:16.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tokenring/smctr.c 2004-03-02 16:38:17.000000000 -0800 @@ -327,7 +327,7 @@ static int smctr_wait_while_cbusy(struct */ static int smctr_alloc_shared_memory(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_alloc_shared_memory\n", dev->name); @@ -454,7 +454,7 @@ static int smctr_bypass_state(struct net static int smctr_checksum_firmware(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); __u16 i, checksum = 0; if(smctr_debug > 10) @@ -480,7 +480,7 @@ static int smctr_checksum_firmware(struc static int smctr_chk_mca(struct net_device *dev) { #ifdef CONFIG_MCA - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int current_slot; __u8 r1, r2, r3, r4, r5; @@ -631,7 +631,7 @@ static int smctr_chk_mca(struct net_devi static int smctr_chg_rx_mask(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err = 0; if(smctr_debug > 10) @@ -694,7 +694,7 @@ static int smctr_chg_rx_mask(struct net_ static int smctr_clear_int(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); outb((tp->trc_mask | CSR_CLRTINT), dev->base_addr + CSR); @@ -716,7 +716,7 @@ static int smctr_clear_trc_reset(int ioa */ static int smctr_close(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); struct sk_buff *skb; int err; @@ -752,7 +752,7 @@ static int smctr_close(struct net_device static int smctr_decode_firmware(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); short bit = 0x80, shift = 12; DECODE_TREE_NODE *tree; short branch, tsize; @@ -823,7 +823,7 @@ static int smctr_disable_16bit(struct ne */ static int smctr_disable_adapter_ctrl_store(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; if(smctr_debug > 10) @@ -837,7 +837,7 @@ static int smctr_disable_adapter_ctrl_st static int smctr_disable_bic_int(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; tp->trc_mask = CSR_MSK_ALL | CSR_MSKCBUSY @@ -849,7 +849,7 @@ static int smctr_disable_bic_int(struct static int smctr_enable_16bit(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); __u8 r; if(tp->adapter_bus == BUS_ISA16_TYPE) @@ -869,7 +869,7 @@ static int smctr_enable_16bit(struct net */ static int smctr_enable_adapter_ctrl_store(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; if(smctr_debug > 10) @@ -900,7 +900,7 @@ static int smctr_enable_adapter_ram(stru static int smctr_enable_bic_int(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; __u8 r; @@ -926,7 +926,7 @@ static int smctr_enable_bic_int(struct n static int __init smctr_chk_isa(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; __u8 r1, r2, b, chksum = 0; __u16 r; @@ -1155,7 +1155,7 @@ out: static int __init smctr_get_boardid(struct net_device *dev, int mca) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; __u8 r, r1, IdByte; __u16 BoardIdMask; @@ -1273,7 +1273,7 @@ static int smctr_get_functional_address( */ static unsigned int smctr_get_num_rx_bdbs(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int mem_used = 0; /* Allocate System Control Blocks. */ @@ -1358,7 +1358,7 @@ static int smctr_get_physical_drop_numbe static __u8 * smctr_get_rx_pointer(struct net_device *dev, short queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); BDBlock *bdb; bdb = (BDBlock *)((__u32)tp->ram_access @@ -1382,7 +1382,7 @@ static int smctr_get_station_id(struct n */ static struct net_device_stats *smctr_get_stats(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); return ((struct net_device_stats *)&tp->MacStat); } @@ -1390,7 +1390,7 @@ static struct net_device_stats *smctr_ge static FCBlock *smctr_get_tx_fcb(struct net_device *dev, __u16 queue, __u16 bytes_count) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); FCBlock *pFCB; BDBlock *pbdb; unsigned short alloc_size; @@ -1513,7 +1513,7 @@ static int smctr_hardware_send_packet(st static int smctr_init_acbs(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i; ACBlock *acb; @@ -1557,7 +1557,7 @@ static int smctr_init_acbs(struct net_de static int smctr_init_adapter(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; if(smctr_debug > 10) @@ -1640,7 +1640,7 @@ static int smctr_init_adapter(struct net static int smctr_init_card_real(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err = 0; if(smctr_debug > 10) @@ -1716,7 +1716,7 @@ static int smctr_init_card_real(struct n static int smctr_init_rx_bdbs(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i, j; BDBlock *bdb; __u16 *buf; @@ -1768,7 +1768,7 @@ static int smctr_init_rx_bdbs(struct net static int smctr_init_rx_fcbs(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i, j; FCBlock *fcb; @@ -1818,7 +1818,7 @@ static int smctr_init_rx_fcbs(struct net static int smctr_init_shared_memory(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i; __u32 *iscpb; @@ -1876,7 +1876,7 @@ static int smctr_init_shared_memory(stru static int smctr_init_tx_bdbs(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i, j; BDBlock *bdb; @@ -1906,7 +1906,7 @@ static int smctr_init_tx_bdbs(struct net static int smctr_init_tx_fcbs(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i, j; FCBlock *fcb; @@ -1945,7 +1945,7 @@ static int smctr_init_tx_fcbs(struct net static int smctr_internal_self_test(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_issue_test_internal_rom_cmd(dev))) @@ -1998,7 +1998,7 @@ static irqreturn_t smctr_interrupt(int i } ioaddr = dev->base_addr; - tp = (struct net_local *)dev->priv; + tp = netdev_priv(dev); if(tp->status == NOT_INITIALIZED) @@ -2471,7 +2471,7 @@ static irqreturn_t smctr_interrupt(int i static int smctr_issue_enable_int_cmd(struct net_device *dev, __u16 interrupt_enable_mask) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_wait_while_cbusy(dev))) @@ -2487,7 +2487,7 @@ static int smctr_issue_enable_int_cmd(st static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, __u16 ibits) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(smctr_wait_while_cbusy(dev)) return (-1); @@ -2503,7 +2503,7 @@ static int smctr_issue_int_ack(struct ne static int smctr_issue_init_timers_cmd(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i; int err; __u16 *pTimer_Struc = (__u16 *)tp->misc_command_data; @@ -2660,7 +2660,7 @@ static int smctr_issue_init_timers_cmd(s static int smctr_issue_init_txrx_cmd(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i; int err; void **txrx_ptrs = (void *)tp->misc_command_data; @@ -2748,7 +2748,7 @@ static int smctr_issue_read_word_cmd(str static int smctr_issue_remove_cmd(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_wait_while_cbusy(dev))) @@ -2764,7 +2764,7 @@ static int smctr_issue_remove_cmd(struct static int smctr_issue_resume_acb_cmd(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_wait_while_cbusy(dev))) @@ -2782,7 +2782,7 @@ static int smctr_issue_resume_acb_cmd(st static int smctr_issue_resume_rx_bdb_cmd(struct net_device *dev, __u16 queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_wait_while_cbusy(dev))) @@ -2802,7 +2802,7 @@ static int smctr_issue_resume_rx_bdb_cmd static int smctr_issue_resume_rx_fcb_cmd(struct net_device *dev, __u16 queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_issue_resume_rx_fcb_cmd\n", dev->name); @@ -2824,7 +2824,7 @@ static int smctr_issue_resume_rx_fcb_cmd static int smctr_issue_resume_tx_fcb_cmd(struct net_device *dev, __u16 queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_issue_resume_tx_fcb_cmd\n", dev->name); @@ -2893,7 +2893,7 @@ static int smctr_issue_tri_loopback_cmd( static int smctr_issue_write_byte_cmd(struct net_device *dev, short aword_cnt, void *byte) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int iword, ibyte; int err; @@ -2917,7 +2917,7 @@ static int smctr_issue_write_byte_cmd(st static int smctr_issue_write_word_cmd(struct net_device *dev, short aword_cnt, void *word) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i, err; if((err = smctr_wait_while_cbusy(dev))) @@ -2947,7 +2947,7 @@ static int smctr_join_complete_state(str static int smctr_link_tx_fcbs_to_bdbs(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i, j; FCBlock *fcb; BDBlock *bdb; @@ -2971,7 +2971,7 @@ static int smctr_link_tx_fcbs_to_bdbs(st static int smctr_load_firmware(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); __u16 i, checksum = 0; int err = 0; @@ -3071,7 +3071,7 @@ static int smctr_load_node_addr(struct n */ static int smctr_lobe_media_test(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i, perror = 0; unsigned short saved_rcv_mask; @@ -3146,7 +3146,7 @@ static int smctr_lobe_media_test(struct static int smctr_lobe_media_test_cmd(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; if(smctr_debug > 10) @@ -3230,7 +3230,7 @@ static int smctr_make_8025_hdr(struct ne static int smctr_make_access_pri(struct net_device *dev, MAC_SUB_VECTOR *tsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); tsv->svi = AUTHORIZED_ACCESS_PRIORITY; tsv->svl = S_AUTHORIZED_ACCESS_PRIORITY; @@ -3255,7 +3255,7 @@ static int smctr_make_addr_mod(struct ne static int smctr_make_auth_funct_class(struct net_device *dev, MAC_SUB_VECTOR *tsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); tsv->svi = AUTHORIZED_FUNCTION_CLASS; tsv->svl = S_AUTHORIZED_FUNCTION_CLASS; @@ -3280,7 +3280,7 @@ static int smctr_make_corr(struct net_de static int smctr_make_funct_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); smctr_get_functional_address(dev); @@ -3298,7 +3298,7 @@ static int smctr_make_funct_addr(struct static int smctr_make_group_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); smctr_get_group_address(dev); @@ -3324,7 +3324,7 @@ static int smctr_make_group_addr(struct static int smctr_make_phy_drop_num(struct net_device *dev, MAC_SUB_VECTOR *tsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); smctr_get_physical_drop_number(dev); @@ -3355,7 +3355,7 @@ static int smctr_make_product_id(struct static int smctr_make_station_id(struct net_device *dev, MAC_SUB_VECTOR *tsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); smctr_get_station_id(dev); @@ -3393,7 +3393,7 @@ static int smctr_make_ring_station_statu static int smctr_make_ring_station_version(struct net_device *dev, MAC_SUB_VECTOR *tsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); tsv->svi = RING_STATION_VERSION_NUMBER; tsv->svl = S_RING_STATION_VERSION_NUMBER; @@ -3433,7 +3433,7 @@ static int smctr_make_tx_status_code(str static int smctr_make_upstream_neighbor_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); smctr_get_upstream_neighbor_addr(dev); @@ -3485,7 +3485,7 @@ static int smctr_open(struct net_device /* Interrupt driven open of Token card. */ static int smctr_open_tr(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned long flags; int err; @@ -3618,7 +3618,7 @@ struct net_device __init *smctr_probe(in return dev; out1: #ifdef CONFIG_MCA - { struct net_local *tp = (struct net_local *)dev->priv; + { struct net_local *tp = netdev_priv(dev); if (tp->slot_num) mca_mark_as_unused(tp->slot_num); } @@ -3634,7 +3634,7 @@ out: static int __init smctr_probe1(struct net_device *dev, int ioaddr) { static unsigned version_printed; - struct net_local *tp = dev->priv; + struct net_local *tp = netdev_priv(dev); int err; __u32 *ram; @@ -3654,7 +3654,7 @@ static int __init smctr_probe1(struct ne } } - tp = (struct net_local *)dev->priv; + tp = netdev_priv(dev); dev->mem_start = tp->ram_base; dev->mem_end = dev->mem_start + 0x10000; ram = (__u32 *)phys_to_virt(dev->mem_start); @@ -3696,7 +3696,7 @@ out: static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size, struct net_device *dev, __u16 rx_status) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); struct sk_buff *skb; __u16 rcode, correlator; int err = 0; @@ -3917,7 +3917,7 @@ static int smctr_process_rx_packet(MAC_H /* Adapter RAM test. Incremental word ODD boundary data test. */ static int smctr_ram_memory_test(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); __u16 page, pages_of_ram, start_pattern = 0, word_pattern = 0, word_read = 0, err_word = 0, err_pattern = 0; unsigned int err_offset; @@ -4310,7 +4310,7 @@ static int smctr_rcv_unknown(struct net_ */ static int smctr_reset_adapter(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; /* Reseting the NIC will put it in a halted and un-initialized state. */ smctr_set_trc_reset(ioaddr); @@ -4329,7 +4329,7 @@ static int smctr_reset_adapter(struct ne static int smctr_restart_tx_chain(struct net_device *dev, short queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err = 0; if(smctr_debug > 10) @@ -4347,7 +4347,7 @@ static int smctr_restart_tx_chain(struct static int smctr_ring_status_chg(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_ring_status_chg\n", dev->name); @@ -4449,7 +4449,7 @@ static int smctr_ring_status_chg(struct static int smctr_rx_frame(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); __u16 queue, status, rx_size, err = 0; __u8 *pbuff; @@ -4516,7 +4516,7 @@ static int smctr_rx_frame(struct net_dev static int smctr_send_dat(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int i, err; MAC_HEADER *tmf; FCBlock *fcb; @@ -4596,7 +4596,7 @@ static void smctr_timeout(struct net_dev */ static int smctr_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_send_packet\n", dev->name); @@ -4621,7 +4621,7 @@ static int smctr_send_packet(struct sk_b static int smctr_send_lobe_media_test(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); MAC_SUB_VECTOR *tsv; MAC_HEADER *tmf; FCBlock *fcb; @@ -4917,7 +4917,7 @@ static int smctr_send_rsp(struct net_dev static int smctr_send_rq_init(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); MAC_HEADER *tmf; MAC_SUB_VECTOR *tsv; FCBlock *fcb; @@ -5001,7 +5001,7 @@ static int smctr_send_rq_init(struct net static int smctr_send_tx_forward(struct net_device *dev, MAC_HEADER *rmf, __u16 *tx_fstatus) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); FCBlock *fcb; unsigned int i; int err; @@ -5065,7 +5065,7 @@ static int smctr_send_tx_forward(struct static int smctr_set_auth_access_pri(struct net_device *dev, MAC_SUB_VECTOR *rsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(rsv->svl != S_AUTHORIZED_ACCESS_PRIORITY) return (E_SUB_VECTOR_LENGTH_ERROR); @@ -5078,7 +5078,7 @@ static int smctr_set_auth_access_pri(str static int smctr_set_auth_funct_class(struct net_device *dev, MAC_SUB_VECTOR *rsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(rsv->svl != S_AUTHORIZED_FUNCTION_CLASS) return (E_SUB_VECTOR_LENGTH_ERROR); @@ -5139,7 +5139,7 @@ static int smctr_set_frame_forward(struc static int smctr_set_local_ring_num(struct net_device *dev, MAC_SUB_VECTOR *rsv) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(rsv->svl != S_LOCAL_RING_NUMBER) return (E_SUB_VECTOR_LENGTH_ERROR); @@ -5153,7 +5153,7 @@ static int smctr_set_local_ring_num(stru static unsigned short smctr_set_ctrl_attention(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; if(tp->bic_type == BIC_585_CHIP) @@ -5177,7 +5177,7 @@ static void smctr_set_multicast_list(str static int smctr_set_page(struct net_device *dev, __u8 *buf) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); __u8 amask; __u32 tptr; @@ -5207,7 +5207,7 @@ static int smctr_set_phy_drop(struct net */ static int smctr_set_ring_speed(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; if(tp->media_type == MEDIA_UTP_16) @@ -5235,7 +5235,7 @@ static int smctr_set_ring_speed(struct n static int smctr_set_rx_look_ahead(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); __u16 sword, rword; if(smctr_debug > 10) @@ -5278,7 +5278,7 @@ static int smctr_set_trc_reset(int ioadd static int smctr_setup_single_cmd(struct net_device *dev, __u16 command, __u16 subcommand) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int err; if(smctr_debug > 10) @@ -5305,7 +5305,7 @@ static int smctr_setup_single_cmd(struct static int smctr_setup_single_cmd_w_data(struct net_device *dev, __u16 command, __u16 subcommand) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); tp->acb_head->cmd_done_status = ACB_COMMAND_NOT_DONE; tp->acb_head->cmd = command; @@ -5318,7 +5318,7 @@ static int smctr_setup_single_cmd_w_data static char *smctr_malloc(struct net_device *dev, __u16 size) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); char *m; m = (char *)(tp->ram_access + tp->sh_mem_used); @@ -5329,7 +5329,7 @@ static char *smctr_malloc(struct net_dev static int smctr_status_chg(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_status_chg\n", dev->name); @@ -5365,7 +5365,7 @@ static int smctr_status_chg(struct net_d static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb, __u16 queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err = 0; if(smctr_debug > 10) @@ -5386,7 +5386,7 @@ static int smctr_trc_send_packet(struct static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); __u16 status, err = 0; int cstatus; @@ -5441,7 +5441,7 @@ static __u16 smctr_tx_complete(struct ne static unsigned short smctr_tx_move_frame(struct net_device *dev, struct sk_buff *skb, __u8 *pbuff, unsigned int bytes) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int ram_usable; __u32 flen, len, offset = 0; __u8 *frag, *page; @@ -5482,7 +5482,7 @@ static unsigned short smctr_tx_move_fram /* Update the error statistic counters for this adapter. */ static int smctr_update_err_stats(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); struct tr_statistics *tstat = &tp->MacStat; if(tstat->internal_errors) @@ -5524,7 +5524,7 @@ static int smctr_update_err_stats(struct static int smctr_update_rx_chain(struct net_device *dev, __u16 queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); FCBlock *fcb; BDBlock *bdb; __u16 size, len; @@ -5562,7 +5562,7 @@ static int smctr_update_rx_chain(struct static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb, __u16 queue) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(smctr_debug > 20) printk(KERN_DEBUG "smctr_update_tx_chain\n"); @@ -5598,7 +5598,7 @@ static int smctr_update_tx_chain(struct static int smctr_wait_cmd(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int loop_count = 0x20000; if(smctr_debug > 10) @@ -5623,7 +5623,7 @@ static int smctr_wait_cmd(struct net_dev static int smctr_wait_while_cbusy(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int timeout = 0x20000; int ioaddr = dev->base_addr; __u8 r; @@ -5686,7 +5686,7 @@ static struct net_device *setup_card(int return dev; out1: #ifdef CONFIG_MCA - { struct net_local *tp = (struct net_local *)dev->priv; + { struct net_local *tp = netdev_priv(dev); if (tp->slot_num) mca_mark_as_unused(tp->slot_num); } @@ -5726,7 +5726,7 @@ void cleanup_module(void) unregister_netdev(dev); #ifdef CONFIG_MCA - { struct net_local *tp = dev->priv; + { struct net_local *tp = netdev_priv(dev); if (tp->slot_num) mca_mark_as_unused(tp->slot_num); } diff -puN drivers/net/tokenring/tms380tr.c~net_token_casts drivers/net/tokenring/tms380tr.c --- linux-264-302-priv/drivers/net/tokenring/tms380tr.c~net_token_casts 2004-03-02 16:30:16.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tokenring/tms380tr.c 2004-03-02 16:40:11.000000000 -0800 @@ -243,7 +243,7 @@ static int madgemc_sifprobe(struct net_d */ int tms380tr_open(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; /* init the spinlock */ @@ -313,7 +313,7 @@ int tms380tr_open(struct net_device *dev static void tms380tr_timer_end_wait(unsigned long data) { struct net_device *dev = (struct net_device*)data; - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(tp->Sleeping) { @@ -329,7 +329,7 @@ static void tms380tr_timer_end_wait(unsi */ static int tms380tr_chipset_init(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; tms380tr_init_ipb(tp); @@ -364,7 +364,7 @@ static int tms380tr_chipset_init(struct */ static void tms380tr_init_net_local(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int i; dma_addr_t dmabuf; @@ -492,7 +492,7 @@ static void tms380tr_init_opb(struct net unsigned short BufferSize = BUFFER_SIZE; int i; - tp = (struct net_local *)dev->priv; + tp = netdev_priv(dev); tp->ocpl.OPENOptions = 0; tp->ocpl.OPENOptions |= ENABLE_FULL_DUPLEX_SELECTION; @@ -531,7 +531,7 @@ static void tms380tr_init_opb(struct net */ static void tms380tr_open_adapter(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); if(tp->OpenCommandIssued) return; @@ -569,7 +569,7 @@ static void tms380tr_enable_interrupts(s */ static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); tp->CMDqueue |= Command; tms380tr_chk_outstanding_cmds(dev); @@ -596,7 +596,7 @@ static void tms380tr_timeout(struct net_ */ static int tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); int err; err = tms380tr_hardware_send_packet(skb, dev); @@ -616,7 +616,7 @@ static int tms380tr_hardware_send_packet unsigned long flags; int i; dma_addr_t dmabuf, newbuf; - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); /* Try to get a free TPL from the chain. * @@ -715,7 +715,7 @@ static void tms380tr_chk_src_addr(unsign static void tms380tr_timer_chk(unsigned long data) { struct net_device *dev = (struct net_device*)data; - struct net_local *tp = (struct net_local*)dev->priv; + struct net_local *tp = netdev_priv(dev); if(tp->HaltInProgress) return; @@ -755,7 +755,7 @@ irqreturn_t tms380tr_interrupt(int irq, return IRQ_NONE; } - tp = (struct net_local *)dev->priv; + tp = netdev_priv(dev); irq_type = SIFREADW(SIFSTS); @@ -843,7 +843,7 @@ irqreturn_t tms380tr_interrupt(int irq, */ static void tms380tr_reset_interrupt(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); SSB *ssb = &tp->ssb; /* @@ -929,7 +929,7 @@ static unsigned char tms380tr_chk_ssb(st */ static void tms380tr_cmd_status_irq(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned short ssb_cmd, ssb_parm_0; unsigned short ssb_parm_1; char *open_err = "Open error -"; @@ -1126,7 +1126,7 @@ static void tms380tr_cmd_status_irq(stru */ int tms380tr_close(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); netif_stop_queue(dev); del_timer(&tp->timer); @@ -1172,7 +1172,7 @@ int tms380tr_close(struct net_device *de */ static struct net_device_stats *tms380tr_get_stats(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); return ((struct net_device_stats *)&tp->MacStat); } @@ -1182,7 +1182,7 @@ static struct net_device_stats *tms380tr */ static void tms380tr_set_multicast_list(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned int OpenOptions; OpenOptions = tp->ocpl.OPENOptions & @@ -1275,7 +1275,7 @@ static void tms380tr_exec_sifcmd(struct */ static int tms380tr_reset_adapter(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned short *fw_ptr; unsigned short count, c, count2; const struct firmware *fw_entry = NULL; @@ -1428,7 +1428,7 @@ static int tms380tr_bringup_diags(struct */ static int tms380tr_init_adapter(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B}; const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7, @@ -1541,7 +1541,7 @@ static int tms380tr_init_adapter(struct */ static void tms380tr_chk_outstanding_cmds(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned long Addr = 0; if(tp->CMDqueue == 0) @@ -1713,7 +1713,7 @@ static void tms380tr_chk_outstanding_cmd */ static void tms380tr_ring_status_irq(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); tp->CurrentRingStatus = be16_to_cpu((unsigned short)tp->ssb.Parm[0]); @@ -1785,7 +1785,7 @@ static void tms380tr_chk_irq(struct net_ { int i; unsigned short AdapterCheckBlock[4]; - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); tp->AdapterOpenFlag = 0; /* Adapter closed now */ @@ -1941,7 +1941,7 @@ static void tms380tr_chk_irq(struct net_ */ static int tms380tr_read_ptr(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned short adapterram; tms380tr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr, @@ -2031,7 +2031,7 @@ static void tms380tr_cancel_tx_queue(str */ static void tms380tr_tx_status_irq(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned char HighByte, HighAc, LowAc; TPL *tpl; @@ -2102,7 +2102,7 @@ static void tms380tr_tx_status_irq(struc */ static void tms380tr_rcv_status_irq(struct net_device *dev) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); unsigned char *ReceiveDataPtr; struct sk_buff *skb; unsigned int Length, Length2; @@ -2293,7 +2293,7 @@ static void tms380tr_update_rcv_stats(st static int tms380tr_set_mac_address(struct net_device *dev, void *addr) { - struct net_local *tp = (struct net_local *)dev->priv; + struct net_local *tp = netdev_priv(dev); struct sockaddr *saddr = addr; if (tp->AdapterOpenFlag || tp->AdapterVirtOpenFlag) { @@ -2327,7 +2327,7 @@ void tmsdev_term(struct net_device *dev) { struct net_local *tp; - tp = (struct net_local *) dev->priv; + tp = netdev_priv(dev); pci_unmap_single(tp->pdev, tp->dmabuffer, sizeof(struct net_local), PCI_DMA_BIDIRECTIONAL); } @@ -2338,7 +2338,7 @@ int tmsdev_init(struct net_device *dev, struct net_local *tms_local; memset(dev->priv, 0, sizeof(struct net_local)); - tms_local = (struct net_local *)dev->priv; + tms_local = netdev_priv(dev); init_waitqueue_head(&tms_local->wait_for_tok_int); tms_local->dmalimit = dmalimit; tms_local->pdev = pdev; _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:20:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:20:27 -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 i24LKKKO018794 for ; Thu, 4 Mar 2004 13:20:20 -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 i24LKFE29197 for ; Thu, 4 Mar 2004 13:20:15 -0800 Date: Thu, 4 Mar 2004 13:19:22 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in net/arm drivers Message-Id: <20040304131922.1eab1cb4.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: 3749 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: 13186 Lines: 394 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/arm/am79c961a.c | 20 +++++++------- linux-264-302-priv-rddunlap/drivers/net/arm/ether1.c | 20 +++++++------- linux-264-302-priv-rddunlap/drivers/net/arm/ether3.c | 22 ++++++++-------- linux-264-302-priv-rddunlap/drivers/net/arm/etherh.c | 18 ++++++------- 4 files changed, 40 insertions(+), 40 deletions(-) diff -puN drivers/net/arm/am79c961a.c~net_arm_casts drivers/net/arm/am79c961a.c --- linux-264-302-priv/drivers/net/arm/am79c961a.c~net_arm_casts 2004-03-02 15:08:30.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/arm/am79c961a.c 2004-03-02 15:15:12.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 = netdev_priv(dev); unsigned long flags; unsigned char *p; u_int hdr_addr, first_free_addr; @@ -271,7 +271,7 @@ am79c961_init_for_open(struct net_device static void am79c961_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); unsigned int lnkstat, carrier; lnkstat = read_ireg(dev->base_addr, ISALED0) & ISALED0_LNKST; @@ -291,7 +291,7 @@ static void am79c961_timer(unsigned long static int am79c961_open(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); int ret; memset (&priv->stats, 0, sizeof (priv->stats)); @@ -318,7 +318,7 @@ am79c961_open(struct net_device *dev) static int am79c961_close(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); unsigned long flags; del_timer_sync(&priv->timer); @@ -341,7 +341,7 @@ am79c961_close(struct net_device *dev) */ static struct net_device_stats *am79c961_getstats (struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); return &priv->stats; } @@ -365,7 +365,7 @@ static void am79c961_mc_hash(struct dev_ */ static void am79c961_setmulticastlist (struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); unsigned long flags; unsigned short multi_hash[4], mode; int i, stopped; @@ -444,7 +444,7 @@ static void am79c961_timeout(struct net_ static int am79c961_sendpacket(struct sk_buff *skb, struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); unsigned int hdraddr, bufaddr; unsigned int head; unsigned long flags; @@ -593,7 +593,7 @@ static irqreturn_t am79c961_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); u_int status, n = 100; int handled = 0; @@ -630,7 +630,7 @@ am79c961_interrupt(int irq, void *dev_id static int am79c961_hw_init(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); spin_lock_irq(&priv->chip_lock); write_rreg (dev->base_addr, CSR0, CSR0_STOP); @@ -662,7 +662,7 @@ static int __init am79c961_init(void) if (!dev) goto out; - priv = dev->priv; + priv = netdev_priv(dev); /* * Fixed address and IRQ lines here. diff -puN drivers/net/arm/ether1.c~net_arm_casts drivers/net/arm/ether1.c --- linux-264-302-priv/drivers/net/arm/ether1.c~net_arm_casts 2004-03-02 15:08:30.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/arm/ether1.c 2004-03-02 15:11:48.000000000 -0800 @@ -447,7 +447,7 @@ static rbd_t init_rbd = { static int ether1_init_for_open (struct net_device *dev) { - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); int i, status, addr, next, next2; int failures = 0; unsigned long timeout; @@ -616,7 +616,7 @@ ether1_init_for_open (struct net_device static int ether1_txalloc (struct net_device *dev, int size) { - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); int start, tail; size = (size + 1) & ~1; @@ -642,7 +642,7 @@ ether1_txalloc (struct net_device *dev, static int ether1_open (struct net_device *dev) { - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); if (!is_valid_ether_addr(dev->dev_addr)) { printk(KERN_WARNING "%s: invalid ethernet MAC address\n", @@ -668,7 +668,7 @@ ether1_open (struct net_device *dev) static void ether1_timeout(struct net_device *dev) { - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); printk(KERN_WARNING "%s: transmit timeout, network cable problem?\n", dev->name); @@ -686,7 +686,7 @@ ether1_timeout(struct net_device *dev) static int ether1_sendpacket (struct sk_buff *skb, struct net_device *dev) { - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); int tmp, tst, nopaddr, txaddr, tbdaddr, dataddr; unsigned long flags; tx_t tx; @@ -762,7 +762,7 @@ ether1_sendpacket (struct sk_buff *skb, static void ether1_xmit_done (struct net_device *dev) { - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); nop_t nop; int caddr, tst; @@ -863,7 +863,7 @@ again: static void ether1_recv_done (struct net_device *dev) { - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); int status; int nexttail, rbdaddr; rbd_t rbd; @@ -919,7 +919,7 @@ static irqreturn_t ether1_interrupt (int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); int status; status = ether1_inw (dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS); @@ -978,7 +978,7 @@ ether1_close (struct net_device *dev) static struct net_device_stats * ether1_getstats (struct net_device *dev) { - struct ether1_priv *priv = (struct ether1_priv *)dev->priv; + struct ether1_priv *priv = netdev_priv(dev); return &priv->stats; } @@ -1030,7 +1030,7 @@ ether1_probe(struct expansion_card *ec, request_region(dev->base_addr, 16, dev->name); request_region(dev->base_addr + 0x800, 4096, dev->name); - priv = (struct ether1_priv *)dev->priv; + priv = netdev_priv(dev); if ((priv->bus_type = ether1_reset(dev)) == 0) { ret = -ENODEV; goto release; diff -puN drivers/net/arm/ether3.c~net_arm_casts drivers/net/arm/ether3.c --- linux-264-302-priv/drivers/net/arm/ether3.c~net_arm_casts 2004-03-02 15:08:30.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/arm/ether3.c 2004-03-02 15:13:34.000000000 -0800 @@ -121,7 +121,7 @@ static inline void ether3_outw(int v, co static int ether3_setbuffer(struct net_device *dev, buffer_rw_t read, int start) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); int timeout = 1000; ether3_outw(priv->regs.config1 | CFG1_LOCBUFMEM, REG_CONFIG1); @@ -180,7 +180,7 @@ static void ether3_ledoff(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); ether3_outw(priv->regs.config2 |= CFG2_CTRLO, REG_CONFIG2); } @@ -280,7 +280,7 @@ ether3_ramtest(struct net_device *dev, u static int __init ether3_init_2(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); int i; priv->regs.config1 = CFG1_RECVCOMPSTAT0|CFG1_DMABURST8; @@ -330,7 +330,7 @@ ether3_init_2(struct net_device *dev) static void ether3_init_for_open(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); int i; memset(&priv->stats, 0, sizeof(struct net_device_stats)); @@ -434,7 +434,7 @@ ether3_open(struct net_device *dev) static int ether3_close(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); netif_stop_queue(dev); @@ -457,7 +457,7 @@ ether3_close(struct net_device *dev) */ static struct net_device_stats *ether3_getstats(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); return &priv->stats; } @@ -469,7 +469,7 @@ static struct net_device_stats *ether3_g */ static void ether3_setmulticastlist(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); priv->regs.config1 &= ~CFG1_RECVPROMISC; @@ -487,7 +487,7 @@ static void ether3_setmulticastlist(stru static void ether3_timeout(struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); unsigned long flags; del_timer(&priv->timer); @@ -518,7 +518,7 @@ ether3_timeout(struct net_device *dev) static int ether3_sendpacket(struct sk_buff *skb, struct net_device *dev) { - struct dev_priv *priv = (struct dev_priv *)dev->priv; + struct dev_priv *priv = netdev_priv(dev); unsigned long flags; unsigned int length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; unsigned int ptr, next_ptr; @@ -594,7 +594,7 @@ ether3_interrupt(int irq, void *dev_id, printk("eth3irq: %d ", irq); #endif - priv = (struct dev_priv *)dev->priv; + priv = netdev_priv(dev); status = ether3_inw(REG_STATUS); @@ -844,7 +844,7 @@ ether3_probe(struct expansion_card *ec, goto free; } - priv = (struct dev_priv *) dev->priv; + priv = netdev_priv(dev); init_timer(&priv->timer); /* Reset card... diff -puN drivers/net/arm/etherh.c~net_arm_casts drivers/net/arm/etherh.c --- linux-264-302-priv/drivers/net/arm/etherh.c~net_arm_casts 2004-03-02 15:08:30.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/arm/etherh.c 2004-03-02 15:15:42.000000000 -0800 @@ -144,7 +144,7 @@ static expansioncard_ops_t etherh_ops = static void etherh_setif(struct net_device *dev) { - struct etherh_priv *eh = (struct etherh_priv *)dev->priv; + struct etherh_priv *eh = netdev_priv(dev); struct ei_device *ei_local = &eh->eidev; unsigned long addr, flags; @@ -188,7 +188,7 @@ etherh_setif(struct net_device *dev) static int etherh_getifstat(struct net_device *dev) { - struct etherh_priv *eh = (struct etherh_priv *)dev->priv; + struct etherh_priv *eh = netdev_priv(dev); struct ei_device *ei_local = &eh->eidev; int stat = 0; @@ -256,7 +256,7 @@ static int etherh_set_config(struct net_ static void etherh_reset(struct net_device *dev) { - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = netdev_priv(dev); outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, dev->base_addr); @@ -283,7 +283,7 @@ etherh_reset(struct net_device *dev) static void etherh_block_output (struct net_device *dev, int count, const unsigned char *buf, int start_page) { - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = netdev_priv(dev); unsigned int addr, dma_addr; unsigned long dma_start; @@ -349,7 +349,7 @@ etherh_block_output (struct net_device * static void etherh_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset) { - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = netdev_priv(dev); unsigned int addr, dma_addr; unsigned char *buf; @@ -390,7 +390,7 @@ etherh_block_input (struct net_device *d static void etherh_get_header (struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page) { - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = netdev_priv(dev); unsigned int addr, dma_addr; if (ei_local->dmaing) { @@ -432,7 +432,7 @@ etherh_get_header (struct net_device *de static int etherh_open(struct net_device *dev) { - struct ei_device *ei_local = (struct ei_device *) dev->priv; + struct ei_device *ei_local = netdev_priv(dev); if (!is_valid_ether_addr(dev->dev_addr)) { printk(KERN_WARNING "%s: invalid ethernet MAC address\n", @@ -557,7 +557,7 @@ etherh_probe(struct expansion_card *ec, goto out; } - eh = dev->priv; + eh = netdev_priv(dev); spin_lock_init(&eh->eidev.page_lock); @@ -653,7 +653,7 @@ etherh_probe(struct expansion_card *ec, break; } - ei_local = (struct ei_device *) dev->priv; + ei_local = netdev_priv(dev); if (ec->cid.product == PROD_ANT_ETHERM) { ei_local->tx_start_page = ETHERM_TX_START_PAGE; ei_local->stop_page = ETHERM_STOP_PAGE; _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:20:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:20: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 i24LKYKO019024 for ; Thu, 4 Mar 2004 13:20:34 -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 i24LKTE29257 for ; Thu, 4 Mar 2004 13:20:29 -0800 Date: Thu, 4 Mar 2004 13:19:36 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in net/tulip drivers Message-Id: <20040304131936.7bc66cac.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: 3750 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: 48528 Lines: 1332 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/tulip/21142.c | 6 linux-264-302-priv-rddunlap/drivers/net/tulip/de4x5.c | 164 ++++++------- linux-264-302-priv-rddunlap/drivers/net/tulip/dmfe.c | 26 +- linux-264-302-priv-rddunlap/drivers/net/tulip/eeprom.c | 2 linux-264-302-priv-rddunlap/drivers/net/tulip/interrupt.c | 10 linux-264-302-priv-rddunlap/drivers/net/tulip/media.c | 10 linux-264-302-priv-rddunlap/drivers/net/tulip/pnic.c | 6 linux-264-302-priv-rddunlap/drivers/net/tulip/pnic2.c | 6 linux-264-302-priv-rddunlap/drivers/net/tulip/timer.c | 6 linux-264-302-priv-rddunlap/drivers/net/tulip/tulip_core.c | 30 +- linux-264-302-priv-rddunlap/drivers/net/tulip/xircom_cb.c | 16 - 11 files changed, 141 insertions(+), 141 deletions(-) diff -puN drivers/net/tulip/21142.c~net_tulip_casts drivers/net/tulip/21142.c --- linux-264-302-priv/drivers/net/tulip/21142.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/21142.c 2004-03-02 20:43:32.000000000 -0800 @@ -29,7 +29,7 @@ static u16 t21142_csr15[] = { 0x0008, 0x void t21142_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int csr12 = inl(ioaddr + CSR12); int next_tick = 60*HZ; @@ -103,7 +103,7 @@ void t21142_timer(unsigned long data) void t21142_start_nway(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int csr14 = ((tp->sym_advertise & 0x0780) << 9) | ((tp->sym_advertise & 0x0020) << 1) | 0xffbf; @@ -131,7 +131,7 @@ void t21142_start_nway(struct net_device void t21142_lnk_change(struct net_device *dev, int csr5) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int csr12 = inl(ioaddr + CSR12); diff -puN drivers/net/tulip/de4x5.c~net_tulip_casts drivers/net/tulip/de4x5.c --- linux-264-302-priv/drivers/net/tulip/de4x5.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/de4x5.c 2004-03-02 20:41:58.000000000 -0800 @@ -1086,7 +1086,7 @@ static int __devinit de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) { char name[DE4X5_NAME_LENGTH + 1]; - struct de4x5_private *lp = dev->priv; + struct de4x5_private *lp = netdev_priv(dev); struct pci_dev *pdev = NULL; int i, status=0; @@ -1294,7 +1294,7 @@ de4x5_hw_init(struct net_device *dev, u_ static int de4x5_open(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int i, status = 0; s32 omr; @@ -1384,7 +1384,7 @@ de4x5_init(struct net_device *dev) static int de4x5_sw_reset(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int i, j, status = 0; s32 bmr, omr; @@ -1462,7 +1462,7 @@ de4x5_sw_reset(struct net_device *dev) static int de4x5_queue_pkt(struct sk_buff *skb, struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int status = 0; u_long flags = 0; @@ -1551,7 +1551,7 @@ de4x5_interrupt(int irq, void *dev_id, s printk ("de4x5_interrupt(): irq %d for unknown device.\n", irq); return IRQ_NONE; } - lp = (struct de4x5_private *)dev->priv; + lp = netdev_priv(dev); spin_lock(&lp->lock); iobase = dev->base_addr; @@ -1610,7 +1610,7 @@ de4x5_interrupt(int irq, void *dev_id, s static int de4x5_rx(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int entry; s32 status; @@ -1701,7 +1701,7 @@ de4x5_free_tx_buff(struct de4x5_private static int de4x5_tx(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int entry; s32 status; @@ -1753,7 +1753,7 @@ de4x5_tx(struct net_device *dev) static int de4x5_ast(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int next_tick = DE4X5_AUTOSENSE_MS; disable_ast(dev); @@ -1776,7 +1776,7 @@ de4x5_ast(struct net_device *dev) static int de4x5_txur(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int omr; @@ -1799,7 +1799,7 @@ de4x5_txur(struct net_device *dev) static int de4x5_rx_ovfc(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int omr; @@ -1820,7 +1820,7 @@ de4x5_rx_ovfc(struct net_device *dev) static int de4x5_close(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 imr, omr; @@ -1856,7 +1856,7 @@ de4x5_close(struct net_device *dev) static struct net_device_stats * de4x5_get_stats(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; lp->stats.rx_missed_errors = (int)(inl(DE4X5_MFC) & (MFC_OVFL | MFC_CNTR)); @@ -1867,7 +1867,7 @@ de4x5_get_stats(struct net_device *dev) static void de4x5_local_stats(struct net_device *dev, char *buf, int pkt_len) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int i; for (i=1; ipriv; + struct de4x5_private *lp = netdev_priv(dev); int entry = (lp->tx_new ? lp->tx_new-1 : lp->txRingSize-1); dma_addr_t buf_dma = dma_map_single(lp->gendev, buf, flags & TD_TBS1, DMA_TO_DEVICE); @@ -1927,7 +1927,7 @@ load_packet(struct net_device *dev, char static void set_multicast_list(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; /* First, double check that the adapter is open */ @@ -1957,7 +1957,7 @@ set_multicast_list(struct net_device *de static void SetMulticastFilter(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); struct dev_mc_list *dmi=dev->mc_list; u_long iobase = dev->base_addr; int i, j, bit, byte; @@ -2036,7 +2036,7 @@ static int __init de4x5_eisa_probe (stru status = -ENOMEM; goto release_reg_2; } - lp = dev->priv; + lp = netdev_priv(dev); cfid = (u32) inl(PCI_CFID); lp->cfrv = (u_short) inl(PCI_CFRV); @@ -2142,7 +2142,7 @@ srom_search(struct net_device *dev, stru u_int irq = 0, device; u_long iobase = 0; /* Clear upper 32 bits in Alphas */ int i, j, cfrv; - struct de4x5_private *lp = dev->priv; + struct de4x5_private *lp = netdev_priv(dev); struct list_head *walk = &pdev->bus_list; for (walk = walk->next; walk != &pdev->bus_list; walk = walk->next) { @@ -2245,7 +2245,7 @@ static int __devinit de4x5_pci_probe (st if (!(dev = alloc_etherdev (sizeof (struct de4x5_private)))) return -ENOMEM; - lp = dev->priv; + lp = netdev_priv(dev); lp->bus = PCI; lp->bus_num = 0; @@ -2374,7 +2374,7 @@ static struct pci_driver de4x5_pci_drive static int autoconf_media(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int next_tick = DE4X5_AUTOSENSE_MS; @@ -2415,7 +2415,7 @@ autoconf_media(struct net_device *dev) static int dc21040_autoconf(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int next_tick = DE4X5_AUTOSENSE_MS; s32 imr; @@ -2488,7 +2488,7 @@ dc21040_state(struct net_device *dev, in int next_state, int suspect_state, int (*fn)(struct net_device *, int)) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int next_tick = DE4X5_AUTOSENSE_MS; int linkBad; @@ -2527,7 +2527,7 @@ de4x5_suspect_state(struct net_device *d int (*fn)(struct net_device *, int), int (*asfn)(struct net_device *)) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int next_tick = DE4X5_AUTOSENSE_MS; int linkBad; @@ -2569,7 +2569,7 @@ de4x5_suspect_state(struct net_device *d static int dc21041_autoconf(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 sts, irqs, irq_mask, imr, omr; int next_tick = DE4X5_AUTOSENSE_MS; @@ -2771,7 +2771,7 @@ dc21041_autoconf(struct net_device *dev) static int dc21140m_autoconf(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int ana, anlpa, cap, cr, slnk, sr; int next_tick = DE4X5_AUTOSENSE_MS; u_long imr, omr, iobase = dev->base_addr; @@ -2955,7 +2955,7 @@ dc21140m_autoconf(struct net_device *dev static int dc2114x_autoconf(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 cr, anlpa, ana, cap, irqs, irq_mask, imr, omr, slnk, sr, sts; int next_tick = DE4X5_AUTOSENSE_MS; @@ -3206,7 +3206,7 @@ printk("Huh?: media:%02x\n", lp->media); static int srom_autoconf(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); return lp->infoleaf_fn(dev); } @@ -3219,7 +3219,7 @@ srom_autoconf(struct net_device *dev) static int srom_map_media(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); lp->fdx = 0; if (lp->infoblock_media == lp->media) @@ -3284,7 +3284,7 @@ srom_map_media(struct net_device *dev) static void de4x5_init_connection(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; u_long flags = 0; @@ -3313,7 +3313,7 @@ de4x5_init_connection(struct net_device static int de4x5_reset_phy(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int next_tick = 0; @@ -3347,7 +3347,7 @@ de4x5_reset_phy(struct net_device *dev) static int test_media(struct net_device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, s32 csr15, s32 msec) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 sts, csr12; @@ -3385,7 +3385,7 @@ test_media(struct net_device *dev, s32 i static int test_tp(struct net_device *dev, s32 msec) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int sisr; @@ -3414,7 +3414,7 @@ test_tp(struct net_device *dev, s32 msec static int test_for_100Mb(struct net_device *dev, int msec) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int gep = 0, ret = ((lp->chipset & ~0x00ff)==DC2114x? -1 :GEP_SLNK); if (lp->timeout < 0) { @@ -3445,7 +3445,7 @@ test_for_100Mb(struct net_device *dev, i static int wait_for_link(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); if (lp->timeout < 0) { lp->timeout = 1; @@ -3467,7 +3467,7 @@ wait_for_link(struct net_device *dev) static int test_mii_reg(struct net_device *dev, int reg, int mask, int pol, long msec) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int test; u_long iobase = dev->base_addr; @@ -3491,7 +3491,7 @@ test_mii_reg(struct net_device *dev, int static int is_spd_100(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int spd; @@ -3515,7 +3515,7 @@ is_spd_100(struct net_device *dev) static int is_100_up(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; if (lp->useMII) { @@ -3536,7 +3536,7 @@ is_100_up(struct net_device *dev) static int is_10_up(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; if (lp->useMII) { @@ -3559,7 +3559,7 @@ is_10_up(struct net_device *dev) static int is_anc_capable(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) { @@ -3578,7 +3578,7 @@ is_anc_capable(struct net_device *dev) static int ping_media(struct net_device *dev, int msec) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int sisr; @@ -3619,7 +3619,7 @@ ping_media(struct net_device *dev, int m static struct sk_buff * de4x5_alloc_rx_buff(struct net_device *dev, int index, int len) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); struct sk_buff *p; #if !defined(__alpha__) && !defined(__powerpc__) && !defined(__sparc_v9__) && !defined(DE4X5_DO_MEMCPY) @@ -3667,7 +3667,7 @@ de4x5_alloc_rx_buff(struct net_device *d static void de4x5_free_rx_buffs(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int i; for (i=0; irxRingSize; i++) { @@ -3684,7 +3684,7 @@ de4x5_free_rx_buffs(struct net_device *d static void de4x5_free_tx_buffs(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int i; for (i=0; itxRingSize; i++) { @@ -3711,7 +3711,7 @@ de4x5_free_tx_buffs(struct net_device *d static void de4x5_save_skbs(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 omr; @@ -3732,7 +3732,7 @@ de4x5_save_skbs(struct net_device *dev) static void de4x5_rst_desc_ring(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int i; s32 omr; @@ -3765,7 +3765,7 @@ de4x5_rst_desc_ring(struct net_device *d static void de4x5_cache_state(struct net_device *dev, int flag) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; switch(flag) { @@ -3795,7 +3795,7 @@ de4x5_cache_state(struct net_device *dev static void de4x5_put_cache(struct net_device *dev, struct sk_buff *skb) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); struct sk_buff *p; if (lp->cache.skb) { @@ -3812,7 +3812,7 @@ de4x5_put_cache(struct net_device *dev, static void de4x5_putb_cache(struct net_device *dev, struct sk_buff *skb) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); struct sk_buff *p = lp->cache.skb; lp->cache.skb = skb; @@ -3824,7 +3824,7 @@ de4x5_putb_cache(struct net_device *dev, static struct sk_buff * de4x5_get_cache(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); struct sk_buff *p = lp->cache.skb; if (p) { @@ -3842,7 +3842,7 @@ de4x5_get_cache(struct net_device *dev) static int test_ans(struct net_device *dev, s32 irqs, s32 irq_mask, s32 msec) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 sts, ans; @@ -3870,7 +3870,7 @@ test_ans(struct net_device *dev, s32 irq static void de4x5_setup_intr(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 imr, sts; @@ -3891,7 +3891,7 @@ de4x5_setup_intr(struct net_device *dev) static void reset_init_sia(struct net_device *dev, s32 csr13, s32 csr14, s32 csr15) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; RESET_SIA; @@ -4014,7 +4014,7 @@ static void DevicePresent(struct net_device *dev, u_long aprom_addr) { int i, j=0; - struct de4x5_private *lp = (struct de4x5_private *) dev->priv; + struct de4x5_private *lp = netdev_priv(dev); if (lp->chipset == DC21040) { if (lp->bus == EISA) { @@ -4095,7 +4095,7 @@ get_hw_addr(struct net_device *dev) u_long iobase = dev->base_addr; int broken, i, k, tmp, status = 0; u_short j,chksum; - struct de4x5_private *lp = dev->priv; + struct de4x5_private *lp = netdev_priv(dev); broken = de4x5_bad_srom(lp); @@ -4210,7 +4210,7 @@ de4x5_strncmp(char *a, char *b, int n) static void srom_repair(struct net_device *dev, int card) { - struct de4x5_private *lp = dev->priv; + struct de4x5_private *lp = netdev_priv(dev); switch(card) { case SMC: @@ -4231,7 +4231,7 @@ srom_repair(struct net_device *dev, int static int test_bad_enet(struct net_device *dev, int status) { - struct de4x5_private *lp = dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int i, tmp; for (tmp=0,i=0; idev_addr[i]; @@ -4384,7 +4384,7 @@ getfrom_srom(u_long addr) static int srom_infoleaf_info(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int i, count; u_char *p; @@ -4432,7 +4432,7 @@ srom_infoleaf_info(struct net_device *de static void srom_init(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset; u_char count; @@ -4477,7 +4477,7 @@ srom_init(struct net_device *dev) static void srom_exec(struct net_device *dev, u_char *p) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; u_char count = (p ? *p++ : 0); u_short *w = (u_short *)p; @@ -4514,7 +4514,7 @@ dc21041_infoleaf(struct net_device *dev) static int dc21140_infoleaf(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char count = 0; u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset; int next_tick = DE4X5_AUTOSENSE_MS; @@ -4552,7 +4552,7 @@ dc21140_infoleaf(struct net_device *dev) static int dc21142_infoleaf(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char count = 0; u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset; int next_tick = DE4X5_AUTOSENSE_MS; @@ -4587,7 +4587,7 @@ dc21142_infoleaf(struct net_device *dev) static int dc21143_infoleaf(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char count = 0; u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset; int next_tick = DE4X5_AUTOSENSE_MS; @@ -4625,7 +4625,7 @@ dc21143_infoleaf(struct net_device *dev) static int compact_infoblock(struct net_device *dev, u_char count, u_char *p) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char flags, csr6; /* Recursively figure out the info blocks */ @@ -4665,7 +4665,7 @@ compact_infoblock(struct net_device *dev static int type0_infoblock(struct net_device *dev, u_char count, u_char *p) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char flags, csr6, len = (*p & BLOCK_LEN)+1; /* Recursively figure out the info blocks */ @@ -4705,7 +4705,7 @@ type0_infoblock(struct net_device *dev, static int type1_infoblock(struct net_device *dev, u_char count, u_char *p) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char len = (*p & BLOCK_LEN)+1; /* Recursively figure out the info blocks */ @@ -4744,7 +4744,7 @@ type1_infoblock(struct net_device *dev, static int type2_infoblock(struct net_device *dev, u_char count, u_char *p) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char len = (*p & BLOCK_LEN)+1; /* Recursively figure out the info blocks */ @@ -4785,7 +4785,7 @@ type2_infoblock(struct net_device *dev, static int type3_infoblock(struct net_device *dev, u_char count, u_char *p) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char len = (*p & BLOCK_LEN)+1; /* Recursively figure out the info blocks */ @@ -4827,7 +4827,7 @@ type3_infoblock(struct net_device *dev, static int type4_infoblock(struct net_device *dev, u_char count, u_char *p) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char flags, csr6, len = (*p & BLOCK_LEN)+1; /* Recursively figure out the info blocks */ @@ -4872,7 +4872,7 @@ type4_infoblock(struct net_device *dev, static int type5_infoblock(struct net_device *dev, u_char count, u_char *p) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_char len = (*p & BLOCK_LEN)+1; /* Recursively figure out the info blocks */ @@ -5072,7 +5072,7 @@ mii_get_oui(u_char phyaddr, u_long ioadd static int mii_get_phy(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int i, j, k, n, limit=sizeof(phy_info)/sizeof(struct phy_table); int id; @@ -5136,7 +5136,7 @@ mii_get_phy(struct net_device *dev) static char * build_setup_frame(struct net_device *dev, int mode) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int i; char *pa = lp->setup_frame; @@ -5176,7 +5176,7 @@ enable_ast(struct net_device *dev, u32 t static void disable_ast(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); del_timer(&lp->timer); @@ -5186,7 +5186,7 @@ disable_ast(struct net_device *dev) static long de4x5_switch_mac_port(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 omr; @@ -5222,7 +5222,7 @@ de4x5_switch_mac_port(struct net_device static void gep_wr(s32 data, struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; if (lp->chipset == DC21140) { @@ -5237,7 +5237,7 @@ gep_wr(s32 data, struct net_device *dev) static int gep_rd(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; if (lp->chipset == DC21140) { @@ -5252,7 +5252,7 @@ gep_rd(struct net_device *dev) static void timeout(struct net_device *dev, void (*fn)(u_long data), u_long data, u_long msec) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int dt; /* First, cancel any pending timer events */ @@ -5275,7 +5275,7 @@ timeout(struct net_device *dev, void (*f static void yawn(struct net_device *dev, int state) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; if ((lp->chipset == DC21040) || (lp->chipset == DC21140)) return; @@ -5321,7 +5321,7 @@ yawn(struct net_device *dev, int state) static void de4x5_parse_params(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); char *p, *q, t; lp->params.fdx = 0; @@ -5364,7 +5364,7 @@ de4x5_parse_params(struct net_device *de static void de4x5_dbg_open(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); int i; if (de4x5_debug & DEBUG_OPEN) { @@ -5415,7 +5415,7 @@ de4x5_dbg_open(struct net_device *dev) static void de4x5_dbg_mii(struct net_device *dev, int k) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; if (de4x5_debug & DEBUG_MII) { @@ -5443,7 +5443,7 @@ de4x5_dbg_mii(struct net_device *dev, in static void de4x5_dbg_media(struct net_device *dev) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); if (lp->media != lp->c_media) { if (de4x5_debug & DEBUG_MEDIA) { @@ -5534,7 +5534,7 @@ de4x5_dbg_rx(struct sk_buff *skb, int le static int de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct de4x5_private *lp = (struct de4x5_private *)dev->priv; + struct de4x5_private *lp = netdev_priv(dev); struct de4x5_ioctl *ioc = (struct de4x5_ioctl *) &rq->ifr_data; u_long iobase = dev->base_addr; int i, j, status = 0; diff -puN drivers/net/tulip/dmfe.c~net_tulip_casts drivers/net/tulip/dmfe.c --- linux-264-302-priv/drivers/net/tulip/dmfe.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/dmfe.c 2004-03-02 20:32:55.000000000 -0800 @@ -392,7 +392,7 @@ static int __devinit dmfe_init_one (stru } /* Init system & device */ - db = dev->priv; + db = netdev_priv(dev); /* Allocate Tx/Rx descriptor memory */ db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr); @@ -466,7 +466,7 @@ err_out_free: static void __devexit dmfe_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - struct dmfe_board_info *db = dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); DMFE_DBUG(0, "dmfe_remove_one()", 0); @@ -494,7 +494,7 @@ static void __devexit dmfe_remove_one (s static int dmfe_open(struct DEVICE *dev) { int ret; - struct dmfe_board_info *db = dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); DMFE_DBUG(0, "dmfe_open", 0); @@ -552,7 +552,7 @@ static int dmfe_open(struct DEVICE *dev) static void dmfe_init_dm910x(struct DEVICE *dev) { - struct dmfe_board_info *db = dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); unsigned long ioaddr = db->ioaddr; DMFE_DBUG(0, "dmfe_init_dm910x()", 0); @@ -618,7 +618,7 @@ static void dmfe_init_dm910x(struct DEVI static int dmfe_start_xmit(struct sk_buff *skb, struct DEVICE *dev) { - struct dmfe_board_info *db = dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); struct tx_desc *txptr; unsigned long flags; @@ -687,7 +687,7 @@ static int dmfe_start_xmit(struct sk_buf static int dmfe_stop(struct DEVICE *dev) { - struct dmfe_board_info *db = dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); unsigned long ioaddr = dev->base_addr; DMFE_DBUG(0, "dmfe_stop", 0); @@ -730,7 +730,7 @@ static int dmfe_stop(struct DEVICE *dev) static irqreturn_t dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct DEVICE *dev = dev_id; - struct dmfe_board_info *db = (struct dmfe_board_info *) dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); unsigned long ioaddr = dev->base_addr; unsigned long flags; @@ -957,7 +957,7 @@ static void dmfe_rx_packet(struct DEVICE static struct net_device_stats * dmfe_get_stats(struct DEVICE *dev) { - struct dmfe_board_info *db = (struct dmfe_board_info *)dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); DMFE_DBUG(0, "dmfe_get_stats", 0); return &db->stats; @@ -970,7 +970,7 @@ static struct net_device_stats * dmfe_ge static void dmfe_set_filter_mode(struct DEVICE * dev) { - struct dmfe_board_info *db = dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); unsigned long flags; DMFE_DBUG(0, "dmfe_set_filter_mode()", 0); @@ -1003,7 +1003,7 @@ static void dmfe_set_filter_mode(struct static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct dmfe_board_info *np = dev->priv; + struct dmfe_board_info *np = netdev_priv(dev); strcpy(info->driver, DRV_NAME); strcpy(info->version, DRV_VERSION); @@ -1028,7 +1028,7 @@ static void dmfe_timer(unsigned long dat u32 tmp_cr8; unsigned char tmp_cr12; struct DEVICE *dev = (struct DEVICE *) data; - struct dmfe_board_info *db = (struct dmfe_board_info *) dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); unsigned long flags; DMFE_DBUG(0, "dmfe_timer()", 0); @@ -1160,7 +1160,7 @@ static void dmfe_timer(unsigned long dat static void dmfe_dynamic_reset(struct DEVICE *dev) { - struct dmfe_board_info *db = dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); DMFE_DBUG(0, "dmfe_dynamic_reset()", 0); @@ -1358,7 +1358,7 @@ static void dm9132_id_table(struct DEVIC static void send_filter_frame(struct DEVICE *dev, int mc_cnt) { - struct dmfe_board_info *db = dev->priv; + struct dmfe_board_info *db = netdev_priv(dev); struct dev_mc_list *mcptr; struct tx_desc *txptr; u16 * addrptr; diff -puN drivers/net/tulip/eeprom.c~net_tulip_casts drivers/net/tulip/eeprom.c --- linux-264-302-priv/drivers/net/tulip/eeprom.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/eeprom.c 2004-03-02 20:44:17.000000000 -0800 @@ -136,7 +136,7 @@ void __devinit tulip_parse_eeprom(struct static struct mediatable *last_mediatable; static unsigned char *last_ee_data; static int controller_index; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); unsigned char *ee_data = tp->eeprom; int i; diff -puN drivers/net/tulip/interrupt.c~net_tulip_casts drivers/net/tulip/interrupt.c --- linux-264-302-priv/drivers/net/tulip/interrupt.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/interrupt.c 2004-03-02 20:37:57.000000000 -0800 @@ -63,7 +63,7 @@ unsigned int mit_table[MIT_SIZE+1] = int tulip_refill_rx(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); int entry; int refilled = 0; @@ -109,7 +109,7 @@ void oom_timer(unsigned long data) int tulip_poll(struct net_device *dev, int *budget) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); int entry = tp->cur_rx % RX_RING_SIZE; int rx_work_limit = *budget; int received = 0; @@ -354,7 +354,7 @@ done: static int tulip_rx(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); int entry = tp->cur_rx % RX_RING_SIZE; int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx; int received = 0; @@ -465,7 +465,7 @@ static inline unsigned int phy_interrupt { #ifdef __hppa__ int csr12 = inl(dev->base_addr + CSR12) & 0xff; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); if (csr12 != tp->csr12_shadow) { /* ack interrupt */ @@ -490,7 +490,7 @@ static inline unsigned int phy_interrupt irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_instance; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int csr5; int missed; diff -puN drivers/net/tulip/media.c~net_tulip_casts drivers/net/tulip/media.c --- linux-264-302-priv/drivers/net/tulip/media.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/media.c 2004-03-02 20:42:38.000000000 -0800 @@ -48,7 +48,7 @@ static const unsigned char comet_miireg2 int tulip_mdio_read(struct net_device *dev, int phy_id, int location) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); int i; int read_cmd = (0xf6 << 10) | ((phy_id & 0x1f) << 5) | location; int retval = 0; @@ -111,7 +111,7 @@ int tulip_mdio_read(struct net_device *d void tulip_mdio_write(struct net_device *dev, int phy_id, int location, int val) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); int i; int cmd = (0x5002 << 16) | ((phy_id & 0x1f) << 23) | (location<<18) | (val & 0xffff); long ioaddr = dev->base_addr; @@ -171,7 +171,7 @@ void tulip_mdio_write(struct net_device void tulip_select_media(struct net_device *dev, int startup) { long ioaddr = dev->base_addr; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); struct mediatable *mtable = tp->mtable; u32 new_csr6; int i; @@ -374,7 +374,7 @@ void tulip_select_media(struct net_devic */ int tulip_check_duplex(struct net_device *dev) { - struct tulip_private *tp = dev->priv; + struct tulip_private *tp = netdev_priv(dev); unsigned int bmsr, lpa, negotiated, new_csr6; bmsr = tulip_mdio_read(dev, tp->phys[0], MII_BMSR); @@ -420,7 +420,7 @@ int tulip_check_duplex(struct net_device void __devinit tulip_find_mii (struct net_device *dev, int board_idx) { - struct tulip_private *tp = dev->priv; + struct tulip_private *tp = netdev_priv(dev); int phyn, phy_idx = 0; int mii_reg0; int mii_advert; diff -puN drivers/net/tulip/pnic2.c~net_tulip_casts drivers/net/tulip/pnic2.c --- linux-264-302-priv/drivers/net/tulip/pnic2.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/pnic2.c 2004-03-02 20:43:57.000000000 -0800 @@ -84,7 +84,7 @@ void pnic2_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int next_tick = 60*HZ; @@ -100,7 +100,7 @@ void pnic2_timer(unsigned long data) void pnic2_start_nway(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int csr14; int csr12; @@ -175,7 +175,7 @@ void pnic2_start_nway(struct net_device void pnic2_lnk_change(struct net_device *dev, int csr5) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int csr14; diff -puN drivers/net/tulip/pnic.c~net_tulip_casts drivers/net/tulip/pnic.c --- linux-264-302-priv/drivers/net/tulip/pnic.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/pnic.c 2004-03-02 20:33:51.000000000 -0800 @@ -20,7 +20,7 @@ void pnic_do_nway(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; u32 phy_reg = inl(ioaddr + 0xB8); u32 new_csr6 = tp->csr6 & ~0x40C40200; @@ -53,7 +53,7 @@ void pnic_do_nway(struct net_device *dev void pnic_lnk_change(struct net_device *dev, int csr5) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int phy_reg = inl(ioaddr + 0xB8); @@ -89,7 +89,7 @@ void pnic_lnk_change(struct net_device * void pnic_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int next_tick = 60*HZ; diff -puN drivers/net/tulip/timer.c~net_tulip_casts drivers/net/tulip/timer.c --- linux-264-302-priv/drivers/net/tulip/timer.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/timer.c 2004-03-02 20:43:05.000000000 -0800 @@ -20,7 +20,7 @@ void tulip_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; u32 csr12 = inl(ioaddr + CSR12); int next_tick = 2*HZ; @@ -135,7 +135,7 @@ void tulip_timer(unsigned long data) void mxic_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int next_tick = 60*HZ; @@ -152,7 +152,7 @@ void mxic_timer(unsigned long data) void comet_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int next_tick = 60*HZ; diff -puN drivers/net/tulip/tulip_core.c~net_tulip_casts drivers/net/tulip/tulip_core.c --- linux-264-302-priv/drivers/net/tulip/tulip_core.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/tulip_core.c 2004-03-02 20:36:35.000000000 -0800 @@ -276,7 +276,7 @@ static void tulip_set_power_state (struc static void tulip_up(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int next_tick = 3*HZ; int i; @@ -499,7 +499,7 @@ tulip_open(struct net_device *dev) static void tulip_tx_timeout(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; unsigned long flags; @@ -587,7 +587,7 @@ static void tulip_tx_timeout(struct net_ /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ static void tulip_init_ring(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); int i; tp->susp_rx = 0; @@ -638,7 +638,7 @@ static void tulip_init_ring(struct net_d static int tulip_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); int entry; u32 flag; dma_addr_t mapping; @@ -724,7 +724,7 @@ static void tulip_clean_tx_ring(struct t static void tulip_down (struct net_device *dev) { long ioaddr = dev->base_addr; - struct tulip_private *tp = (struct tulip_private *) dev->priv; + struct tulip_private *tp = netdev_priv(dev); unsigned long flags; del_timer_sync (&tp->timer); @@ -764,7 +764,7 @@ static void tulip_down (struct net_devic static int tulip_close (struct net_device *dev) { long ioaddr = dev->base_addr; - struct tulip_private *tp = (struct tulip_private *) dev->priv; + struct tulip_private *tp = netdev_priv(dev); int i; netif_stop_queue (dev); @@ -811,7 +811,7 @@ static int tulip_close (struct net_devic static struct net_device_stats *tulip_get_stats(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; if (netif_running(dev)) { @@ -830,7 +830,7 @@ static struct net_device_stats *tulip_ge static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) { - struct tulip_private *np = dev->priv; + struct tulip_private *np = netdev_priv(dev); u32 ethcmd; if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) @@ -855,7 +855,7 @@ static int netdev_ethtool_ioctl(struct n /* Provide ioctl() calls to examine the MII xcvr state. */ static int private_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) { - struct tulip_private *tp = dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; const unsigned int phy_idx = 0; @@ -964,7 +964,7 @@ static int private_ioctl (struct net_dev static void build_setup_frame_hash(u16 *setup_frm, struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); u16 hash_table[32]; struct dev_mc_list *mclist; int i; @@ -995,7 +995,7 @@ static void build_setup_frame_hash(u16 * static void build_setup_frame_perfect(u16 *setup_frm, struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); struct dev_mc_list *mclist; int i; u16 *eaddrs; @@ -1023,7 +1023,7 @@ static void build_setup_frame_perfect(u1 static void set_rx_mode(struct net_device *dev) { - struct tulip_private *tp = (struct tulip_private *)dev->priv; + struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; int csr6; @@ -1150,7 +1150,7 @@ static void set_rx_mode(struct net_devic static void __devinit tulip_mwi_config (struct pci_dev *pdev, struct net_device *dev) { - struct tulip_private *tp = dev->priv; + struct tulip_private *tp = netdev_priv(dev); u8 cache; u16 pci_command; u32 csr0; @@ -1373,7 +1373,7 @@ static int __devinit tulip_init_one (str * initialize private data structure 'tp' * it is zeroed and aligned in alloc_etherdev */ - tp = dev->priv; + tp = netdev_priv(dev); tp->rx_ring = pci_alloc_consistent(pdev, sizeof(struct tulip_rx_desc) * RX_RING_SIZE + @@ -1756,7 +1756,7 @@ static void __devexit tulip_remove_one ( if (!dev) return; - tp = dev->priv; + tp = netdev_priv(dev); pci_free_consistent (pdev, sizeof (struct tulip_rx_desc) * RX_RING_SIZE + sizeof (struct tulip_tx_desc) * TX_RING_SIZE, diff -puN drivers/net/tulip/xircom_cb.c~net_tulip_casts drivers/net/tulip/xircom_cb.c --- linux-264-302-priv/drivers/net/tulip/xircom_cb.c~net_tulip_casts 2004-03-02 20:28:49.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/tulip/xircom_cb.c 2004-03-02 20:46:11.000000000 -0800 @@ -178,7 +178,7 @@ static void print_binary(unsigned int nu static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct xircom_private *private = dev->priv; + struct xircom_private *private = netdev_priv(dev); strcpy(info->driver, "xircom_cb"); strcpy(info->bus_info, pci_name(private->pdev)); @@ -235,7 +235,7 @@ static int __devinit xircom_probe(struct printk(KERN_ERR "xircom_probe: failed to allocate etherdev\n"); goto device_fail; } - private = dev->priv; + private = netdev_priv(dev); /* Allocate the send/receive buffers */ private->rx_buffer = pci_alloc_consistent(pdev,8192,&private->rx_dma_handle); @@ -312,7 +312,7 @@ device_fail: static void __devexit xircom_remove(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - struct xircom_private *card = dev->priv; + struct xircom_private *card = netdev_priv(dev); enter("xircom_remove"); pci_free_consistent(pdev,8192,card->rx_buffer,card->rx_dma_handle); @@ -328,7 +328,7 @@ static void __devexit xircom_remove(stru static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_instance; - struct xircom_private *card = (struct xircom_private *) dev->priv; + struct xircom_private *card = netdev_priv(dev); unsigned int status; int i; @@ -385,7 +385,7 @@ static int xircom_start_xmit(struct sk_b int desc; enter("xircom_start_xmit"); - card = (struct xircom_private*)dev->priv; + card = netdev_priv(dev); spin_lock_irqsave(&card->lock,flags); /* First see if we can free some descriptors */ @@ -444,7 +444,7 @@ static int xircom_start_xmit(struct sk_b static int xircom_open(struct net_device *dev) { - struct xircom_private *xp = (struct xircom_private *) dev->priv; + struct xircom_private *xp = netdev_priv(dev); int retval; enter("xircom_open"); printk(KERN_INFO "xircom cardbus adaptor found, registering as %s, using irq %i \n",dev->name,dev->irq); @@ -466,7 +466,7 @@ static int xircom_close(struct net_devic unsigned long flags; enter("xircom_close"); - card = dev->priv; + card = netdev_priv(dev); netif_stop_queue(dev); /* we don't want new packets */ @@ -495,7 +495,7 @@ static int xircom_close(struct net_devic static struct net_device_stats *xircom_get_stats(struct net_device *dev) { - struct xircom_private *card = (struct xircom_private *)dev->priv; + struct xircom_private *card = netdev_priv(dev); return &card->stats; } _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:20:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:20:56 -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 i24LKjKO019233 for ; Thu, 4 Mar 2004 13:20:46 -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 i24LKeE29317 for ; Thu, 4 Mar 2004 13:20:40 -0800 Date: Thu, 4 Mar 2004 13:19:48 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in net/wan drivers Message-Id: <20040304131948.36158994.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: 3751 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: 20168 Lines: 576 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/wan/comx-hw-locomx.c | 22 +++--- linux-264-302-priv-rddunlap/drivers/net/wan/comx-hw-munich.c | 32 ++++---- linux-264-302-priv-rddunlap/drivers/net/wan/comx.c | 40 +++++------ linux-264-302-priv-rddunlap/drivers/net/wan/cosa.c | 20 ++--- linux-264-302-priv-rddunlap/drivers/net/wan/lapbether.c | 10 +- 5 files changed, 62 insertions(+), 62 deletions(-) diff -puN drivers/net/wan/comx.c~net_wan_casts drivers/net/wan/comx.c --- linux-264-302-priv/drivers/net/wan/comx.c~net_wan_casts 2004-03-03 09:12:10.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/wan/comx.c 2004-03-03 09:30:17.000000000 -0800 @@ -119,7 +119,7 @@ struct comx_debugflags_struct comx_debug int comx_debug(struct net_device *dev, char *fmt, ...) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); char *page,*str; va_list args; int len; @@ -162,7 +162,7 @@ int comx_debug(struct net_device *dev, c int comx_debug_skb(struct net_device *dev, struct sk_buff *skb, char *msg) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); if (!ch->debug_area) return 0; if (!skb) comx_debug(dev, "%s: %s NULL skb\n\n", dev->name, msg); @@ -175,7 +175,7 @@ int comx_debug_bytes(struct net_device * char *msg) { int pos = 0; - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); if (!ch->debug_area) return 0; @@ -207,7 +207,7 @@ int comx_debug_bytes(struct net_device * static void comx_loadavg_timerfun(unsigned long d) { struct net_device *dev = (struct net_device *)d; - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); ch->avg_bytes[ch->loadavg_counter] = ch->current_stats->rx_bytes; ch->avg_bytes[ch->loadavg_counter + ch->loadavg_size] = @@ -222,7 +222,7 @@ static void comx_loadavg_timerfun(unsign static void comx_reset_timerfun(unsigned long d) { struct net_device *dev = (struct net_device *)d; - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); if(!(ch->line_status & (PROTO_LOOP | PROTO_UP))) { if(test_and_set_bit(0,&ch->reset_pending) && ch->HW_reset) { @@ -236,7 +236,7 @@ static void comx_reset_timerfun(unsigned static int comx_open(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct proc_dir_entry *comxdir = ch->procdir->subdir; int ret=0; @@ -268,7 +268,7 @@ static int comx_open(struct net_device * static int comx_close(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct proc_dir_entry *comxdir = ch->procdir->subdir; int ret = -ENODEV; @@ -303,7 +303,7 @@ static int comx_close(struct net_device void comx_status(struct net_device *dev, int status) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); #if 0 if(status & (PROTO_UP | PROTO_LOOP)) { @@ -321,7 +321,7 @@ void comx_status(struct net_device *dev, static int comx_xmit(struct sk_buff *skb, struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); int rc; if (skb->len > dev->mtu + dev->hard_header_len) { @@ -342,7 +342,7 @@ static int comx_xmit(struct sk_buff *skb static int comx_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); if (ch->LINE_header) { return (ch->LINE_header(skb, dev, type, daddr, saddr, len)); @@ -354,7 +354,7 @@ static int comx_header(struct sk_buff *s static int comx_rebuild_header(struct sk_buff *skb) { struct net_device *dev = skb->dev; - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); if (ch->LINE_rebuild_header) { return(ch->LINE_rebuild_header(skb)); @@ -365,7 +365,7 @@ static int comx_rebuild_header(struct sk int comx_rx(struct net_device *dev, struct sk_buff *skb) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); if (ch->debug_flags & DEBUG_COMX_RX) { comx_debug_skb(dev, skb, "comx_rx skb"); @@ -379,7 +379,7 @@ int comx_rx(struct net_device *dev, stru static struct net_device_stats *comx_stats(struct net_device *dev) { - struct comx_channel *ch = (struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); return ch->current_stats; } @@ -387,7 +387,7 @@ static struct net_device_stats *comx_sta void comx_lineup_func(unsigned long d) { struct net_device *dev = (struct net_device *)d; - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); del_timer(&ch->lineup_timer); clear_bit(0, &ch->lineup_pending); @@ -405,7 +405,7 @@ void comx_lineup_func(unsigned long d) static int comx_statistics(struct net_device *dev, char *page) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); int len = 0; int tmp; int i = 0; @@ -472,7 +472,7 @@ static int comx_statistics(struct net_de static int comx_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); if (ch->LINE_ioctl) { return(ch->LINE_ioctl(dev, ifr, cmd)); @@ -535,7 +535,7 @@ static int comx_read_proc(char *page, ch { struct proc_dir_entry *file = (struct proc_dir_entry *)data; struct net_device *dev = file->parent->data; - struct comx_channel *ch=(struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); int len = 0; if (strcmp(file->name, FILENAME_STATUS) == 0) { @@ -599,7 +599,7 @@ static int comx_write_proc(struct file * { struct proc_dir_entry *entry = (struct proc_dir_entry *)data; struct net_device *dev = (struct net_device *)entry->parent->data; - struct comx_channel *ch=(struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); char *page; struct comx_hardware *hw = comx_channels; struct comx_protocol *line = comx_lines; @@ -821,7 +821,7 @@ static int comx_mkdir(struct inode *dir, if (register_netdevice(dev)) { goto cleanup_filename_debug; } - ch=dev->priv; + ch = netdev_priv(dev); if((ch->if_ptr = (void *)kmalloc(sizeof(struct ppp_device), GFP_KERNEL)) == NULL) { goto cleanup_register; @@ -874,7 +874,7 @@ static int comx_rmdir(struct inode *dir, lock_kernel(); dev = entry->data; - ch = dev->priv; + ch = netdev_priv(dev); if (dev->flags & IFF_UP) { printk(KERN_ERR "%s: down interface before removing it\n", dev->name); unlock_kernel(); diff -puN drivers/net/wan/comx-hw-locomx.c~net_wan_casts drivers/net/wan/comx-hw-locomx.c --- linux-264-302-priv/drivers/net/wan/comx-hw-locomx.c~net_wan_casts 2004-03-03 09:12:10.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/wan/comx-hw-locomx.c 2004-03-03 09:42:59.000000000 -0800 @@ -77,7 +77,7 @@ struct locomx_data { static int LOCOMX_txe(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct locomx_data *hw = ch->HW_privdata; return (!hw->board.chanA.tx_next_skb); @@ -86,8 +86,8 @@ static int LOCOMX_txe(struct net_device static void locomx_rx(struct z8530_channel *c, struct sk_buff *skb) { - struct net_device *dev=c->netdevice; - struct comx_channel *ch=dev->priv; + struct net_device *dev = c->netdevice; + struct comx_channel *ch = netdev_priv(dev); if (ch->debug_flags & DEBUG_HW_RX) { comx_debug_skb(dev, skb, "locomx_rx receiving"); @@ -97,7 +97,7 @@ static void locomx_rx(struct z8530_chann static int LOCOMX_send_packet(struct net_device *dev, struct sk_buff *skb) { - struct comx_channel *ch = (struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct locomx_data *hw = ch->HW_privdata; if (ch->debug_flags & DEBUG_HW_TX) { @@ -126,9 +126,9 @@ static int LOCOMX_send_packet(struct net static void locomx_status_timerfun(unsigned long d) { - struct net_device *dev=(struct net_device *)d; - struct comx_channel *ch=dev->priv; - struct locomx_data *hw=ch->HW_privdata; + struct net_device *dev = (struct net_device *)d; + struct comx_channel *ch = netdev_priv(dev); + struct locomx_data *hw = ch->HW_privdata; if(!(ch->line_status & LINE_UP) && (hw->board.chanA.status & CTS)) { @@ -144,7 +144,7 @@ static void locomx_status_timerfun(unsig static int LOCOMX_open(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct locomx_data *hw = ch->HW_privdata; struct proc_dir_entry *procfile = ch->procdir->subdir; unsigned long flags; @@ -256,7 +256,7 @@ irq_fail: static int LOCOMX_close(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct locomx_data *hw = ch->HW_privdata; struct proc_dir_entry *procfile = ch->procdir->subdir; @@ -376,7 +376,7 @@ static int locomx_write_proc(struct file static int LOCOMX_init(struct net_device *dev) { - struct comx_channel *ch = (struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct locomx_data *hw; struct proc_dir_entry *new_file; @@ -449,7 +449,7 @@ cleanup_HW_privdata: static int LOCOMX_exit(struct net_device *dev) { - struct comx_channel *ch = (struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); ch->HW_access_board = NULL; ch->HW_release_board = NULL; diff -puN drivers/net/wan/comx-hw-munich.c~net_wan_casts drivers/net/wan/comx-hw-munich.c --- linux-264-302-priv/drivers/net/wan/comx-hw-munich.c~net_wan_casts 2004-03-03 09:12:10.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/wan/comx-hw-munich.c 2004-03-03 09:32:01.000000000 -0800 @@ -373,7 +373,7 @@ static munich_board_t pcicom_boards[MAX_ void rework_idle_channels(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw = ch->HW_privdata; munich_board_t *board = slicecom_boards + hw->boardnum; munich_ccb_t *ccb = board->ccb; @@ -731,7 +731,7 @@ static void pcicom_modemline(unsigned lo { munich_board_t *board = (munich_board_t *) b; struct net_device *dev = board->twins[0]; - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); unsigned long regs; regs = readl((void *)(&board->bar1[GPDATA])); @@ -765,7 +765,7 @@ static void pcicom_modemline(unsigned lo static int MUNICH_txe(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw = ch->HW_privdata; return (hw->busy < TX_DESC_MAX - 1); @@ -905,7 +905,7 @@ static int munich_probe(void) #if 0 static int slicecom_reset(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); printk("slicecom_reset: resetting the hardware\n"); @@ -933,7 +933,7 @@ static int slicecom_reset(struct net_dev static int MUNICH_send_packet(struct net_device *dev, struct sk_buff *skb) { - struct comx_channel *ch = (struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw = ch->HW_privdata; /* Send it to the debug facility too if needed: */ @@ -1085,7 +1085,7 @@ static irqreturn_t MUNICH_interrupt(int goto go_for_next_interrupt; } - ch = (struct comx_channel *)dev->priv; + ch = netdev_priv(dev); hw = (struct slicecom_privdata *)ch->HW_privdata; // printk("Rx STAT=0x%08x int_info=0x%08x rx_desc_ptr=%d rx_desc.status=0x%01x\n", @@ -1125,7 +1125,7 @@ static irqreturn_t MUNICH_interrupt(int if (dev != NULL) { - ch = (struct comx_channel *)dev->priv; + ch = netdev_priv(dev); hw = (struct slicecom_privdata *)ch->HW_privdata; rx_status = hw->rx_desc[hw->rx_desc_ptr].status; @@ -1261,7 +1261,7 @@ static irqreturn_t MUNICH_interrupt(int goto go_for_next_tx_interrupt; } - ch = (struct comx_channel *)dev->priv; + ch = netdev_priv(dev); hw = (struct slicecom_privdata *)ch->HW_privdata; // printk("Tx STAT=0x%08x int_info=0x%08x tiq_ptr=%d\n", stat, int_info.all, board->tiq_ptr ); @@ -1295,7 +1295,7 @@ static irqreturn_t MUNICH_interrupt(int { int newbusy; - ch = (struct comx_channel *)dev->priv; + ch = netdev_priv(dev); hw = (struct slicecom_privdata *)ch->HW_privdata; /* We don't trust the "Tx available" info from the TIQ, but check */ @@ -1398,7 +1398,7 @@ static irqreturn_t MUNICH_interrupt(int static int MUNICH_open(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw = ch->HW_privdata; struct proc_dir_entry *procfile = ch->procdir->subdir; munich_board_t *board; @@ -1891,7 +1891,7 @@ static int MUNICH_open(struct net_device static int MUNICH_close(struct net_device *dev) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw = ch->HW_privdata; struct proc_dir_entry *procfile = ch->procdir->subdir; munich_board_t *board; @@ -2028,7 +2028,7 @@ static int MUNICH_close(struct net_devic static int MUNICH_minden(struct net_device *dev, char *page) { - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw = ch->HW_privdata; munich_board_t *board; struct net_device *devp; @@ -2290,7 +2290,7 @@ static int munich_read_proc(char *page, { struct proc_dir_entry *file = (struct proc_dir_entry *)data; struct net_device *dev = file->parent->data; - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw = ch->HW_privdata; munich_board_t *board; @@ -2388,7 +2388,7 @@ static int munich_write_proc(struct file { struct proc_dir_entry *entry = (struct proc_dir_entry *)data; struct net_device *dev = (struct net_device *)entry->parent->data; - struct comx_channel *ch = dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw = ch->HW_privdata; munich_board_t *board; @@ -2656,7 +2656,7 @@ static int init_escape(struct comx_chann static int BOARD_init(struct net_device *dev) { - struct comx_channel *ch = (struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); struct slicecom_privdata *hw; struct proc_dir_entry *new_file; @@ -2772,7 +2772,7 @@ static int BOARD_init(struct net_device */ static int BOARD_exit(struct net_device *dev) { - struct comx_channel *ch = (struct comx_channel *)dev->priv; + struct comx_channel *ch = netdev_priv(dev); /* Free private data area */ // board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards); diff -puN drivers/net/wan/cosa.c~net_wan_casts drivers/net/wan/cosa.c --- linux-264-302-priv/drivers/net/wan/cosa.c~net_wan_casts 2004-03-03 09:12:10.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/wan/cosa.c 2004-03-03 09:26:33.000000000 -0800 @@ -639,7 +639,7 @@ static void sppp_channel_delete(struct c static int cosa_sppp_open(struct net_device *d) { - struct channel_data *chan = d->priv; + struct channel_data *chan = netdev_priv(d); int err; unsigned long flags; @@ -679,7 +679,7 @@ static int cosa_sppp_open(struct net_dev static int cosa_sppp_tx(struct sk_buff *skb, struct net_device *dev) { - struct channel_data *chan = dev->priv; + struct channel_data *chan = netdev_priv(dev); netif_stop_queue(dev); @@ -690,7 +690,7 @@ static int cosa_sppp_tx(struct sk_buff * static void cosa_sppp_timeout(struct net_device *dev) { - struct channel_data *chan = dev->priv; + struct channel_data *chan = netdev_priv(dev); if (test_bit(RXBIT, &chan->cosa->rxtx)) { chan->stats.rx_errors++; @@ -709,7 +709,7 @@ static void cosa_sppp_timeout(struct net static int cosa_sppp_close(struct net_device *d) { - struct channel_data *chan = d->priv; + struct channel_data *chan = netdev_priv(d); unsigned long flags; netif_stop_queue(d); @@ -789,7 +789,7 @@ static int sppp_tx_done(struct channel_d static struct net_device_stats *cosa_net_stats(struct net_device *dev) { - struct channel_data *chan = dev->priv; + struct channel_data *chan = netdev_priv(dev); return &chan->stats; } @@ -807,7 +807,7 @@ static ssize_t cosa_read(struct file *fi { DECLARE_WAITQUEUE(wait, current); unsigned long flags; - struct channel_data *chan = (struct channel_data *)file->private_data; + struct channel_data *chan = file->private_data; struct cosa_data *cosa = chan->cosa; char *kbuf; @@ -881,7 +881,7 @@ static ssize_t cosa_write(struct file *f const char *buf, size_t count, loff_t *ppos) { DECLARE_WAITQUEUE(wait, current); - struct channel_data *chan = (struct channel_data *)file->private_data; + struct channel_data *chan = file->private_data; struct cosa_data *cosa = chan->cosa; unsigned long flags; char *kbuf; @@ -990,7 +990,7 @@ static int cosa_open(struct inode *inode static int cosa_release(struct inode *inode, struct file *file) { - struct channel_data *channel = (struct channel_data *)file->private_data; + struct channel_data *channel = file->private_data; struct cosa_data *cosa; unsigned long flags; @@ -1205,7 +1205,7 @@ static int cosa_sppp_ioctl(struct net_de int cmd) { int rv; - struct channel_data *chan = (struct channel_data *)dev->priv; + struct channel_data *chan = netdev_priv(dev); rv = cosa_ioctl_common(chan->cosa, chan, cmd, (unsigned long)ifr->ifr_data); if (rv == -ENOIOCTLCMD) { return sppp_do_ioctl(dev, ifr, cmd); @@ -1216,7 +1216,7 @@ static int cosa_sppp_ioctl(struct net_de static int cosa_chardev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct channel_data *channel = (struct channel_data *)file->private_data; + struct channel_data *channel = file->private_data; struct cosa_data *cosa = channel->cosa; return cosa_ioctl_common(cosa, channel, cmd, arg); } diff -puN drivers/net/wan/lapbether.c~net_wan_casts drivers/net/wan/lapbether.c --- linux-264-302-priv/drivers/net/wan/lapbether.c~net_wan_casts 2004-03-03 09:12:10.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/wan/lapbether.c 2004-03-03 09:37:46.000000000 -0800 @@ -198,7 +198,7 @@ drop: static void lapbeth_data_transmit(struct net_device *ndev, struct sk_buff *skb) { - struct lapbethdev *lapbeth = ndev->priv; + struct lapbethdev *lapbeth = netdev_priv(ndev); unsigned char *ptr; struct net_device *dev; int size = skb->len; @@ -269,7 +269,7 @@ static void lapbeth_disconnected(struct */ static struct net_device_stats *lapbeth_get_stats(struct net_device *dev) { - struct lapbethdev *lapbeth = (struct lapbethdev *)dev->priv; + struct lapbethdev *lapbeth = netdev_priv(dev); return &lapbeth->stats; } @@ -278,7 +278,7 @@ static struct net_device_stats *lapbeth_ */ static int lapbeth_set_mac_address(struct net_device *dev, void *addr) { - struct sockaddr *sa = (struct sockaddr *)addr; + struct sockaddr *sa = addr; memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); return 0; } @@ -355,7 +355,7 @@ static int lapbeth_new_device(struct net if (!ndev) goto out; - lapbeth = ndev->priv; + lapbeth = netdev_priv(ndev); lapbeth->axdev = ndev; dev_hold(dev); @@ -397,7 +397,7 @@ static int lapbeth_device_event(struct n unsigned long event, void *ptr) { struct lapbethdev *lapbeth; - struct net_device *dev = (struct net_device *)ptr; + struct net_device *dev = ptr; if (!dev_is_ethdev(dev)) return NOTIFY_DONE; _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:21:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:21:11 -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 i24LKwKO019390 for ; Thu, 4 Mar 2004 13:20:58 -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 i24LKqE29407 for ; Thu, 4 Mar 2004 13:20:52 -0800 Date: Thu, 4 Mar 2004 13:20:00 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in net/wireless/ drivers Message-Id: <20040304132000.623fcda4.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: 3752 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: 27609 Lines: 817 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/wireless/atmel.c | 72 ++++----- linux-264-302-priv-rddunlap/drivers/net/wireless/orinoco.c | 104 ++++++------- 2 files changed, 88 insertions(+), 88 deletions(-) diff -puN drivers/net/wireless/atmel.c~net_wireless_casts drivers/net/wireless/atmel.c --- linux-264-302-priv/drivers/net/wireless/atmel.c~net_wireless_casts 2004-03-03 10:02:14.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/wireless/atmel.c 2004-03-03 10:24:16.000000000 -0800 @@ -796,7 +796,7 @@ static void tx_update_descriptor(struct static int start_tx (struct sk_buff *skb, struct net_device *dev) { - struct atmel_private *priv = (struct atmel_private *)dev->priv; + struct atmel_private *priv = netdev_priv(dev); struct ieee802_11_hdr header; unsigned long flags; u16 buff, frame_ctl, len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN; @@ -1167,7 +1167,7 @@ static void reset_irq_status(struct atme static irqreturn_t service_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; - struct atmel_private *priv = (struct atmel_private *) dev->priv; + struct atmel_private *priv = netdev_priv(dev); u8 isr; if (priv->card && priv->present_callback && @@ -1234,13 +1234,13 @@ static irqreturn_t service_interrupt(int static struct net_device_stats *atmel_get_stats (struct net_device *dev) { - struct atmel_private *priv = (struct atmel_private *)dev->priv; + struct atmel_private *priv = netdev_priv(dev); return &priv->stats; } static struct iw_statistics *atmel_get_wireless_stats (struct net_device *dev) { - struct atmel_private *priv = (struct atmel_private *)dev->priv; + struct atmel_private *priv = netdev_priv(dev); /* update the link quality here in case we are seeing no beacons at all to drive the process */ @@ -1287,7 +1287,7 @@ static int atmel_set_mac_address(struct static int atmel_open (struct net_device *dev) { - struct atmel_private *priv = (struct atmel_private *) dev->priv; + struct atmel_private *priv = netdev_priv(dev); priv->station_state = STATION_STATE_INITIALIZING; if (!reset_atmel_card(dev)) { priv->station_state = STATION_STATE_DOWN; @@ -1298,7 +1298,7 @@ static int atmel_open (struct net_device static int atmel_close (struct net_device *dev) { - struct atmel_private *priv = (struct atmel_private *) dev->priv; + struct atmel_private *priv = netdev_priv(dev); netif_carrier_off(dev); if (netif_running(dev)) @@ -1378,7 +1378,7 @@ static int atmel_proc_output (char *buf, static int atmel_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { - struct atmel_private *priv = (struct atmel_private *)data; + struct atmel_private *priv = data; int len = atmel_proc_output (page, priv); if (len <= off+count) *eof = 1; *start = page + off; @@ -1406,7 +1406,7 @@ struct net_device *init_atmel_card( unsi goto err_out_free; } - priv = dev->priv; + priv = netdev_priv(dev); priv->dev = dev; priv->sys_dev = sys_dev; priv->present_callback = card_present; @@ -1525,7 +1525,7 @@ EXPORT_SYMBOL(init_atmel_card); void stop_atmel_card(struct net_device *dev, int freeres) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); /* put a brick on it... */ if (priv->bus_type == BUS_TYPE_PCCARD) @@ -1582,7 +1582,7 @@ static int atmel_set_essid(struct net_de struct iw_point *dwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); /* Check if we asked for `any' */ if(dwrq->flags == 0) { @@ -1610,7 +1610,7 @@ static int atmel_get_essid(struct net_de struct iw_point *dwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); /* Get the current SSID */ if (priv->SSID_size == 0) { @@ -1633,7 +1633,7 @@ static int atmel_get_wap(struct net_devi struct sockaddr *awrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); memcpy(awrq->sa_data, priv->CurrentBSSID, 6); awrq->sa_family = ARPHRD_ETHER; @@ -1645,7 +1645,7 @@ static int atmel_set_encode(struct net_d struct iw_point *dwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); /* Basic checking: do we have a key to set ? * Note : with the new API, it's impossible to get a NULL pointer. @@ -1736,7 +1736,7 @@ static int atmel_get_encode(struct net_d struct iw_point *dwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; if (!priv->wep_is_on) @@ -1776,7 +1776,7 @@ static int atmel_set_rate(struct net_dev struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); if (vwrq->fixed == 0) { priv->tx_rate = 3; @@ -1808,7 +1808,7 @@ static int atmel_set_mode(struct net_dev __u32 *uwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); if (*uwrq != IW_MODE_ADHOC && *uwrq != IW_MODE_INFRA) return -EINVAL; @@ -1822,7 +1822,7 @@ static int atmel_get_mode(struct net_dev __u32 *uwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); *uwrq = priv->operating_mode; return 0; @@ -1833,7 +1833,7 @@ static int atmel_get_rate(struct net_dev struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); if (priv->auto_tx_rate) { vwrq->fixed = 0; @@ -1855,7 +1855,7 @@ static int atmel_set_power(struct net_de struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); priv->power_mode = vwrq->disabled ? 0 : 1; return -EINPROGRESS; } @@ -1865,7 +1865,7 @@ static int atmel_get_power(struct net_de struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); vwrq->disabled = priv->power_mode ? 0 : 1; vwrq->flags = IW_POWER_ON; return 0; @@ -1876,7 +1876,7 @@ static int atmel_set_retry(struct net_de struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); if(!vwrq->disabled && (vwrq->flags & IW_RETRY_LIMIT)) { if(vwrq->flags & IW_RETRY_MAX) @@ -1899,7 +1899,7 @@ static int atmel_get_retry(struct net_de struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); vwrq->disabled = 0; /* Can't be disabled */ @@ -1922,7 +1922,7 @@ static int atmel_set_rts(struct net_devi struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); int rthr = vwrq->value; if(vwrq->disabled) @@ -1940,7 +1940,7 @@ static int atmel_get_rts(struct net_devi struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); vwrq->value = priv->rts_threshold; vwrq->disabled = (vwrq->value >= 2347); @@ -1954,7 +1954,7 @@ static int atmel_set_frag(struct net_dev struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); int fthr = vwrq->value; if(vwrq->disabled) @@ -1973,7 +1973,7 @@ static int atmel_get_frag(struct net_dev struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); vwrq->value = priv->frag_threshold; vwrq->disabled = (vwrq->value >= 2346); @@ -1990,7 +1990,7 @@ static int atmel_set_freq(struct net_dev struct iw_freq *fwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); int rc = -EINPROGRESS; /* Call commit handler */ /* If setting by frequency, convert to a channel */ @@ -2024,7 +2024,7 @@ static int atmel_get_freq(struct net_dev struct iw_freq *fwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); fwrq->m = priv->channel; fwrq->e = 0; @@ -2036,7 +2036,7 @@ static int atmel_set_scan(struct net_dev struct iw_param *vwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); /* Note : you may have realised that, as this is a SET operation, * this is privileged and therefore a normal user can't @@ -2074,7 +2074,7 @@ static int atmel_get_scan(struct net_dev struct iw_point *dwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); int i; char *current_ev = extra; struct iw_event iwe; @@ -2126,7 +2126,7 @@ static int atmel_get_range(struct net_de struct iw_point *dwrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); struct iw_range *range = (struct iw_range *) extra; int k,i,j; @@ -2193,7 +2193,7 @@ static int atmel_set_wap(struct net_devi struct sockaddr *awrq, char *extra) { - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); int i; static const u8 bcast[] = { 255, 255, 255, 255, 255, 255 }; @@ -2318,7 +2318,7 @@ static const struct iw_handler_def atmel static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { int rc = 0; - struct atmel_private *priv = (struct atmel_private *) dev->priv; + struct atmel_private *priv = netdev_priv(dev); atmel_priv_ioctl com; struct iwreq *wrq = (struct iwreq *) rq; unsigned char *new_firmware; @@ -3053,7 +3053,7 @@ static void atmel_management_frame(struc static void atmel_management_timer(u_long a) { struct net_device *dev = (struct net_device *) a; - struct atmel_private *priv = (struct atmel_private *)dev->priv; + struct atmel_private *priv = netdev_priv(dev); unsigned long flags; /* Check if the card has been yanked. */ @@ -3297,7 +3297,7 @@ static int atmel_wakeup_firmware(struct static int probe_atmel_card(struct net_device *dev) { int rc = 0; - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); /* reset pccard */ if (priv->bus_type == BUS_TYPE_PCCARD) @@ -3486,7 +3486,7 @@ int reset_atmel_card(struct net_device * which is the route into the rest of the firmare datastructures. */ int channel; - struct atmel_private *priv = dev->priv; + struct atmel_private *priv = netdev_priv(dev); u8 configuration; /* data to add to the firmware names, in priority order diff -puN drivers/net/wireless/orinoco.c~net_wireless_casts drivers/net/wireless/orinoco.c --- linux-264-302-priv/drivers/net/wireless/orinoco.c~net_wireless_casts 2004-03-03 10:02:14.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/wireless/orinoco.c 2004-03-03 10:27:06.000000000 -0800 @@ -599,7 +599,7 @@ static int orinoco_debug_dump_recs(struc int __orinoco_up(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct hermes *hw = &priv->hw; int err; @@ -626,7 +626,7 @@ int __orinoco_up(struct net_device *dev) int __orinoco_down(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct hermes *hw = &priv->hw; int err; @@ -657,7 +657,7 @@ int __orinoco_down(struct net_device *de int orinoco_reinit_firmware(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct hermes *hw = &priv->hw; int err; @@ -685,7 +685,7 @@ int orinoco_reinit_firmware(struct net_d static int orinoco_open(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); unsigned long flags; int err; @@ -705,7 +705,7 @@ static int orinoco_open(struct net_devic int orinoco_stop(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int err = 0; /* We mustn't use orinoco_lock() here, because we need to be @@ -724,7 +724,7 @@ int orinoco_stop(struct net_device *dev) static int __orinoco_program_rids(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int err; struct hermes_idstring idbuf; @@ -912,7 +912,7 @@ ESSID in IBSS-Ad-Hoc mode.\n", dev->name /* xyzzy */ static int orinoco_reconfigure(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct hermes *hw = &priv->hw; unsigned long flags; int err = 0; @@ -965,7 +965,7 @@ static int orinoco_reconfigure(struct ne * schedule_work() */ static void orinoco_reset(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct hermes *hw = &priv->hw; int err; unsigned long flags; @@ -1070,7 +1070,7 @@ is_ethersnap(struct header_struct *hdr) static void orinoco_set_multicast_list(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); unsigned long flags; if (orinoco_lock(priv, &flags) != 0) { @@ -1433,7 +1433,7 @@ static void show_rx_frame(struct orinoco irqreturn_t orinoco_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int count = MAX_IRQLOOPS_PER_IRQ; u16 evstat, events; @@ -1561,7 +1561,7 @@ static void print_linkstatus(struct net_ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); u16 infofid; struct { u16 len; @@ -1662,7 +1662,7 @@ static void __orinoco_ev_info(struct net static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct net_device_stats *stats = &priv->stats; struct iw_statistics *wstats = &priv->wstats; struct sk_buff *skb = NULL; @@ -1814,7 +1814,7 @@ static void __orinoco_ev_rx(struct net_d static void __orinoco_ev_txexc(struct net_device *dev, hermes_t *hw) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct net_device_stats *stats = &priv->stats; u16 fid = hermes_read_regn(hw, TXCOMPLFID); struct hermes_tx_descriptor desc; @@ -1840,7 +1840,7 @@ static void __orinoco_ev_txexc(struct ne static void __orinoco_ev_tx(struct net_device *dev, hermes_t *hw) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct net_device_stats *stats = &priv->stats; stats->tx_packets++; @@ -1850,7 +1850,7 @@ static void __orinoco_ev_tx(struct net_d static void __orinoco_ev_alloc(struct net_device *dev, hermes_t *hw) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); u16 fid = hermes_read_regn(hw, ALLOCFID); @@ -1886,7 +1886,7 @@ static int determine_firmware_type(struc static void determine_firmware(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int err; struct sta_id sta_id; @@ -2024,7 +2024,7 @@ static void determine_firmware(struct ne static int orinoco_init(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int err = 0; struct hermes_idstring nickbuf; @@ -2204,7 +2204,7 @@ orinoco_init(struct net_device *dev) struct net_device_stats * orinoco_get_stats(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); return &priv->stats; } @@ -2212,7 +2212,7 @@ orinoco_get_stats(struct net_device *dev struct iw_statistics * orinoco_get_wireless_stats(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; struct iw_statistics *wstats = &priv->wstats; int err = 0; @@ -2271,7 +2271,7 @@ orinoco_get_wireless_stats(struct net_de static inline void orinoco_spy_gather(struct net_device *dev, u_char *mac, int level, int noise) { - struct orinoco_private *priv = (struct orinoco_private *)dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int i; /* Gather wireless spy statistics: for each packet, compare the @@ -2290,7 +2290,7 @@ orinoco_stat_gather(struct net_device *d struct sk_buff *skb, struct hermes_rx_descriptor *desc) { - struct orinoco_private *priv = (struct orinoco_private *)dev->priv; + struct orinoco_private *priv = netdev_priv(dev); /* Using spy support with lots of Rx packets, like in an * infrastructure (AP), will really slow down everything, because @@ -2311,7 +2311,7 @@ orinoco_stat_gather(struct net_device *d static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev) { - struct orinoco_private *priv = (struct orinoco_private *)dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct net_device_stats *stats = &priv->stats; hermes_t *hw = &priv->hw; int err = 0; @@ -2449,7 +2449,7 @@ orinoco_xmit(struct sk_buff *skb, struct static void orinoco_tx_timeout(struct net_device *dev) { - struct orinoco_private *priv = (struct orinoco_private *)dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct net_device_stats *stats = &priv->stats; struct hermes *hw = &priv->hw; @@ -2466,7 +2466,7 @@ orinoco_tx_timeout(struct net_device *de static int orinoco_change_mtu(struct net_device *dev, int new_mtu) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); if ( (new_mtu < ORINOCO_MIN_MTU) || (new_mtu > ORINOCO_MAX_MTU) ) return -EINVAL; @@ -2484,7 +2484,7 @@ orinoco_change_mtu(struct net_device *de static void __orinoco_set_multicast_list(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int err = 0; int promisc, mc_count; @@ -2554,7 +2554,7 @@ __orinoco_set_multicast_list(struct net_ static int orinoco_ioctl_getiwrange(struct net_device *dev, struct iw_point *rrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int err = 0; int mode; struct iw_range range; @@ -2699,7 +2699,7 @@ static int orinoco_ioctl_getiwrange(stru static int orinoco_ioctl_setiwencode(struct net_device *dev, struct iw_point *erq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int index = (erq->flags & IW_ENCODE_INDEX) - 1; int setindex = priv->tx_key; int enable = priv->wep_on; @@ -2794,7 +2794,7 @@ static int orinoco_ioctl_setiwencode(str static int orinoco_ioctl_getiwencode(struct net_device *dev, struct iw_point *erq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int index = (erq->flags & IW_ENCODE_INDEX) - 1; u16 xlen = 0; char keybuf[ORINOCO_MAX_KEY_SIZE]; @@ -2841,7 +2841,7 @@ static int orinoco_ioctl_getiwencode(str static int orinoco_ioctl_setessid(struct net_device *dev, struct iw_point *erq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); char essidbuf[IW_ESSID_MAX_SIZE+1]; int err; unsigned long flags; @@ -2874,7 +2874,7 @@ static int orinoco_ioctl_setessid(struct static int orinoco_ioctl_getessid(struct net_device *dev, struct iw_point *erq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); char essidbuf[IW_ESSID_MAX_SIZE+1]; int active; int err = 0; @@ -2907,7 +2907,7 @@ static int orinoco_ioctl_getessid(struct static int orinoco_ioctl_setnick(struct net_device *dev, struct iw_point *nrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); char nickbuf[IW_ESSID_MAX_SIZE+1]; int err; unsigned long flags; @@ -2935,7 +2935,7 @@ static int orinoco_ioctl_setnick(struct static int orinoco_ioctl_getnick(struct net_device *dev, struct iw_point *nrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); char nickbuf[IW_ESSID_MAX_SIZE+1]; int err; unsigned long flags; @@ -2957,7 +2957,7 @@ static int orinoco_ioctl_getnick(struct static int orinoco_ioctl_setfreq(struct net_device *dev, struct iw_freq *frq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int chan = -1; int err; unsigned long flags; @@ -2999,7 +2999,7 @@ static int orinoco_ioctl_setfreq(struct static int orinoco_ioctl_getsens(struct net_device *dev, struct iw_param *srq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; u16 val; int err; @@ -3025,7 +3025,7 @@ static int orinoco_ioctl_getsens(struct static int orinoco_ioctl_setsens(struct net_device *dev, struct iw_param *srq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int val = srq->value; int err; unsigned long flags; @@ -3047,7 +3047,7 @@ static int orinoco_ioctl_setsens(struct static int orinoco_ioctl_setrts(struct net_device *dev, struct iw_param *rrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int val = rrq->value; int err; unsigned long flags; @@ -3070,7 +3070,7 @@ static int orinoco_ioctl_setrts(struct n static int orinoco_ioctl_setfrag(struct net_device *dev, struct iw_param *frq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int err = 0; unsigned long flags; @@ -3105,7 +3105,7 @@ supported on this firmware. Using MWO ro static int orinoco_ioctl_getfrag(struct net_device *dev, struct iw_param *frq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int err = 0; u16 val; @@ -3143,7 +3143,7 @@ static int orinoco_ioctl_getfrag(struct static int orinoco_ioctl_setrate(struct net_device *dev, struct iw_param *rrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int err = 0; int ratemode = -1; int bitrate; /* 100s of kilobits */ @@ -3186,7 +3186,7 @@ static int orinoco_ioctl_setrate(struct static int orinoco_ioctl_getrate(struct net_device *dev, struct iw_param *rrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int err = 0; int ratemode; @@ -3253,7 +3253,7 @@ static int orinoco_ioctl_getrate(struct static int orinoco_ioctl_setpower(struct net_device *dev, struct iw_param *prq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int err = 0; unsigned long flags; @@ -3306,7 +3306,7 @@ static int orinoco_ioctl_setpower(struct static int orinoco_ioctl_getpower(struct net_device *dev, struct iw_param *prq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int err = 0; u16 enable, period, timeout, mcast; @@ -3356,7 +3356,7 @@ static int orinoco_ioctl_getpower(struct #if WIRELESS_EXT > 10 static int orinoco_ioctl_getretry(struct net_device *dev, struct iw_param *rrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; int err = 0; u16 short_limit, long_limit, lifetime; @@ -3409,7 +3409,7 @@ static int orinoco_ioctl_getretry(struct static int orinoco_ioctl_setibssport(struct net_device *dev, struct iwreq *wrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int val = *( (int *) wrq->u.name ); int err; unsigned long flags; @@ -3429,7 +3429,7 @@ static int orinoco_ioctl_setibssport(str static int orinoco_ioctl_getibssport(struct net_device *dev, struct iwreq *wrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int *val = (int *)wrq->u.name; int err; unsigned long flags; @@ -3446,7 +3446,7 @@ static int orinoco_ioctl_getibssport(str static int orinoco_ioctl_setport3(struct net_device *dev, struct iwreq *wrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int val = *( (int *) wrq->u.name ); int err = 0; unsigned long flags; @@ -3488,7 +3488,7 @@ static int orinoco_ioctl_setport3(struct static int orinoco_ioctl_getport3(struct net_device *dev, struct iwreq *wrq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); int *val = (int *)wrq->u.name; int err; unsigned long flags; @@ -3507,7 +3507,7 @@ static int orinoco_ioctl_getport3(struct * Jean II */ static int orinoco_ioctl_setspy(struct net_device *dev, struct iw_point *srq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct sockaddr address[IW_MAX_SPY]; int number = srq->length; int i; @@ -3554,7 +3554,7 @@ static int orinoco_ioctl_setspy(struct n static int orinoco_ioctl_getspy(struct net_device *dev, struct iw_point *srq) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct sockaddr address[IW_MAX_SPY]; struct iw_quality spy_stat[IW_MAX_SPY]; int number; @@ -3601,7 +3601,7 @@ static int orinoco_ioctl_getspy(struct n static int orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); struct iwreq *wrq = (struct iwreq *)rq; int err = 0; int tmp; @@ -4057,7 +4057,7 @@ struct { static int orinoco_debug_dump_recs(struct net_device *dev) { - struct orinoco_private *priv = dev->priv; + struct orinoco_private *priv = netdev_priv(dev); hermes_t *hw = &priv->hw; u8 *val8; u16 *val16; @@ -4131,7 +4131,7 @@ struct net_device *alloc_orinocodev(int dev = alloc_etherdev(sizeof(struct orinoco_private) + sizeof_card); if (!dev) return NULL; - priv = (struct orinoco_private *)dev->priv; + priv = netdev_priv(dev); priv->ndev = dev; if (sizeof_card) priv->card = (void *)((unsigned long)dev->priv + sizeof(struct orinoco_private)); _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:21:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:21:30 -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 i24LLMKO019779 for ; Thu, 4 Mar 2004 13:21:22 -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 i24LLHE29479 for ; Thu, 4 Mar 2004 13:21:17 -0800 Date: Thu, 4 Mar 2004 13:20:24 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in synclink (char. driver) Message-Id: <20040304132024.149150c6.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: 3754 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: 2298 Lines: 82 | | From: Carlo Perassi | and Randy.Dunlap Jeff, can you add this patch and the fusion/mptlan driver patch as well? -- ~Randy linux-264-302-priv-rddunlap/drivers/char/synclink.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff -puN drivers/char/synclink.c~synclink_casts drivers/char/synclink.c --- linux-264-302-priv/drivers/char/synclink.c~synclink_casts 2004-03-02 12:56:23.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/char/synclink.c 2004-03-02 13:01:39.000000000 -0800 @@ -7878,7 +7878,7 @@ void mgsl_sppp_delete(struct mgsl_struct int mgsl_sppp_open(struct net_device *d) { - struct mgsl_struct *info = d->priv; + struct mgsl_struct *info = netdev_priv(d); int err; unsigned long flags; @@ -7920,7 +7920,7 @@ open_fail: void mgsl_sppp_tx_timeout(struct net_device *dev) { - struct mgsl_struct *info = dev->priv; + struct mgsl_struct *info = netdev_priv(dev); unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) @@ -7938,7 +7938,7 @@ void mgsl_sppp_tx_timeout(struct net_dev int mgsl_sppp_tx(struct sk_buff *skb, struct net_device *dev) { - struct mgsl_struct *info = dev->priv; + struct mgsl_struct *info = netdev_priv(dev); unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) @@ -7964,7 +7964,7 @@ int mgsl_sppp_tx(struct sk_buff *skb, st int mgsl_sppp_close(struct net_device *d) { - struct mgsl_struct *info = d->priv; + struct mgsl_struct *info = netdev_priv(d); unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) @@ -8014,7 +8014,7 @@ void mgsl_sppp_tx_done(struct mgsl_struc struct net_device_stats *mgsl_net_stats(struct net_device *dev) { - struct mgsl_struct *info = dev->priv; + struct mgsl_struct *info = netdev_priv(dev); if (debug_level >= DEBUG_LEVEL_INFO) printk("mgsl_net_stats(%s)\n",info->netname); return &info->netstats; @@ -8022,7 +8022,7 @@ struct net_device_stats *mgsl_net_stats( int mgsl_sppp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - struct mgsl_struct *info = (struct mgsl_struct *)dev->priv; + struct mgsl_struct *info = netdev_priv(dev); if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgsl_ioctl %s cmd=%08X\n", __FILE__,__LINE__, info->netname, cmd ); _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:21:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:21:29 -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 i24LLAKO019597 for ; Thu, 4 Mar 2004 13:21:10 -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 i24LL5E29434 for ; Thu, 4 Mar 2004 13:21:05 -0800 Date: Thu, 4 Mar 2004 13:20:12 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in drivers/net/ (others) Message-Id: <20040304132012.6dd18b7c.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: 3753 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: 77011 Lines: 2258 | | From: Carlo Perassi | and Randy.Dunlap -- ~Randy linux-264-302-priv-rddunlap/drivers/net/amd8111e.c | 56 ++++++++--------- linux-264-302-priv-rddunlap/drivers/net/ariadne.c | 14 ++-- linux-264-302-priv-rddunlap/drivers/net/at1700.c | 22 +++--- linux-264-302-priv-rddunlap/drivers/net/atari_bionet.c | 12 +-- linux-264-302-priv-rddunlap/drivers/net/atp.c | 26 +++---- linux-264-302-priv-rddunlap/drivers/net/bmac.c | 44 ++++++------- linux-264-302-priv-rddunlap/drivers/net/cs89x0.c | 40 ++++++------ linux-264-302-priv-rddunlap/drivers/net/eth16i.c | 18 ++--- linux-264-302-priv-rddunlap/drivers/net/fec.c | 54 ++++++++-------- linux-264-302-priv-rddunlap/drivers/net/gt96100eth.c | 42 ++++++------ linux-264-302-priv-rddunlap/drivers/net/mac89x0.c | 14 ++-- linux-264-302-priv-rddunlap/drivers/net/ni5010.c | 12 +-- linux-264-302-priv-rddunlap/drivers/net/rrunner.c | 32 ++++----- linux-264-302-priv-rddunlap/drivers/net/sb1000.c | 14 ++-- linux-264-302-priv-rddunlap/drivers/net/sb1250-mac.c | 22 +++--- linux-264-302-priv-rddunlap/drivers/net/seeq8005.c | 14 ++-- linux-264-302-priv-rddunlap/drivers/net/sgiseeq.c | 16 ++-- linux-264-302-priv-rddunlap/drivers/net/sk_g16.c | 18 ++--- linux-264-302-priv-rddunlap/drivers/net/smc9194.c | 12 +-- 19 files changed, 241 insertions(+), 241 deletions(-) diff -puN drivers/net/amd8111e.c~drivers_net_casts drivers/net/amd8111e.c --- linux-264-302-priv/drivers/net/amd8111e.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/amd8111e.c 2004-03-02 14:52:49.000000000 -0800 @@ -174,7 +174,7 @@ This is the mii register read function p */ static int amd8111e_mdio_read(struct net_device * dev, int phy_id, int reg_num) { - struct amd8111e_priv* lp = dev->priv; + struct amd8111e_priv* lp = netdev_priv(dev); unsigned int reg_val; amd8111e_read_phy(lp,phy_id,reg_num,®_val); @@ -187,7 +187,7 @@ This is the mii register write function */ static void amd8111e_mdio_write(struct net_device * dev, int phy_id, int reg_num, int val) { - struct amd8111e_priv* lp = dev->priv; + struct amd8111e_priv* lp = netdev_priv(dev); amd8111e_write_phy(lp, phy_id, reg_num, val); } @@ -197,7 +197,7 @@ This function will set PHY speed. During */ static void amd8111e_set_ext_phy(struct net_device *dev) { - struct amd8111e_priv *lp = (struct amd8111e_priv *)dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); u32 bmcr,advert,tmp; /* Determine mii register values to set the speed */ @@ -239,7 +239,7 @@ all transmit and receive skbuffs. */ static int amd8111e_free_skbs(struct net_device *dev) { - struct amd8111e_priv *lp = (struct amd8111e_priv *)dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); struct sk_buff* rx_skbuff; int i; @@ -272,7 +272,7 @@ This will set the receive buffer length */ static inline void amd8111e_set_rx_buff_len(struct net_device* dev) { - struct amd8111e_priv* lp = dev->priv; + struct amd8111e_priv* lp = netdev_priv(dev); unsigned int mtu = dev->mtu; if (mtu > ETH_DATA_LEN){ @@ -290,7 +290,7 @@ This function will free all the previous */ static int amd8111e_init_ring(struct net_device *dev) { - struct amd8111e_priv *lp = (struct amd8111e_priv *)dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); int i; lp->rx_idx = lp->tx_idx = 0; @@ -371,7 +371,7 @@ static int amd8111e_set_coalesce(struct unsigned int timeout; unsigned int event_count; - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); void* mmio = lp->mmio; struct amd8111e_coalesce_conf * coal_conf = &lp->coal_conf; @@ -429,7 +429,7 @@ This function initializes the device reg */ static int amd8111e_restart(struct net_device *dev) { - struct amd8111e_priv *lp = (struct amd8111e_priv* )dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); void * mmio = lp->mmio; int i,reg_val; @@ -663,7 +663,7 @@ This function will free all the transmit */ static int amd8111e_tx(struct net_device *dev) { - struct amd8111e_priv* lp = dev->priv; + struct amd8111e_priv* lp = netdev_priv(dev); int tx_index = lp->tx_complete_idx & TX_RING_DR_MOD_MASK; int status; /* Complete all the transmit packet */ @@ -705,7 +705,7 @@ This function will check the ownership o */ static int amd8111e_rx(struct net_device *dev) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); struct sk_buff *skb,*new_skb; int rx_index = lp->rx_idx & RX_RING_DR_MOD_MASK; int min_pkt_len, status; @@ -809,7 +809,7 @@ This function will indicate the link sta */ static int amd8111e_link_change(struct net_device* dev) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); int status0,speed; /* read the link change */ @@ -871,7 +871,7 @@ This function reads the mib registers an */ static struct net_device_stats *amd8111e_get_stats(struct net_device * dev) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); void * mmio = lp->mmio; unsigned long flags; /* struct net_device_stats *prev_stats = &lp->prev_stats; */ @@ -966,7 +966,7 @@ according to the datarate and the packet */ static int amd8111e_calc_coalesce(struct net_device *dev) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); struct amd8111e_coalesce_conf * coal_conf = &lp->coal_conf; int tx_pkt_rate; int rx_pkt_rate; @@ -1102,7 +1102,7 @@ static irqreturn_t amd8111e_interrupt(in { struct net_device * dev = (struct net_device *) dev_id; - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); void * mmio = lp->mmio; unsigned int intr0; unsigned int handled = 1; @@ -1158,7 +1158,7 @@ This function closes the network interfa */ static int amd8111e_close(struct net_device * dev) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); netif_stop_queue(dev); spin_lock_irq(&lp->lock); @@ -1185,7 +1185,7 @@ static int amd8111e_close(struct net_dev */ static int amd8111e_open(struct net_device * dev ) { - struct amd8111e_priv *lp = (struct amd8111e_priv *)dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); if(dev->irq ==0 || request_irq(dev->irq, amd8111e_interrupt, SA_SHIRQ, dev->name, dev)) @@ -1231,7 +1231,7 @@ This function will queue the transmit pa static int amd8111e_start_xmit(struct sk_buff *skb, struct net_device * dev) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); int tx_index; unsigned long flags; @@ -1338,7 +1338,7 @@ list to the device. static void amd8111e_set_multicast_list(struct net_device *dev) { struct dev_mc_list* mc_ptr; - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); u32 mc_filter[2] ; int i,bit_num; if(dev->flags & IFF_PROMISC){ @@ -1388,7 +1388,7 @@ This function handles all the ethtool i static int amd8111e_ethtool_ioctl(struct net_device* dev, void* useraddr) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); struct pci_dev *pci_dev = lp->pci_dev; u32 ethcmd; @@ -1510,7 +1510,7 @@ static int amd8111e_ethtool_ioctl(struct static int amd8111e_ioctl(struct net_device * dev , struct ifreq *ifr, int cmd) { struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data; - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); int err; u32 mii_regval; @@ -1554,7 +1554,7 @@ This function changes the mtu of the dev */ int amd8111e_change_mtu(struct net_device *dev, int new_mtu) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); int err; if ((new_mtu < AMD8111E_MIN_MTU) || (new_mtu > AMD8111E_MAX_MTU)) @@ -1584,7 +1584,7 @@ int amd8111e_change_mtu(struct net_devic #if AMD8111E_VLAN_TAG_USED static void amd8111e_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); spin_lock_irq(&lp->lock); lp->vlgrp = grp; spin_unlock_irq(&lp->lock); @@ -1592,7 +1592,7 @@ static void amd8111e_vlan_rx_register(st static void amd8111e_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); spin_lock_irq(&lp->lock); if (lp->vlgrp) lp->vlgrp->vlan_devices[vid] = NULL; @@ -1623,7 +1623,7 @@ static int amd8111e_enable_link_change(s static void amd8111e_tx_timeout(struct net_device *dev) { - struct amd8111e_priv* lp = dev->priv; + struct amd8111e_priv* lp = netdev_priv(dev); int err; printk(KERN_ERR "%s: transmit timed out, resetting\n", @@ -1637,7 +1637,7 @@ static void amd8111e_tx_timeout(struct n static int amd8111e_suspend(struct pci_dev *pci_dev, u32 state) { struct net_device *dev = pci_get_drvdata(pci_dev); - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); if (!netif_running(dev)) return 0; @@ -1680,7 +1680,7 @@ static int amd8111e_suspend(struct pci_d static int amd8111e_resume(struct pci_dev *pci_dev) { struct net_device *dev = pci_get_drvdata(pci_dev); - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); if (!netif_running(dev)) return 0; @@ -1719,7 +1719,7 @@ static void __devexit amd8111e_remove_on } static void amd8111e_config_ipg(struct net_device* dev) { - struct amd8111e_priv *lp = dev->priv; + struct amd8111e_priv *lp = netdev_priv(dev); struct ipg_info* ipg_data = &lp->ipg_data; void * mmio = lp->mmio; unsigned int prev_col_cnt = ipg_data->col_cnt; @@ -1841,7 +1841,7 @@ static int __devinit amd8111e_probe_one( dev->vlan_rx_kill_vid = amd8111e_vlan_rx_kill_vid; #endif - lp = dev->priv; + lp = netdev_priv(dev); lp->pci_dev = pdev; lp->amd8111e_net_dev = dev; lp->pm_cap = pm_cap; diff -puN drivers/net/ariadne.c~drivers_net_casts drivers/net/ariadne.c --- linux-264-302-priv/drivers/net/ariadne.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/ariadne.c 2004-03-02 14:56:06.000000000 -0800 @@ -184,7 +184,7 @@ static int __devinit ariadne_init_one(st } SET_MODULE_OWNER(dev); - priv = dev->priv; + priv = netdev_priv(dev); r1->name = dev->name; r2->name = dev->name; @@ -333,7 +333,7 @@ static int ariadne_open(struct net_devic static void ariadne_init_ring(struct net_device *dev) { - struct ariadne_private *priv = (struct ariadne_private *)dev->priv; + struct ariadne_private *priv = netdev_priv(dev); volatile struct lancedata *lancedata = (struct lancedata *)dev->mem_start; int i; @@ -379,7 +379,7 @@ static void ariadne_init_ring(struct net static int ariadne_close(struct net_device *dev) { - struct ariadne_private *priv = (struct ariadne_private *)dev->priv; + struct ariadne_private *priv = netdev_priv(dev); volatile struct Am79C960 *lance = (struct Am79C960*)dev->base_addr; netif_stop_queue(dev); @@ -434,7 +434,7 @@ static irqreturn_t ariadne_interrupt(int if (!(lance->RDP & INTR)) /* Check if any interrupt has been */ return IRQ_NONE; /* generated by the board. */ - priv = (struct ariadne_private *)dev->priv; + priv = netdev_priv(dev); boguscnt = 10; while ((csr0 = lance->RDP) & (ERR|RINT|TINT) && --boguscnt >= 0) { @@ -589,7 +589,7 @@ static void ariadne_tx_timeout(struct ne static int ariadne_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct ariadne_private *priv = (struct ariadne_private *)dev->priv; + struct ariadne_private *priv = netdev_priv(dev); volatile struct Am79C960 *lance = (struct Am79C960*)dev->base_addr; int entry; unsigned long flags; @@ -697,7 +697,7 @@ static int ariadne_start_xmit(struct sk_ static int ariadne_rx(struct net_device *dev) { - struct ariadne_private *priv = (struct ariadne_private *)dev->priv; + struct ariadne_private *priv = netdev_priv(dev); int entry = priv->cur_rx % RX_RING_SIZE; int i; @@ -787,7 +787,7 @@ static int ariadne_rx(struct net_device static struct net_device_stats *ariadne_get_stats(struct net_device *dev) { - struct ariadne_private *priv = (struct ariadne_private *)dev->priv; + struct ariadne_private *priv = netdev_priv(dev); volatile struct Am79C960 *lance = (struct Am79C960*)dev->base_addr; short saved_addr; unsigned long flags; diff -puN drivers/net/at1700.c~drivers_net_casts drivers/net/at1700.c --- linux-264-302-priv/drivers/net/at1700.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/at1700.c 2004-03-02 13:49:57.000000000 -0800 @@ -241,7 +241,7 @@ static int irq; static void cleanup_card(struct net_device *dev) { #ifdef CONFIG_MCA - struct net_local *lp = dev->priv; + struct net_local *lp = netdev_priv(dev); if (lp->mca_slot) mca_mark_as_unused(lp->mca_slot); #endif @@ -319,8 +319,8 @@ static int __init at1700_probe1(struct n char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15}; unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0; int slot, ret = -ENODEV; - struct net_local *lp = dev->priv; - + struct net_local *lp = netdev_priv(dev); + #ifndef CONFIG_X86_PC9800 if (!request_region(ioaddr, AT1700_IO_EXTENT, dev->name)) return -EBUSY; @@ -618,7 +618,7 @@ static int __init read_eeprom(long ioadd static int net_open(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; /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit @@ -649,7 +649,7 @@ static int net_open(struct net_device *d static void net_tx_timeout (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; printk ("%s: transmit timed out with status %04x, %s?\n", dev->name, @@ -683,7 +683,7 @@ static void net_tx_timeout (struct net_d static int net_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); int ioaddr = dev->base_addr; short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; short len = skb->len; @@ -748,7 +748,7 @@ net_interrupt(int irq, void *dev_id, str } ioaddr = dev->base_addr; - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); spin_lock (&lp->lock); @@ -808,7 +808,7 @@ net_interrupt(int irq, void *dev_id, str 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 = 5; @@ -891,7 +891,7 @@ net_rx(struct net_device *dev) /* The inverse routine to net_open(). */ 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; netif_stop_queue(dev); @@ -919,7 +919,7 @@ static int net_close(struct net_device * 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; } @@ -931,7 +931,7 @@ static void set_rx_mode(struct net_device *dev) { int ioaddr = dev->base_addr; - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned char mc_filter[8]; /* Multicast hash filter */ unsigned long flags; int i; diff -puN drivers/net/atari_bionet.c~drivers_net_casts drivers/net/atari_bionet.c --- linux-264-302-priv/drivers/net/atari_bionet.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/atari_bionet.c 2004-03-02 13:53:42.000000000 -0800 @@ -408,7 +408,7 @@ struct net_device * __init bionet_probe( */ static int bionet_open(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (bionet_debug > 0) printk("bionet_open\n"); @@ -433,7 +433,7 @@ bionet_open(struct net_device *dev) { static int bionet_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 @@ -499,7 +499,7 @@ bionet_send_packet(struct sk_buff *skb, */ static void bionet_poll_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int boguscount = 10; int pkt_len, status; unsigned long flags; @@ -601,7 +601,7 @@ bionet_poll_rx(struct net_device *dev) { static void bionet_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( bionet_debug > 0 && (lp->open_time++ & 7) == 8 ) printk("bionet_tick: %ld\n", lp->open_time); @@ -616,7 +616,7 @@ bionet_tick(unsigned long data) { */ static int bionet_close(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (bionet_debug > 0) printk("bionet_close, open_time=%ld\n", lp->open_time); @@ -638,7 +638,7 @@ bionet_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/atp.c~drivers_net_casts drivers/net/atp.c --- linux-264-302-priv/drivers/net/atp.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/atp.c 2004-03-02 13:55:41.000000000 -0800 @@ -335,7 +335,7 @@ static int __init atp_probe1(long ioaddr /* Reset the ethernet hardware and activate the printer pass-through. */ write_reg_high(ioaddr, CMR1, CMR1h_RESET | CMR1h_MUX); - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); lp->chip_type = RTL8002; lp->addr_mode = CMR2h_Normal; spin_lock_init(&lp->lock); @@ -432,7 +432,7 @@ static unsigned short __init eeprom_op(l */ static int net_open(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int ret; /* The interrupt line is turned off (tri-stated) when the device isn't in @@ -458,7 +458,7 @@ static int net_open(struct net_device *d the hardware may have been temporarily detached. */ static void hardware_init(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); long ioaddr = dev->base_addr; int i; @@ -541,7 +541,7 @@ static void write_packet(long ioaddr, in static void tx_timeout(struct net_device *dev) { - struct net_local *np = (struct net_local *)dev->priv; + struct net_local *np = netdev_priv(dev); long ioaddr = dev->base_addr; printk(KERN_WARNING "%s: Transmit timed out, %s?\n", dev->name, @@ -557,7 +557,7 @@ static void tx_timeout(struct net_device static int atp_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); long ioaddr = dev->base_addr; int length; unsigned long flags; @@ -611,7 +611,7 @@ atp_interrupt(int irq, void *dev_instanc return IRQ_NONE; } ioaddr = dev->base_addr; - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); spin_lock(&lp->lock); @@ -726,7 +726,7 @@ static void atp_timed_checker(unsigned l { struct net_device *dev = (struct net_device *)data; long ioaddr = dev->base_addr; - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int tickssofar = jiffies - lp->last_rx_time; int i; @@ -740,7 +740,7 @@ static void atp_timed_checker(unsigned l for (i = 0; i < 6; i++) if (read_cmd_byte(ioaddr, PAR0 + i) != atp_timed_dev->dev_addr[i]) { - struct net_local *lp = (struct net_local *)atp_timed_dev->priv; + struct net_local *lp = netdev_priv(atp_timed_dev); write_reg_byte(ioaddr, PAR0 + i, atp_timed_dev->dev_addr[i]); if (i == 2) lp->stats.tx_errors++; @@ -762,7 +762,7 @@ static void atp_timed_checker(unsigned l /* We have a good packet(s), get it/them out of the buffers. */ static void net_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); long ioaddr = dev->base_addr; struct rx_header rx_head; @@ -838,7 +838,7 @@ static void read_block(long ioaddr, int static int net_close(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); long ioaddr = dev->base_addr; netif_stop_queue(dev); @@ -863,7 +863,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); return &lp->stats; } @@ -873,7 +873,7 @@ net_get_stats(struct net_device *dev) static void set_rx_mode_8002(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); long ioaddr = dev->base_addr; if ( dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) { @@ -890,7 +890,7 @@ static void set_rx_mode_8002(struct net_ static void set_rx_mode_8012(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); long ioaddr = dev->base_addr; unsigned char new_mode, mc_filter[8]; /* Multicast hash filter */ int i; diff -puN drivers/net/bmac.c~drivers_net_casts drivers/net/bmac.c --- linux-264-302-priv/drivers/net/bmac.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/bmac.c 2004-03-02 14:04:18.000000000 -0800 @@ -226,7 +226,7 @@ volatile unsigned short bmread(struct ne static void bmac_enable_and_reset_chip(struct net_device *dev) { - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); volatile struct dbdma_regs *rd = bp->rx_dma; volatile struct dbdma_regs *td = bp->tx_dma; @@ -310,7 +310,7 @@ bmac_mif_write(struct net_device *dev, u static void bmac_init_registers(struct net_device *dev) { - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); volatile unsigned short regValue; unsigned short *pWord16; int i; @@ -405,7 +405,7 @@ bmac_enable_interrupts(struct net_device static void bmac_start_chip(struct net_device *dev) { - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); volatile struct dbdma_regs *rd = bp->rx_dma; unsigned short oldConfig; @@ -425,7 +425,7 @@ static void bmac_init_phy(struct net_device *dev) { unsigned int addr; - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); printk(KERN_DEBUG "phy registers:"); for (addr = 0; addr < 32; ++addr) { @@ -458,7 +458,7 @@ static void bmac_init_chip(struct net_de static int bmac_suspend(struct macio_dev *mdev, u32 state) { struct net_device* dev = macio_get_drvdata(mdev); - struct bmac_data *bp = dev->priv; + struct bmac_data *bp = netdev_priv(dev); unsigned long flags; unsigned short config; int i; @@ -508,7 +508,7 @@ static int bmac_suspend(struct macio_dev static int bmac_resume(struct macio_dev *mdev) { struct net_device* dev = macio_get_drvdata(mdev); - struct bmac_data *bp = dev->priv; + struct bmac_data *bp = netdev_priv(dev); /* see if this is enough */ if (bp->opened) @@ -525,7 +525,7 @@ static int bmac_resume(struct macio_dev static int bmac_set_address(struct net_device *dev, void *addr) { - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); unsigned char *p = addr; unsigned short *pWord16; unsigned long flags; @@ -550,7 +550,7 @@ static int bmac_set_address(struct net_d static inline void bmac_set_timeout(struct net_device *dev) { - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); unsigned long flags; spin_lock_irqsave(&bp->lock, flags); @@ -656,7 +656,7 @@ bmac_init_rx_ring(struct bmac_data *bp) static int bmac_transmit_packet(struct sk_buff *skb, struct net_device *dev) { - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); volatile struct dbdma_regs *td = bp->tx_dma; int i; @@ -692,7 +692,7 @@ static int rxintcount; static irqreturn_t bmac_rxdma_intr(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); volatile struct dbdma_regs *rd = bp->rx_dma; volatile struct dbdma_cmd *cp; int i, nb, stat; @@ -769,7 +769,7 @@ static int txintcount; static irqreturn_t bmac_txdma_intr(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); volatile struct dbdma_cmd *cp; int stat; unsigned long flags; @@ -822,7 +822,7 @@ static irqreturn_t bmac_txdma_intr(int i static struct net_device_stats *bmac_stats(struct net_device *dev) { - struct bmac_data *p = (struct bmac_data *) dev->priv; + struct bmac_data *p = netdev_priv(dev); return &p->stats; } @@ -995,7 +995,7 @@ bmac_remove_multi(struct net_device *dev static void bmac_set_multicast(struct net_device *dev) { struct dev_mc_list *dmi; - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); int num_addrs = dev->mc_count; unsigned short rx_cfg; int i; @@ -1086,7 +1086,7 @@ static int miscintcount; static irqreturn_t bmac_misc_intr(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; - struct bmac_data *bp = (struct bmac_data *)dev->priv; + struct bmac_data *bp = netdev_priv(dev); unsigned int status = bmread(dev, STATUS); if (miscintcount++ < 10) { XXDEBUG(("bmac_misc_intr\n")); @@ -1232,7 +1232,7 @@ bmac_get_station_address(struct net_devi static void bmac_reset_and_enable(struct net_device *dev) { - struct bmac_data *bp = dev->priv; + struct bmac_data *bp = netdev_priv(dev); unsigned long flags; struct sk_buff *skb; unsigned char *data; @@ -1288,7 +1288,7 @@ static int __devinit bmac_probe(struct m return -ENOMEM; } - bp = (struct bmac_data *) dev->priv; + bp = netdev_priv(dev); SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &mdev->ofdev.dev); macio_set_drvdata(mdev, dev); @@ -1408,7 +1408,7 @@ out_free: static int bmac_open(struct net_device *dev) { - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); /* XXDEBUG(("bmac: enter open\n")); */ /* reset the chip */ bp->opened = 1; @@ -1420,7 +1420,7 @@ static int bmac_open(struct net_device * static int bmac_close(struct net_device *dev) { - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); volatile struct dbdma_regs *rd = bp->rx_dma; volatile struct dbdma_regs *td = bp->tx_dma; unsigned short config; @@ -1469,7 +1469,7 @@ static int bmac_close(struct net_device static void bmac_start(struct net_device *dev) { - struct bmac_data *bp = dev->priv; + struct bmac_data *bp = netdev_priv(dev); int i; struct sk_buff *skb; unsigned long flags; @@ -1495,7 +1495,7 @@ bmac_start(struct net_device *dev) static int bmac_output(struct sk_buff *skb, struct net_device *dev) { - struct bmac_data *bp = dev->priv; + struct bmac_data *bp = netdev_priv(dev); skb_queue_tail(bp->queue, skb); bmac_start(dev); return 0; @@ -1504,7 +1504,7 @@ bmac_output(struct sk_buff *skb, struct static void bmac_tx_timeout(unsigned long data) { struct net_device *dev = (struct net_device *) data; - struct bmac_data *bp = (struct bmac_data *) dev->priv; + struct bmac_data *bp = netdev_priv(dev); volatile struct dbdma_regs *td = bp->tx_dma; volatile struct dbdma_regs *rd = bp->rx_dma; volatile struct dbdma_cmd *cp; @@ -1630,7 +1630,7 @@ bmac_proc_info(char *buffer, char **star static int __devexit bmac_remove(struct macio_dev *mdev) { struct net_device *dev = macio_get_drvdata(mdev); - struct bmac_data *bp = dev->priv; + struct bmac_data *bp = netdev_priv(dev); unregister_netdev(dev); diff -puN drivers/net/cs89x0.c~drivers_net_casts drivers/net/cs89x0.c --- linux-264-302-priv/drivers/net/cs89x0.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/cs89x0.c 2004-03-02 14:55:07.000000000 -0800 @@ -399,7 +399,7 @@ get_eeprom_cksum(int off, int len, int * static int __init cs89x0_probe1(struct net_device *dev, int ioaddr, int modular) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); static unsigned version_printed; int i; unsigned rev_type = 0; @@ -735,7 +735,7 @@ out1: static void get_dma_channel(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (lp->dma) { dev->dma = lp->dma; @@ -757,7 +757,7 @@ get_dma_channel(struct net_device *dev) static void write_dma(struct net_device *dev, int chip_type, int dma) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if ((lp->isa_config & ANY_ISA_DMA) == 0) return; if (chip_type == CS8900) { @@ -770,7 +770,7 @@ write_dma(struct net_device *dev, int ch static void set_dma_cfg(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (lp->use_dma) { if ((lp->isa_config & ANY_ISA_DMA) == 0) { @@ -793,7 +793,7 @@ set_dma_cfg(struct net_device *dev) static int dma_bufcfg(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (lp->use_dma) return (lp->isa_config & ANY_ISA_DMA)? RX_DMA_ENBL : 0; else @@ -804,7 +804,7 @@ static int dma_busctl(struct net_device *dev) { int retval = 0; - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (lp->use_dma) { if (lp->isa_config & ANY_ISA_DMA) retval |= RESET_RX_DMA; /* Reset the DMA pointer */ @@ -820,7 +820,7 @@ dma_busctl(struct net_device *dev) static void dma_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); struct sk_buff *skb; int status, length; unsigned char *bp = lp->rx_dma_ptr; @@ -882,7 +882,7 @@ skip_this_frame: void __init reset_chip(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 reset_start_time; @@ -912,7 +912,7 @@ void __init reset_chip(struct net_devic static void control_dc_dc(struct net_device *dev, int on_not_off) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned int selfcontrol; int timenow = jiffies; /* control the DC to DC convertor in the SelfControl register. @@ -940,7 +940,7 @@ control_dc_dc(struct net_device *dev, in static int detect_tp(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int timenow = jiffies; int fdx; @@ -1055,7 +1055,7 @@ send_test_pkt(struct net_device *dev) static int detect_aui(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (net_debug > 1) printk("%s: Attempting AUI\n", dev->name); control_dc_dc(dev, 0); @@ -1071,7 +1071,7 @@ detect_aui(struct net_device *dev) static int detect_bnc(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if (net_debug > 1) printk("%s: Attempting BNC\n", dev->name); control_dc_dc(dev, 1); @@ -1117,7 +1117,7 @@ write_irq(struct net_device *dev, int ch static int net_open(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int result = 0; int i; int ret; @@ -1358,7 +1358,7 @@ static void net_timeout(struct net_devic static int net_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); if (net_debug > 3) { printk("%s: sent %d byte packet of type %x\n", @@ -1419,7 +1419,7 @@ static irqreturn_t net_interrupt(int irq int handled = 0; ioaddr = dev->base_addr; - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); /* we MUST read all the events out of the ISQ, otherwise we'll never get interrupted again. As a consequence, we can't have any limit @@ -1517,7 +1517,7 @@ count_rx_errors(int status, struct net_l static void net_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); struct sk_buff *skb; int status, length; @@ -1573,7 +1573,7 @@ static void release_dma_buff(struct net_ static int net_close(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); netif_stop_queue(dev); @@ -1600,7 +1600,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); unsigned long flags; spin_lock_irqsave(&lp->lock, flags); @@ -1614,7 +1614,7 @@ net_get_stats(struct net_device *dev) static void set_multicast_list(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned long flags; spin_lock_irqsave(&lp->lock, flags); @@ -1758,7 +1758,7 @@ init_module(void) dev->irq = irq; dev->base_addr = io; - lp = dev->priv; + lp = netdev_priv(dev); #if ALLOW_DMA if (use_dma) { diff -puN drivers/net/eth16i.c~drivers_net_casts drivers/net/eth16i.c --- linux-264-302-priv/drivers/net/eth16i.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/eth16i.c 2004-03-02 14:13:00.000000000 -0800 @@ -486,7 +486,7 @@ out: static int __init eth16i_probe1(struct net_device *dev, int ioaddr) { - struct eth16i_local *lp = dev->priv; + struct eth16i_local *lp = netdev_priv(dev); static unsigned version_printed; int retval; @@ -950,7 +950,7 @@ static void eth16i_eeprom_cmd(int ioaddr static int eth16i_open(struct net_device *dev) { - struct eth16i_local *lp = (struct eth16i_local *)dev->priv; + struct eth16i_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; /* Powerup the chip */ @@ -986,7 +986,7 @@ static int eth16i_open(struct net_device static int eth16i_close(struct net_device *dev) { - struct eth16i_local *lp = (struct eth16i_local *)dev->priv; + struct eth16i_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; eth16i_reset(dev); @@ -1012,7 +1012,7 @@ static int eth16i_close(struct net_devic static void eth16i_timeout(struct net_device *dev) { - struct eth16i_local *lp = (struct eth16i_local *)dev->priv; + struct eth16i_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; /* If we get here, some higher level has decided that @@ -1053,7 +1053,7 @@ static void eth16i_timeout(struct net_de static int eth16i_tx(struct sk_buff *skb, struct net_device *dev) { - struct eth16i_local *lp = (struct eth16i_local *)dev->priv; + struct eth16i_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int status = 0; ushort length = skb->len; @@ -1130,7 +1130,7 @@ static int eth16i_tx(struct sk_buff *skb static void eth16i_rx(struct net_device *dev) { - struct eth16i_local *lp = (struct eth16i_local *)dev->priv; + struct eth16i_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int boguscount = MAX_RX_LOOP; @@ -1232,7 +1232,7 @@ static irqreturn_t eth16i_interrupt(int int handled = 0; ioaddr = dev->base_addr; - lp = (struct eth16i_local *)dev->priv; + lp = netdev_priv(dev); /* Turn off all interrupts from adapter */ outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG); @@ -1340,7 +1340,7 @@ static void eth16i_skip_packet(struct ne static void eth16i_reset(struct net_device *dev) { - struct eth16i_local *lp = (struct eth16i_local *)dev->priv; + struct eth16i_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; if(eth16i_debug > 1) @@ -1372,7 +1372,7 @@ static void eth16i_multicast(struct net_ static struct net_device_stats *eth16i_get_stats(struct net_device *dev) { - struct eth16i_local *lp = (struct eth16i_local *)dev->priv; + struct eth16i_local *lp = netdev_priv(dev); return &lp->stats; } diff -puN drivers/net/fec.c~drivers_net_casts drivers/net/fec.c --- linux-264-302-priv/drivers/net/fec.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/fec.c 2004-03-02 14:53:25.000000000 -0800 @@ -269,7 +269,7 @@ fec_enet_start_xmit(struct sk_buff *skb, volatile fec_t *fecp; volatile cbd_t *bdp; - fep = dev->priv; + fep = netdev_priv(dev); fecp = (volatile fec_t*)dev->base_addr; if (!fep->link) { @@ -349,7 +349,7 @@ fec_enet_start_xmit(struct sk_buff *skb, static void fec_timeout(struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); printk("%s: transmit timed out.\n", dev->name); fep->stats.tx_errors++; @@ -445,7 +445,7 @@ fec_enet_tx(struct net_device *dev) volatile cbd_t *bdp; struct sk_buff *skb; - fep = dev->priv; + fep = netdev_priv(dev); spin_lock(&fep->lock); bdp = fep->dirty_tx; @@ -524,7 +524,7 @@ fec_enet_rx(struct net_device *dev) ushort pkt_len; __u8 *data; - fep = dev->priv; + fep = netdev_priv(dev); fecp = (volatile fec_t*)dev->base_addr; /* First, grab all of the stats for the incoming packet. @@ -645,7 +645,7 @@ fec_enet_mii(struct net_device *dev) mii_list_t *mip; uint mii_reg; - fep = (struct fec_enet_private *)dev->priv; + fep = netdev_priv(dev); ep = fec_hwp; mii_reg = ep->fec_mii_data; @@ -675,7 +675,7 @@ mii_queue(struct net_device *dev, int re /* Add PHY address to register command. */ - fep = dev->priv; + fep = netdev_priv(dev); regval |= fep->phy_addr << 23; retval = 0; @@ -720,7 +720,7 @@ static void mii_do_cmd(struct net_device static void mii_parse_sr(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); *s &= ~(PHY_STAT_LINK | PHY_STAT_FAULT | PHY_STAT_ANC); @@ -735,7 +735,7 @@ static void mii_parse_sr(uint mii_reg, s static void mii_parse_cr(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); *s &= ~(PHY_CONF_ANE | PHY_CONF_LOOP); @@ -748,7 +748,7 @@ static void mii_parse_cr(uint mii_reg, s static void mii_parse_anar(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); *s &= ~(PHY_CONF_SPMASK); @@ -774,7 +774,7 @@ static void mii_parse_anar(uint mii_reg, static void mii_parse_lxt970_csr(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); *s &= ~(PHY_STAT_SPMASK); @@ -841,7 +841,7 @@ static phy_info_t phy_info_lxt970 = { static void mii_parse_lxt971_sr2(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); *s &= ~(PHY_STAT_SPMASK | PHY_STAT_LINK | PHY_STAT_ANC); @@ -919,7 +919,7 @@ static phy_info_t phy_info_lxt971 = { static void mii_parse_qs6612_pcr(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); *s &= ~(PHY_STAT_SPMASK); @@ -983,7 +983,7 @@ static phy_info_t phy_info_qs6612 = { static void mii_parse_am79c874_dr(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); *s &= ~(PHY_STAT_SPMASK | PHY_STAT_ANC); @@ -1280,7 +1280,7 @@ static void __inline__ fec_uncache(unsig static void mii_display_status(struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); if (!fep->link && !fep->old_link) { @@ -1316,7 +1316,7 @@ static void mii_display_status(struct ne static void mii_display_config(struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); volatile uint *s = &(fep->phy_status); printk("%s: config: auto-negotiation ", dev->name); @@ -1347,7 +1347,7 @@ static void mii_display_config(struct ne static void mii_relink(struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); int duplex; fep->link = (fep->phy_status & PHY_STAT_LINK) ? 1 : 0; @@ -1372,7 +1372,7 @@ static void mii_relink(struct net_device static void mii_queue_relink(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); INIT_WORK(&fep->phy_task, (void*)mii_relink, dev); schedule_work(&fep->phy_task); @@ -1380,7 +1380,7 @@ static void mii_queue_relink(uint mii_re static void mii_queue_config(uint mii_reg, struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); INIT_WORK(&fep->phy_task, (void*)mii_display_config, dev); schedule_work(&fep->phy_task); @@ -1403,7 +1403,7 @@ mii_discover_phy3(uint mii_reg, struct n struct fec_enet_private *fep; int i; - fep = dev->priv; + fep = netdev_priv(dev); fep->phy_id |= (mii_reg & 0xffff); printk("fec: PHY @ 0x%x, ID 0x%08x", fep->phy_addr, fep->phy_id); @@ -1431,7 +1431,7 @@ mii_discover_phy(uint mii_reg, struct ne volatile fec_t *fecp; uint phytype; - fep = dev->priv; + fep = netdev_priv(dev); fecp = fec_hwp; if (fep->phy_addr < 32) { @@ -1466,7 +1466,7 @@ mii_link_interrupt(int irq, void * dev_i #endif { struct net_device *dev = dev_id; - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); fec_phy_ack_intr(); @@ -1482,7 +1482,7 @@ mii_link_interrupt(int irq, void * dev_i static int fec_enet_open(struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); /* I should reset the ring buffers here, but I don't yet know * a simple way to do that. @@ -1531,7 +1531,7 @@ fec_enet_close(struct net_device *dev) static struct net_device_stats *fec_enet_get_stats(struct net_device *dev) { - struct fec_enet_private *fep = (struct fec_enet_private *)dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); return &fep->stats; } @@ -1557,7 +1557,7 @@ static void set_multicast_list(struct ne unsigned int i, j, bit, data, crc; unsigned char hash; - fep = (struct fec_enet_private *)dev->priv; + fep = netdev_priv(dev); ep = fec_hwp; if (dev->flags&IFF_PROMISC) { @@ -1643,7 +1643,7 @@ fec_set_mac_address(struct net_device *d */ int __init fec_enet_init(struct net_device *dev) { - struct fec_enet_private *fep = dev->priv; + struct fec_enet_private *fep = netdev_priv(dev); unsigned long mem_addr; volatile cbd_t *bdp; cbd_t *cbd_base; @@ -1807,7 +1807,7 @@ fec_restart(struct net_device *dev, int fecp = fec_hwp; - fep = dev->priv; + fep = netdev_priv(dev); /* Whack a reset. We should wait for this. */ @@ -1924,7 +1924,7 @@ fec_stop(struct net_device *dev) struct fec_enet_private *fep; fecp = fec_hwp; - fep = dev->priv; + fep = netdev_priv(dev); fecp->fec_x_cntrl = 0x01; /* Graceful transmit stop */ diff -puN drivers/net/gt96100eth.c~drivers_net_casts drivers/net/gt96100eth.c --- linux-264-302-priv/drivers/net/gt96100eth.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/gt96100eth.c 2004-03-02 14:55:22.000000000 -0800 @@ -277,7 +277,7 @@ read_MII(int phy_addr, u32 reg) static void dump_tx_desc(int dbg_lvl, struct net_device *dev, int i) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); gt96100_td_t *td = &gp->tx_ring[i]; dbg(dbg_lvl, "Tx descriptor at 0x%08lx:\n", virt_to_phys(td)); @@ -292,7 +292,7 @@ dump_tx_desc(int dbg_lvl, struct net_dev static void dump_rx_desc(int dbg_lvl, struct net_device *dev, int i) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); gt96100_rd_t *rd = &gp->rx_ring[i]; dbg(dbg_lvl, "Rx descriptor at 0x%08lx:\n", virt_to_phys(rd)); @@ -332,7 +332,7 @@ write_MII(int phy_addr, u32 reg, u16 dat static void dump_tx_ring(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); int i; dbg(0, "%s: txno/txni/cnt=%d/%d/%d\n", __FUNCTION__, @@ -345,7 +345,7 @@ dump_tx_ring(struct net_device *dev) static void dump_rx_ring(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); int i; dbg(0, "%s: rxno=%d\n", __FUNCTION__, gp->rx_next_out); @@ -359,7 +359,7 @@ static void dump_MII(int dbg_lvl, struct net_device *dev) { int i, val; - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); if (dbg_lvl <= GT96100_DEBUG) { for (i=0; i<7; i++) { @@ -419,7 +419,7 @@ dump_skb(int dbg_lvl, struct net_device static int gt96100_add_hash_entry(struct net_device *dev, unsigned char* addr) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); //u16 hashResult, stmp; //unsigned char ctmp, hash_ea[6]; u32 tblEntry1, tblEntry0, *tblEntryAddr; @@ -544,7 +544,7 @@ update_stats(struct gt96100_private *gp) static void abort(struct net_device *dev, u32 abort_bits) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); int timedout = 100; // wait up to 100 msec for hard stop to complete dbg(3, "%s\n", __FUNCTION__); @@ -582,7 +582,7 @@ abort(struct net_device *dev, u32 abort_ static void hard_stop(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); dbg(3, "%s\n", __FUNCTION__); @@ -598,7 +598,7 @@ hard_stop(struct net_device *dev) static void enable_ether_irq(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); u32 intMask; /* * route ethernet interrupt to GT_SERINT0 for port 0, @@ -631,7 +631,7 @@ enable_ether_irq(struct net_device *dev) static void disable_ether_irq(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); u32 intMask; int intr_mask_reg = (gp->port_num == 0) ? GT96100_SERINT0_MASK : GT96100_INT0_HIGH_MASK; @@ -745,7 +745,7 @@ gt96100_probe1(int port_num) goto out1; } - gp = dev->priv; + gp = netdev_priv(dev); memset(gp, 0, sizeof(*gp)); // clear it @@ -839,7 +839,7 @@ out: static void reset_tx(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); int i; abort(dev, sdcmrAT); @@ -877,7 +877,7 @@ reset_tx(struct net_device *dev) static void reset_rx(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); int i; abort(dev, sdcmrAR); @@ -934,7 +934,7 @@ gt96100_check_tx_consistent(struct gt961 static int gt96100_init(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); u32 tmp; u16 mii_reg; @@ -1115,7 +1115,7 @@ gt96100_close(struct net_device *dev) static int gt96100_tx(struct sk_buff *skb, struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); unsigned long flags; int nextIn; @@ -1187,7 +1187,7 @@ gt96100_tx(struct sk_buff *skb, struct n static int gt96100_rx(struct net_device *dev, u32 status) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); struct sk_buff *skb; int pkt_len, nextOut, cdp; gt96100_rd_t *rd; @@ -1296,7 +1296,7 @@ gt96100_rx(struct net_device *dev, u32 s static void gt96100_tx_complete(struct net_device *dev, u32 status) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); int nextOut, cdp; gt96100_td_t *td; u32 cmdstat; @@ -1385,7 +1385,7 @@ static irqreturn_t gt96100_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *)dev_id; - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); u32 status; int handled = 0; @@ -1486,7 +1486,7 @@ gt96100_interrupt(int irq, void *dev_id, static void gt96100_tx_timeout(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); unsigned long flags; spin_lock_irqsave(&gp->lock, flags); @@ -1511,7 +1511,7 @@ gt96100_tx_timeout(struct net_device *de static void gt96100_set_rx_mode(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); unsigned long flags; //struct dev_mc_list *mcptr; @@ -1555,7 +1555,7 @@ gt96100_set_rx_mode(struct net_device *d static struct net_device_stats * gt96100_get_stats(struct net_device *dev) { - struct gt96100_private *gp = (struct gt96100_private *)dev->priv; + struct gt96100_private *gp = netdev_priv(dev); unsigned long flags; dbg(3, "%s: dev=%p\n", __FUNCTION__, dev); diff -puN drivers/net/mac89x0.c~drivers_net_casts drivers/net/mac89x0.c --- linux-264-302-priv/drivers/net/mac89x0.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/mac89x0.c 2004-03-02 14:23:13.000000000 -0800 @@ -225,7 +225,7 @@ struct net_device * __init mac89x0_probe goto out; /* Initialize the net_device structure. */ - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); /* Fill in the 'dev' fields. */ dev->base_addr = ioaddr; @@ -328,7 +328,7 @@ void __init reset_chip(struct net_device static int net_open(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int i; /* Disable the interrupt for now */ @@ -392,7 +392,7 @@ net_send_packet(struct sk_buff *skb, str if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) printk("%s: Transmitter access conflict.\n", dev->name); else { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); unsigned long flags; if (net_debug > 3) @@ -446,7 +446,7 @@ static irqreturn_t net_interrupt(int irq dev->interrupt = 1; ioaddr = dev->base_addr; - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); /* we MUST read all the events out of the ISQ, otherwise we'll never get interrupted again. As a consequence, we can't have any limit @@ -505,7 +505,7 @@ static irqreturn_t net_interrupt(int irq static void net_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); struct sk_buff *skb; int status, length; @@ -571,7 +571,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); unsigned long flags; local_irq_save(flags); @@ -585,7 +585,7 @@ net_get_stats(struct net_device *dev) static void set_multicast_list(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); if(dev->flags&IFF_PROMISC) { diff -puN drivers/net/ni5010.c~drivers_net_casts drivers/net/ni5010.c --- linux-264-302-priv/drivers/net/ni5010.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/ni5010.c 2004-03-02 14:24:14.000000000 -0800 @@ -309,7 +309,7 @@ static int __init ni5010_probe1(struct n PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name)); /* DMA is not supported (yet?), so no use detecting it */ - lp = (struct ni5010_local*)dev->priv; + lp = netdev_priv(dev); spin_lock_init(&lp->lock); @@ -484,7 +484,7 @@ static irqreturn_t ni5010_interrupt(int PRINTK2((KERN_DEBUG "%s: entering ni5010_interrupt\n", dev->name)); ioaddr = dev->base_addr; - lp = (struct ni5010_local *)dev->priv; + lp = netdev_priv(dev); spin_lock(&lp->lock); status = inb(IE_ISTAT); @@ -527,7 +527,7 @@ static void dump_packet(void *buf, int l /* We have a good packet, get it out of the buffer. */ static void ni5010_rx(struct net_device *dev) { - struct ni5010_local *lp = (struct ni5010_local *)dev->priv; + struct ni5010_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; unsigned char rcv_stat; struct sk_buff *skb; @@ -592,7 +592,7 @@ static void ni5010_rx(struct net_device static int process_xmt_interrupt(struct net_device *dev) { - struct ni5010_local *lp = (struct ni5010_local *)dev->priv; + struct ni5010_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int xmit_stat; @@ -651,7 +651,7 @@ static int ni5010_close(struct net_devic closed. */ static struct net_device_stats *ni5010_get_stats(struct net_device *dev) { - struct ni5010_local *lp = (struct ni5010_local *)dev->priv; + struct ni5010_local *lp = netdev_priv(dev); PRINTK2((KERN_DEBUG "%s: entering ni5010_get_stats\n", dev->name)); @@ -693,7 +693,7 @@ static void ni5010_set_multicast_list(st static void hardware_send_packet(struct net_device *dev, char *buf, int length, int pad) { - struct ni5010_local *lp = (struct ni5010_local *)dev->priv; + struct ni5010_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; unsigned long flags; unsigned int buf_offs; diff -puN drivers/net/rrunner.c~drivers_net_casts drivers/net/rrunner.c --- linux-264-302-priv/drivers/net/rrunner.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/rrunner.c 2004-03-02 14:54:42.000000000 -0800 @@ -108,7 +108,7 @@ static int __devinit rr_init_one(struct goto out2; } - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); @@ -236,7 +236,7 @@ static void __devexit rr_remove_one (str struct net_device *dev = pci_get_drvdata(pdev); if (dev) { - struct rr_private *rr = dev->priv; + struct rr_private *rr = netdev_priv(dev); if (!(readl(&rr->regs->HostCtrl) & NIC_HALTED)){ printk(KERN_ERR "%s: trying to unload running NIC\n", @@ -308,7 +308,7 @@ static int rr_reset(struct net_device *d u32 start_pc; int i; - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); regs = rrpriv->regs; rr_load_firmware(dev); @@ -524,7 +524,7 @@ static int __init rr_init(struct net_dev u32 sram_size, rev; int i; - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); regs = rrpriv->regs; rev = readl(®s->FwRev); @@ -595,7 +595,7 @@ static int rr_init1(struct net_device *d int ecode = 0; short i; - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); regs = rrpriv->regs; spin_lock_irqsave(&rrpriv->lock, flags); @@ -761,7 +761,7 @@ static u32 rr_handle_event(struct net_de struct rr_regs *regs; u32 tmp; - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); regs = rrpriv->regs; while (prodidx != eidx){ @@ -960,7 +960,7 @@ static u32 rr_handle_event(struct net_de static void rx_int(struct net_device *dev, u32 rxlimit, u32 index) { - struct rr_private *rrpriv = (struct rr_private *)dev->priv; + struct rr_private *rrpriv = netdev_priv(dev); struct rr_regs *regs = rrpriv->regs; do { @@ -1052,7 +1052,7 @@ static irqreturn_t rr_interrupt(int irq, struct net_device *dev = (struct net_device *)dev_id; u32 prodidx, rxindex, eidx, txcsmr, rxlimit, txcon; - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); regs = rrpriv->regs; if (!(readl(®s->HostCtrl) & RR_INT)) @@ -1133,7 +1133,7 @@ static irqreturn_t rr_interrupt(int irq, static void rr_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct rr_private *rrpriv = (struct rr_private *)dev->priv; + struct rr_private *rrpriv = netdev_priv(dev); struct rr_regs *regs = rrpriv->regs; unsigned long flags; @@ -1160,7 +1160,7 @@ static void rr_timer(unsigned long data) static int rr_open(struct net_device *dev) { - struct rr_private *rrpriv = (struct rr_private *)dev->priv; + struct rr_private *rrpriv = netdev_priv(dev); struct pci_dev *pdev = rrpriv->pci_dev; struct rr_regs *regs; int ecode = 0; @@ -1296,7 +1296,7 @@ static void rr_dump(struct net_device *d short i; int len; - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); regs = rrpriv->regs; printk("%s: dumping NIC TX rings\n", dev->name); @@ -1361,7 +1361,7 @@ static int rr_close(struct net_device *d netif_stop_queue(dev); - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); regs = rrpriv->regs; /* @@ -1418,7 +1418,7 @@ static int rr_close(struct net_device *d static int rr_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct rr_private *rrpriv = (struct rr_private *)dev->priv; + struct rr_private *rrpriv = netdev_priv(dev); struct rr_regs *regs = rrpriv->regs; struct ring_ctrl *txctrl; unsigned long flags; @@ -1488,7 +1488,7 @@ static struct net_device_stats *rr_get_s { struct rr_private *rrpriv; - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); return(&rrpriv->stats); } @@ -1511,7 +1511,7 @@ static int rr_load_firmware(struct net_d u32 p2len, p2size, nr_seg, revision, io, sram_size; struct eeprom *hw = NULL; - rrpriv = (struct rr_private *)dev->priv; + rrpriv = netdev_priv(dev); regs = rrpriv->regs; if (dev->flags & IFF_UP) @@ -1614,7 +1614,7 @@ static int rr_ioctl(struct net_device *d unsigned int i; int error = -EOPNOTSUPP; - rrpriv = dev->priv; + rrpriv = netdev_priv(dev); switch(cmd){ case SIOCRRGFW: diff -puN drivers/net/sb1000.c~drivers_net_casts drivers/net/sb1000.c --- linux-264-302-priv/drivers/net/sb1000.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/sb1000.c 2004-03-02 14:29:21.000000000 -0800 @@ -746,7 +746,7 @@ sb1000_rx(struct net_device *dev) int ioaddr, ns; unsigned int skbsize; struct sk_buff *skb; - struct sb1000_private *lp = (struct sb1000_private *)dev->priv; + struct sb1000_private *lp = netdev_priv(dev); struct net_device_stats *stats = &lp->stats; /* SB1000 frame constants */ @@ -905,7 +905,7 @@ sb1000_error_dpc(struct net_device *dev) char *name; unsigned char st[5]; int ioaddr[2]; - struct sb1000_private *lp = (struct sb1000_private *)dev->priv; + struct sb1000_private *lp = netdev_priv(dev); const unsigned char Command0[6] = {0x80, 0x26, 0x00, 0x00, 0x00, 0x00}; const int ErrorDpcCounterInitialize = 200; @@ -932,7 +932,7 @@ sb1000_open(struct net_device *dev) { char *name; int ioaddr[2], status; - struct sb1000_private *lp = (struct sb1000_private *)dev->priv; + struct sb1000_private *lp = netdev_priv(dev); const unsigned short FirmwareVersion[] = {0x01, 0x01}; ioaddr[0] = dev->base_addr; @@ -998,7 +998,7 @@ static int sb1000_dev_ioctl(struct net_d short PID[4]; int ioaddr[2], status, frequency; unsigned int stats[5]; - struct sb1000_private *lp = (struct sb1000_private *)dev->priv; + struct sb1000_private *lp = netdev_priv(dev); if (!(dev && dev->flags & IFF_UP)) return -ENODEV; @@ -1092,7 +1092,7 @@ static irqreturn_t sb1000_interrupt(int unsigned char st; int ioaddr[2]; struct net_device *dev = (struct net_device *) dev_id; - struct sb1000_private *lp = (struct sb1000_private *)dev->priv; + struct sb1000_private *lp = netdev_priv(dev); const unsigned char Command0[6] = {0x80, 0x2c, 0x00, 0x00, 0x00, 0x00}; const unsigned char Command1[6] = {0x80, 0x2e, 0x00, 0x00, 0x00, 0x00}; @@ -1148,7 +1148,7 @@ static irqreturn_t sb1000_interrupt(int static struct net_device_stats *sb1000_stats(struct net_device *dev) { - struct sb1000_private *lp = (struct sb1000_private *)dev->priv; + struct sb1000_private *lp = netdev_priv(dev); return &lp->stats; } @@ -1156,7 +1156,7 @@ static int sb1000_close(struct net_devic { int i; int ioaddr[2]; - struct sb1000_private *lp = (struct sb1000_private *)dev->priv; + struct sb1000_private *lp = netdev_priv(dev); if (sb1000_debug > 2) printk(KERN_DEBUG "%s: Shutting down sb1000.\n", dev->name); diff -puN drivers/net/sb1250-mac.c~drivers_net_casts drivers/net/sb1250-mac.c --- linux-264-302-priv/drivers/net/sb1250-mac.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/sb1250-mac.c 2004-03-02 14:32:50.000000000 -0800 @@ -2080,7 +2080,7 @@ static int sbmac_set_duplex(struct sbmac static irqreturn_t sbmac_intr(int irq,void *dev_instance,struct pt_regs *rgs) { struct net_device *dev = (struct net_device *) dev_instance; - struct sbmac_softc *sc = (struct sbmac_softc *) (dev->priv); + struct sbmac_softc *sc = netdev_priv(dev); uint64_t isr; int handled = 0; @@ -2150,7 +2150,7 @@ static irqreturn_t sbmac_intr(int irq,vo ********************************************************************* */ static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) { - struct sbmac_softc *sc = (struct sbmac_softc *)dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); /* lock eth irq */ spin_lock_irq (&sc->sbm_lock); @@ -2374,7 +2374,7 @@ static int sbmac_init(struct net_device int i; int err; - sc = (struct sbmac_softc *)dev->priv; + sc = netdev_priv(dev); /* Determine controller base address */ @@ -2454,7 +2454,7 @@ static int sbmac_init(struct net_device static int sbmac_open(struct net_device *dev) { - struct sbmac_softc *sc = (struct sbmac_softc *)dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); if (debug > 1) { printk(KERN_DEBUG "%s: sbmac_open() irq %d.\n", dev->name, dev->irq); @@ -2609,7 +2609,7 @@ static int sbmac_mii_poll(struct sbmac_s static void sbmac_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct sbmac_softc *sc = (struct sbmac_softc *)dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); int next_tick = HZ; int mii_status; @@ -2655,7 +2655,7 @@ static void sbmac_timer(unsigned long da static void sbmac_tx_timeout (struct net_device *dev) { - struct sbmac_softc *sc = (struct sbmac_softc *) dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); spin_lock_irq (&sc->sbm_lock); @@ -2673,7 +2673,7 @@ static void sbmac_tx_timeout (struct net static struct net_device_stats *sbmac_get_stats(struct net_device *dev) { - struct sbmac_softc *sc = (struct sbmac_softc *)dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); unsigned long flags; spin_lock_irqsave(&sc->sbm_lock, flags); @@ -2691,7 +2691,7 @@ static void sbmac_set_rx_mode(struct net { unsigned long flags; int msg_flag = 0; - struct sbmac_softc *sc = (struct sbmac_softc *)dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); spin_lock_irqsave(&sc->sbm_lock, flags); if ((dev->flags ^ sc->sbm_devflags) & IFF_PROMISC) { @@ -2726,7 +2726,7 @@ static void sbmac_set_rx_mode(struct net static int sbmac_mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct sbmac_softc *sc = (struct sbmac_softc *)dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); u16 *data = (u16 *)&rq->ifr_data; unsigned long flags; int retval; @@ -2762,7 +2762,7 @@ static int sbmac_mii_ioctl(struct net_de static int sbmac_close(struct net_device *dev) { - struct sbmac_softc *sc = (struct sbmac_softc *)dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); unsigned long flags; int irq; @@ -2911,7 +2911,7 @@ sbmac_cleanup_module(void) for (idx = 0; idx < MAX_UNITS; idx++) { dev = dev_sbmac[idx]; if (!dev) { - struct sbmac_softc *sc = dev->priv; + struct sbmac_softc *sc = netdev_priv(dev); unregister_netdev(dev); sbmac_uninitctx(sc); free_netdev(dev); diff -puN drivers/net/seeq8005.c~drivers_net_casts drivers/net/seeq8005.c --- linux-264-302-priv/drivers/net/seeq8005.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/seeq8005.c 2004-03-02 14:33:41.000000000 -0800 @@ -357,7 +357,7 @@ out: */ static int seeq8005_open(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); { int irqval = request_irq(dev->irq, &seeq8005_interrupt, 0, "seeq8005", dev); @@ -390,7 +390,7 @@ static void seeq8005_timeout(struct net_ static int seeq8005_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); short length = skb->len; unsigned char *buf; @@ -424,7 +424,7 @@ static irqreturn_t seeq8005_interrupt(in int handled = 0; ioaddr = dev->base_addr; - lp = (struct net_local *)dev->priv; + lp = netdev_priv(dev); status = inw(SEEQ_STATUS); do { @@ -462,7 +462,7 @@ static irqreturn_t seeq8005_interrupt(in /* We have a good packet(s), get it/them out of the buffers. */ static void seeq8005_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int boguscount = 10; int pkt_hdr; int ioaddr = dev->base_addr; @@ -561,7 +561,7 @@ static void seeq8005_rx(struct net_devic /* The inverse routine to net_open(). */ static int seeq8005_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; @@ -583,7 +583,7 @@ static int seeq8005_close(struct net_dev closed. */ static struct net_device_stats *seeq8005_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; } @@ -618,7 +618,7 @@ static void set_multicast_list(struct ne void seeq8005_init(struct net_device *dev, int startp) { - struct net_local *lp = (struct net_local *)dev->priv; + struct net_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int i; diff -puN drivers/net/sgiseeq.c~drivers_net_casts drivers/net/sgiseeq.c --- linux-264-302-priv/drivers/net/sgiseeq.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/sgiseeq.c 2004-03-02 14:35:32.000000000 -0800 @@ -151,7 +151,7 @@ static inline void seeq_load_eaddr(struc static int seeq_init_ring(struct net_device *dev) { - struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv; + struct sgiseeq_private *sp = netdev_priv(dev); volatile struct sgiseeq_init_block *ib = &sp->srings; int i; @@ -423,7 +423,7 @@ static inline void sgiseeq_tx(struct net static irqreturn_t sgiseeq_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; - struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv; + struct sgiseeq_private *sp = netdev_priv(dev); struct hpc3_ethregs *hregs = sp->hregs; struct sgiseeq_regs *sregs = sp->sregs; @@ -445,7 +445,7 @@ static irqreturn_t sgiseeq_interrupt(int static int sgiseeq_open(struct net_device *dev) { - struct sgiseeq_private *sp = (struct sgiseeq_private *)dev->priv; + struct sgiseeq_private *sp = netdev_priv(dev); struct sgiseeq_regs *sregs = sp->sregs; int err = init_seeq(dev, sp, sregs); @@ -459,7 +459,7 @@ static int sgiseeq_open(struct net_devic static int sgiseeq_close(struct net_device *dev) { - struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv; + struct sgiseeq_private *sp = netdev_priv(dev); struct sgiseeq_regs *sregs = sp->sregs; netif_stop_queue(dev); @@ -472,7 +472,7 @@ static int sgiseeq_close(struct net_devi static inline int sgiseeq_reset(struct net_device *dev) { - struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv; + struct sgiseeq_private *sp = netdev_priv(dev); struct sgiseeq_regs *sregs = sp->sregs; int err; @@ -494,7 +494,7 @@ void sgiseeq_my_reset(void) static int sgiseeq_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv; + struct sgiseeq_private *sp = netdev_priv(dev); struct hpc3_ethregs *hregs = sp->hregs; unsigned long flags; struct sgiseeq_tx_desc *td; @@ -560,7 +560,7 @@ static void timeout(struct net_device *d static struct net_device_stats *sgiseeq_get_stats(struct net_device *dev) { - struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv; + struct sgiseeq_private *sp = netdev_priv(dev); return &sp->stats; } @@ -710,7 +710,7 @@ static void __exit sgiseeq_exit(void) struct net_device *next, *dev = root_sgiseeq_dev; while (dev) { - sp = (struct sgiseeq_private *) dev->priv; + sp = netdev_priv(dev); next = sp->next_module; unregister_netdev(dev); free_irq(dev->irq, dev); diff -puN drivers/net/sk_g16.c~drivers_net_casts drivers/net/sk_g16.c --- linux-264-302-priv/drivers/net/sk_g16.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/sk_g16.c 2004-03-02 14:37:18.000000000 -0800 @@ -650,7 +650,7 @@ int __init SK_probe(struct net_device *d int sk_addr_flag = 0; /* SK ADDR correct? 1 - no, 0 - yes */ unsigned int rom_addr; /* used to store RAM address used for POS_ADDR */ - struct priv *p = dev->priv; /* SK_G16 private structure */ + struct priv *p = netdev_priv(dev); /* SK_G16 private structure */ if (inb(SK_POS0) != SK_IDLOW || inb(SK_POS1) != SK_IDHIGH) return -ENODEV; @@ -869,7 +869,7 @@ static int SK_open(struct net_device *de int irqtab[] = SK_IRQS; - struct priv *p = (struct priv *)dev->priv; + struct priv *p = netdev_priv(dev); PRINTK(("## %s: At beginning of SK_open(). CSR0: %#06x\n", SK_NAME, SK_read_reg(CSR0))); @@ -1023,7 +1023,7 @@ static int SK_lance_init(struct net_devi { int i; unsigned long flags; - struct priv *p = (struct priv *) dev->priv; + struct priv *p = netdev_priv(dev); struct tmd *tmdp; struct rmd *rmdp; @@ -1196,7 +1196,7 @@ static void SK_timeout(struct net_device static int SK_send_packet(struct sk_buff *skb, struct net_device *dev) { - struct priv *p = (struct priv *) dev->priv; + struct priv *p = netdev_priv(dev); struct tmd *tmdp; static char pad[64]; @@ -1285,7 +1285,7 @@ static irqreturn_t SK_interrupt(int irq, { int csr0; struct net_device *dev = dev_id; - struct priv *p = (struct priv *) dev->priv; + struct priv *p = netdev_priv(dev); PRINTK2(("## %s: SK_interrupt(). status: %#06x\n", @@ -1355,7 +1355,7 @@ static void SK_txintr(struct net_device { int tmdstat; struct tmd *tmdp; - struct priv *p = (struct priv *) dev->priv; + struct priv *p = netdev_priv(dev); PRINTK2(("## %s: SK_txintr() status: %#06x\n", @@ -1469,7 +1469,7 @@ static void SK_rxintr(struct net_device struct rmd *rmdp; int rmdstat; - struct priv *p = (struct priv *) dev->priv; + struct priv *p = netdev_priv(dev); PRINTK2(("## %s: SK_rxintr(). CSR0: %#06x\n", SK_NAME, SK_read_reg(CSR0))); @@ -1653,7 +1653,7 @@ static int SK_close(struct net_device *d static struct net_device_stats *SK_get_stats(struct net_device *dev) { - struct priv *p = (struct priv *) dev->priv; + struct priv *p = netdev_priv(dev); PRINTK(("## %s: SK_get_stats(). CSR0: %#06x\n", SK_NAME, SK_read_reg(CSR0))); @@ -2030,7 +2030,7 @@ void __init SK_print_ram(struct net_devi { int i; - struct priv *p = (struct priv *) dev->priv; + struct priv *p = netdev_priv(dev); printk("## %s: RAM Details.\n" "## RAM at %#08x tmdhead: %#08x rmdhead: %#08x initblock: %#08x\n", diff -puN drivers/net/smc9194.c~drivers_net_casts drivers/net/smc9194.c --- linux-264-302-priv/drivers/net/smc9194.c~drivers_net_casts 2004-03-02 13:38:28.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/net/smc9194.c 2004-03-02 14:38:31.000000000 -0800 @@ -465,7 +465,7 @@ static void smc_setmulticast( int ioaddr */ static int smc_wait_to_send_packet( struct sk_buff * skb, struct net_device * dev ) { - struct smc_local *lp = (struct smc_local *)dev->priv; + struct smc_local *lp = netdev_priv(dev); unsigned short ioaddr = dev->base_addr; word length; unsigned short numPages; @@ -576,7 +576,7 @@ static int smc_wait_to_send_packet( stru */ static void smc_hardware_send_packet( struct net_device * dev ) { - struct smc_local *lp = (struct smc_local *)dev->priv; + struct smc_local *lp = netdev_priv(dev); byte packet_no; struct sk_buff * skb = lp->saved_skb; word length; @@ -1150,7 +1150,7 @@ static irqreturn_t smc_interrupt(int irq { struct net_device *dev = dev_id; int ioaddr = dev->base_addr; - struct smc_local *lp = (struct smc_local *)dev->priv; + struct smc_local *lp = netdev_priv(dev); byte status; word card_stats; @@ -1274,7 +1274,7 @@ static irqreturn_t smc_interrupt(int irq */ static void smc_rcv(struct net_device *dev) { - struct smc_local *lp = (struct smc_local *)dev->priv; + struct smc_local *lp = netdev_priv(dev); int ioaddr = dev->base_addr; int packet_number; word status; @@ -1401,7 +1401,7 @@ done: static void smc_tx( struct net_device * dev ) { int ioaddr = dev->base_addr; - struct smc_local *lp = (struct smc_local *)dev->priv; + struct smc_local *lp = netdev_priv(dev); byte saved_packet; byte packet_no; word tx_status; @@ -1474,7 +1474,7 @@ static int smc_close(struct net_device * . This may be called with the card open or closed. .-------------------------------------------------------------*/ static struct net_device_stats* smc_query_statistics(struct net_device *dev) { - struct smc_local *lp = (struct smc_local *)dev->priv; + struct smc_local *lp = netdev_priv(dev); return &lp->stats; } _ -- ~Randy From rddunlap@osdl.org Thu Mar 4 13:21:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:21:51 -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 i24LLYKO019974 for ; Thu, 4 Mar 2004 13:21:35 -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 i24LLTE29500 for ; Thu, 4 Mar 2004 13:21:29 -0800 Date: Thu, 4 Mar 2004 13:20:37 -0800 From: "Randy.Dunlap" To: netdev Subject: Re: [janitor] use netdev_priv() in fusion/mptlan Message-Id: <20040304132037.5c447dde.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: 3755 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: 3583 Lines: 113 | | From: Carlo Perassi | and Randy.Dunap -- ~Randy linux-264-302-priv-rddunlap/drivers/message/fusion/mptlan.c | 20 ++++++------ 1 files changed, 10 insertions(+), 10 deletions(-) diff -puN drivers/message/fusion/mptlan.c~fusion_mptlan_casts drivers/message/fusion/mptlan.c --- linux-264-302-priv/drivers/message/fusion/mptlan.c~fusion_mptlan_casts 2004-03-02 12:48:15.000000000 -0800 +++ linux-264-302-priv-rddunlap/drivers/message/fusion/mptlan.c 2004-03-02 12:52:10.000000000 -0800 @@ -337,7 +337,7 @@ static int mpt_lan_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) { struct net_device *dev = mpt_landev[ioc->id]; - struct mpt_lan_priv *priv = (struct mpt_lan_priv *) dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); dlprintk((KERN_INFO MYNAM ": IOC %s_reset routed to LAN driver!\n", reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")); @@ -406,7 +406,7 @@ mpt_lan_event_process(MPT_ADAPTER *ioc, static int mpt_lan_open(struct net_device *dev) { - struct mpt_lan_priv *priv = (struct mpt_lan_priv *) dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); int i; if (mpt_lan_reset(dev) != 0) { @@ -497,7 +497,7 @@ mpt_lan_reset(struct net_device *dev) { MPT_FRAME_HDR *mf; LANResetRequest_t *pResetReq; - struct mpt_lan_priv *priv = (struct mpt_lan_priv *)dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); mf = mpt_get_msg_frame(LanCtx, priv->mpt_dev->id); @@ -526,7 +526,7 @@ mpt_lan_reset(struct net_device *dev) static int mpt_lan_close(struct net_device *dev) { - struct mpt_lan_priv *priv = (struct mpt_lan_priv *) dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); MPT_ADAPTER *mpt_dev = priv->mpt_dev; unsigned int timeout; int i; @@ -587,7 +587,7 @@ mpt_lan_close(struct net_device *dev) static struct net_device_stats * mpt_lan_get_stats(struct net_device *dev) { - struct mpt_lan_priv *priv = (struct mpt_lan_priv *)dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); return (struct net_device_stats *) &priv->stats; } @@ -607,7 +607,7 @@ mpt_lan_change_mtu(struct net_device *de static void mpt_lan_tx_timeout(struct net_device *dev) { - struct mpt_lan_priv *priv = (struct mpt_lan_priv *) dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); MPT_ADAPTER *mpt_dev = priv->mpt_dev; if (mpt_dev->active) { @@ -621,7 +621,7 @@ mpt_lan_tx_timeout(struct net_device *de static int mpt_lan_send_turbo(struct net_device *dev, u32 tmsg) { - struct mpt_lan_priv *priv = (struct mpt_lan_priv *) dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); MPT_ADAPTER *mpt_dev = priv->mpt_dev; struct sk_buff *sent; unsigned long flags; @@ -654,7 +654,7 @@ mpt_lan_send_turbo(struct net_device *de static int mpt_lan_send_reply(struct net_device *dev, LANSendReply_t *pSendRep) { - struct mpt_lan_priv *priv = (struct mpt_lan_priv *) dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); MPT_ADAPTER *mpt_dev = priv->mpt_dev; struct sk_buff *sent; unsigned long flags; @@ -727,7 +727,7 @@ out: static int mpt_lan_sdu_send (struct sk_buff *skb, struct net_device *dev) { - struct mpt_lan_priv *priv = (struct mpt_lan_priv *) dev->priv; + struct mpt_lan_priv *priv = netdev_priv(dev); MPT_ADAPTER *mpt_dev = priv->mpt_dev; MPT_FRAME_HDR *mf; LANSendRequest_t *pSendReq; @@ -1369,7 +1369,7 @@ mpt_register_lan_device (MPT_ADAPTER *mp dev->mtu = MPT_LAN_MTU; - priv = (struct mpt_lan_priv *) dev->priv; + priv = netdev_priv(dev); priv->mpt_dev = mpt_dev; priv->pnum = pnum; _ -- ~Randy From rz5b@cs.virginia.edu Thu Mar 4 13:52:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 13:52:37 -0800 (PST) Received: from ares.cs.Virginia.EDU (ares.cs.Virginia.EDU [128.143.137.19]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24LqSKO027023 for ; Thu, 4 Mar 2004 13:52:28 -0800 Received: from mamba.cs.Virginia.EDU (mamba.cs.Virginia.EDU [128.143.137.15]) by ares.cs.Virginia.EDU (8.12.10/8.12.10/UVACS-2004022400) with ESMTP id i24LqNKn009806; Thu, 4 Mar 2004 16:52:23 -0500 (EST) Received: from localhost (rz5b@localhost) by mamba.cs.Virginia.EDU (8.11.6+Sun/8.9.2) with ESMTP id i24LqMt10688; Thu, 4 Mar 2004 16:52:22 -0500 (EST) X-Authentication-Warning: mamba.cs.Virginia.EDU: rz5b owned process doing -bs Date: Thu, 4 Mar 2004 16:52:22 -0500 (EST) From: Ronghua Zhang To: Vivek Kashyap cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH] proportional share accept() In-Reply-To: Message-ID: References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 3757 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rz5b@cs.virginia.edu Precedence: bulk X-list: netdev Content-Length: 3604 Lines: 86 This is not surprising, since using iptable means every packet, inbound or outbound, has to be changed. My scheme does not have this overhead either, for it only involves moving open_request among the accept queues. Ronghua On Thu, 4 Mar 2004, Vivek Kashyap wrote: > 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 kuznet@ms2.inr.ac.ru Thu Mar 4 14:03:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 14:03:27 -0800 (PST) Received: from yakov.inr.ac.ru ([194.67.69.111]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24M32KO028847 for ; Thu, 4 Mar 2004 14:03:03 -0800 Received: (from kuznet@localhost) by yakov.inr.ac.ru (8.6.13/ANK) id BAA10586; Fri, 5 Mar 2004 01:02:18 +0300 From: kuznet@ms2.inr.ac.ru Message-Id: <200403042202.BAA10586@yakov.inr.ac.ru> Subject: Re: PMTU issues due to TOS field manipulation (for DSCP) To: ja@ssi.bg (Julian Anastasov) Date: Fri, 5 Mar 2004 01:02:18 +0300 (MSK) Cc: davem@redhat.com, niv@us.ibm.com, ak@suse.de, ruddk@us.ibm.com, netdev@oss.sgi.com, chester.f.johnson@intel.com In-Reply-To: from "Julian Anastasov" at íÁŇ 04, 2004 10:56:26 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: 3758 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Content-Length: 865 Lines: 27 Hello! > - do we need to walk all tos values for ip_rt_redirect in the same > way as for ip_rt_frag_needed, Well, it is just the same thing (except for one thing, that ignored redirects are harmless) > - 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 "message but we are sure we hit the target IP directly" You cannot be sure, actually. This happens and resolves the situation when the things sort ip route add default dev eth0 are used i.e. host does not know real prefixes. If this is a security issue (I do not see actually, the things on link can be screwed via proxy arp et all in any case), make it a separate option or even better use IN_DEV_SEC_REDIRECTS(in_dev) like similar paranoid case for !shared_media case. Alexey From ralf@linux-mips.org Thu Mar 4 14:04:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 14:04:28 -0800 (PST) Received: from mail.linux-mips.net (p508B7C93.dip.t-dialin.net [80.139.124.147]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i24M4NKO029263 for ; Thu, 4 Mar 2004 14:04:25 -0800 Received: from fluff.linux-mips.net (fluff.linux-mips.net [127.0.0.1]) by mail.linux-mips.net (8.12.8/8.12.8) with ESMTP id i24M4Lex017125 for ; Thu, 4 Mar 2004 23:04:21 +0100 Received: (from ralf@localhost) by fluff.linux-mips.net (8.12.8/8.12.8/Submit) id i24M4L57017124 for netdev@oss.sgi.com; Thu, 4 Mar 2004 23:04:21 +0100 Date: Thu, 4 Mar 2004 23:04:21 +0100 From: Ralf Baechle To: netdev Subject: [janitor] use netdev_priv() in NET/ROM and ROSE. Message-ID: <20040304220421.GA16866@linux-mips.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 3759 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ralf@linux-mips.org Precedence: bulk X-list: netdev Content-Length: 2792 Lines: 88 netdev_priv-ify two more drivers. Index: net/netrom/nr_dev.c =================================================================== RCS file: /home/cvs/linux/net/netrom/nr_dev.c,v retrieving revision 1.16 diff -u -r1.16 nr_dev.c --- net/netrom/nr_dev.c 10 Jan 2004 04:59:58 -0000 1.16 +++ net/netrom/nr_dev.c 4 Mar 2004 21:58:28 -0000 @@ -46,7 +46,7 @@ int nr_rx_ip(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); if (!netif_running(dev)) { stats->rx_errors++; @@ -73,7 +73,7 @@ static int nr_rebuild_header(struct sk_buff *skb) { struct net_device *dev = skb->dev; - struct net_device_stats *stats = (struct net_device_stats *)dev->priv; + struct net_device_stats *stats = netdev_priv(dev); struct sk_buff *skbn; unsigned char *bp = skb->data; int len; @@ -186,7 +186,7 @@ static int nr_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); dev_kfree_skb(skb); stats->tx_errors++; return 0; @@ -194,7 +194,7 @@ static struct net_device_stats *nr_get_stats(struct net_device *dev) { - return (struct net_device_stats *)dev->priv; + return netdev_priv(dev); } void nr_setup(struct net_device *dev) Index: net/rose/rose_dev.c =================================================================== RCS file: /home/cvs/linux/net/rose/rose_dev.c,v retrieving revision 1.17 diff -u -r1.17 rose_dev.c --- net/rose/rose_dev.c 15 Aug 2003 15:14:41 -0000 1.17 +++ net/rose/rose_dev.c 4 Mar 2004 21:58:28 -0000 @@ -43,7 +43,7 @@ int rose_rx_ip(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); #ifdef CONFIG_INET if (!netif_running(dev)) { @@ -89,7 +89,7 @@ static int rose_rebuild_header(struct sk_buff *skb) { struct net_device *dev = skb->dev; - struct net_device_stats *stats = (struct net_device_stats *)dev->priv; + struct net_device_stats *stats = netdev_priv(dev); unsigned char *bp = (unsigned char *)skb->data; struct sk_buff *skbn; @@ -149,7 +149,7 @@ static int rose_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); if (!netif_running(dev)) { printk(KERN_ERR "ROSE: rose_xmit - called when iface is down\n"); @@ -162,7 +162,7 @@ static struct net_device_stats *rose_get_stats(struct net_device *dev) { - return (struct net_device_stats *)dev->priv; + return netdev_priv(dev); } void rose_setup(struct net_device *dev) From rddunlap@osdl.org Thu Mar 4 14:16:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 14:16:55 -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 i24MGqKO031004 for ; Thu, 4 Mar 2004 14:16:52 -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 i24MGkE05974; Thu, 4 Mar 2004 14:16:46 -0800 Date: Thu, 4 Mar 2004 14:15:53 -0800 From: "Randy.Dunlap" To: netdev Cc: jgarzik Subject: [PATCH] remove magic number for netdev alignment Message-Id: <20040304141553.0080a1ba.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: 3760 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: 2458 Lines: 79 Hi, Please apply to 2.6.current. -- ~Randy // Linux 2.6.3 // remove magic number of '31' for net_device and private alignment; diffstat:= drivers/net/net_init.c | 13 ++++++++----- include/linux/netdevice.h | 7 ++++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff -Naurp ./drivers/net/net_init.c~netpriv ./drivers/net/net_init.c --- ./drivers/net/net_init.c~netpriv 2004-02-17 19:57:14.000000000 -0800 +++ ./drivers/net/net_init.c 2004-03-04 14:15:17.000000000 -0800 @@ -79,8 +79,9 @@ struct net_device *alloc_netdev(int size /* ensure 32-byte alignment of both the device and private area */ - alloc_size = (sizeof(struct net_device) + 31) & ~31; - alloc_size += sizeof_priv + 31; + alloc_size = (sizeof(struct net_device) + NETDEV_ALIGN_CONST) + & ~NETDEV_ALIGN_CONST; + alloc_size += sizeof_priv + NETDEV_ALIGN_CONST; p = kmalloc (alloc_size, GFP_KERNEL); if (!p) { @@ -90,7 +91,8 @@ struct net_device *alloc_netdev(int size memset(p, 0, alloc_size); - dev = (struct net_device *)(((long)p + 31) & ~31); + dev = (struct net_device *)(((long)p + NETDEV_ALIGN_CONST) + & ~NETDEV_ALIGN_CONST); dev->padded = (char *)dev - (char *)p; if (sizeof_priv) @@ -109,7 +111,7 @@ static struct net_device *init_alloc_dev int alloc_size; /* ensure 32-byte alignment of the private area */ - alloc_size = sizeof (*dev) + sizeof_priv + 31; + alloc_size = sizeof (*dev) + sizeof_priv + NETDEV_ALIGN_CONST; dev = (struct net_device *) kmalloc (alloc_size, GFP_KERNEL); if (dev == NULL) @@ -121,7 +123,8 @@ static struct net_device *init_alloc_dev memset(dev, 0, alloc_size); if (sizeof_priv) - dev->priv = (void *) (((long)(dev + 1) + 31) & ~31); + dev->priv = (void *) (((long)(dev + 1) + NETDEV_ALIGN_CONST) + & ~NETDEV_ALIGN_CONST); return dev; } diff -Naurp ./include/linux/netdevice.h~netpriv ./include/linux/netdevice.h --- ./include/linux/netdevice.h~netpriv 2004-02-17 19:59:32.000000000 -0800 +++ ./include/linux/netdevice.h 2004-03-04 14:13:42.000000000 -0800 @@ -478,9 +478,14 @@ struct net_device int padded; }; +#define NETDEV_ALIGN 32 +#define NETDEV_ALIGN_CONST (NETDEV_ALIGN - 1) + static inline void *netdev_priv(struct net_device *dev) { - return (char *)dev + ((sizeof(struct net_device) + 31) & ~31); + return (char *)dev + ((sizeof(struct net_device) + + NETDEV_ALIGN_CONST) + & ~NETDEV_ALIGN_CONST); } #define SET_MODULE_OWNER(dev) do { } while (0) From ogasawara@osdl.org Thu Mar 4 15:02:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 15:03:01 -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 i24N2ZKO006733 for ; Thu, 4 Mar 2004 15:02:35 -0800 Received: from ibm-d.pdx.osdl.net (ibm-d.pdx.osdl.net [172.20.1.55]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i24N2UE13962; Thu, 4 Mar 2004 15:02:30 -0800 Subject: [PATCH 2.6.4-rc2] sysfs simple class support for netlink From: Leann Ogasawara To: netdev@oss.sgi.com Cc: Hanna Linder , Greg KH Content-Type: text/plain Message-Id: <1078441356.11562.18.camel@ibm-d.pdx.osdl.net> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.4 Date: Thu, 04 Mar 2004 15:02:36 -0800 Content-Transfer-Encoding: 7bit X-archive-position: 3761 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ogasawara@osdl.org Precedence: bulk X-list: netdev Content-Length: 2076 Lines: 74 Hi All, Patch adds sysfs simple class support for netlink character device (Major 36). Feedback appreciated. Thanks, Leann ===== net/netlink/netlink_dev.c 1.19 vs edited ===== --- 1.19/net/netlink/netlink_dev.c Tue Aug 26 09:25:41 2003 +++ edited/net/netlink/netlink_dev.c Thu Mar 4 12:42:44 2004 @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,7 @@ static long open_map; static struct socket *netlink_user[MAX_LINKS]; +static struct class_simple *netlink_class; /* * Device operations @@ -229,17 +231,26 @@ return -EIO; } + netlink_class = class_simple_create(THIS_MODULE, "netlink"); + if (IS_ERR(netlink_class)) { + printk (KERN_ERR "Error creating netlink class.\n"); + unregister_chrdev(NETLINK_MAJOR, "netlink"); + return PTR_ERR(netlink_class); + } + devfs_mk_dir("netlink"); /* Someone tell me the official names for the uppercase ones */ for (i = 0; i < ARRAY_SIZE(entries); i++) { devfs_mk_cdev(MKDEV(NETLINK_MAJOR, entries[i].minor), S_IFCHR|S_IRUSR|S_IWUSR, "netlink/%s", entries[i].name); + class_simple_device_add(netlink_class, MKDEV(NETLINK_MAJOR, entries[i].minor), NULL, "%s", entries[i].name); } for (i = 0; i < 16; i++) { devfs_mk_cdev(MKDEV(NETLINK_MAJOR, i + 16), S_IFCHR|S_IRUSR|S_IWUSR, "netlink/tap%d", i); + class_simple_device_add(netlink_class, MKDEV(NETLINK_MAJOR, i + 16), NULL, "tap%d", i); } return 0; @@ -249,11 +260,16 @@ { int i; - for (i = 0; i < ARRAY_SIZE(entries); i++) + for (i = 0; i < ARRAY_SIZE(entries); i++) { devfs_remove("netlink/%s", entries[i].name); - for (i = 0; i < 16; i++) + class_simple_device_remove(MKDEV(NETLINK_MAJOR, entries[i].minor)); + } + for (i = 0; i < 16; i++) { devfs_remove("netlink/tap%d", i); + class_simple_device_remove(MKDEV(NETLINK_MAJOR, i + 16)); + } devfs_remove("netlink"); + class_simple_destroy(netlink_class); unregister_chrdev(NETLINK_MAJOR, "netlink"); } From jmorris@redhat.com Thu Mar 4 15:56:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 15:56:56 -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 i24NuUKO014546 for ; Thu, 4 Mar 2004 15:56:32 -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 i24NuSb05851; Thu, 4 Mar 2004 18:56:28 -0500 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.64.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i24NuR807387; Thu, 4 Mar 2004 18:56:27 -0500 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.65.238]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id i24NuLYK003246; Thu, 4 Mar 2004 18:56:21 -0500 Date: Thu, 4 Mar 2004 18:57:00 -0500 (EST) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Leann Ogasawara cc: netdev@oss.sgi.com, Hanna Linder , Greg KH , "David S. Miller" , Subject: Re: [PATCH 2.6.4-rc2] sysfs simple class support for netlink In-Reply-To: <1078441356.11562.18.camel@ibm-d.pdx.osdl.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 3762 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev Content-Length: 241 Lines: 16 On Thu, 4 Mar 2004, Leann Ogasawara wrote: > Hi All, > > Patch adds sysfs simple class support for netlink character device > (Major 36). Feedback appreciated. Thanks, Looks fine to me. - James -- James Morris From falcon@muflon.linux.pl Thu Mar 4 16:07:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 16:07:21 -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 i2507GKO016107 for ; Thu, 4 Mar 2004 16:07:17 -0800 Received: from localhost (localhost [127.0.0.1]) by don.falconne.eu.org (Postfix) with ESMTP id 938381800EA2; Fri, 5 Mar 2004 01:07:13 +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 14025-03; Fri, 5 Mar 2004 01:07:13 +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 6CE2E18010C7; Fri, 5 Mar 2004 01:07:13 +0100 (CET) Date: Fri, 5 Mar 2004 01:07:13 +0100 (CET) From: =?iso-8859-2?Q?Pawe=B3_Soko=B3owski?= 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: <20040304092650.2575fd1c@dell_ss3.pdx.osdl.net> Message-ID: References: <20040303122541.4dbcf0fc@dell_ss3.pdx.osdl.net> <20040304092650.2575fd1c@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 i2507GKO016107 X-archive-position: 3763 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: 1412 Lines: 36 I've seen things you people wouldn't believe. You writing: >> 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? OK. I builded module from 2.6.4-rc2 with HP100_DEBUG defined. During compilation: drivers/net/hp100.c: In function `hp100_eisa_probe': drivers/net/hp100.c:2875: warning: unsigned int format, long unsigned int arg (arg 3) drivers/net/hp100.c: In function `hp100_module_init': drivers/net/hp100.c:3066: warning: label `out3' defined but not used drivers/net/hp100.c: At top level: drivers/net/hp100.c:2806: warning: `hp100_RegisterDump' defined but not used after modprobe hp100 I'm getting just: bus eisa: add driver hp100 nothing more (I added CONFIG_DEBUG_DRIVER to kernel config). The same on 2.6.4-rc1 (without any message after loading module). -- ,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 hannal@us.ibm.com Thu Mar 4 18:04:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 18:04:30 -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 i2524KKO031811 for ; Thu, 4 Mar 2004 18:04:27 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i25246fS599084; Thu, 4 Mar 2004 21:04:06 -0500 Received: from gateway.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 i25245LR168546; Thu, 4 Mar 2004 19:04:05 -0700 Received: from w-hlinder.beaverton.ibm.com (w-hlinder.beaverton.ibm.com [9.47.17.19]) by gateway.beaverton.ibm.com (8.11.6/8.11.6) with ESMTP id i2522tO25629; Thu, 4 Mar 2004 18:02:55 -0800 Date: Thu, 04 Mar 2004 18:05:14 -0800 From: Hanna Linder To: Chris Wright cc: Hanna Linder , linux-kernel@vger.kernel.org, greg@kroah.com, paulus@samba.org, netdev@oss.sgi.com Subject: Re: [PATCH 2.6] Patch to hook up PPP to simple class sysfs support Message-ID: <42870000.1078452314@w-hlinder.beaverton.ibm.com> In-Reply-To: <20040303195539.S22989@build.pdx.osdl.net> References: <200403032328.i23NSwlv009796@orion.dwf.com> <22370000.1078362205@w-hlinder.beaverton.ibm.com> <20040303195539.S22989@build.pdx.osdl.net> X-Mailer: Mulberry/2.2.1 (Linux/x86) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline X-archive-position: 3764 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hannal@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 2541 Lines: 100 Thanks Chris. Your changes fixed the reload oops I was seeing. root@w-hlinder2 root]# modprobe ppp_generic [root@w-hlinder2 root]# tree /sys/class/ppp /sys/class/ppp `-- ppp `-- dev 1 directory, 1 file [root@w-hlinder2 root]# rmmod ppp_generic [root@w-hlinder2 root]# tree /sys/class/ppp /sys/class/ppp [error opening dir] 0 directories, 0 files [root@w-hlinder2 root]# modprobe ppp_generic [root@w-hlinder2 root]# tree /sys/class/ppp /sys/class/ppp `-- ppp `-- dev 1 directory, 1 file Please consider the patch below for inclusion. Thanks. --On Wednesday, March 03, 2004 07:55:39 PM -0800 Chris Wright wrote: > > something like below. > > thanks, > -chris > > ===== drivers/net/ppp_generic.c 1.43 vs edited ===== > --- 1.43/drivers/net/ppp_generic.c Wed Feb 18 19:42:37 2004 > +++ edited/drivers/net/ppp_generic.c Wed Mar 3 19:08:24 2004 > @@ -45,6 +45,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -271,6 +272,8 @@ > static int ppp_disconnect_channel(struct channel *pch); > static void ppp_destroy_channel(struct channel *pch); > > +static struct class_simple *ppp_class; > + > /* Translates a PPP protocol number to a NP index (NP == network protocol) */ > static inline int proto_to_npindex(int proto) > { > @@ -804,15 +807,29 @@ > printk(KERN_INFO "PPP generic driver version " PPP_VERSION "\n"); > err = register_chrdev(PPP_MAJOR, "ppp", &ppp_device_fops); > if (!err) { > + ppp_class = class_simple_create(THIS_MODULE, "ppp"); > + if (IS_ERR(ppp_class)) { > + err = PTR_ERR(ppp_class); > + goto out_chrdev; > + } > + class_simple_device_add(ppp_class, MKDEV(PPP_MAJOR, 0), NULL, "ppp"); > err = devfs_mk_cdev(MKDEV(PPP_MAJOR, 0), > S_IFCHR|S_IRUSR|S_IWUSR, "ppp"); > if (err) > - unregister_chrdev(PPP_MAJOR, "ppp"); > + goto out_class; > } > > +out: > if (err) > printk(KERN_ERR "failed to register PPP device (%d)\n", err); > return err; > + > +out_class: > + class_simple_device_remove(MKDEV(PPP_MAJOR,0)); > + class_simple_destroy(ppp_class); > +out_chrdev: > + unregister_chrdev(PPP_MAJOR, "ppp"); > + goto out; > } > > /* > @@ -2545,6 +2562,8 @@ > if (unregister_chrdev(PPP_MAJOR, "ppp") != 0) > printk(KERN_ERR "PPP: failed to unregister PPP device\n"); > devfs_remove("ppp"); > + class_simple_device_remove(MKDEV(PPP_MAJOR, 0)); > + class_simple_destroy(ppp_class); > } > > /* > From jm@jm.kir.nu Thu Mar 4 20:10:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 20:10:40 -0800 (PST) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i254AYKO013440 for ; Thu, 4 Mar 2004 20:10:35 -0800 Received: from jm by jm.kir.nu with local (Exim 4.21) id 1Az6dN-0007Ij-4y; Thu, 04 Mar 2004 20:08:25 -0800 Date: Thu, 4 Mar 2004 20:08:25 -0800 From: Jouni Malinen To: Pavel Roskin Cc: jt@hpl.hp.com, linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: linux-wireless mailing list Message-ID: <20040305040824.GA3980@jm.kir.nu> References: <20040303233343.GA14803@bougret.hpl.hp.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6i X-archive-position: 3765 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Content-Length: 3683 Lines: 73 On Thu, Mar 04, 2004 at 02:08:08AM -0500, Pavel Roskin wrote: > On Wed, 3 Mar 2004, Jean Tourrilhes wrote: > > 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). Yes, it is quite easy for me to replace the HostAP-internal implementation of WEP with CRC32+RC4 with crypto API. However, the encryption algorithm itself is not everything that is needed for IEEE 802.11 encryption. With WEP, the additional work is quite limited (add IV, verify ICV), but both TKIP and CCMP add quite a bit of more processing for the header (like authentication of pseudo header, replay protection, etc.). Host AP driver uses a structure which allows multiple algorithms to be registered for both encrypting and decrypting skb's with IEEE 802.11 headers. This structure is likely to remain even when the encryption parts themselves are replaced with crypto API. In addition, these functions are completely separate from the rest of the Host AP driver, so it should be easy for other drivers to use them, if desired. Some wlan chipsets use hardware acceleration for the WEP/TKIP/CCMP(AES-CCM), but require the driver to process the IV/ICV/MIC addition/verification. These drivers would also benefit if there were generic functions that would support both software and hwaccel versions for the encryption/decryption. I was looking into pushing Host AP code for the kernel tree, but since non-trivial amount of work would have been required with crypto parts, this was delayed. Then came WPA and I wanted to get it working first.. But maybe now that it is mostly done, I could try to allocate enough time to go through what is needed to get Host AP driver in acceptable shape to be included into the kernel tree. > > > 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 That's nice to see. However, I would like to know whether any performance testing has been done with that kind of design? It looks like the encryption function (arc4_crypt()) is being called for each byte of the encrypted area. That looks like a major extra work compared to a tight loop going through the data (e.g., compared to the integrated CRC32+RC4 implementation in Host AP driver). With IEEE 802.11b, I don't really are that much about the extra work, but with throughput of IEEE 802.11a/g, this might become considerable. Then again, most modern cards seem to include hardware acceleration and some of them are even able to do this at full data rate. Anyway, software encryption might still be needed for some configuration (like individual keys or some of more exotic things one can do with IEEE 802.11). For these cases, it would be nice to have crypto API support for scatter-gather lists and going through each fragment with one function call. I'll try to get some time to test this with Host AP driver with WEP and TKIP (by first implementing Michael MIC with crypto API). I will also need to do some experimenting with AES and CCMP. With good luck, that could be enough to replace internal crypto algorithm code in the Host AP driver. -- Jouni Malinen PGP id EFC895FA From jt@bougret.hpl.hp.com Thu Mar 4 20:34:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 20:35:01 -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 i254YmKO019996 for ; Thu, 4 Mar 2004 20:34:48 -0800 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel13.hp.com (Postfix) with ESMTP id CBA551C00597; Thu, 4 Mar 2004 20:03:52 -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 UAA02720; Thu, 4 Mar 2004 20:03:52 -0800 (PST) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1Az6Yy-0004LD-00; Thu, 04 Mar 2004 20:03:52 -0800 Date: Thu, 4 Mar 2004 20:03:52 -0800 To: Jeff Garzik Cc: Pavel Roskin , Netdev Subject: Re: linux-wireless mailing list Message-ID: <20040305040352.GA16669@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com References: <40469DA1.9090502@pobox.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="FL5UXtIhxfXey3p5" 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: 3766 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: 8451 Lines: 274 --FL5UXtIhxfXey3p5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 to check if we are on the same page, I dusted an old patch to add a RtNetlink API to Wireless Extensions. This completely avoids ioctls, is type safe, and still extensible. The patch is fully functional and tested but not finished (no support for GET and private requests). Of course, it won't work on drivers using the old API, such as orinoco.c. Don't blame me, I sent the orinoco patch to David 2 years ago. Please coment on that. If this is what you want, I could accelerate its release. Jean --FL5UXtIhxfXey3p5 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="iw264_api_rtnetlink.diff" diff -u -p linux/net/core/rtnetlink.j1.c linux/net/core/rtnetlink.c --- linux/net/core/rtnetlink.j1.c Thu Mar 4 16:14:02 2004 +++ linux/net/core/rtnetlink.c Thu Mar 4 19:52:47 2004 @@ -50,6 +50,10 @@ #include #include #include +#ifdef CONFIG_NET_RADIO +#include /* Note : will define WIRELESS_EXT */ +#include +#endif /* CONFIG_NET_RADIO */ DECLARE_MUTEX(rtnl_sem); @@ -269,6 +273,16 @@ static int do_setlink(struct sk_buff *sk memcpy(dev->broadcast, RTA_DATA(ida[IFLA_BROADCAST - 1]), dev->addr_len); } + +#ifdef WIRELESS_EXT + if (ida[IFLA_WIRELESS - 1]) { + printk(KERN_DEBUG "Calling wireless stuff\n"); + /* Device validity/presence checked in there */ + err = wireless_process_rtnetlink(dev, RTA_DATA(ida[IFLA_WIRELESS - 1]), ida[IFLA_WIRELESS - 1]->rta_len); + if (err) + goto out; + } +#endif /* WIRELESS_EXT */ err = 0; diff -u -p linux/net/core/wireless.j1.c linux/net/core/wireless.c --- linux/net/core/wireless.j1.c Thu Mar 4 16:13:52 2004 +++ linux/net/core/wireless.c Thu Mar 4 18:39:49 2004 @@ -75,6 +75,7 @@ /* Debugging stuff */ #undef WE_IOCTL_DEBUG /* Debug IOCTL API */ +#define WE_RTNETLINK_DEBUG /* Debug RtNetlink API */ #undef WE_EVENT_DEBUG /* Debug Event dispatcher */ #undef WE_SPY_DEBUG /* Debug enhanced spy support */ @@ -941,6 +942,199 @@ int wireless_process_ioctl(struct ifreq } /* Not reached */ return -EINVAL; +} + +/************************ RTNETLINK SUPPORT ************************/ +/* + * The alternate user space API to configure all those Wireless Extensions + * is through RtNEtlink. + * This API support only the new driver API (iw_handler). + * This is still experimental. + */ + +/* ---------------------------------------------------------------- */ +/* + * Wrapper to call a standard Wireless Extension handler. + * We do various checks and also take care of moving data between + * user space and kernel space. + */ +static inline int rtnetlink_standard_call(struct net_device * dev, + struct iw_event * request, + int request_len, + iw_handler handler) +{ + const struct iw_ioctl_description * descr = NULL; + unsigned int cmd; + union iwreq_data * wrqu; + int hdr_len; + struct iw_request_info info; + int ret = -EINVAL; + + /* Get the description of the IOCTL */ + cmd = request->cmd; + if((cmd - SIOCIWFIRST) >= standard_ioctl_num) + return -EOPNOTSUPP; + descr = &(standard_ioctl[cmd - SIOCIWFIRST]); + +#ifdef WE_RTNETLINK_DEBUG + printk(KERN_DEBUG "%s (WE) : Found standard handler for 0x%04X\n", + dev->name, cmd); + printk(KERN_DEBUG "%s (WE) : Header type : %d, Token type : %d, size : %d, token : %d\n", dev->name, descr->header_type, descr->token_type, descr->token_size, descr->max_tokens); +#endif /* WE_IOCTL_DEBUG */ + + /* Extract fixed header from request */ + wrqu = (union iwreq_data *) &request->u; + + /* Prepare the call */ + info.cmd = cmd; + info.flags = 0; + + /* Check if wrqu is complete */ + hdr_len = event_type_size[descr->header_type]; + if(request_len < hdr_len) { +#ifdef WE_RTNETLINK_DEBUG + printk(KERN_DEBUG "%s (WE) : Wireless request too short (%d)\n", + dev->name, request_len); + return -EINVAL; +#endif /* WE_RTNETLINK_DEBUG */ + } + + /* Check if we have extra data in the request or not */ + if(descr->header_type != IW_HEADER_TYPE_POINT) { + + /* No extra arguments. Trivial to handle */ + ret = handler(dev, &info, wrqu, NULL); + +#ifdef WE_SET_EVENT + /* Generate an event to notify listeners of the change */ + if((descr->flags & IW_DESCR_FLAG_EVENT) && + ((ret == 0) || (ret == -EIWCOMMIT))) + wireless_send_event(dev, cmd, wrqu, NULL); +#endif /* WE_SET_EVENT */ + } else { + char * extra; + int extra_len; + + /* Check what user space is giving us */ + if(IW_IS_SET(cmd)) { + /* Check if number of token fits within bounds */ + if(wrqu->data.length > descr->max_tokens) + return -E2BIG; + if(wrqu->data.length < descr->min_tokens) + return -EINVAL; + } + +#ifdef WE_RTNETLINK_DEBUG + printk(KERN_DEBUG "%s (WE) : Malloc %d bytes\n", + dev->name, descr->max_tokens * descr->token_size); +#endif /* WE_IOCTL_DEBUG */ + + /* Always allocate for max space. Easier, and won't last + * long... */ + extra = kmalloc(descr->max_tokens * descr->token_size, + GFP_KERNEL); + if (extra == NULL) { + return -ENOMEM; + } + + /* If it is a SET, copy data to the aligned buffer */ + if(IW_IS_SET(cmd) && (wrqu->data.length != 0)) { + + /* Length of extra (what's after the fixed header) */ + extra_len = request_len - hdr_len; + + /* Check if we have enough of it */ + if(extra_len < (wrqu->data.length * + descr->token_size)) { +#ifdef WE_RTNETLINK_DEBUG + printk(KERN_DEBUG "%s (WE) : Wireless request data too short (%d)\n", + dev->name, extra_len); + return -EINVAL; +#endif /* WE_RTNETLINK_DEBUG */ + } + + memcpy(extra, ((char *) request) + hdr_len, + extra_len); + } + + /* Call the handler */ + ret = handler(dev, &info, wrqu, extra); + + /* If we have something to return to the user */ + if (!ret && IW_IS_GET(cmd)) { + // TODO + } + +#ifdef WE_SET_EVENT + /* Generate an event to notify listeners of the change */ + if((descr->flags & IW_DESCR_FLAG_EVENT) && + ((ret == 0) || (ret == -EIWCOMMIT))) { + if(descr->flags & IW_DESCR_FLAG_RESTRICT) + /* If the event is restricted, don't + * export the payload */ + wireless_send_event(dev, cmd, wrqu, NULL); + else + wireless_send_event(dev, cmd, wrqu, + extra); + } +#endif /* WE_SET_EVENT */ + + /* Cleanup - I told you it wasn't that long ;-) */ + kfree(extra); + } + + /* Call commit handler if needed and defined */ + if(ret == -EIWCOMMIT) + ret = call_commit_handler(dev); + + return ret; +} + +/* ---------------------------------------------------------------- */ +/* + * Main RtNetlink dispatcher. Called from the main networking code + * (do_setlink() in net/core/rtnetlink.c). + * Check the type of Request and call the appropriate wrapper... + */ +int wireless_process_rtnetlink(struct net_device * dev, + char * data, + int len) +{ + struct iw_event * request = (struct iw_event *) data; + iw_handler handler; + + /* Check length */ + if(len < IW_EV_LCP_LEN) { + printk(KERN_DEBUG "%s (WE) : RtNetlink request too short (%d)\n", + dev->name, len); + return -EINVAL; + } + + /* ReCheck length (len may have padding) */ + if(request->len > len) { + printk(KERN_DEBUG "%s (WE) : RtNetlink request len invalid (%d-%d)\n", + dev->name, request->len, len); + return -EINVAL; + } + + // TODO : Handle special cases + + /* Basic check */ + if (!netif_device_present(dev)) + return -ENODEV; + + /* New driver API : try to find the handler */ + handler = get_handler(dev, request->cmd); + if(handler != NULL) { + /* Standard and private are not the same */ + if(request->cmd < SIOCIWFIRSTPRIV) + return rtnetlink_standard_call(dev, + request, + request->len, + handler); + // TODO : support for Private Requests + } + return -EOPNOTSUPP; } /************************* EVENT PROCESSING *************************/ --FL5UXtIhxfXey3p5-- From dlstevens@us.ibm.com Thu Mar 4 21:04:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 04 Mar 2004 21:04:48 -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 i2554eKO023301 for ; Thu, 4 Mar 2004 21:04:46 -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 i2554Yrj444814; Fri, 5 Mar 2004 00:04:34 -0500 Received: from d03nm121.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.193.82]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i2554XLR145422; Thu, 4 Mar 2004 22:04:33 -0700 Subject: IGMP multicast source filter limits via sysctl [PATCH] To: netdev@oss.sgi.com, davem@redhat.com X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Thu, 4 Mar 2004 22:04:31 -0700 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF168 | December 5, 2003) at 03/04/2004 22:04:33 MIME-Version: 1.0 Content-type: multipart/mixed; Boundary="0__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79" X-archive-position: 3767 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 17455 Lines: 356 --0__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79 Content-type: multipart/alternative; Boundary="1__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79" --1__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79 Content-type: text/plain; charset=US-ASCII The following patch adds a sysctl variable for administrators to set limits on the number of per-socket multicast source filters for IPv4. The in-line patch for review is for 2.4.25. Attached is the 2.4.25 version and the 2.6.x version. multiprotocol socket API version to follow soon. +-DLS diff -ruN linux-2.4.25F2/include/linux/sysctl.h linux-2.4.25F4/include/linux/sysctl.h --- linux-2.4.25F2/include/linux/sysctl.h 2004-02-20 15:13:01.000000000 -0800 +++ linux-2.4.25F4/include/linux/sysctl.h 2004-03-04 17:02:54.000000000 -0800 @@ -312,6 +312,7 @@ NET_TCP_FRTO=92, NET_TCP_LOW_LATENCY=93, NET_IPV4_IPFRAG_SECRET_INTERVAL=94, + NET_IPV4_IGMP_MAX_MSF=96, }; enum { diff -ruN linux-2.4.25F2/net/ipv4/igmp.c linux-2.4.25F4/net/ipv4/igmp.c --- linux-2.4.25F2/net/ipv4/igmp.c 2004-02-18 05:36:32.000000000 -0800 +++ linux-2.4.25F4/net/ipv4/igmp.c 2004-03-04 15:47:09.000000000 -0800 @@ -101,7 +101,8 @@ #endif -#define IP_MAX_MEMBERSHIPS 20 +#define IP_MAX_MEMBERSHIPS 20 +#define IP_MAX_MSF 10 #ifdef CONFIG_IP_MULTICAST /* Parameter names and values are taken from igmp-v2-06 draft */ @@ -1311,6 +1312,7 @@ * Join a socket to a group */ int sysctl_igmp_max_memberships = IP_MAX_MEMBERSHIPS; +int sysctl_igmp_max_msf = IP_MAX_MSF; static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode, @@ -1772,6 +1774,10 @@ } /* else, add a new source to the filter */ + if (psl && psl->sl_count >= sysctl_igmp_max_msf) { + err = -ENOBUFS; + goto done; + } if (!psl || psl->sl_count == psl->sl_max) { struct ip_sf_socklist *newpsl; int count = IP_SFBLOCK; diff -ruN linux-2.4.25F2/net/ipv4/ip_sockglue.c linux-2.4.25F4/net/ipv4/ip_sockglue.c --- linux-2.4.25F2/net/ipv4/ip_sockglue.c 2004-02-23 17:03:10.000000000 -0800 +++ linux-2.4.25F4/net/ipv4/ip_sockglue.c 2004-03-04 19:29:33.000000000 -0800 @@ -609,6 +609,7 @@ case IP_MSFILTER: { extern int sysctl_optmem_max; + extern int sysctl_igmp_max_msf; struct ip_msfilter *msf; if (optlen < IP_MSFILTER_SIZE(0)) @@ -627,9 +628,14 @@ kfree(msf); break; } - if (IP_MSFILTER_SIZE(msf->imsf_numsrc) < - IP_MSFILTER_SIZE(0) || - IP_MSFILTER_SIZE(msf->imsf_numsrc) > optlen) { + /* numsrc >= (1G-4) overflow in 32 bits */ + if (msf->imsf_numsrc >= 0x3ffffffcU || + msf->imsf_numsrc > sysctl_igmp_max_msf) { + kfree(msf); + err = -ENOBUFS; + break; + } + if (IP_MSFILTER_SIZE(msf->imsf_numsrc) > optlen) { kfree(msf); err = -EINVAL; break; diff -ruN linux-2.4.25F2/net/ipv4/sysctl_net_ipv4.c linux-2.4.25F4/net/ipv4/sysctl_net_ipv4.c --- linux-2.4.25F2/net/ipv4/sysctl_net_ipv4.c 2003-06-13 07:51:39.000000000 -0700 +++ linux-2.4.25F4/net/ipv4/sysctl_net_ipv4.c 2004-03-04 14:47:31.000000000 -0800 @@ -38,6 +38,7 @@ /* From igmp.c */ extern int sysctl_igmp_max_memberships; +extern int sysctl_igmp_max_msf; /* From inetpeer.c */ extern int inet_peer_threshold; @@ -182,6 +183,8 @@ {NET_IPV4_IGMP_MAX_MEMBERSHIPS, "igmp_max_memberships", &sysctl_igmp_max_memberships, sizeof(int), 0644, NULL, &proc_dointvec}, #endif + {NET_IPV4_IGMP_MAX_MSF, "igmp_max_msf", + &sysctl_igmp_max_msf, sizeof(int), 0644, NULL, &proc_dointvec}, {NET_IPV4_INET_PEER_THRESHOLD, "inet_peer_threshold", &inet_peer_threshold, sizeof(int), 0644, NULL, &proc_dointvec}, {NET_IPV4_INET_PEER_MINTTL, "inet_peer_minttl", (See attached file: 2.4.25igmpmsflimit2.patch) (See attached file: 2.6.4rc2igmpmsflimit2.patch) --1__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79 Content-type: text/html; charset=US-ASCII Content-Disposition: inline

The following patch adds a sysctl variable for administrators to set
limits on the number of per-socket multicast source filters for IPv4.
The in-line patch for review is for 2.4.25. Attached is the 2.4.25 version
and the 2.6.x version.

multiprotocol socket API version to follow soon.

+-DLS

diff -ruN linux-2.4.25F2/include/linux/sysctl.h linux-2.4.25F4/include/linux/sysctl.h
--- linux-2.4.25F2/include/linux/sysctl.h 2004-02-20 15:13:01.000000000 -0800
+++ linux-2.4.25F4/include/linux/sysctl.h 2004-03-04 17:02:54.000000000 -0800
@@ -312,6 +312,7 @@
NET_TCP_FRTO=92,
NET_TCP_LOW_LATENCY=93,
NET_IPV4_IPFRAG_SECRET_INTERVAL=94,
+ NET_IPV4_IGMP_MAX_MSF=96,
};

enum {
diff -ruN linux-2.4.25F2/net/ipv4/igmp.c linux-2.4.25F4/net/ipv4/igmp.c
--- linux-2.4.25F2/net/ipv4/igmp.c 2004-02-18 05:36:32.000000000 -0800
+++ linux-2.4.25F4/net/ipv4/igmp.c 2004-03-04 15:47:09.000000000 -0800
@@ -101,7 +101,8 @@
#endif


-#define IP_MAX_MEMBERSHIPS 20
+#define IP_MAX_MEMBERSHIPS 20
+#define IP_MAX_MSF 10

#ifdef CONFIG_IP_MULTICAST
/* Parameter names and values are taken from igmp-v2-06 draft */
@@ -1311,6 +1312,7 @@
* Join a socket to a group
*/
int sysctl_igmp_max_memberships = IP_MAX_MEMBERSHIPS;
+int sysctl_igmp_max_msf = IP_MAX_MSF;


static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,
@@ -1772,6 +1774,10 @@
}
/* else, add a new source to the filter */

+ if (psl && psl->sl_count >= sysctl_igmp_max_msf) {
+ err = -ENOBUFS;
+ goto done;
+ }
if (!psl || psl->sl_count == psl->sl_max) {
struct ip_sf_socklist *newpsl;
int count = IP_SFBLOCK;
diff -ruN linux-2.4.25F2/net/ipv4/ip_sockglue.c linux-2.4.25F4/net/ipv4/ip_sockglue.c
--- linux-2.4.25F2/net/ipv4/ip_sockglue.c 2004-02-23 17:03:10.000000000 -0800
+++ linux-2.4.25F4/net/ipv4/ip_sockglue.c 2004-03-04 19:29:33.000000000 -0800
@@ -609,6 +609,7 @@
case IP_MSFILTER:
{
extern int sysctl_optmem_max;
+ extern int sysctl_igmp_max_msf;
struct ip_msfilter *msf;

if (optlen < IP_MSFILTER_SIZE(0))
@@ -627,9 +628,14 @@
kfree(msf);
break;
}
- if (IP_MSFILTER_SIZE(msf->imsf_numsrc) <
- IP_MSFILTER_SIZE(0) ||
- IP_MSFILTER_SIZE(msf->imsf_numsrc) > optlen) {
+ /* numsrc >= (1G-4) overflow in 32 bits */
+ if (msf->imsf_numsrc >= 0x3ffffffcU ||
+ msf->imsf_numsrc > sysctl_igmp_max_msf) {
+ kfree(msf);
+ err = -ENOBUFS;
+ break;
+ }
+ if (IP_MSFILTER_SIZE(msf->imsf_numsrc) > optlen) {
kfree(msf);
err = -EINVAL;
break;
diff -ruN linux-2.4.25F2/net/ipv4/sysctl_net_ipv4.c linux-2.4.25F4/net/ipv4/sysctl_net_ipv4.c
--- linux-2.4.25F2/net/ipv4/sysctl_net_ipv4.c 2003-06-13 07:51:39.000000000 -0700
+++ linux-2.4.25F4/net/ipv4/sysctl_net_ipv4.c 2004-03-04 14:47:31.000000000 -0800
@@ -38,6 +38,7 @@

/* From igmp.c */
extern int sysctl_igmp_max_memberships;
+extern int sysctl_igmp_max_msf;

/* From inetpeer.c */
extern int inet_peer_threshold;
@@ -182,6 +183,8 @@
{NET_IPV4_IGMP_MAX_MEMBERSHIPS, "igmp_max_memberships",
&sysctl_igmp_max_memberships, sizeof(int), 0644, NULL, &proc_dointvec},
#endif
+ {NET_IPV4_IGMP_MAX_MSF, "igmp_max_msf",
+ &sysctl_igmp_max_msf, sizeof(int), 0644, NULL, &proc_dointvec},
{NET_IPV4_INET_PEER_THRESHOLD, "inet_peer_threshold",
&inet_peer_threshold, sizeof(int), 0644, NULL, &proc_dointvec},
{NET_IPV4_INET_PEER_MINTTL, "inet_peer_minttl",

(See attached file: 2.4.25igmpmsflimit2.patch)
(See attached file: 2.6.4rc2igmpmsflimit2.patch)
--1__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79-- --0__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79 Content-type: application/octet-stream; name="2.4.25igmpmsflimit2.patch" Content-Disposition: attachment; filename="2.4.25igmpmsflimit2.patch" Content-ID: <10__=07BBE4DDDF88AA798f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 ZGlmZiAtcnVOIGxpbnV4LTIuNC4yNUYyL2luY2x1ZGUvbGludXgvc3lzY3RsLmggbGludXgtMi40 LjI1RjQvaW5jbHVkZS9saW51eC9zeXNjdGwuaAotLS0gbGludXgtMi40LjI1RjIvaW5jbHVkZS9s aW51eC9zeXNjdGwuaAkyMDA0LTAyLTIwIDE1OjEzOjAxLjAwMDAwMDAwMCAtMDgwMAorKysgbGlu dXgtMi40LjI1RjQvaW5jbHVkZS9saW51eC9zeXNjdGwuaAkyMDA0LTAzLTA0IDE3OjAyOjU0LjAw MDAwMDAwMCAtMDgwMApAQCAtMzEyLDYgKzMxMiw3IEBACiAJTkVUX1RDUF9GUlRPPTkyLAogCU5F VF9UQ1BfTE9XX0xBVEVOQ1k9OTMsCiAJTkVUX0lQVjRfSVBGUkFHX1NFQ1JFVF9JTlRFUlZBTD05 NCwKKwlORVRfSVBWNF9JR01QX01BWF9NU0Y9OTYsCiB9OwogCiBlbnVtIHsKZGlmZiAtcnVOIGxp bnV4LTIuNC4yNUYyL25ldC9pcHY0L2lnbXAuYyBsaW51eC0yLjQuMjVGNC9uZXQvaXB2NC9pZ21w LmMKLS0tIGxpbnV4LTIuNC4yNUYyL25ldC9pcHY0L2lnbXAuYwkyMDA0LTAyLTE4IDA1OjM2OjMy LjAwMDAwMDAwMCAtMDgwMAorKysgbGludXgtMi40LjI1RjQvbmV0L2lwdjQvaWdtcC5jCTIwMDQt MDMtMDQgMTU6NDc6MDkuMDAwMDAwMDAwIC0wODAwCkBAIC0xMDEsNyArMTAxLDggQEAKICNlbmRp ZgogCiAKLSNkZWZpbmUgSVBfTUFYX01FTUJFUlNISVBTIDIwCisjZGVmaW5lIElQX01BWF9NRU1C RVJTSElQUwkyMAorI2RlZmluZSBJUF9NQVhfTVNGCQkxMAogCiAjaWZkZWYgQ09ORklHX0lQX01V TFRJQ0FTVAogLyogUGFyYW1ldGVyIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRha2VuIGZyb20gaWdt cC12Mi0wNiBkcmFmdCAqLwpAQCAtMTMxMSw2ICsxMzEyLDcgQEAKICAqCUpvaW4gYSBzb2NrZXQg dG8gYSBncm91cAogICovCiBpbnQgc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzID0gSVBfTUFY X01FTUJFUlNISVBTOworaW50IHN5c2N0bF9pZ21wX21heF9tc2YgPSBJUF9NQVhfTVNGOwogCiAK IHN0YXRpYyBpbnQgaXBfbWNfZGVsMV9zcmMoc3RydWN0IGlwX21jX2xpc3QgKnBtYywgaW50IHNm bW9kZSwKQEAgLTE3NzIsNiArMTc3NCwxMCBAQAogCX0KIAkvKiBlbHNlLCBhZGQgYSBuZXcgc291 cmNlIHRvIHRoZSBmaWx0ZXIgKi8KIAorCWlmIChwc2wgJiYgcHNsLT5zbF9jb3VudCA+PSBzeXNj dGxfaWdtcF9tYXhfbXNmKSB7CisJCWVyciA9IC1FTk9CVUZTOworCQlnb3RvIGRvbmU7CisJfQog CWlmICghcHNsIHx8IHBzbC0+c2xfY291bnQgPT0gcHNsLT5zbF9tYXgpIHsKIAkJc3RydWN0IGlw X3NmX3NvY2tsaXN0ICpuZXdwc2w7CiAJCWludCBjb3VudCA9IElQX1NGQkxPQ0s7CmRpZmYgLXJ1 TiBsaW51eC0yLjQuMjVGMi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jIGxpbnV4LTIuNC4yNUY0L25l dC9pcHY0L2lwX3NvY2tnbHVlLmMKLS0tIGxpbnV4LTIuNC4yNUYyL25ldC9pcHY0L2lwX3NvY2tn bHVlLmMJMjAwNC0wMi0yMyAxNzowMzoxMC4wMDAwMDAwMDAgLTA4MDAKKysrIGxpbnV4LTIuNC4y NUY0L25ldC9pcHY0L2lwX3NvY2tnbHVlLmMJMjAwNC0wMy0wNCAxOToyOTozMy4wMDAwMDAwMDAg LTA4MDAKQEAgLTYwOSw2ICs2MDksNyBAQAogCQljYXNlIElQX01TRklMVEVSOgogCQl7CiAJCQll eHRlcm4gaW50IHN5c2N0bF9vcHRtZW1fbWF4OworCQkJZXh0ZXJuIGludCBzeXNjdGxfaWdtcF9t YXhfbXNmOwogCQkJc3RydWN0IGlwX21zZmlsdGVyICptc2Y7CiAKIAkJCWlmIChvcHRsZW4gPCBJ UF9NU0ZJTFRFUl9TSVpFKDApKQpAQCAtNjI3LDkgKzYyOCwxNCBAQAogCQkJCWtmcmVlKG1zZik7 CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoSVBfTVNGSUxURVJfU0laRShtc2YtPmltc2ZfbnVt c3JjKSA8IAotCQkJICAgIElQX01TRklMVEVSX1NJWkUoMCkgfHwKLQkJCSAgICBJUF9NU0ZJTFRF Ul9TSVpFKG1zZi0+aW1zZl9udW1zcmMpID4gb3B0bGVuKSB7CisJCQkvKiBudW1zcmMgPj0gKDFH LTQpIG92ZXJmbG93IGluIDMyIGJpdHMgKi8KKwkJCWlmIChtc2YtPmltc2ZfbnVtc3JjID49IDB4 M2ZmZmZmZmNVIHx8CisJCQkgICAgbXNmLT5pbXNmX251bXNyYyA+IHN5c2N0bF9pZ21wX21heF9t c2YpIHsKKwkJCQlrZnJlZShtc2YpOworCQkJCWVyciA9IC1FTk9CVUZTOworCQkJCWJyZWFrOwor CQkJfQorCQkJaWYgKElQX01TRklMVEVSX1NJWkUobXNmLT5pbXNmX251bXNyYykgPiBvcHRsZW4p IHsKIAkJCQlrZnJlZShtc2YpOwogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CmRpZmYg LXJ1TiBsaW51eC0yLjQuMjVGMi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYyBsaW51eC0yLjQu MjVGNC9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwotLS0gbGludXgtMi40LjI1RjIvbmV0L2lw djQvc3lzY3RsX25ldF9pcHY0LmMJMjAwMy0wNi0xMyAwNzo1MTozOS4wMDAwMDAwMDAgLTA3MDAK KysrIGxpbnV4LTIuNC4yNUY0L25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCTIwMDQtMDMtMDQg MTQ6NDc6MzEuMDAwMDAwMDAwIC0wODAwCkBAIC0zOCw2ICszOCw3IEBACiAKIC8qIEZyb20gaWdt cC5jICovCiBleHRlcm4gaW50IHN5c2N0bF9pZ21wX21heF9tZW1iZXJzaGlwczsKK2V4dGVybiBp bnQgc3lzY3RsX2lnbXBfbWF4X21zZjsKIAogLyogRnJvbSBpbmV0cGVlci5jICovCiBleHRlcm4g aW50IGluZXRfcGVlcl90aHJlc2hvbGQ7CkBAIC0xODIsNiArMTgzLDggQEAKIAl7TkVUX0lQVjRf SUdNUF9NQVhfTUVNQkVSU0hJUFMsICJpZ21wX21heF9tZW1iZXJzaGlwcyIsCiAJICZzeXNjdGxf aWdtcF9tYXhfbWVtYmVyc2hpcHMsIHNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2lu dHZlY30sCiAjZW5kaWYKKwl7TkVUX0lQVjRfSUdNUF9NQVhfTVNGLCAiaWdtcF9tYXhfbXNmIiwK KwkgJnN5c2N0bF9pZ21wX21heF9tc2YsIHNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19k b2ludHZlY30sCiAJe05FVF9JUFY0X0lORVRfUEVFUl9USFJFU0hPTEQsICJpbmV0X3BlZXJfdGhy ZXNob2xkIiwKIAkgJmluZXRfcGVlcl90aHJlc2hvbGQsIHNpemVvZihpbnQpLCAwNjQ0LCBOVUxM LCAmcHJvY19kb2ludHZlY30sCiAJe05FVF9JUFY0X0lORVRfUEVFUl9NSU5UVEwsICJpbmV0X3Bl ZXJfbWludHRsIiwK --0__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79 Content-type: application/octet-stream; name="2.6.4rc2igmpmsflimit2.patch" Content-Disposition: attachment; filename="2.6.4rc2igmpmsflimit2.patch" Content-ID: <20__=07BBE4DDDF88AA798f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 ZGlmZiAtcnVOIGxpbnV4LTIuNi40cmMyL2luY2x1ZGUvbGludXgvc3lzY3RsLmggbGludXgtMi42 LjRyYzJGMS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCi0tLSBsaW51eC0yLjYuNHJjMi9pbmNsdWRl L2xpbnV4L3N5c2N0bC5oCTIwMDQtMDMtMDQgMTk6MDU6MTcuMDAwMDAwMDAwIC0wODAwCisrKyBs aW51eC0yLjYuNHJjMkYxL2luY2x1ZGUvbGludXgvc3lzY3RsLmgJMjAwNC0wMy0wNCAxNjo1Nzoy Ni4wMDAwMDAwMDAgLTA4MDAKQEAgLTMyMSw2ICszMjEsNyBAQAogCU5FVF9UQ1BfTE9XX0xBVEVO Q1k9OTMsCiAJTkVUX0lQVjRfSVBGUkFHX1NFQ1JFVF9JTlRFUlZBTD05NCwKIAlORVRfVENQX1dF U1RXT09EPTk1LAorCU5FVF9JUFY0X0lHTVBfTUFYX01TRj05NiwKIH07CiAKIGVudW0gewpkaWZm IC1ydU4gbGludXgtMi42LjRyYzIvbmV0L2lwdjQvaWdtcC5jIGxpbnV4LTIuNi40cmMyRjEvbmV0 L2lwdjQvaWdtcC5jCi0tLSBsaW51eC0yLjYuNHJjMi9uZXQvaXB2NC9pZ21wLmMJMjAwNC0wMi0x NyAxOTo1OTo0OC4wMDAwMDAwMDAgLTA4MDAKKysrIGxpbnV4LTIuNi40cmMyRjEvbmV0L2lwdjQv aWdtcC5jCTIwMDQtMDMtMDQgMTY6MTg6NDIuMDAwMDAwMDAwIC0wODAwCkBAIC0xMDUsNyArMTA1 LDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2VuZGlmCiAKLSNkZWZpbmUgSVBf TUFYX01FTUJFUlNISVBTIDIwCisjZGVmaW5lIElQX01BWF9NRU1CRVJTSElQUwkyMAorI2RlZmlu ZSBJUF9NQVhfTVNGCQkxMAogCiAjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAogLyogUGFyYW1l dGVyIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRha2VuIGZyb20gaWdtcC12Mi0wNiBkcmFmdCAqLwpA QCAtMTMyNSw2ICsxMzI2LDcgQEAKICAqCUpvaW4gYSBzb2NrZXQgdG8gYSBncm91cAogICovCiBp bnQgc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzID0gSVBfTUFYX01FTUJFUlNISVBTOworaW50 IHN5c2N0bF9pZ21wX21heF9tc2YgPSBJUF9NQVhfTVNGOwogCiAKIHN0YXRpYyBpbnQgaXBfbWNf ZGVsMV9zcmMoc3RydWN0IGlwX21jX2xpc3QgKnBtYywgaW50IHNmbW9kZSwKQEAgLTE3OTAsNiAr MTc5MiwxMCBAQAogCX0KIAkvKiBlbHNlLCBhZGQgYSBuZXcgc291cmNlIHRvIHRoZSBmaWx0ZXIg Ki8KIAorCWlmIChwc2wgJiYgcHNsLT5zbF9jb3VudCA+PSBzeXNjdGxfaWdtcF9tYXhfbXNmKSB7 CisJCWVyciA9IC1FTk9CVUZTOworCQlnb3RvIGRvbmU7CisJfQogCWlmICghcHNsIHx8IHBzbC0+ c2xfY291bnQgPT0gcHNsLT5zbF9tYXgpIHsKIAkJc3RydWN0IGlwX3NmX3NvY2tsaXN0ICpuZXdw c2w7CiAJCWludCBjb3VudCA9IElQX1NGQkxPQ0s7CmRpZmYgLXJ1TiBsaW51eC0yLjYuNHJjMi9u ZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jIGxpbnV4LTIuNi40cmMyRjEvbmV0L2lwdjQvaXBfc29ja2ds dWUuYwotLS0gbGludXgtMi42LjRyYzIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwkyMDA0LTAzLTA0 IDE5OjA1OjE4LjAwMDAwMDAwMCAtMDgwMAorKysgbGludXgtMi42LjRyYzJGMS9uZXQvaXB2NC9p cF9zb2NrZ2x1ZS5jCTIwMDQtMDMtMDQgMTk6MzA6MjYuMDAwMDAwMDAwIC0wODAwCkBAIC02MTgs NiArNjE4LDcgQEAKIAkJY2FzZSBJUF9NU0ZJTFRFUjoKIAkJewogCQkJZXh0ZXJuIGludCBzeXNj dGxfb3B0bWVtX21heDsKKwkJCWV4dGVybiBpbnQgc3lzY3RsX2lnbXBfbWF4X21zZjsKIAkJCXN0 cnVjdCBpcF9tc2ZpbHRlciAqbXNmOwogCiAJCQlpZiAob3B0bGVuIDwgSVBfTVNGSUxURVJfU0la RSgwKSkKQEAgLTYzNiw5ICs2MzcsMTQgQEAKIAkJCQlrZnJlZShtc2YpOwogCQkJCWJyZWFrOwog CQkJfQotCQkJaWYgKElQX01TRklMVEVSX1NJWkUobXNmLT5pbXNmX251bXNyYykgPCAKLQkJCSAg ICBJUF9NU0ZJTFRFUl9TSVpFKDApIHx8Ci0JCQkgICAgSVBfTVNGSUxURVJfU0laRShtc2YtPmlt c2ZfbnVtc3JjKSA+IG9wdGxlbikgeworCQkJLyogbnVtc3JjID49ICgxRy00KSBvdmVyZmxvdyBp biAzMiBiaXRzICovCisJCQlpZiAobXNmLT5pbXNmX251bXNyYyA+PSAweDNmZmZmZmZjVSB8fAor CQkJICAgIG1zZi0+aW1zZl9udW1zcmMgPiBzeXNjdGxfaWdtcF9tYXhfbXNmKSB7CisJCQkJa2Zy ZWUobXNmKTsKKwkJCQllcnIgPSAtRU5PQlVGUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChJ UF9NU0ZJTFRFUl9TSVpFKG1zZi0+aW1zZl9udW1zcmMpID4gb3B0bGVuKSB7CiAJCQkJa2ZyZWUo bXNmKTsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwpkaWZmIC1ydU4gbGludXgtMi42 LjRyYzIvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMgbGludXgtMi42LjRyYzJGMS9uZXQvaXB2 NC9zeXNjdGxfbmV0X2lwdjQuYwotLS0gbGludXgtMi42LjRyYzIvbmV0L2lwdjQvc3lzY3RsX25l dF9pcHY0LmMJMjAwNC0wMi0xNyAxOTo1ODo1MC4wMDAwMDAwMDAgLTA4MDAKKysrIGxpbnV4LTIu Ni40cmMyRjEvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMJMjAwNC0wMy0wNCAxNjoyMjowNS4w MDAwMDAwMDAgLTA4MDAKQEAgLTM5LDYgKzM5LDcgQEAKIAogLyogRnJvbSBpZ21wLmMgKi8KIGV4 dGVybiBpbnQgc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzOworZXh0ZXJuIGludCBzeXNjdGxf aWdtcF9tYXhfbXNmOwogCiAvKiBGcm9tIGluZXRwZWVyLmMgKi8KIGV4dGVybiBpbnQgaW5ldF9w ZWVyX3RocmVzaG9sZDsKQEAgLTQxMiw2ICs0MTMsMTQgQEAKIAogI2VuZGlmCiAJeworCQkuY3Rs X25hbWUJPSBORVRfSVBWNF9JR01QX01BWF9NU0YsCisJCS5wcm9jbmFtZQk9ICJpZ21wX21heF9t c2YiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lnbXBfbWF4X21zZiwKKwkJLm1heGxlbgkJPSBzaXpl b2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50 dmVjCisJfSwKKwl7CiAJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0lORVRfUEVFUl9USFJFU0hPTEQs CiAJCS5wcm9jbmFtZQk9ICJpbmV0X3BlZXJfdGhyZXNob2xkIiwKIAkJLmRhdGEJCT0gJmluZXRf cGVlcl90aHJlc2hvbGQsCg== --0__=07BBE4DDDF88AA798f9e8a93df938690918c07BBE4DDDF88AA79-- From jeff@crib.corepower.com Fri Mar 5 04:10:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Mar 2004 04:10:58 -0800 (PST) Received: from crib.corepower.com (ethernet-032-packplace.citizens.swva.net.66.37.66.in-addr.arpa [66.37.66.32] (may be forged)) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i25CAXKO017329 for ; Fri, 5 Mar 2004 04:10:33 -0800 Received: from jeff by crib.corepower.com with local (Exim 3.36 #1 (Debian)) id 1AzE9q-0002Sd-00 for ; Fri, 05 Mar 2004 07:10:26 -0500 Date: Fri, 5 Mar 2004 07:10:26 -0500 From: Jeff Raubitschek To: netdev@oss.sgi.com Subject: tg3 link not detected on first interface up with mtu change Message-ID: <20040305121026.GF14914@raubitschek.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.5.1+cvs20040105i X-archive-position: 3769 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jeff@raubitschek.org Precedence: bulk X-list: netdev Content-Length: 1558 Lines: 33 using the tg3 (v2.8) driver on 2.4.26-pre1, with dual port NetXtreme BCM5704 (rev 03), if you configure the interfaces with the a non default mtu, link will not be detected (no gigE switch required to reproduce, 100 Mbps switch will produce the same problem) some observations: - if you bring the interface down and bring it up again, link will be detected. - on some machines when bringing up both interfaces at the same time, one of the dual interfaces will detect link while the other will not - if you bring up the interface with the default mtu, then immediately change the mtu using ifconfig, link will not be detected - if you bring up the interface with the default mtu, then wait 2 seconds before changing the mtu using ifconfig, link WILL be detected - the broadcom driver bcm5700.o driver detects link correctly in this case. Reproduce with these steps: insmod tg3 ifconfig eth1 10.9.0.98 mtu 1000 # wait a bit and check link with: ethtool eth1 (it will be "no") dmesg output: tg3.c:v2.8 (February 23, 2004) PCI: Found IRQ 5 for device 00:09.1 PCI: Sharing IRQ 5 with 00:0b.0 eth1: Tigon3 [partno(BCM95704CA40-I) rev 2003 PHY(5704)] (PCI:33MHz:32-bit) 10/100/1000BaseT Ethernet 00:10:18:06:d4:88 PCI: Found IRQ 12 for device 00:09.0 eth2: Tigon3 [partno(BCM95704CA40-I) rev 2003 PHY(5704)] (PCI:33MHz:32-bit) 10/100/1000BaseT Ethernet 00:10:18:06:d4:89 please let me know if i can provide more information, i will continue to dig through the driver trying to understand where the timing condition with tg3_change_mtu might be. -jeff From paulkf@microgate.com Fri Mar 5 07:15:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Mar 2004 07:15:27 -0800 (PST) Received: from sol.microgate.com (h-68-165-86-241.DLLATX37.covad.net [68.165.86.241]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i25FFNKO026587 for ; Fri, 5 Mar 2004 07:15:24 -0800 Received: from deimos.microgate.com (deimos.microgate.com [192.168.0.12]) by sol.microgate.com (8.11.6/8.11.6) with ESMTP id i25FF9U10210; Fri, 5 Mar 2004 09:15:09 -0600 Subject: Re: [janitor] use netdev_priv() in synclink (char. driver) From: Paul Fulghum To: "Randy.Dunlap" Cc: netdev , jgarzik In-Reply-To: <20040303150105.7ff770b0.rddunlap@osdl.org> References: <20040303142907.09d0f7bd.rddunlap@osdl.org> <20040303150105.7ff770b0.rddunlap@osdl.org> Content-Type: text/plain Organization: Message-Id: <1078499709.2076.5.camel@deimos.microgate.com> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 05 Mar 2004 09:15:09 -0600 Content-Transfer-Encoding: 7bit X-archive-position: 3770 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paulkf@microgate.com Precedence: bulk X-list: netdev Content-Length: 2954 Lines: 99 On Wed, 2004-03-03 at 17:01, Randy.Dunlap wrote: > | > | From: Carlo Perassi > | and Randy.Dunlap > > > Jeff, can you add this patch and the fusion/mptlan driver > patch as well? > > -- > ~Randy > > > > > linux-264-302-priv-rddunlap/drivers/char/synclink.c | 12 ++++++------ > 1 files changed, 6 insertions(+), 6 deletions(-) > > diff -puN drivers/char/synclink.c~synclink_casts drivers/char/synclink.c > --- linux-264-302-priv/drivers/char/synclink.c~synclink_casts 2004-03-02 12:56:23.000000000 -0800 > +++ linux-264-302-priv-rddunlap/drivers/char/synclink.c 2004-03-02 13:01:39.000000000 -0800 > @@ -7878,7 +7878,7 @@ void mgsl_sppp_delete(struct mgsl_struct > > int mgsl_sppp_open(struct net_device *d) > { > - struct mgsl_struct *info = d->priv; > + struct mgsl_struct *info = netdev_priv(d); > int err; > unsigned long flags; > > @@ -7920,7 +7920,7 @@ open_fail: > > void mgsl_sppp_tx_timeout(struct net_device *dev) > { > - struct mgsl_struct *info = dev->priv; > + struct mgsl_struct *info = netdev_priv(dev); > unsigned long flags; > > if (debug_level >= DEBUG_LEVEL_INFO) > @@ -7938,7 +7938,7 @@ void mgsl_sppp_tx_timeout(struct net_dev > > int mgsl_sppp_tx(struct sk_buff *skb, struct net_device *dev) > { > - struct mgsl_struct *info = dev->priv; > + struct mgsl_struct *info = netdev_priv(dev); > unsigned long flags; > > if (debug_level >= DEBUG_LEVEL_INFO) > @@ -7964,7 +7964,7 @@ int mgsl_sppp_tx(struct sk_buff *skb, st > > int mgsl_sppp_close(struct net_device *d) > { > - struct mgsl_struct *info = d->priv; > + struct mgsl_struct *info = netdev_priv(d); > unsigned long flags; > > if (debug_level >= DEBUG_LEVEL_INFO) > @@ -8014,7 +8014,7 @@ void mgsl_sppp_tx_done(struct mgsl_struc > > struct net_device_stats *mgsl_net_stats(struct net_device *dev) > { > - struct mgsl_struct *info = dev->priv; > + struct mgsl_struct *info = netdev_priv(dev); > if (debug_level >= DEBUG_LEVEL_INFO) > printk("mgsl_net_stats(%s)\n",info->netname); > return &info->netstats; > @@ -8022,7 +8022,7 @@ struct net_device_stats *mgsl_net_stats( > > int mgsl_sppp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) > { > - struct mgsl_struct *info = (struct mgsl_struct *)dev->priv; > + struct mgsl_struct *info = netdev_priv(dev); > if (debug_level >= DEBUG_LEVEL_INFO) > printk("%s(%d):mgsl_ioctl %s cmd=%08X\n", __FILE__,__LINE__, > info->netname, cmd ); > > _ This patch breaks the driver. The pointer stored in dev->priv points to a structure that is allocated and maintained by the driver. Changing from dev->priv to netdev_priv(dev) returns a pointer to memory at the end of the net_device structure. These are two different things. So with the patch, the driver gets a pointer to something other than the device private information that it needs. Please dont apply this patch. -- Paul Fulghum paulkf@microgate.com From brazilnut@us.ibm.com Fri Mar 5 09:44:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Mar 2004 09:44:07 -0800 (PST) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i25HhxKO002933 for ; Fri, 5 Mar 2004 09:44:05 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i25Hhq0Y258112; Fri, 5 Mar 2004 12:43:52 -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 i25Hhprf143218; Fri, 5 Mar 2004 10:43:52 -0700 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i25Hh5B02111; Fri, 5 Mar 2004 09:43:05 -0800 From: Don Fry Message-Id: <200403051743.i25Hh5B02111@DYN318364BLD.beaverton.ibm.com> Subject: resend [PATCH 2.6.4-rc2] netdevice.h add netif_msg_init helper To: jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 5 Mar 2004 09:43:05 -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: 3771 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: 944 Lines: 28 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 brazilnut@us.ibm.com Fri Mar 5 12:31:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Mar 2004 12:31:48 -0800 (PST) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.105]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i25KVdKO009750 for ; Fri, 5 Mar 2004 12:31:46 -0800 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e5.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i25KVWJr517814; Fri, 5 Mar 2004 15:31:32 -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 i25KVdB8110278; Fri, 5 Mar 2004 15:31:40 -0500 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i25KUgF02260; Fri, 5 Mar 2004 12:30:42 -0800 From: Don Fry Message-Id: <200403052030.i25KUgF02260@DYN318364BLD.beaverton.ibm.com> Subject: Re: resend [PATCH 2.6.4-rc2] netdevice.h add netif_msg_init helper To: jgarzik@pobox.com (Jeff Garzik) Date: Fri, 5 Mar 2004 12:30:42 -0800 (PST) Cc: netdev@oss.sgi.com In-Reply-To: <4048D415.4060701@pobox.com> from "Jeff Garzik" at Mar 05, 2004 02:25:09 PM 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: 3772 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: 1363 Lines: 39 With the value 32, all bits would be set not none. 0 -1 sets all the bits. Is that not the correct operation? > > 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); > > +} > > + > > Oh, my apologies. I didn't see you had made the additional change I > requested. > > This version looks better, but we still have an out of range value (32) > resulting in no-messages, rather than the default value. I would change > the first ">" to ">=", and simply eliminate the final test. > > Jeff > -- Don Fry brazilnut@us.ibm.com From davem@redhat.com Fri Mar 5 14:20:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Mar 2004 14:20:33 -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 i25MKOKO012826 for ; Fri, 5 Mar 2004 14:20:24 -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 i25MKNb29113; Fri, 5 Mar 2004 17:20:23 -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 i25MKN804693; Fri, 5 Mar 2004 17:20:23 -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 i25MKFeF028709; Fri, 5 Mar 2004 17:20:15 -0500 Date: Fri, 5 Mar 2004 14:20:22 -0800 From: "David S. Miller" To: David Stevens Cc: netdev@oss.sgi.com Subject: Re: IGMP multicast source filter limits via sysctl [PATCH] Message-Id: <20040305142022.3d64e5b7.davem@redhat.com> In-Reply-To: References: 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: 3775 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: 348 Lines: 9 On Thu, 4 Mar 2004 22:04:31 -0700 David Stevens wrote: > The following patch adds a sysctl variable for administrators to set > limits on the number of per-socket multicast source filters for IPv4. > The in-line patch for review is for 2.4.25. Attached is the 2.4.25 version > and the 2.6.x version. Applied, thanks David. From brazilnut@us.ibm.com Fri Mar 5 15:29:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Mar 2004 15:29:56 -0800 (PST) Received: from e4.ny.us.ibm.com (e4.ny.us.ibm.com [32.97.182.104]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i25NTlKO013867 for ; Fri, 5 Mar 2004 15:29:54 -0800 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e4.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i25NTgG9847074; Fri, 5 Mar 2004 18:29:42 -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 i25NTeMB118842; Fri, 5 Mar 2004 18:29:41 -0500 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i25NSqZ02414; Fri, 5 Mar 2004 15:28:52 -0800 From: Don Fry Message-Id: <200403052328.i25NSqZ02414@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.6.4-rc2-bk1] netdevice.h add netif_msg_init helper To: jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 5 Mar 2004 15:28:52 -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: 3776 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: 883 Lines: 25 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. Tested IA32. --- linux-2.6.4-rc2/include/linux/netdevice.h Thu Mar 4 09:59:08 2004 +++ linux-2.6.4-rc2-bk1/include/linux/netdevice.h Fri Mar 5 14:50:00 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 (1 << debug_value) - 1; +} + /* Schedule rx intr now? */ static inline int netif_rx_schedule_prep(struct net_device *dev) From kaber@trash.net Fri Mar 5 16:36:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Mar 2004 16:36:07 -0800 (PST) Received: from gw.localnet (port-212-202-52-228.reverse.qsc.de [212.202.52.228]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i260a5KO025264 for ; Fri, 5 Mar 2004 16:36:06 -0800 Received: from [172.20.0.3] (helo=trash.net ident=kaber) by gw.localnet with esmtp (Exim 3.36 #1 (Debian)) id 1AzPnp-0000N4-00; Sat, 06 Mar 2004 01:36:29 +0100 Message-ID: <40491B9C.4040203@trash.net> Date: Sat, 06 Mar 2004 01:30:20 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040122 Debian/1.6-1 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: jamal , netdev@oss.sgi.com Subject: [PATCH] Fix IPv6 ECN marking in RED Content-Type: multipart/mixed; boundary="------------000205080405010300010805" X-archive-position: 3778 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Content-Length: 1908 Lines: 79 This is a multi-part message in MIME format. --------------000205080405010300010805 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Hi Dave, this patch fixes IPv6 ECN marking in RED and changes it to use the functions from net/inet_ecn.h. Currently a local variable is marked instead of the packet. Best regards Patrick --------------000205080405010300010805 Content-Type: text/x-patch; name="red-ecn-marking.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="red-ecn-marking.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/03/06 01:06:26+01:00 kaber@trash.net # Fix IPv6 ECN marking in RED # # net/sched/sch_red.c # 2004/03/06 01:03:45+01:00 kaber@trash.net +4 -19 # Fix IPv6 ECN marking in RED # diff -Nru a/net/sched/sch_red.c b/net/sched/sch_red.c --- a/net/sched/sch_red.c Sat Mar 6 01:07:33 2004 +++ b/net/sched/sch_red.c Sat Mar 6 01:07:33 2004 @@ -41,9 +41,6 @@ #include #include -#define RED_ECN_ECT 0x02 -#define RED_ECN_CE 0x01 - /* Random Early Detection (RED) algorithm. ======================================= @@ -165,28 +162,16 @@ switch (skb->protocol) { case __constant_htons(ETH_P_IP): - { - u8 tos = skb->nh.iph->tos; - - if (!(tos & RED_ECN_ECT)) + if (!INET_ECN_is_capable(skb->nh.iph->tos)) return 0; - - if (!(tos & RED_ECN_CE)) + if (INET_ECN_is_not_ce(skb->nh.iph->tos)) IP_ECN_set_ce(skb->nh.iph); - return 1; - } - case __constant_htons(ETH_P_IPV6): - { - u32 label = *(u32*)skb->nh.raw; - - if (!(label & __constant_htonl(RED_ECN_ECT<<20))) + if (!INET_ECN_is_capable(ip6_get_dsfield(skb->nh.ipv6h))) return 0; - label |= __constant_htonl(RED_ECN_CE<<20); + IP6_ECN_set_ce(skb->nh.ipv6h); return 1; - } - default: return 0; } --------------000205080405010300010805-- From davem@redhat.com Fri Mar 5 23:26:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 05 Mar 2004 23:26:45 -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 i267QgKO002602 for ; Fri, 5 Mar 2004 23:26:43 -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 i267Qbb22460; Sat, 6 Mar 2004 02:26:37 -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 i267Qb818588; Sat, 6 Mar 2004 02:26:37 -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 i267QSeF021950; Sat, 6 Mar 2004 02:26:29 -0500 Date: Fri, 5 Mar 2004 23:26:35 -0800 From: "David S. Miller" To: Patrick McHardy Cc: hadi@cyberus.ca, netdev@oss.sgi.com Subject: Re: [PATCH] Fix IPv6 ECN marking in RED Message-Id: <20040305232635.51697517.davem@redhat.com> In-Reply-To: <40491B9C.4040203@trash.net> References: <40491B9C.4040203@trash.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: 3779 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: 292 Lines: 9 On Sat, 06 Mar 2004 01:30:20 +0100 Patrick McHardy wrote: > this patch fixes IPv6 ECN marking in RED and changes it to use the > functions from net/inet_ecn.h. Currently a local variable is marked > instead of the packet. Applied to both 2.4.x and 2.6.x, thanks Patrick. From dlstevens@us.ibm.com Sat Mar 6 01:38:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Mar 2004 01:38:32 -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 i269c6KO008095 for ; Sat, 6 Mar 2004 01:38:12 -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 i269c0rj499464; Sat, 6 Mar 2004 04:38:00 -0500 Received: from d03nm121.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.193.82]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i269bxg4087034; Sat, 6 Mar 2004 02:37:59 -0700 Subject: [PATCH] multi-protocol MSF API sysctl limit support To: netdev@oss.sgi.com, davem@redhat.com X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Sat, 6 Mar 2004 02:37:56 -0700 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF168 | December 5, 2003) at 03/06/2004 02:37:59 MIME-Version: 1.0 Content-type: multipart/mixed; Boundary="0__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3" X-archive-position: 3780 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 23586 Lines: 466 --0__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3 Content-type: multipart/alternative; Boundary="1__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3" --1__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3 Content-type: text/plain; charset=US-ASCII This patch adds support for administrator-controlled multicast source filter limits for the multiprotocol multicast source filter API. The v4 portion uses the same sysctl variable as the previous v4-only API patch, and the v6 portion uses a new v6 sysctl variable, "mld_max_msf". In-line 2.4.x and attached 2.4.x and 2.6.x versions. +-DLS diff -ruN linux-2.4.25F4/include/linux/sysctl.h linux-2.4.25F5/include/linux/sysctl.h --- linux-2.4.25F4/include/linux/sysctl.h 2004-03-04 17:02:54.000000000 -0800 +++ linux-2.4.25F5/include/linux/sysctl.h 2004-03-05 00:02:57.000000000 -0800 @@ -388,7 +388,8 @@ NET_IPV6_NEIGH=17, NET_IPV6_ROUTE=18, NET_IPV6_ICMP=19, - NET_IPV6_BINDV6ONLY=20 + NET_IPV6_BINDV6ONLY=20, + NET_IPV6_MLD_MAX_MSF=25, }; enum { diff -ruN linux-2.4.25F4/include/net/ipv6.h linux-2.4.25F5/include/net/ipv6.h --- linux-2.4.25F4/include/net/ipv6.h 2004-03-04 17:15:19.000000000 -0800 +++ linux-2.4.25F5/include/net/ipv6.h 2004-03-05 00:19:31.000000000 -0800 @@ -104,6 +104,7 @@ /* sysctls */ extern int sysctl_ipv6_bindv6only; +extern int sysctl_mld_max_msf; extern struct ipv6_mib ipv6_statistics[NR_CPUS*2]; #define IP6_INC_STATS(field) SNMP_INC_STATS(ipv6_statistics, field) diff -ruN linux-2.4.25F4/net/ipv4/ip_sockglue.c linux-2.4.25F5/net/ipv4/ip_sockglue.c --- linux-2.4.25F4/net/ipv4/ip_sockglue.c 2004-03-04 19:29:33.000000000 -0800 +++ linux-2.4.25F5/net/ipv4/ip_sockglue.c 2004-03-05 16:21:06.000000000 -0800 @@ -762,6 +762,8 @@ } case MCAST_MSFILTER: { + extern int sysctl_optmem_max; + extern int sysctl_igmp_max_msf; struct sockaddr_in *psin; struct ip_msfilter *msf = 0; struct group_filter *gsf = 0; @@ -769,6 +771,10 @@ if (optlen < GROUP_FILTER_SIZE(0)) goto e_inval; + if (optlen > sysctl_optmem_max) { + err = -ENOBUFS; + break; + } gsf = (struct group_filter *)kmalloc(optlen,GFP_KERNEL); if (gsf == 0) { err = -ENOBUFS; @@ -778,7 +784,13 @@ if (copy_from_user(gsf, optval, optlen)) { goto mc_msf_out; } - if (GROUP_FILTER_SIZE(gsf->gf_numsrc) < optlen) { + /* numsrc >= (4G-140)/128 overflow in 32 bits */ + if (gsf->gf_numsrc >= 0x1ffffff || + gsf->gf_numsrc > sysctl_igmp_max_msf) { + err = -ENOBUFS; + goto mc_msf_out; + } + if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) { err = EINVAL; goto mc_msf_out; } diff -ruN linux-2.4.25F4/net/ipv6/ipv6_sockglue.c linux-2.4.25F5/net/ipv6/ipv6_sockglue.c --- linux-2.4.25F4/net/ipv6/ipv6_sockglue.c 2004-02-23 16:35:09.000000000 -0800 +++ linux-2.4.25F5/net/ipv6/ipv6_sockglue.c 2004-03-05 01:57:30.000000000 -0800 @@ -453,6 +453,7 @@ case MCAST_MSFILTER: { extern int sysctl_optmem_max; + extern int sysctl_mld_max_msf; struct group_filter *gsf; if (optlen < GROUP_FILTER_SIZE(0)) @@ -471,8 +472,14 @@ kfree(gsf); break; } - if (GROUP_FILTER_SIZE(gsf->gf_numsrc) < GROUP_FILTER_SIZE(0) || - GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) { + /* numsrc >= (4G-140)/128 overflow in 32 bits */ + if (gsf->gf_numsrc >= 0x1ffffffU || + gsf->gf_numsrc > sysctl_mld_max_msf) { + kfree(gsf); + retv = -ENOBUFS; + break; + } + if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) { kfree(gsf); retv = -EINVAL; break; diff -ruN linux-2.4.25F4/net/ipv6/mcast.c linux-2.4.25F5/net/ipv6/mcast.c --- linux-2.4.25F4/net/ipv6/mcast.c 2004-02-18 05:36:32.000000000 -0800 +++ linux-2.4.25F5/net/ipv6/mcast.c 2004-03-04 22:37:31.000000000 -0800 @@ -163,6 +163,10 @@ #define MLDV2_QQIC(value) MLDV2_EXP(0x80, 4, 3, value) #define MLDV2_MRC(value) MLDV2_EXP(0x8000, 12, 3, value) +#define IPV6_MLD_MAX_MSF 10 + +int sysctl_mld_max_msf = IPV6_MLD_MAX_MSF; + /* * socket join on multicast group */ @@ -401,6 +405,10 @@ } /* else, add a new source to the filter */ + if (psl && psl->sl_count >= sysctl_mld_max_msf) { + err = -ENOBUFS; + goto done; + } if (!psl || psl->sl_count == psl->sl_max) { struct ip6_sf_socklist *newpsl; int count = IP6_SFBLOCK; diff -ruN linux-2.4.25F4/net/ipv6/sysctl_net_ipv6.c linux-2.4.25F5/net/ipv6/sysctl_net_ipv6.c --- linux-2.4.25F4/net/ipv6/sysctl_net_ipv6.c 2003-06-13 07:51:39.000000000 -0700 +++ linux-2.4.25F5/net/ipv6/sysctl_net_ipv6.c 2004-03-05 00:01:05.000000000 -0800 @@ -24,6 +24,8 @@ {NET_IPV6_ICMP, "icmp", NULL, 0, 0500, ipv6_icmp_table}, {NET_IPV6_BINDV6ONLY, "bindv6only", &sysctl_ipv6_bindv6only, sizeof(int), 0644, NULL, &proc_dointvec}, + {NET_IPV6_MLD_MAX_MSF, "mld_max_msf", + &sysctl_mld_max_msf, sizeof(int), 0644, NULL, &proc_dointvec}, {0} }; (See attached file: 2.4.25mpmsflimit.patch) (See attached file: 2.6.4rc2mpmsflimit.patch) --1__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3 Content-type: text/html; charset=US-ASCII Content-Disposition: inline

This patch adds support for administrator-controlled multicast source
filter limits for the multiprotocol multicast source filter API. The v4 portion
uses the same sysctl variable as the previous v4-only API patch, and
the v6 portion uses a new v6 sysctl variable, "mld_max_msf".

In-line 2.4.x and attached 2.4.x and 2.6.x versions.

+-DLS

diff -ruN linux-2.4.25F4/include/linux/sysctl.h linux-2.4.25F5/include/linux/sysctl.h
--- linux-2.4.25F4/include/linux/sysctl.h 2004-03-04 17:02:54.000000000 -0800
+++ linux-2.4.25F5/include/linux/sysctl.h 2004-03-05 00:02:57.000000000 -0800
@@ -388,7 +388,8 @@
NET_IPV6_NEIGH=17,
NET_IPV6_ROUTE=18,
NET_IPV6_ICMP=19,
- NET_IPV6_BINDV6ONLY=20
+ NET_IPV6_BINDV6ONLY=20,
+ NET_IPV6_MLD_MAX_MSF=25,
};

enum {
diff -ruN linux-2.4.25F4/include/net/ipv6.h linux-2.4.25F5/include/net/ipv6.h
--- linux-2.4.25F4/include/net/ipv6.h 2004-03-04 17:15:19.000000000 -0800
+++ linux-2.4.25F5/include/net/ipv6.h 2004-03-05 00:19:31.000000000 -0800
@@ -104,6 +104,7 @@

/* sysctls */
extern int sysctl_ipv6_bindv6only;
+extern int sysctl_mld_max_msf;

extern struct ipv6_mib ipv6_statistics[NR_CPUS*2];
#define IP6_INC_STATS(field) SNMP_INC_STATS(ipv6_statistics, field)
diff -ruN linux-2.4.25F4/net/ipv4/ip_sockglue.c linux-2.4.25F5/net/ipv4/ip_sockglue.c
--- linux-2.4.25F4/net/ipv4/ip_sockglue.c 2004-03-04 19:29:33.000000000 -0800
+++ linux-2.4.25F5/net/ipv4/ip_sockglue.c 2004-03-05 16:21:06.000000000 -0800
@@ -762,6 +762,8 @@
}
case MCAST_MSFILTER:
{
+ extern int sysctl_optmem_max;
+ extern int sysctl_igmp_max_msf;
struct sockaddr_in *psin;
struct ip_msfilter *msf = 0;
struct group_filter *gsf = 0;
@@ -769,6 +771,10 @@

if (optlen < GROUP_FILTER_SIZE(0))
goto e_inval;
+ if (optlen > sysctl_optmem_max) {
+ err = -ENOBUFS;
+ break;
+ }
gsf = (struct group_filter *)kmalloc(optlen,GFP_KERNEL);
if (gsf == 0) {
err = -ENOBUFS;
@@ -778,7 +784,13 @@
if (copy_from_user(gsf, optval, optlen)) {
goto mc_msf_out;
}
- if (GROUP_FILTER_SIZE(gsf->gf_numsrc) < optlen) {
+ /* numsrc >= (4G-140)/128 overflow in 32 bits */
+ if (gsf->gf_numsrc >= 0x1ffffff ||
+ gsf->gf_numsrc > sysctl_igmp_max_msf) {
+ err = -ENOBUFS;
+ goto mc_msf_out;
+ }
+ if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) {
err = EINVAL;
goto mc_msf_out;
}
diff -ruN linux-2.4.25F4/net/ipv6/ipv6_sockglue.c linux-2.4.25F5/net/ipv6/ipv6_sockglue.c
--- linux-2.4.25F4/net/ipv6/ipv6_sockglue.c 2004-02-23 16:35:09.000000000 -0800
+++ linux-2.4.25F5/net/ipv6/ipv6_sockglue.c 2004-03-05 01:57:30.000000000 -0800
@@ -453,6 +453,7 @@
case MCAST_MSFILTER:
{
extern int sysctl_optmem_max;
+ extern int sysctl_mld_max_msf;
struct group_filter *gsf;

if (optlen < GROUP_FILTER_SIZE(0))
@@ -471,8 +472,14 @@
kfree(gsf);
break;
}
- if (GROUP_FILTER_SIZE(gsf->gf_numsrc) < GROUP_FILTER_SIZE(0) ||
- GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) {
+ /* numsrc >= (4G-140)/128 overflow in 32 bits */
+ if (gsf->gf_numsrc >= 0x1ffffffU ||
+ gsf->gf_numsrc > sysctl_mld_max_msf) {
+ kfree(gsf);
+ retv = -ENOBUFS;
+ break;
+ }
+ if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) {
kfree(gsf);
retv = -EINVAL;
break;
diff -ruN linux-2.4.25F4/net/ipv6/mcast.c linux-2.4.25F5/net/ipv6/mcast.c
--- linux-2.4.25F4/net/ipv6/mcast.c 2004-02-18 05:36:32.000000000 -0800
+++ linux-2.4.25F5/net/ipv6/mcast.c 2004-03-04 22:37:31.000000000 -0800
@@ -163,6 +163,10 @@
#define MLDV2_QQIC(value) MLDV2_EXP(0x80, 4, 3, value)
#define MLDV2_MRC(value) MLDV2_EXP(0x8000, 12, 3, value)

+#define IPV6_MLD_MAX_MSF 10
+
+int sysctl_mld_max_msf = IPV6_MLD_MAX_MSF;
+
/*
* socket join on multicast group
*/
@@ -401,6 +405,10 @@
}
/* else, add a new source to the filter */

+ if (psl && psl->sl_count >= sysctl_mld_max_msf) {
+ err = -ENOBUFS;
+ goto done;
+ }
if (!psl || psl->sl_count == psl->sl_max) {
struct ip6_sf_socklist *newpsl;
int count = IP6_SFBLOCK;
diff -ruN linux-2.4.25F4/net/ipv6/sysctl_net_ipv6.c linux-2.4.25F5/net/ipv6/sysctl_net_ipv6.c
--- linux-2.4.25F4/net/ipv6/sysctl_net_ipv6.c 2003-06-13 07:51:39.000000000 -0700
+++ linux-2.4.25F5/net/ipv6/sysctl_net_ipv6.c 2004-03-05 00:01:05.000000000 -0800
@@ -24,6 +24,8 @@
{NET_IPV6_ICMP, "icmp", NULL, 0, 0500, ipv6_icmp_table},
{NET_IPV6_BINDV6ONLY, "bindv6only",
&sysctl_ipv6_bindv6only, sizeof(int), 0644, NULL, &proc_dointvec},
+ {NET_IPV6_MLD_MAX_MSF, "mld_max_msf",
+ &sysctl_mld_max_msf, sizeof(int), 0644, NULL, &proc_dointvec},
{0}
};

(See attached file: 2.4.25mpmsflimit.patch)
(See attached file: 2.6.4rc2mpmsflimit.patch) --1__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3-- --0__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3 Content-type: application/octet-stream; name="2.4.25mpmsflimit.patch" Content-Disposition: attachment; filename="2.4.25mpmsflimit.patch" Content-ID: <10__=07BBE4DCDFA7A9C38f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 ZGlmZiAtcnVOIGxpbnV4LTIuNC4yNUY0L2luY2x1ZGUvbGludXgvc3lzY3RsLmggbGludXgtMi40 LjI1RjUvaW5jbHVkZS9saW51eC9zeXNjdGwuaAotLS0gbGludXgtMi40LjI1RjQvaW5jbHVkZS9s aW51eC9zeXNjdGwuaAkyMDA0LTAzLTA0IDE3OjAyOjU0LjAwMDAwMDAwMCAtMDgwMAorKysgbGlu dXgtMi40LjI1RjUvaW5jbHVkZS9saW51eC9zeXNjdGwuaAkyMDA0LTAzLTA1IDAwOjAyOjU3LjAw MDAwMDAwMCAtMDgwMApAQCAtMzg4LDcgKzM4OCw4IEBACiAJTkVUX0lQVjZfTkVJR0g9MTcsCiAJ TkVUX0lQVjZfUk9VVEU9MTgsCiAJTkVUX0lQVjZfSUNNUD0xOSwKLQlORVRfSVBWNl9CSU5EVjZP TkxZPTIwCisJTkVUX0lQVjZfQklORFY2T05MWT0yMCwKKwlORVRfSVBWNl9NTERfTUFYX01TRj0y NSwKIH07CiAKIGVudW0gewpkaWZmIC1ydU4gbGludXgtMi40LjI1RjQvaW5jbHVkZS9uZXQvaXB2 Ni5oIGxpbnV4LTIuNC4yNUY1L2luY2x1ZGUvbmV0L2lwdjYuaAotLS0gbGludXgtMi40LjI1RjQv aW5jbHVkZS9uZXQvaXB2Ni5oCTIwMDQtMDMtMDQgMTc6MTU6MTkuMDAwMDAwMDAwIC0wODAwCisr KyBsaW51eC0yLjQuMjVGNS9pbmNsdWRlL25ldC9pcHY2LmgJMjAwNC0wMy0wNSAwMDoxOTozMS4w MDAwMDAwMDAgLTA4MDAKQEAgLTEwNCw2ICsxMDQsNyBAQAogCiAvKiBzeXNjdGxzICovCiBleHRl cm4gaW50IHN5c2N0bF9pcHY2X2JpbmR2Nm9ubHk7CitleHRlcm4gaW50IHN5c2N0bF9tbGRfbWF4 X21zZjsKIAogZXh0ZXJuIHN0cnVjdCBpcHY2X21pYgkJaXB2Nl9zdGF0aXN0aWNzW05SX0NQVVMq Ml07CiAjZGVmaW5lIElQNl9JTkNfU1RBVFMoZmllbGQpCQlTTk1QX0lOQ19TVEFUUyhpcHY2X3N0 YXRpc3RpY3MsIGZpZWxkKQpkaWZmIC1ydU4gbGludXgtMi40LjI1RjQvbmV0L2lwdjQvaXBfc29j a2dsdWUuYyBsaW51eC0yLjQuMjVGNS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCi0tLSBsaW51eC0y LjQuMjVGNC9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCTIwMDQtMDMtMDQgMTk6Mjk6MzMuMDAwMDAw MDAwIC0wODAwCisrKyBsaW51eC0yLjQuMjVGNS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCTIwMDQt MDMtMDUgMTY6MjE6MDYuMDAwMDAwMDAwIC0wODAwCkBAIC03NjIsNiArNzYyLDggQEAKIAkJfQog CQljYXNlIE1DQVNUX01TRklMVEVSOgogCQl7CisJCQlleHRlcm4gaW50IHN5c2N0bF9vcHRtZW1f bWF4OworCQkJZXh0ZXJuIGludCBzeXNjdGxfaWdtcF9tYXhfbXNmOwogCQkJc3RydWN0IHNvY2th ZGRyX2luICpwc2luOwogCQkJc3RydWN0IGlwX21zZmlsdGVyICptc2YgPSAwOwogCQkJc3RydWN0 IGdyb3VwX2ZpbHRlciAqZ3NmID0gMDsKQEAgLTc2OSw2ICs3NzEsMTAgQEAKIAogCQkJaWYgKG9w dGxlbiA8IEdST1VQX0ZJTFRFUl9TSVpFKDApKQogCQkJCWdvdG8gZV9pbnZhbDsKKwkJCWlmIChv cHRsZW4gPiBzeXNjdGxfb3B0bWVtX21heCkgeworCQkJCWVyciA9IC1FTk9CVUZTOworCQkJCWJy ZWFrOworCQkJfQogCQkJZ3NmID0gKHN0cnVjdCBncm91cF9maWx0ZXIgKilrbWFsbG9jKG9wdGxl bixHRlBfS0VSTkVMKTsKIAkJCWlmIChnc2YgPT0gMCkgewogCQkJCWVyciA9IC1FTk9CVUZTOwpA QCAtNzc4LDcgKzc4NCwxMyBAQAogCQkJaWYgKGNvcHlfZnJvbV91c2VyKGdzZiwgb3B0dmFsLCBv cHRsZW4pKSB7CiAJCQkJZ290byBtY19tc2Zfb3V0OwogCQkJfQotCQkJaWYgKEdST1VQX0ZJTFRF Ul9TSVpFKGdzZi0+Z2ZfbnVtc3JjKSA8IG9wdGxlbikgeworCQkJLyogbnVtc3JjID49ICg0Ry0x NDApLzEyOCBvdmVyZmxvdyBpbiAzMiBiaXRzICovCisJCQlpZiAoZ3NmLT5nZl9udW1zcmMgPj0g MHgxZmZmZmZmIHx8CisJCQkgICAgZ3NmLT5nZl9udW1zcmMgPiBzeXNjdGxfaWdtcF9tYXhfbXNm KSB7CisJCQkJZXJyID0gLUVOT0JVRlM7CisJCQkJZ290byBtY19tc2Zfb3V0OworCQkJfQorCQkJ aWYgKEdST1VQX0ZJTFRFUl9TSVpFKGdzZi0+Z2ZfbnVtc3JjKSA+IG9wdGxlbikgewogCQkJCWVy ciA9IEVJTlZBTDsKIAkJCQlnb3RvIG1jX21zZl9vdXQ7CiAJCQl9CmRpZmYgLXJ1TiBsaW51eC0y LjQuMjVGNC9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMgbGludXgtMi40LjI1RjUvbmV0L2lwdjYv aXB2Nl9zb2NrZ2x1ZS5jCi0tLSBsaW51eC0yLjQuMjVGNC9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVl LmMJMjAwNC0wMi0yMyAxNjozNTowOS4wMDAwMDAwMDAgLTA4MDAKKysrIGxpbnV4LTIuNC4yNUY1 L25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwkyMDA0LTAzLTA1IDAxOjU3OjMwLjAwMDAwMDAwMCAt MDgwMApAQCAtNDUzLDYgKzQ1Myw3IEBACiAJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKIAl7CiAJCWV4 dGVybiBpbnQgc3lzY3RsX29wdG1lbV9tYXg7CisJCWV4dGVybiBpbnQgc3lzY3RsX21sZF9tYXhf bXNmOwogCQlzdHJ1Y3QgZ3JvdXBfZmlsdGVyICpnc2Y7CiAKIAkJaWYgKG9wdGxlbiA8IEdST1VQ X0ZJTFRFUl9TSVpFKDApKQpAQCAtNDcxLDggKzQ3MiwxNCBAQAogCQkJa2ZyZWUoZ3NmKTsKIAkJ CWJyZWFrOwogCQl9Ci0JCWlmIChHUk9VUF9GSUxURVJfU0laRShnc2YtPmdmX251bXNyYykgPCBH Uk9VUF9GSUxURVJfU0laRSgwKSB8fAotCQkgICAgR1JPVVBfRklMVEVSX1NJWkUoZ3NmLT5nZl9u dW1zcmMpID4gb3B0bGVuKSB7CisJCS8qIG51bXNyYyA+PSAoNEctMTQwKS8xMjggb3ZlcmZsb3cg aW4gMzIgYml0cyAqLworCQlpZiAoZ3NmLT5nZl9udW1zcmMgPj0gMHgxZmZmZmZmVSB8fAorCQkg ICAgZ3NmLT5nZl9udW1zcmMgPiBzeXNjdGxfbWxkX21heF9tc2YpIHsKKwkJCWtmcmVlKGdzZik7 CisJCQlyZXR2ID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoR1JPVVBfRklMVEVS X1NJWkUoZ3NmLT5nZl9udW1zcmMpID4gb3B0bGVuKSB7CiAJCQlrZnJlZShnc2YpOwogCQkJcmV0 diA9IC1FSU5WQUw7CiAJCQlicmVhazsKZGlmZiAtcnVOIGxpbnV4LTIuNC4yNUY0L25ldC9pcHY2 L21jYXN0LmMgbGludXgtMi40LjI1RjUvbmV0L2lwdjYvbWNhc3QuYwotLS0gbGludXgtMi40LjI1 RjQvbmV0L2lwdjYvbWNhc3QuYwkyMDA0LTAyLTE4IDA1OjM2OjMyLjAwMDAwMDAwMCAtMDgwMAor KysgbGludXgtMi40LjI1RjUvbmV0L2lwdjYvbWNhc3QuYwkyMDA0LTAzLTA0IDIyOjM3OjMxLjAw MDAwMDAwMCAtMDgwMApAQCAtMTYzLDYgKzE2MywxMCBAQAogI2RlZmluZSBNTERWMl9RUUlDKHZh bHVlKSBNTERWMl9FWFAoMHg4MCwgNCwgMywgdmFsdWUpCiAjZGVmaW5lIE1MRFYyX01SQyh2YWx1 ZSkgTUxEVjJfRVhQKDB4ODAwMCwgMTIsIDMsIHZhbHVlKQogCisjZGVmaW5lIElQVjZfTUxEX01B WF9NU0YJMTAKKworaW50IHN5c2N0bF9tbGRfbWF4X21zZiA9IElQVjZfTUxEX01BWF9NU0Y7CisK IC8qCiAgKglzb2NrZXQgam9pbiBvbiBtdWx0aWNhc3QgZ3JvdXAKICAqLwpAQCAtNDAxLDYgKzQw NSwxMCBAQAogCX0KIAkvKiBlbHNlLCBhZGQgYSBuZXcgc291cmNlIHRvIHRoZSBmaWx0ZXIgKi8K IAorCWlmIChwc2wgJiYgcHNsLT5zbF9jb3VudCA+PSBzeXNjdGxfbWxkX21heF9tc2YpIHsKKwkJ ZXJyID0gLUVOT0JVRlM7CisJCWdvdG8gZG9uZTsKKwl9CiAJaWYgKCFwc2wgfHwgcHNsLT5zbF9j b3VudCA9PSBwc2wtPnNsX21heCkgewogCQlzdHJ1Y3QgaXA2X3NmX3NvY2tsaXN0ICpuZXdwc2w7 CiAJCWludCBjb3VudCA9IElQNl9TRkJMT0NLOwpkaWZmIC1ydU4gbGludXgtMi40LjI1RjQvbmV0 L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMgbGludXgtMi40LjI1RjUvbmV0L2lwdjYvc3lzY3RsX25l dF9pcHY2LmMKLS0tIGxpbnV4LTIuNC4yNUY0L25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jCTIw MDMtMDYtMTMgMDc6NTE6MzkuMDAwMDAwMDAwIC0wNzAwCisrKyBsaW51eC0yLjQuMjVGNS9uZXQv aXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwkyMDA0LTAzLTA1IDAwOjAxOjA1LjAwMDAwMDAwMCAtMDgw MApAQCAtMjQsNiArMjQsOCBAQAogCXtORVRfSVBWNl9JQ01QLCAiaWNtcCIsIE5VTEwsIDAsIDA1 MDAsIGlwdjZfaWNtcF90YWJsZX0sCiAJe05FVF9JUFY2X0JJTkRWNk9OTFksICJiaW5kdjZvbmx5 IiwKIAkgJnN5c2N0bF9pcHY2X2JpbmR2Nm9ubHksIHNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAm cHJvY19kb2ludHZlY30sCisJe05FVF9JUFY2X01MRF9NQVhfTVNGLCAibWxkX21heF9tc2YiLAor CSAmc3lzY3RsX21sZF9tYXhfbXNmLCBzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9p bnR2ZWN9LAogCXswfQogfTsKIAo= --0__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3 Content-type: application/octet-stream; name="2.6.4rc2mpmsflimit.patch" Content-Disposition: attachment; filename="2.6.4rc2mpmsflimit.patch" Content-ID: <20__=07BBE4DCDFA7A9C38f9e8a93df938@us.ibm.com> Content-transfer-encoding: base64 ZGlmZiAtcnVOIGxpbnV4LTIuNi40cmMyRjEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBsaW51eC0y LjYuNHJjMkYyL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKLS0tIGxpbnV4LTIuNi40cmMyRjEvaW5j bHVkZS9saW51eC9zeXNjdGwuaAkyMDA0LTAzLTA0IDE2OjU3OjI2LjAwMDAwMDAwMCAtMDgwMAor KysgbGludXgtMi42LjRyYzJGMi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCTIwMDQtMDMtMDYgMDA6 MTg6MTcuMDAwMDAwMDAwIC0wODAwCkBAIC00MDUsNyArNDA1LDggQEAKIAlORVRfSVBWNl9JUDZG UkFHX0hJR0hfVEhSRVNIPTIxLAogCU5FVF9JUFY2X0lQNkZSQUdfTE9XX1RIUkVTSD0yMiwKIAlO RVRfSVBWNl9JUDZGUkFHX1RJTUU9MjMsCi0JTkVUX0lQVjZfSVA2RlJBR19TRUNSRVRfSU5URVJW QUw9MjQKKwlORVRfSVBWNl9JUDZGUkFHX1NFQ1JFVF9JTlRFUlZBTD0yNCwKKwlORVRfSVBWNl9N TERfTUFYX01TRj0yNSwKIH07CiAKIGVudW0gewpkaWZmIC1ydU4gbGludXgtMi42LjRyYzJGMS9p bmNsdWRlL25ldC9pcHY2LmggbGludXgtMi42LjRyYzJGMi9pbmNsdWRlL25ldC9pcHY2LmgKLS0t IGxpbnV4LTIuNi40cmMyRjEvaW5jbHVkZS9uZXQvaXB2Ni5oCTIwMDQtMDMtMDQgMTY6MTg6MjMu MDAwMDAwMDAwIC0wODAwCisrKyBsaW51eC0yLjYuNHJjMkYyL2luY2x1ZGUvbmV0L2lwdjYuaAky MDA0LTAzLTA2IDAwOjEwOjIxLjAwMDAwMDAwMCAtMDgwMApAQCAtMTA4LDYgKzEwOCw3IEBACiAK IC8qIHN5c2N0bHMgKi8KIGV4dGVybiBpbnQgc3lzY3RsX2lwdjZfYmluZHY2b25seTsKK2V4dGVy biBpbnQgc3lzY3RsX21sZF9tYXhfbXNmOwogCiAvKiBNSUJzICovCiBERUNMQVJFX1NOTVBfU1RB VChzdHJ1Y3QgaXB2Nl9taWIsIGlwdjZfc3RhdGlzdGljcyk7CmRpZmYgLXJ1TiBsaW51eC0yLjYu NHJjMkYxL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMgbGludXgtMi42LjRyYzJGMi9uZXQvaXB2NC9p cF9zb2NrZ2x1ZS5jCi0tLSBsaW51eC0yLjYuNHJjMkYxL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMJ MjAwNC0wMy0wNCAxOTozMDoyNi4wMDAwMDAwMDAgLTA4MDAKKysrIGxpbnV4LTIuNi40cmMyRjIv bmV0L2lwdjQvaXBfc29ja2dsdWUuYwkyMDA0LTAzLTA2IDAwOjEwOjIxLjAwMDAwMDAwMCAtMDgw MApAQCAtNzcxLDYgKzc3MSw4IEBACiAJCX0KIAkJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKIAkJewor CQkJZXh0ZXJuIGludCBzeXNjdGxfb3B0bWVtX21heDsKKwkJCWV4dGVybiBpbnQgc3lzY3RsX2ln bXBfbWF4X21zZjsKIAkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqcHNpbjsKIAkJCXN0cnVjdCBpcF9t c2ZpbHRlciAqbXNmID0gMDsKIAkJCXN0cnVjdCBncm91cF9maWx0ZXIgKmdzZiA9IDA7CkBAIC03 NzgsNiArNzgwLDEwIEBACiAKIAkJCWlmIChvcHRsZW4gPCBHUk9VUF9GSUxURVJfU0laRSgwKSkK IAkJCQlnb3RvIGVfaW52YWw7CisJCQlpZiAob3B0bGVuID4gc3lzY3RsX29wdG1lbV9tYXgpIHsK KwkJCQllcnIgPSAtRU5PQlVGUzsKKwkJCQlicmVhazsKKwkJCX0KIAkJCWdzZiA9IChzdHJ1Y3Qg Z3JvdXBfZmlsdGVyICopa21hbGxvYyhvcHRsZW4sR0ZQX0tFUk5FTCk7CiAJCQlpZiAoZ3NmID09 IDApIHsKIAkJCQllcnIgPSAtRU5PQlVGUzsKQEAgLTc4Nyw3ICs3OTMsMTMgQEAKIAkJCWlmIChj b3B5X2Zyb21fdXNlcihnc2YsIG9wdHZhbCwgb3B0bGVuKSkgewogCQkJCWdvdG8gbWNfbXNmX291 dDsKIAkJCX0KLQkJCWlmIChHUk9VUF9GSUxURVJfU0laRShnc2YtPmdmX251bXNyYykgPCBvcHRs ZW4pIHsKKwkJCS8qIG51bXNyYyA+PSAoNEctMTQwKS8xMjggb3ZlcmZsb3cgaW4gMzIgYml0cyAq LworCQkJaWYgKGdzZi0+Z2ZfbnVtc3JjID49IDB4MWZmZmZmZiB8fAorCQkJICAgIGdzZi0+Z2Zf bnVtc3JjID4gc3lzY3RsX2lnbXBfbWF4X21zZikgeworCQkJCWVyciA9IC1FTk9CVUZTOworCQkJ CWdvdG8gbWNfbXNmX291dDsKKwkJCX0KKwkJCWlmIChHUk9VUF9GSUxURVJfU0laRShnc2YtPmdm X251bXNyYykgPiBvcHRsZW4pIHsKIAkJCQllcnIgPSBFSU5WQUw7CiAJCQkJZ290byBtY19tc2Zf b3V0OwogCQkJfQpkaWZmIC1ydU4gbGludXgtMi42LjRyYzJGMS9uZXQvaXB2Ni9pcHY2X3NvY2tn bHVlLmMgbGludXgtMi42LjRyYzJGMi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKLS0tIGxpbnV4 LTIuNi40cmMyRjEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCTIwMDQtMDMtMDQgMTY6MTg6MjQu MDAwMDAwMDAwIC0wODAwCisrKyBsaW51eC0yLjYuNHJjMkYyL25ldC9pcHY2L2lwdjZfc29ja2ds dWUuYwkyMDA0LTAzLTA2IDAwOjEwOjIxLjAwMDAwMDAwMCAtMDgwMApAQCAtNDM3LDYgKzQzNyw3 IEBACiAJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKIAl7CiAJCWV4dGVybiBpbnQgc3lzY3RsX29wdG1l bV9tYXg7CisJCWV4dGVybiBpbnQgc3lzY3RsX21sZF9tYXhfbXNmOwogCQlzdHJ1Y3QgZ3JvdXBf ZmlsdGVyICpnc2Y7CiAKIAkJaWYgKG9wdGxlbiA8IEdST1VQX0ZJTFRFUl9TSVpFKDApKQpAQCAt NDU1LDggKzQ1NiwxNCBAQAogCQkJa2ZyZWUoZ3NmKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChH Uk9VUF9GSUxURVJfU0laRShnc2YtPmdmX251bXNyYykgPCBHUk9VUF9GSUxURVJfU0laRSgwKSB8 fAotCQkgICAgR1JPVVBfRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMpID4gb3B0bGVuKSB7CisJ CS8qIG51bXNyYyA+PSAoNEctMTQwKS8xMjggb3ZlcmZsb3cgaW4gMzIgYml0cyAqLworCQlpZiAo Z3NmLT5nZl9udW1zcmMgPj0gMHgxZmZmZmZmVSB8fAorCQkgICAgZ3NmLT5nZl9udW1zcmMgPiBz eXNjdGxfbWxkX21heF9tc2YpIHsKKwkJCWtmcmVlKGdzZik7CisJCQlyZXR2ID0gLUVOT0JVRlM7 CisJCQlicmVhazsKKwkJfQorCQlpZiAoR1JPVVBfRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMp ID4gb3B0bGVuKSB7CiAJCQlrZnJlZShnc2YpOwogCQkJcmV0diA9IC1FSU5WQUw7CiAJCQlicmVh azsKZGlmZiAtcnVOIGxpbnV4LTIuNi40cmMyRjEvbmV0L2lwdjYvbWNhc3QuYyBsaW51eC0yLjYu NHJjMkYyL25ldC9pcHY2L21jYXN0LmMKLS0tIGxpbnV4LTIuNi40cmMyRjEvbmV0L2lwdjYvbWNh c3QuYwkyMDA0LTAzLTA0IDE2OjE4OjI0LjAwMDAwMDAwMCAtMDgwMAorKysgbGludXgtMi42LjRy YzJGMi9uZXQvaXB2Ni9tY2FzdC5jCTIwMDQtMDMtMDYgMDA6MTA6MjEuMDAwMDAwMDAwIC0wODAw CkBAIC0xNjYsNiArMTY2LDEwIEBACiAjZGVmaW5lIE1MRFYyX1FRSUModmFsdWUpIE1MRFYyX0VY UCgweDgwLCA0LCAzLCB2YWx1ZSkKICNkZWZpbmUgTUxEVjJfTVJDKHZhbHVlKSBNTERWMl9FWFAo MHg4MDAwLCAxMiwgMywgdmFsdWUpCiAKKyNkZWZpbmUgSVBWNl9NTERfTUFYX01TRgkxMAorCitp bnQgc3lzY3RsX21sZF9tYXhfbXNmID0gSVBWNl9NTERfTUFYX01TRjsKKwogLyoKICAqCXNvY2tl dCBqb2luIG9uIG11bHRpY2FzdCBncm91cAogICovCkBAIC00MDQsNiArNDA4LDEwIEBACiAJfQog CS8qIGVsc2UsIGFkZCBhIG5ldyBzb3VyY2UgdG8gdGhlIGZpbHRlciAqLwogCisJaWYgKHBzbCAm JiBwc2wtPnNsX2NvdW50ID49IHN5c2N0bF9tbGRfbWF4X21zZikgeworCQllcnIgPSAtRU5PQlVG UzsKKwkJZ290byBkb25lOworCX0KIAlpZiAoIXBzbCB8fCBwc2wtPnNsX2NvdW50ID09IHBzbC0+ c2xfbWF4KSB7CiAJCXN0cnVjdCBpcDZfc2Zfc29ja2xpc3QgKm5ld3BzbDsKIAkJaW50IGNvdW50 ID0gSVA2X1NGQkxPQ0s7CmRpZmYgLXJ1TiBsaW51eC0yLjYuNHJjMkYxL25ldC9pcHY2L3N5c2N0 bF9uZXRfaXB2Ni5jIGxpbnV4LTIuNi40cmMyRjIvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMK LS0tIGxpbnV4LTIuNi40cmMyRjEvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMJMjAwNC0wMy0w NCAxNjoxODoyNC4wMDAwMDAwMDAgLTA4MDAKKysrIGxpbnV4LTIuNi40cmMyRjIvbmV0L2lwdjYv c3lzY3RsX25ldF9pcHY2LmMJMjAwNC0wMy0wNiAwMDoxNjozMi4wMDAwMDAwMDAgLTA4MDAKQEAg LTc2LDYgKzc2LDE0IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVz LAogCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ppZmZpZXMKIAl9LAorCXsKKwkJLmN0bF9uYW1lCT0g TkVUX0lQVjZfTUxEX01BWF9NU0YsCisJCS5wcm9jbmFtZQk9ICJtbGRfbWF4X21zZiIsCisJCS5k YXRhCQk9ICZzeXNjdGxfbWxkX21heF9tc2YsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJ CS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCiAJ eyAuY3RsX25hbWUgPSAwIH0KIH07CiAK --0__=07BBE4DCDFA7A9C38f9e8a93df938690918c07BBE4DCDFA7A9C3-- From ja@ssi.bg Sat Mar 6 03:55:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Mar 2004 03:55:31 -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 i26BtDKO014108 for ; Sat, 6 Mar 2004 03:55:17 -0800 Received: from localhost (localhost [127.0.0.1]) by u.domain.uli (8.12.10/8.12.10) with ESMTP id i26Bt30Z017570; Sat, 6 Mar 2004 13:55:03 +0200 Date: Sat, 6 Mar 2004 13:55:03 +0200 (EET) From: Julian Anastasov X-X-Sender: ja@u.domain.uli To: kuznet@ms2.inr.ac.ru cc: davem@redhat.com, niv@us.ibm.com, ak@suse.de, ruddk@us.ibm.com, netdev@oss.sgi.com, chester.f.johnson@intel.com Subject: Re: PMTU issues due to TOS field manipulation (for DSCP) In-Reply-To: <200403042202.BAA10586@yakov.inr.ac.ru> Message-ID: References: <200403042202.BAA10586@yakov.inr.ac.ru> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 3781 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 Content-Length: 1107 Lines: 36 Hello, On Fri, 5 Mar 2004 kuznet@ms2.inr.ac.ru wrote: > > routes via gateway when shared_media is ON: > > > > http://marc.theaimsgroup.com/?l=linux-netdev&m=107109827516060&w=2 > > "message but we are sure we hit the target IP directly" > > You cannot be sure, actually. This happens and resolves the situation > when the things sort ip route add default dev eth0 are used i.e. host > does not know real prefixes. > > If this is a security issue (I do not see actually, the things on link > can be screwed via proxy arp et all in any case), make it a separate option > or even better use IN_DEV_SEC_REDIRECTS(in_dev) like similar paranoid case > for !shared_media case. I now see, may be better to stay as before, IN_DEV_SEC_REDIRECTS if used, can break the shared_media feature. Anyways, I prepared a final version: http://www.ssi.bg/~ja/tmp/tos-8.diff It passes simple tests. I hope it is ready for inclusion after eventual tuning. Compared to previous versions I removed the 'rth->rt_dst == rth->rt_gateway' check for redirects and renamed the flags. Regards -- Julian Anastasov From ja@ssi.bg Sat Mar 6 08:02:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Mar 2004 08:02:37 -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 i26G2KKO031980 for ; Sat, 6 Mar 2004 08:02:23 -0800 Received: from localhost (localhost [127.0.0.1]) by u.domain.uli (8.12.10/8.12.10) with ESMTP id i26G260Z018319; Sat, 6 Mar 2004 18:02:06 +0200 Date: Sat, 6 Mar 2004 18:02:06 +0200 (EET) From: Julian Anastasov X-X-Sender: ja@u.domain.uli To: kuznet@ms2.inr.ac.ru cc: davem@redhat.com, niv@us.ibm.com, ak@suse.de, ruddk@us.ibm.com, netdev@oss.sgi.com, chester.f.johnson@intel.com Subject: Re: PMTU issues due to TOS field manipulation (for DSCP) In-Reply-To: <200403042202.BAA10586@yakov.inr.ac.ru> Message-ID: References: <200403042202.BAA10586@yakov.inr.ac.ru> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 3782 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 Content-Length: 1898 Lines: 69 Hello, On Fri, 5 Mar 2004 kuznet@ms2.inr.ac.ru wrote: > > - do we need to walk all tos values for ip_rt_redirect in the same > > way as for ip_rt_frag_needed, > > Well, it is just the same thing (except for one thing, that ignored > redirects are harmless) A related 3-hunk change (on top of tos-8.diff), more eyes are needed. The 2nd hunk tries harder to propagate the new_gw. It seems this 2nd hunk is needed because the first list of checks does not compare all possible keys and we can not simply exit the hash chain in the middle. This problem exists also in current kernels, for example, when fwmark is used. As for hunks 1 and the 3, they are needed if we want to propagate the new_gw value to all entries in the hash chain with the cost of some cycles. If we do not apply 1 and 3 then we will update the next entries in the chain on another redirect message. do_next is still used to avoid deadloops in a chain, do_repeat is used only on successful update. Comments? Regards -- Julian Anastasov --- linux-tos-8/net/ipv4/route.c 2004-03-06 13:24:03.000000000 +0200 +++ linux/net/ipv4/route.c 2004-03-06 17:28:34.572673040 +0200 @@ -1018,6 +1018,8 @@ for (i = 0; i < 2; i++) { unsigned hash = rt_hash_code(daddr, skeys[i], tos_values[j]); + do_repeat: + rthp=&rt_hash_table[hash].chain; rcu_read_lock(); @@ -1039,8 +1041,10 @@ rth->rt_src != saddr || rth->u.dst.error || rth->rt_gateway != old_gw || - rth->u.dst.dev != dev) - break; + rth->u.dst.dev != dev) { + rthp = &rth->u.rt_next; + continue; + } dst_hold(&rth->u.dst); rcu_read_unlock(); @@ -1089,8 +1093,10 @@ } rt_del(hash, rth); - if (!rt_intern_hash(hash, rt, &rt)) + if (!rt_intern_hash(hash, rt, &rt)) { ip_rt_put(rt); + goto do_repeat; + } goto do_next; } rcu_read_unlock(); From romieu@fr.zoreil.com Sat Mar 6 17:41:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Mar 2004 17:41:20 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i271fGKO017710 for ; Sat, 6 Mar 2004 17:41:17 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i271bugf007836; Sun, 7 Mar 2004 02:37:56 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i271bmSd007834; Sun, 7 Mar 2004 02:37:48 +0100 Date: Sun, 7 Mar 2004 02:37:48 +0100 From: Francois Romieu To: netdev@oss.sgi.com Subject: [update] 2.6.4-rc2 - Realtek 8169 patches Message-ID: <20040307023748.A7829@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 3783 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Content-Length: 638 Lines: 22 An updated version of the r8169 patches against 2.6.4-rc2 is available. Individual files: http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.4-rc2 Tarball: http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.4-rc2/r8169-blob.tar.bz2 Readme: http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.4-rc2/README.txt Comparison with standard r8169 driver up to the point where r8169-getstats.patch is applied as described in the README.txt file will be welcome. If you feel adventurous, you can directly try: http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.4-rc2/r8169-full.patch Please Cc: netdev@oss.sgi.com on success/failure. -- Ueimor From tmus@tmus.dk Sat Mar 6 17:50:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Mar 2004 17:50:07 -0800 (PST) Received: from mail.tmus.dk (cpe.atm0-0-0-1561101.0x50a0a16e.albnxx5.customer.tele.dk [80.160.161.110]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i271o2KO018228 for ; Sat, 6 Mar 2004 17:50:03 -0800 Received: from [192.168.1.20] (dyn-192-168-1-20.tmus.dk [192.168.1.20]) by mail.tmus.dk (Postfix) with ESMTP id 39B75F80E1; Sun, 7 Mar 2004 02:52:04 +0100 (CET) Subject: [PATCH] 2.6.3 orinoco.c patch to support ethtool get_link From: Thomas Munck Steenholdt To: hermes@gibson.dropbear.id.au, netdev@oss.sgi.com Content-Type: text/plain Message-Id: <1078624195.3551.3.camel@fk460t28.lun.dk.ibm.com> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.5.3 (1.5.3-1) Date: Sun, 07 Mar 2004 02:49:57 +0100 Content-Transfer-Encoding: 7bit X-archive-position: 3784 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tmus@tmus.dk Precedence: bulk X-list: netdev Content-Length: 2096 Lines: 73 Hi there! I noticed that there wasn't a good way, from userland, to get the link status of an orinoco device. So I implemented the basic stuff required to support ethtool. then I implemented the get_link functionality of ethtool (maps orinoco_private->connected the the ethtool link state). It seems to work and will save people some boot-time (on the distros that check for link before attempting DHCP configuration etc.) when laptop users are not on there wireless location. Also it lays the ground to move more functionality to the ethtool model. Please let me know what you think! Best regards Thomas --- drivers/net/wireless/orinoco.c.tmus 2004-03-07 00:25:47.000000000 +0100 +++ drivers/net/wireless/orinoco.c 2004-03-07 01:19:29.433223192 +0100 @@ -430,6 +430,7 @@ #include #include #include +#include #include #include @@ -566,6 +567,8 @@ static void orinoco_stat_gather(struct n static struct net_device_stats *orinoco_get_stats(struct net_device *dev); static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev); +static struct ethtool_ops orinoco_ethtool_ops; + /* Hardware control routines */ static int __orinoco_program_rids(struct net_device *dev); @@ -3941,6 +3944,19 @@ orinoco_ioctl(struct net_device *dev, st return err; } +/* ethtool - get link state */ +static u32 orinoco_get_link(struct net_device *dev) +{ + struct orinoco_private *priv = dev->priv; + + return priv->connected; +} + +/* ethtool - function definitions */ +static struct ethtool_ops orinoco_ethtool_ops = { + .get_link = orinoco_get_link, +}; + struct { u16 rid; char *name; @@ -4150,6 +4166,9 @@ struct net_device *alloc_orinocodev(int dev->set_multicast_list = orinoco_set_multicast_list; /* we use the default eth_mac_addr for setting the MAC addr */ + /* setup ethtool ops structure for this device */ + SET_ETHTOOL_OPS(dev, &orinoco_ethtool_ops); + /* Set up default callbacks */ dev->open = orinoco_open; dev->stop = orinoco_stop; From torgersa@colorado.edu Sat Mar 6 17:53:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Mar 2004 17:53:34 -0800 (PST) Received: from farley1.Colorado.EDU (farley1.Colorado.EDU [128.138.129.102]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i271rVKO018635 for ; Sat, 6 Mar 2004 17:53:31 -0800 Received: (from nobody@localhost) by farley1.Colorado.EDU (8.12.10/8.12.8/ITS-6.0/webmail-sobig) id i271rTiP012613; Sat, 6 Mar 2004 18:53:29 -0700 (MST) From: Adam.Torgerson@colorado.edu Received: from dsl081-103-208.den1.dsl.speakeasy.net (dsl081-103-208.den1.dsl.speakeasy.net [64.81.103.208]) by webmail.colorado.edu (IMP) with HTTP for ; Sat, 6 Mar 2004 18:53:29 -0700 Message-ID: <1078624409.404a80995e634@webmail.colorado.edu> Date: Sat, 6 Mar 2004 18:53:29 -0700 To: netdev@oss.sgi.com Cc: c-d.hailfinger.kernel.2004@gmx.net Subject: Issue Report: forcedeth v0.23, irq with unknown events MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit User-Agent: Internet Messaging Program (IMP) 3.2-cvs X-archive-position: 3785 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Adam.Torgerson@colorado.edu Precedence: bulk X-list: netdev Content-Length: 578 Lines: 17 Hello, I'm getting tons of these kernel messages: "eth0: received irq with unknown events 0x1. Please report" on an Abit NF7 (nforce2 Ultra400 + MCP-T is what the box says), so I figured I better report it. The driver works, but is quite slow (only 256kB/s on a local 100Mbit network). lspci shows the device as: 00:04.0 Ethernet controller: nVidia Corporation nForce2 Ethernet Controller (rev a1) Currently using 2.6.4-rc1-mm2. Let me know if I can provide any more information (please CC me as I'm not on any lists). Thanks for the driver and keep up the good work, Adam From rddunlap@osdl.org Sat Mar 6 20:21:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 06 Mar 2004 20:21: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 i274LCKO024225 for ; Sat, 6 Mar 2004 20:21:12 -0800 Received: from midway.verizon.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i274L1E08436; Sat, 6 Mar 2004 20:21:02 -0800 Date: Sat, 6 Mar 2004 20:16:40 -0800 From: "Randy.Dunlap" To: Paul Fulghum Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [janitor] use netdev_priv() in synclink (char. driver) Message-Id: <20040306201640.7dd15986.rddunlap@osdl.org> In-Reply-To: <1078499709.2076.5.camel@deimos.microgate.com> References: <20040303142907.09d0f7bd.rddunlap@osdl.org> <20040303150105.7ff770b0.rddunlap@osdl.org> <1078499709.2076.5.camel@deimos.microgate.com> Organization: OSDL 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-archive-position: 3786 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: 905 Lines: 42 On 05 Mar 2004 09:15:09 -0600 Paul Fulghum wrote: | On Wed, 2004-03-03 at 17:01, Randy.Dunlap wrote: | > | | > | From: Carlo Perassi | > | and Randy.Dunlap | > | > | > Jeff, can you add this patch and the fusion/mptlan driver | > patch as well? | > | > -- | > ~Randy | > | > | > [snip] | > _ | | | This patch breaks the driver. | | The pointer stored in dev->priv points to a structure that is | allocated and maintained by the driver. | | Changing from dev->priv to netdev_priv(dev) returns a pointer | to memory at the end of the net_device structure. | | These are two different things. | | So with the patch, the driver gets a pointer to something | other than the device private information that it needs. | | Please dont apply this patch. Yes, I see. I appreciate you reviewing and catching that, Paul. Thanks, -- ~Randy From c-d.hailfinger.kernel.2004@gmx.net Sun Mar 7 05:09:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 05:10:12 -0800 (PST) Received: from mail.gmx.net (pop.gmx.de [213.165.64.20]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i27D9bKO014086 for ; Sun, 7 Mar 2004 05:09:38 -0800 Received: (qmail 4456 invoked by uid 65534); 7 Mar 2004 13:09:31 -0000 Received: from stud213078.studentenheim.uni-tuebingen.de (EHLO gmx.net) (134.2.213.78) by mail.gmx.net (mp016) with SMTP; 07 Mar 2004 14:09:31 +0100 X-Authenticated: #21910825 Message-ID: <404B1EBC.6030901@gmx.net> Date: Sun, 07 Mar 2004 14:08:12 +0100 From: Carl-Daniel Hailfinger User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030821 X-Accept-Language: de, en MIME-Version: 1.0 To: Adam.Torgerson@colorado.edu CC: netdev@oss.sgi.com Subject: Re: Issue Report: forcedeth v0.23, irq with unknown events References: <1078624409.404a80995e634@webmail.colorado.edu> In-Reply-To: <1078624409.404a80995e634@webmail.colorado.edu> X-Enigmail-Version: 0.76.5.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 3787 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: c-d.hailfinger.kernel.2004@gmx.net Precedence: bulk X-list: netdev Content-Length: 930 Lines: 26 Adam.Torgerson@colorado.edu wrote: > Hello, I'm getting tons of these kernel messages: > > "eth0: received irq with unknown events 0x1. Please report" This event is no longer unknown. It is a RX error and you are not the only one encountering it. I have a patch which will speed up the network a bit and remove the message, but it seems you have serious connection problems. > on an Abit NF7 (nforce2 Ultra400 + MCP-T is what the box says), so I > figured I better report it. The driver works, but is quite slow (only > 256kB/s on a local 100Mbit network). lspci shows the device as: > > 00:04.0 Ethernet controller: nVidia Corporation nForce2 Ethernet > Controller (rev a1) > > Currently using 2.6.4-rc1-mm2. Let me know if I can provide any more > information (please CC me as I'm not on any lists). I will send you an updated version of the driver soon for testing. Rregards, Carl-Daniel -- http://www.hailfinger.org/ From scott.feldman@intel.com Sun Mar 7 05:35:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 05:35:09 -0800 (PST) Received: from fmsfmr004.fm.intel.com (fmr11.intel.com [192.55.52.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i27DZ6KO014778 for ; Sun, 7 Mar 2004 05:35:06 -0800 Received: from petasus-pilot.fm.intel.com (petasus-pilot.fm.intel.com [10.1.192.44]) by fmsfmr004.fm.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id i27DbEk6009391; Sun, 7 Mar 2004 13:37:14 GMT Received: from fmsmsxvs042.fm.intel.com (fmsmsxvs042.fm.intel.com [132.233.42.128]) by petasus-pilot.fm.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.10 2004/03/01 19:21:36 root Exp $) with SMTP id i27DV0N5021977; Sun, 7 Mar 2004 13:31:47 GMT Received: from [134.134.3.158] ([134.134.3.158]) by fmsmsxvs042.fm.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004030700045410956 ; Sun, 07 Mar 2004 00:04:55 -0800 Date: Sun, 7 Mar 2004 00:40:15 -0800 (PST) From: "Feldman, Scott" X-X-Sender: scott.feldman@localhost.localdomain Reply-To: "Feldman, Scott" To: Jeff Garzik cc: netdev@oss.sgi.com, "Feldman, Scott" Subject: [e100 2.6] missing setup for National DP83840 PHY rev b/c Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) X-archive-position: 3788 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: 973 Lines: 29 * Add National DP83840 PHY rev b/c setup. Only rev a was being setup. ------------- --- linux-2.5/drivers/net/e100.c 2004-03-04 09:30:03.000000000 -0800 +++ linux-2.5/drivers/net/e100.c.mod 2004-03-04 09:30:48.000000000 -0800 @@ -158,7 +158,7 @@ #define DRV_NAME "e100" -#define DRV_VERSION "3.0.15" +#define DRV_VERSION "3.0.16" #define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver" #define DRV_COPYRIGHT "Copyright(c) 1999-2004 Intel Corporation" #define PFX DRV_NAME ": " @@ -1032,8 +1032,9 @@ static int e100_phy_init(struct nic *nic nic->phy = (u32)id_hi << 16 | (u32)id_lo; DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy); - /* Handle National tx phy */ - if(nic->phy == phy_nsc_tx) { + /* Handle National tx phys */ +#define NCS_PHY_MODEL_MASK 0xFFF0FFFF + if((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) { /* Disable congestion control */ cong = mdio_read(netdev, nic->mii.phy_id, MII_NSC_CONG); cong |= NSC_CONG_TXREADY; From khc@pm.waw.pl Sun Mar 7 16:12:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 16:12:35 -0800 (PST) Received: from hq.pm.waw.pl (hq.pm.waw.pl [195.116.170.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i280CBKO007014 for ; Sun, 7 Mar 2004 16:12:12 -0800 Received: by hq.pm.waw.pl (Postfix, from userid 10) id 74965367; Mon, 8 Mar 2004 01:12:08 +0100 (CET) Received: by defiant.pm.waw.pl (Postfix, from userid 500) id 2EF52302D4; Mon, 8 Mar 2004 01:00:09 +0100 (CET) To: Jeff Garzik Cc: Subject: 2.6.x wanXL driver update From: Krzysztof Halasa Date: Mon, 08 Mar 2004 01:00:09 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-archive-position: 3809 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: khc@pm.waw.pl Precedence: bulk X-list: netdev Content-Length: 11379 Lines: 396 --=-=-= Hi, The attached patch updates wanXL card driver. Please apply to Linux 2.6. Thanks. Changes: * fixed initialization kernel panic, introduced with recent alloc_netdev() wan patch, * wanxl_rx_intr() port# now checked before accessing port structure, * cleanups etc. -- Krzysztof Halasa, B*FH --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=wanxl-2.6.4rc2.patch --- linux/drivers/net/wan/wanxl.c 26 Feb 2004 16:26:48 -0000 1.5 +++ linux/drivers/net/wan/wanxl.c 7 Mar 2004 21:50:38 -0000 @@ -31,7 +31,7 @@ #include "wanxl.h" -static const char* version = "wanXL serial card driver version: 0.47"; +static const char* version = "wanXL serial card driver version: 0.48"; #define PLX_CTL_RESET 0x40000000 /* adapter reset */ @@ -73,12 +73,11 @@ u8 *plx; /* PLX PCI9060 virtual base address */ struct pci_dev *pdev; /* for pdev->slot_name */ - port_t *ports[4]; int rx_in; struct sk_buff *rx_skbs[RX_QUEUE_LENGTH]; card_status_t *status; /* shared between host and card */ dma_addr_t status_address; - port_t __ports[0]; + port_t ports[0]; /* 1 - 4 port_t structures follow */ }card_t; @@ -89,18 +88,6 @@ } -static inline struct net_device *port_to_dev(port_t* port) -{ - return port->dev; -} - - -static inline const char* port_name(port_t *port) -{ - return port_to_dev(port)->name; -} - - static inline const char* card_name(struct pci_dev *pdev) { return pdev->slot_name; @@ -165,9 +152,9 @@ dte = (value & STATUS_CABLE_DCE) ? " DCE" : " DTE"; } printk(KERN_INFO "%s: %s%s module, %s cable%s%s\n", - port_name(port), pm, dte, cable, dsr, dcd); + port->dev->name, pm, dte, cable, dsr, dcd); - hdlc_set_carrier(value & STATUS_CABLE_DCD, port_to_dev(port)); + hdlc_set_carrier(value & STATUS_CABLE_DCD, port->dev); } @@ -175,7 +162,7 @@ /* Transmit complete interrupt service */ static inline void wanxl_tx_intr(port_t *port) { - struct net_device *dev = port_to_dev(port); + struct net_device *dev = port->dev; struct net_device_stats *stats = hdlc_stats(dev); while (1) { desc_t *desc = &get_status(port)->tx_descs[port->tx_in]; @@ -210,47 +197,49 @@ static inline void wanxl_rx_intr(card_t *card) { desc_t *desc; - while(desc = &card->status->rx_descs[card->rx_in], - desc->stat != PACKET_EMPTY) { - struct sk_buff *skb = card->rx_skbs[card->rx_in]; - port_t *port = card->ports[desc->stat & PACKET_PORT_MASK]; - struct net_device *dev = port_to_dev(port); - struct net_device_stats *stats = hdlc_stats(dev); - + while (desc = &card->status->rx_descs[card->rx_in], + desc->stat != PACKET_EMPTY) { if ((desc->stat & PACKET_PORT_MASK) > card->n_ports) printk(KERN_CRIT "wanXL %s: received packet for" " nonexistent port\n", card_name(card->pdev)); - - else if (!skb) - stats->rx_dropped++; - else { - pci_unmap_single(card->pdev, desc->address, - BUFFER_LENGTH, PCI_DMA_FROMDEVICE); - skb_put(skb, desc->length); + struct sk_buff *skb = card->rx_skbs[card->rx_in]; + port_t *port = &card->ports[desc->stat & + PACKET_PORT_MASK]; + struct net_device *dev = port->dev; + struct net_device_stats *stats = hdlc_stats(dev); + + if (!skb) + stats->rx_dropped++; + else { + pci_unmap_single(card->pdev, desc->address, + BUFFER_LENGTH, + PCI_DMA_FROMDEVICE); + skb_put(skb, desc->length); #ifdef DEBUG_PKT - printk(KERN_DEBUG "%s RX(%i):", port_name(port), - skb->len); - debug_frame(skb); + printk(KERN_DEBUG "%s RX(%i):", dev->name, + skb->len); + debug_frame(skb); #endif - stats->rx_packets++; - stats->rx_bytes += skb->len; - skb->mac.raw = skb->data; - skb->dev = dev; - dev->last_rx = jiffies; - skb->protocol = hdlc_type_trans(skb, dev); - netif_rx(skb); - skb = NULL; - } - - if (!skb) { - skb = dev_alloc_skb(BUFFER_LENGTH); - desc->address = skb ? - pci_map_single(card->pdev, skb->data, - BUFFER_LENGTH, - PCI_DMA_FROMDEVICE) : 0; - card->rx_skbs[card->rx_in] = skb; + stats->rx_packets++; + stats->rx_bytes += skb->len; + skb->mac.raw = skb->data; + skb->dev = dev; + dev->last_rx = jiffies; + skb->protocol = hdlc_type_trans(skb, dev); + netif_rx(skb); + skb = NULL; + } + + if (!skb) { + skb = dev_alloc_skb(BUFFER_LENGTH); + desc->address = skb ? + pci_map_single(card->pdev, skb->data, + BUFFER_LENGTH, + PCI_DMA_FROMDEVICE) : 0; + card->rx_skbs[card->rx_in] = skb; + } } desc->stat = PACKET_EMPTY; /* Free descriptor */ card->rx_in = (card->rx_in + 1) % RX_QUEUE_LENGTH; @@ -273,9 +262,9 @@ for (i = 0; i < card->n_ports; i++) { if (stat & (1 << (DOORBELL_FROM_CARD_TX_0 + i))) - wanxl_tx_intr(card->ports[i]); + wanxl_tx_intr(&card->ports[i]); if (stat & (1 << (DOORBELL_FROM_CARD_CABLE_0 + i))) - wanxl_cable_intr(card->ports[i]); + wanxl_cable_intr(&card->ports[i]); } if (stat & (1 << DOORBELL_FROM_CARD_RX)) wanxl_rx_intr(card); @@ -297,8 +286,7 @@ if (desc->stat != PACKET_EMPTY) { /* should never happen - previous xmit should stop queue */ #ifdef DEBUG_PKT - printk(KERN_DEBUG "%s: transmitter buffer full\n", - port_name(port)); + printk(KERN_DEBUG "%s: transmitter buffer full\n", dev->name); #endif netif_stop_queue(dev); spin_unlock_irq(&port->lock); @@ -306,7 +294,7 @@ } #ifdef DEBUG_PKT - printk(KERN_DEBUG "%s TX(%i):", port_name(port), skb->len); + printk(KERN_DEBUG "%s TX(%i):", dev->name, skb->len); debug_frame(skb); #endif @@ -324,8 +312,7 @@ if (get_status(port)->tx_descs[port->tx_out].stat != PACKET_EMPTY) { netif_stop_queue(dev); #ifdef DEBUG_PKT - printk(KERN_DEBUG "%s: transmitter buffer full\n", - port_name(port)); + printk(KERN_DEBUG "%s: transmitter buffer full\n", dev->name); #endif } @@ -417,7 +404,7 @@ int i; if (get_status(port)->open) { - printk(KERN_ERR "%s: port already open\n", port_name(port)); + printk(KERN_ERR "%s: port already open\n", dev->name); return -EIO; } if ((i = hdlc_open(dev)) != 0) @@ -435,7 +422,7 @@ return 0; while (time_after(timeout, jiffies)); - printk(KERN_ERR "%s: unable to open port\n", port_name(port)); + printk(KERN_ERR "%s: unable to open port\n", dev->name); /* ask the card to close the port, should it be still alive */ writel(1 << (DOORBELL_TO_CARD_CLOSE_0 + port->node), dbr); return -EFAULT; @@ -461,7 +448,7 @@ while (time_after(timeout, jiffies)); if (get_status(port)->open) - printk(KERN_ERR "%s: unable to close port\n", port_name(port)); + printk(KERN_ERR "%s: unable to close port\n", dev->name); for (i = 0; i < TX_BUFFERS; i++) { desc_t *desc = &get_status(port)->tx_descs[i]; @@ -528,11 +515,10 @@ card_t *card = pci_get_drvdata(pdev); int i; - for (i = 0; i < 4; i++) - if (card->ports[i]) { - struct net_device *dev = port_to_dev(card->ports[i]); - unregister_hdlc_device(dev); - } + for (i = 0; i < card->n_ports; i++) { + unregister_hdlc_device(card->ports[i].dev); + free_netdev(card->ports[i].dev); + } /* unregister and free all host resources */ if (card->irq) @@ -555,13 +541,10 @@ pci_free_consistent(pdev, sizeof(card_status_t), card->status, card->status_address); - for (i = 0; i < card->n_ports; i++) - if (card->__ports[i].dev) - free_netdev(card->__ports[i].dev); - + pci_release_regions(pdev); + pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); kfree(card); - pci_release_regions(pdev); } @@ -599,13 +582,15 @@ work on most platforms */ if (pci_set_consistent_dma_mask(pdev, 0x0FFFFFFF) || pci_set_dma_mask(pdev, 0x0FFFFFFF)) { - printk(KERN_ERR "No usable DMA configuration\n"); + printk(KERN_ERR "wanXL: No usable DMA configuration\n"); return -EIO; } i = pci_request_regions(pdev, "wanXL"); - if (i) + if (i) { + pci_disable_device(pdev); return i; + } switch (pdev->device) { case PCI_DEVICE_ID_SBE_WANXL100: ports = 1; break; @@ -619,23 +604,13 @@ printk(KERN_ERR "wanXL %s: unable to allocate memory\n", card_name(pdev)); pci_release_regions(pdev); + pci_disable_device(pdev); return -ENOBUFS; } memset(card, 0, alloc_size); pci_set_drvdata(pdev, card); card->pdev = pdev; - card->n_ports = ports; - - for (i = 0; i < ports; i++) { - card->__ports[i].dev = alloc_hdlcdev(&card->__ports[i]); - if (!card->__ports[i].dev) { - printk(KERN_ERR "wanXL %s: unable to allocate memory\n", - card_name(pdev)); - wanxl_pci_remove_one(pdev); - return -ENOMEM; - } - } card->status = pci_alloc_consistent(pdev, sizeof(card_status_t), &card->status_address); @@ -655,7 +630,7 @@ to indicate the card can do 32-bit DMA addressing */ if (pci_set_consistent_dma_mask(pdev, 0xFFFFFFFF) || pci_set_dma_mask(pdev, 0xFFFFFFFF)) { - printk(KERN_ERR "No usable DMA configuration\n"); + printk(KERN_ERR "wanXL: No usable DMA configuration\n"); wanxl_pci_remove_one(pdev); return -EIO; } @@ -767,17 +742,11 @@ ramsize = stat; #endif - printk(KERN_INFO "wanXL %s: at 0x%X, %u KB of RAM at 0x%X, irq" - " %u\n" KERN_INFO "wanXL %s: port", card_name(pdev), - plx_phy, ramsize / 1024, mem_phy, pdev->irq, card_name(pdev)); - - for (i = 0; i < ports; i++) - printk("%s #%i: %s", i ? "," : "", i, - port_name(card->ports[i])); - printk("\n"); + printk(KERN_INFO "wanXL %s: at 0x%X, %u KB of RAM at 0x%X, irq %u\n", + card_name(pdev), plx_phy, ramsize / 1024, mem_phy, pdev->irq); /* Allocate IRQ */ - if(request_irq(pdev->irq, wanxl_intr, SA_SHIRQ, "wanXL", card)) { + if (request_irq(pdev->irq, wanxl_intr, SA_SHIRQ, "wanXL", card)) { printk(KERN_WARNING "wanXL %s: could not allocate IRQ%i.\n", card_name(pdev), pdev->irq); wanxl_pci_remove_one(pdev); @@ -786,9 +755,18 @@ card->irq = pdev->irq; for (i = 0; i < ports; i++) { - port_t *port = &card->__ports[i]; - struct net_device *dev = port_to_dev(port); - hdlc_device *hdlc = dev_to_hdlc(dev); + hdlc_device *hdlc; + port_t *port = &card->ports[i]; + struct net_device *dev = alloc_hdlcdev(port); + if (!dev) { + printk(KERN_ERR "wanXL %s: unable to allocate" + " memory\n", card_name(pdev)); + wanxl_pci_remove_one(pdev); + return -ENOMEM; + } + + port->dev = dev; + hdlc = dev_to_hdlc(dev); spin_lock_init(&port->lock); SET_MODULE_OWNER(dev); dev->tx_queue_len = 50; @@ -797,7 +775,6 @@ dev->stop = wanxl_close; hdlc->attach = wanxl_attach; hdlc->xmit = wanxl_xmit; - card->ports[i] = port; dev->get_stats = wanxl_get_stats; port->card = card; port->node = i; @@ -805,11 +782,21 @@ if (register_hdlc_device(dev)) { printk(KERN_ERR "wanXL %s: unable to register hdlc" " device\n", card_name(pdev)); - card->ports[i] = NULL; + free_netdev(dev); wanxl_pci_remove_one(pdev); return -ENOBUFS; } + card->n_ports++; } + + printk(KERN_INFO "wanXL %s: port", card_name(pdev)); + for (i = 0; i < ports; i++) + printk("%s #%i: %s", i ? "," : "", i, + card->ports[i].dev->name); + printk("\n"); + + for (i = 0; i < ports; i++) + wanxl_cable_intr(&card->ports[i]); /* get carrier status etc.*/ return 0; } --=-=-=-- From rmk+netdev=oss.sgi.com@arm.linux.org.uk Sun Mar 7 16:47:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 16:47:23 -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 i280lHKO010702 for ; Sun, 7 Mar 2004 16:47:18 -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 1B08vC-00006X-Pv; Mon, 08 Mar 2004 00:47:06 +0000 Received: from rmk by flint.arm.linux.org.uk with local (Exim 4.30) id 1B08vB-0007T9-SK; Mon, 08 Mar 2004 00:47:05 +0000 Date: Mon, 8 Mar 2004 00:47:05 +0000 From: Russell King To: linux-pcmcia@lists.infradead.org, netdev@oss.sgi.com Cc: Jeff Garzik , Andrew Morton Subject: [PATCH] 2.6 PCMCIA netdevice ordering issues Message-ID: <20040308004705.D7065@flint.arm.linux.org.uk> Mail-Followup-To: linux-pcmcia@lists.infradead.org, netdev@oss.sgi.com, Jeff Garzik , Andrew Morton Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 3810 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rmk+pcmcia@arm.linux.org.uk Precedence: bulk X-list: netdev Content-Length: 19086 Lines: 573 This is an *untested* patch (PCMCIA people, please test) to fix initialisation ordering issues in these network device drivers. I don't have the hardware to be able to test these changes, although it passes a modular build without warnings. Andrew - it may be worth sticking these in -mm so they get some visibility via your tree as well. Many of these drivers were calling register_netdev() before they had completed their initialisation. In addition, they were calling register_netdev with the "DEV_CONFIG_PENDING" flag still set, which prevents hotplug scripts from bringing up the interface. Also, we take care to ensure that link->dev is correctly set - this is used to tell the PCMCIA release code if the netdev is currently registered (yes, that's probably racy at present, but lets sort one problem at a time.) I've arranged that all drivers register the netdevice as close as possible to the end of their initialisation, copy the net device's name for cardmgr to pass to it's network scripts, and then print out whatever information the driver wants to. Finally, a note about ibmtr - it seemed to assume that cardmgr wanted "tr0" or "tr1" depending on the base address, and completely ignoring the real device which the netdev layer allocated it. I've assumed that this is wrong (since the netdev name is used in printk messages), and changed it to behave the same as the other drivers. diff -urpN orig/drivers/net/pcmcia/3c574_cs.c linux/drivers/net/pcmcia/3c574_cs.c --- orig/drivers/net/pcmcia/3c574_cs.c Wed Feb 18 22:34:14 2004 +++ linux/drivers/net/pcmcia/3c574_cs.c Mon Mar 8 00:31:46 2004 @@ -384,6 +384,8 @@ static void tc574_detach(dev_link_t *lin #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) +static char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; + static void tc574_config(dev_link_t *link) { client_handle_t handle = link->handle; @@ -396,6 +398,7 @@ static void tc574_config(dev_link_t *lin ioaddr_t ioaddr; u16 *phys_addr; char *cardname; + union wn3_config config; phys_addr = (u16 *)dev->dev_addr; @@ -431,15 +434,7 @@ static void tc574_config(dev_link_t *lin dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; - if (register_netdev(dev) != 0) { - printk(KERN_NOTICE "3c574_cs: register_netdev() failed\n"); - goto failed; - } - ioaddr = dev->base_addr; - strcpy(lp->node.dev_name, dev->name); - link->dev = &lp->node; - link->state &= ~DEV_CONFIG_PENDING; /* The 3c574 normally uses an EEPROM for configuration info, including the hardware address. The future products may include a modem chip @@ -467,24 +462,14 @@ static void tc574_config(dev_link_t *lin } else cardname = "3Com 3c574"; - printk(KERN_INFO "%s: %s at io %#3lx, irq %d, hw_addr ", - dev->name, cardname, dev->base_addr, dev->irq); - - for (i = 0; i < 6; i++) - printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : ".\n")); - { - u_char mcr, *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; - union wn3_config config; + u_char mcr; outw(2<<11, ioaddr + RunnerRdCtrl); mcr = inb(ioaddr + 2); outw(0<<11, ioaddr + RunnerRdCtrl); printk(KERN_INFO " ASIC rev %d,", mcr>>3); EL3WINDOW(3); config.i = inl(ioaddr + Wn3_Config); - printk(" %dK FIFO split %s Rx:Tx, %sMII interface.\n", - 8 << config.u.ram_size, ram_split[config.u.ram_split], - config.u.autoselect ? "autoselect " : ""); lp->default_media = config.u.xcvr; lp->autoselect = config.u.autoselect; } @@ -531,6 +516,25 @@ static void tc574_config(dev_link_t *lin } } + link->state &= ~DEV_CONFIG_PENDING; + link->dev = &lp->node; + + if (register_netdev(dev) != 0) { + printk(KERN_NOTICE "3c574_cs: register_netdev() failed\n"); + link->dev = NULL; + goto failed; + } + + strcpy(lp->node.dev_name, dev->name); + + printk(KERN_INFO "%s: %s at io %#3lx, irq %d, hw_addr ", + dev->name, cardname, dev->base_addr, dev->irq); + for (i = 0; i < 6; i++) + printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : ".\n")); + printk(" %dK FIFO split %s Rx:Tx, %sMII interface.\n", + 8 << config.u.ram_size, ram_split[config.u.ram_split], + config.u.autoselect ? "autoselect " : ""); + return; cs_failed: diff -urpN orig/drivers/net/pcmcia/3c589_cs.c linux/drivers/net/pcmcia/3c589_cs.c --- orig/drivers/net/pcmcia/3c589_cs.c Wed Feb 18 22:34:14 2004 +++ linux/drivers/net/pcmcia/3c589_cs.c Mon Mar 8 00:09:45 2004 @@ -308,7 +308,7 @@ static void tc589_config(dev_link_t *lin tuple_t tuple; cisparse_t parse; u16 buf[32], *phys_addr; - int last_fn, last_ret, i, j, multi = 0; + int last_fn, last_ret, i, j, multi = 0, fifo; ioaddr_t ioaddr; char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; @@ -357,11 +357,6 @@ static void tc589_config(dev_link_t *lin dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; - if (register_netdev(dev) != 0) { - printk(KERN_ERR "3c589_cs: register_netdev() failed\n"); - goto failed; - } - ioaddr = dev->base_addr; EL3WINDOW(0); @@ -382,13 +377,10 @@ static void tc589_config(dev_link_t *lin } } - strcpy(lp->node.dev_name, dev->name); - link->dev = &lp->node; - link->state &= ~DEV_CONFIG_PENDING; - /* The address and resource configuration register aren't loaded from the EEPROM and *must* be set to 0 and IRQ3 for the PCMCIA version. */ outw(0x3f00, ioaddr + 8); + fifo = inl(ioaddr); /* The if_port symbol can be set when the module is loaded */ if ((if_port >= 0) && (if_port <= 3)) @@ -396,14 +388,24 @@ static void tc589_config(dev_link_t *lin else printk(KERN_ERR "3c589_cs: invalid if_port requested\n"); + link->dev = &lp->node; + link->state &= ~DEV_CONFIG_PENDING; + + if (register_netdev(dev) != 0) { + printk(KERN_ERR "3c589_cs: register_netdev() failed\n"); + link->dev = NULL; + goto failed; + } + + strcpy(lp->node.dev_name, dev->name); + printk(KERN_INFO "%s: 3Com 3c%s, io %#3lx, irq %d, hw_addr ", dev->name, (multi ? "562" : "589"), dev->base_addr, dev->irq); for (i = 0; i < 6; i++) printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); - i = inl(ioaddr); printk(KERN_INFO " %dK FIFO split %s Rx:Tx, %s xcvr\n", - (i & 7) ? 32 : 8, ram_split[(i >> 16) & 3], + (fifo & 7) ? 32 : 8, ram_split[(fifo >> 16) & 3], if_names[dev->if_port]); return; diff -urpN orig/drivers/net/pcmcia/axnet_cs.c linux/drivers/net/pcmcia/axnet_cs.c --- orig/drivers/net/pcmcia/axnet_cs.c Wed Feb 18 22:34:15 2004 +++ linux/drivers/net/pcmcia/axnet_cs.c Mon Mar 8 00:10:15 2004 @@ -430,19 +430,11 @@ static void axnet_config(dev_link_t *lin ei_status.block_input = &block_input; ei_status.block_output = &block_output; - strcpy(info->node.dev_name, dev->name); - if (inb(dev->base_addr + AXNET_TEST) != 0) info->flags |= IS_AX88790; else info->flags |= IS_AX88190; - printk(KERN_INFO "%s: Asix AX88%d90: io %#3lx, irq %d, hw_addr ", - dev->name, ((info->flags & IS_AX88790) ? 7 : 1), - dev->base_addr, dev->irq); - for (i = 0; i < 6; i++) - printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); - if (info->flags & IS_AX88790) outb(0x10, dev->base_addr + AXNET_GPIO); /* select Internal PHY */ @@ -463,19 +455,27 @@ static void axnet_config(dev_link_t *lin } info->phy_id = (i < 32) ? i : -1; - if (i < 32) { - DEBUG(0, " MII transceiver at index %d, status %x.\n", i, j); - } else { - printk(KERN_NOTICE " No MII transceivers found!\n"); - } + link->dev = &info->node; + link->state &= ~DEV_CONFIG_PENDING; if (register_netdev(dev) != 0) { printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n"); + link->dev = NULL; goto failed; } - link->dev = &info->node; - link->state &= ~DEV_CONFIG_PENDING; + strcpy(info->node.dev_name, dev->name); + + printk(KERN_INFO "%s: Asix AX88%d90: io %#3lx, irq %d, hw_addr ", + dev->name, ((info->flags & IS_AX88790) ? 7 : 1), + dev->base_addr, dev->irq); + for (i = 0; i < 6; i++) + printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); + if (info->phy_id != -1) { + DEBUG(0, " MII transceiver at index %d, status %x.\n", info->phy_id, j); + } else { + printk(KERN_NOTICE " No MII transceivers found!\n"); + } return; cs_failed: diff -urpN orig/drivers/net/pcmcia/com20020_cs.c linux/drivers/net/pcmcia/com20020_cs.c --- orig/drivers/net/pcmcia/com20020_cs.c Wed Feb 18 22:34:15 2004 +++ linux/drivers/net/pcmcia/com20020_cs.c Mon Mar 8 00:19:18 2004 @@ -141,7 +141,6 @@ static dev_link_t *dev_list; typedef struct com20020_dev_t { struct net_device *dev; - int dev_configured; dev_node_t node; } com20020_dev_t; @@ -277,13 +276,10 @@ static void com20020_detach(dev_link_t * dev = info->dev; if (dev) { - if (info->dev_configured) + if (link->dev) { DEBUG(1,"unregister...\n"); - if (netif_running(dev)) - dev->stop(dev); - unregister_netdev(dev); /* @@ -398,17 +394,18 @@ static void com20020_config(dev_link_t * lp->card_name = "PCMCIA COM20020"; lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */ + link->dev = &info->node; + link->state &= ~DEV_CONFIG_PENDING; + i = com20020_found(dev, 0); /* calls register_netdev */ if (i != 0) { DEBUG(1,KERN_NOTICE "com20020_cs: com20020_found() failed\n"); + link->dev = NULL; goto failed; } - info->dev_configured = 1; strcpy(info->node.dev_name, dev->name); - link->dev = &info->node; - link->state &= ~DEV_CONFIG_PENDING; DEBUG(1,KERN_INFO "%s: port %#3lx, irq %d\n", dev->name, dev->base_addr, dev->irq); diff -urpN orig/drivers/net/pcmcia/fmvj18x_cs.c linux/drivers/net/pcmcia/fmvj18x_cs.c --- orig/drivers/net/pcmcia/fmvj18x_cs.c Wed Feb 18 22:34:15 2004 +++ linux/drivers/net/pcmcia/fmvj18x_cs.c Mon Mar 8 00:13:01 2004 @@ -510,10 +510,6 @@ static void fmvj18x_config(dev_link_t *l CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; - if (register_netdev(dev) != 0) { - printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n"); - goto failed; - } if (link->io.BasePort2 != 0) fmvj18x_setup_mfc(link); @@ -575,7 +571,6 @@ static void fmvj18x_config(dev_link_t *l /* Read MACID from Buggy CIS */ if (fmvj18x_get_hwinfo(link, tuple.TupleData) == -1) { printk(KERN_NOTICE "fmvj18x_cs: unable to read hardware net address.\n"); - unregister_netdev(dev); goto failed; } for (i = 0 ; i < 6; i++) { @@ -592,10 +587,18 @@ static void fmvj18x_config(dev_link_t *l break; } - strcpy(lp->node.dev_name, dev->name); + lp->cardtype = cardtype; link->dev = &lp->node; + link->state &= ~DEV_CONFIG_PENDING; + + if (register_netdev(dev) != 0) { + printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n"); + link->dev = NULL; + goto failed; + } + + strcpy(lp->node.dev_name, dev->name); - lp->cardtype = cardtype; /* print current configuration */ printk(KERN_INFO "%s: %s, sram %s, port %#3lx, irq %d, hw_addr ", dev->name, card_name, sram_config == 0 ? "4K TX*2" : "8K TX*2", @@ -603,7 +606,6 @@ static void fmvj18x_config(dev_link_t *l for (i = 0; i < 6; i++) printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); - link->state &= ~DEV_CONFIG_PENDING; return; cs_failed: diff -urpN orig/drivers/net/pcmcia/ibmtr_cs.c linux/drivers/net/pcmcia/ibmtr_cs.c --- orig/drivers/net/pcmcia/ibmtr_cs.c Wed Feb 18 22:34:15 2004 +++ linux/drivers/net/pcmcia/ibmtr_cs.c Mon Mar 8 00:24:13 2004 @@ -317,13 +317,10 @@ static void ibmtr_config(dev_link_t *lin /* Try PRIMARY card at 0xA20-0xA23 */ link->io.BasePort1 = 0xA20; i = pcmcia_request_io(link->handle, &link->io); - if (i == CS_SUCCESS) { - memcpy(info->node.dev_name, "tr0\0", 4); - } else { + if (i != CS_SUCCESS) { /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */ link->io.BasePort1 = 0xA24; CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io)); - memcpy(info->node.dev_name, "tr1\0", 4); } dev->base_addr = link->io.BasePort1; @@ -367,15 +364,17 @@ static void ibmtr_config(dev_link_t *lin Adapters Technical Reference" SC30-3585 for this info. */ ibmtr_hw_setup(dev, mmiobase); + link->dev = &info->node; + link->state &= ~DEV_CONFIG_PENDING; + i = ibmtr_probe_card(dev); - if (i != 0) { printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n"); + link->dev = NULL; goto failed; } - link->dev = &info->node; - link->state &= ~DEV_CONFIG_PENDING; + strcpy(info->node.dev_name, dev->name); printk(KERN_INFO "%s: port %#3lx, irq %d,", dev->name, dev->base_addr, dev->irq); diff -urpN orig/drivers/net/pcmcia/nmclan_cs.c linux/drivers/net/pcmcia/nmclan_cs.c --- orig/drivers/net/pcmcia/nmclan_cs.c Wed Feb 18 22:34:15 2004 +++ linux/drivers/net/pcmcia/nmclan_cs.c Mon Mar 8 00:13:42 2004 @@ -734,11 +734,6 @@ static void nmclan_config(dev_link_t *li CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; - i = register_netdev(dev); - if (i != 0) { - printk(KERN_NOTICE "nmclan_cs: register_netdev() failed\n"); - goto failed; - } ioaddr = dev->base_addr; @@ -777,10 +772,18 @@ static void nmclan_config(dev_link_t *li else printk(KERN_NOTICE "nmclan_cs: invalid if_port requested\n"); - strcpy(lp->node.dev_name, dev->name); link->dev = &lp->node; link->state &= ~DEV_CONFIG_PENDING; + i = register_netdev(dev); + if (i != 0) { + printk(KERN_NOTICE "nmclan_cs: register_netdev() failed\n"); + link->dev = NULL; + goto failed; + } + + strcpy(lp->node.dev_name, dev->name); + printk(KERN_INFO "%s: nmclan: port %#3lx, irq %d, %s port, hw_addr ", dev->name, dev->base_addr, dev->irq, if_names[dev->if_port]); for (i = 0; i < 6; i++) diff -urpN orig/drivers/net/pcmcia/smc91c92_cs.c linux/drivers/net/pcmcia/smc91c92_cs.c --- orig/drivers/net/pcmcia/smc91c92_cs.c Wed Feb 18 22:34:15 2004 +++ linux/drivers/net/pcmcia/smc91c92_cs.c Mon Mar 8 00:14:06 2004 @@ -901,6 +901,7 @@ static void smc91c92_config(dev_link_t * char *name; int i, j, rev; ioaddr_t ioaddr; + u_long mir; DEBUG(0, "smc91c92_config(0x%p)\n", link); @@ -952,11 +953,6 @@ static void smc91c92_config(dev_link_t * else printk(KERN_NOTICE "smc91c92_cs: invalid if_port requested\n"); - if (register_netdev(dev) != 0) { - printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n"); - goto config_undo; - } - switch (smc->manfid) { case MANFID_OSITECH: case MANFID_PSION: @@ -977,8 +973,6 @@ static void smc91c92_config(dev_link_t * goto config_undo; } - strcpy(smc->node.dev_name, dev->name); - link->dev = &smc->node; smc->duplex = 0; smc->rx_ovrn = 0; @@ -993,25 +987,16 @@ static void smc91c92_config(dev_link_t * case 8: name = "100-FD"; break; case 9: name = "110"; break; } - printk(KERN_INFO "%s: smc91c%s rev %d: io %#3lx, irq %d, " - "hw_addr ", dev->name, name, (rev & 0x0f), dev->base_addr, - dev->irq); - for (i = 0; i < 6; i++) - printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); ioaddr = dev->base_addr; if (rev > 0) { - u_long mir, mcr; + u_long mcr; SMC_SELECT_BANK(0); mir = inw(ioaddr + MEMINFO) & 0xff; if (mir == 0xff) mir++; /* Get scale factor for memory size */ mcr = ((rev >> 4) > 3) ? inw(ioaddr + MEMCFG) : 0x0200; mir *= 128 * (1<<((mcr >> 9) & 7)); - if (mir & 0x3ff) - printk(KERN_INFO " %lu byte", mir); - else - printk(KERN_INFO " %lu kb", mir>>10); SMC_SELECT_BANK(1); smc->cfg = inw(ioaddr + CONFIG) & ~CFG_AUI_SELECT; smc->cfg |= CFG_NO_WAIT | CFG_16BIT | CFG_STATIC; @@ -1019,9 +1004,8 @@ static void smc91c92_config(dev_link_t * smc->cfg |= CFG_IRQ_SEL_1 | CFG_IRQ_SEL_0; if ((rev >> 4) >= 7) smc->cfg |= CFG_MII_SELECT; - printk(" buffer, %s xcvr\n", (smc->cfg & CFG_MII_SELECT) ? - "MII" : if_names[dev->if_port]); - } + } else + mir = 0; if (smc->cfg & CFG_MII_SELECT) { SMC_SELECT_BANK(3); @@ -1031,16 +1015,45 @@ static void smc91c92_config(dev_link_t * if ((j != 0) && (j != 0xffff)) break; } smc->mii_if.phy_id = (i < 32) ? i : -1; - if (i < 32) { - DEBUG(0, " MII transceiver at index %d, status %x.\n", i, j); - } else { - printk(KERN_NOTICE " No MII transceivers found!\n"); - } SMC_SELECT_BANK(0); } + link->dev = &smc->node; link->state &= ~DEV_CONFIG_PENDING; + + if (register_netdev(dev) != 0) { + printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n"); + link->dev = NULL; + goto config_undo; + } + + strcpy(smc->node.dev_name, dev->name); + + printk(KERN_INFO "%s: smc91c%s rev %d: io %#3lx, irq %d, " + "hw_addr ", dev->name, name, (rev & 0x0f), dev->base_addr, + dev->irq); + for (i = 0; i < 6; i++) + printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); + + if (rev > 0) { + if (mir & 0x3ff) + printk(KERN_INFO " %lu byte", mir); + else + printk(KERN_INFO " %lu kb", mir>>10); + printk(" buffer, %s xcvr\n", (smc->cfg & CFG_MII_SELECT) ? + "MII" : if_names[dev->if_port]); + } + + if (smc->cfg & CFG_MII_SELECT) { + if (smc->mii_if.phy_id != -1) { + DEBUG(0, " MII transceiver at index %d, status %x.\n", + smc->mii_if.phy_id, j); + } else { + printk(KERN_NOTICE " No MII transceivers found!\n"); + } + } + return; config_undo: diff -urpN orig/drivers/net/pcmcia/xirc2ps_cs.c linux/drivers/net/pcmcia/xirc2ps_cs.c --- orig/drivers/net/pcmcia/xirc2ps_cs.c Wed Feb 18 22:34:15 2004 +++ linux/drivers/net/pcmcia/xirc2ps_cs.c Mon Mar 8 00:14:21 2004 @@ -1114,17 +1114,20 @@ xirc2ps_config(dev_link_t * link) /* we can now register the device with the net subsystem */ dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; + + if (local->dingo) + do_reset(dev, 1); /* a kludge to make the cem56 work */ + + link->dev = &local->node; + link->state &= ~DEV_CONFIG_PENDING; + if ((err=register_netdev(dev))) { printk(KNOT_XIRC "register_netdev() failed\n"); + link->dev = NULL; goto config_error; } strcpy(local->node.dev_name, dev->name); - link->dev = &local->node; - link->state &= ~DEV_CONFIG_PENDING; - - if (local->dingo) - do_reset(dev, 1); /* a kludge to make the cem56 work */ /* give some infos about the hardware */ printk(KERN_INFO "%s: %s: port %#3lx, irq %d, hwaddr", -- 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 jgarzik@pobox.com Sun Mar 7 17:20:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 17:20:27 -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 i281KPKO012942 for ; Sun, 7 Mar 2004 17:20:26 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:34978 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1B09RQ-00030A-2m; Mon, 08 Mar 2004 01:20:24 +0000 Message-ID: <404BCA4B.4070109@pobox.com> Date: Sun, 07 Mar 2004 20:20:11 -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: Krzysztof Halasa CC: netdev@oss.sgi.com Subject: Re: 2.6.x wanXL driver update References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3815 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 jgarzik@pobox.com Sun Mar 7 17:20:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 17:20:34 -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 i281KVKO012998 for ; Sun, 7 Mar 2004 17:20:32 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:34979 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1B09RW-00030E-H9; Mon, 08 Mar 2004 01:20:30 +0000 Message-ID: <404BCA53.2080103@pobox.com> Date: Sun, 07 Mar 2004 20:20:19 -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: netdev@oss.sgi.com Subject: Re: [e100 2.6] missing setup for National DP83840 PHY rev b/c References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3816 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 rddunlap@osdl.org Sun Mar 7 20:14:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 20:14:21 -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 i284EHKO023203 for ; Sun, 7 Mar 2004 20:14:17 -0800 Received: from midway.verizon.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i284ECE16520; Sun, 7 Mar 2004 20:14:12 -0800 Date: Sun, 7 Mar 2004 19:38:03 -0800 From: "Randy.Dunlap" To: netdev@oss.sgi.com Cc: jgarzik Subject: [PATCH] ibmtr init section usage Message-Id: <20040307193803.576182ce.rddunlap@osdl.org> Organization: OSDL 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-archive-position: 3831 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: 980 Lines: 35 probe functions can be __devinit. Patch is to 2.6.4-rc2. Please apply. -- ~Randy diffstat:= drivers/net/tokenring/ibmtr.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff -Naurp ./drivers/net/tokenring/ibmtr.c~ibmtr_init ./drivers/net/tokenring/ibmtr.c --- ./drivers/net/tokenring/ibmtr.c~ibmtr_init 2004-03-06 20:57:06.000000000 -0800 +++ ./drivers/net/tokenring/ibmtr.c 2004-03-07 18:31:11.000000000 -0800 @@ -333,7 +333,7 @@ static void ibmtr_cleanup_card(struct ne #endif } -int ibmtr_probe_card(struct net_device *dev) +int __devinit ibmtr_probe_card(struct net_device *dev) { int err = ibmtr_probe(dev); if (!err) { @@ -356,7 +356,7 @@ int ibmtr_probe_card(struct net_device * * which references it. ****************************************************************************/ -static int ibmtr_probe(struct net_device *dev) +static int __devinit ibmtr_probe(struct net_device *dev) { int i; int base_addr = dev->base_addr; From rddunlap@osdl.org Sun Mar 7 20:14:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 20:14:20 -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 i284EIKO023204 for ; Sun, 7 Mar 2004 20:14:18 -0800 Received: from midway.verizon.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i284ECE16524; Sun, 7 Mar 2004 20:14:12 -0800 Date: Sun, 7 Mar 2004 19:40:09 -0800 From: "Randy.Dunlap" To: netdev@oss.sgi.com Cc: jgarzik Subject: [PATCH] smctr: fix init section usage Message-Id: <20040307194009.4ce2f9b1.rddunlap@osdl.org> Organization: OSDL 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-archive-position: 3830 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: 699 Lines: 25 smctr_chk_mca() can be __init. Patch is to 2.6.4-rc2. Please apply. -- ~Randy diffstat:= drivers/net/tokenring/smctr.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -Naurp ./drivers/net/tokenring/smctr.c~smctr_init ./drivers/net/tokenring/smctr.c --- ./drivers/net/tokenring/smctr.c~smctr_init 2004-02-17 19:57:56.000000000 -0800 +++ ./drivers/net/tokenring/smctr.c 2004-03-07 17:39:14.000000000 -0800 @@ -477,7 +477,7 @@ static int smctr_checksum_firmware(struc return (0); } -static int smctr_chk_mca(struct net_device *dev) +static int __init smctr_chk_mca(struct net_device *dev) { #ifdef CONFIG_MCA struct net_local *tp = (struct net_local *)dev->priv; From rddunlap@osdl.org Sun Mar 7 20:14:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 07 Mar 2004 20:14:19 -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 i284EHKO023202 for ; Sun, 7 Mar 2004 20:14:17 -0800 Received: from midway.verizon.net (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i284EBE16516; Sun, 7 Mar 2004 20:14:11 -0800 Date: Sun, 7 Mar 2004 19:35:42 -0800 From: "Randy.Dunlap" To: netdev@oss.sgi.com Cc: jgarzik Subject: [PATCH] eepro init section usage Message-Id: <20040307193542.20a510c9.rddunlap@osdl.org> Organization: OSDL 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-archive-position: 3829 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: 651 Lines: 28 Hi, eepro_print_info() can be __init. Please apply. Patch is to 2.6.4-rc2. -- ~Randy diffstat:= drivers/net/eepro.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -Naurp ./drivers/net/eepro.c~eepro_init ./drivers/net/eepro.c --- ./drivers/net/eepro.c~eepro_init 2004-02-17 19:58:50.000000000 -0800 +++ ./drivers/net/eepro.c 2004-03-07 16:36:03.000000000 -0800 @@ -680,7 +680,7 @@ static void eepro_recalc (struct net_dev } /* prints boot-time info */ -static void eepro_print_info (struct net_device *dev) +static void __init eepro_print_info (struct net_device *dev) { struct eepro_local * lp = dev->priv; int i; From herbert@gondor.apana.org.au Mon Mar 8 03:03:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 03:04:00 -0800 (PST) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i28B3uKO008979 for ; Mon, 8 Mar 2004 03:03:57 -0800 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1B0IXp-0001QK-00; Mon, 08 Mar 2004 22:03:37 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1B0IXj-0005OW-00; Mon, 08 Mar 2004 22:03:31 +1100 Date: Mon, 8 Mar 2004 22:03:31 +1100 To: "David S. Miller" , netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org Subject: ip_route_me_harder -> xfrm_lookup Message-ID: <20040308110331.GA20719@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="zYM0uCDKw75PZbzx" Content-Disposition: inline User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 3840 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi: I've received a number of reports that the any packets that are modified by the PREROUTING mangle table will not be protected by IPsec. The reason is that ip_route_me_harder which is called upon the exit of the mangle table does not set the proto field. This means that xfrm_lookup is never called. The following patch sets the proto field so that the packet can be protected by IPsec. Cheers, -- Debian GNU/Linux 3.0 is out! ( http://www.debian.org/ ) Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p Index: kernel-2.5/net/core/netfilter.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/net/core/netfilter.c,v retrieving revision 1.1.1.10 diff -u -r1.1.1.10 netfilter.c --- kernel-2.5/net/core/netfilter.c 8 Oct 2003 19:24:04 -0000 1.1.1.10 +++ kernel-2.5/net/core/netfilter.c 8 Mar 2004 10:52:39 -0000 @@ -639,6 +639,7 @@ #ifdef CONFIG_IP_ROUTE_FWMARK fl.nl_u.ip4_u.fwmark = (*pskb)->nfmark; #endif + fl.proto = iph->protocol; if (ip_route_output_key(&rt, &fl) != 0) return -1; --zYM0uCDKw75PZbzx-- From jgarzik@pobox.com Mon Mar 8 03:33:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 03:33:38 -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 i28BXHKO009693 for ; Mon, 8 Mar 2004 03:33:18 -0800 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143]:34024 helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.22) id 1AzKwk-0000DZ-HE; Fri, 05 Mar 2004 19:25:22 +0000 Message-ID: <4048D415.4060701@pobox.com> Date: Fri, 05 Mar 2004 14:25: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: Don Fry CC: netdev@oss.sgi.com Subject: Re: resend [PATCH 2.6.4-rc2] netdevice.h add netif_msg_init helper References: <200403051743.i25Hh5B02111@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200403051743.i25Hh5B02111@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3841 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 Don Fry wrote: > 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); > +} > + Oh, my apologies. I didn't see you had made the additional change I requested. This version looks better, but we still have an out of range value (32) resulting in no-messages, rather than the default value. I would change the first ">" to ">=", and simply eliminate the final test. Jeff From satyasrikanth2001@yahoo.com Mon Mar 8 05:23:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 05:23:58 -0800 (PST) Received: from web21101.mail.yahoo.com (web21101.mail.yahoo.com [216.136.227.103]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i28DNsKO015501 for ; Mon, 8 Mar 2004 05:23:54 -0800 Message-ID: <20040308132354.77437.qmail@web21101.mail.yahoo.com> Received: from [203.200.95.130] by web21101.mail.yahoo.com via HTTP; Mon, 08 Mar 2004 05:23:54 PST Date: Mon, 8 Mar 2004 05:23:54 -0800 (PST) From: satya srikanth Subject: Xeon smp performance To: netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 3842 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: satyasrikanth2001@yahoo.com Precedence: bulk X-list: netdev Hi, I am writing a simple sniffer program that will sniff packets in a gigabit network. I am using a dual processor 2 GHz Xeon processor with one Intel Pro-1000 desktop adapter, running 2.4.20-8smp linux. I found that for all packet sizes and network bandwidth, 2.4.20-8 uniprocessor version that uses only one processor is performing better than 2.4.20-8smp using two processors in terms of packet drops and CPU utilization. Each processor in smp is utilizing more CPU than one processor in uni-processor case. What is the reason for this peculiar behaviour? Is it possible for me to use the power of second processor without adding more NICs. Will I face similar problems with 2.6 also? Anybody familiar with these please help me out. TIA Satya Srikanth __________________________________ Do you Yahoo!? Yahoo! Search - Find what you’re looking for faster http://search.yahoo.com From Mike_Phillips@URSCorp.com Mon Mar 8 06:40:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 06:40:32 -0800 (PST) Received: from smtp102.urscorp.com (urs-smtp-01.nks.net [24.73.112.33]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i28EeRKO016875 for ; Mon, 8 Mar 2004 06:40:31 -0800 Subject: Re: [PATCH] ibmtr init section usage To: "Randy.Dunlap" Cc: jgarzik , netdev@oss.sgi.com X-Mailer: Lotus Notes Release 5.0.11 July 24, 2002 Message-ID: From: Mike_Phillips@URSCorp.com Date: Mon, 8 Mar 2004 09:39:52 -0500 X-MIMETrack: Serialize by Router on SMTP102/URSCorp(Release 5.0.11 |July 24, 2002) at 03/08/2004 09:37:12 AM MIME-Version: 1.0 Content-type: text/plain; charset=us-ascii X-archive-position: 3843 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Mike_Phillips@URSCorp.com Precedence: bulk X-list: netdev >probe functions can be __devinit. > Patch is to 2.6.4-rc2. Please apply. Will this blow up the pcmcia ibmtr_cs. It links in ibmtr and uses the probe functions. Mike From kaber@trash.net Mon Mar 8 06:46:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 06:46:51 -0800 (PST) Received: from mx02.qsc.de (mx02.qsc.de [213.148.130.14]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i28EklKO017260 for ; Mon, 8 Mar 2004 06:46:48 -0800 Received: from port-212-202-52-228.reverse.qsc.de ([212.202.52.228] helo=gw.localnet) by mx02.qsc.de with esmtp (Exim 3.35 #1) id 1B0M0N-0008Dn-00; Mon, 08 Mar 2004 15:45:19 +0100 Received: from ws.localnet ([192.168.0.23] helo=trash.net ident=kaber) by gw.localnet with esmtp (Exim 3.36 #1 (Debian)) id 1B0M0q-0001y4-00; Mon, 08 Mar 2004 15:45:48 +0100 Message-ID: <404C874D.4000907@trash.net> Date: Mon, 08 Mar 2004 15:46:37 +0100 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040122 Debian/1.6-1 X-Accept-Language: en MIME-Version: 1.0 To: Herbert Xu CC: "David S. Miller" , netdev@oss.sgi.com, netfilter-devel@lists.netfilter.org Subject: Re: ip_route_me_harder -> xfrm_lookup References: <20040308110331.GA20719@gondor.apana.org.au> In-Reply-To: <20040308110331.GA20719@gondor.apana.org.au> X-Enigmail-Version: 0.83.3.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 3844 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev Hi Herbert, Herbert Xu wrote: > Hi: > > I've received a number of reports that the any packets that are modified > by the PREROUTING mangle table will not be protected by IPsec. > > The reason is that ip_route_me_harder which is called upon the exit > of the mangle table does not set the proto field. This means that > xfrm_lookup is never called. > > The following patch sets the proto field so that the packet can be > protected by IPsec. I have been working on a set of patches for IPsec+Netfilter, the latest set has been posted to netfilter-devel last week. They will go in patch-o-matic for testing soon, but I will post them to netdev later today, so we won't waste time testing patches before Dave is fine with them. Regards, Patrick > > Cheers, > > > ------------------------------------------------------------------------ > > Index: kernel-2.5/net/core/netfilter.c > =================================================================== > RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/net/core/netfilter.c,v > retrieving revision 1.1.1.10 > diff -u -r1.1.1.10 netfilter.c > --- kernel-2.5/net/core/netfilter.c 8 Oct 2003 19:24:04 -0000 1.1.1.10 > +++ kernel-2.5/net/core/netfilter.c 8 Mar 2004 10:52:39 -0000 > @@ -639,6 +639,7 @@ > #ifdef CONFIG_IP_ROUTE_FWMARK > fl.nl_u.ip4_u.fwmark = (*pskb)->nfmark; > #endif > + fl.proto = iph->protocol; > if (ip_route_output_key(&rt, &fl) != 0) > return -1; > From P@draigBrady.com Mon Mar 8 07:15:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 07:15:44 -0800 (PST) Received: from corvil.com (gate.corvil.net [213.94.219.177]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i28FFWKO018111 for ; Mon, 8 Mar 2004 07:15:33 -0800 Received: from draigBrady.com (pixelbeat.local.corvil.com [172.18.1.170]) by corvil.com (8.12.9/8.12.5) with ESMTP id i28FFUjD037328; Mon, 8 Mar 2004 15:15:30 GMT (envelope-from P@draigBrady.com) Message-ID: <404C8E12.4060403@draigBrady.com> Date: Mon, 08 Mar 2004 15:15:30 +0000 From: P@draigBrady.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040124 X-Accept-Language: en-us, en MIME-Version: 1.0 To: satya srikanth CC: netdev@oss.sgi.com Subject: Re: Xeon smp performance References: <20040308132354.77437.qmail@web21101.mail.yahoo.com> In-Reply-To: <20040308132354.77437.qmail@web21101.mail.yahoo.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-MIME-Autoconverted: from 8bit to quoted-printable by corvil.com id i28FFUjD037328 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i28FFWKO018111 X-archive-position: 3845 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: P@draigBrady.com Precedence: bulk X-list: netdev satya srikanth wrote: > Hi, > I am writing a simple sniffer program that will > sniff packets in a gigabit network. I am using a dual > processor 2 GHz Xeon processor with one Intel Pro-1000 > desktop adapter, running 2.4.20-8smp linux. > I found that for all packet sizes and network > bandwidth, 2.4.20-8 uniprocessor version that uses > only one processor is performing better than > 2.4.20-8smp using two processors in terms of packet > drops and CPU utilization. Each processor in smp is > utilizing more CPU than one processor in uni-processor > case. What is the reason for this peculiar behaviour? > Is it possible for me to use the power of second > processor without adding more NICs. Will I face > similar problems with 2.6 also? Anybody familiar with > these please help me out. That matches my experience. My chipset was Intel E7501 with 2 intel pro-1000 adapters. I used the base 2.4.20 kernel with latest intel drivers. I had 2 processes capturing packets and noticed that 2 CPUs is 7% slower than one CPU. Note I was using a non SMP kernel for the one CPU case. I'm going to have to look into improving this soon. First I'm going to look at IRQ and process affinity. Pádraig. From wensong@linux-vs.org Mon Mar 8 08:38:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 08:38:31 -0800 (PST) Received: from lb1.ctrip.com ([218.244.111.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i28GcPKO025051 for ; Mon, 8 Mar 2004 08:38:26 -0800 Received: from penguin.linux-vs.org ([211.136.74.14]) by lb1.ctrip.com (8.12.10/8.12.10) with ESMTP id i28Gc29T014458 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=OK); Tue, 9 Mar 2004 00:38:13 +0800 Received: from localhost (localhost.localdomain [127.0.0.1]) by penguin.linux-vs.org (8.12.8/8.12.8) with ESMTP id i28GbtDF003510; Tue, 9 Mar 2004 00:37:55 +0800 Date: Tue, 9 Mar 2004 00:37:54 +0800 (CST) From: Wensong Zhang To: netdev@oss.sgi.com cc: "David S. Miller" , Horms , Julian Anastasov Subject: [PATCH 2.4/2.6] IPVS: code tidy up Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463811584-157386712-1078763874=:1981" X-archive-position: 3846 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: wensong@linux-vs.org Precedence: bulk X-list: netdev This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---1463811584-157386712-1078763874=:1981 Content-Type: TEXT/PLAIN; charset=US-ASCII Hi, Here are the minor patches for IPVS code in the kernel 2.4 and 2.6. Please consider to apply them respectively. Thanks, Wensong ---1463811584-157386712-1078763874=:1981 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="linux-2.4-ipvs-tidyup.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="linux-2.4-ipvs-tidyup.patch" IyBUaGlzIGlzIGEgQml0S2VlcGVyIGdlbmVyYXRlZCBwYXRjaCBmb3IgdGhl IGZvbGxvd2luZyBwcm9qZWN0Og0KIyBQcm9qZWN0IE5hbWU6IExpbnV4IGtl cm5lbCB0cmVlDQojIFRoaXMgcGF0Y2ggZm9ybWF0IGlzIGludGVuZGVkIGZv ciBHTlUgcGF0Y2ggY29tbWFuZCB2ZXJzaW9uIDIuNSBvciBoaWdoZXIuDQoj IFRoaXMgcGF0Y2ggaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBkZWx0YXM6DQoj CSAgICAgICAgICAgQ2hhbmdlU2V0CTEuMTMzMyAgLT4gMS4xMzM0IA0KIwlu ZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jCTEuNCAgICAgLT4gMS41ICAgIA0K Iw0KIyBUaGUgZm9sbG93aW5nIGlzIHRoZSBCaXRLZWVwZXIgQ2hhbmdlU2V0 IExvZw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQ0KIyAwNC8wMy8wOQl3ZW5zb25nQGxpbnV4LXZzLm9yZwkxLjEz MzQNCiMgW0lQVlNdIGNvZGUgdGlkeSB1cA0KIyANCiMgUGF0Y2ggZnJvbSBI b3JtcyA8aG9ybXNAdmVyZ2VuZXQubmV0Pg0KIyANCiMgMS4gVGhlIHRyYWls aW5nICdcbicgd2FzIG1pc3NpbmcsIGl0IGhhcyBiZWVuIGFkZGVkDQojIDIu IFRoZSBwcm90b2NvbCBpcyBhbHJlYWR5IGluIGhvc3QgYnl0ZSBvcmRlciwN CiMgICAgdGhlIG50b2hsKCkgY2FsbCBoYXMgYmVlbiByZW1vdmVkDQojIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoj DQpkaWZmIC1OcnUgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jIGIvbmV0 L2lwdjQvaXB2cy9pcF92c19jdGwuYw0KLS0tIGEvbmV0L2lwdjQvaXB2cy9p cF92c19jdGwuYwlUdWUgTWFyICA5IDAwOjAzOjI5IDIwMDQNCisrKyBiL25l dC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMJVHVlIE1hciAgOSAwMDowMzoyOSAy MDA0DQpAQCAtMTczNyw5ICsxNzM3LDkgQEANCiAJICogQ2hlY2sgZm9yIHZh bGlkIHByb3RvY29sOiBUQ1Agb3IgVURQLiBFdmVuIGZvciBmd21hcmshPTAN CiAJICovDQogCWlmICh1cnVsZS0+cHJvdG9jb2whPUlQUFJPVE9fVENQICYm IHVydWxlLT5wcm90b2NvbCE9SVBQUk9UT19VRFApIHsNCi0JCUlQX1ZTX0lO Rk8oInZzX2N0bDogaW52YWxpZCBwcm90b2NvbDogJWQgJWQuJWQuJWQuJWQ6 JWQgJXMiLA0KLQkJCSAgIG50b2hzKHVydWxlLT5wcm90b2NvbCksIE5JUFFV QUQodXJ1bGUtPnZhZGRyKSwNCi0JCQkgICBudG9ocyh1cnVsZS0+dnBvcnQp LCB1cnVsZS0+c2NoZWRfbmFtZSk7DQorCQlJUF9WU19FUlIoInNldF9jdGw6 IGludmFsaWQgcHJvdG9jb2wgJWQgJWQuJWQuJWQuJWQ6JWQgJXNcbiIsDQor CQkJICB1cnVsZS0+cHJvdG9jb2wsIE5JUFFVQUQodXJ1bGUtPnZhZGRyKSwN CisJCQkgIG50b2hzKHVydWxlLT52cG9ydCksIHVydWxlLT5zY2hlZF9uYW1l KTsNCiAJCXJldCA9IC1FRkFVTFQ7DQogCQlnb3RvIG91dF91bmxvY2s7DQog CX0NCg== ---1463811584-157386712-1078763874=:1981 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="linux-2.6-ipvs-tidyup.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="linux-2.6-ipvs-tidyup.patch" IyBUaGlzIGlzIGEgQml0S2VlcGVyIGdlbmVyYXRlZCBwYXRjaCBmb3IgdGhl IGZvbGxvd2luZyBwcm9qZWN0Og0KIyBQcm9qZWN0IE5hbWU6IExpbnV4IGtl cm5lbCB0cmVlDQojIFRoaXMgcGF0Y2ggZm9ybWF0IGlzIGludGVuZGVkIGZv ciBHTlUgcGF0Y2ggY29tbWFuZCB2ZXJzaW9uIDIuNSBvciBoaWdoZXIuDQoj IFRoaXMgcGF0Y2ggaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBkZWx0YXM6DQoj CSAgICAgICAgICAgQ2hhbmdlU2V0CTEuMTY5MiAgLT4gMS4xNjkzIA0KIwlu ZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jCTEuMTIgICAgLT4gMS4xMyAgIA0K Iw0KIyBUaGUgZm9sbG93aW5nIGlzIHRoZSBCaXRLZWVwZXIgQ2hhbmdlU2V0 IExvZw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQ0KIyAwNC8wMy8wOQl3ZW5zb25nQGxpbnV4LXZzLm9yZwkxLjE2 OTMNCiMgW0lQVlNdIGNvZGUgdGlkeSB1cA0KIyANCiMgUGF0Y2ggZnJvbSBI b3JtcyA8aG9ybXNAdmVyZ2VuZXQubmV0Pg0KIyANCiMgMS4gVGhlIHRyYWls aW5nICdcbicgd2FzIG1pc3NpbmcsIGl0IGhhcyBiZWVuIGFkZGVkDQojIDIu IFRoZSBwcm90b2NvbCBpcyBhbHJlYWR5IGluIGhvc3QgYnl0ZSBvcmRlciwN CiMgICAgdGhlIG50b2hsKCkgY2FsbCBoYXMgYmVlbiByZW1vdmVkDQojIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoj DQpkaWZmIC1OcnUgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jIGIvbmV0 L2lwdjQvaXB2cy9pcF92c19jdGwuYw0KLS0tIGEvbmV0L2lwdjQvaXB2cy9p cF92c19jdGwuYwlUdWUgTWFyICA5IDAwOjM2OjI5IDIwMDQNCisrKyBiL25l dC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMJVHVlIE1hciAgOSAwMDozNjoyOSAy MDA0DQpAQCAtMTgzNiw5ICsxODM2LDkgQEANCiANCiAJLyogQ2hlY2sgZm9y IHZhbGlkIHByb3RvY29sOiBUQ1Agb3IgVURQLCBldmVuIGZvciBmd21hcmsh PTAgKi8NCiAJaWYgKHVzdmMtPnByb3RvY29sIT1JUFBST1RPX1RDUCAmJiB1 c3ZjLT5wcm90b2NvbCE9SVBQUk9UT19VRFApIHsNCi0JCUlQX1ZTX0lORk8o InZzX2N0bDogaW52YWxpZCBwcm90b2NvbDogJWQgJWQuJWQuJWQuJWQ6JWQg JXMiLA0KLQkJCSAgIG50b2hzKHVzdmMtPnByb3RvY29sKSwgTklQUVVBRCh1 c3ZjLT5hZGRyKSwNCi0JCQkgICBudG9ocyh1c3ZjLT5wb3J0KSwgdXN2Yy0+ c2NoZWRfbmFtZSk7DQorCQlJUF9WU19FUlIoInNldF9jdGw6IGludmFsaWQg cHJvdG9jb2w6ICVkICVkLiVkLiVkLiVkOiVkICVzXG4iLA0KKwkJCSAgdXN2 Yy0+cHJvdG9jb2wsIE5JUFFVQUQodXN2Yy0+YWRkciksDQorCQkJICBudG9o cyh1c3ZjLT5wb3J0KSwgdXN2Yy0+c2NoZWRfbmFtZSk7DQogCQlyZXQgPSAt RUZBVUxUOw0KIAkJZ290byBvdXRfdW5sb2NrOw0KIAl9DQo= ---1463811584-157386712-1078763874=:1981-- From rddunlap@osdl.org Mon Mar 8 09:03:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 09:03:38 -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 i28H3aKO025719 for ; Mon, 8 Mar 2004 09:03:36 -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 i28H3GE31041; Mon, 8 Mar 2004 09:03:16 -0800 Date: Mon, 8 Mar 2004 09:01:54 -0800 From: "Randy.Dunlap" To: Mike_Phillips@URSCorp.com Cc: jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [PATCH] ibmtr init section usage Message-Id: <20040308090154.721ea21a.rddunlap@osdl.org> In-Reply-To: References: 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: 3847 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 On Mon, 8 Mar 2004 09:39:52 -0500 Mike_Phillips@URSCorp.com wrote: | | >probe functions can be __devinit. | | > Patch is to 2.6.4-rc2. Please apply. | | Will this blow up the pcmcia ibmtr_cs. It links in ibmtr and uses the probe | functions. Should be OK. See: #ifdef CONFIG_HOTPLUG #define __devinit #define __devinitdata #define __devexit #define __devexitdata #else #define __devinit __init #define __devinitdata __initdata #define __devexit __exit #define __devexitdata __exitdata #endif and PCMCIA/CardBus depends on HOTPLUG being enabled. -- ~Randy From shemminger@osdl.org Mon Mar 8 10:17:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 10:18:00 -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 i28IHdKO027630 for ; Mon, 8 Mar 2004 10:17:39 -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 i28IHQE14142; Mon, 8 Mar 2004 10:17:26 -0800 Date: Mon, 8 Mar 2004 10:17:26 -0800 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH] always set westwood rtt (trivial) Message-Id: <20040308101726.4d08467a@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: 3849 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: 493 Lines: 15 It is faster just to update the rtt even if we never use it. diff -Nru a/include/net/tcp.h b/include/net/tcp.h --- a/include/net/tcp.h Mon Mar 8 10:10:57 2004 +++ b/include/net/tcp.h Mon Mar 8 10:10:57 2004 @@ -2030,8 +2030,7 @@ static inline void tcp_westwood_update_rtt(struct tcp_opt *tp, __u32 rtt_seq) { - if (sysctl_tcp_westwood) - tp->westwood.rtt = rtt_seq; + tp->westwood.rtt = rtt_seq; } void __tcp_westwood_fast_bw(struct sock *, struct sk_buff *); From brazilnut@us.ibm.com Mon Mar 8 11:11:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 11:11:53 -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 i28JBiKO029545 for ; Mon, 8 Mar 2004 11:11:51 -0800 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i28JBcfS841782; Mon, 8 Mar 2004 14:11:38 -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 i28JBaKr188484; Mon, 8 Mar 2004 12:11:37 -0700 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i28JAli10587; Mon, 8 Mar 2004 11:10:47 -0800 From: Don Fry Message-Id: <200403081910.i28JAli10587@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.4.26-pre2] netdevice.h: add netif_msg_init helper To: jgarzik@pobox.com, netdev@oss.sgi.com Date: Mon, 8 Mar 2004 11:10: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: 3851 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: 970 Lines: 30 Please apply the following patch to 2.4.26-pre2 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. Tested IA32. --- orig.linux-2.4.26-pre2/include/linux/netdevice.h Wed Feb 18 05:36:32 2004 +++ linux-2.4.26-pre2/include/linux/netdevice.h Mon Mar 8 10:10:23 2004 @@ -732,6 +732,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 (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 Mon Mar 8 11:15:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 11:15:39 -0800 (PST) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com [32.97.182.103]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i28JFVKO029975 for ; Mon, 8 Mar 2004 11:15:32 -0800 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e3.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i28JFIAB615958; Mon, 8 Mar 2004 14:15:22 -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 i28JFGQN122962; Mon, 8 Mar 2004 14:15:16 -0500 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i28JERJ10601; Mon, 8 Mar 2004 11:14:27 -0800 From: Don Fry Message-Id: <200403081914.i28JERJ10601@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.4.26-pre2] pcnet32 use netif_msg_init To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Mon, 8 Mar 2004 11:14:27 -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: 3852 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: 1382 Lines: 37 Please apply this patch to 2.4.26 after the preceeding patch to add the netif_msg_init helper to netdevice.h This patch uses the netif_msg_init routine to initialize the debug message level for the pcnet32 driver. --- orig.linux-2.4.26-pre2/drivers/net/pcnet32.c Mon Mar 8 10:07:05 2004 +++ linux-2.4.26-pre2/drivers/net/pcnet32.c Mon Mar 8 10:22:32 2004 @@ -224,10 +224,13 @@ * 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. + * Uses netif_msg_init Don Fry. */ @@ -1949,8 +1952,7 @@ { printk(KERN_INFO "%s", version); - if (debug >= 0 && debug < (sizeof(int) - 1)) - pcnet32_debug = 1 << debug; + pcnet32_debug = netif_msg_init(debug, 0); if ((tx_start_pt >= 0) && (tx_start_pt <= 3)) tx_start = tx_start_pt; -- Don Fry brazilnut@us.ibm.com From jt@bougret.hpl.hp.com Mon Mar 8 11:22:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 11:22:06 -0800 (PST) Received: from palrel11.hp.com (palrel11.hp.com [156.153.255.246]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i28JLsKO030430 for ; Mon, 8 Mar 2004 11:21:54 -0800 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel11.hp.com (Postfix) with ESMTP id E1AD91C01DA9; Mon, 8 Mar 2004 10:52:43 -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 KAA04386; Mon, 8 Mar 2004 10:52:43 -0800 (PST) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1B0Prn-0004mj-00; Mon, 08 Mar 2004 10:52:43 -0800 Date: Mon, 8 Mar 2004 10:52:43 -0800 To: netdev@oss.sgi.com, Thomas Munck Steenholdt Cc: Jeff Garzik Subject: Re: [PATCH] 2.6.3 orinoco.c patch to support ethtool get_link Message-ID: <20040308185242.GA18367@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 3853 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: 629 Lines: 17 Thomas Munck Steenholdt wrote : > > I noticed that there wasn't a good way, from userland, to get the link > status of an orinoco device. I hope you realise that most often link status is meaningless with Wireless cards. In Ad-Hoc mode, the link is always up, regardless of the number of nodes in the cell, check the discussion on the HostAP mailing list. And the Orinoco card will report connected even is WEP is wrong. But, if you only use managed mode without WEP, that should work. I just wonder if it's better to report a 'link status' that may be wrong/misleading or to not report anything at all. Have fun... Jean From brazilnut@us.ibm.com Mon Mar 8 11:43:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 11:43:43 -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 i28JhYKO031042 for ; Mon, 8 Mar 2004 11:43:41 -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 i28JhQrj442302; Mon, 8 Mar 2004 14:43:26 -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 i28JhPKr136202; Mon, 8 Mar 2004 12:43:26 -0700 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i28Jga910632; Mon, 8 Mar 2004 11:42:36 -0800 From: Don Fry Message-Id: <200403081942.i28Jga910632@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.6.4-rc2-bk4 1/2] pcnet32 transmit hang fix To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Mon, 8 Mar 2004 11:42:36 -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: 3854 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: 1029 Lines: 29 Please apply the following patch to 2.6.4-rc2-bk4. The pcnet32 driver will hang after a few frames (<30) with the 79C971 (and probably the 79C972 though I don't have the hardware to prove it). By interrupting slightly more frequently the hang will not occur. This patch is already included in 2.4.26-pre2. --- orig.linux-2.6.4-rc2-bk4/drivers/net/pcnet32.c Mon Mar 8 10:02:25 2004 +++ linux-2.6.4-rc2-bk4/drivers/net/pcnet32.c Mon Mar 8 10:24:43 2004 @@ -1452,11 +1452,12 @@ status = 0x8300; entry = (lp->cur_tx - lp->dirty_tx) & TX_RING_MOD_MASK; if ((lp->ltint) && - ((entry == TX_RING_SIZE/2) || + ((entry == TX_RING_SIZE/3) || + (entry == (TX_RING_SIZE*2)/3) || (entry >= TX_RING_SIZE-2))) { /* Enable Successful-TxDone interrupt if we have - * 1/2 of, or nearly all of, our ring buffer Tx'd + * 1/3, 2/3 or nearly all of, our ring buffer Tx'd * but not yet cleaned up. Thus, most of the time, * we will not enable Successful-TxDone interrupts. */ -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Mon Mar 8 11:47:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 11:47:58 -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 i28JlsKO031418 for ; Mon, 8 Mar 2004 11:47:55 -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 i28JliZ2261718; Mon, 8 Mar 2004 14:47:44 -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 i28JlsdB097392; Mon, 8 Mar 2004 14:47:55 -0500 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i28Jkrb10646; Mon, 8 Mar 2004 11:46:53 -0800 From: Don Fry Message-Id: <200403081946.i28Jkrb10646@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.6.4-rc2-bk4 2/2] pcnet32 use netif_msg_init To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Mon, 8 Mar 2004 11:46:53 -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: 3855 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: 1492 Lines: 40 Please apply this patch to 2.6.4-rc2-bk4 after the patch to add the netif_msg_init helper to netdevice.h (sent Friday 3/5/04 [PATCH 2.4.26-pre2] netdevice.h: add netif_msg_init helper) This patch uses the netif_msg_init routine to initialize the debug message level for the pcnet32 driver. Tested IA32. --- linux-2.6.4-rc2-bk4/drivers/net/hang.pcnet32.c Mon Mar 8 11:25:32 2004 +++ linux-2.6.4-rc2-bk4/drivers/net/pcnet32.c Mon Mar 8 11:26:01 2004 @@ -225,10 +225,13 @@ * 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. + * Uses netif_msg_init Don Fry. */ @@ -2013,8 +2016,7 @@ { printk(KERN_INFO "%s", version); - if (debug >= 0 && debug < (sizeof(int) - 1)) - pcnet32_debug = 1 << debug; + pcnet32_debug = netif_msg_init(debug, 0); if ((tx_start_pt >= 0) && (tx_start_pt <= 3)) tx_start = tx_start_pt; -- Don Fry brazilnut@us.ibm.com From davem@redhat.com Mon Mar 8 11:59:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 08 Mar 2004 11:59: