Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (1232 commits)
  iucv: Fix bad merging.
  net_sched: Add size table for qdiscs
  net_sched: Add accessor function for packet length for qdiscs
  net_sched: Add qdisc_enqueue wrapper
  highmem: Export totalhigh_pages.
  ipv6 mcast: Omit redundant address family checks in ip6_mc_source().
  net: Use standard structures for generic socket address structures.
  ipv6 netns: Make several "global" sysctl variables namespace aware.
  netns: Use net_eq() to compare net-namespaces for optimization.
  ipv6: remove unused macros from net/ipv6.h
  ipv6: remove unused parameter from ip6_ra_control
  tcp: fix kernel panic with listening_get_next
  tcp: Remove redundant checks when setting eff_sacks
  tcp: options clean up
  tcp: Fix MD5 signatures for non-linear skbs
  sctp: Update sctp global memory limit allocations.
  sctp: remove unnecessary byteshifting, calculate directly in big-endian
  sctp: Allow only 1 listening socket with SO_REUSEADDR
  sctp: Do not leak memory on multiple listen() calls
  sctp: Support ipv6only AF_INET6 sockets.
  ...
This commit is contained in:
Linus Torvalds 2008-07-20 17:43:29 -07:00
commit db6d8c7a40
891 changed files with 90764 additions and 68014 deletions

View File

@ -308,9 +308,31 @@ Who: Matthew Wilcox <willy@linux.intel.com>
---------------------------
What: SCTP_GET_PEER_ADDRS_NUM_OLD, SCTP_GET_PEER_ADDRS_OLD,
SCTP_GET_LOCAL_ADDRS_NUM_OLD, SCTP_GET_LOCAL_ADDRS_OLD
When: June 2009
Why: A newer version of the options have been introduced in 2005 that
removes the limitions of the old API. The sctp library has been
converted to use these new options at the same time. Any user
space app that directly uses the old options should convert to using
the new options.
Who: Vlad Yasevich <vladislav.yasevich@hp.com>
---------------------------
What: CONFIG_THERMAL_HWMON
When: January 2009
Why: This option was introduced just to allow older lm-sensors userspace
to keep working over the upgrade to 2.6.26. At the scheduled time of
removal fixed lm-sensors (2.x or 3.x) should be readily available.
Who: Rene Herman <rene.herman@gmail.com>
---------------------------
What: Code that is now under CONFIG_WIRELESS_EXT_SYSFS
(in net/core/net-sysfs.c)
When: After the only user (hal) has seen a release with the patches
for enough time, probably some time in 2010.
Why: Over 1K .text/.data size reduction, data is available in other
ways (ioctls)
Who: Johannes Berg <johannes@sipsolutions.net>

View File

@ -289,35 +289,73 @@ downdelay
fail_over_mac
Specifies whether active-backup mode should set all slaves to
the same MAC address (the traditional behavior), or, when
enabled, change the bond's MAC address when changing the
active interface (i.e., fail over the MAC address itself).
the same MAC address at enslavement (the traditional
behavior), or, when enabled, perform special handling of the
bond's MAC address in accordance with the selected policy.
Fail over MAC is useful for devices that cannot ever alter
their MAC address, or for devices that refuse incoming
broadcasts with their own source MAC (which interferes with
the ARP monitor).
Possible values are:
The down side of fail over MAC is that every device on the
network must be updated via gratuitous ARP, vs. just updating
a switch or set of switches (which often takes place for any
traffic, not just ARP traffic, if the switch snoops incoming
traffic to update its tables) for the traditional method. If
the gratuitous ARP is lost, communication may be disrupted.
none or 0
When fail over MAC is used in conjuction with the mii monitor,
devices which assert link up prior to being able to actually
transmit and receive are particularly susecptible to loss of
the gratuitous ARP, and an appropriate updelay setting may be
required.
This setting disables fail_over_mac, and causes
bonding to set all slaves of an active-backup bond to
the same MAC address at enslavement time. This is the
default.
A value of 0 disables fail over MAC, and is the default. A
value of 1 enables fail over MAC. This option is enabled
automatically if the first slave added cannot change its MAC
address. This option may be modified via sysfs only when no
slaves are present in the bond.
active or 1
This option was added in bonding version 3.2.0.
The "active" fail_over_mac policy indicates that the
MAC address of the bond should always be the MAC
address of the currently active slave. The MAC
address of the slaves is not changed; instead, the MAC
address of the bond changes during a failover.
This policy is useful for devices that cannot ever
alter their MAC address, or for devices that refuse
incoming broadcasts with their own source MAC (which
interferes with the ARP monitor).
The down side of this policy is that every device on
the network must be updated via gratuitous ARP,
vs. just updating a switch or set of switches (which
often takes place for any traffic, not just ARP
traffic, if the switch snoops incoming traffic to
update its tables) for the traditional method. If the
gratuitous ARP is lost, communication may be
disrupted.
When this policy is used in conjuction with the mii
monitor, devices which assert link up prior to being
able to actually transmit and receive are particularly
susecptible to loss of the gratuitous ARP, and an
appropriate updelay setting may be required.
follow or 2
The "follow" fail_over_mac policy causes the MAC
address of the bond to be selected normally (normally
the MAC address of the first slave added to the bond).
However, the second and subsequent slaves are not set
to this MAC address while they are in a backup role; a
slave is programmed with the bond's MAC address at
failover time (and the formerly active slave receives
the newly active slave's MAC address).
This policy is useful for multiport devices that
either become confused or incur a performance penalty
when multiple ports are programmed with the same MAC
address.
The default policy is none, unless the first slave cannot
change its MAC address, in which case the active policy is
selected by default.
This option may be modified via sysfs only when no slaves are
present in the bond.
This option was added in bonding version 3.2.0. The "follow"
policy was added in bonding version 3.3.0.
lacp_rate
@ -338,7 +376,8 @@ max_bonds
Specifies the number of bonding devices to create for this
instance of the bonding driver. E.g., if max_bonds is 3, and
the bonding driver is not already loaded, then bond0, bond1
and bond2 will be created. The default value is 1.
and bond2 will be created. The default value is 1. Specifying
a value of 0 will load bonding, but will not create any devices.
miimon
@ -501,6 +540,17 @@ mode
swapped with the new curr_active_slave that was
chosen.
num_grat_arp
Specifies the number of gratuitous ARPs to be issued after a
failover event. One gratuitous ARP is issued immediately after
the failover, subsequent ARPs are sent at a rate of one per link
monitor interval (arp_interval or miimon, whichever is active).
The valid range is 0 - 255; the default value is 1. This option
affects only the active-backup mode. This option was added for
bonding version 3.3.0.
primary
A string (eth0, eth2, etc) specifying which slave is the

View File

@ -0,0 +1,167 @@
DM9000 Network driver
=====================
Copyright 2008 Simtec Electronics,
Ben Dooks <ben@simtec.co.uk> <ben-linux@fluff.org>
Introduction
------------
This file describes how to use the DM9000 platform-device based network driver
that is contained in the files drivers/net/dm9000.c and drivers/net/dm9000.h.
The driver supports three DM9000 variants, the DM9000E which is the first chip
supported as well as the newer DM9000A and DM9000B devices. It is currently
maintained and tested by Ben Dooks, who should be CC: to any patches for this
driver.
Defining the platform device
----------------------------
The minimum set of resources attached to the platform device are as follows:
1) The physical address of the address register
2) The physical address of the data register
3) The IRQ line the device's interrupt pin is connected to.
These resources should be specified in that order, as the ordering of the
two address regions is important (the driver expects these to be address
and then data).
An example from arch/arm/mach-s3c2410/mach-bast.c is:
static struct resource bast_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS5 + BAST_PA_DM9000,
.end = S3C2410_CS5 + BAST_PA_DM9000 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS5 + BAST_PA_DM9000 + 0x40,
.end = S3C2410_CS5 + BAST_PA_DM9000 + 0x40 + 0x3f,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_DM9000,
.end = IRQ_DM9000,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
}
};
static struct platform_device bast_device_dm9k = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
.resource = bast_dm9k_resource,
};
Note the setting of the IRQ trigger flag in bast_dm9k_resource[2].flags,
as this will generate a warning if it is not present. The trigger from
the flags field will be passed to request_irq() when registering the IRQ
handler to ensure that the IRQ is setup correctly.
This shows a typical platform device, without the optional configuration
platform data supplied. The next example uses the same resources, but adds
the optional platform data to pass extra configuration data:
static struct dm9000_plat_data bast_dm9k_platdata = {
.flags = DM9000_PLATF_16BITONLY,
};
static struct platform_device bast_device_dm9k = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
.resource = bast_dm9k_resource,
.dev = {
.platform_data = &bast_dm9k_platdata,
}
};
The platform data is defined in include/linux/dm9000.h and described below.
Platform data
-------------
Extra platform data for the DM9000 can describe the IO bus width to the
device, whether or not an external PHY is attached to the device and
the availability of an external configuration EEPROM.
The flags for the platform data .flags field are as follows:
DM9000_PLATF_8BITONLY
The IO should be done with 8bit operations.
DM9000_PLATF_16BITONLY
The IO should be done with 16bit operations.
DM9000_PLATF_32BITONLY
The IO should be done with 32bit operations.
DM9000_PLATF_EXT_PHY
The chip is connected to an external PHY.
DM9000_PLATF_NO_EEPROM
This can be used to signify that the board does not have an
EEPROM, or that the EEPROM should be hidden from the user.
DM9000_PLATF_SIMPLE_PHY
Switch to using the simpler PHY polling method which does not
try and read the MII PHY state regularly. This is only available
when using the internal PHY. See the section on link state polling
for more information.
The config symbol DM9000_FORCE_SIMPLE_PHY_POLL, Kconfig entry
"Force simple NSR based PHY polling" allows this flag to be
forced on at build time.
PHY Link state polling
----------------------
The driver keeps track of the link state and informs the network core
about link (carrier) availablilty. This is managed by several methods
depending on the version of the chip and on which PHY is being used.
For the internal PHY, the original (and currently default) method is
to read the MII state, either when the status changes if we have the
necessary interrupt support in the chip or every two seconds via a
periodic timer.
To reduce the overhead for the internal PHY, there is now the option
of using the DM9000_FORCE_SIMPLE_PHY_POLL config, or DM9000_PLATF_SIMPLE_PHY
platform data option to read the summary information without the
expensive MII accesses. This method is faster, but does not print
as much information.
When using an external PHY, the driver currently has to poll the MII
link status as there is no method for getting an interrupt on link change.
DM9000A / DM9000B
-----------------
These chips are functionally similar to the DM9000E and are supported easily
by the same driver. The features are:
1) Interrupt on internal PHY state change. This means that the periodic
polling of the PHY status may be disabled on these devices when using
the internal PHY.
2) TCP/UDP checksum offloading, which the driver does not currently support.
ethtool
-------
The driver supports the ethtool interface for access to the driver
state information, the PHY state and the EEPROM.

View File

@ -551,8 +551,9 @@ icmp_echo_ignore_broadcasts - BOOLEAN
icmp_ratelimit - INTEGER
Limit the maximal rates for sending ICMP packets whose type matches
icmp_ratemask (see below) to specific targets.
0 to disable any limiting, otherwise the maximal rate in jiffies(1)
Default: 100
0 to disable any limiting,
otherwise the minimal space between responses in milliseconds.
Default: 1000
icmp_ratemask - INTEGER
Mask made of ICMP types for which rates are being limited.
@ -1023,11 +1024,23 @@ max_addresses - INTEGER
autoconfigured addresses.
Default: 16
disable_ipv6 - BOOLEAN
Disable IPv6 operation.
Default: FALSE (enable IPv6 operation)
accept_dad - INTEGER
Whether to accept DAD (Duplicate Address Detection).
0: Disable DAD
1: Enable DAD (default)
2: Enable DAD, and disable IPv6 operation if MAC-based duplicate
link-local address has been found.
icmp/*:
ratelimit - INTEGER
Limit the maximal rates for sending ICMPv6 packets.
0 to disable any limiting, otherwise the maximal rate in jiffies(1)
Default: 100
0 to disable any limiting,
otherwise the minimal space between responses in milliseconds.
Default: 1000
IPv6 Update by:

View File

@ -1,7 +1,7 @@
Linux* Base Driver for the Intel(R) PRO/10GbE Family of Adapters
================================================================
Linux Base Driver for 10 Gigabit Intel(R) Network Connection
=============================================================
November 17, 2004
October 9, 2007
Contents
@ -9,65 +9,122 @@ Contents
- In This Release
- Identifying Your Adapter
- Building and Installation
- Command Line Parameters
- Improving Performance
- Additional Configurations
- Known Issues/Troubleshooting
- Support
In This Release
===============
This file describes the Linux* Base Driver for the Intel(R) PRO/10GbE Family
of Adapters, version 1.0.x.
This file describes the ixgb Linux Base Driver for the 10 Gigabit Intel(R)
Network Connection. This driver includes support for Itanium(R)2-based
systems.
For questions related to hardware requirements, refer to the documentation
supplied with your Intel PRO/10GbE adapter. All hardware requirements listed
apply to use with Linux.
supplied with your 10 Gigabit adapter. All hardware requirements listed apply
to use with Linux.
The following features are available in this kernel:
- Native VLANs
- Channel Bonding (teaming)
- SNMP
Channel Bonding documentation can be found in the Linux kernel source:
/Documentation/networking/bonding.txt
The driver information previously displayed in the /proc filesystem is not
supported in this release. Alternatively, you can use ethtool (version 1.6
or later), lspci, and ifconfig to obtain the same information.
Instructions on updating ethtool can be found in the section "Additional
Configurations" later in this document.
Identifying Your Adapter
========================
To verify your Intel adapter is supported, find the board ID number on the
adapter. Look for a label that has a barcode and a number in the format
A12345-001.
The following Intel network adapters are compatible with the drivers in this
release:
Use the above information and the Adapter & Driver ID Guide at:
Controller Adapter Name Physical Layer
---------- ------------ --------------
82597EX Intel(R) PRO/10GbE LR/SR/CX4 10G Base-LR (1310 nm optical fiber)
Server Adapters 10G Base-SR (850 nm optical fiber)
10G Base-CX4(twin-axial copper cabling)
http://support.intel.com/support/network/adapter/pro100/21397.htm
For more information on how to identify your adapter, go to the Adapter &
Driver ID Guide at:
For the latest Intel network drivers for Linux, go to:
http://support.intel.com/support/network/sb/CS-012904.htm
Building and Installation
=========================
select m for "Intel(R) PRO/10GbE support" located at:
Location:
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Ethernet (10000 Mbit) (NETDEV_10000 [=y])
1. make modules && make modules_install
2. Load the module:
    modprobe ixgb <parameter>=<value>
The insmod command can be used if the full
path to the driver module is specified. For example:
insmod /lib/modules/<KERNEL VERSION>/kernel/drivers/net/ixgb/ixgb.ko
With 2.6 based kernels also make sure that older ixgb drivers are
removed from the kernel, before loading the new module:
rmmod ixgb; modprobe ixgb
3. Assign an IP address to the interface by entering the following, where
x is the interface number:
ifconfig ethx <IP_address>
4. Verify that the interface works. Enter the following, where <IP_address>
is the IP address for another machine on the same subnet as the interface
that is being tested:
ping <IP_address>
http://downloadfinder.intel.com/scripts-df/support_intel.asp
Command Line Parameters
=======================
If the driver is built as a module, the following optional parameters are
used by entering them on the command line with the modprobe or insmod command
using this syntax:
used by entering them on the command line with the modprobe command using
this syntax:
modprobe ixgb [<option>=<VAL1>,<VAL2>,...]
insmod ixgb [<option>=<VAL1>,<VAL2>,...]
For example, with two 10GbE PCI adapters, entering:
For example, with two PRO/10GbE PCI adapters, entering:
insmod ixgb TxDescriptors=80,128
modprobe ixgb TxDescriptors=80,128
loads the ixgb driver with 80 TX resources for the first adapter and 128 TX
resources for the second adapter.
The default value for each parameter is generally the recommended setting,
unless otherwise noted. Also, if the driver is statically built into the
kernel, the driver is loaded with the default values for all the parameters.
Ethtool can be used to change some of the parameters at runtime.
unless otherwise noted.
FlowControl
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
Default: Read from the EEPROM
If EEPROM is not detected, default is 3
If EEPROM is not detected, default is 1
This parameter controls the automatic generation(Tx) and response(Rx) to
Ethernet PAUSE frames.
Ethernet PAUSE frames. There are hardware bugs associated with enabling
Tx flow control so beware.
RxDescriptors
Valid Range: 64-512
@ -83,7 +140,7 @@ Default Value: 512
RxIntDelay
Valid Range: 0-65535 (0=off)
Default Value: 6
Default Value: 72
This value delays the generation of receive interrupts in units of
0.8192 microseconds. Receive interrupt reduction can improve CPU
efficiency if properly tuned for specific network traffic. Increasing
@ -105,22 +162,16 @@ Default Value: 1
A value of '1' indicates that the driver should enable IP checksum
offload for received packets (both UDP and TCP) to the adapter hardware.
XsumTX
Valid Range: 0-1
Default Value: 1
A value of '1' indicates that the driver should enable IP checksum
offload for transmitted packets (both UDP and TCP) to the adapter
hardware.
Improving Performance
=====================
With the Intel PRO/10 GbE adapter, the default Linux configuration will very
likely limit the total available throughput artificially. There is a set of
things that when applied together increase the ability of Linux to transmit
and receive data. The following enhancements were originally acquired from
settings published at http://www.spec.org/web99 for various submitted results
using Linux.
With the 10 Gigabit server adapters, the default Linux configuration will
very likely limit the total available throughput artificially. There is a set
of configuration changes that, when applied together, will increase the ability
of Linux to transmit and receive data. The following enhancements were
originally acquired from settings published at http://www.spec.org/web99/ for
various submitted results using Linux.
NOTE: These changes are only suggestions, and serve as a starting point for
tuning your network performance.
@ -134,17 +185,21 @@ The changes are made in three major ways, listed in order of greatest effect:
NOTE: setpci modifies the adapter's configuration registers to allow it to read
up to 4k bytes at a time (for transmits). However, for some systems the
behavior after modifying this register may be undefined (possibly errors of some
kind). A power-cycle, hard reset or explicitly setting the e6 register back to
22 (setpci -d 8086:1048 e6.b=22) may be required to get back to a stable
configuration.
behavior after modifying this register may be undefined (possibly errors of
some kind). A power-cycle, hard reset or explicitly setting the e6 register
back to 22 (setpci -d 8086:1a48 e6.b=22) may be required to get back to a
stable configuration.
- COPY these lines and paste them into ixgb_perf.sh:
#!/bin/bash
echo "configuring network performance , edit this file to change the interface"
echo "configuring network performance , edit this file to change the interface
or device ID of 10GbE card"
# set mmrbc to 4k reads, modify only Intel 10GbE device IDs
setpci -d 8086:1048 e6.b=2e
# set the MTU (max transmission unit) - it requires your switch and clients to change too!
# replace 1a48 with appropriate 10GbE device's ID installed on the system,
# if needed.
setpci -d 8086:1a48 e6.b=2e
# set the MTU (max transmission unit) - it requires your switch and clients
# to change as well.
# set the txqueuelen
# your ixgb adapter should be loaded as eth1 for this to work, change if needed
ifconfig eth1 mtu 9000 txqueuelen 1000 up
@ -159,24 +214,36 @@ sysctl -p ./sysctl_ixgb.conf
# several network benchmark tests, your mileage may vary
### IPV4 specific settings
net.ipv4.tcp_timestamps = 0 # turns TCP timestamp support off, default 1, reduces CPU use
net.ipv4.tcp_sack = 0 # turn SACK support off, default on
# turn TCP timestamp support off, default 1, reduces CPU use
net.ipv4.tcp_timestamps = 0
# turn SACK support off, default on
# on systems with a VERY fast bus -> memory interface this is the big gainer
net.ipv4.tcp_rmem = 10000000 10000000 10000000 # sets min/default/max TCP read buffer, default 4096 87380 174760
net.ipv4.tcp_wmem = 10000000 10000000 10000000 # sets min/pressure/max TCP write buffer, default 4096 16384 131072
net.ipv4.tcp_mem = 10000000 10000000 10000000 # sets min/pressure/max TCP buffer space, default 31744 32256 32768
net.ipv4.tcp_sack = 0
# set min/default/max TCP read buffer, default 4096 87380 174760
net.ipv4.tcp_rmem = 10000000 10000000 10000000
# set min/pressure/max TCP write buffer, default 4096 16384 131072
net.ipv4.tcp_wmem = 10000000 10000000 10000000
# set min/pressure/max TCP buffer space, default 31744 32256 32768
net.ipv4.tcp_mem = 10000000 10000000 10000000
### CORE settings (mostly for socket and UDP effect)
net.core.rmem_max = 524287 # maximum receive socket buffer size, default 131071
net.core.wmem_max = 524287 # maximum send socket buffer size, default 131071
net.core.rmem_default = 524287 # default receive socket buffer size, default 65535
net.core.wmem_default = 524287 # default send socket buffer size, default 65535
net.core.optmem_max = 524287 # maximum amount of option memory buffers, default 10240
net.core.netdev_max_backlog = 300000 # number of unprocessed input packets before kernel starts dropping them, default 300
# set maximum receive socket buffer size, default 131071
net.core.rmem_max = 524287
# set maximum send socket buffer size, default 131071
net.core.wmem_max = 524287
# set default receive socket buffer size, default 65535
net.core.rmem_default = 524287
# set default send socket buffer size, default 65535
net.core.wmem_default = 524287
# set maximum amount of option memory buffers, default 10240
net.core.optmem_max = 524287
# set number of unprocessed input packets before kernel starts dropping them; default 300
net.core.netdev_max_backlog = 300000
- END sysctl_ixgb.conf
Edit the ixgb_perf.sh script if necessary to change eth1 to whatever interface
your ixgb driver is using.
your ixgb driver is using and/or replace '1a48' with appropriate 10GbE device's
ID installed on the system.
NOTE: Unless these scripts are added to the boot process, these changes will
only last only until the next system reboot.
@ -184,7 +251,6 @@ only last only until the next system reboot.
Resolving Slow UDP Traffic
--------------------------
If your server does not seem to be able to receive UDP traffic as fast as it
can receive TCP traffic, it could be because Linux, by default, does not set
the network stack buffers as large as they need to be to support high UDP
@ -200,13 +266,168 @@ defaults of max=131071 (128k - 1) and default=65535 (64k - 1). These variables
will increase the amount of memory used by the network stack for receives, and
can be increased significantly more if necessary for your application.
Additional Configurations
=========================
Configuring the Driver on Different Distributions
-------------------------------------------------
Configuring a network driver to load properly when the system is started is
distribution dependent. Typically, the configuration process involves adding
an alias line to /etc/modprobe.conf as well as editing other system startup
scripts and/or configuration files. Many popular Linux distributions ship
with tools to make these changes for you. To learn the proper way to
configure a network device for your system, refer to your distribution
documentation. If during this process you are asked for the driver or module
name, the name for the Linux Base Driver for the Intel 10GbE Family of
Adapters is ixgb.
Viewing Link Messages
---------------------
Link messages will not be displayed to the console if the distribution is
restricting system messages. In order to see network driver link messages on
your console, set dmesg to eight by entering the following:
dmesg -n 8
NOTE: This setting is not saved across reboots.
Jumbo Frames
------------
The driver supports Jumbo Frames for all adapters. Jumbo Frames support is
enabled by changing the MTU to a value larger than the default of 1500.
The maximum value for the MTU is 16114. Use the ifconfig command to
increase the MTU size. For example:
ifconfig ethx mtu 9000 up
The maximum MTU setting for Jumbo Frames is 16114. This value coincides
with the maximum Jumbo Frames size of 16128.
Ethtool
-------
The driver utilizes the ethtool interface for driver configuration and
diagnostics, as well as displaying statistical information. Ethtool
version 1.6 or later is required for this functionality.
The latest release of ethtool can be found from
http://sourceforge.net/projects/gkernel
NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support
for a more complete ethtool feature set can be enabled by upgrading
to the latest version.
NAPI
----
NAPI (Rx polling mode) is supported in the ixgb driver. NAPI is enabled
or disabled based on the configuration of the kernel. see CONFIG_IXGB_NAPI
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
Known Issues/Troubleshooting
============================
NOTE: After installing the driver, if your Intel Network Connection is not
working, verify in the "In This Release" section of the readme that you have
installed the correct driver.
Intel(R) PRO/10GbE CX4 Server Adapter Cable Interoperability Issue with
Fujitsu XENPAK Module in SmartBits Chassis
---------------------------------------------------------------------
Excessive CRC errors may be observed if the Intel(R) PRO/10GbE CX4
Server adapter is connected to a Fujitsu XENPAK CX4 module in a SmartBits
chassis using 15 m/24AWG cable assemblies manufactured by Fujitsu or Leoni.
The CRC errors may be received either by the Intel(R) PRO/10GbE CX4
Server adapter or the SmartBits. If this situation occurs using a different
cable assembly may resolve the issue.
CX4 Server Adapter Cable Interoperability Issues with HP Procurve 3400cl
Switch Port
------------------------------------------------------------------------
Excessive CRC errors may be observed if the Intel(R) PRO/10GbE CX4 Server
adapter is connected to an HP Procurve 3400cl switch port using short cables
(1 m or shorter). If this situation occurs, using a longer cable may resolve
the issue.
Excessive CRC errors may be observed using Fujitsu 24AWG cable assemblies that
Are 10 m or longer or where using a Leoni 15 m/24AWG cable assembly. The CRC
errors may be received either by the CX4 Server adapter or at the switch. If
this situation occurs, using a different cable assembly may resolve the issue.
Jumbo Frames System Requirement
-------------------------------
Memory allocation failures have been observed on Linux systems with 64 MB
of RAM or less that are running Jumbo Frames. If you are using Jumbo
Frames, your system may require more than the advertised minimum
requirement of 64 MB of system memory.
Performance Degradation with Jumbo Frames
-----------------------------------------
Degradation in throughput performance may be observed in some Jumbo frames
environments. If this is observed, increasing the application's socket buffer
size and/or increasing the /proc/sys/net/ipv4/tcp_*mem entry values may help.
See the specific application manual and /usr/src/linux*/Documentation/
networking/ip-sysctl.txt for more details.
Allocating Rx Buffers when Using Jumbo Frames
---------------------------------------------
Allocating Rx buffers when using Jumbo Frames on 2.6.x kernels may fail if
the available memory is heavily fragmented. This issue may be seen with PCI-X
adapters or with packet split disabled. This can be reduced or eliminated
by changing the amount of available memory for receive buffer allocation, by
increasing /proc/sys/vm/min_free_kbytes.
Multiple Interfaces on Same Ethernet Broadcast Network
------------------------------------------------------
Due to the default ARP behavior on Linux, it is not possible to have
one system on two IP networks in the same Ethernet broadcast domain
(non-partitioned switch) behave as expected. All Ethernet interfaces
will respond to IP traffic for any IP address assigned to the system.
This results in unbalanced receive traffic.
If you have multiple interfaces in a server, do either of the following:
- Turn on ARP filtering by entering:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
- Install the interfaces in separate broadcast domains - either in
different switches or in a switch partitioned to VLANs.
UDP Stress Test Dropped Packet Issue
--------------------------------------
Under small packets UDP stress test with 10GbE driver, the Linux system
may drop UDP packets due to the fullness of socket buffers. You may want
to change the driver's Flow Control variables to the minimum value for
controlling packet reception.
Tx Hangs Possible Under Stress
------------------------------
Under stress conditions, if TX hangs occur, turning off TSO
"ethtool -K eth0 tso off" may resolve the problem.
Support
=======
For general information and support, go to the Intel support website at:
For general information, go to the Intel support website at:
http://support.intel.com
or the Intel Wired Networking project hosted by Sourceforge at:
http://sourceforge.net/projects/e1000
If an issue is identified with the released source code on the supported
kernel with a supported adapter, email the specific information related to
the issue to linux.nics@intel.com.
kernel with a supported adapter, email the specific information related
to the issue to e1000-devel@lists.sf.net

View File

@ -0,0 +1,67 @@
mac80211_hwsim - software simulator of 802.11 radio(s) for mac80211
Copyright (c) 2008, Jouni Malinen <j@w1.fi>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation.
Introduction
mac80211_hwsim is a Linux kernel module that can be used to simulate
arbitrary number of IEEE 802.11 radios for mac80211. It can be used to
test most of the mac80211 functionality and user space tools (e.g.,
hostapd and wpa_supplicant) in a way that matches very closely with
the normal case of using real WLAN hardware. From the mac80211 view
point, mac80211_hwsim is yet another hardware driver, i.e., no changes
to mac80211 are needed to use this testing tool.
The main goal for mac80211_hwsim is to make it easier for developers
to test their code and work with new features to mac80211, hostapd,
and wpa_supplicant. The simulated radios do not have the limitations
of real hardware, so it is easy to generate an arbitrary test setup
and always reproduce the same setup for future tests. In addition,
since all radio operation is simulated, any channel can be used in
tests regardless of regulatory rules.
mac80211_hwsim kernel module has a parameter 'radios' that can be used
to select how many radios are simulated (default 2). This allows
configuration of both very simply setups (e.g., just a single access
point and a station) or large scale tests (multiple access points with
hundreds of stations).
mac80211_hwsim works by tracking the current channel of each virtual
radio and copying all transmitted frames to all other radios that are
currently enabled and on the same channel as the transmitting
radio. Software encryption in mac80211 is used so that the frames are
actually encrypted over the virtual air interface to allow more
complete testing of encryption.
A global monitoring netdev, hwsim#, is created independent of
mac80211. This interface can be used to monitor all transmitted frames
regardless of channel.
Simple example
This example shows how to use mac80211_hwsim to simulate two radios:
one to act as an access point and the other as a station that
associates with the AP. hostapd and wpa_supplicant are used to take
care of WPA2-PSK authentication. In addition, hostapd is also
processing access point side of association.
Please note that the current Linux kernel does not enable AP mode, so a
simple patch is needed to enable AP mode selection:
http://johannes.sipsolutions.net/patches/kernel/all/LATEST/006-allow-ap-vlan-modes.patch
# Build mac80211_hwsim as part of kernel configuration
# Load the module
modprobe mac80211_hwsim
# Run hostapd (AP) for wlan0
hostapd hostapd.conf
# Run wpa_supplicant (station) for wlan1
wpa_supplicant -Dwext -iwlan1 -c wpa_supplicant.conf

View File

@ -0,0 +1,11 @@
interface=wlan0
driver=nl80211
hw_mode=g
channel=1
ssid=mac80211 test
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_passphrase=12345678

View File

@ -0,0 +1,10 @@
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="mac80211 test"
psk="12345678"
key_mgmt=WPA-PSK
proto=WPA2
pairwise=CCMP
group=CCMP
}

View File

@ -3,19 +3,11 @@
===========================================
Section 1: Base driver requirements for implementing multiqueue support
Section 2: Qdisc support for multiqueue devices
Section 3: Brief howto using PRIO or RR for multiqueue devices
Intro: Kernel support for multiqueue devices
---------------------------------------------------------
Kernel support for multiqueue devices is only an API that is presented to the
netdevice layer for base drivers to implement. This feature is part of the
core networking stack, and all network devices will be running on the
multiqueue-aware stack. If a base driver only has one queue, then these
changes are transparent to that driver.
Kernel support for multiqueue devices is always present.
Section 1: Base driver requirements for implementing multiqueue support
-----------------------------------------------------------------------
@ -32,84 +24,4 @@ netif_{start|stop|wake}_subqueue() functions to manage each queue while the
device is still operational. netdev->queue_lock is still used when the device
comes online or when it's completely shut down (unregister_netdev(), etc.).
Finally, the base driver should indicate that it is a multiqueue device. The
feature flag NETIF_F_MULTI_QUEUE should be added to the netdev->features
bitmap on device initialization. Below is an example from e1000:
#ifdef CONFIG_E1000_MQ
if ( (adapter->hw.mac.type == e1000_82571) ||
(adapter->hw.mac.type == e1000_82572) ||
(adapter->hw.mac.type == e1000_80003es2lan))
netdev->features |= NETIF_F_MULTI_QUEUE;
#endif
Section 2: Qdisc support for multiqueue devices
-----------------------------------------------
Currently two qdiscs support multiqueue devices. A new round-robin qdisc,
sch_rr, and sch_prio. The qdisc is responsible for classifying the skb's to
bands and queues, and will store the queue mapping into skb->queue_mapping.
Use this field in the base driver to determine which queue to send the skb
to.
sch_rr has been added for hardware that doesn't want scheduling policies from
software, so it's a straight round-robin qdisc. It uses the same syntax and
classification priomap that sch_prio uses, so it should be intuitive to
configure for people who've used sch_prio.
In order to utilitize the multiqueue features of the qdiscs, the network
device layer needs to enable multiple queue support. This can be done by
selecting NETDEVICES_MULTIQUEUE under Drivers.
The PRIO qdisc naturally plugs into a multiqueue device. If
NETDEVICES_MULTIQUEUE is selected, then on qdisc load, the number of
bands requested is compared to the number of queues on the hardware. If they
are equal, it sets a one-to-one mapping up between the queues and bands. If
they're not equal, it will not load the qdisc. This is the same behavior
for RR. Once the association is made, any skb that is classified will have
skb->queue_mapping set, which will allow the driver to properly queue skb's
to multiple queues.
Section 3: Brief howto using PRIO and RR for multiqueue devices
---------------------------------------------------------------
The userspace command 'tc,' part of the iproute2 package, is used to configure
qdiscs. To add the PRIO qdisc to your network device, assuming the device is
called eth0, run the following command:
# tc qdisc add dev eth0 root handle 1: prio bands 4 multiqueue
This will create 4 bands, 0 being highest priority, and associate those bands
to the queues on your NIC. Assuming eth0 has 4 Tx queues, the band mapping
would look like:
band 0 => queue 0
band 1 => queue 1
band 2 => queue 2
band 3 => queue 3
Traffic will begin flowing through each queue if your TOS values are assigning
traffic across the various bands. For example, ssh traffic will always try to
go out band 0 based on TOS -> Linux priority conversion (realtime traffic),
so it will be sent out queue 0. ICMP traffic (pings) fall into the "normal"
traffic classification, which is band 1. Therefore pings will be send out
queue 1 on the NIC.
Note the use of the multiqueue keyword. This is only in versions of iproute2
that support multiqueue networking devices; if this is omitted when loading
a qdisc onto a multiqueue device, the qdisc will load and operate the same
if it were loaded onto a single-queue device (i.e. - sends all traffic to
queue 0).
Another alternative to multiqueue band allocation can be done by using the
multiqueue option and specify 0 bands. If this is the case, the qdisc will
allocate the number of bands to equal the number of queues that the device
reports, and bring the qdisc online.
The behavior of tc filters remains the same, where it will override TOS priority
classification.
Author: Peter P. Waskiewicz Jr. <peter.p.waskiewicz.jr@intel.com>

View File

@ -52,13 +52,10 @@ d. MSI/MSI-X. Can be enabled on platforms which support this feature
(IA64, Xeon) resulting in noticeable performance improvement(upto 7%
on certain platforms).
e. NAPI. Compile-time option(CONFIG_S2IO_NAPI) for better Rx interrupt
moderation.
f. Statistics. Comprehensive MAC-level and software statistics displayed
e. Statistics. Comprehensive MAC-level and software statistics displayed
using "ethtool -S" option.
g. Multi-FIFO/Ring. Supports up to 8 transmit queues and receive rings,
f. Multi-FIFO/Ring. Supports up to 8 transmit queues and receive rings,
with multiple steering options.
4. Command line parameters

View File

@ -41,12 +41,24 @@ Table of Contents
VI - System-on-a-chip devices and nodes
1) Defining child nodes of an SOC
2) Representing devices without a current OF specification
a) PHY nodes
b) Interrupt controllers
c) CFI or JEDEC memory-mapped NOR flash
d) 4xx/Axon EMAC ethernet nodes
e) Xilinx IP cores
f) USB EHCI controllers
a) MDIO IO device
b) Gianfar-compatible ethernet nodes
c) PHY nodes
d) Interrupt controllers
e) I2C
f) Freescale SOC USB controllers
g) Freescale SOC SEC Security Engines
h) Board Control and Status (BCSR)
i) Freescale QUICC Engine module (QE)
j) CFI or JEDEC memory-mapped NOR flash
k) Global Utilities Block
l) Freescale Communications Processor Module
m) Chipselect/Local Bus
n) 4xx/Axon EMAC ethernet nodes
o) Xilinx IP cores
p) Freescale Synchronous Serial Interface
q) USB EHCI controllers
r) MDIO on GPIOs
VII - Marvell Discovery mv64[345]6x System Controller chips
1) The /system-controller node
@ -1815,6 +1827,60 @@ platforms are moved over to use the flattened-device-tree model.
big-endian;
};
r) Freescale Display Interface Unit
The Freescale DIU is a LCD controller, with proper hardware, it can also
drive DVI monitors.
Required properties:
- compatible : should be "fsl-diu".
- reg : should contain at least address and length of the DIU register
set.
- Interrupts : one DIU interrupt should be describe here.
Example (MPC8610HPCD)
display@2c000 {
compatible = "fsl,diu";
reg = <0x2c000 100>;
interrupts = <72 2>;
interrupt-parent = <&mpic>;
};
s) Freescale on board FPGA
This is the memory-mapped registers for on board FPGA.
Required properities:
- compatible : should be "fsl,fpga-pixis".
- reg : should contain the address and the lenght of the FPPGA register
set.
Example (MPC8610HPCD)
board-control@e8000000 {
compatible = "fsl,fpga-pixis";
reg = <0xe8000000 32>;
};
r) MDIO on GPIOs
Currently defined compatibles:
- virtual,gpio-mdio
MDC and MDIO lines connected to GPIO controllers are listed in the
gpios property as described in section VIII.1 in the following order:
MDC, MDIO.
Example:
mdio {
compatible = "virtual,mdio-gpio";
#address-cells = <1>;
#size-cells = <0>;
gpios = <&qe_pio_a 11
&qe_pio_c 6>;
};
VII - Marvell Discovery mv64[345]6x System Controller chips
===========================================================

View File

@ -1,89 +1,528 @@
rfkill - RF switch subsystem support
====================================
1 Implementation details
2 Driver support
3 Userspace support
1 Introduction
2 Implementation details
3 Kernel driver guidelines
3.1 wireless device drivers
3.2 platform/switch drivers
3.3 input device drivers
4 Kernel API
5 Userspace support
1. Introduction:
The rfkill switch subsystem exists to add a generic interface to circuitry that
can enable or disable the signal output of a wireless *transmitter* of any
type. By far, the most common use is to disable radio-frequency transmitters.
Note that disabling the signal output means that the the transmitter is to be
made to not emit any energy when "blocked". rfkill is not about blocking data
transmissions, it is about blocking energy emission.
The rfkill subsystem offers support for keys and switches often found on
laptops to enable wireless devices like WiFi and Bluetooth, so that these keys
and switches actually perform an action in all wireless devices of a given type
attached to the system.
The buttons to enable and disable the wireless transmitters are important in
situations where the user is for example using his laptop on a location where
radio-frequency transmitters _must_ be disabled (e.g. airplanes).
Because of this requirement, userspace support for the keys should not be made
mandatory. Because userspace might want to perform some additional smarter
tasks when the key is pressed, rfkill provides userspace the possibility to
take over the task to handle the key events.
===============================================================================
1: Implementation details
2: Implementation details
The rfkill switch subsystem offers support for keys often found on laptops
to enable wireless devices like WiFi and Bluetooth.
The rfkill subsystem is composed of various components: the rfkill class, the
rfkill-input module (an input layer handler), and some specific input layer
events.
This is done by providing the user 3 possibilities:
1 - The rfkill system handles all events; userspace is not aware of events.
2 - The rfkill system handles all events; userspace is informed about the events.
3 - The rfkill system does not handle events; userspace handles all events.
The rfkill class provides kernel drivers with an interface that allows them to
know when they should enable or disable a wireless network device transmitter.
This is enabled by the CONFIG_RFKILL Kconfig option.
The buttons to enable and disable the wireless radios are important in
situations where the user is for example using his laptop on a location where
wireless radios _must_ be disabled (e.g. airplanes).
Because of this requirement, userspace support for the keys should not be
made mandatory. Because userspace might want to perform some additional smarter
tasks when the key is pressed, rfkill still provides userspace the possibility
to take over the task to handle the key events.
The rfkill class support makes sure userspace will be notified of all state
changes on rfkill devices through uevents. It provides a notification chain
for interested parties in the kernel to also get notified of rfkill state
changes in other drivers. It creates several sysfs entries which can be used
by userspace. See section "Userspace support".
The system inside the kernel has been split into 2 separate sections:
1 - RFKILL
2 - RFKILL_INPUT
The rfkill-input module provides the kernel with the ability to implement a
basic response when the user presses a key or button (or toggles a switch)
related to rfkill functionality. It is an in-kernel implementation of default
policy of reacting to rfkill-related input events and neither mandatory nor
required for wireless drivers to operate. It is enabled by the
CONFIG_RFKILL_INPUT Kconfig option.
The first option enables rfkill support and will make sure userspace will
be notified of any events through the input device. It also creates several
sysfs entries which can be used by userspace. See section "Userspace support".
rfkill-input is a rfkill-related events input layer handler. This handler will
listen to all rfkill key events and will change the rfkill state of the
wireless devices accordingly. With this option enabled userspace could either
do nothing or simply perform monitoring tasks.
The second option provides an rfkill input handler. This handler will
listen to all rfkill key events and will toggle the radio accordingly.
With this option enabled userspace could either do nothing or simply
perform monitoring tasks.
The rfkill-input module also provides EPO (emergency power-off) functionality
for all wireless transmitters. This function cannot be overridden, and it is
always active. rfkill EPO is related to *_RFKILL_ALL input layer events.
Important terms for the rfkill subsystem:
In order to avoid confusion, we avoid the term "switch" in rfkill when it is
referring to an electronic control circuit that enables or disables a
transmitter. We reserve it for the physical device a human manipulates
(which is an input device, by the way):
rfkill switch:
A physical device a human manipulates. Its state can be perceived by
the kernel either directly (through a GPIO pin, ACPI GPE) or by its
effect on a rfkill line of a wireless device.
rfkill controller:
A hardware circuit that controls the state of a rfkill line, which a
kernel driver can interact with *to modify* that state (i.e. it has
either write-only or read/write access).
rfkill line:
An input channel (hardware or software) of a wireless device, which
causes a wireless transmitter to stop emitting energy (BLOCK) when it
is active. Point of view is extremely important here: rfkill lines are
always seen from the PoV of a wireless device (and its driver).
soft rfkill line/software rfkill line:
A rfkill line the wireless device driver can directly change the state
of. Related to rfkill_state RFKILL_STATE_SOFT_BLOCKED.
hard rfkill line/hardware rfkill line:
A rfkill line that works fully in hardware or firmware, and that cannot
be overridden by the kernel driver. The hardware device or the
firmware just exports its status to the driver, but it is read-only.
Related to rfkill_state RFKILL_STATE_HARD_BLOCKED.
The enum rfkill_state describes the rfkill state of a transmitter:
When a rfkill line or rfkill controller is in the RFKILL_STATE_UNBLOCKED state,
the wireless transmitter (radio TX circuit for example) is *enabled*. When the
it is in the RFKILL_STATE_SOFT_BLOCKED or RFKILL_STATE_HARD_BLOCKED, the
wireless transmitter is to be *blocked* from operating.
RFKILL_STATE_SOFT_BLOCKED indicates that a call to toggle_radio() can change
that state. RFKILL_STATE_HARD_BLOCKED indicates that a call to toggle_radio()
will not be able to change the state and will return with a suitable error if
attempts are made to set the state to RFKILL_STATE_UNBLOCKED.
RFKILL_STATE_HARD_BLOCKED is used by drivers to signal that the device is
locked in the BLOCKED state by a hardwire rfkill line (typically an input pin
that, when active, forces the transmitter to be disabled) which the driver
CANNOT override.
Full rfkill functionality requires two different subsystems to cooperate: the
input layer and the rfkill class. The input layer issues *commands* to the
entire system requesting that devices registered to the rfkill class change
state. The way this interaction happens is not complex, but it is not obvious
either:
Kernel Input layer:
* Generates KEY_WWAN, KEY_WLAN, KEY_BLUETOOTH, SW_RFKILL_ALL, and
other such events when the user presses certain keys, buttons, or
toggles certain physical switches.
THE INPUT LAYER IS NEVER USED TO PROPAGATE STATUS, NOTIFICATIONS OR THE
KIND OF STUFF AN ON-SCREEN-DISPLAY APPLICATION WOULD REPORT. It is
used to issue *commands* for the system to change behaviour, and these
commands may or may not be carried out by some kernel driver or
userspace application. It follows that doing user feedback based only
on input events is broken, as there is no guarantee that an input event
will be acted upon.
Most wireless communication device drivers implementing rfkill
functionality MUST NOT generate these events, and have no reason to
register themselves with the input layer. Doing otherwise is a common
misconception. There is an API to propagate rfkill status change
information, and it is NOT the input layer.
rfkill class:
* Calls a hook in a driver to effectively change the wireless
transmitter state;
* Keeps track of the wireless transmitter state (with help from
the driver);
* Generates userspace notifications (uevents) and a call to a
notification chain (kernel) when there is a wireless transmitter
state change;
* Connects a wireless communications driver with the common rfkill
control system, which, for example, allows actions such as
"switch all bluetooth devices offline" to be carried out by
userspace or by rfkill-input.
THE RFKILL CLASS NEVER ISSUES INPUT EVENTS. THE RFKILL CLASS DOES
NOT LISTEN TO INPUT EVENTS. NO DRIVER USING THE RFKILL CLASS SHALL
EVER LISTEN TO, OR ACT ON RFKILL INPUT EVENTS. Doing otherwise is
a layering violation.
Most wireless data communication drivers in the kernel have just to
implement the rfkill class API to work properly. Interfacing to the
input layer is not often required (and is very often a *bug*) on
wireless drivers.
Platform drivers often have to attach to the input layer to *issue*
(but never to listen to) rfkill events for rfkill switches, and also to
the rfkill class to export a control interface for the platform rfkill
controllers to the rfkill subsystem. This does NOT mean the rfkill
switch is attached to a rfkill class (doing so is almost always wrong).
It just means the same kernel module is the driver for different
devices (rfkill switches and rfkill controllers).
Userspace input handlers (uevents) or kernel input handlers (rfkill-input):
* Implements the policy of what should happen when one of the input
layer events related to rfkill operation is received.
* Uses the sysfs interface (userspace) or private rfkill API calls
to tell the devices registered with the rfkill class to change
their state (i.e. translates the input layer event into real
action).
* rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0
(power off all transmitters) in a special way: it ignores any
overrides and local state cache and forces all transmitters to the
RFKILL_STATE_SOFT_BLOCKED state (including those which are already
supposed to be BLOCKED). Note that the opposite event (power on all
transmitters) is handled normally.
Userspace uevent handler or kernel platform-specific drivers hooked to the
rfkill notifier chain:
* Taps into the rfkill notifier chain or to KOBJ_CHANGE uevents,
in order to know when a device that is registered with the rfkill
class changes state;
* Issues feedback notifications to the user;
* In the rare platforms where this is required, synthesizes an input
event to command all *OTHER* rfkill devices to also change their
statues when a specific rfkill device changes state.
===============================================================================
3: Kernel driver guidelines
Remember: point-of-view is everything for a driver that connects to the rfkill
subsystem. All the details below must be measured/perceived from the point of
view of the specific driver being modified.
The first thing one needs to know is whether his driver should be talking to
the rfkill class or to the input layer. In rare cases (platform drivers), it
could happen that you need to do both, as platform drivers often handle a
variety of devices in the same driver.
Do not mistake input devices for rfkill controllers. The only type of "rfkill
switch" device that is to be registered with the rfkill class are those
directly controlling the circuits that cause a wireless transmitter to stop
working (or the software equivalent of them), i.e. what we call a rfkill
controller. Every other kind of "rfkill switch" is just an input device and
MUST NOT be registered with the rfkill class.
A driver should register a device with the rfkill class when ALL of the
following conditions are met (they define a rfkill controller):
1. The device is/controls a data communications wireless transmitter;
2. The kernel can interact with the hardware/firmware to CHANGE the wireless
transmitter state (block/unblock TX operation);
3. The transmitter can be made to not emit any energy when "blocked":
rfkill is not about blocking data transmissions, it is about blocking
energy emission;
A driver should register a device with the input subsystem to issue
rfkill-related events (KEY_WLAN, KEY_BLUETOOTH, KEY_WWAN, KEY_WIMAX,
SW_RFKILL_ALL, etc) when ALL of the folowing conditions are met:
1. It is directly related to some physical device the user interacts with, to
command the O.S./firmware/hardware to enable/disable a data communications
wireless transmitter.
Examples of the physical device are: buttons, keys and switches the user
will press/touch/slide/switch to enable or disable the wireless
communication device.
2. It is NOT slaved to another device, i.e. there is no other device that
issues rfkill-related input events in preference to this one.
Please refer to the corner cases and examples section for more details.
When in doubt, do not issue input events. For drivers that should generate
input events in some platforms, but not in others (e.g. b43), the best solution
is to NEVER generate input events in the first place. That work should be
deferred to a platform-specific kernel module (which will know when to generate
events through the rfkill notifier chain) or to userspace. This avoids the
usual maintenance problems with DMI whitelisting.
Corner cases and examples:
====================================
2: Driver support
To build a driver with rfkill subsystem support, the driver should
depend on the Kconfig symbol RFKILL; it should _not_ depend on
RKFILL_INPUT.
1. If the device is an input device that, because of hardware or firmware,
causes wireless transmitters to be blocked regardless of the kernel's will, it
is still just an input device, and NOT to be registered with the rfkill class.
Unless key events trigger an interrupt to which the driver listens, polling
will be required to determine the key state changes. For this the input
layer providers the input-polldev handler.
2. If the wireless transmitter switch control is read-only, it is an input
device and not to be registered with the rfkill class (and maybe not to be made
an input layer event source either, see below).
A driver should implement a few steps to correctly make use of the
rfkill subsystem. First for non-polling drivers:
3. If there is some other device driver *closer* to the actual hardware the
user interacted with (the button/switch/key) to issue an input event, THAT is
the device driver that should be issuing input events.
- rfkill_allocate()
- input_allocate_device()
- rfkill_register()
- input_register_device()
E.g:
[RFKILL slider switch] -- [GPIO hardware] -- [WLAN card rf-kill input]
(platform driver) (wireless card driver)
For polling drivers:
The user is closer to the RFKILL slide switch plaform driver, so the driver
which must issue input events is the platform driver looking at the GPIO
hardware, and NEVER the wireless card driver (which is just a slave). It is
very likely that there are other leaves than just the WLAN card rf-kill input
(e.g. a bluetooth card, etc)...
- rfkill_allocate()
- input_allocate_polled_device()
- rfkill_register()
- input_register_polled_device()
On the other hand, some embedded devices do this:
When a key event has been detected, the correct event should be
sent over the input device which has been registered by the driver.
[RFKILL slider switch] -- [WLAN card rf-kill input]
(wireless card driver)
In this situation, the wireless card driver *could* register itself as an input
device and issue rf-kill related input events... but in order to AVOID the need
for DMI whitelisting, the wireless card driver does NOT do it. Userspace (HAL)
or a platform driver (that exists only on these embedded devices) will do the
dirty job of issuing the input events.
COMMON MISTAKES in kernel drivers, related to rfkill:
====================================
3: Userspace support
For each key an input device will be created which will send out the correct
key event when the rfkill key has been pressed.
1. NEVER confuse input device keys and buttons with input device switches.
1a. Switches are always set or reset. They report the current state
(on position or off position).
1b. Keys and buttons are either in the pressed or not-pressed state, and
that's it. A "button" that latches down when you press it, and
unlatches when you press it again is in fact a switch as far as input
devices go.
Add the SW_* events you need for switches, do NOT try to emulate a button using
KEY_* events just because there is no such SW_* event yet. Do NOT try to use,
for example, KEY_BLUETOOTH when you should be using SW_BLUETOOTH instead.
2. Input device switches (sources of EV_SW events) DO store their current state
(so you *must* initialize it by issuing a gratuitous input layer event on
driver start-up and also when resuming from sleep), and that state CAN be
queried from userspace through IOCTLs. There is no sysfs interface for this,
but that doesn't mean you should break things trying to hook it to the rfkill
class to get a sysfs interface :-)
3. Do not issue *_RFKILL_ALL events by default, unless you are sure it is the
correct event for your switch/button. These events are emergency power-off
events when they are trying to turn the transmitters off. An example of an
input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill
switch in a laptop which is NOT a hotkey, but a real switch that kills radios
in hardware, even if the O.S. has gone to lunch. An example of an input device
which SHOULD NOT generate *_RFKILL_ALL events by default, is any sort of hot
key that does nothing by itself, as well as any hot key that is type-specific
(e.g. the one for WLAN).
3.1 Guidelines for wireless device drivers
------------------------------------------
1. Each independent transmitter in a wireless device (usually there is only one
transmitter per device) should have a SINGLE rfkill class attached to it.
2. If the device does not have any sort of hardware assistance to allow the
driver to rfkill the device, the driver should emulate it by taking all actions
required to silence the transmitter.
3. If it is impossible to silence the transmitter (i.e. it still emits energy,
even if it is just in brief pulses, when there is no data to transmit and there
is no hardware support to turn it off) do NOT lie to the users. Do not attach
it to a rfkill class. The rfkill subsystem does not deal with data
transmission, it deals with energy emission. If the transmitter is emitting
energy, it is not blocked in rfkill terms.
4. It doesn't matter if the device has multiple rfkill input lines affecting
the same transmitter, their combined state is to be exported as a single state
per transmitter (see rule 1).
This rule exists because users of the rfkill subsystem expect to get (and set,
when possible) the overall transmitter rfkill state, not of a particular rfkill
line.
Example of a WLAN wireless driver connected to the rfkill subsystem:
--------------------------------------------------------------------
A certain WLAN card has one input pin that causes it to block the transmitter
and makes the status of that input pin available (only for reading!) to the
kernel driver. This is a hard rfkill input line (it cannot be overridden by
the kernel driver).
The card also has one PCI register that, if manipulated by the driver, causes
it to block the transmitter. This is a soft rfkill input line.
It has also a thermal protection circuitry that shuts down its transmitter if
the card overheats, and makes the status of that protection available (only for
reading!) to the kernel driver. This is also a hard rfkill input line.
If either one of these rfkill lines are active, the transmitter is blocked by
the hardware and forced offline.
The driver should allocate and attach to its struct device *ONE* instance of
the rfkill class (there is only one transmitter).
It can implement the get_state() hook, and return RFKILL_STATE_HARD_BLOCKED if
either one of its two hard rfkill input lines are active. If the two hard
rfkill lines are inactive, it must return RFKILL_STATE_SOFT_BLOCKED if its soft
rfkill input line is active. Only if none of the rfkill input lines are
active, will it return RFKILL_STATE_UNBLOCKED.
If it doesn't implement the get_state() hook, it must make sure that its calls
to rfkill_force_state() are enough to keep the status always up-to-date, and it
must do a rfkill_force_state() on resume from sleep.
Every time the driver gets a notification from the card that one of its rfkill
lines changed state (polling might be needed on badly designed cards that don't
generate interrupts for such events), it recomputes the rfkill state as per
above, and calls rfkill_force_state() to update it.
The driver should implement the toggle_radio() hook, that:
1. Returns an error if one of the hardware rfkill lines are active, and the
caller asked for RFKILL_STATE_UNBLOCKED.
2. Activates the soft rfkill line if the caller asked for state
RFKILL_STATE_SOFT_BLOCKED. It should do this even if one of the hard rfkill
lines are active, effectively double-blocking the transmitter.
3. Deactivates the soft rfkill line if none of the hardware rfkill lines are
active and the caller asked for RFKILL_STATE_UNBLOCKED.
===============================================================================
4: Kernel API
To build a driver with rfkill subsystem support, the driver should depend on
(or select) the Kconfig symbol RFKILL; it should _not_ depend on RKFILL_INPUT.
The hardware the driver talks to may be write-only (where the current state
of the hardware is unknown), or read-write (where the hardware can be queried
about its current state).
The rfkill class will call the get_state hook of a device every time it needs
to know the *real* current state of the hardware. This can happen often.
Some hardware provides events when its status changes. In these cases, it is
best for the driver to not provide a get_state hook, and instead register the
rfkill class *already* with the correct status, and keep it updated using
rfkill_force_state() when it gets an event from the hardware.
There is no provision for a statically-allocated rfkill struct. You must
use rfkill_allocate() to allocate one.
You should:
- rfkill_allocate()
- modify rfkill fields (flags, name)
- modify state to the current hardware state (THIS IS THE ONLY TIME
YOU CAN ACCESS state DIRECTLY)
- rfkill_register()
The only way to set a device to the RFKILL_STATE_HARD_BLOCKED state is through
a suitable return of get_state() or through rfkill_force_state().
When a device is in the RFKILL_STATE_HARD_BLOCKED state, the only way to switch
it to a different state is through a suitable return of get_state() or through
rfkill_force_state().
If toggle_radio() is called to set a device to state RFKILL_STATE_SOFT_BLOCKED
when that device is already at the RFKILL_STATE_HARD_BLOCKED state, it should
not return an error. Instead, it should try to double-block the transmitter,
so that its state will change from RFKILL_STATE_HARD_BLOCKED to
RFKILL_STATE_SOFT_BLOCKED should the hardware blocking cease.
Please refer to the source for more documentation.
===============================================================================
5: Userspace support
rfkill devices issue uevents (with an action of "change"), with the following
environment variables set:
RFKILL_NAME
RFKILL_STATE
RFKILL_TYPE
The ABI for these variables is defined by the sysfs attributes. It is best
to take a quick look at the source to make sure of the possible values.
It is expected that HAL will trap those, and bridge them to DBUS, etc. These
events CAN and SHOULD be used to give feedback to the user about the rfkill
status of the system.
Input devices may issue events that are related to rfkill. These are the
various KEY_* events and SW_* events supported by rfkill-input.c.
******IMPORTANT******
When rfkill-input is ACTIVE, userspace is NOT TO CHANGE THE STATE OF AN RFKILL
SWITCH IN RESPONSE TO AN INPUT EVENT also handled by rfkill-input, unless it
has set to true the user_claim attribute for that particular switch. This rule
is *absolute*; do NOT violate it.
******IMPORTANT******
Userspace must not assume it is the only source of control for rfkill switches.
Their state CAN and WILL change due to firmware actions, direct user actions,
and the rfkill-input EPO override for *_RFKILL_ALL.
When rfkill-input is not active, userspace must initiate a rfkill status
change by writing to the "state" attribute in order for anything to happen.
Take particular care to implement EV_SW SW_RFKILL_ALL properly. When that
switch is set to OFF, *every* rfkill device *MUST* be immediately put into the
RFKILL_STATE_SOFT_BLOCKED state, no questions asked.
The following sysfs entries will be created:
name: Name assigned by driver to this key (interface or driver name).
type: Name of the key type ("wlan", "bluetooth", etc).
state: Current state of the key. 1: On, 0: Off.
state: Current state of the transmitter
0: RFKILL_STATE_SOFT_BLOCKED
transmitter is forced off, but one can override it
by a write to the state attribute;
1: RFKILL_STATE_UNBLOCKED
transmiter is NOT forced off, and may operate if
all other conditions for such operation are met
(such as interface is up and configured, etc);
2: RFKILL_STATE_HARD_BLOCKED
transmitter is forced off by something outside of
the driver's control. One cannot set a device to
this state through writes to the state attribute;
claim: 1: Userspace handles events, 0: Kernel handles events
Both the "state" and "claim" entries are also writable. For the "state" entry
this means that when 1 or 0 is written all radios, not yet in the requested
state, will be will be toggled accordingly.
this means that when 1 or 0 is written, the device rfkill state (if not yet in
the requested state), will be will be toggled accordingly.
For the "claim" entry writing 1 to it means that the kernel no longer handles
key events even though RFKILL_INPUT input was enabled. When "claim" has been
set to 0, userspace should make sure that it listens for the input events or
check the sysfs "state" entry regularly to correctly perform the required
tasks when the rkfill key is pressed.
check the sysfs "state" entry regularly to correctly perform the required tasks
when the rkfill key is pressed.
A note about input devices and EV_SW events:
In order to know the current state of an input device switch (like
SW_RFKILL_ALL), you will need to use an IOCTL. That information is not
available through sysfs in a generic way at this time, and it is not available
through the rfkill class AT ALL.

View File

@ -2189,6 +2189,8 @@ P: Jesse Brandeburg
M: jesse.brandeburg@intel.com
P: Bruce Allan
M: bruce.w.allan@intel.com
P: PJ Waskiewicz
M: peter.p.waskiewicz.jr@intel.com
P: John Ronciak
M: john.ronciak@intel.com
L: e1000-devel@lists.sourceforge.net
@ -2725,12 +2727,10 @@ L: libertas-dev@lists.infradead.org
S: Maintained
MARVELL MV643XX ETHERNET DRIVER
P: Dale Farnsworth
M: dale@farnsworth.org
P: Manish Lachwani
M: mlachwani@mvista.com
P: Lennert Buytenhek
M: buytenh@marvell.com
L: netdev@vger.kernel.org
S: Odd Fixes for 2.4; Maintained for 2.6.
S: Supported
MATROX FRAMEBUFFER DRIVER
P: Petr Vandrovec
@ -3274,14 +3274,6 @@ L: linux-kernel@vger.kernel.org
T: git git.infradead.org/battery-2.6.git
S: Maintained
POWERPC 4xx EMAC DRIVER
P: Eugene Surovegin
M: ebs@ebshome.net
W: http://kernel.ebshome.net/emac/
L: linuxppc-dev@ozlabs.org
L: netdev@vger.kernel.org
S: Maintained
PNP SUPPORT
P: Adam Belay
M: ambx1@neo.rr.com

View File

@ -323,10 +323,15 @@ static struct platform_device smc91x_device = {
static struct resource dm9000_resources[] = {
[0] = {
.start = 0x203FB800,
.end = 0x203FB800 + 8,
.end = 0x203FB800 + 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 0x203FB800 + 4,
.end = 0x203FB800 + 5,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_PF9,
.end = IRQ_PF9,
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),

View File

@ -65,10 +65,15 @@ static struct platform_device rtc_device = {
static struct resource dm9000_resources[] = {
[0] = {
.start = 0x20300000,
.end = 0x20300000 + 8,
.end = 0x20300000 + 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 0x20300000 + 4,
.end = 0x20300000 + 5,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_PF10,
.end = IRQ_PF10,
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),

View File

@ -166,10 +166,15 @@ static struct platform_device smc91x_device = {
static struct resource dm9000_resources[] = {
[0] = {
.start = 0x203FB800,
.end = 0x203FB800 + 8,
.end = 0x203FB800 + 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 0x203FB800 + 4,
.end = 0x203FB800 + 5,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_PF9,
.end = IRQ_PF9,
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),

View File

@ -294,7 +294,7 @@ config ATM_HORIZON_DEBUG
config ATM_IA
tristate "Interphase ATM PCI x575/x525/x531"
depends on PCI && !64BIT
depends on PCI
---help---
This is a driver for the Interphase (i)ChipSAR adapter cards
which include a variety of variants in term of the size of the
@ -325,81 +325,22 @@ config ATM_IA_DEBUG
speed of the driver, and the size of your syslog files! When
inactive, they will have only a modest impact on performance.
config ATM_FORE200E_MAYBE
config ATM_FORE200E
tristate "FORE Systems 200E-series"
depends on PCI || SBUS
depends on (PCI || SBUS)
select FW_LOADER
---help---
This is a driver for the FORE Systems 200E-series ATM adapter
cards. It simultaneously supports PCA-200E and SBA-200E models
on PCI and SBUS hosts. Say Y (or M to compile as a module
named fore_200e) here if you have one of these ATM adapters.
Note that the driver will actually be compiled only if you
additionally enable the support for PCA-200E and/or SBA-200E
cards.
See the file <file:Documentation/networking/fore200e.txt> for
further details.
config ATM_FORE200E_PCA
bool "PCA-200E support"
depends on ATM_FORE200E_MAYBE && PCI
help
Say Y here if you want your PCA-200E cards to be probed.
config ATM_FORE200E_PCA_DEFAULT_FW
bool "Use default PCA-200E firmware (normally enabled)"
depends on ATM_FORE200E_PCA
help
Use the default PCA-200E firmware data shipped with the driver.
Normal users do not have to deal with the firmware stuff, so
they should say Y here.
config ATM_FORE200E_PCA_FW
string "Pathname of user-supplied binary firmware"
depends on ATM_FORE200E_PCA && !ATM_FORE200E_PCA_DEFAULT_FW
default ""
help
This defines the pathname of an alternative PCA-200E binary
firmware image supplied by the user. This pathname may be
absolute or relative to the drivers/atm directory.
The driver comes with an adequate firmware image, so normal users do
not have to supply an alternative one. They just say Y to "Use
default PCA-200E firmware" instead.
config ATM_FORE200E_SBA
bool "SBA-200E support"
depends on ATM_FORE200E_MAYBE && SBUS
help
Say Y here if you want your SBA-200E cards to be probed.
config ATM_FORE200E_SBA_DEFAULT_FW
bool "Use default SBA-200E firmware (normally enabled)"
depends on ATM_FORE200E_SBA
help
Use the default SBA-200E firmware data shipped with the driver.
Normal users do not have to deal with the firmware stuff, so
they should say Y here.
config ATM_FORE200E_SBA_FW
string "Pathname of user-supplied binary firmware"
depends on ATM_FORE200E_SBA && !ATM_FORE200E_SBA_DEFAULT_FW
default ""
help
This defines the pathname of an alternative SBA-200E binary
firmware image supplied by the user. This pathname may be
absolute or relative to the drivers/atm directory.
The driver comes with an adequate firmware image, so normal users do
not have to supply an alternative one. They just say Y to "Use
default SBA-200E firmware", above.
config ATM_FORE200E_USE_TASKLET
bool "Defer interrupt work to a tasklet"
depends on (PCI || SBUS) && (ATM_FORE200E_PCA || ATM_FORE200E_SBA)
depends on ATM_FORE200E
default n
help
This defers work to be done by the interrupt handler to a
@ -408,7 +349,7 @@ config ATM_FORE200E_USE_TASKLET
config ATM_FORE200E_TX_RETRY
int "Maximum number of tx retries"
depends on (PCI || SBUS) && (ATM_FORE200E_PCA || ATM_FORE200E_SBA)
depends on ATM_FORE200E
default "16"
---help---
Specifies the number of times the driver attempts to transmit
@ -425,7 +366,7 @@ config ATM_FORE200E_TX_RETRY
config ATM_FORE200E_DEBUG
int "Debugging level (0-3)"
depends on (PCI || SBUS) && (ATM_FORE200E_PCA || ATM_FORE200E_SBA)
depends on ATM_FORE200E
default "0"
help
Specifies the level of debugging messages issued by the driver.
@ -436,12 +377,6 @@ config ATM_FORE200E_DEBUG
the performances of the driver, and the size of your syslog files!
Keep the debugging level to 0 during normal operations.
config ATM_FORE200E
tristate
depends on (PCI || SBUS) && (ATM_FORE200E_PCA || ATM_FORE200E_SBA)
default m if ATM_FORE200E_MAYBE!=y
default y if ATM_FORE200E_MAYBE=y
config ATM_HE
tristate "ForeRunner HE Series"
depends on PCI

View File

@ -3,14 +3,6 @@
#
fore_200e-objs := fore200e.o
hostprogs-y := fore200e_mkfirm
# Files generated that shall be removed upon make clean
clean-files := pca200e.bin pca200e.bin1 pca200e.bin2 pca200e_ecd.bin \
pca200e_ecd.bin1 pca200e_ecd.bin2 sba200e_ecd.bin sba200e_ecd.bin1 \
sba200e_ecd.bin2
# Firmware generated that shall be removed upon make clean
clean-files += fore200e_pca_fw.c fore200e_sba_fw.c
obj-$(CONFIG_ATM_ZATM) += zatm.o uPD98402.o
obj-$(CONFIG_ATM_NICSTAR) += nicstar.o
@ -36,38 +28,7 @@ obj-$(CONFIG_ATM_TCP) += atmtcp.o
obj-$(CONFIG_ATM_FIRESTREAM) += firestream.o
obj-$(CONFIG_ATM_LANAI) += lanai.o
ifeq ($(CONFIG_ATM_FORE200E_PCA),y)
fore_200e-objs += fore200e_pca_fw.o
# guess the target endianess to choose the right PCA-200E firmware image
ifeq ($(CONFIG_ATM_FORE200E_PCA_DEFAULT_FW),y)
byteorder.h := include$(if $(patsubst $(srctree),,$(objtree)),2)/asm/byteorder.h
CONFIG_ATM_FORE200E_PCA_FW := $(obj)/pca200e$(if $(shell $(CC) $(KBUILD_CPPFLAGS) -E -dM $(byteorder.h) | grep ' __LITTLE_ENDIAN '),.bin,_ecd.bin2)
endif
endif
ifeq ($(CONFIG_ATM_FORE200E_SBA),y)
fore_200e-objs += fore200e_sba_fw.o
ifeq ($(CONFIG_ATM_FORE200E_SBA_DEFAULT_FW),y)
CONFIG_ATM_FORE200E_SBA_FW := $(obj)/sba200e_ecd.bin2
endif
endif
obj-$(CONFIG_ATM_HE) += he.o
ifeq ($(CONFIG_ATM_HE_USE_SUNI),y)
obj-$(CONFIG_ATM_HE) += suni.o
endif
# FORE Systems 200E-series firmware magic
$(obj)/fore200e_pca_fw.c: $(patsubst "%", %, $(CONFIG_ATM_FORE200E_PCA_FW)) \
$(obj)/fore200e_mkfirm
$(obj)/fore200e_mkfirm -k -b _fore200e_pca_fw \
-i $(CONFIG_ATM_FORE200E_PCA_FW) -o $@
$(obj)/fore200e_sba_fw.c: $(patsubst "%", %, $(CONFIG_ATM_FORE200E_SBA_FW)) \
$(obj)/fore200e_mkfirm
$(obj)/fore200e_mkfirm -k -b _fore200e_sba_fw \
-i $(CONFIG_ATM_FORE200E_SBA_FW) -o $@
# deal with the various suffixes of the binary firmware images
$(obj)/%.bin $(obj)/%.bin1 $(obj)/%.bin2: $(src)/%.data
objcopy -Iihex $< -Obinary $@.gz
gzip -n -df $@.gz

View File

@ -36,6 +36,7 @@
#include <linux/atm_suni.h>
#include <linux/dma-mapping.h>
#include <linux/delay.h>
#include <linux/firmware.h>
#include <asm/io.h>
#include <asm/string.h>
#include <asm/page.h>
@ -45,7 +46,7 @@
#include <asm/uaccess.h>
#include <asm/atomic.h>
#ifdef CONFIG_ATM_FORE200E_SBA
#ifdef CONFIG_SBUS
#include <asm/idprom.h>
#include <asm/sbus.h>
#include <asm/openprom.h>
@ -382,9 +383,6 @@ fore200e_shutdown(struct fore200e* fore200e)
case FORE200E_STATE_START_FW:
/* nothing to do for that state */
case FORE200E_STATE_LOAD_FW:
/* nothing to do for that state */
case FORE200E_STATE_RESET:
/* nothing to do for that state */
@ -405,7 +403,7 @@ fore200e_shutdown(struct fore200e* fore200e)
}
#ifdef CONFIG_ATM_FORE200E_PCA
#ifdef CONFIG_PCI
static u32 fore200e_pca_read(volatile u32 __iomem *addr)
{
@ -658,10 +656,10 @@ fore200e_pca_proc_read(struct fore200e* fore200e, char *page)
pci_dev->bus->number, PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn));
}
#endif /* CONFIG_ATM_FORE200E_PCA */
#endif /* CONFIG_PCI */
#ifdef CONFIG_ATM_FORE200E_SBA
#ifdef CONFIG_SBUS
static u32
fore200e_sba_read(volatile u32 __iomem *addr)
@ -907,7 +905,7 @@ fore200e_sba_proc_read(struct fore200e* fore200e, char *page)
return sprintf(page, " SBUS slot/device:\t\t%d/'%s'\n", sbus_dev->slot, sbus_dev->prom_name);
}
#endif /* CONFIG_ATM_FORE200E_SBA */
#endif /* CONFIG_SBUS */
static void
@ -2552,13 +2550,53 @@ fore200e_monitor_puts(struct fore200e* fore200e, char* str)
while (fore200e_monitor_getc(fore200e) >= 0);
}
#ifdef __LITTLE_ENDIAN
#define FW_EXT ".bin"
#else
#define FW_EXT "_ecd.bin2"
#endif
static int __devinit
fore200e_start_fw(struct fore200e* fore200e)
fore200e_load_and_start_fw(struct fore200e* fore200e)
{
int ok;
char cmd[ 48 ];
struct fw_header* fw_header = (struct fw_header*) fore200e->bus->fw_data;
const struct firmware *firmware;
struct device *device;
struct fw_header *fw_header;
u32 *fw_data, fw_size;
u32 __iomem *load_addr;
char buf[48];
int err = -ENODEV;
if (strcmp(fore200e->bus->model_name, "PCA-200E") == 0)
device = &((struct pci_dev *) fore200e->bus_dev)->dev;
#ifdef CONFIG_SBUS
else if (strcmp(fore200e->bus->model_name, "SBA-200E") == 0)
device = &((struct sbus_dev *) fore200e->bus_dev)->ofdev.dev;
#endif
else
return err;
sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT);
if (request_firmware(&firmware, buf, device) == 1) {
printk(FORE200E "missing %s firmware image\n", fore200e->bus->model_name);
return err;
}
fw_data = (u32 *) firmware->data;
fw_size = firmware->size / sizeof(u32);
fw_header = (struct fw_header *) firmware->data;
load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset);
DPRINTK(2, "device %s firmware being loaded at 0x%p (%d words)\n",
fore200e->name, load_addr, fw_size);
if (le32_to_cpu(fw_header->magic) != FW_HEADER_MAGIC) {
printk(FORE200E "corrupted %s firmware image\n", fore200e->bus->model_name);
goto release;
}
for (; fw_size--; fw_data++, load_addr++)
fore200e->bus->write(le32_to_cpu(*fw_data), load_addr);
DPRINTK(2, "device %s firmware being started\n", fore200e->name);
@ -2567,46 +2605,22 @@ fore200e_start_fw(struct fore200e* fore200e)
fore200e_spin(100);
#endif
sprintf(cmd, "\rgo %x\r", le32_to_cpu(fw_header->start_offset));
sprintf(buf, "\rgo %x\r", le32_to_cpu(fw_header->start_offset));
fore200e_monitor_puts(fore200e, buf);
fore200e_monitor_puts(fore200e, cmd);
ok = fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_CP_RUNNING, 1000);
if (ok == 0) {
if (fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_CP_RUNNING, 1000) == 0) {
printk(FORE200E "device %s firmware didn't start\n", fore200e->name);
return -ENODEV;
goto release;
}
printk(FORE200E "device %s firmware started\n", fore200e->name);
fore200e->state = FORE200E_STATE_START_FW;
return 0;
}
err = 0;
static int __devinit
fore200e_load_fw(struct fore200e* fore200e)
{
__le32* fw_data = (__le32*) fore200e->bus->fw_data;
u32 fw_size = (u32) *fore200e->bus->fw_size / sizeof(u32);
struct fw_header* fw_header = (struct fw_header*) fw_data;
u32 __iomem *load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset);
DPRINTK(2, "device %s firmware being loaded at 0x%p (%d words)\n",
fore200e->name, load_addr, fw_size);
if (le32_to_cpu(fw_header->magic) != FW_HEADER_MAGIC) {
printk(FORE200E "corrupted %s firmware image\n", fore200e->bus->model_name);
return -ENODEV;
}
for (; fw_size--; fw_data++, load_addr++)
fore200e->bus->write(le32_to_cpu(*fw_data), load_addr);
fore200e->state = FORE200E_STATE_LOAD_FW;
return 0;
release:
release_firmware(firmware);
return err;
}
@ -2652,10 +2666,7 @@ fore200e_init(struct fore200e* fore200e)
if (fore200e_reset(fore200e, 1) < 0)
return -ENODEV;
if (fore200e_load_fw(fore200e) < 0)
return -ENODEV;
if (fore200e_start_fw(fore200e) < 0)
if (fore200e_load_and_start_fw(fore200e) < 0)
return -ENODEV;
if (fore200e_initialize(fore200e) < 0)
@ -2689,7 +2700,7 @@ fore200e_init(struct fore200e* fore200e)
return 0;
}
#ifdef CONFIG_ATM_FORE200E_PCA
#ifdef CONFIG_PCI
static int __devinit
fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
{
@ -2804,7 +2815,7 @@ fore200e_module_init(void)
}
}
#ifdef CONFIG_ATM_FORE200E_PCA
#ifdef CONFIG_PCI
if (!pci_register_driver(&fore200e_pca_driver))
return 0;
#endif
@ -2821,7 +2832,7 @@ fore200e_module_cleanup(void)
{
struct fore200e *fore200e, *next;
#ifdef CONFIG_ATM_FORE200E_PCA
#ifdef CONFIG_PCI
pci_unregister_driver(&fore200e_pca_driver);
#endif
@ -3140,19 +3151,9 @@ static const struct atmdev_ops fore200e_ops =
};
#ifdef CONFIG_ATM_FORE200E_PCA
extern const unsigned char _fore200e_pca_fw_data[];
extern const unsigned int _fore200e_pca_fw_size;
#endif
#ifdef CONFIG_ATM_FORE200E_SBA
extern const unsigned char _fore200e_sba_fw_data[];
extern const unsigned int _fore200e_sba_fw_size;
#endif
static const struct fore200e_bus fore200e_bus[] = {
#ifdef CONFIG_ATM_FORE200E_PCA
#ifdef CONFIG_PCI
{ "PCA-200E", "pca200e", 32, 4, 32,
_fore200e_pca_fw_data, &_fore200e_pca_fw_size,
fore200e_pca_read,
fore200e_pca_write,
fore200e_pca_dma_map,
@ -3173,9 +3174,8 @@ static const struct fore200e_bus fore200e_bus[] = {
fore200e_pca_proc_read,
},
#endif
#ifdef CONFIG_ATM_FORE200E_SBA
#ifdef CONFIG_SBUS
{ "SBA-200E", "sba200e", 32, 64, 32,
_fore200e_sba_fw_data, &_fore200e_sba_fw_size,
fore200e_sba_read,
fore200e_sba_write,
fore200e_sba_dma_map,

View File

@ -754,7 +754,6 @@ typedef enum fore200e_state {
FORE200E_STATE_CONFIGURE, /* bus interface configured */
FORE200E_STATE_MAP, /* board space mapped in host memory */
FORE200E_STATE_RESET, /* board resetted */
FORE200E_STATE_LOAD_FW, /* firmware loaded */
FORE200E_STATE_START_FW, /* firmware started */
FORE200E_STATE_INITIALIZE, /* initialize command successful */
FORE200E_STATE_INIT_CMDQ, /* command queue initialized */
@ -803,8 +802,6 @@ typedef struct fore200e_bus {
int descr_alignment; /* tpd/rpd/rbd DMA alignment requirement */
int buffer_alignment; /* rx buffers DMA alignment requirement */
int status_alignment; /* status words DMA alignment requirement */
const unsigned char* fw_data; /* address of firmware data start */
const unsigned int* fw_size; /* address of firmware data size */
u32 (*read)(volatile u32 __iomem *);
void (*write)(u32, volatile u32 __iomem *);
u32 (*dma_map)(struct fore200e*, void*, int, int);

View File

@ -1,31 +0,0 @@
These microcode data are placed under the terms of the GNU General Public License.
We would prefer you not to distribute modified versions of it and not to ask
for assembly or other microcode source.
Copyright (c) 1995-2000 FORE Systems, Inc., as an unpublished work. This
notice does not imply unrestricted or public access to these materials which
are a trade secret of FORE Systems, Inc. or its subsidiaries or affiliates
(together referred to as "FORE"), and which may not be reproduced, used, sold
or transferred to any third party without FORE's prior written consent. All
rights reserved.
U.S. Government Restricted Rights. If you are licensing the Software on
behalf of the U.S. Government ("Government"), the following provisions apply
to you. If the software is supplied to the Department of Defense ("DoD"), it
is classified as "Commercial Computer Software" under paragraph 252.227-7014
of the DoD Supplement to the Federal Acquisition Regulations ("DFARS") (or any
successor regulations) and the Government is acquiring only the license
rights granted herein (the license rights customarily provided to non-Government
users). If the Software is supplied to any unit or agency of the Government
other than the DoD, it is classified as "Restricted Computer Software" and
the Government's rights in the Software are defined in paragraph 52.227-19 of
the Federal Acquisition Regulations ("FAR") (or any successor regulations) or,
in the cases of NASA, in paragraph 18.52.227-86 of the NASA Supplement to the FAR
(or any successor regulations).
FORE Systems is a registered trademark, and ForeRunner, ForeRunnerLE, and
ForeThought are trademarks of FORE Systems, Inc. All other brands or product
names are trademarks or registered trademarks of their respective holders.

View File

@ -1,154 +0,0 @@
/*
mkfirm.c: generates a C readable file from a binary firmware image
Christophe Lizzi (lizzi@{csti.fr, cnam.fr}), June 1999.
This software may be used and distributed according to the terms
of the GNU General Public License, incorporated herein by reference.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>
char* default_basename = "pca200e"; /* was initially written for the PCA-200E firmware */
char* default_infname = "<stdin>";
char* default_outfname = "<stdout>";
char* progname;
int verbose = 0;
int inkernel = 0;
void usage(void)
{
fprintf(stderr,
"%s: [-v] [-k] [-b basename ] [-i firmware.bin] [-o firmware.c]\n",
progname);
exit(-1);
}
int main(int argc, char** argv)
{
time_t now;
char* infname = NULL;
char* outfname = NULL;
char* basename = NULL;
FILE* infile;
FILE* outfile;
unsigned firmsize;
int c;
progname = *(argv++);
while (argc > 1) {
if ((*argv)[0] == '-') {
switch ((*argv)[1]) {
case 'i':
if (argc-- < 3)
usage();
infname = *(++argv);
break;
case 'o':
if (argc-- < 3)
usage();
outfname = *(++argv);
break;
case 'b':
if (argc-- < 3)
usage();
basename = *(++argv);
break;
case 'v':
verbose = 1;
break;
case 'k':
inkernel = 1;
break;
default:
usage();
}
}
else {
usage();
}
argc--;
argv++;
}
if (infname != NULL) {
infile = fopen(infname, "r");
if (infile == NULL) {
fprintf(stderr, "%s: can't open %s for reading\n",
progname, infname);
exit(-2);
}
}
else {
infile = stdin;
infname = default_infname;
}
if (outfname) {
outfile = fopen(outfname, "w");
if (outfile == NULL) {
fprintf(stderr, "%s: can't open %s for writing\n",
progname, outfname);
exit(-3);
}
}
else {
outfile = stdout;
outfname = default_outfname;
}
if (basename == NULL)
basename = default_basename;
if (verbose) {
fprintf(stderr, "%s: input file = %s\n", progname, infname );
fprintf(stderr, "%s: output file = %s\n", progname, outfname );
fprintf(stderr, "%s: firmware basename = %s\n", progname, basename );
}
time(&now);
fprintf(outfile, "/*\n generated by %s from %s on %s"
" DO NOT EDIT!\n*/\n\n",
progname, infname, ctime(&now));
if (inkernel)
fprintf(outfile, "#include <linux/init.h>\n\n" );
/* XXX force 32 bit alignment? */
fprintf(outfile, "const unsigned char%s %s_data[] = {\n",
inkernel ? " __initdata" : "", basename );
c = getc(infile);
fprintf(outfile,"\t0x%02x", c);
firmsize = 1;
while ((c = getc(infile)) >= 0) {
if (firmsize++ % 8)
fprintf(outfile,", 0x%02x", c);
else
fprintf(outfile,",\n\t0x%02x", c);
}
fprintf(outfile, "\n};\n\n");
fprintf(outfile, "const unsigned int%s %s_size = %u;\n",
inkernel ? " __initdata" : "", basename, firmsize );
if (infile != stdin)
fclose(infile);
if (outfile != stdout)
fclose(outfile);
if(verbose)
fprintf(stderr, "%s: firmware size = %u\n", progname, firmsize);
exit(0);
}

View File

@ -75,14 +75,8 @@
#include <linux/atm.h>
#include <linux/sonet.h>
#define USE_TASKLET
#undef USE_SCATTERGATHER
#undef USE_CHECKSUM_HW /* still confused about this */
#define USE_RBPS
#undef USE_RBPS_POOL /* if memory is tight try this */
#undef USE_RBPL_POOL /* if memory is tight try this */
#define USE_TPD_POOL
/* #undef CONFIG_ATM_HE_USE_SUNI */
/* #undef HE_DEBUG */
#include "he.h"
@ -388,9 +382,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
he_dev->atm_dev->dev_data = he_dev;
atm_dev->dev_data = he_dev;
he_dev->number = atm_dev->number;
#ifdef USE_TASKLET
tasklet_init(&he_dev->tasklet, he_tasklet, (unsigned long) he_dev);
#endif
spin_lock_init(&he_dev->global_lock);
if (he_start(atm_dev)) {
@ -787,23 +779,13 @@ he_init_group(struct he_dev *he_dev, int group)
{
int i;
#ifdef USE_RBPS
/* small buffer pool */
#ifdef USE_RBPS_POOL
he_dev->rbps_pool = pci_pool_create("rbps", he_dev->pci_dev,
CONFIG_RBPS_BUFSIZE, 8, 0);
if (he_dev->rbps_pool == NULL) {
hprintk("unable to create rbps pages\n");
return -ENOMEM;
}
#else /* !USE_RBPS_POOL */
he_dev->rbps_pages = pci_alloc_consistent(he_dev->pci_dev,
CONFIG_RBPS_SIZE * CONFIG_RBPS_BUFSIZE, &he_dev->rbps_pages_phys);
if (he_dev->rbps_pages == NULL) {
hprintk("unable to create rbps page pool\n");
return -ENOMEM;
}
#endif /* USE_RBPS_POOL */
he_dev->rbps_base = pci_alloc_consistent(he_dev->pci_dev,
CONFIG_RBPS_SIZE * sizeof(struct he_rbp), &he_dev->rbps_phys);
@ -818,14 +800,9 @@ he_init_group(struct he_dev *he_dev, int group)
dma_addr_t dma_handle;
void *cpuaddr;
#ifdef USE_RBPS_POOL
cpuaddr = pci_pool_alloc(he_dev->rbps_pool, GFP_KERNEL|GFP_DMA, &dma_handle);
if (cpuaddr == NULL)
return -ENOMEM;
#else
cpuaddr = he_dev->rbps_pages + (i * CONFIG_RBPS_BUFSIZE);
dma_handle = he_dev->rbps_pages_phys + (i * CONFIG_RBPS_BUFSIZE);
#endif
he_dev->rbps_virt[i].virt = cpuaddr;
he_dev->rbps_base[i].status = RBP_LOANED | RBP_SMALLBUF | (i << RBP_INDEX_OFF);
@ -844,30 +821,14 @@ he_init_group(struct he_dev *he_dev, int group)
RBP_QSIZE(CONFIG_RBPS_SIZE - 1) |
RBP_INT_ENB,
G0_RBPS_QI + (group * 32));
#else /* !USE_RBPS */
he_writel(he_dev, 0x0, G0_RBPS_S + (group * 32));
he_writel(he_dev, 0x0, G0_RBPS_T + (group * 32));
he_writel(he_dev, 0x0, G0_RBPS_QI + (group * 32));
he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0),
G0_RBPS_BS + (group * 32));
#endif /* USE_RBPS */
/* large buffer pool */
#ifdef USE_RBPL_POOL
he_dev->rbpl_pool = pci_pool_create("rbpl", he_dev->pci_dev,
CONFIG_RBPL_BUFSIZE, 8, 0);
if (he_dev->rbpl_pool == NULL) {
hprintk("unable to create rbpl pool\n");
return -ENOMEM;
}
#else /* !USE_RBPL_POOL */
he_dev->rbpl_pages = (void *) pci_alloc_consistent(he_dev->pci_dev,
CONFIG_RBPL_SIZE * CONFIG_RBPL_BUFSIZE, &he_dev->rbpl_pages_phys);
if (he_dev->rbpl_pages == NULL) {
hprintk("unable to create rbpl pages\n");
return -ENOMEM;
}
#endif /* USE_RBPL_POOL */
he_dev->rbpl_base = pci_alloc_consistent(he_dev->pci_dev,
CONFIG_RBPL_SIZE * sizeof(struct he_rbp), &he_dev->rbpl_phys);
@ -882,14 +843,9 @@ he_init_group(struct he_dev *he_dev, int group)
dma_addr_t dma_handle;
void *cpuaddr;
#ifdef USE_RBPL_POOL
cpuaddr = pci_pool_alloc(he_dev->rbpl_pool, GFP_KERNEL|GFP_DMA, &dma_handle);
if (cpuaddr == NULL)
return -ENOMEM;
#else
cpuaddr = he_dev->rbpl_pages + (i * CONFIG_RBPL_BUFSIZE);
dma_handle = he_dev->rbpl_pages_phys + (i * CONFIG_RBPL_BUFSIZE);
#endif
he_dev->rbpl_virt[i].virt = cpuaddr;
he_dev->rbpl_base[i].status = RBP_LOANED | (i << RBP_INDEX_OFF);
@ -1475,7 +1431,6 @@ he_start(struct atm_dev *dev)
he_init_tpdrq(he_dev);
#ifdef USE_TPD_POOL
he_dev->tpd_pool = pci_pool_create("tpd", he_dev->pci_dev,
sizeof(struct he_tpd), TPD_ALIGNMENT, 0);
if (he_dev->tpd_pool == NULL) {
@ -1484,20 +1439,6 @@ he_start(struct atm_dev *dev)
}
INIT_LIST_HEAD(&he_dev->outstanding_tpds);
#else
he_dev->tpd_base = (void *) pci_alloc_consistent(he_dev->pci_dev,
CONFIG_NUMTPDS * sizeof(struct he_tpd), &he_dev->tpd_base_phys);
if (!he_dev->tpd_base)
return -ENOMEM;
for (i = 0; i < CONFIG_NUMTPDS; ++i) {
he_dev->tpd_base[i].status = (i << TPD_ADDR_SHIFT);
he_dev->tpd_base[i].inuse = 0;
}
he_dev->tpd_head = he_dev->tpd_base;
he_dev->tpd_end = &he_dev->tpd_base[CONFIG_NUMTPDS - 1];
#endif
if (he_init_group(he_dev, 0) != 0)
return -ENOMEM;
@ -1606,9 +1547,7 @@ he_stop(struct he_dev *he_dev)
gen_cntl_0 &= ~(INT_PROC_ENBL | INIT_ENB);
pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0);
#ifdef USE_TASKLET
tasklet_disable(&he_dev->tasklet);
#endif
/* disable recv and transmit */
@ -1638,7 +1577,6 @@ he_stop(struct he_dev *he_dev)
he_dev->hsp, he_dev->hsp_phys);
if (he_dev->rbpl_base) {
#ifdef USE_RBPL_POOL
int i;
for (i = 0; i < CONFIG_RBPL_SIZE; ++i) {
@ -1647,22 +1585,14 @@ he_stop(struct he_dev *he_dev)
pci_pool_free(he_dev->rbpl_pool, cpuaddr, dma_handle);
}
#else
pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE
* CONFIG_RBPL_BUFSIZE, he_dev->rbpl_pages, he_dev->rbpl_pages_phys);
#endif
pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE
* sizeof(struct he_rbp), he_dev->rbpl_base, he_dev->rbpl_phys);
}
#ifdef USE_RBPL_POOL
if (he_dev->rbpl_pool)
pci_pool_destroy(he_dev->rbpl_pool);
#endif
#ifdef USE_RBPS
if (he_dev->rbps_base) {
#ifdef USE_RBPS_POOL
int i;
for (i = 0; i < CONFIG_RBPS_SIZE; ++i) {
@ -1671,20 +1601,12 @@ he_stop(struct he_dev *he_dev)
pci_pool_free(he_dev->rbps_pool, cpuaddr, dma_handle);
}
#else
pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE
* CONFIG_RBPS_BUFSIZE, he_dev->rbps_pages, he_dev->rbps_pages_phys);
#endif
pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE
* sizeof(struct he_rbp), he_dev->rbps_base, he_dev->rbps_phys);
}
#ifdef USE_RBPS_POOL
if (he_dev->rbps_pool)
pci_pool_destroy(he_dev->rbps_pool);
#endif
#endif /* USE_RBPS */
if (he_dev->rbrq_base)
pci_free_consistent(he_dev->pci_dev, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq),
@ -1698,14 +1620,8 @@ he_stop(struct he_dev *he_dev)
pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
he_dev->tpdrq_base, he_dev->tpdrq_phys);
#ifdef USE_TPD_POOL
if (he_dev->tpd_pool)
pci_pool_destroy(he_dev->tpd_pool);
#else
if (he_dev->tpd_base)
pci_free_consistent(he_dev->pci_dev, CONFIG_NUMTPDS * sizeof(struct he_tpd),
he_dev->tpd_base, he_dev->tpd_base_phys);
#endif
if (he_dev->pci_dev) {
pci_read_config_word(he_dev->pci_dev, PCI_COMMAND, &command);
@ -1720,7 +1636,6 @@ he_stop(struct he_dev *he_dev)
static struct he_tpd *
__alloc_tpd(struct he_dev *he_dev)
{
#ifdef USE_TPD_POOL
struct he_tpd *tpd;
dma_addr_t dma_handle;
@ -1735,27 +1650,6 @@ __alloc_tpd(struct he_dev *he_dev)
tpd->iovec[2].addr = 0; tpd->iovec[2].len = 0;
return tpd;
#else
int i;
for (i = 0; i < CONFIG_NUMTPDS; ++i) {
++he_dev->tpd_head;
if (he_dev->tpd_head > he_dev->tpd_end) {
he_dev->tpd_head = he_dev->tpd_base;
}
if (!he_dev->tpd_head->inuse) {
he_dev->tpd_head->inuse = 1;
he_dev->tpd_head->status &= TPD_MASK;
he_dev->tpd_head->iovec[0].addr = 0; he_dev->tpd_head->iovec[0].len = 0;
he_dev->tpd_head->iovec[1].addr = 0; he_dev->tpd_head->iovec[1].len = 0;
he_dev->tpd_head->iovec[2].addr = 0; he_dev->tpd_head->iovec[2].len = 0;
return he_dev->tpd_head;
}
}
hprintk("out of tpds -- increase CONFIG_NUMTPDS (%d)\n", CONFIG_NUMTPDS);
return NULL;
#endif
}
#define AAL5_LEN(buf,len) \
@ -1804,11 +1698,9 @@ he_service_rbrq(struct he_dev *he_dev, int group)
RBRQ_CON_CLOSED(he_dev->rbrq_head) ? " CON_CLOSED" : "",
RBRQ_HBUF_ERR(he_dev->rbrq_head) ? " HBUF_ERR" : "");
#ifdef USE_RBPS
if (RBRQ_ADDR(he_dev->rbrq_head) & RBP_SMALLBUF)
rbp = &he_dev->rbps_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
else
#endif
rbp = &he_dev->rbpl_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))];
buf_len = RBRQ_BUFLEN(he_dev->rbrq_head) * 4;
@ -1887,12 +1779,10 @@ he_service_rbrq(struct he_dev *he_dev, int group)
for (iov = he_vcc->iov_head;
iov < he_vcc->iov_tail; ++iov) {
#ifdef USE_RBPS
if (iov->iov_base & RBP_SMALLBUF)
memcpy(skb_put(skb, iov->iov_len),
he_dev->rbps_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len);
else
#endif
memcpy(skb_put(skb, iov->iov_len),
he_dev->rbpl_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len);
}
@ -1937,11 +1827,9 @@ he_service_rbrq(struct he_dev *he_dev, int group)
for (iov = he_vcc->iov_head;
iov < he_vcc->iov_tail; ++iov) {
#ifdef USE_RBPS
if (iov->iov_base & RBP_SMALLBUF)
rbp = &he_dev->rbps_base[RBP_INDEX(iov->iov_base)];
else
#endif
rbp = &he_dev->rbpl_base[RBP_INDEX(iov->iov_base)];
rbp->status &= ~RBP_LOANED;
@ -1977,9 +1865,7 @@ he_service_tbrq(struct he_dev *he_dev, int group)
he_dev->hsp->group[group].tbrq_tail);
struct he_tpd *tpd;
int slot, updated = 0;
#ifdef USE_TPD_POOL
struct he_tpd *__tpd;
#endif
/* 2.1.6 transmit buffer return queue */
@ -1991,7 +1877,6 @@ he_service_tbrq(struct he_dev *he_dev, int group)
TBRQ_TPD(he_dev->tbrq_head),
TBRQ_EOS(he_dev->tbrq_head) ? " EOS" : "",
TBRQ_MULTIPLE(he_dev->tbrq_head) ? " MULTIPLE" : "");
#ifdef USE_TPD_POOL
tpd = NULL;
list_for_each_entry(__tpd, &he_dev->outstanding_tpds, entry) {
if (TPD_ADDR(__tpd->status) == TBRQ_TPD(he_dev->tbrq_head)) {
@ -2006,9 +1891,6 @@ he_service_tbrq(struct he_dev *he_dev, int group)
TBRQ_TPD(he_dev->tbrq_head));
goto next_tbrq_entry;
}
#else
tpd = &he_dev->tpd_base[ TPD_INDEX(TBRQ_TPD(he_dev->tbrq_head)) ];
#endif
if (TBRQ_EOS(he_dev->tbrq_head)) {
HPRINTK("wake_up(tx_waitq) cid 0x%x\n",
@ -2038,12 +1920,8 @@ he_service_tbrq(struct he_dev *he_dev, int group)
}
next_tbrq_entry:
#ifdef USE_TPD_POOL
if (tpd)
pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
#else
tpd->inuse = 0;
#endif
he_dev->tbrq_head = (struct he_tbrq *)
((unsigned long) he_dev->tbrq_base |
TBRQ_MASK(++he_dev->tbrq_head));
@ -2086,7 +1964,6 @@ he_service_rbpl(struct he_dev *he_dev, int group)
he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T);
}
#ifdef USE_RBPS
static void
he_service_rbps(struct he_dev *he_dev, int group)
{
@ -2113,7 +1990,6 @@ he_service_rbps(struct he_dev *he_dev, int group)
if (moved)
he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T);
}
#endif /* USE_RBPS */
static void
he_tasklet(unsigned long data)
@ -2124,9 +2000,7 @@ he_tasklet(unsigned long data)
int updated = 0;
HPRINTK("tasklet (0x%lx)\n", data);
#ifdef USE_TASKLET
spin_lock_irqsave(&he_dev->global_lock, flags);
#endif
while (he_dev->irq_head != he_dev->irq_tail) {
++updated;
@ -2141,9 +2015,7 @@ he_tasklet(unsigned long data)
case ITYPE_RBRQ_TIMER:
if (he_service_rbrq(he_dev, group)) {
he_service_rbpl(he_dev, group);
#ifdef USE_RBPS
he_service_rbps(he_dev, group);
#endif /* USE_RBPS */
}
break;
case ITYPE_TBRQ_THRESH:
@ -2156,9 +2028,7 @@ he_tasklet(unsigned long data)
he_service_rbpl(he_dev, group);
break;
case ITYPE_RBPS_THRESH:
#ifdef USE_RBPS
he_service_rbps(he_dev, group);
#endif /* USE_RBPS */
break;
case ITYPE_PHY:
HPRINTK("phy interrupt\n");
@ -2186,9 +2056,7 @@ he_tasklet(unsigned long data)
he_service_rbrq(he_dev, 0);
he_service_rbpl(he_dev, 0);
#ifdef USE_RBPS
he_service_rbps(he_dev, 0);
#endif /* USE_RBPS */
he_service_tbrq(he_dev, 0);
break;
default:
@ -2210,9 +2078,7 @@ he_tasklet(unsigned long data)
IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD);
(void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata; flush posted writes */
}
#ifdef USE_TASKLET
spin_unlock_irqrestore(&he_dev->global_lock, flags);
#endif
}
static irqreturn_t
@ -2244,11 +2110,7 @@ he_irq_handler(int irq, void *dev_id)
if (he_dev->irq_head != he_dev->irq_tail) {
handled = 1;
#ifdef USE_TASKLET
tasklet_schedule(&he_dev->tasklet);
#else
he_tasklet((unsigned long) he_dev);
#endif
he_writel(he_dev, INT_CLEAR_A, INT_FIFO); /* clear interrupt */
(void) he_readl(he_dev, INT_FIFO); /* flush posted writes */
}
@ -2305,23 +2167,14 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid)
dev_kfree_skb_any(tpd->skb);
atomic_inc(&tpd->vcc->stats->tx_err);
}
#ifdef USE_TPD_POOL
pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status));
#else
tpd->inuse = 0;
#endif
return;
}
}
/* 2.1.5 transmit packet descriptor ready queue */
#ifdef USE_TPD_POOL
list_add_tail(&tpd->entry, &he_dev->outstanding_tpds);
he_dev->tpdrq_tail->tpd = TPD_ADDR(tpd->status);
#else
he_dev->tpdrq_tail->tpd = he_dev->tpd_base_phys +
(TPD_INDEX(tpd->status) * sizeof(struct he_tpd));
#endif
he_dev->tpdrq_tail->cid = cid;
wmb();
@ -2511,13 +2364,8 @@ he_open(struct atm_vcc *vcc)
goto open_failed;
}
#ifdef USE_RBPS
rsr1 = RSR1_GROUP(0);
rsr4 = RSR4_GROUP(0);
#else /* !USE_RBPS */
rsr1 = RSR1_GROUP(0)|RSR1_RBPL_ONLY;
rsr4 = RSR4_GROUP(0)|RSR4_RBPL_ONLY;
#endif /* USE_RBPS */
rsr0 = vcc->qos.rxtp.traffic_class == ATM_UBR ?
(RSR0_EPD_ENABLE|RSR0_PPD_ENABLE) : 0;

View File

@ -51,8 +51,6 @@
#define CONFIG_IRQ_SIZE 128
#define CONFIG_IRQ_THRESH (CONFIG_IRQ_SIZE/2)
#define CONFIG_NUMTPDS 256
#define CONFIG_TPDRQ_SIZE 512
#define TPDRQ_MASK(x) (((unsigned long)(x))&((CONFIG_TPDRQ_SIZE<<3)-1))
@ -140,12 +138,7 @@ struct he_tpd {
struct sk_buff *skb;
struct atm_vcc *vcc;
#ifdef USE_TPD_POOL
struct list_head entry;
#else
u32 inuse;
char padding[32 - sizeof(u32) - (2*sizeof(void*))];
#endif
};
#define TPD_ALIGNMENT 64
@ -291,16 +284,9 @@ struct he_dev {
volatile unsigned *irq_tailoffset;
int irq_peak;
#ifdef USE_TASKLET
struct tasklet_struct tasklet;
#endif
#ifdef USE_TPD_POOL
struct pci_pool *tpd_pool;
struct list_head outstanding_tpds;
#else
struct he_tpd *tpd_head, *tpd_base, *tpd_end;
dma_addr_t tpd_base_phys;
#endif
dma_addr_t tpdrq_phys;
struct he_tpdrq *tpdrq_base, *tpdrq_tail, *tpdrq_head;
@ -311,25 +297,13 @@ struct he_dev {
struct he_rbrq *rbrq_base, *rbrq_head;
int rbrq_peak;
#ifdef USE_RBPL_POOL
struct pci_pool *rbpl_pool;
#else
void *rbpl_pages;
dma_addr_t rbpl_pages_phys;
#endif
dma_addr_t rbpl_phys;
struct he_rbp *rbpl_base, *rbpl_tail;
struct he_virt *rbpl_virt;
int rbpl_peak;
#ifdef USE_RBPS
#ifdef USE_RBPS_POOL
struct pci_pool *rbps_pool;
#else
void *rbps_pages;
dma_addr_t rbps_pages_phys;
#endif
#endif
dma_addr_t rbps_phys;
struct he_rbp *rbps_base, *rbps_tail;
struct he_virt *rbps_virt;

View File

@ -65,12 +65,7 @@
#include "iphase.h"
#include "suni.h"
#define swap(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8))
struct suni_priv {
struct k_sonet_stats sonet_stats; /* link diagnostics */
unsigned char loop_mode; /* loopback mode */
struct atm_dev *dev; /* device back-pointer */
struct suni_priv *next; /* next SUNI */
};
#define PRIV(dev) ((struct suni_priv *) dev->phy_data)
static unsigned char ia_phy_get(struct atm_dev *dev, unsigned long addr);
@ -94,10 +89,6 @@ module_param(IADebugFlag, uint, 0644);
MODULE_LICENSE("GPL");
#if BITS_PER_LONG != 32
# error FIXME: this driver only works on 32-bit platforms
#endif
/**************************** IA_LIB **********************************/
static void ia_init_rtn_q (IARTN_Q *que)
@ -1411,7 +1402,6 @@ static int rx_init(struct atm_dev *dev)
struct abr_vc_table *abr_vc_table;
u16 *vc_table;
u16 *reass_table;
u16 *ptr16;
int i,j, vcsize_sel;
u_short freeq_st_adr;
u_short *freeq_start;
@ -1429,11 +1419,12 @@ static int rx_init(struct atm_dev *dev)
iadev->rx_dle_q.start = (struct dle *)dle_addr;
iadev->rx_dle_q.read = iadev->rx_dle_q.start;
iadev->rx_dle_q.write = iadev->rx_dle_q.start;
iadev->rx_dle_q.end = (struct dle*)((u32)dle_addr+sizeof(struct dle)*DLE_ENTRIES);
iadev->rx_dle_q.end = (struct dle*)((unsigned long)dle_addr+sizeof(struct dle)*DLE_ENTRIES);
/* the end of the dle q points to the entry after the last
DLE that can be used. */
/* write the upper 20 bits of the start address to rx list address register */
/* We know this is 32bit bus addressed so the following is safe */
writel(iadev->rx_dle_dma & 0xfffff000,
iadev->dma + IPHASE5575_RX_LIST_ADDR);
IF_INIT(printk("Tx Dle list addr: 0x%08x value: 0x%0x\n",
@ -1587,11 +1578,12 @@ static int rx_init(struct atm_dev *dev)
Set Packet Aging Interval count register to overflow in about 4 us
*/
writew(0xF6F8, iadev->reass_reg+PKT_TM_CNT );
ptr16 = (u16*)j;
i = ((u32)ptr16 >> 6) & 0xff;
ptr16 += j - 1;
i |=(((u32)ptr16 << 2) & 0xff00);
i = (j >> 6) & 0xFF;
j += 2 * (j - 1);
i |= ((j << 2) & 0xFF00);
writew(i, iadev->reass_reg+TMOUT_RANGE);
/* initiate the desc_tble */
for(i=0; i<iadev->num_tx_desc;i++)
iadev->desc_tbl[i].timestamp = 0;
@ -1914,7 +1906,7 @@ static int tx_init(struct atm_dev *dev)
iadev->tx_dle_q.start = (struct dle*)dle_addr;
iadev->tx_dle_q.read = iadev->tx_dle_q.start;
iadev->tx_dle_q.write = iadev->tx_dle_q.start;
iadev->tx_dle_q.end = (struct dle*)((u32)dle_addr+sizeof(struct dle)*DLE_ENTRIES);
iadev->tx_dle_q.end = (struct dle*)((unsigned long)dle_addr+sizeof(struct dle)*DLE_ENTRIES);
/* write the upper 20 bits of the start address to tx list address register */
writel(iadev->tx_dle_dma & 0xfffff000,
@ -2907,7 +2899,7 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) {
dev_kfree_skb_any(skb);
return 0;
}
if ((u32)skb->data & 3) {
if ((unsigned long)skb->data & 3) {
printk("Misaligned SKB\n");
if (vcc->pop)
vcc->pop(vcc, skb);

View File

@ -1,850 +0,0 @@
:150000001F8B0808AB5A10380203706361323030652E62696E4D
:150015007D00E43A0D7014D7796FA5BDE84EC86211A7333020EE
:15002A00AD89C00A23EA83AA589C7E7C38D8152EB887477677D3
:15003F0095C39C3DB2AB388CA324C4A509352BFBB085BBD0C73F
:150054007210B903C92991CCD1B1C242255BCCD81EA5C34C6826
:1500690006271AC6D36A3A31B976D4A9A683DB4B07BB38265C56
:15007E00BFEFBDB7777BA7030B2733994C35737AFBBEF7BDEFE7
:15009300EF7DDFF7BEF7769FFEEAD79F221221E1ED844C3E4677
:1500A8007EA3BFF036F827CF8597C3AF0C7E920B16595BCE5AA8
:1500BD00296B6483D83E9F7DBE8FF50BE74A0B45FB1F274FAA79
:1500D200D82E2867139DF637FD937EF1D55FB0769FE8678BDAFB
:1500E7007D9BD8885451515172FE27E4138E9FC9949CBFF026BC
:1500FC00741DF83ECE59823FF23BF89346493F6B4F17C1B3A7CE
:15011100B3B79C97D3275B5ABFEC3CF9579457703B3CBFEFD600
:15012600FC38236CA91B5E347EDBFA67F7ED4397956EA4D3C5F4
:15013B007CE6A567799EFFF5CFC4FF7BDF938BF83E83EDE59F02
:15015000FEAC24BF8A3C3F2FF9FDFF933CF51EF2FFEC2FEBFA11
:150165002341C38CBC5F4EAA265F5EAF04BC51F0059FD1419ED8
:15017A00063493D465A2384E66A0171C30231F40AB5CB5646FC8
:15018F005CBFB633DECCC614D2DAF622F15D3189EFEA3EE28B83
:1501A4007D99F8DABE4D7C2418A438AF3129015D7507F1032EBA
:1501B900E174827F46C82229AE2BC63A9D50E9253960EC005FCA
:1501CE00F2EDFE0AF12A9D5EBD6A35F1B5AC441A49BAD94F22C6
:1501E300DECB544F180D1A51FACD8C4A7C034B93DAFD6455A8F9
:1501F8009AAC5AB74C9542EF11E23DB0946A0F1B0DA10BF0CC0C
:15020D00F9A4A8097BCA1D751474A02FEC02593C75C9E870D176
:15022200B8CF352EC3783C379E1C2893C98017C6A57B3CDD0E4D
:15023700CE32426A9CB99F03FC2E81BF46AD0D06544FD0190B08
:15024C00C0580B8E897EFDF490DE08FD652E9CFAE911DD5F24FE
:15026100CF832469DAB1116BE0F3C437B686F8D275C437AC9220
:150276000542BFF6CC0320B22AB7237E1F5B97A4E927A397490C
:15028B0064C43AFF0CD8ACCE8886D37F632A7F4C16005E289CAF
:1502A0003E491DDAFB083513C6B0A6B8E4929626F531E0877479
:1502B50082E58C9E2503DDD45DC4777E3BF1051F253E09684E42
:1502CA00C3BAC26825AC39F5225F6598EE23B366227C52ABFC3A
:1502DF00BC2754E61BD1FFEBAE6DCDFE8D49AAEA38EE89A35A1B
:1502F4009DF0DCF4254234681BBB09E98536033F2F3C5F835F24
:15030900107E147E1AE8AA0406A36989DB63C95ADE9F9272EBA7
:15031E00C17C6131AC4519193457028723BE118D0433D6F063E5
:150333005C6E1C77EC2981FD118663B2FA3A455F8D11A2D66BC0
:15034800AFE9B096E6D4A38454D70D004ECA8235541117C7A5F2
:15035D002D26F8E4B07D3848BA956402FC7BF8EC956CB6B6D35F
:1503720091EB21B280C218CAB04122B5957583D126189B7D88FF
:15038700FB2BDA46560F52056C867C6CE85FF1135F19E0C948D1
:15039C0023873342916798F3A6E45FA58C9021887DB9A8DF9307
:1503B1002EECF7421F693AB054DE6F73F4FDF414E83A6B66B2C0
:1503C6000B11C3BA0E45D0D1074E3318C92C24FE074FF267E847
:1503DB00E03AE67193D635C40D9FD66A65B471CABA5AC66D9C17
:1503F00081B68DE4F5200AEA316B3E3EF5F8D4CAF0C902BFBC6E
:1504050003FD12ED00BE39F8E7C4E765F2A6F8BCC8083DA6B648
:15041A00335DAAA0AFC4DEA66A6CDC8418EA26910FAD6A0821BE
:15042F0012B4A9C269D1DDAC9DB05A98BD06B91D807702D6021B
:15044400F02CA479BF88CD3D82BE3F92D49137C262E0EB5969BB
:15045900D6AC8DA4F4A3A0EB808FEB8570E6F34897F9F77CE4C2
:15046E0071E4E07C73F2C0FC256AC3208B2D5C834D43BA3F060F
:15048300F39566B386103FC611E321E23D02F1168A79426C3DFD
:15049800E159DA32AAA34C083FBA62DC2474847A94BF031D86A2
:1504AD00ACE5EAEB969CDC4FF3F3216F03DE5414FD8ED3DA3050
:1504C2005F5AC953795A804F2146D05612811C0DB6A0BC0E67DE
:1504D7007C6E471FC3A5CFA04B06639EFA201E11FA182E7D3E53
:1504EC009556913E89227D129F511FDBA5CF05970CF63CF54199
:15050100BCE097B83EB64B9F4FA555A4CF60913E839F511F752A
:1505160026AF4FCB4C5E0684CF471FC48B75737DF079C37C69B3
:15052B0015E973BC489FE32E7DC231AFD997FEF15925301975DC
:150540007CBC5E33F5D918F2E53E82FD69D1B745FF82E8237F22
:15055500EC4FB07ED2A4626FD8C3F7363321FA29D11F14FD6938
:15056A00D13F2EFA9D40678FFA1ACBD131181B507F88FBA8451E
:15057F00E179507D8362EC4FC2734A7D8786D5D526CF431356CC
:1505940010E6D51152BB2CE6690F243DED35694FBB17D6017487
:1505A900B251C766F514A3D3037337AB67189D043C77A9E728AB
:1505BE00CE3FCFE5A0C8B347ED17F9CDB09A812EE4A09AFBC861
:1505D30005F3ECCE1F76B0B8059C6AD51342D87777BEC16093F7
:1505E8002ED82B3BDF613094C9813DB7F3A50E87FE6A95AF1F58
:1505FD00D259C69E53B447F047991EAA1FDDE8D0747091968332
:15061200EBC88AB2D5095CA4FB07AA87ED030961D37494DB348F
:15062700C27225D77D497EBF32958271CE6F8DA0D12CF612E37F
:15063C00718ED32568206F3FDF874C7B477EAC4DD8310AE35B40
:15065100C17E683B139EA3EA6178A6D65B4CA65926E72EF555F4
:150666007A82D977D06A9A610E58F3D80D4F6BFDF4DDFAC37506
:15067B00E7D67D672AA93DD881720C301B55C6E4D0860EB97506
:150690007D5DFF3A0A636BD898CDE4AD4C7A42CBDE915B037587
:1506A50087D7593056DDC1E5477B55429CDCF8B5DCFAAB15AFBD
:1506BA00AE3B0263FFD3EE69AF8C5584FEF3FD0FDA90E6BFADE7
:1506CF0030DB70FEBF9C186B43DC4BEFBFDE4682BD8C27C86F5A
:1506E400B3BC185CC264063DED086BF730DA2418B655D6F63110
:1506F900394850B53126EEFCD1AC2EBD1B83F83B6D56056C5662
:15070E0027F079B3565739DFC3A2AC8D591AB48B37FD4097B6BD
:150723007D4527CA41F38E00D6C48665887A30CEDA5E6BA09CE8
:15073800EF7568CF8A7EC03FF80DC05F6B56078280AFB25C86D9
:15074D00F863ACEDB32658DBC26CBEE04780FFEEB7017F9BB98C
:15076200301001FCB0C5E54E5A0DD0BEC8D6618FD53893DFDBC0
:15077700489D0A781A5B9B27616DFAD4435409C08E179C365B01
:15078C00B86D2C5EB34E5BCDD0CEC0B98106CBBA25A29A87AEC7
:1507A100676BD0977601BC4A7DCDC2BA15ED575E1DD7B78610CF
:1507B6008FC715EE954F0A5CB4B78837139F9F079E8AEFA21E32
:1507CB00DF9814679714AB9163E99F59FEBDE3263A704FFA4DF8
:1507E0000BFAD400D9FCE1115DF1C541C7772D591DB7BA1C7929
:1507F500D4BBCC1B9F701EC761BE22E4A1429EB736E6E5C1BDA9
:15080A00EE92C09D74C933790B79222E79BA401EE8535A429E39
:15081F00F3ABF2F23C2B785CC43812F24C0A799A5CF2E05E759D
:15083400BFC0457F73E4C1E79BC91376C9B319E4813E4D9690D5
:15084900A7D925CFE55F711E6D33B8A771799007CA73BC252F86
:15085E000FEE3567392EE35506B935DE3E625D87B3AC9363DDC5
:15087300675D387B325FEEC53DCA370CF1D064D2707F1F9E1BAD
:15088800BCCC7732962CFCB60AF76B17AFD80C1694A4D6EBDAB7
:15089D0047E58DFC1CEB75E1E10563311E21B6794C95704FA00C
:1508B20031EEBF8BC93DD0270326EC0F8A54674771FCCEF0B040
:1508C7007E67F81CD864D8EA401CC819480FE1811DBC76E5FDFE
:1508DC00733A83FDD508D6AA24406D9DCF3FA75FCC66FD65D592
:1508F100FDFAEE7BF332F5F0FDC225936D769033AD01550A3A24
:15090600BCF12CBF86F184F305E007567C68E59EDB3FCCF1498D
:15091B00D79F692B73E8803CC25E4CAEDA152370463A4A2DE42F
:15093000AB34998BC0DE1BD01C0AA7C5715314ED0FC74F4B510E
:150945005ED2BDC9319893001F18B3A2AE734B17D4E2CFA89EB1
:15095A00D6B7245E6394E2F350520E95A6DD6079943780F65B70
:15096F00507B1C857AE36D0B6B12491D8133EA88E6D41A72B92A
:15098400A835607E52D421448C255D7548EE0F723FD656E84744
:15099900CA3D28974DE33C4751AF90CFEB9603D61BE545BA8197
:1509AE00906D2A44D446CA190BE550DE5F85B273DF637264CCC1
:1509C300C15E487501388B928C8974B4ED9C4E8FD80F395D9B32
:1509D800D9A7F6FDFD5482B3B6141B358F92514D3A30CEEA2EE8
:1509ED003EC7B6108744E478BE6ECB98555F46FA54D0E77A23D8
:150A0200FDE876AE1FE7932AE0C3EC226CC2EC98E676BC7347DE
:150A1700DC0A446C361675F3A48267306C72595A4C85D9A5D310
:150A2C006467AB60D0E4761AA00C1E19A6CFDE057584F27DAC4C
:150A4100810A64F09F5845DD6B073896ACC05936324E1D3FC1D0
:150A56001C843796C7485C2391FD168998CC2EAC0E807119F419
:150A6B00A52D86899716E555719D1E5CABF77860FDA686D87D2E
:150A8000881FD74839ABCBEADB34C06AE6FC196F49F9DC3367A7
:150A9500FF9653FCBCE83E774E9DC198FD9433E7203F734E0EF2
:150AAA00E7CE9BECEC19F9BEE5F8961C30A2634DFCFEA0D0B70D
:150ABF00B82FA14CBDC23E6C6D4249E6574419B2081DA247F1E2
:150AD400AE02FC0A7D81D9CC00FA74C84ADCC82E72F9336B3524
:150AE90075186487D8A757CCC5B06FE37D56B5BAAAF912D674D6
:150AFE0012F13EA3AE0D5D83985C9FF6B7B3DAEE31CEB713DA06
:150B130045E420F33B90DB12700BE117C47D4058E0468A700568
:150B2800DC42F87111EF0EFD1E316777D11C01B710DE2BE8F75C
:150B3D000A5CA30857C02D84B709FA2B05FD06818B78F8BCDCC9
:150B5200956F1A5D63F88C67293C4379C18FCAAB46C037862CF0
:150B6700B497ACBCA2E37A07D5613B00F6AA091FED901553AFF3
:150B7C00EDBFA257A9A7AC65C6076D814DFFADCBB131EB44D2FC
:150B9100D3ED8D9966269B5D0C355EAB1CBB62393E5B09B92DA1
:150BA6007D3DEB73C7C0B7A0CE95599D4AE7C4A388AF5C5E4121
:150BBB001ACAA1213D513EACA16C353B1A2C279ED9DA634E30EB
:150BD0002027A4DFC63C22E273C22A8E67F405C61362C61D27AE
:150BE5002FDE11D7C365DC0F1591D33E2D4E5E82FD3B17230768
:150BFA008634CC078AD84F31565642CAC2B3E0D3AC9E17310500
:150C0F00F1F318F89BA8DF73B0FBC5B9E2E6B1D4226269A8F448
:150C2400FD8D2B9E7ABEF0DBCFD57473E2296C3D2DEC7EBCF2E1
:150C3900AE00DF13950DDEA802CFB7FA713CC25A35E0ECA52AC3
:150C4E00D412F544A96ED2E3655F78CA23E0B4C678CA19C73BC6
:150C63007A25DCF084ECD008279EA8719E37E5E1B9FD8ADDB182
:150C78000DC0764CD423AADC4D73B519BFDF7C84EDF7B3589BA5
:150C8D002978178F2324729206D4F666ACDF181C6C7FFDBEF62F
:150CA2003F04FFB4091D3E8BEDE2C8A08EF7A1481361354A427E
:150CB700BF0075C79CFD52F0EFBA09FFF58CFF80C9F2281DB6EB
:150CCC00918E943ECEE946809780E173BA047D6A637DC3E9E326
:150CE100FD30D41426ABD5A0BF066353F5B7AD57AB426111E732
:150CF6002175793BD0A435CA01DD9101E36E51513FF72CF85916
:150D0B00533FD0D6AB0F846AD4079A03EAAAD056276FA94F71C2
:150D2000DA82A6E43B3E87AEF48FB786AD4E2F6F75EEA36584E2
:150D3500837D8F64208743DE10F7CD8B56A7E5565C0F7627CD82
:150D4A0071E811C84132E2404C200ECA9A85BA8E1AFB35425244
:150D5F00980BCDECDF9F97C1AF71CF55D02E2C2EA660BF823D2D
:150D74006135190E61FC6476BEDEE1BEA7FD9C787F107F84E908
:150D89005860EF2C9930495D2A9AA76D08DAB6C1624F81FD644F
:150D9E0072445B638C94A45D2168373E42BCEE7D285F5F65CC2D
:150DB300E4D7B03E3172F5C9FCF381CDF301E856321F28AE3A51
:150DC80028771E688C4A5BD641CD07B107B58A72379C210E6DFD
:150DDD00D477415EF648712D0AAD1C4846132A3F977C1772DDE5
:150DF200B1E4C7CDE4EA10BDF6B5FC7B8D3D5FFFDDFEA623C476
:150E070037F149D60767196DF37D72BB73D787F76764B77176CD
:150E1C0012DFEDED4E9E9D62ED24C612B4E9B319F6CE0FCEC553
:150E310060A795E28EC5592B49ACD55EA03DFBA77C1F408D2F19
:150E4600C19925111ED61AB1FD22D431CC768DCC76686BC46913
:150E5B00025948755C5BFE89B05F4C62F603E3079A805E15C03F
:150E70007F7E9F7C2F5BCFEDA2BE82166B17AC59900EF6BB59E8
:150E85003D95F781473ED50706C49DFE70491F5072FB7DC6422E
:150E9A009DC136B6B08D2D6C630BDBD8689B72C8E56E9F99AF8B
:150EAF003DF1DD13D451C14A757F10CEF8BE3C6C2DC00E06535C
:150EC40005B03F02D8D1E09803AB42582DC056042711C6EE3D4A
:150ED900B87DDFFB18EC09763DFFF15CBBBEF730F18D7D8C764C
:150EEE006DB877BE7ACD579F7809FF2813FE1105BE17B615CA1F
:150F0300D922135F23C8E20159979490B511E67899AC4DF7DEFF
:150F1800CE1ACC57DEDE12F2960B795F0759976C9BEBCF06FAC8
:150F2D004B095F8E5DCBFACA408FC8B5B97AC4804EF81AEAE194
:150F4200BFF7767DE976F4E929A18F2CF4F9F956E2EB84DF675D
:150F5700E1BFF97F4127B5812A6A1365EFE620074AB029B701EC
:150F6C001CFB32E934357C0E6AA60AD659AEEA96A26EFA5B76F9
:150F8100970E79676B6C88BD2B8E7D53DCF73CC76A5433FD0D60
:150F9600A89D643847E33B55DC9401EF62EC9455F5C419EBC295
:150FAB00479C3601BAD9858639057D89F7BD631F15CA33267057
:150FC000DF83B68B244DBFCAF9118DF3433EC8CFDE5DC86F3932
:150FD500E0553D71CADA0AFC3441837EC4F9C5043FE87BDDF609
:150FEA0054843DCD3FE1EFB8AF3E440AC61789F15D62FCBDA29D
:150FFF00F11A31BE558C8F158D2F16E34D623CC1C63366D79E29
:15101400FC793F0B3A5202FB37ECD5DEE52452707687BF81A5FC
:15102900B646E14C41EA923BF0AC5963EC5F87EFF53591D70ED8
:15103E002C9DD53AC22F873A5DF7E92F4C3CF113B4D573BB2F35
:1510530075045DF0CBAFFEF57584B7EEF84987FBFE7DFA8D6F83
:151068009D40F893FFF0E30EC2BE871834E3FFFC179BFC0163E8
:15107D0047B297F8269F24BE3972BAEE17827F59B87FCB380E23
:15109200F9167388548D39197231C24AECC74EAE81B351FBEE40
:1510A7002DE2DE07700F6C19D52A638F065F811671F66EE7672C
:1510BC003C1C73CE320C5644AF8EDFF7F1EF332E0FE8F683F8F2
:1510D1001D01FB1640C47E8ADD2918BE51B6571056CB2419BE69
:1510E6005F39CDEE52768B7B1784A9EA283B4BED71C18202D67F
:1510FB00E7823509D8DE99FCB707866B1CED4B26086954472D8C
:15111000370CBF436C2882554932692E84518A67BFD838550E10
:151125008DEA2D3826F4C6EF6508BD9BD99D8AF91FDC58F453B2
:15113A002F9B9FF345D18A7E649C4A07F09C0338ECFD3DE713EE
:15114F005647E93EA827B19EC2F3EE65F0B7441FE9C6F74ED3D0
:15116400397FE1B66DACE2760DA74FE6E40CA74FD3FE2DE3DA2C
:151179006675DC72D37C79E98086FB33D28C15ECEFA3ECEE6226
:15118E00AB80ED1132EE113206605F6732E27B2576864DE1DED8
:1511A300CF6A05B6F78BB51C106B298B6F2998CDA06605DE16C5
:1511B8007EFF9280338317CFA17866127A7845AB14B5176F64D1
:1511CD000BEA546EDF93EC5E0EF76903F4C3332E3E3B30F2F086
:1511E2005C58991BC6EAE794D509272B493C6F56381C6C66A124
:1511F700DD6A33CCCE0143C8C160013B1AD89812E727389FC223
:15120C009C5A03D60DD688B591717321D2A3A356297C52029F42
:15122100E4F0DFE4F605183C5B7B9DCFF944FCBD20F4E4B19C55
:1512360062758BE4E804CF57A514F3F7A03F3FFEF296FCB8034D
:15124B007BA9044C7E782ECCE386B9623AE7DF22A69C7875C78E
:15126000727F512C633B25C66E36C72831C7196BC4F68BF9B97C
:151275009590BB8DBBC902278FA04D5E747C0E9EEBA7E37AAC39
:15128A00687CC1E594CE69A4CC1648B68998A71B7CAC06F7016D
:15129F0073733E27A17F605C38637DEE31F6ED1BA7C35A178D76
:1512B400CE221A8E0DB80F7298510C037A2F38307F1E66948027
:1512C900555617C250A7FD2E9D1D58BC04ACBCDA0D334CBB4EC1
:1512DE0026E1D5C23EB08F60CEC0B8F483CF634D85DFE4B17ECD
:1512F3002015AD75BD4B225584BD3342FFF533FF1D311D3FAFDB
:151308003C84DF1BD87400BFB50BF35C568A8672DB34600CF7B2
:15131D00176514F12C2D1717498AF91CF3E12ECC25D0C77907C1
:1513320097A634461F7DC54F6829B8E2829B6EFC25A5E10AC018
:151347007B9DEFDEEA788E75DB6BAB74137BF94BEBBAE0B20DCC
:15135C0067E4D1BE83504BB03C301FBBFD1669A19EB75A03F3CC
:1513710076E4FACCB40AD7D51679DED9AB793E2EB475613E2E11
:15138600210BCCE1B2A44CD602ED85480F6ABE927628814F729C
:15139B00F885F2ED75F91DC6AF543D37BE49F5DCF82EAB9E1BB7
:1513B000CBA404EC15DFDCF8F654CF8D65B90886F847DC73F32E
:1513C500EF3C2B79FD8531CEF706B469BD6BEF83D6D825BEDF9F
:1513DA0020AEBD50291A935D63FEA231AF6B6C49D158956B6C58
:1513EF00B922F611E52D4A1493CAEA307BCFC4BF63A4F41A6BD3
:1514040007E9F532BEE765581B34A1A82072F5889E30C635FCEE
:151419005676B13CA21F2B1FD78E854735AC55BE639CD3BC1730
:15142E003FD0192E201F360E68CA5653AF81BC5CE97AFF8BDFE1
:151443008FCAE638833F17AB0ACDB8D613DFFBFFD37DFC7B9AE7
:1514580058EEDB1B80CFF0335F65F2D7CDCB92DFC4EF4EC4B7BF
:15146D003313ECBB277E5F3EC1BF8D080E50FEBD0C1538830C25
:15148200A7D7F57E03DF9F3F2BF84CCEE17347011FFE7DCD0460
:15149700FB7ECAE1630B3E5D820FC719345551A725A13D119479
:1514AC00BA2B0E8DE8FEF02AFD353C9FC4EE6E0BC42A425745A7
:1514C1007C5D8ADD139A85672FD8BF5E8BEBD433DA5719F3B4AB
:1514D600E33A292ABE8B033BBE097935297577A9A72C388AD66C
:1514EB00C8CA5A88EB03B42E7CB0ED30665CA5DFC46F5D37FF53
:151500003B9CEB22BFB41AD45F5ACEFBE836F58015560F5BFEA9
:15151500F408FDBFF6BE3E3A8AEBCAF355AB5A6A498DA816ADA6
:15152A0046C2209588708447715A422648964C43182F78306934
:15153F00639CAD12C26EDB644C1C26A3DD61E7704E58BB255AC4
:1515540020E10729D548462638B4B064E30938322B123C47248E
:1515690062E275F02C61B48CC390C4269D19C626332456BC4A65
:15157E0086CD38F4DEDFABAAEE9210FE9839B367FF58D5D1A9A8
:15159300EA57EFE3BE7BEFBBEFDEF7EEBB657887B6D5087BF17D
:1515A800081FA63A83A941B22B5F3491CE945E0EDF6E779BEBA1
:1515BD00BF3ED0EC2E5FA1FD996EDA75A02C9E5157FCDBF00DF9
:1515D200AF6E8D4C2B5F4CE523EA336693FA8A5DBE77C6F2D17B
:1515E700E31818D5AD80254CEF6AD47623AC7673ACFB9A2CD1D0
:1515FC00A6A93F37BD12FC228E7293F5B5C9B184594CF2CC8307
:151611007DE9E8A0E98BF59AFED8A869EDDBB8F9F8A4CDC7F152
:15162600297C9CE1DFB1214D71F16F51CCDB98E151EC1B61AFE5
:15163B008478348FE466095BA45B7DABB6FA16196876F3735093
:15165000ED364231F94E6BBFC1E0F0E51DF97BAC8FC45BA1DF9D
:15166500AF6E60F987CA929AA22E16B459053AC0F5491D31629D
:15167A00EA5123A26EE04A68756B1FE9A75864EF1B7F41737C57
:15168F00777BEDF1DB6FF95B14BBFD285AA9BF3945A7743575DF
:1516A4008C67CB1C31B9ED0FE7E415FB9AE349AD9878DC5D3E9C
:1516B900AAF61A1BA87D8DE0D0D483F47FD56853AB8CED6A8D70
:1516CE001157EB8D2EB5C930D45544BB477493FD595B754AEC79
:1516E3009FB6F553FEA43A6A1C51B9D1F7EC515EC28EE97336A4
:1516F8003DCB17BC759527367D92772E58CC776DAAE5BB9F6D89
:15170D00E05D6FADE04F2F38CEB166F2B91FC0892426ECBAFDF3
:15172200CF9EE2FED387F59EB7F6F262B677A91B2E3205F38BA3
:15173700D455CD99B46807AF92587EB13B4D74A083F39BA4BF13
:15174C0071217D43BA16EB3032FB606FDDF89E191DFCFD821912
:15176100EA235E1B79279D5F953C6C88B1053FE0CB37DAD7F014
:151776008388129F788B3A85AE7290F2BC1FCCFA9DF8A6FB9DCA
:15178B0010AF1E14B65E3B7C7A4CE13F4D63DF4B32A32F49FA86
:1517A0006CD3104F596B5EA6DF3A5F31A744D87D9326DEAB6A39
:1517B500027BA94167BC63FD5E8B55124FE0EC483B8FBBDA56CD
:1517CA0066F0C3F1C5A85D3127C44DEC57F6A9528B323AC0AF33
:1517DF00D96D627F734A9BF4DE37ADCDE9FB071B5CED3357FB1F
:1517F400EA0CEDCBAEF6E7CFD07ED5C76C1FFE3589863077601A
:15180900010C3BE65830CCA7B6A6B7AF8CBE28DA526303A46BCC
:15181E000CB732A5D384EF8F4CB67188DA9D1F1B309E5EF06B13
:15183300E1D331E9F6F371EDCFAC7D2AEB3F22E52774A9ECA464
:15184800BE7EACB3D1B78E0B5D46B92FA995EC18E1511F8B60C6
:15185D007C96EC18E4317A866F01F21B296F0B337E6D62EF18A4
:15187200699E6969D4D712C77F24188AB5865929DFD939B88DCC
:15188700190F70F08FFA790234A4B5FACEEDA1F64EF292D096AF
:15189C00D6B93B8EF208B5118C5B3A33F2083F10E3707FF1B807
:1518B10021F67738C13277473D27B9DDD6B177ADF0F3098696FE
:1518C600B576DCFB29FD3CE1E9B598E74ECFA5FF20CE4084AD8B
:1518DB00730562BF0D739DBD9F2CF6434331A9B94059AFA36E52
:1518F00094654A3397A5C37AA7381BF0B258170EC2C732BA3C2A
:15190500B35621C717E9589F484C785A426F35F0D08A7B74362A
:15191A003E6286562CB6FD5AC4BA96B557611C3597624F3D3A72
:15192F0018BF4DDDB4043693D88735068633FFCA603C4875F9B3
:15194400F32BF52BE974E08DE57AD3E34F7A9A1C5A5DA0BEB02D
:15195900F0761BEEB69BC2EDB954A1CBA79337C21E5E6686ED09
:15196E00F593E9F04346032FE883D59719FA30FE0D731DFA6039
:151983003C175F29FA10113028D1B80EF80D35A70577C08F3B83
:15199800F15EC92CCC25E37BF8E0EFD285428F540EC7C7976FC2
:1519AD00AA1FA5BEADA2BE39EF77FCCE75D410FE24048BAFE8E2
:1519C200A8E085B93B4EF00999C598B16838A00CEA993335F4F6
:1519D7005B8D25E8FD31FE3EDEC37710FB414A3B6C06E386DFF9
:1519EC006E7FA97D597EF71525048FB3FA041F233316FB9D6202
:151A0100BF69D883FD6A137BBB57D3E950D6FF89C6CBBFB17C5F
:151A1600625F767D5894CF961DB6FF8DCCFFB4F5E2B6988F27FD
:151A2B0053DF3715E2733535305C1CDA4EF56CE1C154A5312B41
:151A400095D3B22AB5D80884DA88DE63A2CE10CDC92CFAFBFC5E
:151A55003519FBF21A87AF8EFCFA2384C752BE16FABD021FF809
:151A6A00A8F0B5EA8DD7697F1EA96DBE47F5349FF75EE1A1C844
:151A7F002797826E1BD2E9C249C9B193BA8D3CD02D2AEF32DA11
:151A9400E013B89683D6C85743F9CEDAF9C2A91554EF6A739572
:151AA900C573C38286F6BD26760FEF16FB8295246F5682A68619
:151ABE0045C3A9F70E09EB8657787A391C7107881F3FAD4DE607
:151AD30058F517F101FD41755663B13AABF6A5CA924673E18293
:151AE800C657F18EE018BC9E2E5CA84A8D024E85F4B072A3D58F
:151AFD00C7FAF9E51FA7F333E7F1C60F5B7B8DE387CD4365D585
:151B12001AF58C63BFABD7AE9FCA37A32E8DEA72F23AF9B6524A
:151B27009E7D6B06B45D34C6D0875B49E64D6F6BFB8FAD3D8A0C
:151B3C00522AFFAA64C185737B5D180BE37163BE7F500FFE6E98
:151B5100BF8101BE3AF5A2619DD34A3333F282D647F5CEF3D710
:151B6600E8A42B97C0D7BC865DE189C837DB70F62E89B1BB66B3
:151B7B00B16E12AD72D990EE25FEC7DE506364A89129CF59B491
:151B9000B1F5378C6159F0994A70455A05FCCA73E69B3F4AE70C
:151BA5001FF558FD5C49B46E9A81A6B751DBD3FB34F8A3B4D82E
:151BBA0013443D5BEDF2F36252A3779C6440740FF7F8137A2424
:151BCF00B59F375D4AE73B6573699CE02CDDA88D779CE714B2F2
:151BE40080F0E0E4E9A777E2D9788AC77F98B6CE3F529E37DF4D
:151BF9009F8A7BF0E04CB012FE4B4A53ED46FD050BE783D3CA28
:151C0E008D02FFE07371566D0F77708D3371AB530326C73E7BDE
:151C2300785ABF5957A6DF472F5AFD06ED515F1BD55763D34CAD
:151C3800F0E6A0C59BF04B97D6FCBE1EA5F7B73AFC67D3C2C2FA
:151C4D0063B60EEDA2056B1BF1C4C8BF583C31CF5FAF8706A432
:151C6200468737B662BC5BE73B6DDE209D3F32A42D64279AC1E8
:151C770017C18661C10F667CA1E6EB7E519769AE5C68F381E5DB
:151C8C00F73A95EEA493FA42CA61E2F9765E447C116CAFD595EC
:151CA100376C7C3BE3C15506F6D44CF8BE1DE39DF203E737B4A5
:151CB60043E3E928D5E9F8D3E4BA78631BF186FAA6C51B12E1DB
:151CCB0057B67963EDDF5AF8157B568493CBBFCDD20FF5CD8A7C
:151CE0006ED1B59F7CA99E649C599D5A6356A5569824E74C9214
:151CF50083C60CFB4DE21C33F4143FD901C2276E063F6FD2937B
:151D0A00785E51B7DE06BF4CD2DFA09749F9033AF6B5BAEC73CC
:151D1F000BF02D7B50F8330D0B5B4AF877E34C34D94F87CA4E3B
:151D34006ACC1812BEDE4AB2D384BDBB2A794AE877F1E410782A
:151D4900728EA2769AABD453A641F712E388FEAA6ABD67954398
:151D5E00FCF24DF43FD8438150B4750FE66FA58A17939CAF263F
:151D73003BE676F8E23B7633D96915DA55BD27B2BF0DF8F35FD4
:151D8800C8DACDADEA7DE6DB3F93EE94957BF52A7505AF225DD7
:151D9D00FE92EA6D0ED2FD5BF04514E36C0F2F3D9FCE7FAD5214
:151DB2006E249BDC207BD698C78EDD15211B50B6694D76AC01A8
:151DC70059D9E44A433E25146EA53ACD2ED5DFECF8589692BDD0
:151DDC009BC72C3D0DBF8F52DDBB95A7DAA08F55CF618580CB48
:151DF1006D67BA6DCCE80FAD71D029F257F36BC5AC9029EF99AF
:151E0600412A0399E186C9E2BF7A7E3BCD0B800F7004D5970D68
:151E1B00F4218F781FEBE76C7C31749E6068C5A774F41D7A90B7
:151E3000F774834E6085AAA82E21038C1E1E559FE1AFCE26DABE
:151E45002BC46754DE6907766090F41F4A33DD6DDE934E8B36D0
:151E5A00855EA51C364748472B8FD9B22C6AC939D4D9361BEBFD
:151E6F00F6614A3B2CE0F2B2BD7A0FE08AEE3121A71CBA396BC1
:151E84001ED13740BBF704ED707E5C55498F573A877DEA1DA687
:151E99007705E940D1BDA26EE8F5D0E9FDEAB366CD75A929AB9C
:151EAE00CF583470F0EDA6C360C0F2BFBCD97B1E60856E7A0042
:151EC3009EB1BFA139D2A117E495526526D6701D7AD4E49355C5
:151ED800774DE7D7A87D9E2F9E7AC72C095D6CCD49922D7DFE54
:151EED000A8D8D2FF00AED4FF425B16FF37D9D27DAC43E90ED91
:151F0200971EA6BBB087B08608C28CC1C77DD80C8BB3DCDF30DF
:151F1700E684CE50BB3F249952DAEA8B3D493AED72CC2B66C792
:151F2C00BD0F918E7BBFD171EFBD7A774A024E857E9B87392E76
:151F41001CB5F5DB2ECB2F8FC66CCCF6B31F16F76ADB0638627B
:151F56008CDC073B2B4265B6087D3A2D7C44525C444EC819E394
:151F6B00E1582D9F9DCC69093CBB9E074EB7E852F2040F40BFA2
:151F8000879E7C1F7CD25F163EB87DEC9B1ACABD4FCA53DF677C
:151F9500BF69EDA7517DFBD97734B6ED1847F4903EF66D0DBA40
:151FAA0018E4771F7B4D832F2DE089920E87FC80E55689059E76
:151FBF00227915185BA9DF4DFDF12B8FE8B2FA9C81BE3A7E50F6
:151FD4002C7A9FD931EB5EE1039C4F3031638DD9C70632FE501A
:151FE90028CFA2CF99AF125FFACE8DE86CA4D384FD04FA0FDB39
:151FFE007BCC68ABE8524AEFCD7941E8F56BB1AE3C72CC1C63DA
:15201300225F1CFA3CFCE2B0B78867D80758AF213917C7BC7364
:15202800ADE27073B9EA69F49D233DBCFE18A7726DED852B5BE4
:15203D00A05F930D5A124DBD635468DFD3674BCF0B9DD8E33F85
:15205200A1236F09FC1BEA87903F7270672FCD457DC236050FD3
:15206700887764234E923CF49D3BA8CF3BF79CCE2607054C382D
:15207C00EF437C2564FC1FC6D6365978F986E13BFD72960F9219
:15209100DE0C1F84C007842787F6BEC82ABDABCD63D111F4336D
:1520A600BA4D879E4FB31735879E2CFA0D73103ABACD2B53F1A0
:1520BB0067E1EDABAFFF9186337253717644E0ACA44DF848DBB0
:1520D000381B06CE026CFC581CBEDAD79EBC7789A80FB6CCA84C
:1520E5008533165D346CFD77F65B733B1B9E3B7A42E047AC7FA6
:1520FA0019C7CC02E8C5935FE16F104B127F9414A53CCDC0ED45
:15210F00E39E2796FE69CA736728E66976F30978C373E91DDDF8
:1521240027BDA077AB599C04A78C0DCBF6035D2D7EB6C60AF085
:1521390094E1F5E9769FBDEF6EAAEBEFF49DBBAAC367D9EAA701
:15214E00C1710644E83FE1301778D9F669AB7FCA401C6BEB2D2E
:15216300EA034BB0FFE1659D7A70C75745FFD8E6E778EFD81756
:15217800493E7CD174D93BFDC2D6C19E36E18245474CA78E203C
:15218D00D951852E5C8C117F2797AF6FBA7EDDC2C76FCA9FA8EE
:1521A200DD40FA96859FBFD7EBA4273F003FDF27FC3CFFEF82DF
:1521B7009F97809F7577E98E6D9E6661CE267F6EE1836CE6DE14
:1521CC0038EC050B1F0BD8223DF8FE62818F9C68A95E1E2F6F3A
:1521E100BE45CC71FB782CF5AEB9ED97B0974B5BE9D9807CB1CE
:1521F600EC1FC21BFBE32C0F2A583310FF84BB0117EE5E369D99
:15220B00F6A6E3AE9770B78D70F77736EE2E12EED07EC8D5FE2D
:15222000B55F586D4F6DF7056D5FFE505666DC5C56CC71C98A24
:15223500A64C3EEBEC74667C2CC4BAEEBAE7333244D8E7E3545F
:15224A002E3EA44D2EF70AD8204B204722A4E3418E604D0A67B3
:15225F002050EEE9944B9EE4BCA461FF0FE736F05EBCB3E449EC
:15227400896FDD4BFA016A5BC8946D4362CC627D0A7D2E76F53C
:1522890059A63EBB65CD74FFA551F8E6285C2FBA64E801D20F34
:15229E00FA9232F547354EDE27F4CA906B8F8C063EE99034B72D
:1522B3000357276DFE4079DF42962F8FEFD495F33BB5A9FEFC1E
:1522C80086B0357697F56B42B7945917703526D65C86E20BB10B
:1522DD00A743632327752C2EA74EC47D7ED27308BF05F1A1C669
:1522F200E2A841F301E73D29B94556137CAEF217382B182AC2CA
:1523070019BA0C4C5161776CC799BBF2D5ADD0B1587958D821CF
:15231C00D095271EB07C67AFE15EBE8CE6DDDF3F207CF7C2EA17
:15233100F1D40333FB731B87B07ED12FD62F76931E5C34D629A3
:15234600D609D8B89C301A8E58B04787E245F06FB4D33DB1A12D
:15235B00B8D2302CFAD7C3F66A384FE85B47F3883104BD08739A
:152370008C41735BA67FC591C146A7ACB58F9B79BE019E6B8741
:15238500B2EB31BBCB86B5A2B80D8F711378285D215B1AB0B83F
:15239A00DB94ACFD988ECC5A8DBD3F8FBD68567ED2DAF7B4FD65
:1523AF00110977167EACB5F4A978543A0F4CF12FA27110BF1F74
:1523C4007D305A31164897E928B77CA2E21D94DE1B4D6ABE22CE
:1523D9004B2F4B114C5772E258F32AC4FBE87ACB96C1DAC1428D
:1523EE00DB8F6AB5E09123F1FBE89D03BB809BF26BEBC51EA3A5
:15240300D8075C6BE7D35DF956A45EE8A0FF38D28DF558CFF983
:15241800761CF31EFA82FD4FC0D1BB73480B8ED9F050BAD3EE10
:15242D0016BBBE9E19DAED77B5BBD5CEF78C2BDF4A6A17F99220
:15244200AE7C6D76BE8119E05B99FA661C67108E0818BF1BC70A
:152457001ED815824521F89E16BC734CF8CDF47E8F6065D6BA3B
:15246C00E01517ACDBECBA5F9C01D661170CDBED7C2FCF00EB9F
:152481004957BE1D76BE573E0056D0D881F5EA87C07AD5056B9E
:15249600CAAEBBFDFE1B61EDBA3F0BC3653B5FF7FD37A1E7FD24
:1524AB00597A5EBE093D2FBBDABDE2D0738676FB5DED5E75E845
:1524C000799376B76CC0F81A050E8C0977BBE8AFBD7E8F74875A
:1524D500E71FA7FCFBD95086E737782D9E7F5FB2783EB621DB46
:1524EA0076D46BB5FDF0860F681BFBA576BB4E7B93AE7E6EB0F7
:1524FF00EBF8E2CC751818B38E6FCEB5E9328FE4CBE5C1ACBCF8
:1525140013E359ACCD22E69421FC099832624057F1F93BF5DD6E
:152529006586A6D0FCA0AC3DA597F213FA3E9A12DC32E809EAA9
:15253E00D74CB2C729179286B4FDA437825F2CFFC7BD644B24A5
:152553003BE0EFBD52D4959D1BEAA82E0FCD0B19B94A7A896F04
:15256800DD9090A9429E3AF3451CF27448C853650DC14F725439
:15257D00723D4F9D8FB0DFDBAF4965869EC61A18F6DAADB37498
:15259200F6DC346CB56FD8F234DA678A35D5F121C3EACBA0069B
:1525A7007F17EC0B189897C85E99ABBCA2FB48E7C6DC34E37C24
:1525BC0032945D0FC73A1CF6944270D7856FBEFD9BE6F339D379
:1525D100D7C2AD75DCA3864CF348A0419C756301E917FA933497
:1525E600B72D10BAC911331264D1D7688EF6150D0A9F0E2B1601
:1525FB0058B5D807DA5DA66AAC7E2F6F13FB0B3D64EF579AE254
:152610004CDCFFEDFFC3BD1C30B36DEFF238D159C0EE7ABF99F3
:15262500F4B6E5F4FECBEC1F9722C609FAB0ABEC88735E5915B9
:15263A007D237D48F44321BBE2E3FE0FF4F29215EFEAD9B4A1AD
:15264F00E175B1F412A7AD0ACDB2D53F4A5BF1E48D7535C6BE43
:152664002BEA8A7E40F918952B5D33B5DCEDB18796587433CC8C
:15267900D5A09B5D2E4C79FDD3F2D6C52AECBC2A17FB43365DAB
:15268E006591AFC75C3061C77B237CE26C5D5D2CAF51ECBDC060
:1526A3007F53E44F7092F13109F989A7113746B6E2C319880F2E
:1526B80027CE3F132F89B399E383A67B3FA9F5886B3F087BA603
:1526CD00DB388F603F272A6C1B71BE5251E0FF613FAB3807990B
:1526E200DD0FEA75955F18931B9D3D21D421AFE17A8F589B1E44
:1526F7001C9E74EDA33AECEF63A3F96FC977E57CD9F39EF47519
:15270C00E951E9335250BAC6FE8EFD35FB2E7B990DB1AF319314
:1527210075B30EB683FD2929DA5F628FB147D9436C23D3D8036A
:152736006C3DFB1CBB97FD015BCDEE66ABD84AB6822D67CDACF0
:15274B008935B206B68C2D6577B07AB684D5B15A16669F66B73C
:15276000B34FB11ABA7E8FDDC616D355CD3E49D7AD6C115D55E8
:15277500747D82AE857455D2A5D25521AE72BA16886BBEB86E5A
:15278A0011D73CFB2A1357A97DCDCD5C21FB2AC95C41D735C7EC
:15279F0075154FB902D32EE5866BF60D57D18CD7AC9B5EFE0F7A
:1527B400BC0A3FF42AF8C857FE875E3E26CE181FB7D6B754E111
:1527C9008B4EBA3DE9F151A61E475A15A519F673353D8FDBCFB4
:1527DE0035F4AC48F48C35BEF26ACA1FE1065BCDC7C95E5024A0
:1527F3008D2BEAC2E34A8CFE93F49F5A785C8C2BB11E522DF667
:15280800DB55D54ECBB7D3244A8BD96905769A87D292765AA167
:15281D009D964369A88FDA14B02B2C1AB6EB825F60D8AE037E98
:152832008061BB2CFCFEC254262AC16651F9F04B5828BD8D33C0
:1528470075E1016F6899A8272AE2EED41AC549A9CE776631CD9E
:15285C006B95077C671A843C887FC0BBE10F78073F38BC2BA2B2
:1528710077946E225D7EBD41176D8F2F361DDC3938473FC66D43
:15288600189561411343153E7661037E200CFD1465C2ADC02FED
:15289B0070A878ACFCA96FDBEF99CA9BD485A661D7C35EB1D235
:1528B000A3942F8A754A65A129FBC8A6BFC93D2A65F38CBB9EA0
:1528C500154FF6D9B0D345FD63E9D988ED64F947AA7C42ACE7CD
:1528DA00A8563C48B12EAA8A5891B9F6B3F043F310AF617D2323
:1528EF00BC8C477FE16109CF32332FA4B6CA91067DA2B241C487
:15290400A998F8AEF70EE004BFE12B3046E5FC6C19CEE49A35C6
:15291900840B529EB84FAD33F3D86D04FB6DA63714691D9F2168
:15292E004D91AC34A6BE67C2BEAACE99AE9FA98648037FD3FD64
:152943004155AA9389664ABCBD4E86FF8C5209F9ED634A2D354B
:15295800B9CCA81171196A4DA6002E55C012F594521B8B0DB4AE
:15296D002F9F29D595F8E27ADC7DF1C575B847D1D7F1B090F94B
:15298200C82BF818F29DF489B81813CB7844F8D946901E4BCFE8
:152997005E4D79A2464CAC776BF659FC188F88B5932DD699FCEB
:1529AC00709B75469E6DB7E3F076D9677810F764360195205DD9
:1529C1002461182CA141FFC1EFF796CB77B0F10EC3AFCA752C4C
:1529D600BAD39844BFC655C35A07B2CE2DD7A472EA449D549F2D
:1529EB00386783E768AFD15516D72431FFF59A9973E3D1FFDE24
:152A00008FFECD579F3664F575D21913464495EF78E9A197A820
:152A1500FED7FA918EB41A4A3B302DAD94D2764D4BDBB69CE0E0
:152A2A0052DEEEFFF243EFD49262C6FDEA25633B3BC3E7AF7812
:152A3F00476FA9F869EDD7965DB17DA5E362BD6D41FC027C739B
:152A5400845EB160C5395D4E0E1A9EF223ADAAFAAD7E664C9A2E
:152A6900BEAE5EA193637EF68DF52D0D618EA47698F10DF3161F
:152A7E00E91D1D7828603FAD1D7EE8974B0906A2E92582EB9C07
:152A930021F17DFAD736BDCD6F89D05CACEC330967F1EBCB57B1
:152AA800D5FABAA9BDE8CE617624176BE5C33E1F7483DD077C9B
:152ABD00ABDFA1F4FD07ACDF2FD8BFBF7DE00CCDB7C9EBD3C29B
:152AD20060477FD89FF09C3180B7ED6C8CC7BF935BF7C413B97E
:152AE70075581F3830FE356DDEF9FD5ACEB937F4BBD985DA799A
:152AFC0063A774C41685FE62AD2F8E8BBE96287FAE4F3E7CC918
:152B11009C27BD46EF2F98BEF8B1A5D88342DD130F9F337CC974
:152B2600DCBA912773EF10671887451C98E3090FD90CCA090325
:152B3B007DF9EDA1CEFAD069AA5BF9078EFE28803BFABD611FD5
:152B5000620529BB8F2B02FEEF1F7F9BC66081BAB70B6BB57987
:152B65006A67BC27CE3589F49389CA1F1AD05192A4777CD58762
:152B7A00F83ABC6BA2F2D726E5DDF34BB5E68E28E5DF115B5586
:152B8F0007BB4A8C2DE59821279F2519E9AD8B8D1DAD63C60920
:152BA4006302BC47EF317ED653BA9C3C46FCD3297C13ABEDD81E
:152BB9006D62AC197BC53E47B5186706F725F7D2388B73996858
:152BCE00AB305E8FBB8FF13ADC113FCA97ECA33AC68C36EC2BC0
:152BE300261386E4231C85C74CFC061F627C9CF92EDE0D923EE6
:152BF800493A7F3261DE16E7227D8CD2F11BFBC81395DCF0C751
:152C0D00E4BA00E96B1827139583E63CB22746AF7BEF205C9AE6
:152C220067DE4FFB1482A789DAB8807115EEE71324839BA85E80
:152C3700963C68BE91F1E7EE32FC8481300177A193D733E374C9
:152C4C00BFF0632179D61D39A7FDE51772EBFA59A7D61FEFD3ED
:152C61007E5925DFD14FF6DADC44AFDEB3936B3D0D17C55EB4FD
:152C7600927ABAFFB645E59F11BA5B383E8C9824810509C4C806
:152C8B0032E627459FAC182F3EE8A37111C3A55AC6DEFBDB8611
:152CA000B41AF18A5F357BC6B806FF415FF22095DB0D3C8B58F6
:152CB50057A5A9A7CDF9A9AF9BD5849BF9D4D7642EF634778BAF
:152CCA00F159ADEE16BEF1A20E85236E9FAF54FDAA217CF63673
:152CDF00714EE50CC806393662D4A7BE437977D358E9A579EE05
:152CF400A08E3A3D6787442CE5B6BF60AC0CF62FD980885722D7
:152D0900AFDBA5539F0E78D6EDD3B7E4B1A9E3631CB16EBAF850
:152D1E0057DE92BFFFB424E82262000553F033EA177E46C029AE
:152D3300E2FE045942AC5F8A78669FB77CBF906E8EF56AA5A9CF
:152D48005DFDE1D4F3496505D77DA403E7ACE5BAAC72D3EF4371
:152D5D008CB783BC3AD2B714EBBE25EDC43FEA102F8DE3F709B1
:152D72003364FF464C0D4BEE937D9AF2D7210DEBC2BE8CFF7CCB
:152D8700BF8881E3016EC67B8D2A4107EB8CA2447637CEE55AC6
:152D9C006713AD3DBD37A92E896000ED413FA9EB981E5AD069C0
:152DB100EE8F58E7DA104346FA032EF47445D0D1107E6A8AE003
:152DC600EBE78E5F1636449788B723A748868D4F0A3C07C84604
:152DDB00F60B1F837E116FC72362565BBE6BCC78CA443C46C088
:152DF00029A5BEC2AB539FA875CB76C874D04FC8F58C4C27F975
:152E0500BE25B72598FA8D29E22C1E07FFED32F7FC2E5D520F81
:152E1A003F3B9B06C07130B5CFF0F05E3DD068C5BCF3906C4040
:152E2F00DC763FEB5DE2271E99C77A6B41BFAD2EDEDC6AD1C9B0
:152E4400D88E7BF99556C15B4437FC96C5B982B888E3047A8367
:152E5900BE22361FC632D1733A2D6551D6A2C387E1F623D3083F
:152E6E003470E3DEA1C7C7A04181A041BF1DE7284B8B0FA58182
:152E83006B6E75F03FF62DC4A72C0ABB69511CFB64ADB04BA3BE
:152E9800EDC3D79EFCE452259647F368BB01DB13B28A7F25B730
:152EAD00EEE2BF38F2C79217A544ABE205DC94A84FA01DFA68E6
:152EC200C53AB2DA407BA83B130F23A31F59F42873D1628780A9
:152ED700A7CB3AB740EF11574B49ED33253521F808BF35D77979
:152EEC00E0A0AB7CF0F399F8E022AE783F1B12FB163ED0BC7DCA
:152F010048F3AB5E218B15F007C99EB288257B32E38EFA2C6D48
:152F1600C1FC4BF735E7040E689C06FB7F6BF53735EDB313D89E
:152F2B00A3290D75B596D1DCAFB2E4F1301B3B1E61A9E3D72E7F
:152F4000A4F3E93E4CBF87297D58B3CBDF2CFF9137A7E6AFB6EC
:152F5500F3631E1FFD8DDBFF14F32C8BBACB8AB8C362CF8D1B4F
:152F6A00D79F94EF6882BF8B3A1AFFEA99535A2E9917B2DADB5D
:152F7F0085B84805EAAB5D38FF68F9838F8933508A3A42764A45
:152F9400C2F0A716D5C97F93CE071ECE5E4AE74FAFD30D9B3808
:152FA9003B48659BD4678CC99F71D2890C1173C9E2C33F330520
:152FBE00EF5AB19D267A483FAC233DE8E3F0E6C4CF7A8D84A7CE
:152FD300CB6047E496899F7133E1E9379BD41EF337D7313EE251
:152FE800B62DD26E5E86EE13361CBDD48AEB6E1C34A0034B3494
:152FFD006E003BFD3677FC17D2FBC25113FAAE83B39387B2F8C4
:153012006EFD7516BFF3110B22544A7A79BB7196E0DECE629CE6
:15302700A5C2FDD88FF2A7AA8DDCD3B5FAB7E28B6B3B972D9B72
:15303C00A22BE631F8892E13FA539EF428C98F35869A8AF63372
:15305100E557A6CF57A9C3D7D4D213172E2D205BC453AE8936F5
:15306600105F167AB6B7BD562F8AD4D617509B472BEE5C3A3F3C
:15307B00A5D25C576D94A6C286E46FD43B9FADE5DE31B2FBC612
:153090009799CE1E37621B0A5D5D6927FDB1AA56C65E6AF49146
:1530A50061663C7CC0D785F301FF49DC53CB3D7764D7834AED9C
:1530BA00B882D5B69C0A939C5AA6414F9FA74A61118F54C869C1
:1530CF00B241A83FB22B2695357F3E3F5C3676502FB3D7338382
:1530E400340F63BE65E3AF9801E9B25E5759F419567EA695B16D
:1530F9002B5C61FFB03428BDABEF53BD75D005C32413E74B43AF
:15310E007A49E864AB2FF20F4BE6D3DD73AE4FF8AD601D6FEEF2
:153123000AC4C23B69FBC7C4F9159AD78BE327F4C07CD24B94E8
:153138008EE18FFA3F97746FDCFB97E7D517C7F2C82679C5604B
:15314D00A9E78FBF41E3687EEA6903B24AC411A0FE07683EBE55
:153162005AD6BB2442BA0CE69B07BC86D05F7EFC0CAF75749694
:15317700ABBF4BDF546719FEDFE99BEA2CCB6EA6B344DFE129A5
:15318C00E7FC27640CE1CA57F985A505620F0F783BB53478FAFC
:1531A1001754FF29BE9E70B77F99E19CA917780AC54732780A6C
:1531B600A516D5FAAE604FB963587EFD14E473685E6A562DFD13
:1531CB00368A5325E25E905A20EE06C9F199FA4FF369BD67F568
:1531E000BBFAE56B691FF080BED6D87D9F78DFEAFBFC19FA8E7C
:1531F50032C3D73E7EFF1710DD4B2147A33DFD6DBF9966BF5070
:15320A001FC55AAA8B9E6BDD79A27DC63DAC9F6F201D3DF78709
:15321F00BD4B54F5345920295E2C91DEA55C3083365FCA381F10
:15323400A4FCC4DCCE2EF280745587DCBB65C5BB7A78EC3BF5FD
:15324900B73458F8BC85BD63F975517BB7C05E095F143805CF3D
:15325E00C1BF133EA2E5296F9D9367EEE94B19BCCFA5B28ADA53
:15327300DE1F2F4CB420EF56ECE54447FA117B31E7CC29BC3BCF
:15328800E0397B4A37D26427D1FB6AF50B4B71073C93CBF3EE4B
:15329D00D8F6D04F491FFC89E1535F3E50A3FEC85C3669F73195
:1532B200BA6BD88FF8AAC9F5DC7A86ADB46BF8CA72ABFC49C28D
:1532C7005BD0AEEBDAF2C796DECE5EA813B68E2B2FCAA20E77B1
:1532DC00B9B394A7E3A90B5A58FD8F4B908EF99154E5CFE1F98C
:1532F10019CC91D15D49E89F285B803D65C225BE1F33BFE7B062
:15330600C0EB3C957402BBFEA229CF736B3DD6737F813ABB967E
:15331B00EE86A7C8D2CB51BFE7EB7B74A1037C876405E9576696
:15333000E4794D8924F4529A3B443C16C53A83F361FF34A7745C
:15334500495DEB75F8193265A7987794129A3FEC7947CC41785F
:15335A00F731E61F67EEB1E7A119E71FCC3D9883EAC599FBCC51
:15336F005CC3D5316BAEB1DA5159A9FA2B730E74099A977C6AF3
:15338400B7B9E5BDB4AF20C9BB0A08EEFA48A2CEB1FF4A691EE8
:15339900439ED5EF39F4EE349AEA2CBB716254BC37F03E4CF834
:1533AE00417996BC6C486557881F39D98D5D3C37998817533BB2
:1533C3004A72A41F632E27758AA34EF01A78AE5AFDD901F0D4A9
:1533D800C5F71DFDCC8699607DA3E7591AC3EDC6D65F58F3BB94
:1533ED005897A5B6467F951D5F8190E5EFE1B3CF1924432C9F18
:1534020074CFFC2B01EB77DCCBF23748AC707B0ECBC77986F8A2
:15341700D8D46F3B4DFC2D4D4C1711129DBA46FF6DF46FD0FFC6
:15342C0030FD8FD3FF04FD2B3FA2F73FB2F28ABD83A0EAC46896
:15344100E467C7F0E1884A1DB1F06F555B97B0FA5F755EA47C51
:1534560015FDCF100EAE926CBE6AB2FA761EFB4B7B9DAD7E8045
:15346B0027E9B947F5B62834AEC7DE465F470DC4BC14E73EEA46
:15348000BB39DAA977F43BCA1FA7FCB7B2BDCDE299DA539A5FFA
:15349500340CF4433961C0BF36B4E298CE627B39DEA3EC7EF867
:1534AA0063217634D5592CEA7C45B429621B7D601DC77851E412
:1534BF005433F2A3CDB9A11BFDA9597082F7B2ECFEADF0DF0892
:1534D40066CFECBF799A1AA43993D59FE216AEE1DB316CF5B34B
:1534E9007E888B36C73B0DAC81948C1DD3156AB7247E54878F79
:1534FE009EAC4E4DC31A888FD202E35D7ACF84A7C5FDCE47EF92
:1535130042CA7FD3FD64878E601FD4D97725F8FCCC155F697AF0
:153528000CA57FE37B9C131A0922364775EB55BA7B953A1D3188
:15353D0072FDB14A3397CA5C0BB142F9BFB61B56BC617917D2C3
:153552000629CD1F1BA03967917E71B9749757E9D0C7290DF1AC
:153567004BBB903F5669E07C8D8A73A29426C706CC61A4D3B355
:15357C00417C7B9164217CFC6BE63271C68307B23609CE1C5FF6
:15359100F558F1B2B6219DE007C079471077F45DAE9C7F464330
:1535A6003F4AE11BA48C709FFF98BE8E6CB339AADC92973A2800
:1535BB00E2B610FCC5A114F2EFED90BA7B853F27CE18DE966C99
:1535D0005AA2F82D5F0BC466982DEA1C3AE0A33C3E2B4FB034D1
:1535E500292F918EDC589645F304DE0C9AF7AAE658DF8082FF11
:1535FA00BDC3E7E373E0979EC8F887C9EAA4D95A427822B92460
:15360F00137EA2F4CC66F0E72F25BC5BDF3CF96B737BEA6F0F36
:15362400C897DAF5CBC553EBC7F744DAECFABDA1B156CA6B50E9
:15363900DE7ED4B58764E75A196B3AED343E2254FF6AEE53F13D
:15364E001C6D853FB7447A2EE9C2A65FD5CDB504838C33722494
:15366300A7F17D95F96A3B87DCDC537646C37AECAAD43F13CFF4
:15367800FEC05C4DF724F1C25ABAAF4E7DA61FB410FEE76AEDB5
:15368D00011FD5514FF59706587E581DE0169C5FE8079C388F73
:1536A200BD92F475D8309EF258EB9EB2360DF23E42EDC4A82EF4
:1536B700CA773C4AF7CDF41FA1FA733167184D7C436AB919A3B7
:1536CC0076A2A9FDFD38F3B09ADA89AA3D070E521E8DDA3AAA9F
:1536E100D8676C4987403B84C0923D6549AD551D306304D7662A
:1536F600AA7F82F07335C00A7D54E632DD714E9EF8CFBC46CFF7
:15370B00ABA88E8900CE1924F8167A7E35007E575BDFA4FB6AE1
:153720004A93296D989EFD418B46D371ECA697F7525CDF4C7926
:153735008B55B939C745CFB03A48B8867F31F68427699C0F9A63
:15374A008A4A73DA349A875F9B2AAFE12FA284734806776564EA
:15375F00301C123057DF4DD38107E71CB78D7051CE386594ECF6
:1537740018B4E4DCB663960C8AEE35E0D33217320A6B58888D3C
:1537890019957765DADD3669CBEF1E9249581B3C684A65713D24
:15379E00E37F4678A0692F9FE62E23389BE5E3AC06D9408DFDF8
:1537B30012CB273E32A89F8D7E1AC705EA82CFACCA63F9F3E96C
:1537C80019DF929195DDFA28F169BFC20ABFCCAA1A494008FC7C
:1537DD003E42CF09C5C26B39AB6A8EDA721FB240C04675602E4B
:1537F20088501E12E685CBE8AE282FEA997874341F5FA8686FF7
:1538070084CFA788BD46F7ABCBBDCD0AE5DB5A7CE31872C60954
:15381C00F6CC300E2798F50D3C278F9FF860A7FD9DBA72D5DBD0
:153831005C4DF5E4975F213A1D9A820B85FA73167CA3DC26CE74
:15384600D0EC8AE13B033DC613915ED1FFFC4FD3FC46F800FFDC
:15385B002D25B4416F7FB508E30EFD7AD1C01CD1C83A455EA932
:153870002CAC77E663AD63C0AC72FAA5741B32E916D5E0BD40AC
:1538850017740503FE7E0AD581323EF5457AFF2B33BFC82AC7C6
:15389A0094174DE0783BE5CF75CD5B6AD1D4F59B6B45AC3048CA
:1538AF0079268AC0F35546428C936A314EE0DF0499FBE6F5749D
:1538C4003EFC750AE289466FB45A57D54AE3CA72A97994CAD023
:1538D900382EF4BAEA2FB6CFD665ED55D598781B01B576EAA8ED
:1538EE005B39FF7B22D6307CB5B09624931C95A9BE2292F7E8B6
:15390300C7C44303F50FD2337CAD64711EC8D603E0E3F536F634
:15391800F82CF8E5D810C9A4170D712EDDD255D3C53407E3FBCC
:15392D0055B2FA8C69CB9300BE0D09F926C33FC2FEFEC424D5C1
:15394200F3E318F1606CC85E334EA7FF6A6CB0D14FBF713687E5
:1539570045DBF9F642969F5B4934B4EBFE2DF5DDE90BD67050D7
:15396C008785AB230257F0FB0DB1458D4E7F0AA80F93158B9A3D
:1539810071CE7372162BACB8981D3F326414D96517C986FC2802
:15399600FDC4FE9B809FF409C0E21D233B3B3A4A750D4057248D
:1539AB003C7467FC45BC946FB480E5DFA30276AB6F778D250892
:1539C000B735A60337F611FFC7B19F1CC5FA83A82F84B58C55BA
:1539D50007A03FE3BD903D36BEEAA7ED4F59E36515B7F15B828E
:1539EA00FD0F3FE5298EC9CD9B73B26347C9AFC1B7BB047ED1E3
:1539FF00D6BCB141D2A306B1A79816E71AE9AF3CF242E3453F3E
:153A140070F373DD194F23F6F95EE80781F1A7F4C0F9255AB02E
:153A2900BD419F97929A049F19DD7C07CDEFBE50360E0960AEE7
:153A3E00639F6A862E3096EFD0CDEAFB6FD177AA0BF97136C947
:153A53001FB3E28A20CDDBB448C46C9745DC120BA6BF2298E058
:153A6800DF081AECC7593A9A0333F44D791BA103CAA9534601AC
:153A7D007BA57132ED6D9E97F23607A7F58164880F78925343FB
:153A920037A72BE1183038FCE84F9D30FA52DE9650D3908009B9
:153AA7007066F4D570B5A08B22F42AC0FD29EC41091CCD8B0F3C
:153ABC00D43B78D94C32D76BD3CD473A5451A5D468F5CDC2C5E5
:153AD10075C1E30306C64D89DDCE3F52F98FD3DF85D4DFAA4288
:153AE600F437ABCF839FB723662FF1815F75F529F6B2D117930E
:153AFB00B27D52AD3E59F850459F9CF3D2363D44BF0CD798284B
:153B100076E10E7A01F0E6F4674EE84A2BC9419A7F7F6EE6B539
:153B2500D3F852F6F0373C969E087C6C60D9710F19B839730EAD
:153B3A00D7D28BC4B96ABBDC412A071E49A28C4B9E857F379504
:153B4F00FFFDEA51923983FC4F2343B5CA8E11D12F5FB2D374B5
:153B6400FA0C79017E2F16B1E59F35DDB20973899C7CD6EC230E
:153B79005D5321FB3E4032DF9F841CE3A6D5CFE12C9D934346AA
:153B8E00A8E984C04788FA60AF6F171440BE8AF1C5752BEEFC13
:153BA30015D1DEC2152FB8C697859FA2D38322FE2F70F7C8C3D1
:153BB80096BF2BEAFF0EDB4B7C3068049A3A6DFE1FCCF0FF61C9
:153BCD00E27FC0073B05EB7C820F62E003C3E683D10CDFCFCFB8
:153BE2009FCAF747057F0E66E9AF8E18A82BCBD3832EFA774D11
:153BF700A33FE0D96BF537293763ECB8C70C7ECB49C4324A1863
:153C0C004F936CB360B6FAB98BF8DAE1E110C1574C7CEBC07AA5
:153C21008D602D2758DB7C37F2ECABBF01BFBAE08D11BC311723
:153C3600BCAA1B5E4B36BAF502A5A953C0EBC8216B6EE8123030
:153C4B00CB31CB87CF8824DA8A5C7362EADA541EC4B91256DF0C
:153C60006BE0FB53B01DB5FF952ECCF01FD92E6F2256C061F98F
:153C75004E2566D92FC591A33AA972C52595724BE07CBFE6913D
:153C8A0058600EDE8D8F18CAF9A426930D739CE055C8E6958910
:153C9F00C7B0AEE5F321561CE721A2A74AB64FFCA9DE960EA415
:153CB40077FD33E6910EDFD953629FF44AC5DE3BD8F8A8618648
:153CC900A516D4539ED88B98C1C1B988EF41E9896EEC77ED3513
:153CDE0065AA0F7B61E237B52B8BB5FABDA62887B68CBD387FDC
:153CF3003CA73C2937B65B653AE26413E16C936F2DD785BF237A
:153D08007C526C9B08B0A2FE9DABB996B36E528FD370E9FD2C8B
:153D1D00D7D06799CA94278E6D02FC98CF010B60036F2E2318BE
:153D32004ACE9FD4E662CE7FFD59BD98719A2F92DAB7302FD91C
:153D470075E2FB086DD4579473FABE8BEAEFDA7742F851827F75
:153D5C0044DEE84887AFFB9FF51460A33EA12F6CF220CE5EA6C6
:153D71008107D29D39F0B9142C4BEF1D5C5CCCE0C16A2B830789
:153D8600ACDF8D5B78087D576EEC5A873DC921DE4EE9BD185FB6
:153D9B008413A4C13644AC330BDE538483631AEACF59F76B7D0D
:153DB00087C0C3312D40FD030E149C3BC6DA3BF4326A0B310BAB
:153DC500C3D47E39C941271EA1751E24CED93B8CED29EBD2DED5
:153DDA0023DD754198FD61952ADFE5C45B1FFEBC88472874DE64
:153DEF00D5C2AE5A7420286268EE16DF804059E2EB7CFA3D8C92
:153E04007DC0F17F72C5B3251B113184845E087F7AF8A685976F
:153E190071863C4ADD01D249C6E2D5DE16C957A3CB91C5FA20AF
:153E2E00C18AF80B48AFD0FA750573907A6FA34FFDA346457D70
:153E4300A0598EAA3ADEA54847C77DB3388FF4E722966149836F
:153E58006A5AF51E860E34B68CDE5568861E8E0F36D6501DD54A
:153E6D00544795FA40A35347A9783FB58DCBCB1F10F5FA45BD41
:153E8200BFEA70F25ABF0F1B89E57D778A33DA0D13565B510BB7
:153E97007EE0EAACF0EFAF36A3948E39F62A6385D2EAC5BA120B
:153EAC00818E68F793F20D8A7C61BE01E58DC526F28ECD90178A
:153EC1006D6F07ED92569E8337C9B30163D3CEB3FD2679C294B6
:153ED600C76FE7D9302D4FAE522FBE37847CE095ADCB7F762708
:153EEB006425FA21533F719F43F2DCA79AE64CEB596166FBCB27
:153F0000638C2A8363D86F147A0B3DE34CAD88371B8D0BDE2D37
:153F1500B1CECE67D68424C9E2B74CBD549FEAAC1F093F34B224
:153F2A004F7F90C3B07E029FEF94A06FB6BC150BEB8881746A9C
:153F3F00D3AA9FDE958C3FA707CF3FA7C1462DA1B1126C1A1181
:153F54006397F836A0B013F598673FF7560E53E3234B133497BD
:153F6900FBC9362A461F146E5A3E6FC233A400318BFDF1634B40
:153F7E00A04B237F10F53B700839DE65C11749D48BEFFDD9F533
:153F9300CE8F0F2EAD99566FC60EA6B941949F617DE61FEDF10C
:153FA800877EC15626788B2F63DC2855D9F2EE785B347E71160F
:153FBD00EB9F662877745A391A9F379C27B4CA1FE23F9FA1FCAC
:153FD200D68F50FEDD19CAD57F28BC87F89519CABDCF3EBCBDF5
:153FE700D434FD0AFC1274F31FD6D5FFC9F54DBA19DEC7AF7EC8
:153FFC00F0FB890F7BFFEF5DFFB4F77EF778F8A0F5D6FFFFFE71
:154011005FF55E71E1BF789A7CFA7F077E9B3FA69D399A78FFE4
:15402600C6F1F061F5B9F94D2A3BA2F779129B3F2ABF61BCCE52
:15403B009155FE79711EAABAB553896D5E49C3DA1FF8828EF8BF
:1540500077F80EB8FFEE6E1D631E3A823FB0459FB5AA5B57D5B8
:154065002FF15977B7EBC1755CF34B957AB0A8524F90CE66CB4D
:15407A00874DD7482F5102D53AEAFBD7D675680DD786E173B5CB
:15408F00AE4A877F33BC776435A7E57192F925FE4ABD605D8D23
:1540A400FEF5358BB58A758BB5907FB3DE99F37B1AF6A316C828
:1540B90031C4C70922AF2C7D4217EB40ABDA850C822CAA284A4F
:1540CE0068F08372DE178BF78B756F202EF4DA8A07E3BAF0CFA1
:1540E3002438CFCED0FE4ABBFD426AFF10B55FE26A1BED9653F3
:1540F800FBC827EAA5FADD6D5FB3EB9D70D59B4EFF34ED474C7B
:15410D00C55AD6B29E4C18D41DCF8971E022CDACBA6EA7297B4C
:154122002EE1C54F6DE6AF5D4CF8A9D416F86BF4F99F965BBC93
:15413700AC7D63C51FCB2D87662704FEB12E457378106BA2B712
:15414C0009DD240BBB881D01FD90C59F147D2398CEDA308DA2A4
:15416100EFFE0D7AC5BEF5BA54E4C096BEEEC0D648B095FA2B21
:15417600457A9C14638756F94535BA5FC0D4AD2D284AE83D3BB9
:15418B00F764F80078FE6D3A6DC3C0443F71F6CEDA779D78128F
:1541A000ED8EDB7048655DF8269C6F36B76008ECABD203D41E5E
:1541B500FAD662FBB8C3394CE0252F8B970AE29BC2B54D7AC9E4
:1541CA00BA7A01CFEE9C6EAD80F052E84FE8B92CB1718FCD975C
:1541DF000B45DFB3ED5EA1B60C7A17207C11DD8B1D1840FB8A9B
:1541F400D51B34D8DC15EB3668D3E94F83275020CE13B2828A7C
:154209003307C57BE95C8D5EF2604C97D997F45994E780C44203
:15421E005EFB791F3D17AE23F8884F0A8BEA75FEBD06EDD0EB49
:154233000D5AE1B9B57A09A7B47DAB74FED97B88DFEFD140FB92
:1542480012C265C55A0B07724C6A51D9165E4F38F34A0FEBFE75
:15425D00580E62F807F3B15753BEBA7596F4A8EE9757EAFE153F
:15427200D4D6DD8FEBFE55F7E87B73566A5823975764F3E7852A
:15428700AC3324227FA2D6CAFFDA1775FFAB0DFADE9DB59A97C5
:15429C00E6ECC0F7366B159FCE69C177627CF1DA8DF9630D1B06
:1542B1009FC6B78679AD5E71EE615D3ADBA073CA2BF9B2F8DF16
:1542C60086311D12674E362176B4AF9DCA9D6ED828ECDA65ACCF
:1542DB00253710DE981758B6B1A26BBDB69B6401E982C5BBE8C3
:1542F000FE879031FFF331DDBFAB41870DA1AA8F72B16F98F838
:15430500A22EADFD922EDEBDD640EF6BF5BD842FD01C7C0DFB89
:15431A00ABE09B524BC539C21F6FD74BCE7D512F3CDB2DE8DE86
:15432F0043749F45F42E88F08D6E39045A835EC25FD7A623F818
:15434400F06E82A505F0138E11377A1D3D2772B66AB3A81DC03C
:15435900DFB9D37ABEFB7ABA0472C8F98DBC34AF6C3A4869289B
:15436E000B7E36C98C04FE20E7C8BE9CE3F0D276CA237CAB09C3
:1543830086ADF41CF8DE7CADE26C29E1B3549F896F7EC9B27C78
:15439800F377CCE21BE0BD80F826E4DF2A70F1759B77C03725B1
:1543AD009CD2A6F14E77FCBEC70A425B8826B1D66EF6E863B372
:1543C20042D156C9FFB8EEFC2E8C3CFA186833AB7DFD46F67A95
:1543D700CB46E75EF1AE477C1FA220BE7E63E158CB46299FE89F
:1543EC00FC894AEE25DC5F277A0367B70BFC7B5A0A7907E1FE98
:1544010071C2FD1E21B7DDF8CFB1F19FB0BE4B11947C9FA0B6CC
:15441600A39BCE085A8057A29B46A7D102DF6D7BD0A605C9D76D
:15442B00E2F52E5ADCEAA2C57BC287303B8677D2F8ED75D106C1
:15444000EB55A03BD277D8F4394FB471E8B1659AFFE787D1E3D1
:15445500828B1E7F65D30363B8C4A6C50D7420DAB86991177966
:15446A00E4B1DCC8FAC7D876D6E21F7B64E32C65CBC63CF69F69
:15447F001F2B88FFC946FFD8A3E277C51F8B315AEC67F43BF207
:15449400258177794725F7908CBD9E17E5050EDE696C16FA775A
:1544A900929CBB5F2F5CFBD414BC17CC84F7AE85A0B90BEF3177
:1544BE008177A7BF6EFC936C2FBEDBC63FD67C30361CFC17BBB3
:1544D300F0EF116B37167E7B6DFC164136D13BEC33BBF9DE2957
:1544E800FF4B21FF2D9AA19C887B69D3C1C279FD14589E408C43
:1544FD00AAA4D48273D5099237B954C72304C3A17B37EB15EBF0
:154512009A34256789969773A7061EF693BC61AF376C3CF4031B
:154527007A776EAD569CF3592D3FE70FAC77D2CA8D6CCD3D1BF6
:15453C0077C73C2D806B2170522ED6B603B9AA47CC8548473C72
:1545510037C7A641FBD89BCA71E6687B9E403EF80E03AEB7C9AB
:15456600ECA43C99F1FE1A8D77CC5117D26905EB41D003684EA5
:15457B000BBE6AE7FF163D57BC2BE35E7CD2EA77C1FF01EF9849
:06459000C0E6B892000035
:00000001FF

View File

@ -1,906 +0,0 @@
:150000001F8B0808AC5A10380203706361323030655F65636428
:150015002E62696E327D00DC3A0D7054459AFD261333136278A4
:15002A00192663E02479728060A10E9063213F64F0700F3DE05E
:15003F009E6CDC7B2F3514B35EF0A28B9A5A731E554B91474C5C
:1500540034E11AB6692618B7609D8404A2121CA8648D7551435D
:150069009DA578A56C8AF276A9AB829DF3AC92DD52CC5EB177A0
:15007E00D4CA32F77DDD6F665E263FA25B775B7753D5E9F7BEA8
:15009300FEFAFBEBEFFBFAEB7E79F4A91F6C270A21A1870849C1
:1500A8007C974CFA8536C11F37B9A99FFEAD9C49302569258321
:1500BD00D8EF4EEE6E14EF59E3B3EDFED3E3C735EC67E50822CC
:1500D200A9FE0FFD29BF7CEA97A26F4EC993D537AF13234A5E2D
:1500E7005EDE94F3BF245F4AFCF1F129E7CF9E866E0ADE2C3919
:1500FC002BF0237F849F3240F688FEB5EC75792D39E3BCB43E9B
:15011100C9A9F54BDE24FFBC9C3C6987DDCD33F3938CB0674E4E
:1501260078D6F8D7D63FD9DC8CEEABDC4824B2F9DC949E391965
:15013B00FED7BF11FF975E7267F17D1CFB4BE77E3625BFBC0C26
:150150003F0FF9BFFF5372CB72671A1F3D3EF99DF51312ECCF0D
:15016500C070095C0E5FF8FFFE4B3A7E246851FDD31C5230FA46
:15017A00FC0A35E009832F79ADB5E45140A3A4743C8CE3E39F62
:15018F00C35BB09DEAFF05BD7A95BB3DADE6B56DADE538465425
:1501A40052C90E11EF08B4773A8857FB013CB7112F090619CEAC
:1501B9005B125380AEB695F80197D874FE9A9022A5D554ADE572
:1501CE002661CA73EE80B5F5F26AE22D7F9A78FC814838484AB5
:1501E300E8B36DBD4D843D4C4930CE42B06FCC091861CFB9BDAD
:1501F8002621C3B438D010BE6DD7091AF29090DFEA334930C6AA
:15020D001187E86D9CB09E2EDF18033C8DD220A9BB6D57390DB4
:1502220011D2D8B26F23C02CEA0FAC0EB76CBADB3C4F48F1BBF2
:150237001157A5EBD25FC0FCCB804A3412ECA211D133EA167DD2
:15024C003B8518510311A53A5FDD62226D9C4BD46AEA567ACCA9
:15026100362DB78EE8A7683E21017F201E4E927EEAB6169944DB
:15027600AFE1ADE3AEBAC0C53534B0EE4194CF8AC2FE47C6065E
:15028B007960DD5253D1FA6834346000BC45C0D909BE0A681025
:1502A000BDD7BA4BDBBA12ED8A7C09EB8EA79BDA6BF9816681AC
:1502B500F70EF3723259F4518D59F578B3AB0A66E7A3597F0E69
:1502CA00BA90E04E5BEEC669E5765D2A33DD6762936427C1D5C0
:1502DF005CDA40CA8A7AA03EA807AC0147BBA02E52A72974180E
:1502F4007B956F461DD851EB3EA14348C8A0EA9689F2332DA72B
:150309000E7B941FFB00D8FFD6801526637B69AB8FCC22A5F03C
:15031E00ACF65863355BCB4740B7F5A05B6A3CEC239954156CC1
:15033300E7B09E9AA7F084F085DB760DD171378910B6285EA406
:15034800F64A5F403DE05D8BB4C2F800BD8EE3418BAF06B8AA3D
:15035D00EE81F5E96393DE6D3B92E0385D564748698085091946
:15037200A79EC256E0D34F49792B1D759310AC032BD6FBCDCEAF
:1503870038D845EFE5456A87F95932097ABB5B050D98BFE30F8A
:15039C009CDF2BE6B767E667E6C6EDC6D24DB7E7A56AA4888777
:1503B1003626DE3B6D253EE5C5810BE19CD8095A7CFEB241D8BF
:1503C600765A663C6DAE8CBC4EF7B70D35420264F51833C16105
:1503DB00A6438F32018C232C303A64E29A23DCADBDCAE604CE52
:1503F000C2DAFC0BE48392B027D20C3E546386122FF0964DDB3D
:15040500C0A7BEC35A366D323B120AE8B357F8531ECA1ED46DF0
:15041A007F6AE732A6800FFA49302E6321B8C48EB97E560BEFE0
:15042F00458110CC6910FE9B84D825C10415992A67940623CBF7
:15044400E9EC584E5DD1912DB4E84C9DA9C486689188ABB8F0F0
:15045900BD43E494A124DEA49DE43503E75D87B4D6F9E7F81CCD
:15046E00E748EF05F296419A062866F84EF23AC04791363CBF24
:150483000BCFC31CE5D213EF71C44759162BA4E81F2077148DF9
:15049800DE677E1BF429501F117ABAB5A3E037FD527EFD21DE68
:1504AD0072EB2653890C502FC844D803BC937403BD7E2113CE66
:1504C20027FA51FE0EC4AAE7DCA04906DB38E62BF04FDB0E52E9
:1504D700EFC24B09339A731CE3886F2C203A191CE0A344E0591A
:1504EC00183F514DC49F88258C471F213EC2FAAC68A8CFB85650
:15050100D6535DAAB92A3CE7C0EFCB0728CC6BDC33EBBE3AF4E9
:15051600E76BC964B19EF8949519FF64CE568E091F74150C995D
:15052B00885B1C83D82FEF43FCD0E167A306513B39C4E31CF4C7
:150540000131A6FE965F4D26FD9E7387CD79E78E9AE46AAF90F1
:1505550009FC2A0E7E2562E5D1C8C62AB40BFA87E7CCA98C1F9A
:15056A00E07CDB0F02E0079ED07A136DD5DEE892EB27D74DDAA8
:15057F009075F0D47A1E222F1BA9F524FAABBC1763C2F6998923
:15059400F69376FBD1FB4F007E4396CDFA85CD8A1BD166C3B678
:1505A900CDE268B322323660755A03C6B5E64D2B053DCC1D2390
:1505BE00D266445F1497ADAD0B68E03E15BF6D6448D8278AEB56
:1505D300C80678BEF73EB0C30FE947E092E01FC585095735DAFE
:1505E800F671D7EE55CF245C958188AB5ADA037C046D01BEE121
:1505FD00BAF4A9E9518E9B1D5AC626FE09B121732DAEABB48BBB
:150612008C15B459DAD7B3F32CC428FA34D7B6547ACE7D067369
:15062700345B4F0631B39A266B102748855D9AEE95FAA9DD5677
:15063C00D4EA35EAB4875792D2583897B499FE5D3F12FA91FA31
:15065100A3343AFA18E487C7B823BF7489DC027E87B620FA20D5
:150666004FD1F043DE9AE5B0C528F877AC664BD58D1BD21EFFFA
:15067B0059BA7B79AD423CD23EFF6EAE509A67B0CF7B609F6360
:15069000FF23F63989F6D9BCD64CED8550E85072F557D21EB076
:1506A5004745AD6EE339DB1EF3C922D37F7DA9B0478E5E629653
:1506BA005AA5D57F827B8FBE9F46125FF04F66E1FE5412866761
:1506CF0086F945D818ED469ECAF8A08A7BB46860BB6E87ED4EC3
:1506E400F114BF6CDB45C1764D60BB8F6DDB5D00DB21FF8083E0
:1506F9007F83CD7B22DFE3C67E6F5F26674C9F2BE638724555DF
:15070E001A0F7DDA111F0B20A778361F4BE710B11F8EC13CAB3F
:15072300CFB85A932B64C35C82792494788F611E51E60E9B4A3C
:1507380007E413987728E1C8273927219F0C603EF1E1B81893A8
:15074D00F9A4D8B3F9A4F963E02D724A539F88D97980873AFBA5
:150762001C3A37E59359CE5C33A1781D3BC1DC9B7BCDA235ED12
:15077700A29E2C523E379B4988CE17BAF7F3909FE8EF821F7925
:15078C000AB11608D25AE1474B445DF7FC5CCD20E5FB68A3A870
:1507A100170E70A2DF010DFCFD7FBBF54429CA4C9ABEA016F86E
:1507B6008190DD315E0F7E5103E34F925FAF825A94A30ECFCD41
:1507CB00EDC7BD45FA3FEA06F6167AA890B7BE6EEB8ED2E275F7
:1507E0005F9819585F7C7324B932C5ABCC90B5C0CDF0B262939A
:1507F500695544DE16B4F419E647605EC90313E7DD13D9B652B6
:15080A00AE1BE31B70DDEC7941C02DC8C25D1129B371352AEAA4
:15081F003D7B5DDD02EF009F3F4EEA549887F684FAAA68452469
:15083400AF42D45290DF570BFC56BA0BF015C4D73BF911F04B90
:1508490037E243DE03FC62DCA7D1977CA206EDE5CEFA7063BDC6
:15085E00A3BEDB4CC197290D617DA68BDC791A7B55055EA967AE
:150873000D7A477DD7EA98BF20E2AE48D57848C3FD00350F601C
:150888007C421EC69849CFB37FEA060FC6604F20B001CE496318
:15089D00F45BB141FAE3B6A126DC2B99A8E7346641AFCCBD0C5D
:1508B200FC9F80B3D24E383761AD1C83FDE1320F41BEF0EFBA70
:1508C7005F9C89FC501BE39EAAC2D98AE8F5D48775DE582DD4FD
:1508DC0079C130D653FB649EE04837404E899AD0B2CF592B7220
:1508F10048F13F47DC707EFA7B13EB3699AF0DFBFCA4DB755C24
:150906003B75477AA046AD605EF541B3E5D6BBCD36A0A978FFF8
:15091B00C6DC8B750C9CBB3007DDB2E7553337827B40B7D80387
:150930008A033190A792DF42FECCF4C379E3167106B1EBAEB1A5
:150945001EEEC7F307D45D9DA1DE74BD05671CBE429CA18E43BC
:15095A00BE5B682CD0CC95E2ACA1F6C4DD381FFA828EE5E21D9F
:15096F00CF4F17DE36CBDB9B95EA476A72D279D11F53A6CF9FA5
:150984002F7597077ACCF25BD6C49886A7633517D785EC80E7CC
:15099900C4DF12320AAD0BDA4E683AB425D008B40B301E87C6CB
:1509AE00A0E9625E4FDC6EB04FF43059BBFD16CF2CA13DDE56FB
:1509C30043BEDBB50EF83FC2317F3629F20C3409C7410F71268F
:1509D8008F2F88CBF60A4BF1D9381D5E9ADF82B8362D3FA475C3
:1509ED00BA4BD293F8E3643ABE8067E39C2533D1CBD03A3C13A1
:150A02009E8DD33425BF89326D9C964E46A68553D2C9D040BBF7
:150A17007F55C31A995C3D2CF1C7A25CE40D8CB1E29881790360
:150A2C00623586F12B629A58F412FA289C3F647C34424C9608E5
:150A41007F9B2E4E5E8138715DFA8579CB9E939363247D66979D
:150A5600B181F1823501C620C60CC64E3A56ACA39958518FC96B
:150A6B00B3FA18D457D69F1A6B2156F09CCE223913E224153FF3
:150A80001F431E9A8D7990EDA5175CF2ACFE817D7D38027114D6
:150A950081380A7D8D38DA6CC751C3639938FA009E23DF07232E
:150AAA004223D0128F43850E8D416B8016825602ED1AE0753D49
:150ABF0036318EC41D03C412CAEFD9DF938E27E09B965B03B992
:150AD400F7BCFF8A21C70726C557AA05537E9F8DEBE047317E33
:150AE900DEEF81F157441D23C75BE2B2C13A3649FEF5022F9BEF
:150AFE004E8B23CE5AE21F91E9F8B54C8AB35E320D3D874FEF6F
:150B13009A915E86969EC69B420F382B230E9D92DF4499668A69
:150B28008D7A32959D60BE4D7FE194E3683F394E74A0F3154D74
:150B3D00CE4DE17F988EBFD4BA8B38D4FBB846C8AC542C4EA83B
:150B520027713FDF91D98F156FABA86DB78CB65588BD1DFC5798
:150B67007D286614EF1AA4BA479E078B77F5D28847D6AE88CF94
:150B7C00B0C665526784B9B260E38E7DBC445B88674CB6E10A5C
:150B910021EE75DDA61F635A2DC718F12B780796AE33FA999E1D
:150BA60043484524B702756A8067E58101519721BC73FE108595
:150BBB009862B92AE8AF77F3DBB513DC1D6B73DC635914F1AC84
:150BD00087F12E56D25A75B3B4622F6768017E1CF67CBF1E338F
:150BE50015C85F985FE2F23B9EE0F375F4B11CFA743964B06EE9
:150BFA00521FC48BD74A7D2C873E5F492B4B9FC12C7D06BFA10A
:150C0F003E71873E671D32C46F521FC44B7C47EA1377E8F3954C
:150C2400B4B2F419CED267F81BEAA35EC9E8B3E44A460684DF02
:150C39008C3E88A7DAFAE0F3AA9BA595A5CF48963E230E7D4207
:150C4E00F6FDA61A180DA77CBCCCA066BB897CA58FE0FB4EFBF0
:150C63003D6EBF37D8EFC81FDF0DF11EA3C29781C7CE1CD1D360
:150C780041FBBDDF7E1FB6DF2FD8EF23F6FB6AA0B3533BC6C47E
:150C8D007E0B63EDDA49BC1BE40C9EBBB49FE2F99F8FC273BFE6
:150CA200F6160B698BA97DE6E61ACC2B857D695E24B73A10CB76
:150CB700ADF62572AB3DB00E78DE451DCBB597059D7A98BB5EAC
:150CCC003B25E844E1B9567B83E1FC77A41C0C79D66B7B98A408
:150CE1006BF18540B710724F0D394B4F6F3BB916715096422D36
:150CF600B702613FD9F653011B75C0F66E7B4BC050A614EC99A4
:150D0B006DCFAD4DD15FACC9F5433AF3C4733FABB7F9A34C0FC4
:150D2000960DAC49D14CE122AD146E4A5694ADD4C645BAF768FE
:150D3500B9D5381EB56DAA3D216D1ABA22EF6F904789BD3FE19D
:150D4A00B8BEC3392EF9DD65D358286174F44989B3DEA681BC57
:150D5F00FD4803C6C69FC88C55D9760CC3F846B01FDA8EC2739B
:150D7400583BC0F0DC392264BA2CE4DCA1BDC88E08FB76F1DBED
:150D8900AF0807F47DF7466E65D9853BCDCDA56F2C7F612C6631
:150D9E007C7B2DCAD12E6C940F67B9556BDD952B4AF72C6730C3
:150DB3007697188B0B79F363B915F3DE7257064A0F2CE7305641
:150DC800B856CA8FF6CA8738B9F17B77E5EFE6BFB8FC208CFDBE
:150DDD0047756E753E9C577F7DF1F32AA4F9F17C5A85F3FFF557
:150DF200C86015E29EBF78026AAD06C113E48F5BA22F113283A0
:150E07009E715DF43B056D120CC555D1370A39E07C18C798B8BB
:150E1C00EDCC6553F93002F1F71A2D10DF7F625CCEBBCC6B45C5
:150E31002F6D4482116E403F67DD5153D9F47DA8B3F6D15B712C
:150E4600AF04BB49BE31DE2AFA06DE2EFA2E61CFBC3D80BFEF5E
:150E5B0069C0BF9B16068280AF895C26F2ADE81BF9B0E8570B92
:150E70009BCF3A03F81FFE10F037D1D9011DF0435CCA1DE37EDB
:150E8500E89F15EBB093975CC9EC6DA454033C43ACCD23B0367D
:150E9A008DDA7EA606C6007681AE96B6E141D15FE0E5D037AD30
:150EAF00245E1674D52944A3FBAF277DE84B3B005EA01D83BA29
:150EC400C112F6CB81B3F8ED77209E8C2BDC2B1FB171D1DE7613
:150ED900BC517CDE0D3C55EF0766EB9A98FD6DB39F22BF48E2BF
:150EEE0067DCBF6B08EB5F529F789DC33BB340367FA8CF54BDFC
:150F0300782FF021776B43FC9315B63CDA1DF4C69792C76198CC
:150F1800AFDAF2305B1EAA65E4C1BDEEBC8D3BEA9067740679E9
:150F2D0074873CB5200FBC3336853CB50E799EB4797C807164D6
:150F4200CB336ACB73BD2C230FEE55F7D9B8E86F2979F0793A72
:150F570079420E79D6833CF0CE6253C8F3CEF28C3C977E277943
:150F6C002CBB827B9A940779A03C3B1CF2E05E735AE20A5E2E36
:150F8100C8ADADD57DFC7A32994CE55867F917D10659443B01F6
:150F960039BA96AA810DE1CE35FD14FF4FA873ECB821758973F1
:150FAB00DDCE291BAFE0A505F1791CFB6658EB6539856F9A5A59
:150FC00002CE58E939FD7C839D8F53B806E04521B67D901B9DD8
:150FD500F3752DCA6A81BF017218DA61689FB1466D21DBA92DFB
:150FEA00039F2967ED5A15ACD57A56663C627272B07149A28F90
:150FFF0046ADBEC62EC08F6923AC5FA3ACF3C8095A4C06CC398E
:151014005B8FD0F9173FA3AD5BEFA46DF397D2E7B62EA7CF1F57
:151029005943DB2FAEA387E69FA6783FF357BFC8C198A6F8BFCB
:15103E00542F1C7993169CE9310F5CDC07F5C0BE554EB9CEDE5D
:1510530043BC85DAFAEA344C6FA1E5F712AFCF09130AB4D0C3DD
:15106800D3C06BAF2527C18D480BC37C89F6F12F9E621E6BA1D1
:15107D00CBD64C01875AE093F9C4BB30D6C3704D312FD45EC9C3
:15109200D405E99F3AC2884A995B13DF2FD855FCC78E2063D72D
:1510A70044DFC5AEBB64AD33EE92DF494812EAA2C23E336A0D67
:1510BC0019F87D638EBBCF3C9433641C0A0D189DB0962F586F8B
:1510D100189E0F3E1777C9F825E280D561A81BA9897E90EF9079
:1510E6000FCFF76E3A24E0CF440A2A3E49FD7B8D9D377E5E23CE
:1510FB00F7C7487A2F8D31947F01EC63F9B1DF97CF8BFD1DEE8E
:1511100023F65E382CEA18B97F0DCB5C073693FB1FB371BA04B5
:151125004E43669F14F1F0A4CD6774129F5B27F091FBE5B0A8F2
:15113A0087527CE2369FF5361F89D345651EEE67B171428E04DB
:15114F0095BABCFD7DA63FB4C83C06BAFA2277560560AFBA7A78
:1511640043EA7B3E726FC56578F680FDCB0C3807E50E34C29EFD
:1511790055AD94F687550DBF8B04E9D8DB9027624A5DADF6326D
:15118E00DED9F9DCEADDB00F75B0D2D0BEAA0324DA48D43DD4DD
:1511A30055DA15762F851A4DFF0D5FA8FD86BB6C5B57691D3C31
:1511B800A41DE0FE441F63B97D4DCBB46E8E79C51A053D12BD56
:1511CD004C059A08276A94C281CBE3E4B9E527DDD5CEF965C6B7
:1511E2004193DB34702E3E232D1D68B94B97844359F37D303FCA
:1511F700A4BDC8A186B0E747A79CAFFE23EE4D4BC2284B10C611
:15120C0096419D11D43AC45D3427AD8D86F62B9EAB609E3B411A
:1512210039E96C74475AB90FF66017D6BB7A2FF744A2BC2032BB
:1512360022EE9C27FAF1B0EDC7D6043F4EFBEF689FA13AFCB79B
:15124B00106A85B48F821FE0FAA18FE6ED1F308BC92253EAB616
:1512600044EA16EAAE76FAB35FEB608188BBD28DE768C2A807ED
:15127500D6A3E94EE2C5F7E7E7B61B259B89F7A5B93143D596FA
:15128A008AB5598FEB0073D9FAE876EC73578BFF21CABF23206C
:15129F0069AAAB3C61159E676A128F885E0BA4E4D620EECA880B
:1512B4005AB8CC6C752DDD9E6BC399CFDA9E1AC7FF6352430BCD
:1512C900BFE74ED10845BFE74B3DAFCBC0459C801EF81D11EF02
:1512DE00CD0E6AEE3A96DE9BE4BDD916BCABB2EFA5314E08DEDD
:1512F300AFE9C75940AB2EC7B51570BD8F5DAFA95E29EEFB990A
:15130800BCE39FA37799F8BD016922CCA746CDB3C9A47F527EA9
:15131D00B2F9D74EE2DF6EDF9D4B39EE127766BD71A4A3240E38
:151332004BBA3A7E4790307C4E4C419FC571FF91F4D500F0620B
:1513470094E2BE68D3F4F9347FD50AADA02264E78D0AEDF66A05
:15135C00A0C97C6A47FAEE1068B3A2ACF7F4B3CD8F8F1D355654
:1513710068F757F8B4FBCB03DAA28AD47DEB0A6DBBA46DD35490
:15138600BC8727D155DE9F19B638717B25D610F8EC4638D8F716
:15139B00207ECF8950FC3E731ABFE72C4EB82B713D104791385F
:1513B000EC20E660C4D1FB38E2A0ACA501AC11A1B67B88903162
:1513C5000236FE4BE255C5DD690CCF9BEA79D24FF15ED2F20E35
:1513DA0088EF6B44AC7B4CE0FBD5D7E47730FBDC81304D1BA0C3
:1513EF00E28CE280056D58A303B6CC8635E0D9B754F0E33B1C7E
:15140400E3E2FF0C865D648936C09D30DC971766C188CB4DCA55
:1514190027C2583DF46A6488A910CBABB3C712CAF87016AC0146
:15142E0060235930F7BF29E3A3593002B0771066AFF37F13F3E9
:1514430084C1511569F6242F3203617CC0644C280C0F0C1AF656
:15145800229960D0640871E2A297502C37025AEFB141264ADC60
:15146D00E0A1CC4156D92DEE7CC144126CB07926122DDD9DB8D3
:1514820099327844070F14B7425DEE8E73BD2D6A2B6559B7D497
:151497009D52B355DE15578538BAE8B2559C73DFD7DD6FE6CDD5
:1514AC006450F1F6EA7E4CBD37DDFDBEEFEBAFBFFEBEAFFBFBA7
:1514C100BA31DE44D82DB80EE738919E4FBE9AF31B37FF6E8C0B
:1514D600D97D8E4A1BC19FE113CC3500EB7D15DAA8986B25E05C
:1514EB0087B471F62449D02133CEFDA473208FA0ED37A19F74B0
:151500003663C7C458757D99E6E3144ABE9AA12F947C9BF50CD4
:151515008CEBAB1D34234CD447180B4298111E57823AA4431D81
:15152A006768C3D7CAB2AD92C6AD92463FE63CA91C16DF3FF7EC
:15153F00E1FF709CDAB90469291BFD5236446E9DE415D833C0CF
:151554000DBEEBAB6C10E61C105FC6F58DEC875B3ED5BCE799CF
:15156900AF3269B70EFEBE8AB2C2569792B0D97682E72DADE6FD
:15157E00717D5146D64D2F2B7296012DDCE704CDE492EFAB5527
:15159300511E4ABE0134BEC1CA529CCF7E53D2C1CBC0E6F81BA9
:1515A800C7A4FE495015BE293361DC608CF8337C825E8FF0D8F6
:1515BD00B855A83D29D09E64DABF2DF80B65F06EEDC9F843208F
:1515D200770BC03B94FDC477DE271FD06EF709DE2FB9C6F8FCD9
:1515E70009F8B2F5FBDAB2F576D9D305CA9475D3CB4A9C65796F
:1515FC00F1542EDF728EDAF3DFA91B7AF274033EA764DDD5BE7C
:15161100310B7C63D755E3F3FBD96FD1EE4ECD27B36CBD843CC7
:1516260079CA9639785F78B6D748E4D5CF3A3766081863B4A142
:15163B001CFCA948C92615F7A301D6853FCFEA38940F9C17769B
:15165000DD94B30E78E19670F8D301632C0F86CD032183A2CC22
:15166500CC2F03787BED325FB6CC2C5036D39B5B867DEA73F4B0
:15167A00D92EEB2D5056EC7596993451A9105621F9436214752A
:15168F0006CE4B1FC83CC6CA306EC2FFFBC7DACB1C6B51524A3A
:1516A400F89A13E5D7C7E5374E6D399F7910F72B13AC1DE6BA33
:1516B9003F2474592118EA35C380BA700CDFB19DA53BD60968C7
:1516CE001F501F6E475D02FFF1BB0315633A878FB2E223AC503C
:1516E300B9EA28A7CEF6E585CB5528EF92712E94FB7C7E617C84
:1516F800B820BF7C85FB3AEB5CC21832C7A3072A123AD703DF1D
:15170D00866F7F4258D8CFAF1B037A2D747D6758B9E39A907AAE
:15172200DEB6FD421FE7F23A571F17A005BE11B48C51FE04D841
:15173700D7233CF06F0AF2A1407B92699F4BDF1E87DCE1FC7519
:15174C0079A7CF6FE29D3EBF8BBCD3E7322950B6DF337D7E97A8
:1517610078A7CF6525AF0CDB3FE7FC36BB26E13ABB92CF716123
:151776001B90A70B1DB60FE3E0DD72AF86386CA19A57A738EAD9
:15178B007C79756E475D795E5DA9A36E812AED48204577F72309
:1517A0005D268F1F667D8F380BDA7BE6DCDF88338C69E058640C
:1517B500FD8D98217C8BDCDC45A266737E547F75BBABAD8E9F57
:1517CA0067C09C7AF516428A0E361AC9CFD31E5843EA53F054F3
:1517DF00802798FB87FB643F03997A3EF6C77A726984BDD79F79
:1517F4008DAFB70EFCFFFECEB7104F0DD0CA423DFAEA3B9555D3
:1518090076EC09E339A4DB7C7312CFA274C7DE9CE2CF495CDB6C
:15181E00C033F9668A9F5101FFF25EB157E2F039A98B8C9F43E4
:151833007E52807D39C4E339D2CEF6839D1D053B0BCFEF8FEA65
:151848008277D59C77B6CD8D7D96F6106FAFCE3E93FC8BB8384D
:15185D00FF50FF35013C13CA3FBC53B903F1EDB957CC93DDF0B5
:15187200447F12734E79CC08FEAFCFF137E36CCD771C7335E3A0
:15188700FFA62CEC2BF024217992903C49489E249027C5B09E3B
:15189C00BE16FEE15CF26A4B0233B5BEC04BC58257A2EC562824
:1518B1003B1018CB295B01654381E3765929969541D98D8149CF
:1518C6002CE3FBEE829F7A0AF8077C6C4D4DE7E3A53B89A721F4
:1518DB00857CACBAE34FDD9FFE02F25024E5610FE03DDF9C4B45
:1518F0006783423C473F853903B4BEF4E9745A5BE11BFA29D2CB
:151905005AF3AD69B5E391DF86DEED05E82D96F49E015A1B9ABF
:15191A00A7CBAF8939BE0564F7E38B694F11F4E3838BD3FB616C
:15192F00029CD317B11FBE6BEA47E63CEEB7EC4F5781FE28B23F
:151944003F5756114F17FCBE0BFEF73E813E69554CD56A18D73C
:15195900FDA0F35CCB09998472FCAF9056FA21BE0774AA017723
:15196E00166886A56A2D2F22FE08E899B511DC0F8C51DC35426B
:151983009B98A262AD12DB0FB65831C11EF6F3FD2C0AEDCE4436
:151998008E58A51DC7ACB512762F3CD3D79B74233C5DE2BFBBA6
:1519AD00218F9E06D95687E746F0357D9AC04774810FF120BED8
:1519C200E833B9F81640BBD28E23D65AC0F7E10501C327F17D8A
:1519D7007C41E083FF6E273F55C9CFA34D44D437919CFA39B6C6
:1519EC00FE93F59756E6D6CF95F5DB65FD0779F5F364FD5A59A5
:151A01007F9CD7A7A8EFD9ECF9A334F491913E1DF790DC68A32C
:151A1600F3CE1BF5833FC4F0CC47656C7333EE2F997D75959A13
:151A2B0012D4A53E1BA838AF3787F6055B1DF1DCBD273B7E8D0B
:151A4000BC7ABCFBFDE680A3FCDC0BCF5CC1F2959B7FDDEC8CD9
:151A5500FF9E7DEBA72F63F983FFF8AB665289B1C761DAFBDB56
:151A6A00275A7C7E7373EC87C433761FF14CA3D391AF9B7A36C9
:151A7F00D73E0B5F2365A10E7179C53A8C97A9B97DB3FD236C72
:151A94003713647D3028721BB0ED40DBB83E33725F607F1BD7AA
:151AA900E5CCB47539D4719D0F3079591E3C5C6F52B02D5D5C15
:151ABE0086ED35183306CD2A1DF7BDC16FF4F457C4F4BBC89216
:151AD300A0972CA99BAFB98298233650C1F4756655F0BD0C5F2F
:151AE800C6F83EC46CCE0FB6177D9412F0F546F3EA3D8E7A059E
:151AFD00EA7BB37CED2F5248BF1BEA5DB5307EB2CD7C6ECFC40A
:151B1200B7D741FB8DB2FDF740FFFBB592805DE787BA0622E42F
:151B270009FF2F3C3B6254C3FFF98E360BCFC60D5F1E3DF7C0A8
:151B3C0038252271CB0DBAB6FECBB4277625EDD9FA557A96EC0C
:151B5100DFAA49D0D3203F397AC527E574B491F079134A3E4B1F
:151B660093256416CA19FAC136EC27619E610C4775D0E5AA8842
:151B7B0019C723DCFED2808C3FEF01B8D5C0FFDE45C493AA12E9
:151B9000B27FB20160CB7D72226DF99364980E4E8EEA336F4273
:151BA5009B1EA0C297D5E43E6D35C576459EB8F1AF8B7E50EF22
:151BBA006B8CB1062BEB6F45E0BD669090283C1B9E23C484E70C
:151BCF0065F895C3FB65F885E0C79E13FB5D08A7F53FD29ED399
:151BE400B82693FFDDE7D39EE3F89F8DB079303E181BA8E47B6F
:151BF9000929EBF4FD843C87B6818D58367FED75C669919FC22E
:151C0E0061281AC6285EC77C7A9ABA8F102FEA228C9B711FF33D
:151C230088E56AA306EE2763EC8AE7CAAB23B8B75AD6E4A0E3B9
:151C3800AC9BCCC2D82AE2C7734FB857B100EAC73CD25E713CCB
:151C4D000798CA7535A326FC5FF05F609F501F89FC8B0C2D99AC
:151C6200B39958F63B570AF0F17D3CC5F18E7B97F63BEE59F2DD
:151C7700B80FFC1F73C4B96C783E76C4405D904A5FCFE71EC6BA
:151C8C004486FEF9282F23A9EB89EFDD51F10E7F701CB36D6341
:151CA10016C65186268FEA650ADF43B1447C2566613CA5C94103
:151CB600B7D8BF1CA60F4C3D30B5787234472E67A35C227D20D4
:151CCB009BBB6F271E1EAF0C1F61E8F7EDD7560510861B73A2DD
:151CE00022A798163941FDFC9CD3179697E700279862EF075FF5
:151CF50014F916FC5C82DAC3F74C791C397CCC7A5CCEC76BF51C
:151D0A00279B1CFCFA661A246E3CAB84F80BCC81F25560EBE5AC
:151D1F00FC60B8F7AC522E5764B288801D328662CA263C7B40E5
:151D3400EFE5716FBFBD6E9B43460CD46BC85B2AE9C3EFCFDEF8
:151D4900463CCAD45386FAFE53BA5347E2792466821EE76BBC5A
:151D5E007E9AFEBBD30AC626152EFBA6581F4D017FCCB87E3379
:151D7300190DE299C5D496A3CDCE71B94EEA8BEE159C0779F150
:151D8800175CBFD9704D0E374D4ED2CC99447594611CED7B66CF
:151D9D00BC20EC191276F90A92B38F9B858F79A4FD745FC5B0E0
:151DB200CECFC7838E45FA63FCEC42DC5C8CEB03C0519C1C3729
:151DC70095E409D35D1A37704F7026E09B1B66862B42E9A1A492
:151DDC00B249D17AE90DEA2F8D33E9B4DF1B5382D9757098A279
:151DF1005FBBDB85BAB015CAAAF9790D9EAE8B3EC3FD620D515C
:151E06008ECFCA06983B77BFC8D75A01ED4D727F017AC13E46AC
:151E1B000EA37D1CE6F6715FC549DD3BD9773BC737A5F4B2C6FC
:151E300031417B386E7AD1DF93E54591B8A9362678FF0E9103BC
:151E4500BA05F2EA5E07F38DC5AD9BC51955E68A8C67FA3737FD
:151E5A00341AB4BF15FA2AF33E8D9EF70E67F371F7817FE13540
:151E6F00253DEC2AF440B90AFA176971E2748978EADE9C3334E2
:151E8400A82741C648E549B18F20FD33E09DE08FC82DC8E5A33C
:151E9900DAF762CE7E3DCCBDC806EC036BC7791A4A1EDE5B29A3
:151EAE00D681E683503E188EE96EAFD86B4B024DE78B4D3CA3AA
:151EC3003E0BEB03EB458E0CDAB0C572EDD8CA6564CCAC833ABB
:151ED8009B764E37B46F58CFFD6C1EC75F2BDB353ADAB5245FE1
:151EED00DD0B3F13CBA3EB798CC4C43831F605D7AA48C7E05399
:151F020071DD3729F704A1DCC6DB25E1FD5501BCBB1D78B7CB1C
:151F1700763F71B4BB0BF0623BD3D12E2ADBF514A0EFAEE41B6C
:151F2C0026CEB17E4EE3DF9B685FDC408B0AF43DCF65679CEF03
:151F4100430FFE13D04AC4397EB783D66E097BA000ADCC41C374
:151F56006ED9EE50015A871DEDF6C8762F7C0DAD38C636ADA5E6
:151F6B00DF406BA983D6A484DDB1613AAD5D1BB2347C2CDB6D89
:151F8000DB7095F1DC901D4FE52AE3A938F09EB7C7B300DEDD56
:151F95000EBC17ECF1BC0ADED68D38BF2690074C75E2C5FECA8E
:151FAA00FB36B0DC96F935D0FE308967647E638990F92B2E21E2
:151FBF00F3A18D59DCE11281BB65E3D7E006BC3E89D7C6E77309
:151FD400F473A384D1561806C3396BEF7597E7EB3CD02FC75F90
:151FE900CAEA3B3E9FF95D0A4719B767784F8E7A9CA11FE92EF7
:151FFE00ED33F6815FAA826D53D79E32CAE909E32021739C3A1C
:15201300E86FA05F85748FFD9DDF15D70F9BE33ACA8B88271E8C
:15202800D0613DBC17D7BF77715859DBB01C6015815DC8E8D5B4
:15203D00D0B8EE5E17E73A95EB53DB5E98A84FE35C9FAA6D40B2
:152052003FE85197E33DA7BF9598AF31ACBB2A9881E7F178AE2F
:152067008CB0F9D23625047E26F5697848F8946063455F46F90A
:15207C00F9097E3E08ED52641CECD23B863B7682A26D2A684F28
:152091005ECEAE1F193FC7D46BF8319C8E7B15F2FFA5747A5E1E
:1520A600FE5A52EC77F278BD359C02FDEA81B915AEA12CD41386
:1520BB00455DEC2E163A59917E7C293CA37F486772FF588AE7B0
:1520D000E79539F3C6944671EF4CABA31D5EF893DF0E6DC2F3A4
:1520E5001A9E5B3AC910CE83987F510BFF8167E877BB2A13EDD1
:1520FA00587F4368D4B821F40ECA8CD5CC7345C618C2C372FF1D
:15210F00E6B895FDFF8EC1CBFE3A8E3E0BF1B38421BE7F076D69
:15212400BAAFC8DB631CFF324BD3608AFB4D0E9A12B4991C5B1C
:15213900E9D75C011B37DEBDC3F34230FF1ADAFB6FFCC2CABCBE
:15214E00AFFA228327B9F058535126EF07D6AB320F1BE92ABB9B
:15216300310E7EFE10B3F819D31A3A07F87D3BB24315B044DB21
:152178003186FC07B368A9EAD330D6C7E19B414BD18E5BED0E8D
:15218D00BF12D6DDE411AD64E5844BAE8B0BE05983BE4B41D8DD
:1521A200555689FA16C09EA0840D594AEC94856704C4797E691E
:1521B700BB51BF15CBF98B396DF25C0091759305FD19915B88C8
:1521CC0072746106D29560ED226798B9257D6E271D682B8B05AC
:1521E1005C7F30415522CF2AA8C72CA443FD6889C56D51868E26
:1521F60014ED8A65E51BE11CBD4FC0194C09F8026E82F3A7EC3D
:15220B00A33EE68235223F8347C6753C138F3EB0F82661619B93
:152220009C7900F03F8C65FD1FBBDF083F719FE89FC0339683D4
:15223500C7DE73C0B69C8F49C1C71B36F75AFE7082D7259C38A8
:15224A0033E7914354D0D24055CE975679875080BA653E202FCF
:15225F000F8FB28717A1EFFA0ACF4773D2E07B7909738E1DB4DE
:15227400B114F508C6FE992D27E80BE30D65CF935E9DDFD31477
:15228900A69C2FFCAC05D42BD05FD660525C841797F61AECC022
:15229E00ADC607FF96F690A911BEBEF7E118A96F1A8A768AF9BB
:1522B30023E24E017B0D535E3C7D1DD5D37624735E3EB39E9A77
:1522C8003A66DD7EADEBA9F06B962D539847365C22D6BDB93243
:1522DD002564086919967CE163128C7179E2EB5958C7A33D4393
:1522F200794219E0BC32C51AFEA5AF44AE52A1F504CF1B0EC06E
:15230700DC6717E83C7FA01DF767BCDA92FAF7D19EC23AFC1118
:15231C00EDD6E0659893CB93BE55DC36DE2FF37DEEC74B4F0E1C
:1523310070B9E3F960A2DCC2F2F7E4FA3622DB46F3DACA720B9E
:15234600CBEDF3B836FC5EF9CD60DE37B2DCC2F22E09BF5FB607
:15235B008DE5B595E51696DBEBD4C512FE6AD916DBE1FB028718
:15237000BE6975D4E13B9E6DC2334D6E90A362B0558A36622134
:15238500BF1475BF81E31DD046F19EA9B9734343CD0AAC57CB16
:15239A007A2E18A5DA116BBEF94993BFE55343891CB75E8E95C9
:1523AF006C72C39A0BECF1BC9991192B95C805CB96D999A0DB1C
:1523C4009257709F2E3B077E0A3652E1E746D8B4F928E757464D
:1523D900AF200CF5E08831583CAA236D73375759F67CE632C014
:1523EE00CFE58EF3BB8BF8592FA147ACFCF92CF2400127CC19EB
:15240300E73C796A76AF91F8ADD84754A54EFBA679F27480DF1E
:152418008D23E6C8C008CF89518BB3F98F8B31F7007C8D07F85F
:15242D00DE7E36AEB50EE4CD67CBCDFF36BEE9984FAD45FF072C
:152442003A3ACF9F086B23ACC4DBC7F9F912C06BFAD4E10B5CB6
:15245700CCB3BB400BB611FB20A6C5F7472AC7DA4B0EC68D21C8
:15246C009015B5294E93220662B9C57E29BF37096D33D66BB0B8
:152481006E4FA17D97F0307EAB4716B1622FDE75D743272F66C3
:1524960071AB05FC107704F0F23D0AD3C2F11A02BBAF4E8CD0AA
:1524AB00CB12278E6F0E4EA877E7E1CCED7F75FB4607FE900352
:1524C000BF5600BFE2C0BFA000FEAA6BC48FFE456F6380DAB4A9
:1524D500200D139F081A1600AE7CFCEAC4118E4B8B8CC0DA3C30
:1524EA00D10E6B6F0B7D1F45E377CACC5B101961CF83DF833679
:1524FF00ED92D3CFC1589F5A65F5B65103EF74BBF46455338FA4
:152514002756DFB4B4AA6D6B50FB6143E366ED9EBF587FB7B6A6
:15252900E127BBBA3B1FDDA5ADEFDCDED9B1AB33A8B56CB9679D
:15253E00C7CECE8D5D3B7EFCA3AEEE2DF5CB6E5B16D0AA1FD909
:15255300D5B56DE7CE1D8F6DE978BC235457D75877DBD23F5BD6
:15256800AE3DBC6D7BE72E2DD0585BD750DB7807BC04EB03C11A
:15257D00FADBB4AA4CFCCCC6575BBBB533BAA3BBF6A11D8F4646
:152592006B3BB67644773D51FB68C7B6C76A77ED7CA8B6735700
:1525A700B4F6E1276A3B3AB6F3B2ED3B764497EDBAA96E857601
:1525BC00ABD6B9755BB7B6B5F3E18E1F6FEFD61EEAEA78EC478C
:1525D1009D5AF5EEEECEDDDD4B11CBB783BF75E7B6C73B77D624
:1525E6003E0CDDDAD2D1FDE896AD3B1F5FF6D04D2B1AAE063F10
:1525FB00039E9F6799E30FB7EFC77D42B58ACEF537B4576BF5C9
:152610006C199EE5B1F3F423CACA85FA05E350E870B4880CD334
:15262500F63FA63379FAEDDABDD67FFECEB552517F6054692D59
:15263A00B40AE6DE39D0253E78BE85BA539ECBEEFA22ED797785
:15264F009112DCA81D613550379F8C3787B401C6EBC3CAD30165
:1526640028437DD3E428C3762AD8408069F56BA5AB6C9B500E21
:15267900BA710611BE04FEBF02B0F7A9CF44D14F1CFE657A16F7
:15268E00D2E5CC6B77E6B4C72E8B585C1F6F5F4DBBA03D513FA2
:1526A300B77CF0CD04E68D39F0B328E1676797B9C85CA40FE9F8
:1526B800F069C718F66106AC53317F8E4C2DC538ACCFDF72AB4E
:1526CD00817DC77B164BFEA1D1C02B54AA0096D8AF3A44C3DAC6
:1526E2000BB4FE6DC00DFE940FBEB7F1E0391EBCB301CA2C2721
:1526F700CE35E934C7C9EF6D04FFEA783A3DA732E2127B6AE153
:15270C00017A1DD80584997C0BF3660350F60AA7AB04ECE521AB
:152721007E6FC47EDC972BB3C7CD3E6311FB038EDDE77CEC30F5
:152736007EA36930EFD4BE845B5B6195B41C85F13EC061E33C5F
:15274B00C43958AABD6CD57CE56ACAFAAB620C6C7E3BC7C1F730
:152760004EDAFD75F5574EA66739C703E951811E9F63BCA211D6
:15277500378D257F65A920875A722431D7BF1BDA76515F7211DD
:15278A009B9D2CDEB43AB914E435DA8E776AE01D89782F0E0997
:15279F00DF4DDF55709DA453F465947F79D0C07B36D662FC4621
:1527B400C533BB61EE8B0E9ACBF5D74275ABD66845ABDE2F396E
:1527C9004FFDA15BF83E63EFEBE959975C765ED6009B9133FE04
:1527DE006B29DE5D89EDDAA1DD19D92E906C01B8ADD66A11DF97
:1527F30048F03B29E5B326B2860EF0BC9145D485F77F014FC4CC
:152808009D94B9CFBD2E71278EB8E76B047CE95AFD52B180EFB5
:15281D00A523C603DAECE05C6D76DDEB8BCA82D6E21B83A7B1E3
:152832000EE3BAE3E9598B355790D3A90E50DC8376C3BC3C0DA3
:15284700F320137F9B7A45D8E7A957AC9F5754EB7CBF1874E630
:15285C00A0840FDFF3BDD47E8065B7B5DB6D873607DBF0BEB4B9
:1528710012DE07DCDFCDC7A57F21E6512B7CCFE358324E77F2F6
:1528860028C233D982D251C3F7DF87190A4E6B12CF389FE7E720
:15289B00A9ACD0ABFA10C09D5F5A632C07BEE2D9D81A729EF631
:1528B00086DE88624C2D896B83B6A5860563751DC84EC99E710C
:1528C5008AB90441DCFF507F21C646CE65F4A915BE2ED380AECD
:1528DA00503BA75FFD85357129ED395A24FA79178C75538131D3
:1528EF00857575597E9F7A2FA5790E09C2D92EBF9F0F73AE6456
:15290400CA34F0BEBA2258A784928729FD4DDA637F8B730575F3
:15291900E284E43BC66F911701E083DD6618EAF83B7B864652D2
:15292E006911EF8436A54773798F325888569CC7E5C91EE6FB92
:152943004CF0FC83BFCDFD6E02F98F72CE75C37E6AF37A1078EE
:15295800DD9A1CB1265E933E80B3DFB83724FB4D7F2FFA8D63CC
:15296D008FF0A200AF468E1997CD51219B788ED6D576B71186B2
:15298200FA9B6DF9936321F89885D1F07B416B1464E2E3D78499
:152997004CCC2FAD37FC23AEA02D1B78CC3B2AE2B952364EE849
:1529AC00E8DF2D262756A15CF81A135C1E2C73B1EE1E386228C5
:1529C100A073174B3910FB02B9E37E12F8EC575F0199EFA15EF8
:1529D600900B5F4F9D91BA28F96DCF07C737181B2FC4EF6538A7
:1529EB00DFA13DE7793E1E984F9837649F7FB9CE211BDD201B4B
:152A0000D13342365C781796940DCC8343DEF01C07CCEB782D44
:152A15003B7E086F76B8CBD0FFFD2FEB41C759D5C936AB2AD9BA
:152A2A0062819EB3400FB202F909FC5E665CEF946A553CC61AE4
:152A3F002BB00F06FA9BCEF00E1891728C1B8DB5A3DFE6F28C47
:152A540018B89FA6CB73D6E8833FC0F79712FCAC18DFFF8275A5
:152A69003B9E0FFB79C54958ABC6F95E981AEBB3300F7275EC6C
:152A7E0014F7FFCC581C65729EAAF559ABB553168367191B3372
:152A93004E6BA29E2C8AD38FAFE21FBAC984E723A5B9F8B1A2B3
:152AA800CF5D3F73FD4F7B4F1B1DC575DD9BD5AC342B0D627676
:152ABD00D95D495848232C12C9519C5DB1C8922CC242A88FEC13
:152AD20010654B9D744612F63AB603B19D84B634C7E784C42B00
:152AE7005889058FF03015F65A266695480E6E209539909014D9
:152AFC0092A5761C9152B2E1381C9AA4F638716C9AB8B6EC6293
:152B110087A436DB7BEFCCAC56027F25ED39FDD13367CECCFB72
:152B2600BEEFDEF7EEBBEFBDFBEEBB95BB86F37317D82FD98F5D
:152B3B00D9F7D9636C823DC40CB69D6D619BD917D84676275BBC
:152B5000CF6E6537B33EA6B04FB0B5ECE3EC63ECA3AC9B5DC784
:152B650056B3556C255BC196C38CB29375B076D6C696B1085B45
:152B7A00CA5A599885D887D8D5EC83AC059E0FB0AB58333C4D64
:152B8F00ECFDF0BC8F2D81A7119E2BE1590C4F033C323CF5F4B3
:152BA400D4C1B3889E5A7AAEA067A1FDD4D0536D3F558527687B
:152BB9003F81C2E32F7A16143DBE598F77CE235DF2CCBFE4A91D
:152BCE00BCEC33EF2D1FF16D9F8A777CCADFF5E379C747C0C3D7
:152BE300535AF6BB963D6099CEB280EC52D7DE1F63F241F46BAC
:152BF800043FDDFE6F82FF9CFDDF02FF1207FFC863EA9A207EDC
:152C0D0054D359B7968349B2C4299A242F3E28C5E1CDC06B2E5B
:152C22003E487602C97E6C13D9BE9365DBCF63FB71E017B7FD26
:152C3700CA6D3F17F8656CBF0ADBAF04FC303F2893CE264A2C4B
:152C4C0016B2F342BDE2909D07EA1187ECB4A8371C8234310E91
:152C6100F768656DE3B751D0BA4A83D9F6A81BE41AF48BD1B952
:152C7600FFB0EECB70ADC25433F081865161AA83EC1B26DE2674
:152C8B006CF26DC2C81E0B84554218F81BE8CF9FE850A9EC5CF1
:152CA000B3E1E0CEC139D62367C3983B4234D1659A8787749C89
:152CB500F731AC27A509F5237E118792CB8A3F99B5C3813776CE
:152CCA00C98B0DDDC9E7B8E51F837831E49BD262831740067A12
:152CDF008B6F8C9B89932BFA975C33FFBAED4FF8CFE6E7A36DBF
:152CF40009EB3CB7AC4D93FD5BD9D2E720DD4999743D4AED7F28
:152D09003A37EB82B686F66043EDC03B5D2CE96A37CA609ECA75
:152D1E00473BD4E9860E5A9F9BFEBE7B19E204DDB8469A857495
:152D3300226B471D6CA30570018C5613E456A38C5D05B05F65E1
:152D4800B883D1FEDC65FC24CEF263F2AB06F2DAA6B96B14217A
:152D5D0059273F6CDFF0BD49E65A79A099941868E571BE2C35E6
:152D7200A03D4A18CFC35064BBDE42EB5061834908974CB0C425
:152D87005CD55046B38EE5F353D5AA94688EE0574834B7E23778
:152D9C008675CD8548A6C6B8D48ED15E6528A425A84FB46B511B
:152DB100D26D8AA27F3C3FBF1BE2C4C88E24CAD0D659D8B8163F
:152DC600A573001BAC33B1A18D961E14BBDBBE272065EB48E02C
:152DDB003AEF7C002A09F397A4AEB3A482FB3DE87E7505BF8CF3
:152DF000E5B6E8A2CCB7B2D856FD3CD62B27EB96DD5C4B6FAAC7
:152E0500C52C69A53C213F5A57C2FFD8889EAA49281CD9F31C8E
:152E1A00310A7A20B11FA4B17EB5F2FD3A2F9F30989E84791408
:152E2F00BFEC9B377F13F27F328DFEE8D7027EA373FCAAC16F26
:152E4400688EDFA6150097F47CFA7337BF1006815913E5A7F5FB
:152E5900BBD99456BBF205B5B7FE99F043EDE7ECB316093A3FF3
:152E6E00BC287106EF0EA075B3452B4FA97C665C77C1B828CBA6
:152E8300DF4A33FDBC21A44668AE836B6D4276775B10E7515087
:152E98000ED3BF615CC1BDA0221ECAD933E1C99B5F6A031880EB
:152EAD00A64F035CA7744EDBA93EB4EE79ED8AA806ED68A70154
:152EC200384B5C5CB13A2C6C87F2625B27D9BE52B42D3E2908A7
:152ED70068EB74DBA8D0FD02F83F306AB9BF6EBBBF3D3A95CFC1
:152EEC00073217E75CF311FB693AE99AD2116F77B3AC96F85E05
:152F010069EB97BF5CDA8AFA10A3B9879485A71F504A4E3DA5BB
:152F16005EC7CE8417668FA964672DA4DB76067354D780F4F77E
:152F2B00EAF95B9E3616724F42F81943481C68C3392CE63D7D7E
:152F4000CB295DC894B61EBAA77419CA26C447A4B18349570694
:152F5500E87C58C7BAFC61EF6024781CF2967EAD617D24843B52
:152F6A00F6F8A4807B23D2B68312C1FFC383CF431F2C978753B1
:152F7F0068DBBA4C1E4CEC4A680AD7A3411FFDA98E3657E38FD5
:152F940031769F80FB095A6ABAE13503E2EE78496E591683F8DE
:152FA9009BE3AB5B518EA1BE251DD0F9CC578047BA5BE3D9FD8E
:152FBE00AD4C3FAC4F63DB8370EC3F6BC19FCF1C80F63348B612
:152FD300299A6CDB31D4D7F461B20BDF44FD0C64DBCC30F4B3E3
:152FE80084C6036D25A645F02B30AD15BFB85F266476431E596D
:152FFD00B2C55A9D49EA9C00380A65C9862AB643EC1FFBA6308D
:153012006CDC88A1CC9D491A572534F2CF803FBA512E9C6ED029
:153027007431CEB77A4176C47E32DD306E2C0C66FA8F5E742F22
:15303C00035C1A536FE40509E0E98232CE60BF0AA5B52CF0E088
:153051002EC89765F6184F15CEF7A47411301002E09E1FD42243
:153066004C3F9EA67929F0B3EDD153CAE9DB4B5BD36C504927FD
:15307B00762B171BF965E9E8B052951C51776DD5945D1D6749C3
:15309000B694CCFBD39D4BEAAEA13DA3506212D762BD8B92B8B7
:1530A50027A8D766A84ED69AB680F67513B466DDCEA32CFDBCA3
:1530BA00CE75A38EE113C6AEACA6E07AA190D903E9B6219E69A5
:1530CF006FAFDABCDFA8351F369A0037B550D75C298805108ECA
:1530E400FDB349DE46B63C280F49439B4E42B57C9F4E36F7D6B9
:1530F900691AA4D39137F0F1437AC4FC1EC4DD66A00D4E616AB7
:15310E008F8A79BA4E4E908E5AEC71C66A70BF3F74846C05F0F8
:153123003D432AD469D4D5B3534D95B1D9FD23876BFB29ED8BE7
:15313800FFC6FFF0618EE8427B1E7EF311D203A45B7670CD1FF4
:15314D00FD5892F4B5B0CED6FE478AF63F8CEC88526D0EA543D0
:15316200E6231969A5A60AD76B6AC91A4DE565CD1005DCD3DEE3
:15317700A3354577B7E1B9B1C000B41F98B75627D07DD808DA47
:15318C006E3CD36EF1FDDD86DF145BD18FEC8D16F643D2B4E610
:1531A100EF42DCE446F446A28375C69963FB34D4CBB6CE365B69
:1531B6007720FC02F2E2D6A0CE5E86E8C7A50EA8C14583C60317
:1531CB0051EB5C2CAE9DBB7A2CDBCB3716D921E03EAA912D62AA
:1531E0000969AB7FED20D93284FAE33A346F022FCB9D277C7B31
:1531F5004DBE57A4B9439AF6195CA46B6ADDB101F35C03ED4235
:15320A0021BC9CF945ADC95C102EE6F1C8DB918EC4DF0BBC1DC8
:15321F00F8FC86D25EBFF9BA4176DBFE11DBE190B1E5CD7CA012
:15323400E54DECBB162D10D77E73A7EED246546FA7B5D7EF02FD
:153249001E81F7CB886C64A9086D65211B09231DB5A236AA591F
:15325E00F4D2D3A4F375AE9FDA18D00FDD3CB3F45F5336DD9182
:15327300CE9806DD48D7B934251AD8F478271CBF5B5AFD4FD299
:15328800A29C6891B6F7796668F28EB4281A6B1D3AE8DF477B45
:15329D005995A1629AF8E2EF0F93DDEDD8C0E4857BDEDF26C538
:1532B200CB605C1DD0D1B636F2AECD5F2C6D9DFA2F871F59FCB0
:1532C700A31A68E65BA4191CF04DA421D6D5DAF3B1CAC0F230DC
:1532DC00EFC2B9A882BC64D1A5A688269B099E94657705C27175
:1532F1005F5132771A9C9CA4F6846EA5C8BE40A4287DE4930561
:153306007D5FD2134EB309D2DB6C42DA0F4C28A2EC26DE1C225F
:15331B003D404DAF895ABCA8D00FA1CEDC061C8FE17BFD29C2BE
:1533300001F45B7FEA0F567DCD39D76CA18DFBEA60AABF06645E
:153345000199650E8658F660949907AB7F9BF7C07712DC93E0AA
:15335A003FD96DA77FABF8CAB9D9F1ABEDF838AEEF7FBDA84C2E
:15336F00D4C780F947715AB2CF45771668FAC57BF8655DB87E3E
:153384002E1F4DDC37754C2985E9062F8FA4D04E49B9FC448ADD
:15339900EC86D37E5096CE544AF22198B72475D15CD27AE3FDB6
:1533AE00790FE2417B30EF999B67316CA4770869BBE407F5F373
:1533C300CF6A2023E96403C56A877F6750DBB56CAD4CEF0279DE
:1533D800B115E4A2F7D236A79F1DD193AE94CEF6F1BDD3CF6A0E
:1533ED0046D29536BAE45DC6EB17B17F24ECB9C980F11CCA42CA
:15340200407FDC5F95A18C629C5C787A363E717FD796672D5DEB
:15341700687D8F8EB23307FD0BEB086E63F5DF82BC188A914D54
:15342C0074279FEC8F67F2697C2D2FD4E2D9A16035C8F103FAC1
:153441004928F36E16D798194AE3BA986836E9A5C7C3EAB7121E
:15345600CDE1C1F6F659B26519C375E276EAF765DCADC067AE49
:15346B00D765339666D22B862034A8B8D66CC9958BDBCA61EE8B
:15348000E2AA53A80CB4878769DC0361B5321A8E944399FBEB54
:15349500AF6DAB3565181B9BF46A33A47362A73AF895B0E6CE17
:1534AA00C23C31D76E387788A0EE07B374D041DE6C0CF3B8563E
:1534BF001DFBD424D36F191552B87FF857F43557B896CDACFF5A
:1534D40057DB7A174D363F0B013F6B5750AEF7C95C88E62A504F
:1534E9000FDEB11D937B64B226BB47ADB1EF6FF0C3388DE3317F
:1534FE00CB7DC7F072CFA9AD0D95D7B0BAA97EC6CE6912FB759A
:153513009B9F7B59DD29BB5B51560C01AFACE526D440F048BF54
:1535280010FDF5D25AF8BA4EED26BBF4C827AB56A26EC011FBD2
:15353D00BEA1843605E3BE2F7158F5D682DC52B0CFFCCE6F157A
:15355200C8E6F84DAF288BF8E2653067F98ECECC470E8E83CCE6
:15356700556BDEAF23EFC276817BD85E18AF9FAA19591A05598C
:15357C0007C7A14FB875926FFEE9412DECC8346FBC997F4B99EA
:1535910026FDFBFC5BCA34ED6F25D3C45ED04CE77C39F21CC0B6
:1535A60095D0707B5B39E93423DE8EB5F98FFF07E47F4C5B0B28
:1535BB00B87BA05D776C76109E828943053C05CD2561E11CEEF2
:1535D000296D99E44F1C437E1D5C68CE0B835BF79901FA969B53
:1535E5008BE8AB035FBF5CFD619C8DB8BA5F564F5EC80B880779
:1535FA00AC6B8B5D7766D7BDF63275C734E90BEFBDFE8B80EE1D
:15360F00D5C85763BBD2B1D7E7CC6FA08E747744113D5B8AE3A5
:15362400C476EB37B0B47623C8F0CF3F35B254968F4F0297D654
:153639007C1C8CB7D219C36FB74B1EF505A49F1B77B3B39A97FE
:15364E007B91EE4FB862E5CB6A28FBBDC8151D163EAF602F502E
:15366300DBC3FE7A05CE67426709A7D8E6703D17D784EB4C771E
:15367800AB13A7EAF8D305BC57415A491E48272A92BD18F72EE4
:15368D005CB28D1D4AA32E4AC9D4310C1B759D3CA6EA799847E0
:1536A2004178937C7B1B7E119EF32BCA966DBAF91990177FAEFD
:1536B7000BF263A32DF2BF1AD5E7ED3AC6862645D437CBACD512
:1536CC00AC7F9C4B0D4D9E5B61A53F0278F3DB795D58B1BEED6D
:1536E1006AF6F5569A0B15C5C5B49847713AB4F7BEE5DE334AFE
:1536F60048FECBA5E88FE32588D21FC7FF0771CC8C0D65503E7B
:15370B00C5B4E5A8630FB8C4F361B5BBBE4A785D28838C60E796
:153720005F39EBBF2AECB2FED3E5F2FC307C7557A525B763FE8C
:15373500AE8777A83437FA21F00A90BB8CE8238A144DAAD5302F
:15374A0096D079BD7761A31F5F1863525C6AAD8AFB984CDA4A08
:15375F00E3901480F1C41E87684CC2B0F7301E3963913D2E5D94
:15377400763CC2B108C7A408D9F4288C291A3B618D29563932C9
:15378900AB965F3116A06C01E394206F37BA5FCD0BE5192D5589
:15379E000E7047A2C956677E580DE31AC6697AD5A1F7A05EDB5A
:1537B3006ACD2B733FA0701DC343801F4CCF32CFE97417484EF5
:1537C8008379654A2BCD24133E2847CA1C4A639F2B318F699847
:1537DD0027B6356C734DF2B3A3D8A6CEBEE1C86B36CC00EBA1A5
:1537F2005D5F813E3CA0D37959B439FA5D6B5CDDF3CA4CFFF2E4
:1538070006ADF32F82BD5F3659C53C208B7AF62DB0DC719E794D
:15381C0036BB98670A5E4BCE6EB27993A523E2C6BB03FCCE58AA
:1538310098D136039EFCC73BD45520CFBA07C6D491DC98522753
:15384600BB3B17CA1FFC30AE9D511AA9592D9C178D3540BBE016
:15385B0086F87883EE96701D8E1B7A716F73849D1FD0CC1378F1
:15387000B9D15C797276F9AB12CD4BFFA4722ED1BF09F53756D0
:15388500B10A495AACA2BE2DEE75476A58855BFA06E9475E9528
:15389A0079B30B75A7825F0AA3AC4B3A51645F00CFE5423CA71A
:1538AF003CF4EF02F78CCD6E9AEB94E3BEF81341B47DD3D4FF48
:1538C4004610F36D253D9F5C35AB10E363C05797A8EF93B98E87
:1538D90052482FC61B8C0BE0CF7F6940B7F412F921679DC02DFA
:1538EE006D517F0161685F6F04E340BD704F4F46DD29F0E3E3FC
:1539030063C651F487FF17618E7ED64E877B5BCF813F7EC78161
:15391800C6783EF0A8CB3A53398234F74FA31D4656B60FEDE209
:15392D00BDAC49A71F5450AFB51AE737D2214D100FA83D40DB6E
:153942000532DF5B66EE21BB48B5C00B8326C61FDEC26D1FA1AC
:15395700FBE170AE7355A66BA9245A672FD0F6C97CCA736254CD
:15396C0080388215C75F9DE19772FB2E4DCB6265A4EFAA03DE24
:153981002201EB4C23EAB7A0DD41DCCF37C18F49C9C2FE1A2F08
:153996009F37EE02BAF1801711FA66BCCABEA3720E7D437141CA
:1539AB008B9B3F3CC83F3DA0BEE177F2AD2DE49BB2F38DDBB65E
:1539C000677700AF385A86B695E47E964B18B4FE2E4534AEAEF2
:1539D500BD9F379B0CC1443FA095D94EE5579BD306CA4392991B
:1539EA00813CE3FDB82EB9A3668342BCAA6E637FAD8967CCCFD0
:1539FF00F6F3F2678DA341AB7D34429A263337DA02E923905F61
:153A1400D702E609417A0BB63F4B236C68A77415CAA076FB725B
:153A2900D545FBA3E6EF8C1D3531254A792AFD317043FC83ABCF
:153A3E00E11B87BC4B614E70A3B9D7889A0FA4BB4D7D34065FA4
:153A5300DCD38BC17F16C215282BE7B36DF1B20CE1009015D890
:153A6800519351FACD8C711BE41B07D8FCD85E01572DF015E0BB
:153A7D008B362E6508AF85FFD590871FBE8D3077DB00FFE716D1
:153A920060DB065C815F37F8F1C06F9E02BF50D0A2477C8E4D94
:153AA7005FF7D30915DA5D854FE6979714D18B4378E47103D74A
:153ABC00A042F2B826E0FFE5F4E5E83C48448BB958C5D5995BCC
:153AD10022D86F4A3B642D4B3A81CD7A359E6991068C52DA2366
:153AE600E6869C3C3250667D7A8CCE0570350975C67E4B14E2A1
:153AFB00453406F90D215EFC4D05DEA69CC231AD5945BBE28BDE
:153B1000E5DEA56CD32B8353CF32E6E4C3360D68999FD8FB05AF
:153B25009BC63413FE51074328C0D3A12FC47105C39EB5F48CEF
:153B3A005B1CFE047ED99FA0AEDEB2E502C00A3207C1EDD09B26
:153B4F00492097DBE9826CF972B6A983F277F46D310DE45551D0
:153B6400C9BA280CF32A0B5E8A2FECDF7E6E461F5EC2BB96FCCD
:153B7900FB0A75ECFA31D6F1807A030C0DD29726F4F88F11604E
:153B8E00B44D64ADF7EBE0CEC03B096F16DE1CBC26BCD3787B99
:153BA300758E0CAD3119DE50CE8ACB360D5A75B574E6C9CD7E81
:153BB80039DB2DCF7147E7B8E373DC8939EECC1C77768EDB9CD5
:153BCD00E366BF9A53FEAF8A74FA013FDDDC6CFB0393483BFFD1
:153BE20064C16E531CEA161838AC56D2D9503B1F9873E3DCFA61
:153BF70086F8BA48E0D8849ECE219D66F03605EEB3F09E83F799
:153C0C0002BC02D0A71ADE2678DBE1ED86578177C34FACB8ECF6
:153C2100D004E12DE3D01FDC8837BDC88D784B14B9116F1B8B77
:153C3600DC88B778911BF1162B7223DEA2456EC45BA8C88D78AC
:153C4B00938BCBFFD58C5D442A1FDC818E8C816D1BF54BF97BFD
:153C6000D65DEB9C6B279C5DCE3E03E0576445F89D1BE74F0C29
:153C750047DE7314E417908DF427E6310FEA1AC29CBA33CD31E8
:153C8A008F00FFC0673A451823CBE545D73C05E3622DFC231DFB
:153C9F0079699B7A971778D67C5671076BEC8CCEB778DA4DF0DC
:153CB4001F996FF1B23AD6B8DCD11B91D1CE2F8CF93AE48138E6
:153CC9009BAE84F11BD29FAB44D9E1D1193B0A20EF9DA91F80D0
:153CDE0071793FCA08FAF40AF7F227208EECBDFCF8E48C73B8E8
:153CF3009789E311A0D1531C4F8472B7DA67BC41DE597E16F2D1
:153D0800F290FC3E9B8FD502BC9B251C0F51BED8AEEF88E3B99A
:153D1D009E47F52DD1FD547FCF87DCBD92DCAC23CF6F03B4794F
:153D320057EEC6B5306DE33C5CCF1FD399FEA81E80B97B271B90
:153D4700A4F8839E0985AB6987B175CCC07B8078905BC9B66F83
:153D5C006C587B6A3E8E637ABFE44D511E47459021218D203F57
:153D7100AAF330167B2A715D6ECC401B0688E746C9923F10D617
:153D86009C385BBEDB378F553C01F965E6E138D3A827696C6ACA
:153D9B00A2B109CF137235213A9F7EF662DE539E18E874C79ABA
:153DB00054596ED05F5CC12DBF0BD24CCDB76422070F3E5B5772
:153DC5006B66FD43D6A7A7914F6D25BB6B98BF74FA030A9ED3D9
:153DDA0040987DD1B1A53CC82A3CE4390D79F6824C85E7407863
:153DEF00D265A57138407607A62D9BA17C7CC21065EBFED03C4A
:153E0400E9413FAA0580E7F3F26306C6AF043E4AF7A59780FC2C
:153E19008C770C16DDDF721EF2F8511CDA5E1C6D16587691BFD7
:153E2E00CBC63A4570E33883B88C9633CFEBD0665F65039D0EF2
:153E4300EC164EF6116FC23CE8CC045BD2E9C07D1EE046FD401A
:153E5800A04305DAF9C0B6C1A3DED985BCC7B1FB5D5CA7605144
:153E6D009D9CF106EB45FBBCC0EF102E777618E039AA511DA462
:153E8200319C7340BDB7CFD89D8D0F68231EE6B9016075D27CEB
:153E9700383AD8897BD4FF7CE0E7FB45B9C50890AEA70A7D760A
:153EAC00B5E1C0CECBFB691E86FF38C64B368ED6D8703A7A6FBD
:153EC100362E03B8BFD60261BE38BFDC5F32D337244FA36ADD4C
:153ED600E39AA6F28CE3E3CB5924827BD6796BEF219FFFF2F1E0
:153EEB0008F82575BC5BC09BBB57F59EBE56918EAF54EB645735
:153F000017E9B4E6B6A30E89C7533C6EDA70B6B225342E4F0ACC
:153F1500CCF334D4F167D0F6D8A6AF525E185F405E1F19A77B66
:153F2A000BE8FC47570B9D7B00395CFF6662AC13CF44207E1FE7
:153F3F00887374AF9C8D779FCF747756A1BC6E1ED3CFDFFC9DFD
:153F5400E53F0337D69937272EDFDE0047567BB3DA8F681ED6B2
:153F6900779BEEDE60D7049587FDCCA2A74C3875F835DFB5043E
:153F7E00F729315CAFCB8E459CFAC6B8D9ED12F5122EC6B94E46
:153F930084DBC1DB4BD971E201621C78825DCECF208F775BA70C
:153FA8003AD3BD3C543EBB2D76BF9EF7AC063A8AF1A2BAC88FA0
:153FBD00E9A87F56A80BCC61ACFA3715EA8270F05D1FA4BA1001
:153FD2009EE2636F8927B7D4A8DAEB1E79ACAF707C17E9FAE127
:153FE700DC688FCBE6138003E0E99E82CDF1DC8076F2BF1C7DE8
:153FFC00CB16AA13EACF3A696F837448EF34A429E63377BF6960
:15401100B55751DEAFCBF171ED73D18930968D6D51DA7CD43A54
:1540260057969B80F9C2A041F6E1A72D5EEEF415DE3C60489E81
:15403B0009D50B3CF77E985B8926F215CDAEFF9199FA43BBA8E9
:15405000EA3A46F5AF02BAD9F42D8C21E5C8EFA83F68AA6507E9
:15406500DCEA0F17D1164AE4D0ACFEF09BEC21B28F82386BBD10
:15407A00C53AEF8DE53CCC863BA12D5BFDA46BD06AC700EB5097
:15408F0002CF30EBFDBBC9B6F9B139F4D62D7AD71F5D6E805B09
:1540A4008C8F17D1F5908E6966E83A6ED72B45F5429EE3ED1A8C
:1540B900A63A2DCCF0CBB1ED3BB42CB45FF0E333686B3FA90FC2
:1540CE0041FFB3ECEC5BF5F802B44FA72DFAD8D1CE4A281F618E
:1540E300B900B02C84B677A86C76DB3BF99FD0EEE422F8E200AC
:1540F8005FBC083ED981CFE24B84CFAE4182AF982F4C4F5B7B51
:15410D00C8F8E5E3D69DB37A34B9B1B268CC49FCDE694B85B9DC
:15412200AB8F454608B768CB223D9DAF28B43D906D7E81BADD7A
:154137005FE5AF95E2D6FCDB17DDAF3E0969020D7CAFF7745A0A
:15414C007171CCBB00C3728774E97446E1610E7E10609570CC13
:1541610081F683EB92828072A7A6058347FA65909112F78EF437
:154176006E41FFD4EF90876F114E1EA37DF073F5C3CB58EEA8CC
:15418B006E84B85ECCA72E398C36C1FC5578BF10F827613ECE96
:1541A000A4618387FC708F93DC502E4F7B2AC306A5C3B2F461E7
:1541B500D4175D5097E13B07AC345B1230A7C77511618DA6D2CC
:1541CA00FDBCA87364CFE91156CC7F6BB7A694F49C5713F9BC33
:1541DF006FE4239A8275E6214D5DF2C03A841FC74E840561C3C2
:1541F4003D8476802170FA88521587BA9EF88AEA631AF0F08C51
:15420900F22D1C17EC3CD1FE3CC8C03E4CE7D47D08F24FED3C5F
:15421E004CF7FE627BA1B8B1435B84EDBF534D840DEA8475C1C0
:154233007B41912E8807A61FD3109F6DA83600E10E2ECE16F0E9
:15424800609555C003AEBFE62C3C04BFCF77A67A70AF79421B7B
:15425D0000FF11EC2F8013F4C3B50D1C832D788F010E0E289865
:154272007F49CF6BEA66C2C301C50BF5431C48782E05F74EF013
:15428700CE0D280B6DDA86A0FCBAE0B97EC75EAD65DF04E6FFDB
:15429C00AF30B6A326A5BCCACE698B42ECD38D32FF61C79E62DB
:1542B100EE9364AF96ECCE74D31AC19251EB6C608AD245CD6D7D
:1542C6001AB46D0F7C711FCDC8BD36D3CEF13C18AE55611B6D33
:1542DB00C1B934EA1E86DA35F61AE9B58DC2989B4D34B97B3965
:1542F00021A2F289B0BA0760AD5726F19E385D977777D1FC14F6
:15430500E248C03B44F9639D82FCD94E49FEC4723E26E3789DC3
:15431A007D0EE461FCF6E35C2AF628D9BC0D74C886953FCA8CB7
:15432F0063D91084B540FA2648DF08E9D1AF56FE44A79307B46F
:15434400A74E11C205087F6EC567293F91E666AF6C71E26CC493
:154359007200267FC7B495B76EC18D388A60DF00385BE467BB1B
:15436E00F88E901183705C2FE882F934970AAB5202F7D2ACF8F1
:15438300981FB481000FF9603CD2E77E0DCF015AF769601F6EDA
:1543980067F6FC1ADBBC346E97B3AF1F6D3254D3D97DCB0FE76F
:1543AD004CE8876D2260E9B05F325FE2388B9E057FC8BFD6990B
:1543C200FF901E1F944F7704650CF3B54BE75CD6D9C17D3A8668
:1543D70021FF015E6B95057102B9AFA9FED35F53505EF5771D0F
:1543EC00B2EEE580303FCEFDD9611CDFB58FBF50C26AB387DBB4
:1544010036C2B827DAF30C4B67D09273D066BC9038B0B40A64E3
:154416004F3FE61BDA67C151E0932982CF1F4D46C83E04B8311D
:15442B00CFEAE8785B6D519E85B90BF05C4A6FF3CFDFD8ED19DF
:15444000EB81733B80CDF71CADE934CEA4293E8F48F76DDFA789
:15445500FDF632E9F6CF4907ED5DBFDC7A52D4DCABFDFB65D2F4
:15446A00DFF52ED2BF7C997491778477AF76EE32E9DE60EF5C67
:15447F00DEF49B73F6D3707DA7B8FD01ADA65F9BBDBE31373CC9
:15449400F1FADB874FBF53F8FF76FE73C2C5E2F6FF76EB03FFC6
:1544A9001FFE47854B45F8F7CDE54BFF67E0B7DB47ECBDA5C765
:1544BE00FEB580974916FB24D9B869EA1F94E2B7AD82AE287AF2
:1544D3006F573508C7BB56C5EBB6AB74D607656EEF0675DEEA92
:1544E800EDAA2CDFA9CDBB6E40F5F7688AC835A8FECA063509AF
:1544FD00728BDDA7D75D80B159F236A998DF1F9BD7DEEB35652F
:154512001275FF7A70EE12D7502389974B7A3F073C392036A83C
:15452700E53D2DEAC3D7372BF53DCD4A50BC4D1D2CF98082F66E
:15453C002017F17167AEE2C7F83C77A54A6B0FAB078877200F1F
:15455100A9AF4C2AA8DFE584FB28BC59757B1324DFD5DF9450C1
:15456600697FC9BE2F7C2E0CAB6C182A0086BD0043A0A87C2C1D
:15457B00B70E60C078942FE45F5CF6053BDFE9A27CF3F967F20B
:15459000229E150FB3DEB578473AE49D28896B888F3CB3F2BAA4
:1545A5009AB10555801B11CAF4AC69061C35288BC416B5F6430B
:1545BA007CAF9B0DF4D57F9EEFDD3B3F4934C0759110C0817BDE
:1545CF00705791DD9019D81126929358E21EAA1BC074D286E933
:1545E40028D65DBC51ADDFB956E52A1DD8F2171DD83A01B66A62
:1545F900B181FC1320203AF4F254B6A822C1B45D595499547755
:15460E006DDD51680B88E73FE4F3360C8CEA893695ACFDE3E983
:154623007BB0DC9C0D075793C2BBA784F99A05837767A3EA852E
:15463800F2B06EBDB62E3F2ABD115ECA66F0520F6DA7624D974C
:15464D001AE889103CDB4AB62BE580970A31A996B264DF0EBB47
:154662006D2EA6BACF947B0ECAD221CC0BF802BAFB1C1890F65F
:15467700F5DD372A280BD5F7DCA8CCA53F74226F39ED1BCCF4C2
:15468C00A7FAA93D148F3BD5A2066E8AAB3CBB539D07711FE630
:1546A10058D06DFF1BF05FD10370427BA9A88CA8DAE31DCADEFE
:1546B600131D4AC5A9356A4003BF9DAB55ED233740DBBF41C1A6
:1546CB003610009CD6AFB170C1C7B95E996DA0B60D729ADFCD92
:1546E000DDA28AF112BCF7C4EFC1BD9ABAEEFE79DCADAAC8AF72
:1546F50052C59550DE7577A8E2EA1BD4E192554A04D70156CE75
:15470A00C42F0B5AE766287E326CC57FF233AAF844873ABC35B0
:15471F00ACB861DCF53E7E9B52FFA1925EB48D2C24C27D9E6CDC
:1547340047DFFD684F4A0BABF5A76E51B9931DAA067139618691
:15474900169BB08F07E99CCD3AB4A5220C40BAE31D7D34D76B64
:15475E0067BDA5DE505F99B7BDAF3EB556D906BC4106FF21F8F1
:154773007E1A79CE4FD6ABE250878A72B52CDF8AB29D20263FAF
:15478800A3726BEE5429ECC90E080FABC38033A43FB6719C93FD
:15479D0094FF03D75B7F0A70A80DA881539F512B4E6EA736B0B1
:1547B2000BDAC03CA07D7954EB2BE64B4877A41DE928DB34C57B
:1547C70036791DC0D28BF0039EF16EBF1EF84F96DCA5CC837208
:1547DC0010FEC1ADD6FFAA8BF900F225C78D71616C58B7278FDB
:1547F1006B3856DB36606A85F843BE0773AE054EBBBA1BE290E4
:154806003E39C070D71CFD4AEFE3B54AFDC96AC06DB57AB97630
:15481B00F4129B6947BF64563B421A94433B0A8A77115E1EB6C7
:15483000DB12B6A380067E73DAD2F6C49FAF2F0F6E00FAC4FB9D
:15484500B7B35BD7CF0BC6FA39F10ED57157446F5D8F749A376F
:15485A00B0B68F9DE8ED73BEF52FBBE87E9DF2C4DABE8A6C6F1C
:15486F001FE7019A5FD9A0B9810E1781F688BFAB8916AEDE0ABE
:154884006D0BD0E10EA0C30EE2E9C5B428B16991B4EEF5F17365
:15489900C29550766CDD14D105DB4D6CDDD13974019AF86EB218
:1548AE00E9027CD7B7B6882EEF2BA2CBABA43339D3B7B742BF10
:1548C3001E29A213D987863680FE9B6D5A9D063A39B4D9F01E37
:1548D800E971A6881E3FB2E9817D3A60D3E2123A006D8A695101
:1548ED0016FDD4FAD2E8DAF5EC6ED62B663FD5374FDAD057C62A
:15490200FE7A7D79E26FFAC4ECADE4AEFF3CF5579FC8C01DBD70
:1549170093F0CE6F6ED05CC07B2F96C5B47207EFD04F2BC4AD95
:15492C00C0FFFE42AD5873EF2CBC975F0EEFA9C548F322BCC7E7
:1549410009EF4E7D8BF10F3CDF779D8D7F5C13C17EE2E0DF5732
:15495600847F17AD6D58F81DB1F15B897C0AC2F0DEF0E23EE01F
:15496B00A47F89C6058B66988EECD3DB74B0701E9905CB97015C
:15498000CF6286EB7D12BE49E03DA59007DE9FBCF763B7A9F5A9
:154995003D5D8A54B254292BB956C1362C02EF61273AFAF6FE68
:1549AA000B849D5AA3F84A3EA2784A3E6A8571ABFAD8F537F4B0
:1549BF006D8BBB7A11AEC5F69DF2D046BCA5B28BC648F4477B35
:1549D40018CE1C05CB47BB9125CED86D8F1F180F75A511AEE79C
:1549E900F3793FC429F4FD27A1EFE3D87506A693B85E82F2017F
:1549FE008C75FE27ECF8DF82FFFA9779FCFA8E505E2975976B5E
:154A1300FC36D4D3629C7597298C2C795F74FC768369A4F38504
:104A2800FEFE99F5D6F2FF06E2E5D1A4A89C0000A7
:00000001FF

View File

@ -1,928 +0,0 @@
:150000001F8B0808AC5A10380203736261323030655F65636426
:150015002E62696E327D00DC3A0D6C14D7996FD7B3F5AE71CCD4
:15002A0078592F3F8DD70F0AA949E8DD022E07F61A1644AA40C3
:15003F00012D88A433EE52268844E8924B571792229D1B0F8EB1
:15005400013B7DD0C7608813E1640D5E58529C6C909D101DE4AC
:1500690016357749A4E4BA8A7227541DC9AA17295C4A2F76455E
:15007E00259438EC7DDF9B19EF7831C4A1524F772B8DDF9BF742
:15009300BEF7FDBFEFFBDE1B3FFCD3BF7F88B808896E2484FED3
:1500A8008890844A880EFD1CB4BBA00DB710128396439B8076CC
:1500BD0018DA4E68B51FC3036D16DA1DB8364E88026DE92FBA6D
:1500D2001EFE486452BF7C63D90D63AE825E0863FB54E1A984C2
:1500E700782F999F6AB59F9E3C49B19D522690D8ED9FFB737D9F
:1500FC00FCD38F45DB66F353D2B6AD1433AEF2F2F209D77F491D
:15011100BE34E18787275C3FF52678EDF13693B20B7EE47FE17D
:15012600E71A20BB45FB4AA95D5E29DC72DD983C8589E52B4C68
:15013B00927E7959B9A987A7DA6E4DCF24842D778E97CC7F63BA
:15015000F90B6D6DE8BEAEEBF97C299D49C95956A43F7A5BF4D5
:150165005F7C512AA1FBB7D87EF4AFBF99905E79919E97FCDF83
:15017A00FFB93C759E5BCDF3F48DEFDA29E89C2A8EA109DC0E0B
:15018F005FF8FFFE2B387E24ACB3FC6765A432BB6F911CF4C674
:1501A400C1977CFA72F2308031121A8EE3BC3E026FE14E96FF67
:1501B900025AF9AA21793BD46B5B3B1A708EC8A429FF1CF1557A
:1501CE003E4F7C81FDC4977802FA5DC447C2618EEBEA932EC057
:1501E3004BB79000C012130F873C52EDEA50657DA14AB86BAFA6
:1501F80014D4B75C5C467C1D4F126F20B8231E269759EF9EFE32
:15020D009D846F61249CE1FA03844C0B6A716FD52F20EB9C6518
:1502220035C1447C7AEB6916F59268404FA9249C341086C4F6C2
:15023700182477ACC79FE300570FFC87E3FBC3A4657AEB6A1692
:15024C0085F4D4BE7FB34AE4F5AC7D7DB3FA3C213546D2DD045F
:150261007C32C81F7230EF6A9E22B7A8B81EE7116EDFCCCB8A9D
:1502760067E549751FF5B490DC6C5641483010844C26EF66BEA1
:15028B006067FCC3B9C4E721F3D53DC3EE1669F72655BAB04CF6
:1502A00095B6AC654B008EF03EFD6EBA6531EA08F113F958A63E
:1502B500F8F4EB015853B966BE7AB950A8FEB04D8DB4FF933BA0
:1502CA00021254BC2478DA75DB3C456FC2D306E429775C5F2546
:1502DF0078A202FFB7626115F9D9AB95B5608BFC601B04DD5402
:1502F4000575C0F90BA1C39DD5640A91FBF4DC8A2D0DE780D715
:150309001DC0AB3D1FAB26E3C3487898BD07DA0F053964FC6180
:15031E00B09F6E2C85F4EFDDC054B2B33F93978886ED30B49447
:15033300768879E085CA723BCEF75CC37918AB1763BB718C8F81
:15034800E218973A503F887F41CB78FCF545FC0256ACB3E8DA10
:15035D0034052D8BEE84341DF8D924F1874DFC62BDC065D1B458
:1503720069396575E2BF52823F5CC47F03AE9BF17F2BFD283F5C
:15038700BE7DFE1BC41863C362AC4325B1FE8C3D3EF66ED31296
:15039C00F6BE39FF0257281DAF69ED17F8883C2F83386A5A1923
:1503B1001BB5E418C30B73E3E48AF573539E9BF37F2BFCD76E07
:1503C600827FCCEEB1FE1E1B7F838D9FA45929AE521C387FCD8B
:1503DB00E143B62C02A73CD433A10CE3F647A7B91FAAFA55D204
:1503F00030CFB4AD06B685FE0DBED990327DD38903EC5BB9A572
:15040500685F6F5587E09B3474B0AC44A2105B784D2CAD1ECE76
:15041A00B85B80BE512D77A9570A85A0D33FD6FD99EB3BC4FAF6
:15042F00CE09D78FAD053C57715DCCE12B18A2352F4BE4DF3E26
:15044400A3E73F3562F9670D7FEEAC3AFD034D21B14BAC4EB966
:15045900475D4C7FC5F6DC3B9020F2BF81EF26793FC4F5605035
:15046E0089631EE0D00FC49222DEE3788D3E00FDB481E324B744
:15048300A8470EEE8A93DC7B10B366C4F7CDDCA178E9E3ACFDEA
:15049800FD956A27C4B7F6F7D7837DE688787987152FBF0532CD
:1504AD00C87598AB92BC1BCF26E134E7D056692EE07F3ED0CF67
:1504C20033CC96D2CAB56AA12CCB24D72A55EADDC8BAC949C5A3
:1504D700A50DB0EEB2E30AC28C421A3D4C5E56C05E0CAB886E6F
:1504EC00F23A8C67712DF4FF45113C02DE68FE6D03E4309096C9
:15050100DB45AABB203749D1BBD5BB80A7629CBF17F86C6701DD
:15051600E06D6788F8BC40FB933677C4BBE135950CFEDCC09CF9
:15052B0087FC728B5FC455F5515EED2E3BA9A05ED65592181934
:150540001C30B244C0E918E7BB519E705AC4FC2A42FC2496D294
:1505550047B7F635873457A377C309F0B30106F089DD3F9C0F86
:15056A00364FF16B85424D9DF26B359AFF9457B94EA8B1FCDB9D
:15057F009C84327177E57915E18379C83D202BD2385A0672CBE6
:1505940003461053742C63CEC97F32C0F601EF8697D559078ED5
:1505A900C3BE4D097EC0EE19B0BBD8136BE99A8829F3A21ECFAA
:1505BE00CAE3AAB013E634CB4601878D1EADB5725A02721ADA1A
:1505D30000748276C8A27FA15F800E9016D959D40FEAE5975DB2
:1505E800DF079D844D9D583CD83A09002E874EAA854E56AC5F7D
:1505FD002CF0900C0BB60AF9C00FF764AC07F676126B984CB013
:1506120055E82BFA3CD80FD619159837071F671F423DF547CC48
:150627009D9ABBB94EF94FD5EDFED9920D9ABB2948DDCDE3ED05
:15063C007B3FE4F1ACE201DD96CA8CF2A1DC1EB2006AA3679877
:150651000CB2CABD9BD88E3B896FAFB6B1C9BBE105F0796ED6EE
:1506660014E1A5ACB002FD803221E3D52B26CFBC5F7F80DEBF28
:15067B00988492F15AB2470D8C32C12FE9EF63DDD98560AF85B3
:1506900006ECCF8CF5F4E05E053D0AD9486CD0C0F501D8C35394
:1506A5001C72BD05754ABA6D6364519B29DBDD753F5B485DC4FE
:1506BA006BCAFA6BF53A79F216B2E641D6939396B5F5DBC477B6
:1506CF004CC8FA30C8BAC39435047BBBE1F7A67CB1E3FA532095
:1506E4005F6DF63BEAD4489390AD2C36430DE9A1E66F635D12CB
:1506F9003B20628096FFDC38EB2553A0E5B81F85AE5007644910
:15070E00D12FE4BE8CF5801EFA8A7AC8BD6A209D523DF4801E4A
:1507230074D043D0D24325E80169074B68831F4E194FF38472E3
:15073800C0972AEED189F7E6346B6F46C6E6D1C78027EC8760F4
:15074D00EF3AF72BEE55C253FAB5151EC10BC417D8AF2761BF9D
:150762007ECADD9543AA6BE659D5D53524F6EC11C79EED297B45
:15077700C5DEB37E9C3F52DCB335E8FFE8D7CE7D3B0BE05046FB
:15078C00BF4346AD9C4C71EEE7B1FC943BCDFDC1CBF1EA46B191
:1507A1005788F48AD452BDAC53F4AB5DEB45BC8E06486C8EF056
:1507B6005F6EE65EC88572F20A93D6ACC59C974940CE2B4C4D3A
:1507CB00B05EFDB8C2662694C06E880F77A4541FFA4FCCB0FC60
:1507E00087C7671D931ABD55AB61BFC6581BD118FA4ADA05352E
:1507F50041586188A322F20CD3A03568598B1F7CEB04ACF36627
:15080A008FA9011DF3FFEF0D51CBE01EF84BB6DB3E6764B09B53
:15081F00E9E04BC89773FE51F0AD1524C1B6E9879693F065A3B1
:150834001E6581396FB61DCE4A585F7C435A0F9AB4B278CE7380
:15084900CCAD4A8E3621FE34B9357E5D33D7E74BD637265BC568
:15085E00FAA513ACA7DA492677758B1C6DCF47110FCCDD958C37
:1508730034A1FEEDB501FD984A61CE8BF0B1B9803B950925C1C8
:15088800A6164C8305238BF5A9CC647C22F0A6D48CF11F7DAC82
:15089D00167D35D76F94D64FEB1E76D43FA2AE642C8AB58F2916
:1508B200DF196CCD7ACFEA53689DF58F63FD1C0D7D1060A1FEDC
:1508C700411CD21AA61EC43D0BF2E27E1A572BE3F1F93E2FEEED
:1508DC0053C31FCCC6F17C5BA75C51FF86BE06E7DDA19D24F6BF
:1508F10004C39C9E7B40D4893C8BF50E9C875D33CD9A270A7153
:1509060003EB2B92DB8E7006C2C9C119702E7E5A9C8BA747FA68
:15091B00C59938181D54B1CEC0F544AE15676212AA8F4F8F3447
:150930008873309E89CB8066FBFEFBADF3F0BDEAF32EFB3CBC70
:15094500D43C7BDE10C78B67CF89F2349E3DDFAA29397B62AE9C
:15095A00B6CFC3B992F33087986B3F373B0F7F4D8C7C4CDB1875
:15096F00F11C3CA3BA601DC6BA3D10C776BF9B56BC55C7314647
:150984008A5A40C43898C739A0853569CD9CA4A7C98449A13EBA
:15099900A222060A9B891858EDADFA15F8C48098DB4EACF36D2F
:1509AE0091DF1EC423D60B9D9B7024F62763F7BB19657A24259F
:1509C3006C00670103C726F7FCB3217C16EC1BA8492A585360D5
:1509D8002C47BF7906F9224BD94BA843FB5EE0366C531F98D827
:1509ED003613DD0B94C796AA28EB3EBC178056DC0B403BFE5E71
:150A020060693CEEBAF15EE0EB6CD6FE17B0D944FAE413D8D15A
:150A17005B750FD830CA2C7939CAEB6D9D6DE290470CBF43DE6A
:150A2C00042153049FAD7D967D070C8499DC73613C3F729F6190
:150A4100E39D01786D5BDBF1E9CE478AF1C5E5EB107ADA94DD30
:150A5600D3689F51E58D49A5A67590C5800FAC0FF04CAA79CD1A
:150A6B003C8DF05CE80DFC0A748363EE92B161475C9A41E7F61F
:150A800060CCB93802B97A659F1AD0D07F1A18C81E708580C77E
:150A950031BED23C564648A3E66944597640DFB5C63C7FE1F838
:150AAA00E1DA2106B508F7C82F412CEF33EEA4A70D29B9C7210B
:150ABF0097CE104EFF119EB74C5C4B268B2B79AA880BE087AD61
:150AD40073A08BE8784634F0DDA6F34DE4D11DF2F43878D02783
:150AE900290FC2651E30E5D11DF27C2DAE1279AE96C873F536FA
:150AFE00E5C938E479C7C1436692F2205CFE7E539E8C439EAFE6
:150B1300C55522CFB51279AEDDA63CC991A23C67478A3CE0F891
:150B280064E44138D99207FB4B268BAB449ED11279461DF2440C
:150B3D00ADFB0C19F3B9E5E3750A53EFFB09D2357D04DF975A45
:150B5200EF19EBBDDE7A47FAF83E43BC2799F065A0B1AB4CB4FF
:150B6700ECAAF59EB6DEAF59EF17ADF751EBFD1DC0B38B9EE038
:150B7C00D8D760AE93BECCC5BD03F47BE86B5CD403D04FD337E7
:150B91007994DEC5CC73C5592303EBE05C51334BF33407939EC7
:150BA600667FDED3EC053B606D8F3236D05302CF7658BB9ABEDF
:150BBB002AF074437F337D83E3FAB74C3E38D2DC4E777313AFA4
:150BD0006E0C025EBC6B5841DE6167B6BEBC5CDC59004C15F5B9
:150BE50034E2D80B5B5F136359C7D8335BDF1463C8933DF6E484
:150BFA00D6BDCB6DFC7751D37E886796E8A7F9768B3EF2B4B65E
:150C0F006E60998DD386455C36ACCD2BF216B26011EF5F514FEF
:150C2400B3B84BB1743AFC88A9D39CF8EE61CA3EC3CE1F304F8C
:150C3900C7CD9BF4EEB6700C9A638CFF9D09F3A1850369071099
:150C4E0007CC651F2DCE452C3DC6617E1DE80F75C7A01FA7072F
:150C6300399E8FCE099E2E0B3E1FA5CFF15EA1DF1EE3F48870DB
:150C780040FF03D73D4D7B67526543E88D85CFE692CA0F962315
:150C8D001F9D424715509B2E592E352D0AED5EC861EE6E319754
:150CA20011FC56243D8DB3DE949A82A1830B0D98AB5A6EF28FE3
:150CB700FAAA807D72FD2BA9E98BDAE7161E82B93F367B9A2BEB
:150CCC00B4F2C6CF2EFD2182387F57CB22B8FEB7BD831184FDD0
:150CE100E0D269C8FB3B044DE03FA38B7686E019E4CCC444BBDF
:150CF6004BE026E1682629DA84E0036A8E0CEE89E9172EABAEBD
:150D0B00F735D87FAFB0CA60268EFA31D75D36368BD6D41109F9
:150D20006B8602EDB495C755D7FA47A0F6D9CFEEC05C097A3363
:150D3500E9268D0ED1EE303A45DB23F4590EE705D7FEC701FEB1
:150D4A007BAC2A1806782A6219C20F8A36619C15ED52A1F32969
:150D5F001700FEFD7F10B5D5D4600CE0A386C977D2E887F6692B
:150D740061875D467AA498DB4808EAADB0226CB30D6C93A007C3
:150D8900B81CCCC1D845B6B4CCBA2B17ED45A301DA9DDF273E14
:150D9E001E76B7C0318F1D182DF8D1971E85F14A7A02EA055D0D
:150DB300E8AF0CCE160BBE8370E6BEC25CB9CD82457D5BFB8D79
:150DC80061FF29A029FBDE533B9625AD6F6D507FC1B896FF8DAF
:150DDD0011681D62E8C0DBF3AF1BF0CE75E02D104DA9B20FCFF3
:150DF20039EF1B121D323E69B0F8A1B3D9F52F4D1A4761BD6C70
:150E0700F1C32D7E8ECE29F283B9EE030B36EBE0277B0B7E623A
:150E1C000E7E36033FF0CEF904FC6C76F0F39845E33DDC47160B
:150E31003F598B9F4A073F98AB5659B0E86F363FD8BF193F51AC
:150E4600073FAB811F78E7C909F8796B71919F8FBE30699C1BBB
:150E5B00C19C66F28334909FD6D9457E30D79C3161052D37C413
:150E7000D68EE694310A676A3BC63A3F0F6874906BF434C4E84F
:150E8500CD4C0EDE173FBC2CCDF0FF560EE74E2AD65D9091B78B
:150E9A0062CA7F8CE0652EF17B1D79334EFB7959D57995E60779
:150EAF0058714DDAB868C5631B5601B86ED8DB7E888DCEF53124
:150EC400DACD37037D05F850E85178AEF0049DCB77D105E03353
:150ED9000DBC9346C056AB799DB24D35C8A1447D3EC5BAF55427
:150EEE00A207E093F41C4F53C60FF79E663564409DB6A597D514
:150F03005EBAC23AB67C97EDA99DCFF66E59C8F6F52E639D97C5
:150F180056B223B56718DED37CFCDB32DCD30CFFB7E7D9DEF32D
:150F2D00ACF2C231F5E0A5FD500FEC5FE2E4EB9D30F155D1D593
:150F4200CD6363B176D6B090F8FCCE3121403B3B7A93F1CDD75E
:150F57000A378C2B5A3BC77889FA09D44FB08EB7B33B9B26184E
:150F6C00875AE06A1DF179434911ABC046F2DCE4318EF6C5F74D
:150F81004F46AC1A413EC789CCB844C51D2BBF8AFF6810E6FCBA
:150F96009A687BF8A8DBAC7586451B66A4007551554AEDD6878E
:150FAB00946EBD5F9926A5D4236543CA91E88072186CF9ACFEB4
:150FC00086E27DEF0FAA8005E0837A9722AF632AFA4185833FB6
:150FD500BC8390D890187F52AB6CFCC4FE770F2B6EFCFB0A33BF
:150FEA003F6A63B934C991E73990C72A925F35CC4A3E8179C4C6
:150FFF00CA8567451D63E6AFB366AC039D99F98F5B303D026617
:1510140047314F8AFDF09845277B039D3BC6D131F3E559510FD6
:15102900D97432169D0F2D3A264C0F33E3709A87AF12D21B76BE
:15103E00B5941F48A981E83CBCDFF3FBB5EF468290ABAE5E372C
:15105300E5FD40FBEBC6CBD0F782FEEB14380779061290B39AFC
:151068005DA1745CA678DF1B66C92CC489A4AB65333D652C022E
:15107D001C92FC3DC8435D3C14DD1F3948BA13788676877AE21E
:15109200D23D50A3C5468CB974C4705BBA8ED02E234A0F1A8197
:1510A7007C8A734F6AE702DA67605C895D0039F2FD5C069C38D8
:1510BC000E276206072EAF93E6A617FA9A9DEBEB9443AA61E19E
:1510D100C0B5D8475C147049A1FA78B464BD1FD647E97306D4F3
:1510E60010D6FAEE09D7E7FE1173537D1C7909C3DC02A833C232
:1510FB00B48BE1DD96413A120AFD2FC3E3C238779A19E470422A
:15111000D23A0C3FE46037D6BBB17EC3AB751B95DA39718F365C
:15112500DE8FCF5A7EAC8FF3E331FFCDA614D9E1BF55502B8C04
:15113A00F928F801DA0F7DB4FCC0805A43E6A9A66CF5A66CD11A
:15114F00BE66A73F0768170F6A529384E766C29917ECB1733E0C
:15116400F1E1FBBE999DCAC54DC4F7E2CCA422D3F9C236ABD16A
:151179000EB096AFEE7E085BCF52F13F2D15B383264E79893719
:15118E002E43FF568F0947444B8336DF14F65D1D91AB16A81DE5
:1511A300EEF90F79AC71EED71FB2E7F1FF6AE4E8DC07251B479E
:1511B800B4FB41BFDD5F591C17FB04E498438E36617E801A931D
:1511CD004E8BF5604D631CA2520BD51883B37A0061360998CB74
:1511E200D6779F4EBCA3A0247692076973837DCF82DF034657E0
:1511F700342F36BFD19B7797884F4E7633C487637EB95B7D077F
:15120C00713AE82F17B829C33B5949FE0CE87719B80EE95BEBFC
:1512210032B80EE89D71F62F3AF158BF83B9E39073F0FBEF1552
:15123600568DF74FFC285B8BFB92DE1B09D2798DCC8A0F3FA1C4
:15124B000F35EA629F778AEFE5BBA75C413ADC2F3F67DE75C28B
:1512600018E4AB1A1BBFA4CD6558B309D81F7EDE4272FD7C9ADA
:1512750003B6C2829520374F16EE10F0BA0AE2DD0B5A5D13D6FA
:15128A0008E677FE432A9C9E184473435AF339F8E46CD63B4C08
:15129F00104FA67AF42893454EE83FF3BB42A11AEF06B789B5BD
:1512B40069B17681B69FD5C84FAB776AE759448333656C9E811D
:1512C900F489DC6F081EB09F4B19923C5745DC52FEA88DDBE4E5
:1512DE0011F6DA589FA78C2CD058A44D6FACD2A6477EA04D6DF9
:1512F30044BE376975CDB67C923C5B2D956F3273820F7BACC455
:151308007E7C18BF7D9F03DB65E24B08A9C63AC6E53BA7BEE98E
:15131D00C2FBC734D64D747A10725E6CC8C0DA424A0E31D7BBE7
:15133200E7D5FF065E7B5CC48BF6C77BF9465AD358456B227E15
:151347007A47E366D0D32A5ADBB8CEB237E2A8965F1577D4E057
:15135C000C34289F51CB80C60298AF86BE1BFA088773F6B90BB5
:15137100E15DD638AE0F26E78571BD8CB2027D19F8284CA5ECCB
:1513860008E953189C8702AE3EF17DE059F17F5203D67D685A64
:15139B009CD1719F797D57D4368823337C4755D7CC4EF57052CB
:1513B0006AA9B9705E9D23EE5933868EDF5E760E88EF34384755
:1513C5008E0DB1CBE2FB0C65B3C8A9E508432C18F17DA56F880C
:1513DA00CDD2BE6A126B89398EDF4DF4248EFFBC89C883064DB6
:1513EF00A6F03B8821AF1950A330EED79AC5B817DEA980AB6D72
:1514040092F05E22F6BA7118FC026582FD5F8D7715B3A2A71B27
:15141900C59D456ED038AC4942EF788FF70CC43C5BC6A0252368
:15142E00CA11B1F27D7D01CF75FF43CC13064755A4D993BC91CC
:151443001988C3038611280C0F1CD6E045326894648038C168C9
:151458002556E40688EE7B5CD089266EB450729055768B5B5FCA
:15146D003081041F5CF34C206BE1DE84CD94932B2203071A3D8B
:15148200ACCBDE79BB68A5AE721677C7D5B9DEECD69E4779615E
:151497008D6CDC65AB38E7BEAFBBDFCC9BC9A0E0DED5FD987AC3
:1514AC006FBEEEF77D5F7FFDF5F77DDDFD7547F5F31B315A88AC
:1514C1001BB88ED10BB618607BCEF31C0253B2E941318E59B05A
:1514D600E751CCF18671A03F4CDCB28FC53814642D3F01387A39
:1514EB00433155770FB3BC0699D9A328ABEF954FB03595493179
:151500002F4698A20CB3BD8A291B2C2060E47206562A6057702E
:151515006D46C454576DDF30DD1B292025CAB0698761DCE8CF5F
:15152A00819102899467C3E8203CE5C8192A83AFA9C032D15E21
:15153F00DC8F21F4769E6B22BEBFF4E59C7F70B1EFE3D4E291CB
:151554003FC5FFF019EAE881BE606BC0316AD10929C3F44592AE
:1515690030FAF4188BBB3F01BB07D1C3168CBB93E9B888CB7601
:15157E00C1548AC935947C3DCD6728F916EDE819566B6CBC2309
:151593004EF46F7DA14186B319437E5C0345D9C8C3B42F1C65B4
:1515A800F07A019F12B1117B029F3EDC2F92193EA6035EFC1FE0
:1515BD008E1956FFA7447F768BFE64BA60C90D6224A00FF3A197
:1515D200D7696F826C29B2D96359B4C7259E72CEF3BD2FD3E9DE
:1515E700C559F685CBFB75B6CF555344C27ADD1915C74C0DDB68
:1515FC0013E730B2613AACC00E2BC6711C376BC1E339C47B8D20
:15161100CCE1A1E409E0F7049D3FC9E4EED3053F0C0636CD57B4
:15162600191773BF8421C3372C8708FA8C3DC3678CD9888F0E7C
:15163B009BF9EA933CF549BAFE5B5CD600837773773ADE8E53ED
:151650006931CC3E443BF19DB5C90BBC5B6D82F729479CE97FDA
:15166500C09B29DF579729B7607BF3C0A40DD3614E3B2C67FFB1
:15167A0091E9BB1863D6F8B58FED8E9CB18D4FE7C7710DCBAE50
:15168F00F58D9EE71BABEC255B19C674ED8BC82CCBA6A03CAC55
:1516A400727C5F72A1536BC8299F85B4EF47DA71A3028C776FB2
:1516B900C4B945C6BD0EC0157E28639F5037702C5865E5F6325F
:1516CE0090834BE0614F1B8EA21C1C56FBB9FE71989E0B037C5D
:1516E3007B2C983703D3F3C0667AB261D8A62E5B9B2D58671E54
:1516F80058A1C70ED38D4431D8B685423E246AA0FDC0F1E915CD
:15170D00FA1E4FEB3BC0D017D8D63A4811616B1AA8BF5EA6BF42
:1517220031C3D2F39907713D3C418FC2B8F785B86DCB8743BE31
:15173700611C5086397BF230D6331B6CF350B4EF681FB7A15DC2
:15174C00C1B526F8EEC0C2B8CAF0839EC14490E683CB36B861D9
:15176100AFBF203F5C0678AB43D8DF626E732D99615C500F659D
:1517760079E5E5CDDFD6591F27B43E7DB8EDC0C284CA7310AFE4
:15178B00436EFF8BB8B09D5FD507C68DF0F58D7165F76B42D8B7
:1517A0007BCB77737B9C2DEB6C7B9C8717F886F302710A3E0187
:1517B500F76CC4C7F6C3F3C8214F7D92AE9FCDDF6E9BDEE11865
:1517CA007678A68F71E2993EC60B3CD3C733C903DBEF9E3EC6AB
:1517DF009D9EE9E359CA8161FD57ECDF66E6BC221EC371CE7D03
:1517F40003CA7489CDF7C15397785C62129B2F9473CA245B99AC
:1518090037A7CC652B5B905356642B5B2C0B3F129834E23DC8D7
:15181E00972EF2CBAD582446838A3390893D6294E5EA425F6464
:15183300628FA8C6E38C9CD853CEE4C8C8BE924647DD2AE853AA
:1518480098670742867C3B2105072B357D32E5763A3AD5367878
:15185D004A20935E85AFC3FE0874EA70F4F7E5646A805EE941AA
:15187200044EC44576EDFFFFFDD5D610F7D86729370D75A835F8
:15188700F749EBACBD4DDC2F24EDFA293667688F9E1A67CFD1D9
:15189C00532CC7AA3D796A929DC989D2C446BE16678B410D07AF
:1518B10019FE18E539713F71ABF7F3BC65EE67BBC1CF0E829F2F
:1518C600051FC9E456C2E466F9EA1AE083783AD5F2CF84EC22A0
:1518DB000E263BB47D51C0E307F847F749AB91D6D98D7C8C8CD2
:1518F000C013D71B1D0A8B154DFCBF212BF68CD107BF617F17F3
:15190500B179E0A4896D045924842C12421609218B04CAA2F079
:15191A005E57A33D7EB95EF9E158F228CB033395AEC0D1422EFD
:15192F002B0EBB13600702F12CD83D00EB0B9CB66045089B0F62
:15194400B05B03A30863FB3A5CA6572E810C4196172F4D9765C3
:15195900C37AE2BE700965E95F7DBDEDBADEF69CCBA30F054261
:15196E001F3EAA26EEDAEA6C3E2B24E2AE075E9CC0EBDA3CBC7E
:15198300C6A17E29E3B574F58DF4C1F5F27B3C0FBF8582DF525A
:15199800A0DD1F9AAEBFFA35F4B77322E52E8076B44F4C6F471A
:1519AD0012F0344F603BBCAB6F54976EA43DF13CED91447B1A71
:1519C200818773F7417BBE01FDD6FF8236297E2A2BA594D97E0D
:1519D700B0798EBB0889001CFF4BA4D6D88DEF01D550403A8B99
:1519EC0015CD9495EA57D91E33D899FA08AE37478DF001EE1352
:151A010095837CAE32FE32F86249077FD8CDD64B0DA837161922
:151A1600328B9A4E9A139F72DC7EC09B9AAD1B53F0DFC1FFBBA4
:151A2B002E7C9ACDCF0551F70A3C1B20DEF42A9C1E51393DA4D7
:151A400083F4D02BDBE92D867A454D43663DD0DB2D709CFE9440
:151A5500D3EB14F4E0BFCB2E4F59C8B3086489E5ED5524AB7C94
:151A6A008E65FFAA7879434EF95C513E26CACB73CAE789F2E328
:151A7F00A2DCCBCA278D1A9A39CF92823652D2A5E2DE9D0B7DD7
:151A940074CEF9956E888768D4B905E28CAD55B8AEA977AD2A29
:151AA90056A4A02AE29A9E8517D5AAD0BE60AD2D5F60CF48D3BE
:151ABE000728ABE7DB3FAC0AD8E01FFFF0E5AB085FB3F5832A70
:151AD3007B7EC18537BFFF1AC29FF8DB9F559162DCDBEE373A7F
:151AE800FFE5856AAF4FDF4A1E236E974ADCD3F8B4E58F2987E0
:151AFD00B2FD338F35264DB4210E0F9FC331989CDD362B3EC2C4
:151B12007A3341D7A7D6F2DC19ACDB5337ACCE8C3C12D85FC732
:151B2700EC391DB5EC39945967724637E69FEF1B9FA7DCF14B5D
:151B3C002977661E46B55EDDAFE2BE0AC48DEEEE8551753D59D3
:151B51001EF490E5AB16298EE0799045CF42AA6ED0FDC17369BF
:151B6600B9C4D99AC4CD4C1E740FC6284E88F50673CADDB672FB
:151B7B0009CA3B3372ED2E9048B70BCA1D65D07FA2CE22E6D307
:151B9000F8B73741FD0651FF0EB0FF3EE1DFB0CC07651584EB9F
:151BA50013FE5F7261402B81FF8B6C75965C8869DE1C7E1E8494
:151BBA007E4A4462A60B7C6CF96F53EEE8D594BBF9CBD42CD1C5
:151BCF00BE7511B0D3A03F5976C52BF45442F9839E86927F6EF3
:151BE400E84E320BF50CE3600B37AE5FE21EA16CE30B73854FA4
:151BF90047980F360222BFA108F02E00F97B9712B7EEE7BABFE7
:151C0E00600DE016FB3054F8F31749BFD13B3AA8BEB90CF7E984
:151C230002068F654B0C561EA830D07717B863DA0F963E5CEE8D
:151C3800AD8CD2D65732F1168577A90F2255788EC2EF1CFC9498
:151C4D005EB0AFF01B17BFD65EBEFE85F82EFE12D7BF94C6F455
:151C6200BC4CC0A3FFC1E161012F009F5683EF7480CE837E2B7B
:151C770000FF50CCD618264DE9DB84BC823E830E9896DCADF9D7
:151C8C000796596D9394037406B3ADD4083C4A48D17FA6DC93CD
:151CA100249BAEEE22B370AD1BF1FF33CC476702DD31A81376E8
:151CB600733F65E191051EF932E76DF493947B90E7F5883A101A
:151CCB0007D1210DC7EC646A361B23B837D6F7F7C7198C4CCED0
:151CE00026DE9F0EF277F883F2CED48D9AB89FD6377A5C9D2F99
:151CF500B1F50E93EFB3454DDC575B6BA3C3D71DFB8DC7C61FD8
:151D0A001B5F363A98A53F37A3FE209FA043814ADCA386B8203C
:151D1F003C443146DBAFAC0BB01C45CC8D8BBC4B95C819C3C77B
:151D340072E8BF303D7CED9BF68A7557BE8E3BC2F70C020ADF8D
:151D49002F40BA387EC227CDE7593FDC40FC373E8438D2F3B0B3
:151D5E00AFE741D0065A69FA79F475DB3AF0CB69FB17A5E3B899
:151D7300D62B1BEC9C14192D20E037D8FA3EE0A0631B591E841D
:151D8800CF9A67CD2103EC0C12CA784CD834FCBEFB5EE296C690
:151D9D005FD2E40F5F52ED362D6D77D99C6CC448FDD57B923824
:151DB2003324A32D66F3191AA37790C120E6EA4FFDFB7095BD05
:151DC7006F6E1263BBA482E45D1FE56B9BBAC03B22F026742EFA
:151DDC003FC0ABC738DE25C7B3F0CE1078C757E7E0457B08F1E8
:151DF100D5BE85FD2A3BAF0F3610F126393E7D19EEC9CB83B482
:151E06003039AC4BC933BAAB28C6D6F966029DB961AA3922869F
:151E1B007128296D91944EE316F91D6D2C95F279A25230334FC2
:151E30000D1B1877EE72A0ADAA6DB4CEDD635E358B4B587EE23F
:151E4500A4A9E2B3B8A291C80FBCCAE64201E554E8D13CED0713
:151E5A00FF15E847FFD5CFFCD7BE8523AA67B4EB5E466F5CEA4B
:151E6F00A49571CE7B38A67B301E13F082484C972B13AC7D8726
:151E8400C801D584B1ECDA30C8F6D1BE85361EFAC411194EB76D
:151E99006F6E6830687DCBED46FA7D1A3FFDFD997CEC7DE0FFB5
:151EAE003DBAE0875E831F80CB601F91173B4D07DF4FDF9375AB
:151EC3002604ED1501BE8B47F83C5FC44F203B2E1F9E4F922D53
:151ED80047B9EBD5ACFD0B186FC88303FA1AD73F43C9237B8A4E
:151EED00F95C4DFF25C07BC351D5E5116B64C0D3C5421DCF3873
:151F0200CFC2F2B64D3C470A7DCC3231BFAB653A12D7FF14CA3C
:151F17002CDE19DF507FD7261607B33C8E7A51EF7BB67AD5C94A
:151F2C00D7F7C04F47786213DBD3D0314F00DB82F349E4A3F77A
:151F4100A598EA1DE5FC20DCA2DB2AF09DCC4377C446779BA8EC
:151F5600F7B6ADDE7AA08BF5466DF5DA44BD9FE4E16F7DF2845B
:151F6B008EE3EA1CE3F16F74F403B5789E06F83BCC746798AD4C
:151F800015F7FE1DF04A0619AFB5365EDB05EEF7F3F03A6EE3A1
:151F95006197A8F78F7978BD60ABB75BD4FBD7AFE035BA39C326
:151FAA006BFDD7F05A6FE33529700F6C9ECE6B7C7386875F8943
:151FBF007A439BAFD19F9B33FD59738DFEACB1D1BD68F5671EA7
:151FD400BA2336BA13567F5E836E77038EAFB328031AB6D3C5F7
:151FE900F68AFB3F106EE9FC7EA87F84C4D23ADFE0E43A7FD59C
:151FFE00C1755E6FC8D00E3B39ED8E86AFA00D741B045D8B5E7B
:1520130083AD9D0D02474F7E1C14C7ACB516ADE6DA3C3C4FF630
:152028005AC6DEB1F18CE771E5E394F92FBCB7473E4D31CE73E4
:15203D00157569FB206E94C197C9F5EF6A0B8C33DA41DCA3B7F4
:15205200D9A01F40BBF2D91EEB3B9F23A61ED18755D417BEF704
:15206700774085F9EA1E9C9FAE67B832BEE12EC055007E216DFF
:15207C005743C3AA6B438CD954664F2D7FA1A33D8D317B2AD7C5
:1520910001FF60471DB6F7ACF61663BE4EBFEA5848B514E65951
:1520A600E0BAEF659EFBC57D5382D3A7C29E86FB786C07BE8FF4
:1520BB00B765909DE791C3BA46D12F4586C12FBDADB9A2670C99
:1520D000F44D79FDC98F32F33B9ECFD0A9F970BB1AD712C4FFBC
:1520E500A9546A5EEE5C8FAF47B2FD70B3640AECAB1BC656B88C
:1520FA00D4A0A18E36B4C5AE426E93252BCEC6F32DBF4BA57368
:15210F003F9529969F39DF9E372855F27B70545B3DBC8028B73B
:152124001EFA84C30A9EA11AA188E7093C4355E6C0DBD558FC4D
:15213900EB284E3462F92DA141ED96D0DBA8336615D6C19800DF
:15214E00F3A901EEDB1A3333FFDFD618ECCF6218A3101F4D680E
:15216300FCFBB7D1A77B0B3C1DDA7BBFCDF0E49F6271928DA775
:152178008451454EAEF1298E80451BEF02BA83D18C52ACEFBB81
:15218D00F50B33FDBEEE8B349DE492936B0BD2795F309F147980
:1521A200F8C8D7FC5B3127A28F9AEC2C5729CB19BA17C5217371
:1521B7005CBC6E9CA2FCC12D9AB2BC17FAFA347CD36B4ACA69E7
:1521CC00B3D1164F5E7C84906714E79AB30E316FCD43E7218C26
:1521E1005DF2E2F69B4EF94DC07DD620B4CF94A2EF9A986F8196
:1521F600EB9F69DF8DF38A42317E11EFB7C57D14A20CFFE7B9AD
:15220B00EF83E596A21E4DCC40BE127482E78C5397E0CF65E79A
:1522200003FA1BF945BCBE6082E51BB1BC0FF9A4897CC83F5F73
:152235008EBC73DD13EBF1150319FD463C138F703CFE298E9FB9
:15224A00E34D30F9CCFF791775C01C0EEFAFE823C32A9EA3C3D2
:15225F0098977F9330B14ED63800FCC707ECF7C9F07623FEC926
:152274004778FB389D78161D6B4D00EB323926B91C6FD9DA6987
:15228900E23D116C4E63A7993E5F1B32382F1586CCE4526BF06A
:15229E009C8480E112F9A00C1E1EA44F2DC5D8F518CB47B4F334
:1522B300E07D6D39B5F71DD431257908F7E6A9A5272CC606DB7A
:1522C8007A9874AAECDEA8B0C1E4827C61B904EDA515BA819379
:1522DD00E4C2A24E8D1EB8533B7F21E526E3036CFEEDC53E92E8
:1522F2004F6992F22EF545F8F9796BEEB2A070FAFCA9A36E8876
:15230700CDE7B2E650E327CD7B6F740E15FE4BD3D229CC23ECDB
:15231C0077F2F969B64E711D425E4A845C589F04A33C7F4D1EC1
:1523310030713E8DFE0CF5097580C94AE773E9A35FA6E6D8F47E
:15234600384B9F59DE7800C63E9D30E6F9028DB87EE2519697DC
:15235B007F88FE14E6E9CF287706AFC098BC2BE965E7B07B1FA4
:15237000E5F4E38FE2251B0798DE610E97809B083F27E6B551F3
:152385005137915357C04D841F15E3DDC2FF9EF8E67CCE37023B
:15239A006E22BC55E03F27EA2673EA0AB889F0B502FF3281BF77
:1523AF0053D4C57AF8BED8666FBA6D65F88E67DBF04C9B0BF426
:1523C400A8107C95A40C98282F49DEAFA19F092883788676EE70
:1523D900DC505F9504F3D3F91D135A9132642ED22FADF5557FB6
:1523EE00A64991D3E66B51E71617CFFB9C373332638D14993002
:152403002D9D9D09B62D7915D7D13263E0FBE02325766E884EE9
:152418001B8F627CA5ED0AE2900F0E68BD85832AF23677ABDF7C
:15242D00B4C633D301B409101B3892EFB2FD46FEFD88993B9E8E
:1524420079FE24D08431631F272FDDDCA925FE89AFF3C9C2A6AC
:152457007DDD38D98BB9A2D618E91960392BB2F0A7385696619D
:15246C006E00C41A8FB1B5F7CCDED306C51910E7A9FEF0FD47F0
:15248100DB78AA2DF83FB0D139F1445819A04E4F17936729E02E
:15249600ABFF2CE377E9E7397E1778C13A44EEC03326265B170D
:1524AB00298E373A0FC6B43ED015796D8CDFCF00B8703D05C6F8
:1524C000E33C764700F8662CC77BC33087D8F2BFB8BFAA46965F
:1524D500D2420FDEBDD7618CFF3A435BCE1387B8224097AF4988
:1524EA0098D85F7DE0F7E5B303C6154113FB378B2694BB7268E4
:1524FF0066B7BFA4B1C1463F6CA3AFE4A12FD9E82FCE43DF7F80
:1525140083F431BEE8AC0C18162FC8C3D825CEC362A0954B5FF5
:152529003E3BC46829910103EF4082B9B789B18FA4F03B8F16DC
:15253E004706E861887BD0A74DD9E31C5C7393FD66679DA1E108
:152553005D60532FFAABD87E5FC96D2BFC75CD41E54F2A2AB7BB
:152568002A0FFEF1A60794CDDFDBD9DEF2EC4E6553CBB696A616
:15257D009D2D41A5FAF107B7EF686968DDFEDDEFB4B63F5EBE5C
:15259200F2EE9501A5E4999DAD4FEFD8B1FDB9C79B9E6F0AADAF
:1525A7005A55B9EAEE157F7497F2D4D3DB5A762A81CAB255156B
:1525BC006595ABE125581E0896DFADF8D3FB5B16BDB2B2E696EB
:1525D100B6EDED654F6E7FB6ADACA9B9A96DE70B65CF363DFDA7
:1525E6005CD9CE1D4F96B5EC6C2B7BEA85B2A6A66D0CB66DFB24
:1525FB00F6B6953B6F5B758F72A7D2D2FC74BBD2DCF254D3775B
:15261000B7B52B4FB6363DF79D16A564577BCBAEF61548E5FA76
:15262500F037EF78FAF9961D654F41B31E6F6A7FF6F1E61DCF95
:15263A00AF7CF2B67B2AAE853F8D9E9D679AE30B37EE67F71A4D
:15264F00F88DB9BE8AC612A59CAEC4B35CD6398D88B406EFD1B8
:1526640038143AD25640FA8DC6DFA7D2E7341A958DE627BF703B
:15267900AC91E48735BF526DF861EC7D0CB6C40BCF37D176E26F
:15268E003E09DD6FB47E9172FF74A9146C50866829942D22C3C6
:1526A3005521A587B2F2B0B4370030B4376B6D30AC27830F04B5
:1526B8009C66B752B4CEF2090BC036CE203C96C0FF5701F73E78
:1526CD00F9E5368C13CFFD756A16F2653FD7603FD310BDC2F71F
:1526E200CABA58FD12A31FEA13F9B2E9856FCE027D3B4FB48D99
:1526F700B0B3D32B1D642EF2877C78959314DB3003E6A998E3FD
:15270C0046C657E03EA9D7577DA7866DEF02393A7F52A9E1B5D5
:152721006A7EC0C5D7AB0E1961E58746CD08D08678CA0BDF5BC8
:1527360074F01C97B77A850630D34EF3A1548AD1EC62FD72CC9E
:15274B003C9D4ACDC1FBC4F8BA738F7113F805C439F916AEE733
:152760000700768CF1E5047F7908F90AEFC775B9F956BF5967CC
:152775006CA2BFC3BEBBCCFA0EF7571405C69DDC957029F7980F
:15278A00CEEAE3D0DF07186E1C8738068B94D7CCD22F1D6BED4A
:15279F00EBBF28734BDEF67EA87927E5FAAAF2D27752B3ECFD49
:1527B40081FCC8C08FD7D65F6D1197114DFEEC556C93121D4848
:1527C900CCC13BE7E8622314ED4890E2B6464F926CF14697828B
:1527DE003F3EC7EEC3F3F96AA1ED0F18787F29CE1DDF9470BE3A
:1527F300A41A18D348EF3FA3E11D51F5B8CF12C6B3DB611693D4
:15280800F6EA41D50C55AEDBA414ACFBD079D1F0856E67EB8DA0
:15281D00462235EB23B12F128AF6D09BB2F4A01EF3BFE763BD01
:1528320066A8773ABDAF1231F07EEE40B49A12F915EA666D83D9
:15284700793795F63ADCEB35DC4767F617BEDFE3C0F58C8BFC2C
:15285C00CEAAE601889DCB204E78925E29242ECFD880F69872A0
:152871007370AE72F3AA3796CE0FBEBAECD6E018C091DED4894A
:15288600D4AC658A23C8F8917B0C5C7376C1383C0F7A9FDE0F44
:15289B001B3FC6FDF1F831F32F1696A86C7D186CE4D142116F97
:1528B000290EB6761A075C565DAB5E3BD4395837A0E29DA7C812
:1528C5002FAEE7E6D2C2F18BDFB7C2F7EF39385FB8A679E10D71
:1528DA001C3F7BE9E2A241CDFBDF47282A4A6D14CFB45F64E72D
:1528EF00E7CCD0EB6A1FE05D5454AADD8577C28E47D55272D174
:15290400E80C9D68C33D2E05FBA96E8566429FA0AE38770F1B8D
:15291900B8B71FC4F58EF08F791F88B18B31B4C4E6610AF015FA
:15292E006A64FC877F6C8E4DA5DCA70B783BD7439FAECDD37719
:15294300308F9E9FDBA6DEA914CBE9403CEDE2FB4530C69CE3B3
:152958003A8C83FD4601CC4B42C923863196725BDFCE80B1811F
:15296D0036F0AC903BEEA7A22CC22007AB4E3F94B1F7F1970D63
:15298200CCA762FB8F50A7F48D6CD95F0539E6E315C7ED82680B
:1529970007F57FCE653E359CFD1D933FEA33B305FB0D4BD6BDC7
:1529AC0020EBDAE88079F5B8F0F9F676A34E8A761FFD0D6F378E
:1529C100F63DE2DB05F84A599F458C5D2C6E133AFA2BAEA378CF
:1529D6007EDA51F780867B86DFB2F450F40997670657E8379C5D
:1529EB00E736D00DE083E9C6A2A2B59AEF178EA0A523783CBFC9
:152A00008DEFB30A1D39A3625CB78C9C5987FAE1AD4C30BD3021
:152A1500F565AAEBFD214D025BBB4CE8035F0FC8EEFF1190B788
:152A2A004F3EC6E29DD9A01F5EB0BF577E2DE46E8D0BDB37B8AA
:152A3F00679D4FEE2B717C437D94FD343A30AE7A218EAC17FDA3
:152A54003EC3A623EDA023AD1F701D71809C25A123E597B99C53
:152A690059EE01F6FFF14C3F223E4FB84D6BFDB7B672B0676627
:152A7E0049B4CEF447FFA7BDEF8F8EE2B8F3AC1EF54833D22015
:152A93005AC3CC20B0905A443892A33833625024598481B05E2D
:152AA8009910769673B2DD92B0C7B1BD109B64B93B6E1FEF85E7
:152ABD00C42318890137B8E913589615337224AF7C0B398507C9
:152AD200397C4F24E2C239B021DC2C211C9764F1388FD8BAACE3
:152AE700CF283E62E3C466EEFBA9EE1E8D846CECDDBDF7EE8F21
:152AFC009B7EF3BAEBF7B7BEDF6F557DABEA5BDF5A69AC4D3DC0
:152B110064AC4ED519D4075AF65353DC2E34E6371EB9869F2B10
:152B26000ACEB2EE45FDB55654BA5B0DDE817DA2914EC869824F
:152B3B007B50C5FAD98475AE1E32F7037C3D69949F0DE4EB5DA3
:152B5000B09131CED8A10527686E3ACCD7BEA454B701BDC4D514
:152B6500A9935CDE8BA786C193F324B9DB582D9F34747AFBF5F8
:152B7A0011F5B46C86B3EA61EDEA07C8832E36E6FE07F17305BB
:152B8F005F77BC253C273C2C7C56F00937D8AFD97F633F64DFE9
:152BA40063C3EC5966B0DD6C07DBCEFE9A6D618FB38DEC61F62A
:152BB90020EB600AFB125BCFFE8C7D917D81B5B17BD96AB68A61
:152BCE00AD642BD8729A41B6B066D6C41AD93216664B59030BD8
:152BE300B120FB0CBB9B7D9AD5D3F3297617ABA3A7967D929E0F
:152BF8003BD9127A6AE8F9043D8BE9A9A647A6A78A3F95F42CC7
:152C0D00E24F057FEEE0CF42EB59C09F72EB999F7B02D6E3CFE1
:152C22003DBEBC675EDEE39DF694CD78A45B9EB9B73CA5B33E15
:152C3700733EF0F17CE85372DBA7F8233FEEDB3E2E6E3B338E52
:152C4C00F3B1C15A4DE6674B4856A96CEA8C32F928FC6AC84FD6
:152C6100B7BE6BE93B6D7DD7D3B724D037FA96CA5A8A1FD17442
:152C7600D6A6A569522C098A26C98B8F4A31FAA7E89F597C1419
:152C8B00E598B6496BB90D3659B6FCDC969F407E31CBAFD8F202
:152CA00073905FCAF22BB1FC0AC80FF95199FC2CAAC4A2412BC1
:152CB5002FE8F906AD3CA0D71BB4D2428F374869A202F66465D7
:152CCA002D880E49BE4BA3D975BF93E469F845B99D8790EE4D6B
:152CDF00090DAE3375D4FEABFB5D679A558E9F0F091BFD90302C
:152CF4006E7F87C24A298CFC0DF88B679B555E76BACEB07167CF
:152D0900E31CF5485B30EA2F719AE8329F770775CCF318EAC994
:152D1E00D3043B815FE0507298F1E3A7AC70EA135BE5C5866EE7
:152D3300E593FA2FA67F94E245D15F4A8B0DD105BBA3B3BFA3AF
:152D4800C2549C74DEB7E498FAD62D7F8EFFF1EC5CE82698E770
:152D5D00F7656DD2B4C76AEA6D705D4699EB74145ADFFC9CB4E6
:152D720083788DD11C34D8447DA783251C4D4611ECA1469AD5B9
:152D8700C9EA66BE1E37F943E732E0046EAC898E533A0F6B8218
:152D9C004EB4514FB8A08E5673C90D4611BB8B60BFCB700622DC
:152DB1009DE959FC24C1F463F25B06FADADA996B124159E77EE0
:152DC600E0EF029CCB151A44A29914EF6A10313F96AAF537A019
:152DDB003B2F85A8C826BD9EAF3BC17E6C33D7C9803BEA28A727
:152DF00032EA74942F9E2957A5785D186F57BCAE01EF28EA9AFF
:152E05000E72191A71391FC3DE6230A8C5799B68D2225CD728D1
:152E1A0002FF58766E1BC58972FB879095CD33CF312DC2F5F20E
:152E2F0037F133A82CB8C53C03CDB659F714242D5D08ACEBCEA1
:152E440025A012345F49E83A4B28D8DF81FBAD15E23296DEA113
:152E59007B64B1814577C2AE9C8BA565DDB4FF6AEA31D5670A9B
:152E6E001A789E941F5F47C277B4574F2E882B42AA17DF464EDC
:152E8300CF23FA5FFB50BF0AF9A02ECA670DA62768DE242EFB76
:152E9800EE83DFA5FC5FEE833FFCEAC9AF7F865F39F9F5CCF080
:152EAD00DBBA82E0925EEBFBFA83AF874860D63CF2157D1B3BFC
:152EC200A355AC7C5D6DAF7A25F46CD3045FB75814BF44F57999
:152ED7004A5BB4F2BCEABA4FE336CACB2DBBF3934F88CBC4D496
:152EEC0090EEA0F15196BFDFC7F4EB862B69DAE3E476D4C70FBC
:152F01003406307FA2F298FEB7C61DC2EB2AF051CC5E098D3CFA
:152F1600F86623C142B4BD42F09DD7056D9FFAEC86D7B43B22A6
:152F2B005486B4CF20DCC56FAE581D72ED46F93B47D94821CDB2
:152F4000E3BE33EA725DA3F05DFDAEB6D7C9FFE97ED3FD3796FB
:152F5500FB3FF59FC966FD7DF679C0E8CFFB128E333AF0B68DCF
:152F6A008D6BF11F14367CEB5B850DD07FE84F3FAB2CBCF0B4B0
:152F7F005270FEA2BA865D0A2D1C3FA9422748F8C900F4F5CCDC
:152F94003A120D70EED52FFD07F5FA43578C85C2CB14E792E1D4
:152FA9008A1F69C4BC15F94F3E745E77A50A1B469F285CC6F5AF
:152FBE00645FE26BDE47138E14D1FAB88E7AFCE1507738708AB3
:152FD300F2977EA3A12E12608EFE68D485FD1069D75189C3FEC9
:152FE800E3A3AF513B2C96F726B3244F16C9DDF1FD714D11D6BF
:152FFD0069D44E7FAEC36E288D00EC2917F610B4E464F5EF0D02
:153012008ABBE74DB97E5994E26F8FAD6EE0EBAF05E6594D31D5
:15302700F56DEA279D0DB1F1C30D4C3FAE4F82FFB0BE47E1EB7B
:15303C00C95F4C1D211EEAE6F6486A2D7B41BCBDE97BB9DDF0EB
:153051005ADED648AE4DEDA5B616D744A2ABC4B430DE2EA635C4
:15306600E08D3D3257EA00EC1D733BA2E5A9842EB85EC63C93F4
:15307B00DB0B052FA28DB8CE216CC88842EE4E258CBBE21AF7B7
:153090007FEF27541EB921134ED2D4D013131BCA486E445B997A
:1530A500AC1E321606529D63379DCB0897C6E9F7B22E89E06916
:1530BA00A5322EA16D05FB349DFAE156CA97A5068C8BBC7E4946
:1530CF009DDAA91424C0DEEED6C24C3F053BDAA3E82F7747CE85
:1530E4002BBF7EB4B0A18F752B7DF1034AE91271595F64AF3217
:1530F9003FD1ABEEDFA929FB9B2F73D952CA1CEC5BB3A4F2B3DC
:15310E007C8F28181FC5DA6BD9A204F600F58A14AF8FB986EDC6
:1531230032EDF5E3BB4D24193AF39A2EB411EFEAA78DFDE39A1A
:1531380082F541576A80D2ED028EF95E5E79E6A0519179CEA8B5
:15314D0025BC54503D338524165038DA67ADBC8BDB6EE1794811
:153162009A7191E6A1E5F2533AB7B1B841D3289D8EBE418C1DA2
:15317700D3C3991F50DC5DD4467A699C1B509167762EF4786000
:15318C004B80BAFC7327D583F15EC5BBB257756843AA6B7CB87A
:1531A10011E7E87DA78E98F6BC4F33B6003A00D029A39FB8AE2A
:1531B60047A57AF73BD6ED53134579776CA4B1D69FD4BEF10F46
:1531CB00E28F0F0A9C667C0FC4977981EB03F25B806033057EB2
:1531E0002CC1F5B78013733F24C9F7438CF15EA53CD3D317CC90
:1531F500BC9092566ABC0F2958ABA9A2AC191E17F6B807B4DAA8
:15320A00C881469CF3F277116FD1BCB63C0EF7712360B985B33F
:15321F0003AA392E1C307C194F03FCB0B6EFCAED8FF4F13D009A
:15323400077097EED56B389DCCF3C9021BD1A0476D9E4B1EE5BE
:153249007DE9AF282F612DFAB214A7AF903CA20616751B4F47B0
:15325E00CC73AC584B17BEA071BBBA12A7B3693B5AE23CFF9D4E
:15327300A35761D392EA8DF56831437D5BFA3AA7435946C4B92C
:15328800E57980A79CDB5F4A76DA773430FD4903F6C100A7902A
:15329D00F986569B9917CAEFFBD1E783BEBCDFCFF5F9D4FF6FB5
:1532B2002A6CF765DEC638C06DAB48991EE3B1F7B37EDFFBE0EC
:1532C700779306C0B12FB34F7768BD6A598BB9E7EFA07E03F7AF
:1532DC00DE7858EF520FF1D042D61B02FDCE7D798A77CF59B649
:1532F1007F2F73DDAF894ECE7B4437B845BEDF11E7FB58A037C4
:15330600E8CB6D5EA19D133D67D292E3DEA2C3ED70FB9169045F
:15331B001AE4E3DEA6C7C7A04131A7419FB5CF33458BDBD220BD
:153330006FECB5F11F1B87BDB4D2603E2DBCB14F86605F8345EF
:15334500BB466F3CF1C946295644E36C972E901FFAB1CDDF28C2
:15335A006C38F147FB3CA0D99F9413ADBC8B3443A03A8176A8A8
:15336F00A3B9E7639681F290B77DBE7D4A7E32E9B1208F16DB67
:15338400393C49D3EE0E85635F51CAEC3304EBBE1BB8953CFDD8
:15339900E3AD79E9B77E39A7E7CBF583FBD830D7DBDC049A7748
:1533AE000D2B1ED9C9FBE92D5C0F50D31744CCBE29D7EEA8CE2A
:1533C300C2268CCBF4BEEF3CC701B553DFB63F98F5CDCCB8F661
:1533D8000BF6DCCB03C9CE052413C82C7534C8C68F4658E668BC
:1533ED00F93F66DDF41E25F728F98F3659E93F28BE32313DBE77
:15340200CB8A8F717EE0EDBC32B1DF48F391FCB4A80F9F7B51F9
:153417007D6E92FCD28AF573792CFED499934A2189F6A2DC9BBD
:15342C00849D9A62F97412679ECDFDA0717EE651928FD13C2606
:15344100A17B324B1A4E1FC8BA81878167B3EE9979E6C3C6F7CB
:1534560031296DABFC8C7EFD558D64259C19485A7CF8EF0DCEEC
:15346B00BB416EB37E723FC98F0D241F7D1CDE9C7CB5574F3836
:15348000481E1D11DB275FD58C84A3CF6895F71B6FDF44FB88C7
:153495005B73952EE32A6422A23FF657652A231F2737AE4CC7E0
:1534AA0027F6772DF9D6D47FD60774C8D202B52FD491DC46F8DA
:1534BF00DF91FC188C72BBDF763E727A2A1FDFEFB3AE0A9CED31
:1534D4000994C32EB47E91CADC06BBF91968DC46344FA6562FE1
:1534E9003C15527F10AF0B753735F13EAB88D1DC287D9F562434
:1534FE003C4C7DCB9A19B2A6639928DFA7CB99681FEC1CBB5C2A
:15351300D514DE66C9998B1B8B694EE3A8547859B08B0879DDE3
:15352800D915524B23A17031953D54754F634546A631B3562FB7
:15353D00CF0475C1D3A2767F3BA439C769FE986E326C7BD4D0FD
:1535520001E132BFD445F2674D4874134CD1AF8C32FDA17E5706
:1535670012FB88FF9ABF332B1CCB6ED5BF29B7F4306AAD7E2D55
:15357C0048FD5A9302B9DF2B0B413E9709364DD94049BF30BA8B
:15359100607C405D60DD59E0A3711C63314BBF64940957D55FDC
:1535A60057977E96914CCED88426B1DF34FA846B6A69B5B301F8
:1535BB0072648464F60A6158D593DD4A39E618D46FA29F14DD49
:1535D000AF73FB344CDA31FA00FBEF212ECBC1760CB91792FC9F
:1535E5008DB7FD5F2817B5E7DC83669A8FF23F9CCD06642ABF7B
:1535FA00D1CA9FDBF69F257FFB1F4F4DE57DA7FCA73C0DEC3F98
:15360F0049B566F92E8259B6E250BF1E58287F32945F1FF84BF5
:15362400DC864D11CDA95ED259E685A33E6AE7C998735945E6DD
:15363900A08EFE14BC8A7DF5329219DA16F42E8D903C8631F194
:15364E004B4E9DCB608DCF68215BEEDAF47EF603E52ECFBBD91D
:153663000F94BB9A6691BB1CE78EA890BD206FD9F2574EEE8AAB
:153678000C37E28CBB6F25CEBABFAE35DD9CDE1FF23E9368DB97
:15368D0056FD686331D7C99ED03CEC64A3EFD4FF22584E6A8B1D
:1536A200334B7278704D38DB6D3CC006D104E1E9DECC1C93BEB6
:1536B700382B6386EB62F2B87A37A1A1006E2B0C7E080B4085CD
:1536CC006486DF091AAF3E088F243B841D6DD7D41BEF645DC0D6
:1536E1002770566FE1B0E63D138715B3E010694EBFF32F8B4708
:1536F6003FE457C2E3A2C089CECBC063747F5FECF733AE95B49A
:15370B007065F3FFEDDCF2CCF4D103FA1AD6A7DD4FF39DEFFF58
:15372000AC77A92C9F1AA5514CF30A24A74A970C9FD54E45E8FD
:153735005348BF34B6B1CB5A99F0867AC7CA6BEA216A87341F91
:15374A006FC01AB85466A898FBB2F401CD357E90DE07B53B5395
:15375F00628397E6805EF6BAEA3D754515F8BD15A3DCBE14B79D
:15377400AFF4438C1B716D60FC07E13B28DE1D142F30DE13B21D
:153789006D3F4994066D54A638B63F6C3FC11FEDAB32736F4889
:15379E009A28E434E736A7CE5EE16D0AF76905327786A6EC5777
:1537B3005DE1FD43F0D5D2507EF9F2AB81696EE9D5CA696EE8E9
:1537C8005BCDA7B2E673B8BAF3E03A990757771E5C272DB8FEA1
:1537DD0084E072E6C175320FAE25A19976B582164FE7E0CAF8FC
:1537F200A7C3955934CD0D9EA9A0B1B531833E90DF11C9F8DC00
:153807004700EF8C111DC61AE711CFCC3F457C263F63283769B9
:15381C009E9E7E5E0F73FB865D7DF192443BDCDBF85D55C7FA7E
:15383100A00F5570866091BBFA1DE7BECD797284AFDD3CAF0766
:15384600E5471BCDB897B5EB2B8A96791E7885E629BFD45DF29A
:15385B00F7FAEBE5FF61C47F37939F7A463DD07F4CADD7CC6F34
:15387000CCF37B46275698F98C52BE3E2BCF1B2B3636DECDFE86
:15388500A681CFD3F3E2222DF2C84F778EE2EC78F2921294FFC4
:15389A006229FC21BFD134EECFF0FD0C64B8684F0AF323A42D33
:1538AF00C6990FE25D9C27ACD8FF3CE763F4AFA2957FE9B4EFA6
:1538C400F92187F9DD572CCF0DD15B7770BD769DE7EF786E8FEB
:1538D900CA714CF3761FC9FF46E405458A24D472C23F3FDF2953
:1538EE009936FF6FF72799272924D7ABD85767D24E2E1749FE99
:15390300B862CB455C4642D8C7908F6CD9C8929366958F201BEC
:1539180041460A731B30391947D3CF99328E598ECCCAE5DF195D
:15392D00F320EB92DCE492771B23D7B2AEE294962C26B8C3914D
:153942004483BD76514E7216E224AF8166DD3AAB15DBB75F33B8
:15395700E5AEF11FF3701DE141C20FD2B3D4555D583041E3BBD3
:15396C00466D21A915A612712F9523A58EF5A19F04DF214FCC1D
:15398100DFC17FB5F2ABFDE6BC7E265FF7F2FE653EC9C5DE53D5
:153996007B492619D3C08315046BEB1FF3E55FAB8E54B7792958
:1539AB00677BE6CDACBF96E4DD6DBF356556BE1741F09D79D3A5
:1539C0004C531630CF6FB9ACFDDFD1F9CC4D7329F7C83CD38DB4
:1539D500F3A3DB1DCC7D86FEE6FCB0D6B28F62EA383953423B4C
:1539EA00F33569F6D962CF4F894F4E35ABAB683EE6EC1A547BD6
:1539FF00D3834AA5EC6C59287FFA73580BE669A43A35771E3916
:153A14005A4D7C24F488B16ADD29615D59E879E3505D985DEFCD
:153A2900D2B6FC149750CD9C0F4D2F7F55BC6EE93FAB9C5BF459
:153A3E00C7829D35F35989242D56A12F0E5D0DD843724A7FCB73
:153A5300F57BEF4ABDDF0ADDBFC03743E8C3B84E1FB761111D23
:153A680036D6523CBB3CF8B7927BEACE013E472F96024D9DA766
:153A7D0003B0AF54DBF95E00F936987A72E5ACC4131BA4B1734E
:153A9200897AA72C34632FD513AB366E90BFF8CD2EDDD4AB1599
:153AA7007B2E5AF32BA7B443FD1585C13E682FE250BDB0372D1B
:153ABC0043F78FFCC4D8A031067FFA7EA390B92F5BE98AC87D98
:153AD10095FCF11E221AC35ED698C33CB3DB0B9AFB26614796E4
:153AE600158DC02EE7354DBAF08C02BDEC729C75938E692ECFE7
:153AFB0011751DD1769E2CB6176506349CF3A8A07E349041FC40
:153B1000BD3B30C60996EDC0BB52AD4B258F797608B675E6F2B3
:153B25003C87FB711F93CB8CE32B4F894B85915BD3B26811D7DC
:153B3A00D7D6096F61BF797616FA59B09B0A3D948C1F77C324AA
:153B4F0072F73188F2756333D14D24BC78A82DC7E89BCDB21F0F
:153B64001B8CB9B458E6C747C52B5DEA7B3E3BDF8A5CBE492BCA
:153B7900DF98653B7B0FF52D63458C9F1966E9B8C1F793A4B0E2
:153B8E00265436758A995AC395811FD12AD3C4CB2FCF4C92FB54
:153BA3004CA79449519EB14EACB3EF59B049E17D5BE596CE8A23
:153BB8000C6C185CEE14E5AF196301933F6A284D6D26DD5F4F2A
:153BCD00E9C3945FEB3CE60E527A13B63FE9036CB0B3BC0A7361
:153BE20028669F5B8E744632EF187B16449508CF53E98C929B8F
:153BF700E21F5D4DEF18E55D4873DAFB33878C48E6E9BEB68CD8
:153C0C00DE1FA537F6A8A3F43D4EE10A9595F65AB6C4598AE365
:153C210000F64B61F3B13393321EA17C63049B0FFC4AB8AAA7B5
:153C3600B78BDEB0D12B5378057DAFA63C7CF4AEA1F9DA26FA1D
:153C4B009E9807DE265C915F1BF989D4D75C24BF60C0A4476CD9
:153C6000864D72E795B84A7C57E295C5E50579F412008F3C64E5
:153C7500604D35280F515F3764CC464FF33C53588B3A58C9DDD8
:153C8A00A987C2683785CDB216E53AAD757A39BF43A8CB30756C
:153C9F001D841E3B8F149559D537C8CFB5080BE2EA947DA00895
:153CB400C50B6B8CF2EB015E7CB5B9BE6DE2EF3106D6A9B8178D
:153CC90061B1DCBE946DFD5DB7F21BC6EC7CD8D62E2DF8736B0E
:153CDE00FF6BEBA0B685BE7B6467BB2B074FB3BE10E310C27EAD
:153CF30063EAC9D7DBFD13F9457F0E5DD365CB5D046B8C997058
:153D0800DBF4E6772A5AE9026CF972B6B599E76FEB8B230DE54F
:153D1D005552CA5A7918F22A0ADC8A2FB46F9F30759E439A7424
:153D3200501D4772753C7701753CA2AE8149D46F0EEB9317007C
:153D4700306C5F99FB57F2CF281AFD23F48FD23F46FF2DF48FD5
:153D5C00D35FA77F8AFEA3F41FFF9919976DED36EB6A9EF9E018
:153D71006E7D867B74863B3DC33D39C32DBD36DD1D9CE18ECEF0
:153D8600706F99E1D667B8475FCB3B9342F86913A6DBB78880A5
:153D9B0076BED19C5DB049AA97BFEBB85ACACF365BF9548E74A6
:153DB000626D684D6C43D87F7258AFBD083A4DE14D21F726FA49
:153DC5006FA37F92FE7DF41FA1FF09FA9FA1FF65FA4FD0FFC613
:153DDA0045332E3B36CCF196B2E94F6EE04DCF73036FF13C37CD
:153DEF00F0B625CF0DBCC5F2DCC05B34CF0DBC45F2DCC05B3084
:153E0400CF0DBCC9F9E5BF36657F93974F6E7F73CA006F433FFD
:153E19005A7C62C33DB67D048EB3D9EC7F107E3D2C0FBF33E3C5
:153E2E00FC33C3D1F78C91FC42B2947E7A0E734357B658165B92
:153E4300FA04E676D137F5332D1E1A238BE5459FBD48E36205B5
:153E58007D838EA2B44BDD5C467DD65C56F218AB6989CC35FBFF
:153E6D00B407E83B3CD7ECCB2A59CD725BFF49869D72DCFB4582
:153E820079006793A5347E53FA8952C80E2F4ED9E92019F152A8
:153E970055178DCB872123E8932B9CCB4F531CB96CF6F1C91EC9
:153EAC00E7B0378FF1689299363AEC781E2A77A7659780E49DE9
:153EC100E597292F3797F7A7F7631504EF7609E321E48BDDFA81
:153ED6009E18CEA5BDA8EF881CE6F5777FC6D92EC9753AFA7C2A
:153EEB009C112A5B79006BB9DA9639D89F1AD499FEA2EE178621
:153F0000D516D6CDE377BB87156141138DAD83460DD54D243929
:153F150097DB268FEED52ECEC538A6774A65499EC7988764486F
:153F2A004AE3925FD4451A8BDDA558571EA4BEFC450378AE91FA
:153F3F004CF903B0A63DD3E5BB9139ACE434E5979A8371A6469B
:153F54004FF0B1A9968F4D380F2B2C08727B0A976F66DDC5F1B1
:153F6900AE1667B45695E56AFD8D15C2F2CD94E6CC5C5326B23D
:153F7E00F1E0B5740FA7F477653D4EBC29A57772BB7EC85FBA96
:153F9300F02905E78C00B33732B854245945A43C2729CF769297
:153FA800A9708E49E4BAD87C1C862D490379A0BD8BB161C323AE
:153FBD009BF7BA66B91EFF8B9A9FFA7C51FE9E81F8B8FB976419
:153FD200B00D1305243FE3CEC7BCFBA71294C7DFC588F762B02A
:153FE700B561DA75FFCF6CB0C5436E8C33C065A498B9DF269E84
:153FFC007D8B75B5D8B09B3819E17D13F2E0677ED892161BEE59
:15401100EB0437F45D890E25B02303DE100907176F64DDF6BD19
:1540260005F9750AE4D5C91E6F502FAEB740FD1DE0728ED39C6C
:15403B00233AA6F13A4883FD34F7A07AEF9EB2731CEBD27ADD53
:15405000CCBD8660B5D37C2ED2DD029D8B9F1CF9E5618F5C6F8D
:15406500F8B9AEB24A6D76B561C32ECA87F9BC0DDF18E3250BE4
:15407A00476B2D386D3D4E0B977EEC15D7539837262EF7154C5C
:15408F00B50DC95DA39AF7EBF6F1F28C5343CB59380C1D8CAC5D
:1540A400B96796CD7EEB5498FC123AEE46294B3FA9965DB84765
:1540B900914EAD542B65472BD7C94EEF864E94DB9D3F6E5A70DC
:1540CE0036B0257C5C1E7531F715AAE32F88F7D8D6E7795E88FB
:1540E300EF425F1F1EE2F7AEF0F34BADF5FCDC0EC9E1FA77E3C0
:1540F800832D38D303FC3E8D7B0B49A6B5F0EEF5669C2DF321EE
:15410D00AF674EEAD71F7C69F92FC88D3A8B99E1D9F98D706485
:15412200F29BC93F9ECC71FD40C6D91E681DE6E5A19D99F4946F
:15413700394EEDFE5A6C5D82B51884EB95E38361BBBE51613A5F
:15414C005F42CFE6664C6801DC36DEDE1C1FE27D8027467D8299
:1541610055CE2F288F8F5AA7CA8C7379B0783A2FB6BD9D75AFA9
:15417600263A7A62797591BFA7439F3257179AC398F5AFCDD556
:15418B00057088AD9FE675E1788A0D7E209E9C528D6AAD9364C6
:1541A000515FD7A9FD5C671573A30187D54F100EA84F77E7EEE2
:1541B5004C487769E7FE68EB0FD7F33A411FDC4EFB08A503BD44
:1541CA00FB284D7E3FB3ED7D935F3DF2615D8E0D695F8F0C8732
:1541DF0050367851DA3E669E8B4C0FD37CA11BFB9D567D877409
:1541F400BBAD88992386E41E56CBA8CF3D48732B4F06FD8A6685
:15420900D5FFC454FD892FE6B79EE4F59F4F74B3E89B1B438A6B
:15421E00D1DFF1F6A0C1DE7FAE3DDC840D9FF0B169EDE1B7E3CD
:15423300C7B85D1FE0ACE121D35E01CA798EED6D215E36DB49B7
:154248006BB7C9C7046B4F1C67F0F5CE03B8B3217A7206BD7508
:15425D0093DE5563CB0D727B624379743DA623CD145D87AC7ADB
:154272002579BDD0E794B5EEE5755A98129783F76D5AE6F89743
:15428700FCC414EE0A49E83DD4FECC7B42CC7AFC35F1A7CD8B26
:15429C005E36D6524AE503961B04CB42E2BD6345D379EFDCFF00
:1542B10026BE93F3E08B117CB13CF8641B3EB35FE2F86CEDE6C9
:1542C600F0E5F70BF1EBA6CE03DE62CCBC07588F24B694E68D22
:1542DB0039F1776D5ECACD5DBD2CDCCB710B5B2C7D93D9921C44
:1542F000EF916CF32B9C55785EBC478A99F36F6FE4B0FA32A58C
:15430500F1578BED6517FA1487C0CAE6212C7D4C972EA414DCF3
:15431A00F17094609530E610FF6C06AFBA20776A5A2070A253C4
:15432F00261929FE646FFB0EF827DF411FBEC375EE24D7DB9887
:15434400A8DABB8CA5C7742328B4239FCAC45ED89CF3CDC7FD16
:1543590068E49FC07AB5B4D710293FECCD7337952BF23DC1BDA2
:15436E00064F87B2F4BDD07F9E87BB95BBCC343BE234A7C7BA03
:15438300886BAD063D0E3FD7A1B3E6F412BF4F604CDFD9A6299D
:1543980005EBAEABF16CD6DBFB794D419D454A539938B201F0C4
:1543AD0063EC042C80CD4F75692218FC174E28F36354D7B3DF2C
:1543C20056BD4CA33E3CA57C1FE38295A77876402519D88B7446
:1543D70076DD7B28FFE4BEE3FC1E66F00B8F1B3DB6C3B5FB1DAF
:1543EC003503D8A84EA80BBB3EA0812EC003D34F6AC06723D44E
:154401005C28DCC6C5E51C1ECCB27278C07A6DDAC443E08762E3
:154416004B721D742486B52EF2EF457B219CC00F6B1B18834D1B
:15442B00784F120E8E28C8BF60DDEFD5ED1C0F479432AA1F70F9
:1544400020E15C15D5DB853B83A82CD84C0E52F99581894EDBE9
:154455001EB2699F27AEE9C4837B162495B7D884B628C8FEB2C2
:15446A0046163F97B3D7F917DC1E32B79BD4C6D70896F49B67EE
:15447F005B933C5D24B30B7756B8E98D7D6023F6EE149FE33C0E
:1544940023D6AAC0A3F5984B439736D8A4E937B89E663F8DB948
:1544A900E3F15A67BBE00AAB623CA40E10AC55CA28EEB9D475D6
:1544BE00F9402B9F9F521C89FA0E8FFCC51697FCB51649FED26B
:1544D30072312A63BC1EBF4AF230DE9D984B455FE43695FDCD24
:1544E800B261E60F9971703C4861F594BE96D2D7507AF855C8F3
:1544FD005F6AB1F3207E6AF150B88BC2AFAEF81ACFCFC3E766D2
:15451200BFDB61C7D9827208265FF3A499B76EC20D1C85D136AC
:1545270008CE7AF9D556B1396864281CEB05AD349F1692215583
:15453C008A630FD88C8FFC8807FC22E58378FC7C020EA4C7CC33
:15455100FB80D0869B9835BF06CF4B435639239DB02952CE6D45
:154566004F987E9833C18FEB1B9A67316E992F098249CF9C3FD4
:15457B00E55F61CF7FB85E2A95CFEF384B195BDEBD75CE659ECD
:154590007D1DD11186FE07772CF8ADFEC69FFE8EEABBF01D0521
:1545A500F2AAAFF59879AF1085F930F767C731BE6BAFFCB680E3
:1545BA00558C1F6FDC42E39EC79A67983AB0A69C833B095CF13E
:1545CF00234BE793ECE943BEC111138E5C3F99E4F0F9228930CA
:1545E400B76F426EE4591E196AACC8CB333777A13E97A7B7FA20
:1545F900CFDF5AFC8C7A606E47B079AFF2359D9AA934F9E76932
:15460E00F9FDE74F69FF384BBAC333D211BFEBB3AD27453287BE
:15462300B4FF394BFACD1F21FDB559D2856F0BEF216D6296747F
:15463800EFB1DB9737F9FE8CFD27ACEFE4F31FD6FCDF9DBEBE22
:15464D0031335CFAC38787C76F17FE7F3BFF19E19E7CFEFFB008
:15466200F581FF1FFE4F0A97F2F0EF9DD92FFD3F03BFC51FD198
:154677008F971EED6B9E287359ECCBDC46536D67B7147B641541
:15468C0035454FD9A3AA46E1B82BDA73EF6E15ED14E3A4A76CC6
:1546A100933A67F56E55961FD7E6DCDBA5FAD6698A47A8567DC5
:1546B600A5D56A82E416AB4D6FB84163B35456AB22BF7F6A5E9C
:1546CB0087EED314EC110BEB30778969D0A813E582F6AF539F69
:1546E000ECF754ABC5EBEAD5E7EEAB53AAD6D52901CF236A774F
:1546F500C1A714DCC5B8488CD973151FE28BC22754BEF6B0BABF
:15470A008BF71DE843AA4A130AF413ED702F0FAF539D65712E7A
:15471F00DF553D1057F9FE1264E459605865C15042301C22180D
:15473400FC79E5A3DC4A8201F178BE947F7ED937AC7C27F3F2CE
:15474900CD665FC97A60EB20C4DAD7331640DEF18298067C644E
:15475E009999D7DD8CCD9B4FB8F15099EEB57584A36A6591A745
:154773005EADF88CD8EE645D1D557F25B61F9A9BE034C0BA4825
:1547880090E0C01EDC5DDC76DA14EC5EAE07833DB8F813BC6EA9
:15479D0004D3390BA631D4DD73BF5AB56FBD2A94DAB0656FDA01
:1547B200B0B5106CE59E6AEE1F2701D1A697BBB45EF5709876A1
:1547C7002B8B4A13EAFE9D7B72BC003CFF219BB56060BC9EB026
:1547DC000966EE374F3E8172D3161CB81FEC0C7DCFD54C18CA91
:1547F100F6D5A865541EEAD66E9D4D81D226C74BD1145EAA8851
:15480600774AD6B6AAFE75610ECFAE82DD4A31E1A5C493500B35
:15481B0059A2638FC59B8B79DDA7CA9DA0B2740A2B237C11DDC4
:15483000BD360CA07D55DBFD0A64A1AA75F72B33E94F8DA8AC8E
:1548450098EF1B4CB5A7AA33033C9E70BE5EF53F105345F6B844
:15485A003A87E23E27B080D3FA36E8BB641DC149FC52521A56D0
:15486F00B51F352B87CE362B25E7D7AA7E8DFCF6AD56B5CFAF8A
:1548840021DE5FA38007FC84D3AAB5262EC498D02EB34D9CB7E4
:15489900494EF3398587544FAC0077EBF8DCD8ABA96CEB9C2374
:1548AE003CAC7AC455AA67259577EF63AA67F51A756FC12A05F2
:1548C300FA1EE2CAA9F84501F31C188F9F0899F15FFEAAEA3924
:1548D800DDACEEDD19529C34EE96FDE811A5EA3305EDB0BDEDB4
:1548ED008A873ADCE3CD1D07610F4D0BA955E71F528573CDAA2E
:15490200467105D7142DB6A28D07F8B9B10DB005E4EAA274A731
:154917009A3BF85CAF89B51796053B8ACA9A3AAA92EB955DD473
:15492C0037C8E4DF43EFBF449FF3F71B554F4FB30AB95A961F63
:15494100866CE7F224BEAA0A6B1F5779D8CBCD141E52F712CEDB
:15495600407FF038E624C5FF5168AF3A4F38D4BA54FFF9AFAA3B
:15496B0025E776731ED84F3C3087685F1CD13AF2FB25D01DB469
:15498000E33AF5164DC193F7122CED809FF08CBB49D7D177A2D7
:1549950060B33287CA01FCDD3BCDEF5537B37EF44BB61B7169FF
:1549AA006CD83090C51A8EC9DB064DAD803FF47B34E79A67F3A6
:1549BF00D5368AC3CF47100C9B67E80797FDA842A93A574EB8AA
:1549D4002D5767E3A337D9141FFD9A997C041A14131F053C9B2E
:1549E900395E9EB378097CE4D7C86F062FED8EFFF9C6E2C026AC
:1549FE00A24FAC73377B78E39C40B453F03CA6DAEE92C8C31BD2
:154A130041A7395DEB3BD8D9F60EFB5D75CDC1EF702A8EAFEF25
:154A280028196FEF10DC44F34F546B4EA2C34DA23DF07737A785
:154A3D0085A3BD44DB4174788CE8B087F7E9F9B428B0689130FA
:154A5200EF8EF209AE4F50D9D10D67385DC037D10D6333E84242
:154A670034F13E60D185FA5DEFFA3CBADC994797B7B8CEEF5418
:154A7C00DBDE49EDBA378F4EDCFE38F100FCB75BB4BA803BFF2F
:154A91002CDA6CFA98F4B894478FBFB3E88136EDB768710B1D40
:154AA6008836F9B4288A7C65636164FD46B68DB57BC6BFD23197
:154ABB0047DAD451C4FECDC6E2F8BFEDF08C3FCCDD557FC5DBED
:154AD000ABD7C3C81D799CE35DDC5EAD39A8EFBD5914D58A6DA5
:154AE500BC533B2DF1ECA4FEEF5FA9256B9F9C86F7E2D9F09E3E
:154AFA005C0C9AE7E13DC6F16ED7371FFFD4E77BEFB5F08F35C1
:154B0F0011B4131BFFDE3CFC3BF8DA8689DF5E0BBFA5E8A7280A
:154B2400AC92E65AF96DC04EFF261F174C9A211DE8A658743081
:154B3900711E9E06CBB708CF9E94D0FE32BD13D4F714521EB8D2
:154B4E00FFFDD0171F51ABD6B52A52C152A5A8E01E053CECA121
:154B6300BE879D6DEE38F4530A3BBF56F1167C5E71177CC10C75
:154B7800135675B0FBD674EC8A39DA01D762E084CA261E292BCC
:154B8D00941D7C8C843FECB9D87314940FBBA705F6D86D8D1FA2
:154BA20088075D7FC0F55A36EBA338B9B6FF32B57D8C5D9768CE
:154BB7003A89F512C80734D6F94E5BF1BF4FDF55D744BCBD27B6
:154BCC00785E4975BF63E8117EC65230EF62A69125EB8D0C3DF1
:154BE1006A308DEB88C1DF37B5DE5AFC7F00E871AED038A00037
:014BF60000BE
:00000001FF

View File

@ -1,8 +1,14 @@
/* drivers/atm/suni.c - PMC PM5346 SUNI (PHY) driver */
/*
* drivers/atm/suni.c - S/UNI PHY driver
*
* Supports the following:
* PMC PM5346 S/UNI LITE
* PMC PM5350 S/UNI 155 ULTRA
* PMC PM5355 S/UNI 622
*/
/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>
@ -29,15 +35,6 @@
#define DPRINTK(format,args...)
#endif
struct suni_priv {
struct k_sonet_stats sonet_stats; /* link diagnostics */
int loop_mode; /* loopback mode */
struct atm_dev *dev; /* device back-pointer */
struct suni_priv *next; /* next SUNI */
};
#define PRIV(dev) ((struct suni_priv *) dev->phy_data)
#define PUT(val,reg) dev->ops->phy_put(dev,val,SUNI_##reg)
@ -155,25 +152,105 @@ static int get_diag(struct atm_dev *dev,void __user *arg)
static int set_loopback(struct atm_dev *dev,int mode)
{
unsigned char control;
int reg, dle, lle;
control = GET(MCT) & ~(SUNI_MCT_DLE | SUNI_MCT_LLE);
if (PRIV(dev)->type == SUNI_MRI_TYPE_PM5355) {
reg = SUNI_MCM;
dle = SUNI_MCM_DLE;
lle = SUNI_MCM_LLE;
} else {
reg = SUNI_MCT;
dle = SUNI_MCT_DLE;
lle = SUNI_MCT_LLE;
}
control = dev->ops->phy_get(dev, reg) & ~(dle | lle);
switch (mode) {
case ATM_LM_NONE:
break;
case ATM_LM_LOC_PHY:
control |= SUNI_MCT_DLE;
control |= dle;
break;
case ATM_LM_RMT_PHY:
control |= SUNI_MCT_LLE;
control |= lle;
break;
default:
return -EINVAL;
}
PUT(control,MCT);
dev->ops->phy_put(dev, control, reg);
PRIV(dev)->loop_mode = mode;
return 0;
}
/*
* SONET vs. SDH Configuration
*
* Z0INS (register 0x06): 0 for SONET, 1 for SDH
* ENSS (register 0x3D): 0 for SONET, 1 for SDH
* LEN16 (register 0x28): 0 for SONET, 1 for SDH (n/a for S/UNI 155 QUAD)
* LEN16 (register 0x50): 0 for SONET, 1 for SDH (n/a for S/UNI 155 QUAD)
* S[1:0] (register 0x46): 00 for SONET, 10 for SDH
*/
static int set_sonet(struct atm_dev *dev)
{
if (PRIV(dev)->type == SUNI_MRI_TYPE_PM5355) {
PUT(GET(RPOP_RC) & ~SUNI_RPOP_RC_ENSS, RPOP_RC);
PUT(GET(SSTB_CTRL) & ~SUNI_SSTB_CTRL_LEN16, SSTB_CTRL);
PUT(GET(SPTB_CTRL) & ~SUNI_SPTB_CTRL_LEN16, SPTB_CTRL);
}
REG_CHANGE(SUNI_TPOP_APM_S, SUNI_TPOP_APM_S_SHIFT,
SUNI_TPOP_S_SONET, TPOP_APM);
return 0;
}
static int set_sdh(struct atm_dev *dev)
{
if (PRIV(dev)->type == SUNI_MRI_TYPE_PM5355) {
PUT(GET(RPOP_RC) | SUNI_RPOP_RC_ENSS, RPOP_RC);
PUT(GET(SSTB_CTRL) | SUNI_SSTB_CTRL_LEN16, SSTB_CTRL);
PUT(GET(SPTB_CTRL) | SUNI_SPTB_CTRL_LEN16, SPTB_CTRL);
}
REG_CHANGE(SUNI_TPOP_APM_S, SUNI_TPOP_APM_S_SHIFT,
SUNI_TPOP_S_SDH, TPOP_APM);
return 0;
}
static int get_framing(struct atm_dev *dev, void __user *arg)
{
int framing;
unsigned char s;
s = (GET(TPOP_APM) & SUNI_TPOP_APM_S) >> SUNI_TPOP_APM_S_SHIFT;
if (s == SUNI_TPOP_S_SONET)
framing = SONET_FRAME_SONET;
else
framing = SONET_FRAME_SDH;
return put_user(framing, (int __user *) arg) ? -EFAULT : 0;
}
static int set_framing(struct atm_dev *dev, void __user *arg)
{
int mode;
if (get_user(mode, (int __user *) arg))
return -EFAULT;
if (mode == SONET_FRAME_SONET)
return set_sonet(dev);
else if (mode == SONET_FRAME_SDH)
return set_sdh(dev);
return -EINVAL;
}
static int suni_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg)
{
@ -188,14 +265,16 @@ static int suni_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg)
case SONET_GETDIAG:
return get_diag(dev,arg);
case SONET_SETFRAMING:
if ((int)(unsigned long)arg != SONET_FRAME_SONET) return -EINVAL;
return 0;
if (!capable(CAP_NET_ADMIN))
return -EPERM;
return set_framing(dev, arg);
case SONET_GETFRAMING:
return put_user(SONET_FRAME_SONET,(int __user *)arg) ?
-EFAULT : 0;
return get_framing(dev, arg);
case SONET_GETFRSENSE:
return -EINVAL;
case ATM_SETLOOP:
if (!capable(CAP_NET_ADMIN))
return -EPERM;
return set_loopback(dev,(int)(unsigned long)arg);
case ATM_GETLOOP:
return put_user(PRIV(dev)->loop_mode,(int __user *)arg) ?
@ -229,10 +308,6 @@ static int suni_start(struct atm_dev *dev)
unsigned long flags;
int first;
if (!(dev->phy_data = kmalloc(sizeof(struct suni_priv),GFP_KERNEL)))
return -ENOMEM;
PRIV(dev)->dev = dev;
spin_lock_irqsave(&sunis_lock,flags);
first = !sunis;
PRIV(dev)->next = sunis;
@ -293,16 +368,21 @@ int suni_init(struct atm_dev *dev)
{
unsigned char mri;
if (!(dev->phy_data = kmalloc(sizeof(struct suni_priv),GFP_KERNEL)))
return -ENOMEM;
PRIV(dev)->dev = dev;
mri = GET(MRI); /* reset SUNI */
PRIV(dev)->type = (mri & SUNI_MRI_TYPE) >> SUNI_MRI_TYPE_SHIFT;
PUT(mri | SUNI_MRI_RESET,MRI);
PUT(mri,MRI);
PUT((GET(MT) & SUNI_MT_DS27_53),MT); /* disable all tests */
REG_CHANGE(SUNI_TPOP_APM_S,SUNI_TPOP_APM_S_SHIFT,SUNI_TPOP_S_SONET,
TPOP_APM); /* use SONET */
set_sonet(dev);
REG_CHANGE(SUNI_TACP_IUCHP_CLP,0,SUNI_TACP_IUCHP_CLP,
TACP_IUCHP); /* idle cells */
PUT(SUNI_IDLE_PATTERN,TACP_IUCPOP);
dev->phy = &suni_ops;
return 0;
}

View File

@ -1,14 +1,15 @@
/* drivers/atm/suni.h - PMC PM5346 SUNI (PHY) declarations */
/*
* drivers/atm/suni.h - S/UNI PHY driver
*/
/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
#ifndef DRIVER_ATM_SUNI_H
#define DRIVER_ATM_SUNI_H
#include <linux/atmdev.h>
#include <linux/atmioc.h>
#include <linux/sonet.h>
/* SUNI registers */
@ -39,7 +40,8 @@
#define SUNI_RLOP_LFM 0x1F /* RLOP Line FEBE MSB */
#define SUNI_TLOP_CTRL 0x20 /* TLOP Control */
#define SUNI_TLOP_DIAG 0x21 /* TLOP Diagnostic */
/* 0x22-0x2F reserved */
/* 0x22-0x27 reserved */
#define SUNI_SSTB_CTRL 0x28
#define SUNI_RPOP_SC 0x30 /* RPOP Status/Control */
#define SUNI_RPOP_IS 0x31 /* RPOP Interrupt Status */
/* 0x32 reserved */
@ -52,6 +54,7 @@
#define SUNI_RPOP_PFM 0x3B /* RPOP Path FEBE MSB */
/* 0x3C reserved */
#define SUNI_RPOP_PBC 0x3D /* RPOP Path BIP-8 Configuration */
#define SUNI_RPOP_RC 0x3D /* RPOP Ring Control (PM5355) */
/* 0x3E-0x3F reserved */
#define SUNI_TPOP_CD 0x40 /* TPOP Control/Diagnostic */
#define SUNI_TPOP_PC 0x41 /* TPOP Pointer Control */
@ -82,7 +85,8 @@
#define SUNI_TACP_TCC 0x65 /* TACP Transmit Cell Counter */
#define SUNI_TACP_TCCM 0x66 /* TACP Transmit Cell Counter MSB */
#define SUNI_TACP_CFG 0x67 /* TACP Configuration */
/* 0x68-0x7F reserved */
#define SUNI_SPTB_CTRL 0x68 /* SPTB Control */
/* 0x69-0x7F reserved */
#define SUNI_MT 0x80 /* Master Test */
/* 0x81-0xFF reserved */
@ -94,9 +98,18 @@
#define SUNI_MRI_ID_SHIFT 0
#define SUNI_MRI_TYPE 0x70 /* R, SUNI type (lite is 011) */
#define SUNI_MRI_TYPE_SHIFT 4
#define SUNI_MRI_TYPE_PM5346 0x3 /* S/UNI 155 LITE */
#define SUNI_MRI_TYPE_PM5347 0x4 /* S/UNI 155 PLUS */
#define SUNI_MRI_TYPE_PM5350 0x7 /* S/UNI 155 ULTRA */
#define SUNI_MRI_TYPE_PM5355 0x1 /* S/UNI 622 */
#define SUNI_MRI_RESET 0x80 /* RW, reset & power down chip
0: normal operation
1: reset & low power */
/* MCM is reg 0x4 */
#define SUNI_MCM_LLE 0x20 /* line loopback (PM5355) */
#define SUNI_MCM_DLE 0x10 /* diagnostic loopback (PM5355) */
/* MCT is reg 5 */
#define SUNI_MCT_LOOPT 0x01 /* RW, timing source, 0: from
TRCLK+/- */
@ -144,6 +157,12 @@
/* TLOP_DIAG is reg 0x21 */
#define SUNI_TLOP_DIAG_DBIP 0x01 /* insert line BIP err (continuously) */
/* SSTB_CTRL is reg 0x28 */
#define SUNI_SSTB_CTRL_LEN16 0x01 /* path trace message length bit */
/* RPOP_RC is reg 0x3D (PM5355) */
#define SUNI_RPOP_RC_ENSS 0x40 /* enable size bit */
/* TPOP_DIAG is reg 0x40 */
#define SUNI_TPOP_DIAG_PAIS 0x01 /* insert STS path alarm ind (cont) */
#define SUNI_TPOP_DIAG_DB3 0x02 /* insert path BIP err (continuously) */
@ -191,6 +210,9 @@
pattern */
#define SUNI_TACP_IUCHP_GFC_SHIFT 4
/* SPTB_CTRL is reg 0x68 */
#define SUNI_SPTB_CTRL_LEN16 0x01 /* path trace message length */
/* MT is reg 0x80 */
#define SUNI_MT_HIZIO 0x01 /* RW, all but data bus & MP interface
tri-state */
@ -205,6 +227,14 @@
#ifdef __KERNEL__
struct suni_priv {
struct k_sonet_stats sonet_stats; /* link diagnostics */
int loop_mode; /* loopback mode */
int type; /* phy type */
struct atm_dev *dev; /* device back-pointer */
struct suni_priv *next; /* next SUNI */
};
int suni_init(struct atm_dev *dev);
#endif

View File

@ -71,6 +71,7 @@ config BT_HCIUART_H4
config BT_HCIUART_BCSP
bool "BCSP protocol support"
depends on BT_HCIUART
select BITREVERSE
help
BCSP (BlueCore Serial Protocol) is serial protocol for communication
between Bluetooth device and host. This protocol is required for non

View File

@ -39,6 +39,8 @@
#include <linux/signal.h>
#include <linux/ioctl.h>
#include <linux/skbuff.h>
#include <linux/bitrev.h>
#include <asm/unaligned.h>
#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
@ -124,27 +126,6 @@ static void bcsp_crc_update(u16 *crc, u8 d)
*crc = reg;
}
/*
Get reverse of generated crc
Implementation note
The crc generator (bcsp_crc_init() and bcsp_crc_update())
creates a reversed crc, so it needs to be swapped back before
being passed on.
*/
static u16 bcsp_crc_reverse(u16 crc)
{
u16 b, rev;
for (b = 0, rev = 0; b < 16; b++) {
rev = rev << 1;
rev |= (crc & 1);
crc = crc >> 1;
}
return (rev);
}
/* ---- BCSP core ---- */
static void bcsp_slip_msgdelim(struct sk_buff *skb)
@ -235,10 +216,10 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
}
if (hciextn && chan == 5) {
struct hci_command_hdr *hdr = (struct hci_command_hdr *) data;
__le16 opcode = ((struct hci_command_hdr *)data)->opcode;
/* Vendor specific commands */
if (hci_opcode_ogf(__le16_to_cpu(hdr->opcode)) == 0x3f) {
if (hci_opcode_ogf(__le16_to_cpu(opcode)) == 0x3f) {
u8 desc = *(data + HCI_COMMAND_HDR_SIZE);
if ((desc & 0xf0) == 0xc0) {
data += HCI_COMMAND_HDR_SIZE + 1;
@ -296,7 +277,7 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
/* Put CRC */
if (bcsp->use_crc) {
bcsp_txmsg_crc = bcsp_crc_reverse(bcsp_txmsg_crc);
bcsp_txmsg_crc = bitrev16(bcsp_txmsg_crc);
bcsp_slip_one_byte(nskb, (u8) ((bcsp_txmsg_crc >> 8) & 0x00ff));
bcsp_slip_one_byte(nskb, (u8) (bcsp_txmsg_crc & 0x00ff));
}
@ -566,6 +547,11 @@ static void bcsp_complete_rx_pkt(struct hci_uart *hu)
bcsp->rx_skb = NULL;
}
static u16 bscp_get_crc(struct bcsp_struct *bcsp)
{
return get_unaligned_be16(&bcsp->rx_skb->data[bcsp->rx_skb->len - 2]);
}
/* Recv data */
static int bcsp_recv(struct hci_uart *hu, void *data, int count)
{
@ -624,14 +610,10 @@ static int bcsp_recv(struct hci_uart *hu, void *data, int count)
continue;
case BCSP_W4_CRC:
if (bcsp_crc_reverse(bcsp->message_crc) !=
(bcsp->rx_skb->data[bcsp->rx_skb->len - 2] << 8) +
bcsp->rx_skb->data[bcsp->rx_skb->len - 1]) {
if (bitrev16(bcsp->message_crc) != bscp_get_crc(bcsp)) {
BT_ERR ("Checksum failed: computed %04x received %04x",
bcsp_crc_reverse(bcsp->message_crc),
(bcsp->rx_skb-> data[bcsp->rx_skb->len - 2] << 8) +
bcsp->rx_skb->data[bcsp->rx_skb->len - 1]);
bitrev16(bcsp->message_crc),
bscp_get_crc(bcsp));
kfree_skb(bcsp->rx_skb);
bcsp->rx_state = BCSP_W4_PKT_DELIMITER;

View File

@ -3886,9 +3886,8 @@ static bool rx_get_frame(MGSLPC_INFO *info)
framesize = 0;
#if SYNCLINK_GENERIC_HDLC
{
struct net_device_stats *stats = hdlc_stats(info->netdev);
stats->rx_errors++;
stats->rx_frame_errors++;
info->netdev->stats.rx_errors++;
info->netdev->stats.rx_frame_errors++;
}
#endif
} else
@ -4144,7 +4143,6 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding,
static int hdlcdev_xmit(struct sk_buff *skb, struct net_device *dev)
{
MGSLPC_INFO *info = dev_to_port(dev);
struct net_device_stats *stats = hdlc_stats(dev);
unsigned long flags;
if (debug_level >= DEBUG_LEVEL_INFO)
@ -4159,8 +4157,8 @@ static int hdlcdev_xmit(struct sk_buff *skb, struct net_device *dev)
info->tx_put = info->tx_count = skb->len;
/* update network statistics */
stats->tx_packets++;
stats->tx_bytes += skb->len;
dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len;
/* done with socket buffer, so free it */
dev_kfree_skb(skb);
@ -4376,14 +4374,13 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
static void hdlcdev_tx_timeout(struct net_device *dev)
{
MGSLPC_INFO *info = dev_to_port(dev);
struct net_device_stats *stats = hdlc_stats(dev);
unsigned long flags;
if (debug_level >= DEBUG_LEVEL_INFO)
printk("hdlcdev_tx_timeout(%s)\n",dev->name);
stats->tx_errors++;
stats->tx_aborted_errors++;
dev->stats.tx_errors++;
dev->stats.tx_aborted_errors++;
spin_lock_irqsave(&info->lock,flags);
tx_stop(info);
@ -4416,27 +4413,26 @@ static void hdlcdev_rx(MGSLPC_INFO *info, char *buf, int size)
{
struct sk_buff *skb = dev_alloc_skb(size);
struct net_device *dev = info->netdev;
struct net_device_stats *stats = hdlc_stats(dev);
if (debug_level >= DEBUG_LEVEL_INFO)
printk("hdlcdev_rx(%s)\n",dev->name);
if (skb == NULL) {
printk(KERN_NOTICE "%s: can't alloc skb, dropping packet\n", dev->name);
stats->rx_dropped++;
dev->stats.rx_dropped++;
return;
}
memcpy(skb_put(skb, size), buf, size);
skb->protocol = hdlc_type_trans(skb, info->netdev);
skb->protocol = hdlc_type_trans(skb, dev);
stats->rx_packets++;
stats->rx_bytes += size;
dev->stats.rx_packets++;
dev->stats.rx_bytes += size;
netif_rx(skb);
info->netdev->last_rx = jiffies;
dev->last_rx = jiffies;
}
/**

View File

@ -6631,9 +6631,8 @@ static bool mgsl_get_rx_frame(struct mgsl_struct *info)
framesize = 0;
#if SYNCLINK_GENERIC_HDLC
{
struct net_device_stats *stats = hdlc_stats(info->netdev);
stats->rx_errors++;
stats->rx_frame_errors++;
info->netdev->stats.rx_errors++;
info->netdev->stats.rx_frame_errors++;
}
#endif
} else
@ -7744,7 +7743,6 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding,
static int hdlcdev_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct mgsl_struct *info = dev_to_port(dev);
struct net_device_stats *stats = hdlc_stats(dev);
unsigned long flags;
if (debug_level >= DEBUG_LEVEL_INFO)
@ -7758,8 +7756,8 @@ static int hdlcdev_xmit(struct sk_buff *skb, struct net_device *dev)
mgsl_load_tx_dma_buffer(info, skb->data, skb->len);
/* update network statistics */
stats->tx_packets++;
stats->tx_bytes += skb->len;
dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len;
/* done with socket buffer, so free it */
dev_kfree_skb(skb);
@ -7975,14 +7973,13 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
static void hdlcdev_tx_timeout(struct net_device *dev)
{
struct mgsl_struct *info = dev_to_port(dev);
struct net_device_stats *stats = hdlc_stats(dev);
unsigned long flags;
if (debug_level >= DEBUG_LEVEL_INFO)
printk("hdlcdev_tx_timeout(%s)\n",dev->name);
stats->tx_errors++;
stats->tx_aborted_errors++;
dev->stats.tx_errors++;
dev->stats.tx_aborted_errors++;
spin_lock_irqsave(&info->irq_spinlock,flags);
usc_stop_transmitter(info);
@ -8015,27 +8012,27 @@ static void hdlcdev_rx(struct mgsl_struct *info, char *buf, int size)
{
struct sk_buff *skb = dev_alloc_skb(size);
struct net_device *dev = info->netdev;
struct net_device_stats *stats = hdlc_stats(dev);
if (debug_level >= DEBUG_LEVEL_INFO)
printk("hdlcdev_rx(%s)\n", dev->name);
if (skb == NULL) {
printk(KERN_NOTICE "%s: can't alloc skb, dropping packet\n", dev->name);
stats->rx_dropped++;
printk(KERN_NOTICE "%s: can't alloc skb, dropping packet\n",
dev->name);
dev->stats.rx_dropped++;
return;
}
memcpy(skb_put(skb, size), buf, size);
skb->protocol = hdlc_type_trans(skb, info->netdev);
skb->protocol = hdlc_type_trans(skb, dev);
stats->rx_packets++;
stats->rx_bytes += size;
dev->stats.rx_packets++;
dev->stats.rx_bytes += size;
netif_rx(skb);
info->netdev->last_rx = jiffies;
dev->last_rx = jiffies;
}
/**

View File

@ -1536,7 +1536,6 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding,
static int hdlcdev_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct slgt_info *info = dev_to_port(dev);
struct net_device_stats *stats = hdlc_stats(dev);
unsigned long flags;
DBGINFO(("%s hdlc_xmit\n", dev->name));
@ -1549,8 +1548,8 @@ static int hdlcdev_xmit(struct sk_buff *skb, struct net_device *dev)
tx_load(info, skb->data, skb->len);
/* update network statistics */
stats->tx_packets++;
stats->tx_bytes += skb->len;
dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len;
/* done with socket buffer, so free it */
dev_kfree_skb(skb);
@ -1767,13 +1766,12 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
static void hdlcdev_tx_timeout(struct net_device *dev)
{
struct slgt_info *info = dev_to_port(dev);
struct net_device_stats *stats = hdlc_stats(dev);
unsigned long flags;
DBGINFO(("%s hdlcdev_tx_timeout\n", dev->name));
stats->tx_errors++;
stats->tx_aborted_errors++;
dev->stats.tx_errors++;
dev->stats.tx_aborted_errors++;
spin_lock_irqsave(&info->lock,flags);
tx_stop(info);
@ -1806,26 +1804,25 @@ static void hdlcdev_rx(struct slgt_info *info, char *buf, int size)
{
struct sk_buff *skb = dev_alloc_skb(size);
struct net_device *dev = info->netdev;
struct net_device_stats *stats = hdlc_stats(dev);
DBGINFO(("%s hdlcdev_rx\n", dev->name));
if (skb == NULL) {
DBGERR(("%s: can't alloc skb, drop packet\n", dev->name));
stats->rx_dropped++;
dev->stats.rx_dropped++;
return;
}
memcpy(skb_put(skb, size), buf, size);
skb->protocol = hdlc_type_trans(skb, info->netdev);
skb->protocol = hdlc_type_trans(skb, dev);
stats->rx_packets++;
stats->rx_bytes += size;
dev->stats.rx_packets++;
dev->stats.rx_bytes += size;
netif_rx(skb);
info->netdev->last_rx = jiffies;
dev->last_rx = jiffies;
}
/**
@ -4568,9 +4565,8 @@ static bool rx_get_frame(struct slgt_info *info)
#if SYNCLINK_GENERIC_HDLC
if (framesize == 0) {
struct net_device_stats *stats = hdlc_stats(info->netdev);
stats->rx_errors++;
stats->rx_frame_errors++;
info->netdev->stats.rx_errors++;
info->netdev->stats.rx_frame_errors++;
}
#endif

View File

@ -1672,7 +1672,6 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding,
static int hdlcdev_xmit(struct sk_buff *skb, struct net_device *dev)
{
SLMP_INFO *info = dev_to_port(dev);
struct net_device_stats *stats = hdlc_stats(dev);
unsigned long flags;
if (debug_level >= DEBUG_LEVEL_INFO)
@ -1686,8 +1685,8 @@ static int hdlcdev_xmit(struct sk_buff *skb, struct net_device *dev)
tx_load_dma_buffer(info, skb->data, skb->len);
/* update network statistics */
stats->tx_packets++;
stats->tx_bytes += skb->len;
dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len;
/* done with socket buffer, so free it */
dev_kfree_skb(skb);
@ -1903,14 +1902,13 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
static void hdlcdev_tx_timeout(struct net_device *dev)
{
SLMP_INFO *info = dev_to_port(dev);
struct net_device_stats *stats = hdlc_stats(dev);
unsigned long flags;
if (debug_level >= DEBUG_LEVEL_INFO)
printk("hdlcdev_tx_timeout(%s)\n",dev->name);
stats->tx_errors++;
stats->tx_aborted_errors++;
dev->stats.tx_errors++;
dev->stats.tx_aborted_errors++;
spin_lock_irqsave(&info->lock,flags);
tx_stop(info);
@ -1943,27 +1941,27 @@ static void hdlcdev_rx(SLMP_INFO *info, char *buf, int size)
{
struct sk_buff *skb = dev_alloc_skb(size);
struct net_device *dev = info->netdev;
struct net_device_stats *stats = hdlc_stats(dev);
if (debug_level >= DEBUG_LEVEL_INFO)
printk("hdlcdev_rx(%s)\n",dev->name);
if (skb == NULL) {
printk(KERN_NOTICE "%s: can't alloc skb, dropping packet\n", dev->name);
stats->rx_dropped++;
printk(KERN_NOTICE "%s: can't alloc skb, dropping packet\n",
dev->name);
dev->stats.rx_dropped++;
return;
}
memcpy(skb_put(skb, size), buf, size);
skb->protocol = hdlc_type_trans(skb, info->netdev);
skb->protocol = hdlc_type_trans(skb, dev);
stats->rx_packets++;
stats->rx_bytes += size;
dev->stats.rx_packets++;
dev->stats.rx_bytes += size;
netif_rx(skb);
info->netdev->last_rx = jiffies;
dev->last_rx = jiffies;
}
/**
@ -4976,9 +4974,8 @@ static bool rx_get_frame(SLMP_INFO *info)
framesize = 0;
#if SYNCLINK_GENERIC_HDLC
{
struct net_device_stats *stats = hdlc_stats(info->netdev);
stats->rx_errors++;
stats->rx_frame_errors++;
info->netdev->stats.rx_errors++;
info->netdev->stats.rx_frame_errors++;
}
#endif
}

View File

@ -769,7 +769,7 @@ void ipoib_mcast_restart_task(struct work_struct *work)
ipoib_mcast_stop_thread(dev, 0);
local_irq_save(flags);
netif_tx_lock(dev);
netif_addr_lock(dev);
spin_lock(&priv->lock);
/*
@ -846,7 +846,7 @@ void ipoib_mcast_restart_task(struct work_struct *work)
}
spin_unlock(&priv->lock);
netif_tx_unlock(dev);
netif_addr_unlock(dev);
local_irq_restore(flags);
/* We have to cancel outside of the spinlock */

View File

@ -287,7 +287,7 @@ isdn_net_unbind_channel(isdn_net_local * lp)
BEWARE! This chunk of code cannot be called from hardware
interrupt handler. I hope it is true. --ANK
*/
qdisc_reset(lp->netdev->dev->qdisc);
qdisc_reset_all_tx(lp->netdev->dev);
}
lp->dialstate = 0;
dev->rx_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;

View File

@ -1133,7 +1133,7 @@ static void wq_set_multicast_list (struct work_struct *work)
dvb_net_feed_stop(dev);
priv->rx_mode = RX_MODE_UNI;
netif_tx_lock_bh(dev);
netif_addr_lock_bh(dev);
if (dev->flags & IFF_PROMISC) {
dprintk("%s: promiscuous mode\n", dev->name);
@ -1158,7 +1158,7 @@ static void wq_set_multicast_list (struct work_struct *work)
}
}
netif_tx_unlock_bh(dev);
netif_addr_unlock_bh(dev);
dvb_net_feed_start(dev);
}

View File

@ -149,7 +149,7 @@ el2_pio_probe(struct net_device *dev)
#ifndef MODULE
struct net_device * __init el2_probe(int unit)
{
struct net_device *dev = alloc_ei_netdev();
struct net_device *dev = alloc_eip_netdev();
int err;
if (!dev)
@ -340,7 +340,7 @@ el2_probe1(struct net_device *dev, int ioaddr)
dev->stop = &el2_close;
dev->ethtool_ops = &netdev_ethtool_ops;
#ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = ei_poll;
dev->poll_controller = eip_poll;
#endif
retval = register_netdev(dev);
@ -386,7 +386,7 @@ el2_open(struct net_device *dev)
outb_p(0x00, E33G_IDCFR);
if (*irqp == probe_irq_off(cookie) /* It's a good IRQ line! */
&& ((retval = request_irq(dev->irq = *irqp,
ei_interrupt, 0, dev->name, dev)) == 0))
eip_interrupt, 0, dev->name, dev)) == 0))
break;
}
} while (*++irqp);
@ -395,13 +395,13 @@ el2_open(struct net_device *dev)
return retval;
}
} else {
if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
if ((retval = request_irq(dev->irq, eip_interrupt, 0, dev->name, dev))) {
return retval;
}
}
el2_init_card(dev);
ei_open(dev);
eip_open(dev);
return 0;
}
@ -412,7 +412,7 @@ el2_close(struct net_device *dev)
dev->irq = ei_status.saved_irq;
outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */
ei_close(dev);
eip_close(dev);
return 0;
}
@ -698,7 +698,7 @@ init_module(void)
if (this_dev != 0) break; /* only autoprobe 1st one */
printk(KERN_NOTICE "3c503.c: Presently autoprobing (not recommended) for a single card.\n");
}
dev = alloc_ei_netdev();
dev = alloc_eip_netdev();
if (!dev)
break;
dev->irq = irq[this_dev];

View File

@ -572,12 +572,16 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr,
int irq;
DECLARE_MAC_BUF(mac);
#ifdef __ISAPNP__
if (idev) {
irq = pnp_irq(idev, 0);
vp->dev = &idev->dev;
} else {
irq = inw(ioaddr + 0x2002) & 15;
}
#else
irq = inw(ioaddr + 0x2002) & 15;
#endif
dev->base_addr = ioaddr;
dev->irq = irq;

View File

@ -202,7 +202,6 @@ static void elmc_xmt_int(struct net_device *dev);
static void elmc_rnr_int(struct net_device *dev);
struct priv {
struct net_device_stats stats;
unsigned long base;
char *memtop;
unsigned long mapped_start; /* Start of ioremap */
@ -989,18 +988,18 @@ static void elmc_rcv_int(struct net_device *dev)
skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb);
dev->last_rx = jiffies;
p->stats.rx_packets++;
p->stats.rx_bytes += totlen;
dev->stats.rx_packets++;
dev->stats.rx_bytes += totlen;
} else {
p->stats.rx_dropped++;
dev->stats.rx_dropped++;
}
} else {
printk(KERN_WARNING "%s: received oversized frame.\n", dev->name);
p->stats.rx_dropped++;
dev->stats.rx_dropped++;
}
} else { /* frame !(ok), only with 'save-bad-frames' */
printk(KERN_WARNING "%s: oops! rfd-error-status: %04x\n", dev->name, status);
p->stats.rx_errors++;
dev->stats.rx_errors++;
}
p->rfd_top->status = 0;
p->rfd_top->last = RFD_SUSP;
@ -1018,7 +1017,7 @@ static void elmc_rnr_int(struct net_device *dev)
{
struct priv *p = (struct priv *) dev->priv;
p->stats.rx_errors++;
dev->stats.rx_errors++;
WAIT_4_SCB_CMD(); /* wait for the last cmd */
p->scb->cmd = RUC_ABORT; /* usually the RU is in the 'no resource'-state .. abort it now. */
@ -1046,24 +1045,24 @@ static void elmc_xmt_int(struct net_device *dev)
printk(KERN_WARNING "%s: strange .. xmit-int without a 'COMPLETE'\n", dev->name);
}
if (status & STAT_OK) {
p->stats.tx_packets++;
p->stats.collisions += (status & TCMD_MAXCOLLMASK);
dev->stats.tx_packets++;
dev->stats.collisions += (status & TCMD_MAXCOLLMASK);
} else {
p->stats.tx_errors++;
dev->stats.tx_errors++;
if (status & TCMD_LATECOLL) {
printk(KERN_WARNING "%s: late collision detected.\n", dev->name);
p->stats.collisions++;
dev->stats.collisions++;
} else if (status & TCMD_NOCARRIER) {
p->stats.tx_carrier_errors++;
dev->stats.tx_carrier_errors++;
printk(KERN_WARNING "%s: no carrier detected.\n", dev->name);
} else if (status & TCMD_LOSTCTS) {
printk(KERN_WARNING "%s: loss of CTS detected.\n", dev->name);
} else if (status & TCMD_UNDERRUN) {
p->stats.tx_fifo_errors++;
dev->stats.tx_fifo_errors++;
printk(KERN_WARNING "%s: DMA underrun detected.\n", dev->name);
} else if (status & TCMD_MAXCOLL) {
printk(KERN_WARNING "%s: Max. collisions exceeded.\n", dev->name);
p->stats.collisions += 16;
dev->stats.collisions += 16;
}
}
@ -1215,12 +1214,12 @@ static struct net_device_stats *elmc_get_stats(struct net_device *dev)
ovrn = p->scb->ovrn_errs;
p->scb->ovrn_errs -= ovrn;
p->stats.rx_crc_errors += crc;
p->stats.rx_fifo_errors += ovrn;
p->stats.rx_frame_errors += aln;
p->stats.rx_dropped += rsc;
dev->stats.rx_crc_errors += crc;
dev->stats.rx_fifo_errors += ovrn;
dev->stats.rx_frame_errors += aln;
dev->stats.rx_dropped += rsc;
return &p->stats;
return &dev->stats;
}
/********************************************************

View File

@ -158,7 +158,6 @@ struct mc32_local
int slot;
u32 base;
struct net_device_stats net_stats;
volatile struct mc32_mailbox *rx_box;
volatile struct mc32_mailbox *tx_box;
volatile struct mc32_mailbox *exec_box;
@ -1093,24 +1092,24 @@ static void mc32_update_stats(struct net_device *dev)
u32 rx_errors=0;
rx_errors+=lp->net_stats.rx_crc_errors +=st->rx_crc_errors;
rx_errors+=dev->stats.rx_crc_errors +=st->rx_crc_errors;
st->rx_crc_errors=0;
rx_errors+=lp->net_stats.rx_fifo_errors +=st->rx_overrun_errors;
rx_errors+=dev->stats.rx_fifo_errors +=st->rx_overrun_errors;
st->rx_overrun_errors=0;
rx_errors+=lp->net_stats.rx_frame_errors +=st->rx_alignment_errors;
rx_errors+=dev->stats.rx_frame_errors +=st->rx_alignment_errors;
st->rx_alignment_errors=0;
rx_errors+=lp->net_stats.rx_length_errors+=st->rx_tooshort_errors;
rx_errors+=dev->stats.rx_length_errors+=st->rx_tooshort_errors;
st->rx_tooshort_errors=0;
rx_errors+=lp->net_stats.rx_missed_errors+=st->rx_outofresource_errors;
rx_errors+=dev->stats.rx_missed_errors+=st->rx_outofresource_errors;
st->rx_outofresource_errors=0;
lp->net_stats.rx_errors=rx_errors;
dev->stats.rx_errors=rx_errors;
/* Number of packets which saw one collision */
lp->net_stats.collisions+=st->dataC[10];
dev->stats.collisions+=st->dataC[10];
st->dataC[10]=0;
/* Number of packets which saw 2--15 collisions */
lp->net_stats.collisions+=st->dataC[11];
dev->stats.collisions+=st->dataC[11];
st->dataC[11]=0;
}
@ -1178,7 +1177,7 @@ static void mc32_rx_ring(struct net_device *dev)
skb=dev_alloc_skb(length+2);
if(skb==NULL) {
lp->net_stats.rx_dropped++;
dev->stats.rx_dropped++;
goto dropped;
}
@ -1189,8 +1188,8 @@ static void mc32_rx_ring(struct net_device *dev)
skb->protocol=eth_type_trans(skb,dev);
dev->last_rx = jiffies;
lp->net_stats.rx_packets++;
lp->net_stats.rx_bytes += length;
dev->stats.rx_packets++;
dev->stats.rx_bytes += length;
netif_rx(skb);
}
@ -1253,34 +1252,34 @@ static void mc32_tx_ring(struct net_device *dev)
/* Not COMPLETED */
break;
}
lp->net_stats.tx_packets++;
dev->stats.tx_packets++;
if(!(np->status & (1<<6))) /* Not COMPLETED_OK */
{
lp->net_stats.tx_errors++;
dev->stats.tx_errors++;
switch(np->status&0x0F)
{
case 1:
lp->net_stats.tx_aborted_errors++;
dev->stats.tx_aborted_errors++;
break; /* Max collisions */
case 2:
lp->net_stats.tx_fifo_errors++;
dev->stats.tx_fifo_errors++;
break;
case 3:
lp->net_stats.tx_carrier_errors++;
dev->stats.tx_carrier_errors++;
break;
case 4:
lp->net_stats.tx_window_errors++;
dev->stats.tx_window_errors++;
break; /* CTS Lost */
case 5:
lp->net_stats.tx_aborted_errors++;
dev->stats.tx_aborted_errors++;
break; /* Transmit timeout */
}
}
/* Packets are sent in order - this is
basically a FIFO queue of buffers matching
the card ring */
lp->net_stats.tx_bytes+=lp->tx_ring[t].skb->len;
dev->stats.tx_bytes+=lp->tx_ring[t].skb->len;
dev_kfree_skb_irq(lp->tx_ring[t].skb);
lp->tx_ring[t].skb=NULL;
atomic_inc(&lp->tx_count);
@ -1367,7 +1366,7 @@ static irqreturn_t mc32_interrupt(int irq, void *dev_id)
case 6:
/* Out of RX buffers stat */
/* Must restart rx */
lp->net_stats.rx_dropped++;
dev->stats.rx_dropped++;
mc32_rx_ring(dev);
mc32_start_transceiver(dev);
break;
@ -1489,10 +1488,8 @@ static int mc32_close(struct net_device *dev)
static struct net_device_stats *mc32_get_stats(struct net_device *dev)
{
struct mc32_local *lp = netdev_priv(dev);
mc32_update_stats(dev);
return &lp->net_stats;
return &dev->stats;
}

View File

@ -340,7 +340,6 @@ struct cp_private {
u32 rx_config;
u16 cpcmd;
struct net_device_stats net_stats;
struct cp_extra_stats cp_stats;
unsigned rx_head ____cacheline_aligned;
@ -457,8 +456,8 @@ static inline void cp_rx_skb (struct cp_private *cp, struct sk_buff *skb,
{
skb->protocol = eth_type_trans (skb, cp->dev);
cp->net_stats.rx_packets++;
cp->net_stats.rx_bytes += skb->len;
cp->dev->stats.rx_packets++;
cp->dev->stats.rx_bytes += skb->len;
cp->dev->last_rx = jiffies;
#if CP_VLAN_TAG_USED
@ -477,17 +476,17 @@ static void cp_rx_err_acct (struct cp_private *cp, unsigned rx_tail,
printk (KERN_DEBUG
"%s: rx err, slot %d status 0x%x len %d\n",
cp->dev->name, rx_tail, status, len);
cp->net_stats.rx_errors++;
cp->dev->stats.rx_errors++;
if (status & RxErrFrame)
cp->net_stats.rx_frame_errors++;
cp->dev->stats.rx_frame_errors++;
if (status & RxErrCRC)
cp->net_stats.rx_crc_errors++;
cp->dev->stats.rx_crc_errors++;
if ((status & RxErrRunt) || (status & RxErrLong))
cp->net_stats.rx_length_errors++;
cp->dev->stats.rx_length_errors++;
if ((status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag))
cp->net_stats.rx_length_errors++;
cp->dev->stats.rx_length_errors++;
if (status & RxErrFIFO)
cp->net_stats.rx_fifo_errors++;
cp->dev->stats.rx_fifo_errors++;
}
static inline unsigned int cp_rx_csum_ok (u32 status)
@ -539,7 +538,7 @@ static int cp_rx_poll(struct napi_struct *napi, int budget)
* that RX fragments are never encountered
*/
cp_rx_err_acct(cp, rx_tail, status, len);
cp->net_stats.rx_dropped++;
dev->stats.rx_dropped++;
cp->cp_stats.rx_frags++;
goto rx_next;
}
@ -556,7 +555,7 @@ static int cp_rx_poll(struct napi_struct *napi, int budget)
buflen = cp->rx_buf_sz + RX_OFFSET;
new_skb = dev_alloc_skb (buflen);
if (!new_skb) {
cp->net_stats.rx_dropped++;
dev->stats.rx_dropped++;
goto rx_next;
}
@ -710,20 +709,20 @@ static void cp_tx (struct cp_private *cp)
if (netif_msg_tx_err(cp))
printk(KERN_DEBUG "%s: tx err, status 0x%x\n",
cp->dev->name, status);
cp->net_stats.tx_errors++;
cp->dev->stats.tx_errors++;
if (status & TxOWC)
cp->net_stats.tx_window_errors++;
cp->dev->stats.tx_window_errors++;
if (status & TxMaxCol)
cp->net_stats.tx_aborted_errors++;
cp->dev->stats.tx_aborted_errors++;
if (status & TxLinkFail)
cp->net_stats.tx_carrier_errors++;
cp->dev->stats.tx_carrier_errors++;
if (status & TxFIFOUnder)
cp->net_stats.tx_fifo_errors++;
cp->dev->stats.tx_fifo_errors++;
} else {
cp->net_stats.collisions +=
cp->dev->stats.collisions +=
((status >> TxColCntShift) & TxColCntMask);
cp->net_stats.tx_packets++;
cp->net_stats.tx_bytes += skb->len;
cp->dev->stats.tx_packets++;
cp->dev->stats.tx_bytes += skb->len;
if (netif_msg_tx_done(cp))
printk(KERN_DEBUG "%s: tx done, slot %d\n", cp->dev->name, tx_tail);
}
@ -956,7 +955,7 @@ static void cp_set_rx_mode (struct net_device *dev)
static void __cp_get_stats(struct cp_private *cp)
{
/* only lower 24 bits valid; write any value to clear */
cp->net_stats.rx_missed_errors += (cpr32 (RxMissed) & 0xffffff);
cp->dev->stats.rx_missed_errors += (cpr32 (RxMissed) & 0xffffff);
cpw32 (RxMissed, 0);
}
@ -971,7 +970,7 @@ static struct net_device_stats *cp_get_stats(struct net_device *dev)
__cp_get_stats(cp);
spin_unlock_irqrestore(&cp->lock, flags);
return &cp->net_stats;
return &dev->stats;
}
static void cp_stop_hw (struct cp_private *cp)
@ -1142,7 +1141,7 @@ static void cp_clean_rings (struct cp_private *cp)
PCI_DMA_TODEVICE);
if (le32_to_cpu(desc->opts1) & LastFrag)
dev_kfree_skb(skb);
cp->net_stats.tx_dropped++;
cp->dev->stats.tx_dropped++;
}
}
@ -1214,7 +1213,6 @@ static int cp_close (struct net_device *dev)
spin_unlock_irqrestore(&cp->lock, flags);
synchronize_irq(dev->irq);
free_irq(dev->irq, dev);
cp_free_rings(cp);

View File

@ -107,8 +107,8 @@
#include <linux/mii.h>
#include <linux/completion.h>
#include <linux/crc32.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/io.h>
#include <linux/uaccess.h>
#include <asm/irq.h>
#define RTL8139_DRIVER_NAME DRV_NAME " Fast Ethernet driver " DRV_VERSION
@ -134,7 +134,7 @@
#if RTL8139_DEBUG
/* note: prints function name for you */
# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __func__ , ## args)
#else
# define DPRINTK(fmt, args...)
#endif
@ -145,7 +145,7 @@
# define assert(expr) \
if(unlikely(!(expr))) { \
printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
#expr,__FILE__,__FUNCTION__,__LINE__); \
#expr, __FILE__, __func__, __LINE__); \
}
#endif
@ -219,7 +219,7 @@ enum {
#define RTL8139B_IO_SIZE 256
#define RTL8129_CAPS HAS_MII_XCVR
#define RTL8139_CAPS HAS_CHIP_XCVR|HAS_LNK_CHNG
#define RTL8139_CAPS (HAS_CHIP_XCVR|HAS_LNK_CHNG)
typedef enum {
RTL8139 = 0,
@ -574,7 +574,6 @@ struct rtl8139_private {
u32 msg_enable;
struct napi_struct napi;
struct net_device *dev;
struct net_device_stats stats;
unsigned char *rx_ring;
unsigned int cur_rx; /* RX buf index of next pkt */
@ -1711,7 +1710,7 @@ static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev)
dev_kfree_skb(skb);
} else {
dev_kfree_skb(skb);
tp->stats.tx_dropped++;
dev->stats.tx_dropped++;
return 0;
}
@ -1762,27 +1761,27 @@ static void rtl8139_tx_interrupt (struct net_device *dev,
if (netif_msg_tx_err(tp))
printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
dev->name, txstatus);
tp->stats.tx_errors++;
dev->stats.tx_errors++;
if (txstatus & TxAborted) {
tp->stats.tx_aborted_errors++;
dev->stats.tx_aborted_errors++;
RTL_W32 (TxConfig, TxClearAbt);
RTL_W16 (IntrStatus, TxErr);
wmb();
}
if (txstatus & TxCarrierLost)
tp->stats.tx_carrier_errors++;
dev->stats.tx_carrier_errors++;
if (txstatus & TxOutOfWindow)
tp->stats.tx_window_errors++;
dev->stats.tx_window_errors++;
} else {
if (txstatus & TxUnderrun) {
/* Add 64 to the Tx FIFO threshold. */
if (tp->tx_flag < 0x00300000)
tp->tx_flag += 0x00020000;
tp->stats.tx_fifo_errors++;
dev->stats.tx_fifo_errors++;
}
tp->stats.collisions += (txstatus >> 24) & 15;
tp->stats.tx_bytes += txstatus & 0x7ff;
tp->stats.tx_packets++;
dev->stats.collisions += (txstatus >> 24) & 15;
dev->stats.tx_bytes += txstatus & 0x7ff;
dev->stats.tx_packets++;
}
dirty_tx++;
@ -1818,7 +1817,7 @@ static void rtl8139_rx_err (u32 rx_status, struct net_device *dev,
if (netif_msg_rx_err (tp))
printk(KERN_DEBUG "%s: Ethernet frame had errors, status %8.8x.\n",
dev->name, rx_status);
tp->stats.rx_errors++;
dev->stats.rx_errors++;
if (!(rx_status & RxStatusOK)) {
if (rx_status & RxTooLong) {
DPRINTK ("%s: Oversized Ethernet frame, status %4.4x!\n",
@ -1826,11 +1825,11 @@ static void rtl8139_rx_err (u32 rx_status, struct net_device *dev,
/* A.C.: The chip hangs here. */
}
if (rx_status & (RxBadSymbol | RxBadAlign))
tp->stats.rx_frame_errors++;
dev->stats.rx_frame_errors++;
if (rx_status & (RxRunt | RxTooLong))
tp->stats.rx_length_errors++;
dev->stats.rx_length_errors++;
if (rx_status & RxCRCErr)
tp->stats.rx_crc_errors++;
dev->stats.rx_crc_errors++;
} else {
tp->xstats.rx_lost_in_ring++;
}
@ -1890,7 +1889,7 @@ static void rtl8139_rx_err (u32 rx_status, struct net_device *dev,
}
#if RX_BUF_IDX == 3
static __inline__ void wrap_copy(struct sk_buff *skb, const unsigned char *ring,
static inline void wrap_copy(struct sk_buff *skb, const unsigned char *ring,
u32 offset, unsigned int size)
{
u32 left = RX_BUF_LEN - offset;
@ -1913,9 +1912,9 @@ static void rtl8139_isr_ack(struct rtl8139_private *tp)
/* Clear out errors and receive interrupts */
if (likely(status != 0)) {
if (unlikely(status & (RxFIFOOver | RxOverflow))) {
tp->stats.rx_errors++;
tp->dev->stats.rx_errors++;
if (status & RxFIFOOver)
tp->stats.rx_fifo_errors++;
tp->dev->stats.rx_fifo_errors++;
}
RTL_W16_F (IntrStatus, RxAckBits);
}
@ -2016,8 +2015,8 @@ static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
skb->protocol = eth_type_trans (skb, dev);
dev->last_rx = jiffies;
tp->stats.rx_bytes += pkt_size;
tp->stats.rx_packets++;
dev->stats.rx_bytes += pkt_size;
dev->stats.rx_packets++;
netif_receive_skb (skb);
} else {
@ -2025,7 +2024,7 @@ static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
printk (KERN_WARNING
"%s: Memory squeeze, dropping packet.\n",
dev->name);
tp->stats.rx_dropped++;
dev->stats.rx_dropped++;
}
received++;
@ -2072,7 +2071,7 @@ static void rtl8139_weird_interrupt (struct net_device *dev,
assert (ioaddr != NULL);
/* Update the error count. */
tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
dev->stats.rx_missed_errors += RTL_R32 (RxMissed);
RTL_W32 (RxMissed, 0);
if ((status & RxUnderrun) && link_changed &&
@ -2082,12 +2081,12 @@ static void rtl8139_weird_interrupt (struct net_device *dev,
}
if (status & (RxUnderrun | RxErr))
tp->stats.rx_errors++;
dev->stats.rx_errors++;
if (status & PCSTimeout)
tp->stats.rx_length_errors++;
dev->stats.rx_length_errors++;
if (status & RxUnderrun)
tp->stats.rx_fifo_errors++;
dev->stats.rx_fifo_errors++;
if (status & PCIErr) {
u16 pci_cmd_status;
pci_read_config_word (tp->pci_dev, PCI_STATUS, &pci_cmd_status);
@ -2227,12 +2226,11 @@ static int rtl8139_close (struct net_device *dev)
RTL_W16 (IntrMask, 0);
/* Update the error counts. */
tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
dev->stats.rx_missed_errors += RTL_R32 (RxMissed);
RTL_W32 (RxMissed, 0);
spin_unlock_irqrestore (&tp->lock, flags);
synchronize_irq (dev->irq); /* racy, but that's ok here */
free_irq (dev->irq, dev);
rtl8139_tx_clear (tp);
@ -2472,12 +2470,12 @@ static struct net_device_stats *rtl8139_get_stats (struct net_device *dev)
if (netif_running(dev)) {
spin_lock_irqsave (&tp->lock, flags);
tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
dev->stats.rx_missed_errors += RTL_R32 (RxMissed);
RTL_W32 (RxMissed, 0);
spin_unlock_irqrestore (&tp->lock, flags);
}
return &tp->stats;
return &dev->stats;
}
/* Set or clear the multicast filter for this adaptor.
@ -2561,7 +2559,7 @@ static int rtl8139_suspend (struct pci_dev *pdev, pm_message_t state)
RTL_W8 (ChipCmd, 0);
/* Update the error counts. */
tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
dev->stats.rx_missed_errors += RTL_R32 (RxMissed);
RTL_W32 (RxMissed, 0);
spin_unlock_irqrestore (&tp->lock, flags);

View File

@ -30,8 +30,10 @@ extern int ei_debug;
#ifdef CONFIG_NET_POLL_CONTROLLER
extern void ei_poll(struct net_device *dev);
extern void eip_poll(struct net_device *dev);
#endif
/* Without I/O delay - non ISA or later chips */
extern void NS8390_init(struct net_device *dev, int startp);
extern int ei_open(struct net_device *dev);
extern int ei_close(struct net_device *dev);
@ -42,6 +44,17 @@ static inline struct net_device *alloc_ei_netdev(void)
return __alloc_ei_netdev(0);
}
/* With I/O delay form */
extern void NS8390p_init(struct net_device *dev, int startp);
extern int eip_open(struct net_device *dev);
extern int eip_close(struct net_device *dev);
extern irqreturn_t eip_interrupt(int irq, void *dev_id);
extern struct net_device *__alloc_eip_netdev(int size);
static inline struct net_device *alloc_eip_netdev(void)
{
return __alloc_eip_netdev(0);
}
/* You have one of these per-board */
struct ei_device {
const char *name;
@ -69,7 +82,6 @@ struct ei_device {
unsigned char reg0; /* Register '0' in a WD8013 */
unsigned char reg5; /* Register '5' in a WD8013 */
unsigned char saved_irq; /* Original dev->irq value. */
struct net_device_stats stat; /* The new statistics table. */
u32 *reg_offset; /* Register mapping table */
spinlock_t page_lock; /* Page register locks */
unsigned long priv; /* Private field to store bus IDs etc. */
@ -116,13 +128,14 @@ struct ei_device {
/*
* Only generate indirect loads given a machine that needs them.
* - removed AMIGA_PCMCIA from this list, handled as ISA io now
* - the _p for generates no delay by default 8390p.c overrides this.
*/
#ifndef ei_inb
#define ei_inb(_p) inb(_p)
#define ei_outb(_v,_p) outb(_v,_p)
#define ei_inb_p(_p) inb_p(_p)
#define ei_outb_p(_v,_p) outb_p(_v,_p)
#define ei_inb_p(_p) inb(_p)
#define ei_outb_p(_v,_p) outb(_v,_p)
#endif
#ifndef EI_SHIFT

66
drivers/net/8390p.c Normal file
View File

@ -0,0 +1,66 @@
/* 8390 core for ISA devices needing bus delays */
static const char version[] =
"8390p.c:v1.10cvs 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
#define ei_inb(_p) inb(_p)
#define ei_outb(_v,_p) outb(_v,_p)
#define ei_inb_p(_p) inb_p(_p)
#define ei_outb_p(_v,_p) outb_p(_v,_p)
#include "lib8390.c"
int eip_open(struct net_device *dev)
{
return __ei_open(dev);
}
int eip_close(struct net_device *dev)
{
return __ei_close(dev);
}
irqreturn_t eip_interrupt(int irq, void *dev_id)
{
return __ei_interrupt(irq, dev_id);
}
#ifdef CONFIG_NET_POLL_CONTROLLER
void eip_poll(struct net_device *dev)
{
__ei_poll(dev);
}
#endif
struct net_device *__alloc_eip_netdev(int size)
{
return ____alloc_ei_netdev(size);
}
void NS8390p_init(struct net_device *dev, int startp)
{
return __NS8390_init(dev, startp);
}
EXPORT_SYMBOL(eip_open);
EXPORT_SYMBOL(eip_close);
EXPORT_SYMBOL(eip_interrupt);
#ifdef CONFIG_NET_POLL_CONTROLLER
EXPORT_SYMBOL(eip_poll);
#endif
EXPORT_SYMBOL(NS8390p_init);
EXPORT_SYMBOL(__alloc_eip_netdev);
#if defined(MODULE)
int init_module(void)
{
return 0;
}
void cleanup_module(void)
{
}
#endif /* MODULE */
MODULE_LICENSE("GPL");

View File

@ -26,14 +26,6 @@ menuconfig NETDEVICES
# that for each of the symbols.
if NETDEVICES
config NETDEVICES_MULTIQUEUE
bool "Netdevice multiple hardware queue support"
---help---
Say Y here if you want to allow the network stack to use multiple
hardware TX queues on an ethernet device.
Most people will say N here.
config IFB
tristate "Intermediate Functional Block support"
depends on NET_CLS_ACT
@ -515,6 +507,18 @@ config STNIC
If unsure, say N.
config SH_ETH
tristate "Renesas SuperH Ethernet support"
depends on SUPERH && \
(CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712)
select CRC32
select MII
select MDIO_BITBANG
select PHYLIB
help
Renesas SuperH Ethernet device driver.
This driver support SH7710 and SH7712.
config SUNLANCE
tristate "Sun LANCE support"
depends on SBUS
@ -917,6 +921,23 @@ config DM9000
To compile this driver as a module, choose M here. The module
will be called dm9000.
config DM9000_DEBUGLEVEL
int "DM9000 maximum debug level"
depends on DM9000
default 4
help
The maximum level of debugging code compiled into the DM9000
driver.
config DM9000_FORCE_SIMPLE_PHY_POLL
bool "Force simple NSR based PHY polling"
depends on DM9000
---help---
This configuration forces the DM9000 to use the NSR's LinkStatus
bit to determine if the link is up or down instead of the more
costly MII PHY reads. Note, this will not work if the chip is
operating with an external PHY.
config ENC28J60
tristate "ENC28J60 support"
depends on EXPERIMENTAL && SPI && NET_ETHERNET
@ -934,19 +955,11 @@ config ENC28J60_WRITEVERIFY
Enable the verify after the buffer write useful for debugging purpose.
If unsure, say N.
config DM9000_DEBUGLEVEL
int "DM9000 maximum debug level"
depends on DM9000
default 4
help
The maximum level of debugging code compiled into the DM9000
driver.
config SMC911X
tristate "SMSC LAN911[5678] support"
select CRC32
select MII
depends on ARCH_PXA || SH_MAGIC_PANEL_R2
depends on ARCH_PXA || SUPERH
help
This is a driver for SMSC's LAN911x series of Ethernet chipsets
including the new LAN9115, LAN9116, LAN9117, and LAN9118.
@ -1234,7 +1247,6 @@ config IBMVETH
To compile this driver as a module, choose M here. The module will
be called ibmveth.
source "drivers/net/ibm_emac/Kconfig"
source "drivers/net/ibm_newemac/Kconfig"
config NET_PCI
@ -1277,20 +1289,6 @@ config AMD8111_ETH
To compile this driver as a module, choose M here. The module
will be called amd8111e.
config AMD8111E_NAPI
bool "Use RX polling (NAPI)"
depends on AMD8111_ETH
help
NAPI is a new driver API designed to reduce CPU and interrupt load
when the driver is receiving lots of packets from the card. It is
still somewhat experimental and thus not yet enabled by default.
If your estimated Rx load is 10kpps or more, or if the card will be
deployed on potentially unfriendly networks (e.g. in a firewall),
then say Y here.
If in doubt, say N.
config ADAPTEC_STARFIRE
tristate "Adaptec Starfire/DuraLAN support"
depends on NET_PCI && PCI
@ -1305,20 +1303,6 @@ config ADAPTEC_STARFIRE
To compile this driver as a module, choose M here: the module
will be called starfire. This is recommended.
config ADAPTEC_STARFIRE_NAPI
bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
depends on ADAPTEC_STARFIRE && EXPERIMENTAL
help
NAPI is a new driver API designed to reduce CPU and interrupt load
when the driver is receiving lots of packets from the card. It is
still somewhat experimental and thus not yet enabled by default.
If your estimated Rx load is 10kpps or more, or if the card will be
deployed on potentially unfriendly networks (e.g. in a firewall),
then say Y here.
If in doubt, say N.
config AC3200
tristate "Ansel Communications EISA 3200 support (EXPERIMENTAL)"
depends on NET_PCI && (ISA || EISA) && EXPERIMENTAL
@ -1661,7 +1645,7 @@ config SUNDANCE_MMIO
config TLAN
tristate "TI ThunderLAN support"
depends on NET_PCI && (PCI || EISA) && !64BIT
depends on NET_PCI && (PCI || EISA)
---help---
If you have a PCI Ethernet network card based on the ThunderLAN chip
which is supported by this driver, say Y and read the
@ -1701,26 +1685,6 @@ config VIA_RHINE_MMIO
If unsure, say Y.
config VIA_RHINE_NAPI
bool "Use Rx Polling (NAPI)"
depends on VIA_RHINE
help
NAPI is a new driver API designed to reduce CPU and interrupt load
when the driver is receiving lots of packets from the card.
If your estimated Rx load is 10kpps or more, or if the card will be
deployed on potentially unfriendly networks (e.g. in a firewall),
then say Y here.
config LAN_SAA9730
bool "Philips SAA9730 Ethernet support"
depends on NET_PCI && PCI && MIPS_ATLAS
help
The SAA9730 is a combined multimedia and peripheral controller used
in thin clients, Internet access terminals, and diskless
workstations.
See <http://www.semiconductors.philips.com/pip/SAA9730_flyer_1>.
config SC92031
tristate "Silan SC92031 PCI Fast Ethernet Adapter driver (EXPERIMENTAL)"
depends on NET_PCI && PCI && EXPERIMENTAL
@ -2004,9 +1968,6 @@ config E1000E
To compile this driver as a module, choose M here. The module
will be called e1000e.
config E1000E_ENABLED
def_bool E1000E != n
config IP1000
tristate "IP1000 Gigabit Ethernet support"
depends on PCI && EXPERIMENTAL
@ -2038,6 +1999,15 @@ config IGB
To compile this driver as a module, choose M here. The module
will be called igb.
config IGB_LRO
bool "Use software LRO"
depends on IGB && INET
select INET_LRO
---help---
Say Y here if you want to use large receive offload.
If in doubt, say N.
source "drivers/net/ixp2000/Kconfig"
config MYRI_SBUS
@ -2095,20 +2065,6 @@ config R8169
To compile this driver as a module, choose M here: the module
will be called r8169. This is recommended.
config R8169_NAPI
bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
depends on R8169 && EXPERIMENTAL
help
NAPI is a new driver API designed to reduce CPU and interrupt load
when the driver is receiving lots of packets from the card. It is
still somewhat experimental and thus not yet enabled by default.
If your estimated Rx load is 10kpps or more, or if the card will be
deployed on potentially unfriendly networks (e.g. in a firewall),
then say Y here.
If in doubt, say N.
config R8169_VLAN
bool "VLAN support"
depends on R8169 && VLAN_8021Q
@ -2218,6 +2174,7 @@ config VIA_VELOCITY
config TIGON3
tristate "Broadcom Tigon3 support"
depends on PCI
select PHYLIB
help
This driver supports Broadcom Tigon3 based gigabit Ethernet cards.
@ -2273,6 +2230,19 @@ config GELIC_WIRELESS
the driver automatically distinguishes the models, you can
safely enable this option even if you have a wireless-less model.
config GELIC_WIRELESS_OLD_PSK_INTERFACE
bool "PS3 Wireless private PSK interface (OBSOLETE)"
depends on GELIC_WIRELESS
help
This option retains the obsolete private interface to pass
the PSK from user space programs to the driver. The PSK
stands for 'Pre Shared Key' and is used for WPA[2]-PSK
(WPA-Personal) environment.
If WPA[2]-PSK is used and you need to use old programs that
support only this old interface, say Y. Otherwise N.
If unsure, say N.
config GIANFAR
tristate "Gianfar Ethernet"
depends on FSL_SOC
@ -2282,10 +2252,6 @@ config GIANFAR
This driver supports the Gigabit TSEC on the MPC83xx, MPC85xx,
and MPC86xx family of chips, and the FEC on the 8540.
config GFAR_NAPI
bool "Use Rx Polling (NAPI)"
depends on GIANFAR
config UCC_GETH
tristate "Freescale QE Gigabit Ethernet"
depends on QUICC_ENGINE
@ -2294,10 +2260,6 @@ config UCC_GETH
This driver supports the Gigabit Ethernet mode of the QUICC Engine,
which is available on some Freescale SOCs.
config UGETH_NAPI
bool "Use Rx Polling (NAPI)"
depends on UCC_GETH
config UGETH_MAGIC_PACKET
bool "Magic Packet detection support"
depends on UCC_GETH
@ -2387,18 +2349,11 @@ config CHELSIO_T1_1G
Enables support for Chelsio's gigabit Ethernet PCI cards. If you
are using only 10G cards say 'N' here.
config CHELSIO_T1_NAPI
bool "Use Rx Polling (NAPI)"
depends on CHELSIO_T1
default y
help
NAPI is a driver API designed to reduce CPU and interrupt load
when the driver is receiving lots of packets from the card.
config CHELSIO_T3
tristate "Chelsio Communications T3 10Gb Ethernet support"
depends on PCI
depends on PCI && INET
select FW_LOADER
select INET_LRO
help
This driver supports Chelsio T3-based gigabit and 10Gb Ethernet
adapters.
@ -2426,7 +2381,8 @@ config EHEA
config IXGBE
tristate "Intel(R) 10GbE PCI Express adapters support"
depends on PCI
depends on PCI && INET
select INET_LRO
---help---
This driver supports Intel(R) 10GbE PCI Express family of
adapters. For more information on how to identify your adapter, go
@ -2464,20 +2420,6 @@ config IXGB
To compile this driver as a module, choose M here. The module
will be called ixgb.
config IXGB_NAPI
bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
depends on IXGB && EXPERIMENTAL
help
NAPI is a new driver API designed to reduce CPU and interrupt load
when the driver is receiving lots of packets from the card. It is
still somewhat experimental and thus not yet enabled by default.
If your estimated Rx load is 10kpps or more, or if the card will be
deployed on potentially unfriendly networks (e.g. in a firewall),
then say Y here.
If in doubt, say N.
config S2IO
tristate "S2IO 10Gbe XFrame NIC"
depends on PCI
@ -2486,20 +2428,6 @@ config S2IO
More specific information on configuring the driver is in
<file:Documentation/networking/s2io.txt>.
config S2IO_NAPI
bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
depends on S2IO && EXPERIMENTAL
help
NAPI is a new driver API designed to reduce CPU and interrupt load
when the driver is receiving lots of packets from the card. It is
still somewhat experimental and thus not yet enabled by default.
If your estimated Rx load is 10kpps or more, or if the card will be
deployed on potentially unfriendly networks (e.g. in a firewall),
then say Y here.
If in doubt, say N.
config MYRI10GE
tristate "Myricom Myri-10G Ethernet support"
depends on PCI && INET
@ -2564,6 +2492,7 @@ config BNX2X
tristate "Broadcom NetXtremeII 10Gb support"
depends on PCI
select ZLIB_INFLATE
select LIBCRC32C
help
This driver supports Broadcom NetXtremeII 10 gigabit Ethernet cards.
To compile this driver as a module, choose M here: the module

View File

@ -4,7 +4,6 @@
obj-$(CONFIG_E1000) += e1000/
obj-$(CONFIG_E1000E) += e1000e/
obj-$(CONFIG_IBM_EMAC) += ibm_emac/
obj-$(CONFIG_IBM_NEW_EMAC) += ibm_newemac/
obj-$(CONFIG_IGB) += igb/
obj-$(CONFIG_IXGBE) += ixgbe/
@ -67,6 +66,7 @@ obj-$(CONFIG_FEALNX) += fealnx.o
obj-$(CONFIG_TIGON3) += tg3.o
obj-$(CONFIG_BNX2) += bnx2.o
obj-$(CONFIG_BNX2X) += bnx2x.o
bnx2x-objs := bnx2x_main.o bnx2x_link.o
spidernet-y += spider_net.o spider_net_ethtool.o
obj-$(CONFIG_SPIDER_NET) += spidernet.o sungem_phy.o
obj-$(CONFIG_GELIC_NET) += ps3_gelic.o
@ -80,6 +80,7 @@ obj-$(CONFIG_VIA_RHINE) += via-rhine.o
obj-$(CONFIG_VIA_VELOCITY) += via-velocity.o
obj-$(CONFIG_ADAPTEC_STARFIRE) += starfire.o
obj-$(CONFIG_RIONET) += rionet.o
obj-$(CONFIG_SH_ETH) += sh_eth.o
#
# end link order section
@ -105,11 +106,11 @@ ifeq ($(CONFIG_FEC_MPC52xx_MDIO),y)
endif
obj-$(CONFIG_68360_ENET) += 68360enet.o
obj-$(CONFIG_WD80x3) += wd.o 8390.o
obj-$(CONFIG_EL2) += 3c503.o 8390.o
obj-$(CONFIG_NE2000) += ne.o 8390.o
obj-$(CONFIG_NE2_MCA) += ne2.o 8390.o
obj-$(CONFIG_HPLAN) += hp.o 8390.o
obj-$(CONFIG_HPLAN_PLUS) += hp-plus.o 8390.o
obj-$(CONFIG_EL2) += 3c503.o 8390p.o
obj-$(CONFIG_NE2000) += ne.o 8390p.o
obj-$(CONFIG_NE2_MCA) += ne2.o 8390p.o
obj-$(CONFIG_HPLAN) += hp.o 8390p.o
obj-$(CONFIG_HPLAN_PLUS) += hp-plus.o 8390p.o
obj-$(CONFIG_ULTRA) += smc-ultra.o 8390.o
obj-$(CONFIG_ULTRAMCA) += smc-mca.o 8390.o
obj-$(CONFIG_ULTRA32) += smc-ultra32.o 8390.o
@ -165,7 +166,6 @@ obj-$(CONFIG_EEXPRESS_PRO) += eepro.o
obj-$(CONFIG_8139CP) += 8139cp.o
obj-$(CONFIG_8139TOO) += 8139too.o
obj-$(CONFIG_ZNET) += znet.o
obj-$(CONFIG_LAN_SAA9730) += saa9730.o
obj-$(CONFIG_CPMAC) += cpmac.o
obj-$(CONFIG_DEPCA) += depca.o
obj-$(CONFIG_EWRK3) += ewrk3.o
@ -235,6 +235,7 @@ obj-$(CONFIG_USB_CATC) += usb/
obj-$(CONFIG_USB_KAWETH) += usb/
obj-$(CONFIG_USB_PEGASUS) += usb/
obj-$(CONFIG_USB_RTL8150) += usb/
obj-$(CONFIG_USB_HSO) += usb/
obj-$(CONFIG_USB_USBNET) += usb/
obj-$(CONFIG_USB_ZD1201) += usb/

View File

@ -475,16 +475,12 @@ static irqreturn_t lance_interrupt (int irq, void *dev_id)
return IRQ_HANDLED;
}
struct net_device *last_dev;
static int lance_open (struct net_device *dev)
{
struct lance_private *lp = netdev_priv(dev);
volatile struct lance_regs *ll = lp->ll;
int ret;
last_dev = dev;
/* Stop the Lance */
ll->rap = LE_CSR0;
ll->rdp = LE_C0_STOP;

View File

@ -1457,11 +1457,6 @@ static int __devinit ace_init(struct net_device *dev)
ace_set_txprd(regs, ap, 0);
writel(0, &regs->RxRetCsm);
/*
* Zero the stats before starting the interface
*/
memset(&ap->stats, 0, sizeof(ap->stats));
/*
* Enable DMA engine now.
* If we do this sooner, Mckinley box pukes.
@ -2041,8 +2036,8 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
netif_rx(skb);
dev->last_rx = jiffies;
ap->stats.rx_packets++;
ap->stats.rx_bytes += retdesc->size;
dev->stats.rx_packets++;
dev->stats.rx_bytes += retdesc->size;
idx = (idx + 1) % RX_RETURN_RING_ENTRIES;
}
@ -2090,8 +2085,8 @@ static inline void ace_tx_int(struct net_device *dev,
}
if (skb) {
ap->stats.tx_packets++;
ap->stats.tx_bytes += skb->len;
dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len;
dev_kfree_skb_irq(skb);
info->skb = NULL;
}
@ -2863,11 +2858,11 @@ static struct net_device_stats *ace_get_stats(struct net_device *dev)
struct ace_mac_stats __iomem *mac_stats =
(struct ace_mac_stats __iomem *)ap->regs->Stats;
ap->stats.rx_missed_errors = readl(&mac_stats->drop_space);
ap->stats.multicast = readl(&mac_stats->kept_mc);
ap->stats.collisions = readl(&mac_stats->coll);
dev->stats.rx_missed_errors = readl(&mac_stats->drop_space);
dev->stats.multicast = readl(&mac_stats->kept_mc);
dev->stats.collisions = readl(&mac_stats->coll);
return &ap->stats;
return &dev->stats;
}

View File

@ -693,7 +693,6 @@ struct ace_private
__attribute__ ((aligned (SMP_CACHE_BYTES)));
u32 last_tx, last_std_rx, last_mini_rx;
#endif
struct net_device_stats stats;
int pci_using_dac;
};

View File

@ -101,9 +101,9 @@ Revision History:
#include "amd8111e.h"
#define MODULE_NAME "amd8111e"
#define MODULE_VERS "3.0.6"
#define MODULE_VERS "3.0.7"
MODULE_AUTHOR("Advanced Micro Devices, Inc.");
MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version 3.0.6");
MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version "MODULE_VERS);
MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl);
module_param_array(speed_duplex, int, NULL, 0);
@ -671,11 +671,7 @@ This is the receive indication function for packets with vlan tag.
*/
static int amd8111e_vlan_rx(struct amd8111e_priv *lp, struct sk_buff *skb, u16 vlan_tag)
{
#ifdef CONFIG_AMD8111E_NAPI
return vlan_hwaccel_receive_skb(skb, lp->vlgrp,vlan_tag);
#else
return vlan_hwaccel_rx(skb, lp->vlgrp, vlan_tag);
#endif /* CONFIG_AMD8111E_NAPI */
}
#endif
@ -722,7 +718,6 @@ static int amd8111e_tx(struct net_device *dev)
return 0;
}
#ifdef CONFIG_AMD8111E_NAPI
/* This function handles the driver receive operation in polling mode */
static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
{
@ -734,7 +729,6 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
int min_pkt_len, status;
unsigned int intr0;
int num_rx_pkt = 0;
/*int max_rx_pkt = NUM_RX_BUFFERS;*/
short pkt_len;
#if AMD8111E_VLAN_TAG_USED
short vtag;
@ -850,108 +844,6 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
return num_rx_pkt;
}
#else
/*
This function will check the ownership of receive buffers and descriptors. It will indicate to kernel up to half the number of maximum receive buffers in the descriptor ring, in a single receive interrupt. It will also replenish the descriptors with new skbs.
*/
static int amd8111e_rx(struct net_device *dev)
{
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;
int num_rx_pkt = 0;
int max_rx_pkt = NUM_RX_BUFFERS;
short pkt_len;
#if AMD8111E_VLAN_TAG_USED
short vtag;
#endif
/* If we own the next entry, it's a new packet. Send it up. */
while(++num_rx_pkt <= max_rx_pkt){
status = le16_to_cpu(lp->rx_ring[rx_index].rx_flags);
if(status & OWN_BIT)
return 0;
/* check if err summary bit is set */
if(status & ERR_BIT){
/*
* There is a tricky error noted by John Murphy,
* <murf@perftech.com> to Russ Nelson: Even with full-sized
* buffers it's possible for a jabber packet to use two
* buffers, with only the last correctly noting the error. */
/* reseting flags */
lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
goto err_next_pkt;
}
/* check for STP and ENP */
if(!((status & STP_BIT) && (status & ENP_BIT))){
/* reseting flags */
lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
goto err_next_pkt;
}
pkt_len = le16_to_cpu(lp->rx_ring[rx_index].msg_count) - 4;
#if AMD8111E_VLAN_TAG_USED
vtag = status & TT_MASK;
/*MAC will strip vlan tag*/
if(lp->vlgrp != NULL && vtag !=0)
min_pkt_len =MIN_PKT_LEN - 4;
else
#endif
min_pkt_len =MIN_PKT_LEN;
if (pkt_len < min_pkt_len) {
lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
lp->drv_rx_errors++;
goto err_next_pkt;
}
if(!(new_skb = dev_alloc_skb(lp->rx_buff_len))){
/* if allocation fail,
ignore that pkt and go to next one */
lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
lp->drv_rx_errors++;
goto err_next_pkt;
}
skb_reserve(new_skb, 2);
skb = lp->rx_skbuff[rx_index];
pci_unmap_single(lp->pci_dev,lp->rx_dma_addr[rx_index],
lp->rx_buff_len-2, PCI_DMA_FROMDEVICE);
skb_put(skb, pkt_len);
lp->rx_skbuff[rx_index] = new_skb;
lp->rx_dma_addr[rx_index] = pci_map_single(lp->pci_dev,
new_skb->data, lp->rx_buff_len-2,PCI_DMA_FROMDEVICE);
skb->protocol = eth_type_trans(skb, dev);
#if AMD8111E_VLAN_TAG_USED
if(lp->vlgrp != NULL && (vtag == TT_VLAN_TAGGED)){
amd8111e_vlan_rx(lp, skb,
le16_to_cpu(lp->rx_ring[rx_index].tag_ctrl_info));
} else
#endif
netif_rx (skb);
/*COAL update rx coalescing parameters*/
lp->coal_conf.rx_packets++;
lp->coal_conf.rx_bytes += pkt_len;
dev->last_rx = jiffies;
err_next_pkt:
lp->rx_ring[rx_index].buff_phy_addr
= cpu_to_le32(lp->rx_dma_addr[rx_index]);
lp->rx_ring[rx_index].buff_count =
cpu_to_le16(lp->rx_buff_len-2);
wmb();
lp->rx_ring[rx_index].rx_flags |= cpu_to_le16(OWN_BIT);
rx_index = (++lp->rx_idx) & RX_RING_DR_MOD_MASK;
}
return 0;
}
#endif /* CONFIG_AMD8111E_NAPI */
/*
This function will indicate the link status to the kernel.
*/
@ -1280,27 +1172,20 @@ static irqreturn_t amd8111e_interrupt(int irq, void *dev_id)
writel(intr0, mmio + INT0);
/* Check if Receive Interrupt has occurred. */
#ifdef CONFIG_AMD8111E_NAPI
if (intr0 & RINT0) {
if (netif_rx_schedule_prep(dev, &lp->napi)) {
/* Disable receive interupts */
writel(RINTEN0, mmio + INTEN0);
/* Schedule a polling routine */
__netif_rx_schedule(dev, &lp->napi);
}
else if (intren0 & RINTEN0) {
} else if (intren0 & RINTEN0) {
printk("************Driver bug! \
interrupt while in poll\n");
/* Fix by disable receive interrupts */
writel(RINTEN0, mmio + INTEN0);
}
}
#else
if(intr0 & RINT0){
amd8111e_rx(dev);
writel(VAL2 | RDMD0, mmio + CMD0);
}
#endif /* CONFIG_AMD8111E_NAPI */
/* Check if Transmit Interrupt has occurred. */
if (intr0 & TINT0)
amd8111e_tx(dev);
@ -1340,9 +1225,7 @@ static int amd8111e_close(struct net_device * dev)
struct amd8111e_priv *lp = netdev_priv(dev);
netif_stop_queue(dev);
#ifdef CONFIG_AMD8111E_NAPI
napi_disable(&lp->napi);
#endif
spin_lock_irq(&lp->lock);
@ -1374,9 +1257,7 @@ static int amd8111e_open(struct net_device * dev )
dev->name, dev))
return -EAGAIN;
#ifdef CONFIG_AMD8111E_NAPI
napi_enable(&lp->napi);
#endif
spin_lock_irq(&lp->lock);
@ -1384,9 +1265,7 @@ static int amd8111e_open(struct net_device * dev )
if(amd8111e_restart(dev)){
spin_unlock_irq(&lp->lock);
#ifdef CONFIG_AMD8111E_NAPI
napi_disable(&lp->napi);
#endif
if (dev->irq)
free_irq(dev->irq, dev);
return -ENOMEM;
@ -2036,9 +1915,7 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev,
dev->irq =pdev->irq;
dev->tx_timeout = amd8111e_tx_timeout;
dev->watchdog_timeo = AMD8111E_TX_TIMEOUT;
#ifdef CONFIG_AMD8111E_NAPI
netif_napi_add(dev, &lp->napi, amd8111e_rx_poll, 32);
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = amd8111e_poll;
#endif

View File

@ -522,7 +522,6 @@ static int eth_poll(struct napi_struct *napi, int budget)
#endif
if ((n = queue_get_desc(rxq, port, 0)) < 0) {
received = 0; /* No packet received */
#if DEBUG_RX
printk(KERN_DEBUG "%s: eth_poll netif_rx_complete\n",
dev->name);
@ -543,7 +542,7 @@ static int eth_poll(struct napi_struct *napi, int budget)
printk(KERN_DEBUG "%s: eth_poll all done\n",
dev->name);
#endif
return 0; /* all work done */
return received; /* all work done */
}
desc = rx_desc_ptr(port, n);

View File

@ -243,7 +243,7 @@ struct lance_private {
/* Possible memory/IO addresses for probing */
struct lance_addr {
static struct lance_addr {
unsigned long memaddr;
unsigned long ioaddr;
int slow_flag;

View File

@ -1859,7 +1859,8 @@ static u16 atl1_alloc_rx_buffers(struct atl1_adapter *adapter)
rfd_desc = ATL1_RFD_DESC(rfd_ring, rfd_next_to_use);
skb = dev_alloc_skb(adapter->rx_buffer_len + NET_IP_ALIGN);
skb = netdev_alloc_skb(adapter->netdev,
adapter->rx_buffer_len + NET_IP_ALIGN);
if (unlikely(!skb)) {
/* Better luck next round */
adapter->net_stats.rx_dropped++;

View File

@ -912,7 +912,7 @@ au1000_adjust_link(struct net_device *dev)
// link state changed
if (phydev->link) // link went up
netif_schedule(dev);
netif_tx_schedule_all(dev);
else { // link went down
aup->old_speed = 0;
aup->old_duplex = -1;

View File

@ -148,7 +148,7 @@ static inline void b44_sync_dma_desc_for_device(struct ssb_device *sdev,
unsigned long offset,
enum dma_data_direction dir)
{
dma_sync_single_range_for_device(sdev->dma_dev, dma_base,
ssb_dma_sync_single_range_for_device(sdev, dma_base,
offset & dma_desc_align_mask,
dma_desc_sync_size, dir);
}
@ -158,7 +158,7 @@ static inline void b44_sync_dma_desc_for_cpu(struct ssb_device *sdev,
unsigned long offset,
enum dma_data_direction dir)
{
dma_sync_single_range_for_cpu(sdev->dma_dev, dma_base,
ssb_dma_sync_single_range_for_cpu(sdev, dma_base,
offset & dma_desc_align_mask,
dma_desc_sync_size, dir);
}
@ -613,7 +613,7 @@ static void b44_tx(struct b44 *bp)
BUG_ON(skb == NULL);
dma_unmap_single(bp->sdev->dma_dev,
ssb_dma_unmap_single(bp->sdev,
rp->mapping,
skb->len,
DMA_TO_DEVICE);
@ -653,29 +653,29 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
if (skb == NULL)
return -ENOMEM;
mapping = dma_map_single(bp->sdev->dma_dev, skb->data,
mapping = ssb_dma_map_single(bp->sdev, skb->data,
RX_PKT_BUF_SZ,
DMA_FROM_DEVICE);
/* Hardware bug work-around, the chip is unable to do PCI DMA
to/from anything above 1GB :-( */
if (dma_mapping_error(mapping) ||
if (ssb_dma_mapping_error(bp->sdev, mapping) ||
mapping + RX_PKT_BUF_SZ > DMA_30BIT_MASK) {
/* Sigh... */
if (!dma_mapping_error(mapping))
dma_unmap_single(bp->sdev->dma_dev, mapping,
if (!ssb_dma_mapping_error(bp->sdev, mapping))
ssb_dma_unmap_single(bp->sdev, mapping,
RX_PKT_BUF_SZ, DMA_FROM_DEVICE);
dev_kfree_skb_any(skb);
skb = __netdev_alloc_skb(bp->dev, RX_PKT_BUF_SZ, GFP_ATOMIC|GFP_DMA);
if (skb == NULL)
return -ENOMEM;
mapping = dma_map_single(bp->sdev->dma_dev, skb->data,
mapping = ssb_dma_map_single(bp->sdev, skb->data,
RX_PKT_BUF_SZ,
DMA_FROM_DEVICE);
if (dma_mapping_error(mapping) ||
if (ssb_dma_mapping_error(bp->sdev, mapping) ||
mapping + RX_PKT_BUF_SZ > DMA_30BIT_MASK) {
if (!dma_mapping_error(mapping))
dma_unmap_single(bp->sdev->dma_dev, mapping, RX_PKT_BUF_SZ,DMA_FROM_DEVICE);
if (!ssb_dma_mapping_error(bp->sdev, mapping))
ssb_dma_unmap_single(bp->sdev, mapping, RX_PKT_BUF_SZ,DMA_FROM_DEVICE);
dev_kfree_skb_any(skb);
return -ENOMEM;
}
@ -750,7 +750,7 @@ static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
dest_idx * sizeof(dest_desc),
DMA_BIDIRECTIONAL);
dma_sync_single_for_device(bp->sdev->dma_dev, le32_to_cpu(src_desc->addr),
ssb_dma_sync_single_for_device(bp->sdev, le32_to_cpu(src_desc->addr),
RX_PKT_BUF_SZ,
DMA_FROM_DEVICE);
}
@ -772,7 +772,7 @@ static int b44_rx(struct b44 *bp, int budget)
struct rx_header *rh;
u16 len;
dma_sync_single_for_cpu(bp->sdev->dma_dev, map,
ssb_dma_sync_single_for_cpu(bp->sdev, map,
RX_PKT_BUF_SZ,
DMA_FROM_DEVICE);
rh = (struct rx_header *) skb->data;
@ -806,7 +806,7 @@ static int b44_rx(struct b44 *bp, int budget)
skb_size = b44_alloc_rx_skb(bp, cons, bp->rx_prod);
if (skb_size < 0)
goto drop_it;
dma_unmap_single(bp->sdev->dma_dev, map,
ssb_dma_unmap_single(bp->sdev, map,
skb_size, DMA_FROM_DEVICE);
/* Leave out rx_header */
skb_put(skb, len + RX_PKT_OFFSET);
@ -966,24 +966,24 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev)
goto err_out;
}
mapping = dma_map_single(bp->sdev->dma_dev, skb->data, len, DMA_TO_DEVICE);
if (dma_mapping_error(mapping) || mapping + len > DMA_30BIT_MASK) {
mapping = ssb_dma_map_single(bp->sdev, skb->data, len, DMA_TO_DEVICE);
if (ssb_dma_mapping_error(bp->sdev, mapping) || mapping + len > DMA_30BIT_MASK) {
struct sk_buff *bounce_skb;
/* Chip can't handle DMA to/from >1GB, use bounce buffer */
if (!dma_mapping_error(mapping))
dma_unmap_single(bp->sdev->dma_dev, mapping, len,
if (!ssb_dma_mapping_error(bp->sdev, mapping))
ssb_dma_unmap_single(bp->sdev, mapping, len,
DMA_TO_DEVICE);
bounce_skb = __dev_alloc_skb(len, GFP_ATOMIC | GFP_DMA);
if (!bounce_skb)
goto err_out;
mapping = dma_map_single(bp->sdev->dma_dev, bounce_skb->data,
mapping = ssb_dma_map_single(bp->sdev, bounce_skb->data,
len, DMA_TO_DEVICE);
if (dma_mapping_error(mapping) || mapping + len > DMA_30BIT_MASK) {
if (!dma_mapping_error(mapping))
dma_unmap_single(bp->sdev->dma_dev, mapping,
if (ssb_dma_mapping_error(bp->sdev, mapping) || mapping + len > DMA_30BIT_MASK) {
if (!ssb_dma_mapping_error(bp->sdev, mapping))
ssb_dma_unmap_single(bp->sdev, mapping,
len, DMA_TO_DEVICE);
dev_kfree_skb_any(bounce_skb);
goto err_out;
@ -1082,7 +1082,7 @@ static void b44_free_rings(struct b44 *bp)
if (rp->skb == NULL)
continue;
dma_unmap_single(bp->sdev->dma_dev, rp->mapping, RX_PKT_BUF_SZ,
ssb_dma_unmap_single(bp->sdev, rp->mapping, RX_PKT_BUF_SZ,
DMA_FROM_DEVICE);
dev_kfree_skb_any(rp->skb);
rp->skb = NULL;
@ -1094,7 +1094,7 @@ static void b44_free_rings(struct b44 *bp)
if (rp->skb == NULL)
continue;
dma_unmap_single(bp->sdev->dma_dev, rp->mapping, rp->skb->len,
ssb_dma_unmap_single(bp->sdev, rp->mapping, rp->skb->len,
DMA_TO_DEVICE);
dev_kfree_skb_any(rp->skb);
rp->skb = NULL;
@ -1117,12 +1117,12 @@ static void b44_init_rings(struct b44 *bp)
memset(bp->tx_ring, 0, B44_TX_RING_BYTES);
if (bp->flags & B44_FLAG_RX_RING_HACK)
dma_sync_single_for_device(bp->sdev->dma_dev, bp->rx_ring_dma,
ssb_dma_sync_single_for_device(bp->sdev, bp->rx_ring_dma,
DMA_TABLE_BYTES,
DMA_BIDIRECTIONAL);
if (bp->flags & B44_FLAG_TX_RING_HACK)
dma_sync_single_for_device(bp->sdev->dma_dev, bp->tx_ring_dma,
ssb_dma_sync_single_for_device(bp->sdev, bp->tx_ring_dma,
DMA_TABLE_BYTES,
DMA_TO_DEVICE);
@ -1144,25 +1144,27 @@ static void b44_free_consistent(struct b44 *bp)
bp->tx_buffers = NULL;
if (bp->rx_ring) {
if (bp->flags & B44_FLAG_RX_RING_HACK) {
dma_unmap_single(bp->sdev->dma_dev, bp->rx_ring_dma,
ssb_dma_unmap_single(bp->sdev, bp->rx_ring_dma,
DMA_TABLE_BYTES,
DMA_BIDIRECTIONAL);
kfree(bp->rx_ring);
} else
dma_free_coherent(bp->sdev->dma_dev, DMA_TABLE_BYTES,
bp->rx_ring, bp->rx_ring_dma);
ssb_dma_free_consistent(bp->sdev, DMA_TABLE_BYTES,
bp->rx_ring, bp->rx_ring_dma,
GFP_KERNEL);
bp->rx_ring = NULL;
bp->flags &= ~B44_FLAG_RX_RING_HACK;
}
if (bp->tx_ring) {
if (bp->flags & B44_FLAG_TX_RING_HACK) {
dma_unmap_single(bp->sdev->dma_dev, bp->tx_ring_dma,
ssb_dma_unmap_single(bp->sdev, bp->tx_ring_dma,
DMA_TABLE_BYTES,
DMA_TO_DEVICE);
kfree(bp->tx_ring);
} else
dma_free_coherent(bp->sdev->dma_dev, DMA_TABLE_BYTES,
bp->tx_ring, bp->tx_ring_dma);
ssb_dma_free_consistent(bp->sdev, DMA_TABLE_BYTES,
bp->tx_ring, bp->tx_ring_dma,
GFP_KERNEL);
bp->tx_ring = NULL;
bp->flags &= ~B44_FLAG_TX_RING_HACK;
}
@ -1187,7 +1189,7 @@ static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp)
goto out_err;
size = DMA_TABLE_BYTES;
bp->rx_ring = dma_alloc_coherent(bp->sdev->dma_dev, size, &bp->rx_ring_dma, gfp);
bp->rx_ring = ssb_dma_alloc_consistent(bp->sdev, size, &bp->rx_ring_dma, gfp);
if (!bp->rx_ring) {
/* Allocation may have failed due to pci_alloc_consistent
insisting on use of GFP_DMA, which is more restrictive
@ -1199,11 +1201,11 @@ static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp)
if (!rx_ring)
goto out_err;
rx_ring_dma = dma_map_single(bp->sdev->dma_dev, rx_ring,
rx_ring_dma = ssb_dma_map_single(bp->sdev, rx_ring,
DMA_TABLE_BYTES,
DMA_BIDIRECTIONAL);
if (dma_mapping_error(rx_ring_dma) ||
if (ssb_dma_mapping_error(bp->sdev, rx_ring_dma) ||
rx_ring_dma + size > DMA_30BIT_MASK) {
kfree(rx_ring);
goto out_err;
@ -1214,9 +1216,9 @@ static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp)
bp->flags |= B44_FLAG_RX_RING_HACK;
}
bp->tx_ring = dma_alloc_coherent(bp->sdev->dma_dev, size, &bp->tx_ring_dma, gfp);
bp->tx_ring = ssb_dma_alloc_consistent(bp->sdev, size, &bp->tx_ring_dma, gfp);
if (!bp->tx_ring) {
/* Allocation may have failed due to dma_alloc_coherent
/* Allocation may have failed due to ssb_dma_alloc_consistent
insisting on use of GFP_DMA, which is more restrictive
than necessary... */
struct dma_desc *tx_ring;
@ -1226,11 +1228,11 @@ static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp)
if (!tx_ring)
goto out_err;
tx_ring_dma = dma_map_single(bp->sdev->dma_dev, tx_ring,
tx_ring_dma = ssb_dma_map_single(bp->sdev, tx_ring,
DMA_TABLE_BYTES,
DMA_TO_DEVICE);
if (dma_mapping_error(tx_ring_dma) ||
if (ssb_dma_mapping_error(bp->sdev, tx_ring_dma) ||
tx_ring_dma + size > DMA_30BIT_MASK) {
kfree(tx_ring);
goto out_err;

View File

@ -357,7 +357,7 @@ static void bfin_mac_adjust_link(struct net_device *dev)
if (!lp->old_link) {
new_state = 1;
lp->old_link = 1;
netif_schedule(dev);
netif_tx_schedule_all(dev);
}
} else if (lp->old_link) {
new_state = 1;

File diff suppressed because it is too large Load Diff

View File

@ -309,6 +309,7 @@ struct l2_fhdr {
#endif
};
#define BNX2_RX_OFFSET (sizeof(struct l2_fhdr) + 2)
/*
* l2_context definition
@ -4156,6 +4157,23 @@ struct l2_fhdr {
#define BNX2_RPM_ACPI_PATTERN_CRC7_PATTERN_CRC7 (0xffffffffL<<0)
/*
* rlup_reg definition
* offset: 0x2000
*/
#define BNX2_RLUP_RSS_CONFIG 0x0000201c
#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_XI (0x3L<<0)
#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_OFF_XI (0L<<0)
#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_ALL_XI (1L<<0)
#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_IP_ONLY_XI (2L<<0)
#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_RES_XI (3L<<0)
#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_XI (0x3L<<2)
#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_OFF_XI (0L<<2)
#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_ALL_XI (1L<<2)
#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_IP_ONLY_XI (2L<<2)
#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_RES_XI (3L<<2)
/*
* rbuf_reg definition
* offset: 0x200000
@ -5527,6 +5545,9 @@ struct l2_fhdr {
#define BNX2_HC_TX_QUICK_CONS_TRIP_OFF (BNX2_HC_TX_QUICK_CONS_TRIP_1 - \
BNX2_HC_SB_CONFIG_1)
#define BNX2_HC_TX_TICKS_OFF (BNX2_HC_TX_TICKS_1 - BNX2_HC_SB_CONFIG_1)
#define BNX2_HC_RX_QUICK_CONS_TRIP_OFF (BNX2_HC_RX_QUICK_CONS_TRIP_1 - \
BNX2_HC_SB_CONFIG_1)
#define BNX2_HC_RX_TICKS_OFF (BNX2_HC_RX_TICKS_1 - BNX2_HC_SB_CONFIG_1)
/*
@ -5855,6 +5876,9 @@ struct l2_fhdr {
#define BNX2_RXP_FTQ_CTL_CUR_DEPTH (0x3ffL<<22)
#define BNX2_RXP_SCRATCH 0x000e0000
#define BNX2_RXP_SCRATCH_RSS_TBL_SZ 0x000e0038
#define BNX2_RXP_SCRATCH_RSS_TBL 0x000e003c
#define BNX2_RXP_SCRATCH_RSS_TBL_MAX_ENTRIES 128
/*
@ -6412,10 +6436,15 @@ struct l2_fhdr {
#define MAX_ETHERNET_PACKET_SIZE 1514
#define MAX_ETHERNET_JUMBO_PACKET_SIZE 9014
#define RX_COPY_THRESH 128
#define BNX2_RX_COPY_THRESH 128
#define BNX2_MISC_ENABLE_DEFAULT 0x17ffffff
#define BNX2_START_UNICAST_ADDRESS_INDEX 4
#define BNX2_END_UNICAST_ADDRESS_INDEX 7
#define BNX2_MAX_UNICAST_ADDRESSES (BNX2_END_UNICAST_ADDRESS_INDEX - \
BNX2_START_UNICAST_ADDRESS_INDEX + 1)
#define DMA_READ_CHANS 5
#define DMA_WRITE_CHANS 3
@ -6478,6 +6507,11 @@ struct l2_fhdr {
#define TX_CID 16
#define TX_TSS_CID 32
#define RX_CID 0
#define RX_RSS_CID 4
#define RX_MAX_RSS_RINGS 7
#define RX_MAX_RINGS (RX_MAX_RSS_RINGS + 1)
#define TX_MAX_TSS_RINGS 7
#define TX_MAX_RINGS (TX_MAX_TSS_RINGS + 1)
#define MB_TX_CID_ADDR MB_GET_CID_ADDR(TX_CID)
#define MB_RX_CID_ADDR MB_GET_CID_ADDR(RX_CID)
@ -6556,7 +6590,7 @@ struct flash_spec {
};
#define BNX2_MAX_MSIX_HW_VEC 9
#define BNX2_MAX_MSIX_VEC 2
#define BNX2_MAX_MSIX_VEC 9
#define BNX2_BASE_VEC 0
#define BNX2_TX_VEC 1
#define BNX2_TX_INT_NUM (BNX2_TX_VEC << BNX2_PCICFG_INT_ACK_CMD_INT_NUM_SHIFT)
@ -6568,24 +6602,56 @@ struct bnx2_irq {
char name[16];
};
struct bnx2_napi {
struct napi_struct napi ____cacheline_aligned;
struct bnx2 *bp;
struct status_block *status_blk;
struct status_block_msix *status_blk_msix;
u32 last_status_idx;
u32 int_num;
struct bnx2_tx_ring_info {
u32 tx_prod_bseq;
u16 tx_prod;
u32 tx_bidx_addr;
u32 tx_bseq_addr;
struct tx_bd *tx_desc_ring;
struct sw_bd *tx_buf_ring;
u16 tx_cons;
u16 hw_tx_cons;
dma_addr_t tx_desc_mapping;
};
struct bnx2_rx_ring_info {
u32 rx_prod_bseq;
u16 rx_prod;
u16 rx_cons;
u32 rx_bidx_addr;
u32 rx_bseq_addr;
u32 rx_pg_bidx_addr;
u16 rx_pg_prod;
u16 rx_pg_cons;
struct sw_bd *rx_buf_ring;
struct rx_bd *rx_desc_ring[MAX_RX_RINGS];
struct sw_pg *rx_pg_ring;
struct rx_bd *rx_pg_desc_ring[MAX_RX_PG_RINGS];
dma_addr_t rx_desc_mapping[MAX_RX_RINGS];
dma_addr_t rx_pg_desc_mapping[MAX_RX_PG_RINGS];
};
struct bnx2_napi {
struct napi_struct napi ____cacheline_aligned;
struct bnx2 *bp;
union {
struct status_block *msi;
struct status_block_msix *msix;
} status_blk;
u16 *hw_tx_cons_ptr;
u16 *hw_rx_cons_ptr;
u32 last_status_idx;
u32 int_num;
struct bnx2_rx_ring_info rx_ring;
struct bnx2_tx_ring_info tx_ring;
};
struct bnx2 {
@ -6612,14 +6678,7 @@ struct bnx2 {
#define BNX2_FLAG_USING_MSI_OR_MSIX (BNX2_FLAG_USING_MSI | \
BNX2_FLAG_USING_MSIX)
#define BNX2_FLAG_JUMBO_BROKEN 0x00000800
/* Put tx producer and consumer fields in separate cache lines. */
u32 tx_prod_bseq __attribute__((aligned(L1_CACHE_BYTES)));
u16 tx_prod;
u8 tx_vec;
u32 tx_bidx_addr;
u32 tx_bseq_addr;
#define BNX2_FLAG_CAN_KEEP_VLAN 0x00001000
struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC];
@ -6627,7 +6686,6 @@ struct bnx2 {
struct vlan_group *vlgrp;
#endif
u32 rx_offset;
u32 rx_buf_use_size; /* useable size */
u32 rx_buf_size; /* with alignment */
u32 rx_copy_thresh;
@ -6637,14 +6695,7 @@ struct bnx2 {
u32 rx_csum;
struct sw_bd *rx_buf_ring;
struct rx_bd *rx_desc_ring[MAX_RX_RINGS];
struct sw_pg *rx_pg_ring;
struct rx_bd *rx_pg_desc_ring[MAX_RX_PG_RINGS];
/* TX constants */
struct tx_bd *tx_desc_ring;
struct sw_bd *tx_buf_ring;
int tx_ring_size;
u32 tx_wake_thresh;
@ -6722,16 +6773,11 @@ struct bnx2 {
u16 fw_wr_seq;
u16 fw_drv_pulse_wr_seq;
dma_addr_t tx_desc_mapping;
int rx_max_ring;
int rx_ring_size;
dma_addr_t rx_desc_mapping[MAX_RX_RINGS];
int rx_max_pg_ring;
int rx_pg_ring_size;
dma_addr_t rx_pg_desc_mapping[MAX_RX_PG_RINGS];
u16 tx_quick_cons_trip;
u16 tx_quick_cons_trip_int;
@ -6750,7 +6796,6 @@ struct bnx2 {
u32 stats_ticks;
struct status_block *status_blk;
dma_addr_t status_blk_mapping;
struct statistics_block *stats_blk;
@ -6812,6 +6857,9 @@ struct bnx2 {
struct bnx2_irq irq_tbl[BNX2_MAX_MSIX_VEC];
int irq_nvecs;
u8 num_tx_rings;
u8 num_rx_rings;
};
#define REG_RD(bp, offset) \
@ -6912,6 +6960,7 @@ struct fw_info {
#define BNX2_DRV_MSG_CODE_DIAG 0x07000000
#define BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL 0x09000000
#define BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN 0x0b000000
#define BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE 0x0d000000
#define BNX2_DRV_MSG_CODE_CMD_SET_LINK 0x10000000
#define BNX2_DRV_MSG_DATA 0x00ff0000
@ -7240,6 +7289,10 @@ struct fw_info {
#define BNX2_FW_CAP_SIGNATURE_MASK 0xffff0000
#define BNX2_FW_CAP_REMOTE_PHY_CAPABLE 0x00000001
#define BNX2_FW_CAP_REMOTE_PHY_PRESENT 0x00000002
#define BNX2_FW_CAP_MFW_CAN_KEEP_VLAN 0x00000008
#define BNX2_FW_CAP_BC_CAN_KEEP_VLAN 0x00000010
#define BNX2_FW_CAP_CAN_KEEP_VLAN (BNX2_FW_CAP_BC_CAN_KEEP_VLAN | \
BNX2_FW_CAP_MFW_CAN_KEEP_VLAN)
#define BNX2_RPHY_SIGNATURE 0x36c
#define BNX2_RPHY_LOAD_SIGNATURE 0x5a5a5a5a

View File

@ -886,6 +886,23 @@ static struct fw_info bnx2_com_fw_06 = {
.rodata = bnx2_COM_b06FwRodata,
};
/* Initialized Values for the Completion Processor. */
static const struct cpu_reg cpu_reg_com = {
.mode = BNX2_COM_CPU_MODE,
.mode_value_halt = BNX2_COM_CPU_MODE_SOFT_HALT,
.mode_value_sstep = BNX2_COM_CPU_MODE_STEP_ENA,
.state = BNX2_COM_CPU_STATE,
.state_value_clear = 0xffffff,
.gpr0 = BNX2_COM_CPU_REG_FILE,
.evmask = BNX2_COM_CPU_EVENT_MASK,
.pc = BNX2_COM_CPU_PROGRAM_COUNTER,
.inst = BNX2_COM_CPU_INSTRUCTION,
.bp = BNX2_COM_CPU_HW_BREAKPOINT,
.spad_base = BNX2_COM_SCRATCH,
.mips_view_base = 0x8000000,
};
static u8 bnx2_CP_b06FwText[] = {
0x9d, 0xbc, 0x0d, 0x78, 0x13, 0xe7, 0x99, 0x2e, 0x7c, 0xcf, 0x48, 0xb2,
0x65, 0x5b, 0xb6, 0xc7, 0xb6, 0x0c, 0x22, 0x65, 0x41, 0x83, 0x47, 0x20,
@ -2167,6 +2184,22 @@ static struct fw_info bnx2_cp_fw_06 = {
.rodata = bnx2_CP_b06FwRodata,
};
/* Initialized Values the Command Processor. */
static const struct cpu_reg cpu_reg_cp = {
.mode = BNX2_CP_CPU_MODE,
.mode_value_halt = BNX2_CP_CPU_MODE_SOFT_HALT,
.mode_value_sstep = BNX2_CP_CPU_MODE_STEP_ENA,
.state = BNX2_CP_CPU_STATE,
.state_value_clear = 0xffffff,
.gpr0 = BNX2_CP_CPU_REG_FILE,
.evmask = BNX2_CP_CPU_EVENT_MASK,
.pc = BNX2_CP_CPU_PROGRAM_COUNTER,
.inst = BNX2_CP_CPU_INSTRUCTION,
.bp = BNX2_CP_CPU_HW_BREAKPOINT,
.spad_base = BNX2_CP_SCRATCH,
.mips_view_base = 0x8000000,
};
static u8 bnx2_RXP_b06FwText[] = {
0xec, 0x5b, 0x5d, 0x70, 0x5c, 0xd7, 0x5d, 0xff, 0xdf, 0xb3, 0x2b, 0x69,
0x2d, 0x4b, 0xf2, 0x95, 0xbc, 0x71, 0x56, 0xa9, 0x92, 0xec, 0x5a, 0x57,
@ -2946,6 +2979,22 @@ static struct fw_info bnx2_rxp_fw_06 = {
.rodata = bnx2_RXP_b06FwRodata,
};
/* Initialized Values for the RX Processor. */
static const struct cpu_reg cpu_reg_rxp = {
.mode = BNX2_RXP_CPU_MODE,
.mode_value_halt = BNX2_RXP_CPU_MODE_SOFT_HALT,
.mode_value_sstep = BNX2_RXP_CPU_MODE_STEP_ENA,
.state = BNX2_RXP_CPU_STATE,
.state_value_clear = 0xffffff,
.gpr0 = BNX2_RXP_CPU_REG_FILE,
.evmask = BNX2_RXP_CPU_EVENT_MASK,
.pc = BNX2_RXP_CPU_PROGRAM_COUNTER,
.inst = BNX2_RXP_CPU_INSTRUCTION,
.bp = BNX2_RXP_CPU_HW_BREAKPOINT,
.spad_base = BNX2_RXP_SCRATCH,
.mips_view_base = 0x8000000,
};
static u8 bnx2_rv2p_proc1[] = {
/* Date: 12/07/2007 15:02 */
0xd5, 0x56, 0x41, 0x6b, 0x13, 0x51, 0x10, 0x9e, 0xdd, 0x6c, 0xbb, 0xdb,
@ -3651,6 +3700,22 @@ static struct fw_info bnx2_tpat_fw_06 = {
.rodata = bnx2_TPAT_b06FwRodata,
};
/* Initialized Values for the TX Patch-up Processor. */
static const struct cpu_reg cpu_reg_tpat = {
.mode = BNX2_TPAT_CPU_MODE,
.mode_value_halt = BNX2_TPAT_CPU_MODE_SOFT_HALT,
.mode_value_sstep = BNX2_TPAT_CPU_MODE_STEP_ENA,
.state = BNX2_TPAT_CPU_STATE,
.state_value_clear = 0xffffff,
.gpr0 = BNX2_TPAT_CPU_REG_FILE,
.evmask = BNX2_TPAT_CPU_EVENT_MASK,
.pc = BNX2_TPAT_CPU_PROGRAM_COUNTER,
.inst = BNX2_TPAT_CPU_INSTRUCTION,
.bp = BNX2_TPAT_CPU_HW_BREAKPOINT,
.spad_base = BNX2_TPAT_SCRATCH,
.mips_view_base = 0x8000000,
};
static u8 bnx2_TXP_b06FwText[] = {
0xad, 0x7b, 0x7f, 0x70, 0x9b, 0x75, 0x7a, 0xe7, 0xe7, 0xd5, 0x0f, 0x5b,
0xb2, 0x65, 0x59, 0x0e, 0x4a, 0x90, 0x77, 0xbd, 0x8d, 0x5e, 0xf4, 0xca,
@ -4531,3 +4596,18 @@ static struct fw_info bnx2_txp_fw_06 = {
.rodata = bnx2_TXP_b06FwRodata,
};
/* Initialized Values for the TX Processor. */
static const struct cpu_reg cpu_reg_txp = {
.mode = BNX2_TXP_CPU_MODE,
.mode_value_halt = BNX2_TXP_CPU_MODE_SOFT_HALT,
.mode_value_sstep = BNX2_TXP_CPU_MODE_STEP_ENA,
.state = BNX2_TXP_CPU_STATE,
.state_value_clear = 0xffffff,
.gpr0 = BNX2_TXP_CPU_REG_FILE,
.evmask = BNX2_TXP_CPU_EVENT_MASK,
.pc = BNX2_TXP_CPU_PROGRAM_COUNTER,
.inst = BNX2_TXP_CPU_INSTRUCTION,
.bp = BNX2_TXP_CPU_HW_BREAKPOINT,
.spad_base = BNX2_TXP_SCRATCH,
.mips_view_base = 0x8000000,
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,81 +8,220 @@
*/
#define CSTORM_DEF_SB_HC_DISABLE_OFFSET(port, index)\
(0x1922 + (port * 0x40) + (index * 0x4))
#define CSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(port)\
(0x1900 + (port * 0x40))
#define CSTORM_ASSERT_LIST_INDEX_OFFSET \
(IS_E1H_OFFSET? 0x7000 : 0x1000)
#define CSTORM_ASSERT_LIST_OFFSET(idx) \
(IS_E1H_OFFSET? (0x7020 + (idx * 0x10)) : (0x1020 + (idx * 0x10)))
#define CSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \
(IS_E1H_OFFSET? (0x8522 + ((function>>1) * 0x40) + ((function&1) \
* 0x100) + (index * 0x4)) : (0x1922 + (function * 0x40) + (index \
* 0x4)))
#define CSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \
(IS_E1H_OFFSET? (0x8500 + ((function>>1) * 0x40) + ((function&1) \
* 0x100)) : (0x1900 + (function * 0x40)))
#define CSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \
(IS_E1H_OFFSET? (0x8508 + ((function>>1) * 0x40) + ((function&1) \
* 0x100)) : (0x1908 + (function * 0x40)))
#define CSTORM_FUNCTION_MODE_OFFSET \
(IS_E1H_OFFSET? 0x11e8 : 0xffffffff)
#define CSTORM_HC_BTR_OFFSET(port) \
(0x1984 + (port * 0xc0))
(IS_E1H_OFFSET? (0x8704 + (port * 0xf0)) : (0x1984 + (port * 0xc0)))
#define CSTORM_SB_HC_DISABLE_OFFSET(port, cpu_id, index) \
(0x141a + (port * 0x280) + (cpu_id * 0x28) + (index * 0x4))
(IS_E1H_OFFSET? (0x801a + (port * 0x280) + (cpu_id * 0x28) + \
(index * 0x4)) : (0x141a + (port * 0x280) + (cpu_id * 0x28) + \
(index * 0x4)))
#define CSTORM_SB_HC_TIMEOUT_OFFSET(port, cpu_id, index) \
(0x1418 + (port * 0x280) + (cpu_id * 0x28) + (index * 0x4))
(IS_E1H_OFFSET? (0x8018 + (port * 0x280) + (cpu_id * 0x28) + \
(index * 0x4)) : (0x1418 + (port * 0x280) + (cpu_id * 0x28) + \
(index * 0x4)))
#define CSTORM_SB_HOST_SB_ADDR_OFFSET(port, cpu_id) \
(0x1400 + (port * 0x280) + (cpu_id * 0x28))
#define CSTORM_STATS_FLAGS_OFFSET(port) (0x5108 + (port * 0x8))
(IS_E1H_OFFSET? (0x8000 + (port * 0x280) + (cpu_id * 0x28)) : \
(0x1400 + (port * 0x280) + (cpu_id * 0x28)))
#define CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, cpu_id) \
(IS_E1H_OFFSET? (0x8008 + (port * 0x280) + (cpu_id * 0x28)) : \
(0x1408 + (port * 0x280) + (cpu_id * 0x28)))
#define CSTORM_STATS_FLAGS_OFFSET(function) \
(IS_E1H_OFFSET? (0x1108 + (function * 0x8)) : (0x5108 + \
(function * 0x8)))
#define TSTORM_APPROXIMATE_MATCH_MULTICAST_FILTERING_OFFSET(function) \
(IS_E1H_OFFSET? (0x31c0 + (function * 0x20)) : 0xffffffff)
#define TSTORM_ASSERT_LIST_INDEX_OFFSET \
(IS_E1H_OFFSET? 0xa000 : 0x1000)
#define TSTORM_ASSERT_LIST_OFFSET(idx) \
(IS_E1H_OFFSET? (0xa020 + (idx * 0x10)) : (0x1020 + (idx * 0x10)))
#define TSTORM_CLIENT_CONFIG_OFFSET(port, client_id) \
(0x1510 + (port * 0x240) + (client_id * 0x20))
#define TSTORM_DEF_SB_HC_DISABLE_OFFSET(port, index)\
(0x138a + (port * 0x28) + (index * 0x4))
#define TSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(port)\
(0x1370 + (port * 0x28))
#define TSTORM_ETH_STATS_QUERY_ADDR_OFFSET(port)\
(0x4b70 + (port * 0x8))
(IS_E1H_OFFSET? (0x3358 + (port * 0x3e8) + (client_id * 0x28)) : \
(0x9c8 + (port * 0x2f8) + (client_id * 0x28)))
#define TSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \
(IS_E1H_OFFSET? (0xb01a + ((function>>1) * 0x28) + ((function&1) \
* 0xa0) + (index * 0x4)) : (0x141a + (function * 0x28) + (index * \
0x4)))
#define TSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \
(IS_E1H_OFFSET? (0xb000 + ((function>>1) * 0x28) + ((function&1) \
* 0xa0)) : (0x1400 + (function * 0x28)))
#define TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \
(IS_E1H_OFFSET? (0xb008 + ((function>>1) * 0x28) + ((function&1) \
* 0xa0)) : (0x1408 + (function * 0x28)))
#define TSTORM_ETH_STATS_QUERY_ADDR_OFFSET(function) \
(IS_E1H_OFFSET? (0x2b80 + (function * 0x8)) : (0x4b68 + \
(function * 0x8)))
#define TSTORM_FUNCTION_COMMON_CONFIG_OFFSET(function) \
(0x1418 + (function * 0x30))
(IS_E1H_OFFSET? (0x3000 + (function * 0x38)) : (0x1500 + \
(function * 0x38)))
#define TSTORM_FUNCTION_MODE_OFFSET \
(IS_E1H_OFFSET? 0x1ad0 : 0xffffffff)
#define TSTORM_HC_BTR_OFFSET(port) \
(0x13c4 + (port * 0x18))
#define TSTORM_INDIRECTION_TABLE_OFFSET(port)\
(0x22c8 + (port * 0x80))
(IS_E1H_OFFSET? (0xb144 + (port * 0x30)) : (0x1454 + (port * 0x18)))
#define TSTORM_INDIRECTION_TABLE_OFFSET(function) \
(IS_E1H_OFFSET? (0x12c8 + (function * 0x80)) : (0x22c8 + \
(function * 0x80)))
#define TSTORM_INDIRECTION_TABLE_SIZE 0x80
#define TSTORM_MAC_FILTER_CONFIG_OFFSET(port)\
(0x1420 + (port * 0x30))
#define TSTORM_RCQ_PROD_OFFSET(port, client_id)\
(0x1508 + (port * 0x240) + (client_id * 0x20))
#define TSTORM_STATS_FLAGS_OFFSET(port) (0x4b90 + (port * 0x8))
#define USTORM_DEF_SB_HC_DISABLE_OFFSET(port, index)\
(0x191a + (port * 0x28) + (index * 0x4))
#define USTORM_DEF_SB_HOST_SB_ADDR_OFFSET(port)\
(0x1900 + (port * 0x28))
#define TSTORM_MAC_FILTER_CONFIG_OFFSET(function) \
(IS_E1H_OFFSET? (0x3008 + (function * 0x38)) : (0x1508 + \
(function * 0x38)))
#define TSTORM_RX_PRODS_OFFSET(port, client_id) \
(IS_E1H_OFFSET? (0x3350 + (port * 0x3e8) + (client_id * 0x28)) : \
(0x9c0 + (port * 0x2f8) + (client_id * 0x28)))
#define TSTORM_STATS_FLAGS_OFFSET(function) \
(IS_E1H_OFFSET? (0x2c00 + (function * 0x8)) : (0x4b88 + \
(function * 0x8)))
#define TSTORM_TPA_EXIST_OFFSET (IS_E1H_OFFSET? 0x3b30 : 0x1c20)
#define USTORM_AGG_DATA_OFFSET (IS_E1H_OFFSET? 0xa040 : 0x2c10)
#define USTORM_AGG_DATA_SIZE (IS_E1H_OFFSET? 0x2440 : 0x1200)
#define USTORM_ASSERT_LIST_INDEX_OFFSET \
(IS_E1H_OFFSET? 0x8000 : 0x1000)
#define USTORM_ASSERT_LIST_OFFSET(idx) \
(IS_E1H_OFFSET? (0x8020 + (idx * 0x10)) : (0x1020 + (idx * 0x10)))
#define USTORM_CQE_PAGE_BASE_OFFSET(port, clientId) \
(IS_E1H_OFFSET? (0x3298 + (port * 0x258) + (clientId * 0x18)) : \
(0x5450 + (port * 0x1c8) + (clientId * 0x18)))
#define USTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \
(IS_E1H_OFFSET? (0x951a + ((function>>1) * 0x28) + ((function&1) \
* 0xa0) + (index * 0x4)) : (0x191a + (function * 0x28) + (index * \
0x4)))
#define USTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \
(IS_E1H_OFFSET? (0x9500 + ((function>>1) * 0x28) + ((function&1) \
* 0xa0)) : (0x1900 + (function * 0x28)))
#define USTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \
(IS_E1H_OFFSET? (0x9508 + ((function>>1) * 0x28) + ((function&1) \
* 0xa0)) : (0x1908 + (function * 0x28)))
#define USTORM_FUNCTION_MODE_OFFSET \
(IS_E1H_OFFSET? 0x2448 : 0xffffffff)
#define USTORM_HC_BTR_OFFSET(port) \
(0x1954 + (port * 0xb8))
#define USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(port)\
(0x5408 + (port * 0x8))
(IS_E1H_OFFSET? (0x9644 + (port * 0xd0)) : (0x1954 + (port * 0xb8)))
#define USTORM_MAX_AGG_SIZE_OFFSET(port, clientId) \
(IS_E1H_OFFSET? (0x3290 + (port * 0x258) + (clientId * 0x18)) : \
(0x5448 + (port * 0x1c8) + (clientId * 0x18)))
#define USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(function) \
(IS_E1H_OFFSET? (0x2408 + (function * 0x8)) : (0x5408 + \
(function * 0x8)))
#define USTORM_SB_HC_DISABLE_OFFSET(port, cpu_id, index) \
(0x141a + (port * 0x280) + (cpu_id * 0x28) + (index * 0x4))
(IS_E1H_OFFSET? (0x901a + (port * 0x280) + (cpu_id * 0x28) + \
(index * 0x4)) : (0x141a + (port * 0x280) + (cpu_id * 0x28) + \
(index * 0x4)))
#define USTORM_SB_HC_TIMEOUT_OFFSET(port, cpu_id, index) \
(0x1418 + (port * 0x280) + (cpu_id * 0x28) + (index * 0x4))
(IS_E1H_OFFSET? (0x9018 + (port * 0x280) + (cpu_id * 0x28) + \
(index * 0x4)) : (0x1418 + (port * 0x280) + (cpu_id * 0x28) + \
(index * 0x4)))
#define USTORM_SB_HOST_SB_ADDR_OFFSET(port, cpu_id) \
(0x1400 + (port * 0x280) + (cpu_id * 0x28))
#define XSTORM_ASSERT_LIST_INDEX_OFFSET 0x1000
#define XSTORM_ASSERT_LIST_OFFSET(idx) (0x1020 + (idx * 0x10))
#define XSTORM_DEF_SB_HC_DISABLE_OFFSET(port, index)\
(0x141a + (port * 0x28) + (index * 0x4))
#define XSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(port)\
(0x1400 + (port * 0x28))
#define XSTORM_ETH_STATS_QUERY_ADDR_OFFSET(port)\
(0x5408 + (port * 0x8))
(IS_E1H_OFFSET? (0x9000 + (port * 0x280) + (cpu_id * 0x28)) : \
(0x1400 + (port * 0x280) + (cpu_id * 0x28)))
#define USTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, cpu_id) \
(IS_E1H_OFFSET? (0x9008 + (port * 0x280) + (cpu_id * 0x28)) : \
(0x1408 + (port * 0x280) + (cpu_id * 0x28)))
#define XSTORM_ASSERT_LIST_INDEX_OFFSET \
(IS_E1H_OFFSET? 0x9000 : 0x1000)
#define XSTORM_ASSERT_LIST_OFFSET(idx) \
(IS_E1H_OFFSET? (0x9020 + (idx * 0x10)) : (0x1020 + (idx * 0x10)))
#define XSTORM_CMNG_PER_PORT_VARS_OFFSET(port) \
(IS_E1H_OFFSET? (0x24a8 + (port * 0x40)) : (0x3ba0 + (port * 0x40)))
#define XSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \
(IS_E1H_OFFSET? (0xa01a + ((function>>1) * 0x28) + ((function&1) \
* 0xa0) + (index * 0x4)) : (0x141a + (function * 0x28) + (index * \
0x4)))
#define XSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \
(IS_E1H_OFFSET? (0xa000 + ((function>>1) * 0x28) + ((function&1) \
* 0xa0)) : (0x1400 + (function * 0x28)))
#define XSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \
(IS_E1H_OFFSET? (0xa008 + ((function>>1) * 0x28) + ((function&1) \
* 0xa0)) : (0x1408 + (function * 0x28)))
#define XSTORM_E1HOV_OFFSET(function) \
(IS_E1H_OFFSET? (0x2ab8 + (function * 0x2)) : 0xffffffff)
#define XSTORM_ETH_STATS_QUERY_ADDR_OFFSET(function) \
(IS_E1H_OFFSET? (0x2418 + (function * 0x8)) : (0x3b70 + \
(function * 0x8)))
#define XSTORM_FAIRNESS_PER_VN_VARS_OFFSET(function) \
(IS_E1H_OFFSET? (0x2568 + (function * 0x70)) : (0x3c60 + \
(function * 0x70)))
#define XSTORM_FUNCTION_MODE_OFFSET \
(IS_E1H_OFFSET? 0x2ac8 : 0xffffffff)
#define XSTORM_HC_BTR_OFFSET(port) \
(0x1454 + (port * 0x18))
#define XSTORM_SPQ_PAGE_BASE_OFFSET(port)\
(0x5328 + (port * 0x18))
#define XSTORM_SPQ_PROD_OFFSET(port)\
(0x5330 + (port * 0x18))
#define XSTORM_STATS_FLAGS_OFFSET(port) (0x53f8 + (port * 0x8))
(IS_E1H_OFFSET? (0xa144 + (port * 0x30)) : (0x1454 + (port * 0x18)))
#define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(function) \
(IS_E1H_OFFSET? (0x2528 + (function * 0x70)) : (0x3c20 + \
(function * 0x70)))
#define XSTORM_SPQ_PAGE_BASE_OFFSET(function) \
(IS_E1H_OFFSET? (0x2000 + (function * 0x10)) : (0x3328 + \
(function * 0x10)))
#define XSTORM_SPQ_PROD_OFFSET(function) \
(IS_E1H_OFFSET? (0x2008 + (function * 0x10)) : (0x3330 + \
(function * 0x10)))
#define XSTORM_STATS_FLAGS_OFFSET(function) \
(IS_E1H_OFFSET? (0x23d8 + (function * 0x8)) : (0x3b60 + \
(function * 0x8)))
#define COMMON_ASM_INVALID_ASSERT_OPCODE 0x0
/**
* This file defines HSI constatnts for the ETH flow
*/
#ifdef _EVEREST_MICROCODE
#include "microcode_constants.h"
#include "eth_rx_bd.h"
#include "eth_tx_bd.h"
#include "eth_rx_cqe.h"
#include "eth_rx_sge.h"
#include "eth_rx_cqe_next_page.h"
#endif
/* hash types */
/* RSS hash types */
#define DEFAULT_HASH_TYPE 0
#define IPV4_HASH_TYPE 1
#define TCP_IPV4_HASH_TYPE 2
#define IPV6_HASH_TYPE 3
#define TCP_IPV6_HASH_TYPE 4
/* Ethernet Ring parmaters */
#define X_ETH_LOCAL_RING_SIZE 13
#define FIRST_BD_IN_PKT 0
#define PARSE_BD_INDEX 1
#define NUM_OF_ETH_BDS_IN_PAGE \
((PAGE_SIZE) / (STRUCT_SIZE(eth_tx_bd)/8))
/* Rx ring params */
#define U_ETH_LOCAL_BD_RING_SIZE (16)
#define U_ETH_LOCAL_SGE_RING_SIZE (12)
#define U_ETH_SGL_SIZE (8)
#define U_ETH_BDS_PER_PAGE_MASK \
((PAGE_SIZE/(STRUCT_SIZE(eth_rx_bd)/8))-1)
#define U_ETH_CQE_PER_PAGE_MASK \
((PAGE_SIZE/(STRUCT_SIZE(eth_rx_cqe)/8))-1)
#define U_ETH_SGES_PER_PAGE_MASK \
((PAGE_SIZE/(STRUCT_SIZE(eth_rx_sge)/8))-1)
#define U_ETH_SGES_PER_PAGE_INVERSE_MASK \
(0xFFFF - ((PAGE_SIZE/((STRUCT_SIZE(eth_rx_sge))/8))-1))
#define TU_ETH_CQES_PER_PAGE \
(PAGE_SIZE/(STRUCT_SIZE(eth_rx_cqe_next_page)/8))
#define U_ETH_BDS_PER_PAGE (PAGE_SIZE/(STRUCT_SIZE(eth_rx_bd)/8))
#define U_ETH_SGES_PER_PAGE (PAGE_SIZE/(STRUCT_SIZE(eth_rx_sge)/8))
#define U_ETH_UNDEFINED_Q 0xFF
/* values of command IDs in the ramrod message */
#define RAMROD_CMD_ID_ETH_PORT_SETUP (80)
#define RAMROD_CMD_ID_ETH_CLIENT_SETUP (85)
@ -101,8 +240,17 @@
#define T_ETH_INDIRECTION_TABLE_SIZE 128
/*The CRC32 seed, that is used for the hash(reduction) multicast address */
#define T_ETH_CRC32_HASH_SEED 0x00000000
/* Maximal L2 clients supported */
#define ETH_MAX_RX_CLIENTS (18)
#define ETH_MAX_RX_CLIENTS_E1 19
#define ETH_MAX_RX_CLIENTS_E1H 25
/* Maximal aggregation queues supported */
#define ETH_MAX_AGGREGATION_QUEUES_E1 (32)
#define ETH_MAX_AGGREGATION_QUEUES_E1H (64)
/**
* This file defines HSI constatnts common to all microcode flows
@ -110,38 +258,30 @@
/* Connection types */
#define ETH_CONNECTION_TYPE 0
#define TOE_CONNECTION_TYPE 1
#define RDMA_CONNECTION_TYPE 2
#define ISCSI_CONNECTION_TYPE 3
#define FCOE_CONNECTION_TYPE 4
#define RESERVED_CONNECTION_TYPE_0 5
#define RESERVED_CONNECTION_TYPE_1 6
#define RESERVED_CONNECTION_TYPE_2 7
#define PROTOCOL_STATE_BIT_OFFSET 6
#define ETH_STATE (ETH_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET)
#define TOE_STATE (TOE_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET)
#define RDMA_STATE (RDMA_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET)
#define ISCSI_STATE \
(ISCSI_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET)
#define FCOE_STATE (FCOE_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET)
/* microcode fixed page page size 4K (chains and ring segments) */
#define MC_PAGE_SIZE (4096)
/* Host coalescing constants */
/* IGU constants */
#define IGU_PORT_BASE 0x0400
#define IGU_ADDR_MSIX 0x0000
#define IGU_ADDR_INT_ACK 0x0200
#define IGU_ADDR_PROD_UPD 0x0201
#define IGU_ADDR_ATTN_BITS_UPD 0x0202
#define IGU_ADDR_ATTN_BITS_SET 0x0203
#define IGU_ADDR_ATTN_BITS_CLR 0x0204
#define IGU_ADDR_COALESCE_NOW 0x0205
#define IGU_ADDR_SIMD_MASK 0x0206
#define IGU_ADDR_SIMD_NOMASK 0x0207
#define IGU_ADDR_MSI_CTL 0x0210
#define IGU_ADDR_MSI_ADDR_LO 0x0211
#define IGU_ADDR_MSI_ADDR_HI 0x0212
#define IGU_ADDR_MSI_DATA 0x0213
#define IGU_INT_ENABLE 0
#define IGU_INT_DISABLE 1
#define IGU_INT_NOP 2
#define IGU_INT_NOP2 3
/* index numbers */
#define HC_USTORM_DEF_SB_NUM_INDICES 4
#define HC_CSTORM_DEF_SB_NUM_INDICES 8
@ -152,14 +292,29 @@
/* index values - which counterto update */
#define HC_INDEX_U_TOE_RX_CQ_CONS 0
#define HC_INDEX_U_ETH_RX_CQ_CONS 1
#define HC_INDEX_U_ETH_RX_BD_CONS 2
#define HC_INDEX_U_FCOE_EQ_CONS 3
#define HC_INDEX_C_TOE_TX_CQ_CONS 0
#define HC_INDEX_C_ETH_TX_CQ_CONS 1
#define HC_INDEX_C_ISCSI_EQ_CONS 2
#define HC_INDEX_DEF_X_SPQ_CONS 0
#define HC_INDEX_DEF_C_RDMA_EQ_CONS 0
#define HC_INDEX_DEF_C_RDMA_NAL_PROD 1
#define HC_INDEX_DEF_C_ETH_FW_TX_CQ_CONS 2
#define HC_INDEX_DEF_C_ETH_SLOW_PATH 3
#define HC_INDEX_DEF_C_ETH_RDMA_CQ_CONS 4
#define HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS 5
#define HC_INDEX_DEF_U_ETH_RDMA_RX_CQ_CONS 0
#define HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS 1
#define HC_INDEX_DEF_U_ETH_RDMA_RX_BD_CONS 2
#define HC_INDEX_DEF_U_ETH_ISCSI_RX_BD_CONS 3
/* used by the driver to get the SB offset */
#define USTORM_ID 0
@ -175,9 +330,50 @@
#define RX_ETH_CQE_TYPE_ETH_FASTPATH (0)
#define RX_ETH_CQE_TYPE_ETH_RAMROD (1)
/* MAC address list size */
#define T_MAC_ADDRESS_LIST_SIZE (96)
/**** DEFINES FOR TIMERS/CLOCKS RESOLUTIONS ****/
#define EMULATION_FREQUENCY_FACTOR (1600)
#define FPGA_FREQUENCY_FACTOR (100)
#define TIMERS_TICK_SIZE_CHIP (1e-3)
#define TIMERS_TICK_SIZE_EMUL \
((TIMERS_TICK_SIZE_CHIP)/((EMULATION_FREQUENCY_FACTOR)))
#define TIMERS_TICK_SIZE_FPGA \
((TIMERS_TICK_SIZE_CHIP)/((FPGA_FREQUENCY_FACTOR)))
#define TSEMI_CLK1_RESUL_CHIP (1e-3)
#define TSEMI_CLK1_RESUL_EMUL \
((TSEMI_CLK1_RESUL_CHIP)/(EMULATION_FREQUENCY_FACTOR))
#define TSEMI_CLK1_RESUL_FPGA \
((TSEMI_CLK1_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR))
#define USEMI_CLK1_RESUL_CHIP \
(TIMERS_TICK_SIZE_CHIP)
#define USEMI_CLK1_RESUL_EMUL \
(TIMERS_TICK_SIZE_EMUL)
#define USEMI_CLK1_RESUL_FPGA \
(TIMERS_TICK_SIZE_FPGA)
#define XSEMI_CLK1_RESUL_CHIP (1e-3)
#define XSEMI_CLK1_RESUL_EMUL \
((XSEMI_CLK1_RESUL_CHIP)/(EMULATION_FREQUENCY_FACTOR))
#define XSEMI_CLK1_RESUL_FPGA \
((XSEMI_CLK1_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR))
#define XSEMI_CLK2_RESUL_CHIP (1e-6)
#define XSEMI_CLK2_RESUL_EMUL \
((XSEMI_CLK2_RESUL_CHIP)/(EMULATION_FREQUENCY_FACTOR))
#define XSEMI_CLK2_RESUL_FPGA \
((XSEMI_CLK2_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR))
#define SDM_TIMER_TICK_RESUL_CHIP (4*(1e-6))
#define SDM_TIMER_TICK_RESUL_EMUL \
((SDM_TIMER_TICK_RESUL_CHIP)/(EMULATION_FREQUENCY_FACTOR))
#define SDM_TIMER_TICK_RESUL_FPGA \
((SDM_TIMER_TICK_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR))
/**** END DEFINES FOR TIMERS/CLOCKS RESOLUTIONS ****/
#define XSTORM_IP_ID_ROLL_HALF 0x8000
#define XSTORM_IP_ID_ROLL_ALL 0
@ -186,13 +382,16 @@
#define NUM_OF_PROTOCOLS 4
#define MAX_COS_NUMBER 16
#define MAX_T_STAT_COUNTER_ID 18
#define T_FAIR 1
#define FAIR_MEM 2
#define RS_PERIODIC_TIMEOUT_IN_SDM_TICS 25
#define MAX_X_STAT_COUNTER_ID 18
#define UNKNOWN_ADDRESS 0
#define UNICAST_ADDRESS 1
#define MULTICAST_ADDRESS 2
#define BROADCAST_ADDRESS 3
#define SINGLE_FUNCTION 0
#define MULTI_FUNCTION 1
#define IP_V4 0
#define IP_V6 1

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,8 @@
#define INIT_ASIC 0x4
#define INIT_HARDWARE 0x7
#define STORM_INTMEM_SIZE (0x5800 / 4)
#define STORM_INTMEM_SIZE_E1 (0x5800 / 4)
#define STORM_INTMEM_SIZE_E1H (0x10000 / 4)
#define TSTORM_INTMEM_ADDR 0x1a0000
#define CSTORM_INTMEM_ADDR 0x220000
#define XSTORM_INTMEM_ADDR 0x2a0000
@ -30,7 +31,7 @@
/* Init operation types and structures */
/* Common for both E1 and E1H */
#define OP_RD 0x1 /* read single register */
#define OP_WR 0x2 /* write single register */
#define OP_IW 0x3 /* write single register using mailbox */
@ -38,7 +39,37 @@
#define OP_SI 0x5 /* copy a string using mailbox */
#define OP_ZR 0x6 /* clear memory */
#define OP_ZP 0x7 /* unzip then copy with DMAE */
#define OP_WB 0x8 /* copy a string using DMAE */
#define OP_WR_64 0x8 /* write 64 bit pattern */
#define OP_WB 0x9 /* copy a string using DMAE */
/* Operation specific for E1 */
#define OP_RD_E1 0xa /* read single register */
#define OP_WR_E1 0xb /* write single register */
#define OP_IW_E1 0xc /* write single register using mailbox */
#define OP_SW_E1 0xd /* copy a string to the device */
#define OP_SI_E1 0xe /* copy a string using mailbox */
#define OP_ZR_E1 0xf /* clear memory */
#define OP_ZP_E1 0x10 /* unzip then copy with DMAE */
#define OP_WR_64_E1 0x11 /* write 64 bit pattern on E1 */
#define OP_WB_E1 0x12 /* copy a string using DMAE */
/* Operation specific for E1H */
#define OP_RD_E1H 0x13 /* read single register */
#define OP_WR_E1H 0x14 /* write single register */
#define OP_IW_E1H 0x15 /* write single register using mailbox */
#define OP_SW_E1H 0x16 /* copy a string to the device */
#define OP_SI_E1H 0x17 /* copy a string using mailbox */
#define OP_ZR_E1H 0x18 /* clear memory */
#define OP_ZP_E1H 0x19 /* unzip then copy with DMAE */
#define OP_WR_64_E1H 0x1a /* write 64 bit pattern on E1H */
#define OP_WB_E1H 0x1b /* copy a string using DMAE */
/* FPGA and EMUL specific operations */
#define OP_WR_EMUL_E1H 0x1c /* write single register on E1H Emul */
#define OP_WR_EMUL 0x1d /* write single register on Emulation */
#define OP_WR_FPGA 0x1e /* write single register on FPGA */
#define OP_WR_ASIC 0x1f /* write single register on ASIC */
struct raw_op {
u32 op :8;
@ -87,10 +118,6 @@ union init_op {
#include "bnx2x_init_values.h"
static void bnx2x_reg_wr_ind(struct bnx2x *bp, u32 addr, u32 val);
static void bnx2x_write_dmae(struct bnx2x *bp, dma_addr_t dma_addr,
u32 dst_addr, u32 len32);
static int bnx2x_gunzip(struct bnx2x *bp, u8 *zbuf, int len);
static void bnx2x_init_str_wr(struct bnx2x *bp, u32 addr, const u32 *data,
@ -107,9 +134,6 @@ static void bnx2x_init_str_wr(struct bnx2x *bp, u32 addr, const u32 *data,
}
}
#define INIT_MEM_WR(reg, data, reg_off, len) \
bnx2x_init_str_wr(bp, reg + reg_off*4, data, len)
static void bnx2x_init_ind_wr(struct bnx2x *bp, u32 addr, const u32 *data,
u16 len)
{
@ -124,11 +148,117 @@ static void bnx2x_init_ind_wr(struct bnx2x *bp, u32 addr, const u32 *data,
}
}
static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len)
{
#ifdef USE_DMAE
int offset = 0;
if (bp->dmae_ready) {
while (len > DMAE_LEN32_WR_MAX) {
bnx2x_write_dmae(bp, bp->gunzip_mapping + offset,
addr + offset, DMAE_LEN32_WR_MAX);
offset += DMAE_LEN32_WR_MAX * 4;
len -= DMAE_LEN32_WR_MAX;
}
bnx2x_write_dmae(bp, bp->gunzip_mapping + offset,
addr + offset, len);
} else
bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len);
#else
bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len);
#endif
}
static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len)
{
if ((len * 4) > FW_BUF_SIZE) {
BNX2X_ERR("LARGE DMAE OPERATION ! addr 0x%x len 0x%x\n",
addr, len*4);
return;
}
memset(bp->gunzip_buf, fill, len * 4);
bnx2x_write_big_buf(bp, addr, len);
}
static void bnx2x_init_wr_64(struct bnx2x *bp, u32 addr, const u32 *data,
u32 len64)
{
u32 buf_len32 = FW_BUF_SIZE/4;
u32 len = len64*2;
u64 data64 = 0;
int i;
/* 64 bit value is in a blob: first low DWORD, then high DWORD */
data64 = HILO_U64((*(data + 1)), (*data));
len64 = min((u32)(FW_BUF_SIZE/8), len64);
for (i = 0; i < len64; i++) {
u64 *pdata = ((u64 *)(bp->gunzip_buf)) + i;
*pdata = data64;
}
for (i = 0; i < len; i += buf_len32) {
u32 cur_len = min(buf_len32, len - i);
bnx2x_write_big_buf(bp, addr + i * 4, cur_len);
}
}
/*********************************************************
There are different blobs for each PRAM section.
In addition, each blob write operation is divided into a few operations
in order to decrease the amount of phys. contigious buffer needed.
Thus, when we select a blob the address may be with some offset
from the beginning of PRAM section.
The same holds for the INT_TABLE sections.
**********************************************************/
#define IF_IS_INT_TABLE_ADDR(base, addr) \
if (((base) <= (addr)) && ((base) + 0x400 >= (addr)))
#define IF_IS_PRAM_ADDR(base, addr) \
if (((base) <= (addr)) && ((base) + 0x40000 >= (addr)))
static const u32 *bnx2x_sel_blob(u32 addr, const u32 *data, int is_e1)
{
IF_IS_INT_TABLE_ADDR(TSEM_REG_INT_TABLE, addr)
data = is_e1 ? tsem_int_table_data_e1 :
tsem_int_table_data_e1h;
else
IF_IS_INT_TABLE_ADDR(CSEM_REG_INT_TABLE, addr)
data = is_e1 ? csem_int_table_data_e1 :
csem_int_table_data_e1h;
else
IF_IS_INT_TABLE_ADDR(USEM_REG_INT_TABLE, addr)
data = is_e1 ? usem_int_table_data_e1 :
usem_int_table_data_e1h;
else
IF_IS_INT_TABLE_ADDR(XSEM_REG_INT_TABLE, addr)
data = is_e1 ? xsem_int_table_data_e1 :
xsem_int_table_data_e1h;
else
IF_IS_PRAM_ADDR(TSEM_REG_PRAM, addr)
data = is_e1 ? tsem_pram_data_e1 : tsem_pram_data_e1h;
else
IF_IS_PRAM_ADDR(CSEM_REG_PRAM, addr)
data = is_e1 ? csem_pram_data_e1 : csem_pram_data_e1h;
else
IF_IS_PRAM_ADDR(USEM_REG_PRAM, addr)
data = is_e1 ? usem_pram_data_e1 : usem_pram_data_e1h;
else
IF_IS_PRAM_ADDR(XSEM_REG_PRAM, addr)
data = is_e1 ? xsem_pram_data_e1 : xsem_pram_data_e1h;
return data;
}
static void bnx2x_init_wr_wb(struct bnx2x *bp, u32 addr, const u32 *data,
u32 len, int gunzip)
u32 len, int gunzip, int is_e1, u32 blob_off)
{
int offset = 0;
data = bnx2x_sel_blob(addr, data, is_e1) + blob_off;
if (gunzip) {
int rc;
#ifdef __BIG_ENDIAN
@ -143,7 +273,7 @@ static void bnx2x_init_wr_wb(struct bnx2x *bp, u32 addr, const u32 *data,
#endif
rc = bnx2x_gunzip(bp, (u8 *)data, len);
if (rc) {
DP(NETIF_MSG_HW, "gunzip failed ! rc %d\n", rc);
BNX2X_ERR("gunzip failed ! rc %d\n", rc);
return;
}
len = bp->gunzip_outlen;
@ -155,52 +285,47 @@ static void bnx2x_init_wr_wb(struct bnx2x *bp, u32 addr, const u32 *data,
#endif
} else {
if ((len * 4) > FW_BUF_SIZE) {
BNX2X_ERR("LARGE DMAE OPERATION ! len 0x%x\n", len*4);
BNX2X_ERR("LARGE DMAE OPERATION ! "
"addr 0x%x len 0x%x\n", addr, len*4);
return;
}
memcpy(bp->gunzip_buf, data, len * 4);
}
while (len > DMAE_LEN32_MAX) {
if (bp->dmae_ready) {
while (len > DMAE_LEN32_WR_MAX) {
bnx2x_write_dmae(bp, bp->gunzip_mapping + offset,
addr + offset, DMAE_LEN32_MAX);
offset += DMAE_LEN32_MAX * 4;
len -= DMAE_LEN32_MAX;
addr + offset, DMAE_LEN32_WR_MAX);
offset += DMAE_LEN32_WR_MAX * 4;
len -= DMAE_LEN32_WR_MAX;
}
bnx2x_write_dmae(bp, bp->gunzip_mapping + offset, addr + offset, len);
}
#define INIT_MEM_WB(reg, data, reg_off, len) \
bnx2x_init_wr_wb(bp, reg + reg_off*4, data, len, 0)
#define INIT_GUNZIP_DMAE(reg, data, reg_off, len) \
bnx2x_init_wr_wb(bp, reg + reg_off*4, data, len, 1)
static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len)
{
int offset = 0;
if ((len * 4) > FW_BUF_SIZE) {
BNX2X_ERR("LARGE DMAE OPERATION ! len 0x%x\n", len * 4);
return;
}
memset(bp->gunzip_buf, fill, len * 4);
while (len > DMAE_LEN32_MAX) {
bnx2x_write_dmae(bp, bp->gunzip_mapping + offset,
addr + offset, DMAE_LEN32_MAX);
offset += DMAE_LEN32_MAX * 4;
len -= DMAE_LEN32_MAX;
}
bnx2x_write_dmae(bp, bp->gunzip_mapping + offset, addr + offset, len);
addr + offset, len);
} else
bnx2x_init_ind_wr(bp, addr, bp->gunzip_buf, len);
}
static void bnx2x_init_block(struct bnx2x *bp, u32 op_start, u32 op_end)
{
int i;
int is_e1 = CHIP_IS_E1(bp);
int is_e1h = CHIP_IS_E1H(bp);
int is_emul_e1h = (CHIP_REV_IS_EMUL(bp) && is_e1h);
int hw_wr, i;
union init_op *op;
u32 op_type, addr, len;
const u32 *data;
const u32 *data, *data_base;
if (CHIP_REV_IS_FPGA(bp))
hw_wr = OP_WR_FPGA;
else if (CHIP_REV_IS_EMUL(bp))
hw_wr = OP_WR_EMUL;
else
hw_wr = OP_WR_ASIC;
if (is_e1)
data_base = init_data_e1;
else /* CHIP_IS_E1H(bp) */
data_base = init_data_e1h;
for (i = op_start; i < op_end; i++) {
@ -209,7 +334,30 @@ static void bnx2x_init_block(struct bnx2x *bp, u32 op_start, u32 op_end)
op_type = op->str_wr.op;
addr = op->str_wr.offset;
len = op->str_wr.data_len;
data = init_data + op->str_wr.data_off;
data = data_base + op->str_wr.data_off;
/* carefull! it must be in order */
if (unlikely(op_type > OP_WB)) {
/* If E1 only */
if (op_type <= OP_WB_E1) {
if (is_e1)
op_type -= (OP_RD_E1 - OP_RD);
/* If E1H only */
} else if (op_type <= OP_WB_E1H) {
if (is_e1h)
op_type -= (OP_RD_E1H - OP_RD);
}
/* HW/EMUL specific */
if (op_type == hw_wr)
op_type = OP_WR;
/* EMUL on E1H is special */
if ((op_type == OP_WR_EMUL_E1H) && is_emul_e1h)
op_type = OP_WR;
}
switch (op_type) {
case OP_RD:
@ -222,7 +370,7 @@ static void bnx2x_init_block(struct bnx2x *bp, u32 op_start, u32 op_end)
bnx2x_init_str_wr(bp, addr, data, len);
break;
case OP_WB:
bnx2x_init_wr_wb(bp, addr, data, len, 0);
bnx2x_init_wr_wb(bp, addr, data, len, 0, is_e1, 0);
break;
case OP_SI:
bnx2x_init_ind_wr(bp, addr, data, len);
@ -231,10 +379,21 @@ static void bnx2x_init_block(struct bnx2x *bp, u32 op_start, u32 op_end)
bnx2x_init_fill(bp, addr, 0, op->zero.len);
break;
case OP_ZP:
bnx2x_init_wr_wb(bp, addr, data, len, 1);
bnx2x_init_wr_wb(bp, addr, data, len, 1, is_e1,
op->str_wr.data_off);
break;
case OP_WR_64:
bnx2x_init_wr_64(bp, addr, data, len);
break;
default:
BNX2X_ERR("BAD init operation!\n");
/* happens whenever an op is of a diff HW */
#if 0
DP(NETIF_MSG_HW, "skipping init operation "
"index %d[%d:%d]: type %d addr 0x%x "
"len %d(0x%x)\n",
i, op_start, op_end, op_type, addr, len, len);
#endif
break;
}
}
}
@ -245,7 +404,7 @@ static void bnx2x_init_block(struct bnx2x *bp, u32 op_start, u32 op_end)
****************************************************************************/
/*
* This code configures the PCI read/write arbiter
* which implements a wighted round robin
* which implements a weighted round robin
* between the virtual queues in the chip.
*
* The values were derived for each PCI max payload and max request size.
@ -315,7 +474,7 @@ static const struct arb_line write_arb_data[NUM_WR_Q][MAX_WR_ORD + 1] = {
{{8 , 64 , 25}, {16 , 64 , 41}, {32 , 64 , 81} }
};
/* register adresses for read queues */
/* register addresses for read queues */
static const struct arb_line read_arb_addr[NUM_RD_Q-1] = {
{PXP2_REG_RQ_BW_RD_L0, PXP2_REG_RQ_BW_RD_ADD0,
PXP2_REG_RQ_BW_RD_UBOUND0},
@ -375,7 +534,7 @@ static const struct arb_line read_arb_addr[NUM_RD_Q-1] = {
PXP2_REG_PSWRQ_BW_UB28}
};
/* register adresses for wrtie queues */
/* register addresses for write queues */
static const struct arb_line write_arb_addr[NUM_WR_Q-1] = {
{PXP2_REG_PSWRQ_BW_L1, PXP2_REG_PSWRQ_BW_ADD1,
PXP2_REG_PSWRQ_BW_UB1},
@ -424,6 +583,10 @@ static void bnx2x_init_pxp(struct bnx2x *bp)
w_order, MAX_WR_ORD);
w_order = MAX_WR_ORD;
}
if (CHIP_REV_IS_FPGA(bp)) {
DP(NETIF_MSG_HW, "write order adjusted to 1 for FPGA\n");
w_order = 0;
}
DP(NETIF_MSG_HW, "read order %d write order %d\n", r_order, w_order);
for (i = 0; i < NUM_RD_Q-1; i++) {
@ -481,7 +644,20 @@ static void bnx2x_init_pxp(struct bnx2x *bp)
REG_WR(bp, PXP2_REG_RQ_PDR_LIMIT, 0xe00);
REG_WR(bp, PXP2_REG_WR_USDMDP_TH, (0x18 << w_order));
REG_WR(bp, PXP2_REG_WR_DMAE_TH, (128 << w_order)/16);
if (CHIP_IS_E1H(bp)) {
REG_WR(bp, PXP2_REG_WR_HC_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_USDM_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_CSDM_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_TSDM_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_XSDM_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_QM_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_TM_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_SRC_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_DBG_MPS, w_order+1);
REG_WR(bp, PXP2_REG_WR_DMAE_MPS, 2); /* DMAE is special */
REG_WR(bp, PXP2_REG_WR_CDU_MPS, w_order+1);
}
}
@ -564,6 +740,72 @@ static u8 calc_crc8(u32 data, u8 crc)
return crc_res;
}
/* regiesers addresses are not in order
so these arrays help simplify the code */
static const int cm_start[E1H_FUNC_MAX][9] = {
{MISC_FUNC0_START, TCM_FUNC0_START, UCM_FUNC0_START, CCM_FUNC0_START,
XCM_FUNC0_START, TSEM_FUNC0_START, USEM_FUNC0_START, CSEM_FUNC0_START,
XSEM_FUNC0_START},
{MISC_FUNC1_START, TCM_FUNC1_START, UCM_FUNC1_START, CCM_FUNC1_START,
XCM_FUNC1_START, TSEM_FUNC1_START, USEM_FUNC1_START, CSEM_FUNC1_START,
XSEM_FUNC1_START},
{MISC_FUNC2_START, TCM_FUNC2_START, UCM_FUNC2_START, CCM_FUNC2_START,
XCM_FUNC2_START, TSEM_FUNC2_START, USEM_FUNC2_START, CSEM_FUNC2_START,
XSEM_FUNC2_START},
{MISC_FUNC3_START, TCM_FUNC3_START, UCM_FUNC3_START, CCM_FUNC3_START,
XCM_FUNC3_START, TSEM_FUNC3_START, USEM_FUNC3_START, CSEM_FUNC3_START,
XSEM_FUNC3_START},
{MISC_FUNC4_START, TCM_FUNC4_START, UCM_FUNC4_START, CCM_FUNC4_START,
XCM_FUNC4_START, TSEM_FUNC4_START, USEM_FUNC4_START, CSEM_FUNC4_START,
XSEM_FUNC4_START},
{MISC_FUNC5_START, TCM_FUNC5_START, UCM_FUNC5_START, CCM_FUNC5_START,
XCM_FUNC5_START, TSEM_FUNC5_START, USEM_FUNC5_START, CSEM_FUNC5_START,
XSEM_FUNC5_START},
{MISC_FUNC6_START, TCM_FUNC6_START, UCM_FUNC6_START, CCM_FUNC6_START,
XCM_FUNC6_START, TSEM_FUNC6_START, USEM_FUNC6_START, CSEM_FUNC6_START,
XSEM_FUNC6_START},
{MISC_FUNC7_START, TCM_FUNC7_START, UCM_FUNC7_START, CCM_FUNC7_START,
XCM_FUNC7_START, TSEM_FUNC7_START, USEM_FUNC7_START, CSEM_FUNC7_START,
XSEM_FUNC7_START}
};
static const int cm_end[E1H_FUNC_MAX][9] = {
{MISC_FUNC0_END, TCM_FUNC0_END, UCM_FUNC0_END, CCM_FUNC0_END,
XCM_FUNC0_END, TSEM_FUNC0_END, USEM_FUNC0_END, CSEM_FUNC0_END,
XSEM_FUNC0_END},
{MISC_FUNC1_END, TCM_FUNC1_END, UCM_FUNC1_END, CCM_FUNC1_END,
XCM_FUNC1_END, TSEM_FUNC1_END, USEM_FUNC1_END, CSEM_FUNC1_END,
XSEM_FUNC1_END},
{MISC_FUNC2_END, TCM_FUNC2_END, UCM_FUNC2_END, CCM_FUNC2_END,
XCM_FUNC2_END, TSEM_FUNC2_END, USEM_FUNC2_END, CSEM_FUNC2_END,
XSEM_FUNC2_END},
{MISC_FUNC3_END, TCM_FUNC3_END, UCM_FUNC3_END, CCM_FUNC3_END,
XCM_FUNC3_END, TSEM_FUNC3_END, USEM_FUNC3_END, CSEM_FUNC3_END,
XSEM_FUNC3_END},
{MISC_FUNC4_END, TCM_FUNC4_END, UCM_FUNC4_END, CCM_FUNC4_END,
XCM_FUNC4_END, TSEM_FUNC4_END, USEM_FUNC4_END, CSEM_FUNC4_END,
XSEM_FUNC4_END},
{MISC_FUNC5_END, TCM_FUNC5_END, UCM_FUNC5_END, CCM_FUNC5_END,
XCM_FUNC5_END, TSEM_FUNC5_END, USEM_FUNC5_END, CSEM_FUNC5_END,
XSEM_FUNC5_END},
{MISC_FUNC6_END, TCM_FUNC6_END, UCM_FUNC6_END, CCM_FUNC6_END,
XCM_FUNC6_END, TSEM_FUNC6_END, USEM_FUNC6_END, CSEM_FUNC6_END,
XSEM_FUNC6_END},
{MISC_FUNC7_END, TCM_FUNC7_END, UCM_FUNC7_END, CCM_FUNC7_END,
XCM_FUNC7_END, TSEM_FUNC7_END, USEM_FUNC7_END, CSEM_FUNC7_END,
XSEM_FUNC7_END},
};
static const int hc_limits[E1H_FUNC_MAX][2] = {
{HC_FUNC0_START, HC_FUNC0_END},
{HC_FUNC1_START, HC_FUNC1_END},
{HC_FUNC2_START, HC_FUNC2_END},
{HC_FUNC3_START, HC_FUNC3_END},
{HC_FUNC4_START, HC_FUNC4_END},
{HC_FUNC5_START, HC_FUNC5_END},
{HC_FUNC6_START, HC_FUNC6_END},
{HC_FUNC7_START, HC_FUNC7_END}
};
#endif /* BNX2X_INIT_H */

File diff suppressed because it is too large Load Diff

4527
drivers/net/bnx2x_link.c Normal file

File diff suppressed because it is too large Load Diff

168
drivers/net/bnx2x_link.h Normal file
View File

@ -0,0 +1,168 @@
/* Copyright 2008 Broadcom Corporation
*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to you
* under the terms of the GNU General Public License version 2, available
* at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL").
*
* Notwithstanding the above, under no circumstances may you combine this
* software in any way with any other Broadcom software provided under a
* license other than the GPL, without Broadcom's express prior written
* consent.
*
* Written by Yaniv Rosner
*
*/
#ifndef BNX2X_LINK_H
#define BNX2X_LINK_H
/***********************************************************/
/* Defines */
/***********************************************************/
#define DEFAULT_PHY_DEV_ADDR 3
#define FLOW_CTRL_AUTO PORT_FEATURE_FLOW_CONTROL_AUTO
#define FLOW_CTRL_TX PORT_FEATURE_FLOW_CONTROL_TX
#define FLOW_CTRL_RX PORT_FEATURE_FLOW_CONTROL_RX
#define FLOW_CTRL_BOTH PORT_FEATURE_FLOW_CONTROL_BOTH
#define FLOW_CTRL_NONE PORT_FEATURE_FLOW_CONTROL_NONE
#define SPEED_AUTO_NEG 0
#define SPEED_12000 12000
#define SPEED_12500 12500
#define SPEED_13000 13000
#define SPEED_15000 15000
#define SPEED_16000 16000
/***********************************************************/
/* Structs */
/***********************************************************/
/* Inputs parameters to the CLC */
struct link_params {
u8 port;
/* Default / User Configuration */
u8 loopback_mode;
#define LOOPBACK_NONE 0
#define LOOPBACK_EMAC 1
#define LOOPBACK_BMAC 2
#define LOOPBACK_XGXS_10 3
#define LOOPBACK_EXT_PHY 4
u16 req_duplex;
u16 req_flow_ctrl;
u16 req_line_speed; /* Also determine AutoNeg */
/* Device parameters */
u8 mac_addr[6];
u16 mtu;
/* shmem parameters */
u32 shmem_base;
u32 speed_cap_mask;
u32 switch_cfg;
#define SWITCH_CFG_1G PORT_FEATURE_CON_SWITCH_1G_SWITCH
#define SWITCH_CFG_10G PORT_FEATURE_CON_SWITCH_10G_SWITCH
#define SWITCH_CFG_AUTO_DETECT PORT_FEATURE_CON_SWITCH_AUTO_DETECT
u16 hw_led_mode; /* part of the hw_config read from the shmem */
u32 serdes_config;
u32 lane_config;
u32 ext_phy_config;
#define XGXS_EXT_PHY_TYPE(ext_phy_config) (ext_phy_config & \
PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK)
#define SERDES_EXT_PHY_TYPE(ext_phy_config) (ext_phy_config & \
PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK)
/* Phy register parameter */
u32 chip_id;
/* phy_addr populated by the CLC */
u8 phy_addr;
/* Device pointer passed to all callback functions */
struct bnx2x *bp;
};
/* Output parameters */
struct link_vars {
u8 phy_link_up; /* internal phy link indication */
u8 link_up;
u16 duplex;
u16 flow_ctrl;
u32 ieee_fc;
u8 mac_type;
#define MAC_TYPE_NONE 0
#define MAC_TYPE_EMAC 1
#define MAC_TYPE_BMAC 2
u16 line_speed;
u32 autoneg;
#define AUTO_NEG_DISABLED 0x0
#define AUTO_NEG_ENABLED 0x1
#define AUTO_NEG_COMPLETE 0x2
#define AUTO_NEG_PARALLEL_DETECTION_USED 0x3
u8 phy_flags;
/* The same definitions as the shmem parameter */
u32 link_status;
};
/***********************************************************/
/* Functions */
/***********************************************************/
/* Initialize the phy */
u8 bnx2x_phy_init(struct link_params *input, struct link_vars *output);
/* Reset the link. Should be called when driver or interface goes down */
u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars);
/* bnx2x_link_update should be called upon link interrupt */
u8 bnx2x_link_update(struct link_params *input, struct link_vars *output);
/* use the following cl45 functions to read/write from external_phy
In order to use it to read/write internal phy registers, use
DEFAULT_PHY_DEV_ADDR as devad, and (_bank + (_addr & 0xf)) as
Use ext_phy_type of 0 in case of cl22 over cl45
the register */
u8 bnx2x_cl45_read(struct bnx2x *bp, u8 port, u32 ext_phy_type,
u8 phy_addr, u8 devad, u16 reg, u16 *ret_val);
u8 bnx2x_cl45_write(struct bnx2x *bp, u8 port, u32 ext_phy_type,
u8 phy_addr, u8 devad, u16 reg, u16 val);
/* Reads the link_status from the shmem,
and update the link vars accordinaly */
void bnx2x_link_status_update(struct link_params *input,
struct link_vars *output);
/* returns string representing the fw_version of the external phy */
u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded,
u8 *version, u16 len);
/* Set/Unset the led
Basically, the CLC takes care of the led for the link, but in case one needs
to set/unset the led unnatually, set the "mode" to LED_MODE_OPER to
blink the led, and LED_MODE_OFF to set the led off.*/
u8 bnx2x_set_led(struct bnx2x *bp, u8 port, u8 mode, u32 speed,
u16 hw_led_mode, u32 chip_id);
#define LED_MODE_OFF 0
#define LED_MODE_OPER 2
u8 bnx2x_override_led_value(struct bnx2x *bp, u8 port, u32 led_idx, u32 value);
u8 bnx2x_flash_download(struct bnx2x *bp, u8 port, u32 ext_phy_config,
u8 driver_loaded, char data[], u32 size);
/* Get the actual link status. In case it returns 0, link is up,
otherwise link is down*/
u8 bnx2x_test_link(struct link_params *input, struct link_vars *vars);
#endif /* BNX2X_LINK_H */

10294
drivers/net/bnx2x_main.c Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -419,8 +419,10 @@ static void rlb_teach_disabled_mac_on_primary(struct bonding *bond, u8 addr[])
}
if (!bond->alb_info.primary_is_promisc) {
if (!dev_set_promiscuity(bond->curr_active_slave->dev, 1))
bond->alb_info.primary_is_promisc = 1;
dev_set_promiscuity(bond->curr_active_slave->dev, 1);
else
bond->alb_info.primary_is_promisc = 0;
}
bond->alb_info.rlb_promisc_timeout_counter = 0;

File diff suppressed because it is too large Load Diff

View File

@ -50,9 +50,9 @@ extern struct bond_parm_tbl bond_mode_tbl[];
extern struct bond_parm_tbl bond_lacp_tbl[];
extern struct bond_parm_tbl xmit_hashtype_tbl[];
extern struct bond_parm_tbl arp_validate_tbl[];
extern struct bond_parm_tbl fail_over_mac_tbl[];
static int expected_refcount = -1;
static struct class *netdev_class;
/*--------------------------- Data Structures -----------------------------*/
/* Bonding sysfs lock. Why can't we just use the subsystem lock?
@ -111,7 +111,6 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
char *ifname;
int rv, res = count;
struct bonding *bond;
struct bonding *nxt;
sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
ifname = command + 1;
@ -122,7 +121,7 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
if (command[0] == '+') {
printk(KERN_INFO DRV_NAME
": %s is being created...\n", ifname);
rv = bond_create(ifname, &bonding_defaults, &bond);
rv = bond_create(ifname, &bonding_defaults);
if (rv) {
printk(KERN_INFO DRV_NAME ": Bond creation failed.\n");
res = rv;
@ -134,7 +133,7 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
rtnl_lock();
down_write(&bonding_rwsem);
list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list)
list_for_each_entry(bond, &bond_dev_list, bond_list)
if (strnicmp(bond->dev->name, ifname, IFNAMSIZ) == 0) {
/* check the ref count on the bond's kobject.
* If it's > expected, then there's a file open,
@ -548,42 +547,37 @@ static ssize_t bonding_show_fail_over_mac(struct device *d, struct device_attrib
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.fail_over_mac) + 1;
return sprintf(buf, "%s %d\n",
fail_over_mac_tbl[bond->params.fail_over_mac].modename,
bond->params.fail_over_mac);
}
static ssize_t bonding_store_fail_over_mac(struct device *d, struct device_attribute *attr, const char *buf, size_t count)
{
int new_value;
int ret = count;
struct bonding *bond = to_bond(d);
if (bond->slave_cnt != 0) {
printk(KERN_ERR DRV_NAME
": %s: Can't alter fail_over_mac with slaves in bond.\n",
bond->dev->name);
ret = -EPERM;
goto out;
return -EPERM;
}
if (sscanf(buf, "%d", &new_value) != 1) {
new_value = bond_parse_parm(buf, fail_over_mac_tbl);
if (new_value < 0) {
printk(KERN_ERR DRV_NAME
": %s: no fail_over_mac value specified.\n",
bond->dev->name);
ret = -EINVAL;
goto out;
": %s: Ignoring invalid fail_over_mac value %s.\n",
bond->dev->name, buf);
return -EINVAL;
}
if ((new_value == 0) || (new_value == 1)) {
bond->params.fail_over_mac = new_value;
printk(KERN_INFO DRV_NAME ": %s: Setting fail_over_mac to %d.\n",
bond->dev->name, new_value);
} else {
printk(KERN_INFO DRV_NAME
": %s: Ignoring invalid fail_over_mac value %d.\n",
bond->dev->name, new_value);
}
out:
return ret;
printk(KERN_INFO DRV_NAME ": %s: Setting fail_over_mac to %s (%d).\n",
bond->dev->name, fail_over_mac_tbl[new_value].modename,
new_value);
return count;
}
static DEVICE_ATTR(fail_over_mac, S_IRUGO | S_IWUSR, bonding_show_fail_over_mac, bonding_store_fail_over_mac);
@ -951,6 +945,45 @@ static ssize_t bonding_store_lacp(struct device *d,
}
static DEVICE_ATTR(lacp_rate, S_IRUGO | S_IWUSR, bonding_show_lacp, bonding_store_lacp);
/*
* Show and set the number of grat ARP to send after a failover event.
*/
static ssize_t bonding_show_n_grat_arp(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.num_grat_arp);
}
static ssize_t bonding_store_n_grat_arp(struct device *d,
struct device_attribute *attr,
const char *buf, size_t count)
{
int new_value, ret = count;
struct bonding *bond = to_bond(d);
if (sscanf(buf, "%d", &new_value) != 1) {
printk(KERN_ERR DRV_NAME
": %s: no num_grat_arp value specified.\n",
bond->dev->name);
ret = -EINVAL;
goto out;
}
if (new_value < 0 || new_value > 255) {
printk(KERN_ERR DRV_NAME
": %s: Invalid num_grat_arp value %d not in range 0-255; rejected.\n",
bond->dev->name, new_value);
ret = -EINVAL;
goto out;
} else {
bond->params.num_grat_arp = new_value;
}
out:
return ret;
}
static DEVICE_ATTR(num_grat_arp, S_IRUGO | S_IWUSR, bonding_show_n_grat_arp, bonding_store_n_grat_arp);
/*
* Show and set the MII monitor interval. There are two tricky bits
* here. First, if MII monitoring is activated, then we must disable
@ -1388,6 +1421,7 @@ static struct attribute *per_bond_attrs[] = {
&dev_attr_updelay.attr,
&dev_attr_lacp_rate.attr,
&dev_attr_xmit_hash_policy.attr,
&dev_attr_num_grat_arp.attr,
&dev_attr_miimon.attr,
&dev_attr_primary.attr,
&dev_attr_use_carrier.attr,
@ -1412,19 +1446,9 @@ static struct attribute_group bonding_group = {
*/
int bond_create_sysfs(void)
{
int ret = 0;
struct bonding *firstbond;
int ret;
/* get the netdev class pointer */
firstbond = container_of(bond_dev_list.next, struct bonding, bond_list);
if (!firstbond)
return -ENODEV;
netdev_class = firstbond->dev->dev.class;
if (!netdev_class)
return -ENODEV;
ret = class_create_file(netdev_class, &class_attr_bonding_masters);
ret = netdev_class_create_file(&class_attr_bonding_masters);
/*
* Permit multiple loads of the module by ignoring failures to
* create the bonding_masters sysfs file. Bonding devices
@ -1443,10 +1467,6 @@ int bond_create_sysfs(void)
printk(KERN_ERR
"network device named %s already exists in sysfs",
class_attr_bonding_masters.attr.name);
else {
netdev_class = NULL;
return 0;
}
}
return ret;
@ -1458,8 +1478,7 @@ int bond_create_sysfs(void)
*/
void bond_destroy_sysfs(void)
{
if (netdev_class)
class_remove_file(netdev_class, &class_attr_bonding_masters);
netdev_class_remove_file(&class_attr_bonding_masters);
}
/*

View File

@ -22,8 +22,8 @@
#include "bond_3ad.h"
#include "bond_alb.h"
#define DRV_VERSION "3.2.5"
#define DRV_RELDATE "March 21, 2008"
#define DRV_VERSION "3.3.0"
#define DRV_RELDATE "June 10, 2008"
#define DRV_NAME "bonding"
#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
@ -125,6 +125,7 @@ struct bond_params {
int mode;
int xmit_policy;
int miimon;
int num_grat_arp;
int arp_interval;
int arp_validate;
int use_carrier;
@ -157,6 +158,7 @@ struct slave {
unsigned long jiffies;
unsigned long last_arp_rx;
s8 link; /* one of BOND_LINK_XXXX */
s8 new_link;
s8 state; /* one of BOND_STATE_XXXX */
u32 original_flags;
u32 original_mtu;
@ -168,6 +170,11 @@ struct slave {
struct tlb_slave_info tlb_info;
};
/*
* Link pseudo-state only used internally by monitors
*/
#define BOND_LINK_NOCHANGE -1
/*
* Here are the locking policies for the two bonding locks:
*
@ -241,6 +248,10 @@ static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)
return (struct bonding *)slave->dev->master->priv;
}
#define BOND_FOM_NONE 0
#define BOND_FOM_ACTIVE 1
#define BOND_FOM_FOLLOW 2
#define BOND_ARP_VALIDATE_NONE 0
#define BOND_ARP_VALIDATE_ACTIVE (1 << BOND_STATE_ACTIVE)
#define BOND_ARP_VALIDATE_BACKUP (1 << BOND_STATE_BACKUP)
@ -301,7 +312,7 @@ static inline void bond_unset_master_alb_flags(struct bonding *bond)
struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr);
int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev);
int bond_create(char *name, struct bond_params *params, struct bonding **newbond);
int bond_create(char *name, struct bond_params *params);
void bond_destroy(struct bonding *bond);
int bond_release_and_destroy(struct net_device *bond_dev, struct net_device *slave_dev);
int bond_create_sysfs(void);

View File

@ -1153,9 +1153,7 @@ static int __devinit init_one(struct pci_dev *pdev,
#ifdef CONFIG_NET_POLL_CONTROLLER
netdev->poll_controller = t1_netpoll;
#endif
#ifdef CONFIG_CHELSIO_T1_NAPI
netif_napi_add(netdev, &adapter->napi, t1_poll, 64);
#endif
SET_ETHTOOL_OPS(netdev, &t1_ethtool_ops);
}

View File

@ -1396,20 +1396,10 @@ static void sge_rx(struct sge *sge, struct freelQ *fl, unsigned int len)
if (unlikely(adapter->vlan_grp && p->vlan_valid)) {
st->vlan_xtract++;
#ifdef CONFIG_CHELSIO_T1_NAPI
vlan_hwaccel_receive_skb(skb, adapter->vlan_grp,
ntohs(p->vlan));
#else
vlan_hwaccel_rx(skb, adapter->vlan_grp,
ntohs(p->vlan));
#endif
} else {
#ifdef CONFIG_CHELSIO_T1_NAPI
} else
netif_receive_skb(skb);
#else
netif_rx(skb);
#endif
}
}
/*
@ -1568,7 +1558,6 @@ static inline int responses_pending(const struct adapter *adapter)
return (e->GenerationBit == Q->genbit);
}
#ifdef CONFIG_CHELSIO_T1_NAPI
/*
* A simpler version of process_responses() that handles only pure (i.e.,
* non data-carrying) responses. Such respones are too light-weight to justify
@ -1636,9 +1625,6 @@ int t1_poll(struct napi_struct *napi, int budget)
return work_done;
}
/*
* NAPI version of the main interrupt handler.
*/
irqreturn_t t1_interrupt(int irq, void *data)
{
struct adapter *adapter = data;
@ -1656,7 +1642,8 @@ irqreturn_t t1_interrupt(int irq, void *data)
else {
/* no data, no NAPI needed */
writel(sge->respQ.cidx, adapter->regs + A_SG_SLEEPING);
napi_enable(&adapter->napi); /* undo schedule_prep */
/* undo schedule_prep */
napi_enable(&adapter->napi);
}
}
return IRQ_HANDLED;
@ -1672,53 +1659,6 @@ irqreturn_t t1_interrupt(int irq, void *data)
return IRQ_RETVAL(handled != 0);
}
#else
/*
* Main interrupt handler, optimized assuming that we took a 'DATA'
* interrupt.
*
* 1. Clear the interrupt
* 2. Loop while we find valid descriptors and process them; accumulate
* information that can be processed after the loop
* 3. Tell the SGE at which index we stopped processing descriptors
* 4. Bookkeeping; free TX buffers, ring doorbell if there are any
* outstanding TX buffers waiting, replenish RX buffers, potentially
* reenable upper layers if they were turned off due to lack of TX
* resources which are available again.
* 5. If we took an interrupt, but no valid respQ descriptors was found we
* let the slow_intr_handler run and do error handling.
*/
irqreturn_t t1_interrupt(int irq, void *cookie)
{
int work_done;
struct adapter *adapter = cookie;
struct respQ *Q = &adapter->sge->respQ;
spin_lock(&adapter->async_lock);
writel(F_PL_INTR_SGE_DATA, adapter->regs + A_PL_CAUSE);
if (likely(responses_pending(adapter)))
work_done = process_responses(adapter, -1);
else
work_done = t1_slow_intr_handler(adapter);
/*
* The unconditional clearing of the PL_CAUSE above may have raced
* with DMA completion and the corresponding generation of a response
* to cause us to miss the resulting data interrupt. The next write
* is also unconditional to recover the missed interrupt and render
* this race harmless.
*/
writel(Q->cidx, adapter->regs + A_SG_SLEEPING);
if (!work_done)
adapter->sge->stats.unhandled_irqs++;
spin_unlock(&adapter->async_lock);
return IRQ_RETVAL(work_done != 0);
}
#endif
/*
* Enqueues the sk_buff onto the cmdQ[qid] and has hardware fetch it.
*

View File

@ -544,7 +544,7 @@ static int cpmac_poll(struct napi_struct *napi, int budget)
spin_unlock(&priv->rx_lock);
netif_rx_complete(priv->dev, napi);
netif_stop_queue(priv->dev);
netif_tx_stop_all_queues(priv->dev);
napi_disable(&priv->napi);
atomic_inc(&priv->reset_pending);
@ -569,11 +569,7 @@ static int cpmac_start_xmit(struct sk_buff *skb, struct net_device *dev)
len = max(skb->len, ETH_ZLEN);
queue = skb_get_queue_mapping(skb);
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
netif_stop_subqueue(dev, queue);
#else
netif_stop_queue(dev);
#endif
desc = &priv->desc_ring[queue];
if (unlikely(desc->dataflags & CPMAC_OWN)) {
@ -626,24 +622,14 @@ static void cpmac_end_xmit(struct net_device *dev, int queue)
dev_kfree_skb_irq(desc->skb);
desc->skb = NULL;
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
if (netif_subqueue_stopped(dev, queue))
netif_wake_subqueue(dev, queue);
#else
if (netif_queue_stopped(dev))
netif_wake_queue(dev);
#endif
} else {
if (netif_msg_tx_err(priv) && net_ratelimit())
printk(KERN_WARNING
"%s: end_xmit: spurious interrupt\n", dev->name);
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
if (netif_subqueue_stopped(dev, queue))
netif_wake_subqueue(dev, queue);
#else
if (netif_queue_stopped(dev))
netif_wake_queue(dev);
#endif
}
}
@ -764,9 +750,7 @@ static void cpmac_hw_error(struct work_struct *work)
barrier();
atomic_dec(&priv->reset_pending);
for (i = 0; i < CPMAC_QUEUES; i++)
netif_wake_subqueue(priv->dev, i);
netif_wake_queue(priv->dev);
netif_tx_wake_all_queues(priv->dev);
cpmac_write(priv->regs, CPMAC_MAC_INT_ENABLE, 3);
}
@ -795,7 +779,7 @@ static void cpmac_check_status(struct net_device *dev)
dev->name, tx_code, tx_channel, macstatus);
}
netif_stop_queue(dev);
netif_tx_stop_all_queues(dev);
cpmac_hw_stop(dev);
if (schedule_work(&priv->reset_work))
atomic_inc(&priv->reset_pending);
@ -856,9 +840,7 @@ static void cpmac_tx_timeout(struct net_device *dev)
barrier();
atomic_dec(&priv->reset_pending);
netif_wake_queue(priv->dev);
for (i = 0; i < CPMAC_QUEUES; i++)
netif_wake_subqueue(dev, i);
netif_tx_wake_all_queues(priv->dev);
}
static int cpmac_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
@ -949,7 +931,7 @@ static void cpmac_adjust_link(struct net_device *dev)
spin_lock(&priv->lock);
if (priv->phy->link) {
netif_start_queue(dev);
netif_tx_start_all_queues(dev);
if (priv->phy->duplex != priv->oldduplex) {
new_state = 1;
priv->oldduplex = priv->phy->duplex;
@ -963,10 +945,10 @@ static void cpmac_adjust_link(struct net_device *dev)
if (!priv->oldlink) {
new_state = 1;
priv->oldlink = 1;
netif_schedule(dev);
netif_tx_schedule_all(dev);
}
} else if (priv->oldlink) {
netif_stop_queue(dev);
netif_tx_stop_all_queues(dev);
new_state = 1;
priv->oldlink = 0;
priv->oldspeed = 0;
@ -1086,7 +1068,7 @@ static int cpmac_stop(struct net_device *dev)
struct cpmac_priv *priv = netdev_priv(dev);
struct resource *mem;
netif_stop_queue(dev);
netif_tx_stop_all_queues(dev);
cancel_work_sync(&priv->reset_work);
napi_disable(&priv->napi);
@ -1179,7 +1161,6 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
dev->set_multicast_list = cpmac_set_multicast_list;
dev->tx_timeout = cpmac_tx_timeout;
dev->ethtool_ops = &cpmac_ethtool_ops;
dev->features |= NETIF_F_MULTI_QUEUE;
netif_napi_add(dev, &priv->napi, cpmac_poll, 64);

View File

@ -42,6 +42,7 @@
#include <linux/cache.h>
#include <linux/mutex.h>
#include <linux/bitops.h>
#include <linux/inet_lro.h>
#include "t3cdev.h"
#include <asm/io.h>
@ -92,6 +93,7 @@ struct sge_fl { /* SGE per free-buffer list state */
unsigned int gen; /* free list generation */
struct fl_pg_chunk pg_chunk;/* page chunk cache */
unsigned int use_pages; /* whether FL uses pages or sk_buffs */
unsigned int order; /* order of page allocations */
struct rx_desc *desc; /* address of HW Rx descriptor ring */
struct rx_sw_desc *sdesc; /* address of SW Rx descriptor ring */
dma_addr_t phys_addr; /* physical address of HW ring start */
@ -116,12 +118,15 @@ struct sge_rspq { /* state for an SGE response queue */
unsigned int polling; /* is the queue serviced through NAPI? */
unsigned int holdoff_tmr; /* interrupt holdoff timer in 100ns */
unsigned int next_holdoff; /* holdoff time for next interrupt */
unsigned int rx_recycle_buf; /* whether recycling occurred
within current sop-eop */
struct rsp_desc *desc; /* address of HW response ring */
dma_addr_t phys_addr; /* physical address of the ring */
unsigned int cntxt_id; /* SGE context id for the response q */
spinlock_t lock; /* guards response processing */
struct sk_buff *rx_head; /* offload packet receive queue head */
struct sk_buff *rx_tail; /* offload packet receive queue tail */
struct sk_buff *pg_skb; /* used to build frag list in napi handler */
unsigned long offload_pkts;
unsigned long offload_bundles;
@ -169,16 +174,29 @@ enum { /* per port SGE statistics */
SGE_PSTAT_TX_CSUM, /* # of TX checksum offloads */
SGE_PSTAT_VLANEX, /* # of VLAN tag extractions */
SGE_PSTAT_VLANINS, /* # of VLAN tag insertions */
SGE_PSTAT_LRO_AGGR, /* # of page chunks added to LRO sessions */
SGE_PSTAT_LRO_FLUSHED, /* # of flushed LRO sessions */
SGE_PSTAT_LRO_NO_DESC, /* # of overflown LRO sessions */
SGE_PSTAT_MAX /* must be last */
};
#define T3_MAX_LRO_SES 8
#define T3_MAX_LRO_MAX_PKTS 64
struct sge_qset { /* an SGE queue set */
struct adapter *adap;
struct napi_struct napi;
struct sge_rspq rspq;
struct sge_fl fl[SGE_RXQ_PER_SET];
struct sge_txq txq[SGE_TXQ_PER_SET];
struct net_lro_mgr lro_mgr;
struct net_lro_desc lro_desc[T3_MAX_LRO_SES];
struct skb_frag_struct *lro_frag_tbl;
int lro_nfrags;
int lro_enabled;
int lro_frag_len;
void *lro_va;
struct net_device *netdev;
unsigned long txq_stopped; /* which Tx queues are stopped */
struct timer_list tx_reclaim_timer; /* reclaims TX buffers */

View File

@ -351,6 +351,7 @@ struct tp_params {
struct qset_params { /* SGE queue set parameters */
unsigned int polling; /* polling/interrupt service for rspq */
unsigned int lro; /* large receive offload */
unsigned int coalesce_usecs; /* irq coalescing timer */
unsigned int rspq_size; /* # of entries in response queue */
unsigned int fl_size; /* # of entries in regular free list */

View File

@ -111,10 +111,7 @@ struct ulp_iscsi_info {
unsigned int llimit;
unsigned int ulimit;
unsigned int tagmask;
unsigned int pgsz3;
unsigned int pgsz2;
unsigned int pgsz1;
unsigned int pgsz0;
u8 pgsz_factor[4];
unsigned int max_rxsz;
unsigned int max_txsz;
struct pci_dev *pdev;

View File

@ -90,6 +90,7 @@ struct ch_qset_params {
int32_t fl_size[2];
int32_t intr_lat;
int32_t polling;
int32_t lro;
int32_t cong_thres;
};

View File

@ -1212,6 +1212,9 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
"VLANinsertions ",
"TxCsumOffload ",
"RxCsumGood ",
"LroAggregated ",
"LroFlushed ",
"LroNoDesc ",
"RxDrops ",
"CheckTXEnToggled ",
@ -1340,6 +1343,9 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
*data++ = collect_sge_port_stats(adapter, pi, SGE_PSTAT_VLANINS);
*data++ = collect_sge_port_stats(adapter, pi, SGE_PSTAT_TX_CSUM);
*data++ = collect_sge_port_stats(adapter, pi, SGE_PSTAT_RX_CSUM_GOOD);
*data++ = collect_sge_port_stats(adapter, pi, SGE_PSTAT_LRO_AGGR);
*data++ = collect_sge_port_stats(adapter, pi, SGE_PSTAT_LRO_FLUSHED);
*data++ = collect_sge_port_stats(adapter, pi, SGE_PSTAT_LRO_NO_DESC);
*data++ = s->rx_cong_drops;
*data++ = s->num_toggled;
@ -1558,6 +1564,13 @@ static int set_rx_csum(struct net_device *dev, u32 data)
struct port_info *p = netdev_priv(dev);
p->rx_csum_offload = data;
if (!data) {
struct adapter *adap = p->adapter;
int i;
for (i = p->first_qset; i < p->first_qset + p->nqsets; i++)
adap->sge.qs[i].lro_enabled = 0;
}
return 0;
}
@ -1830,6 +1843,11 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
}
}
}
if (t.lro >= 0) {
struct sge_qset *qs = &adapter->sge.qs[t.qset_idx];
q->lro = t.lro;
qs->lro_enabled = t.lro;
}
break;
}
case CHELSIO_GET_QSET_PARAMS:{
@ -1849,6 +1867,7 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
t.fl_size[0] = q->fl_size;
t.fl_size[1] = q->jumbo_size;
t.polling = q->polling;
t.lro = q->lro;
t.intr_lat = q->coalesce_usecs;
t.cong_thres = q->cong_thres;

View File

@ -207,6 +207,17 @@ static int cxgb_ulp_iscsi_ctl(struct adapter *adapter, unsigned int req,
break;
case ULP_ISCSI_SET_PARAMS:
t3_write_reg(adapter, A_ULPRX_ISCSI_TAGMASK, uiip->tagmask);
/* set MaxRxData and MaxCoalesceSize to 16224 */
t3_write_reg(adapter, A_TP_PARA_REG2, 0x3f603f60);
/* program the ddp page sizes */
{
int i;
unsigned int val = 0;
for (i = 0; i < 4; i++)
val |= (uiip->pgsz_factor[i] & 0xF) << (8 * i);
if (val)
t3_write_reg(adapter, A_ULPRX_ISCSI_PSZ, val);
}
break;
default:
ret = -EOPNOTSUPP;
@ -1255,6 +1266,25 @@ static inline void unregister_tdev(struct t3cdev *tdev)
mutex_unlock(&cxgb3_db_lock);
}
static inline int adap2type(struct adapter *adapter)
{
int type = 0;
switch (adapter->params.rev) {
case T3_REV_A:
type = T3A;
break;
case T3_REV_B:
case T3_REV_B2:
type = T3B;
break;
case T3_REV_C:
type = T3C;
break;
}
return type;
}
void __devinit cxgb3_adapter_ofld(struct adapter *adapter)
{
struct t3cdev *tdev = &adapter->tdev;
@ -1264,7 +1294,7 @@ void __devinit cxgb3_adapter_ofld(struct adapter *adapter)
cxgb3_set_dummy_ops(tdev);
tdev->send = t3_offload_tx;
tdev->ctl = cxgb_offload_ctl;
tdev->type = adapter->params.rev == 0 ? T3A : T3B;
tdev->type = adap2type(adapter);
register_tdev(tdev);
}

View File

@ -337,7 +337,7 @@ struct l2t_entry *t3_l2t_get(struct t3cdev *cdev, struct neighbour *neigh,
atomic_set(&e->refcnt, 1);
neigh_replace(e, neigh);
if (neigh->dev->priv_flags & IFF_802_1Q_VLAN)
e->vlan = vlan_dev_info(neigh->dev)->vlan_id;
e->vlan = vlan_dev_vlan_id(neigh->dev);
else
e->vlan = VLAN_NONE;
spin_unlock(&e->lock);

View File

@ -1517,16 +1517,18 @@
#define A_ULPRX_ISCSI_TAGMASK 0x514
#define S_HPZ0 0
#define M_HPZ0 0xf
#define V_HPZ0(x) ((x) << S_HPZ0)
#define G_HPZ0(x) (((x) >> S_HPZ0) & M_HPZ0)
#define A_ULPRX_ISCSI_PSZ 0x518
#define A_ULPRX_TDDP_LLIMIT 0x51c
#define A_ULPRX_TDDP_ULIMIT 0x520
#define A_ULPRX_TDDP_PSZ 0x528
#define S_HPZ0 0
#define M_HPZ0 0xf
#define V_HPZ0(x) ((x) << S_HPZ0)
#define G_HPZ0(x) (((x) >> S_HPZ0) & M_HPZ0)
#define A_ULPRX_STAG_LLIMIT 0x52c
#define A_ULPRX_STAG_ULIMIT 0x530

View File

@ -55,6 +55,9 @@
* directly.
*/
#define FL0_PG_CHUNK_SIZE 2048
#define FL0_PG_ORDER 0
#define FL1_PG_CHUNK_SIZE (PAGE_SIZE > 8192 ? 16384 : 8192)
#define FL1_PG_ORDER (PAGE_SIZE > 8192 ? 0 : 1)
#define SGE_RX_DROP_THRES 16
@ -359,7 +362,7 @@ static void free_rx_bufs(struct pci_dev *pdev, struct sge_fl *q)
}
if (q->pg_chunk.page) {
__free_page(q->pg_chunk.page);
__free_pages(q->pg_chunk.page, q->order);
q->pg_chunk.page = NULL;
}
}
@ -376,13 +379,16 @@ static void free_rx_bufs(struct pci_dev *pdev, struct sge_fl *q)
* Add a buffer of the given length to the supplied HW and SW Rx
* descriptors.
*/
static inline void add_one_rx_buf(void *va, unsigned int len,
static inline int add_one_rx_buf(void *va, unsigned int len,
struct rx_desc *d, struct rx_sw_desc *sd,
unsigned int gen, struct pci_dev *pdev)
{
dma_addr_t mapping;
mapping = pci_map_single(pdev, va, len, PCI_DMA_FROMDEVICE);
if (unlikely(pci_dma_mapping_error(mapping)))
return -ENOMEM;
pci_unmap_addr_set(sd, dma_addr, mapping);
d->addr_lo = cpu_to_be32(mapping);
@ -390,12 +396,14 @@ static inline void add_one_rx_buf(void *va, unsigned int len,
wmb();
d->len_gen = cpu_to_be32(V_FLD_GEN1(gen));
d->gen2 = cpu_to_be32(V_FLD_GEN2(gen));
return 0;
}
static int alloc_pg_chunk(struct sge_fl *q, struct rx_sw_desc *sd, gfp_t gfp)
static int alloc_pg_chunk(struct sge_fl *q, struct rx_sw_desc *sd, gfp_t gfp,
unsigned int order)
{
if (!q->pg_chunk.page) {
q->pg_chunk.page = alloc_page(gfp);
q->pg_chunk.page = alloc_pages(gfp, order);
if (unlikely(!q->pg_chunk.page))
return -ENOMEM;
q->pg_chunk.va = page_address(q->pg_chunk.page);
@ -404,7 +412,7 @@ static int alloc_pg_chunk(struct sge_fl *q, struct rx_sw_desc *sd, gfp_t gfp)
sd->pg_chunk = q->pg_chunk;
q->pg_chunk.offset += q->buf_size;
if (q->pg_chunk.offset == PAGE_SIZE)
if (q->pg_chunk.offset == (PAGE_SIZE << order))
q->pg_chunk.page = NULL;
else {
q->pg_chunk.va += q->buf_size;
@ -424,15 +432,18 @@ static int alloc_pg_chunk(struct sge_fl *q, struct rx_sw_desc *sd, gfp_t gfp)
* allocated with the supplied gfp flags. The caller must assure that
* @n does not exceed the queue's capacity.
*/
static void refill_fl(struct adapter *adap, struct sge_fl *q, int n, gfp_t gfp)
static int refill_fl(struct adapter *adap, struct sge_fl *q, int n, gfp_t gfp)
{
void *buf_start;
struct rx_sw_desc *sd = &q->sdesc[q->pidx];
struct rx_desc *d = &q->desc[q->pidx];
unsigned int count = 0;
while (n--) {
int err;
if (q->use_pages) {
if (unlikely(alloc_pg_chunk(q, sd, gfp))) {
if (unlikely(alloc_pg_chunk(q, sd, gfp, q->order))) {
nomem: q->alloc_failed++;
break;
}
@ -447,8 +458,16 @@ nomem: q->alloc_failed++;
buf_start = skb->data;
}
add_one_rx_buf(buf_start, q->buf_size, d, sd, q->gen,
err = add_one_rx_buf(buf_start, q->buf_size, d, sd, q->gen,
adap->pdev);
if (unlikely(err)) {
if (!q->use_pages) {
kfree_skb(sd->skb);
sd->skb = NULL;
}
break;
}
d++;
sd++;
if (++q->pidx == q->size) {
@ -458,14 +477,19 @@ nomem: q->alloc_failed++;
d = q->desc;
}
q->credits++;
count++;
}
wmb();
if (likely(count))
t3_write_reg(adap, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id));
return count;
}
static inline void __refill_fl(struct adapter *adap, struct sge_fl *fl)
{
refill_fl(adap, fl, min(16U, fl->size - fl->credits), GFP_ATOMIC);
refill_fl(adap, fl, min(16U, fl->size - fl->credits),
GFP_ATOMIC | __GFP_COMP);
}
/**
@ -560,6 +584,8 @@ static void t3_reset_qset(struct sge_qset *q)
memset(q->txq, 0, sizeof(struct sge_txq) * SGE_TXQ_PER_SET);
q->txq_stopped = 0;
memset(&q->tx_reclaim_timer, 0, sizeof(q->tx_reclaim_timer));
kfree(q->lro_frag_tbl);
q->lro_nfrags = q->lro_frag_len = 0;
}
@ -740,19 +766,22 @@ static struct sk_buff *get_packet(struct adapter *adap, struct sge_fl *fl,
* that are page chunks rather than sk_buffs.
*/
static struct sk_buff *get_packet_pg(struct adapter *adap, struct sge_fl *fl,
unsigned int len, unsigned int drop_thres)
struct sge_rspq *q, unsigned int len,
unsigned int drop_thres)
{
struct sk_buff *skb = NULL;
struct sk_buff *newskb, *skb;
struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
if (len <= SGE_RX_COPY_THRES) {
skb = alloc_skb(len, GFP_ATOMIC);
if (likely(skb != NULL)) {
__skb_put(skb, len);
newskb = skb = q->pg_skb;
if (!skb && (len <= SGE_RX_COPY_THRES)) {
newskb = alloc_skb(len, GFP_ATOMIC);
if (likely(newskb != NULL)) {
__skb_put(newskb, len);
pci_dma_sync_single_for_cpu(adap->pdev,
pci_unmap_addr(sd, dma_addr), len,
PCI_DMA_FROMDEVICE);
memcpy(skb->data, sd->pg_chunk.va, len);
memcpy(newskb->data, sd->pg_chunk.va, len);
pci_dma_sync_single_for_device(adap->pdev,
pci_unmap_addr(sd, dma_addr), len,
PCI_DMA_FROMDEVICE);
@ -761,14 +790,16 @@ static struct sk_buff *get_packet_pg(struct adapter *adap, struct sge_fl *fl,
recycle:
fl->credits--;
recycle_rx_buf(adap, fl, fl->cidx);
return skb;
q->rx_recycle_buf++;
return newskb;
}
if (unlikely(fl->credits <= drop_thres))
if (unlikely(q->rx_recycle_buf || (!skb && fl->credits <= drop_thres)))
goto recycle;
skb = alloc_skb(SGE_RX_PULL_LEN, GFP_ATOMIC);
if (unlikely(!skb)) {
if (!skb)
newskb = alloc_skb(SGE_RX_PULL_LEN, GFP_ATOMIC);
if (unlikely(!newskb)) {
if (!drop_thres)
return NULL;
goto recycle;
@ -776,21 +807,29 @@ static struct sk_buff *get_packet_pg(struct adapter *adap, struct sge_fl *fl,
pci_unmap_single(adap->pdev, pci_unmap_addr(sd, dma_addr),
fl->buf_size, PCI_DMA_FROMDEVICE);
__skb_put(skb, SGE_RX_PULL_LEN);
memcpy(skb->data, sd->pg_chunk.va, SGE_RX_PULL_LEN);
skb_fill_page_desc(skb, 0, sd->pg_chunk.page,
if (!skb) {
__skb_put(newskb, SGE_RX_PULL_LEN);
memcpy(newskb->data, sd->pg_chunk.va, SGE_RX_PULL_LEN);
skb_fill_page_desc(newskb, 0, sd->pg_chunk.page,
sd->pg_chunk.offset + SGE_RX_PULL_LEN,
len - SGE_RX_PULL_LEN);
skb->len = len;
skb->data_len = len - SGE_RX_PULL_LEN;
skb->truesize += skb->data_len;
newskb->len = len;
newskb->data_len = len - SGE_RX_PULL_LEN;
} else {
skb_fill_page_desc(newskb, skb_shinfo(newskb)->nr_frags,
sd->pg_chunk.page,
sd->pg_chunk.offset, len);
newskb->len += len;
newskb->data_len += len;
}
newskb->truesize += newskb->data_len;
fl->credits--;
/*
* We do not refill FLs here, we let the caller do it to overlap a
* prefetch.
*/
return skb;
return newskb;
}
/**
@ -1831,9 +1870,10 @@ static void restart_tx(struct sge_qset *qs)
* if it was immediate data in a response.
*/
static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
struct sk_buff *skb, int pad)
struct sk_buff *skb, int pad, int lro)
{
struct cpl_rx_pkt *p = (struct cpl_rx_pkt *)(skb->data + pad);
struct sge_qset *qs = rspq_to_qset(rq);
struct port_info *pi;
skb_pull(skb, sizeof(*p) + pad);
@ -1850,18 +1890,202 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
if (unlikely(p->vlan_valid)) {
struct vlan_group *grp = pi->vlan_grp;
rspq_to_qset(rq)->port_stats[SGE_PSTAT_VLANEX]++;
qs->port_stats[SGE_PSTAT_VLANEX]++;
if (likely(grp))
if (lro)
lro_vlan_hwaccel_receive_skb(&qs->lro_mgr, skb,
grp,
ntohs(p->vlan),
p);
else
__vlan_hwaccel_rx(skb, grp, ntohs(p->vlan),
rq->polling);
else
dev_kfree_skb_any(skb);
} else if (rq->polling)
netif_receive_skb(skb);
} else if (rq->polling) {
if (lro)
lro_receive_skb(&qs->lro_mgr, skb, p);
else
netif_receive_skb(skb);
} else
netif_rx(skb);
}
static inline int is_eth_tcp(u32 rss)
{
return G_HASHTYPE(ntohl(rss)) == RSS_HASH_4_TUPLE;
}
/**
* lro_frame_ok - check if an ingress packet is eligible for LRO
* @p: the CPL header of the packet
*
* Returns true if a received packet is eligible for LRO.
* The following conditions must be true:
* - packet is TCP/IP Ethernet II (checked elsewhere)
* - not an IP fragment
* - no IP options
* - TCP/IP checksums are correct
* - the packet is for this host
*/
static inline int lro_frame_ok(const struct cpl_rx_pkt *p)
{
const struct ethhdr *eh = (struct ethhdr *)(p + 1);
const struct iphdr *ih = (struct iphdr *)(eh + 1);
return (*((u8 *)p + 1) & 0x90) == 0x10 && p->csum == htons(0xffff) &&
eh->h_proto == htons(ETH_P_IP) && ih->ihl == (sizeof(*ih) >> 2);
}
#define TCP_FLAG_MASK (TCP_FLAG_CWR | TCP_FLAG_ECE | TCP_FLAG_URG |\
TCP_FLAG_ACK | TCP_FLAG_PSH | TCP_FLAG_RST |\
TCP_FLAG_SYN | TCP_FLAG_FIN)
#define TSTAMP_WORD ((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |\
(TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)
/**
* lro_segment_ok - check if a TCP segment is eligible for LRO
* @tcph: the TCP header of the packet
*
* Returns true if a TCP packet is eligible for LRO. This requires that
* the packet have only the ACK flag set and no TCP options besides
* time stamps.
*/
static inline int lro_segment_ok(const struct tcphdr *tcph)
{
int optlen;
if (unlikely((tcp_flag_word(tcph) & TCP_FLAG_MASK) != TCP_FLAG_ACK))
return 0;
optlen = (tcph->doff << 2) - sizeof(*tcph);
if (optlen) {
const u32 *opt = (const u32 *)(tcph + 1);
if (optlen != TCPOLEN_TSTAMP_ALIGNED ||
*opt != htonl(TSTAMP_WORD) || !opt[2])
return 0;
}
return 1;
}
static int t3_get_lro_header(void **eh, void **iph, void **tcph,
u64 *hdr_flags, void *priv)
{
const struct cpl_rx_pkt *cpl = priv;
if (!lro_frame_ok(cpl))
return -1;
*eh = (struct ethhdr *)(cpl + 1);
*iph = (struct iphdr *)((struct ethhdr *)*eh + 1);
*tcph = (struct tcphdr *)((struct iphdr *)*iph + 1);
if (!lro_segment_ok(*tcph))
return -1;
*hdr_flags = LRO_IPV4 | LRO_TCP;
return 0;
}
static int t3_get_skb_header(struct sk_buff *skb,
void **iph, void **tcph, u64 *hdr_flags,
void *priv)
{
void *eh;
return t3_get_lro_header(&eh, iph, tcph, hdr_flags, priv);
}
static int t3_get_frag_header(struct skb_frag_struct *frag, void **eh,
void **iph, void **tcph, u64 *hdr_flags,
void *priv)
{
return t3_get_lro_header(eh, iph, tcph, hdr_flags, priv);
}
/**
* lro_add_page - add a page chunk to an LRO session
* @adap: the adapter
* @qs: the associated queue set
* @fl: the free list containing the page chunk to add
* @len: packet length
* @complete: Indicates the last fragment of a frame
*
* Add a received packet contained in a page chunk to an existing LRO
* session.
*/
static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
struct sge_fl *fl, int len, int complete)
{
struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
struct cpl_rx_pkt *cpl;
struct skb_frag_struct *rx_frag = qs->lro_frag_tbl;
int nr_frags = qs->lro_nfrags, frag_len = qs->lro_frag_len;
int offset = 0;
if (!nr_frags) {
offset = 2 + sizeof(struct cpl_rx_pkt);
qs->lro_va = cpl = sd->pg_chunk.va + 2;
}
fl->credits--;
len -= offset;
pci_unmap_single(adap->pdev, pci_unmap_addr(sd, dma_addr),
fl->buf_size, PCI_DMA_FROMDEVICE);
rx_frag += nr_frags;
rx_frag->page = sd->pg_chunk.page;
rx_frag->page_offset = sd->pg_chunk.offset + offset;
rx_frag->size = len;
frag_len += len;
qs->lro_nfrags++;
qs->lro_frag_len = frag_len;
if (!complete)
return;
qs->lro_nfrags = qs->lro_frag_len = 0;
cpl = qs->lro_va;
if (unlikely(cpl->vlan_valid)) {
struct net_device *dev = qs->netdev;
struct port_info *pi = netdev_priv(dev);
struct vlan_group *grp = pi->vlan_grp;
if (likely(grp != NULL)) {
lro_vlan_hwaccel_receive_frags(&qs->lro_mgr,
qs->lro_frag_tbl,
frag_len, frag_len,
grp, ntohs(cpl->vlan),
cpl, 0);
return;
}
}
lro_receive_frags(&qs->lro_mgr, qs->lro_frag_tbl,
frag_len, frag_len, cpl, 0);
}
/**
* init_lro_mgr - initialize a LRO manager object
* @lro_mgr: the LRO manager object
*/
static void init_lro_mgr(struct sge_qset *qs, struct net_lro_mgr *lro_mgr)
{
lro_mgr->dev = qs->netdev;
lro_mgr->features = LRO_F_NAPI;
lro_mgr->ip_summed = CHECKSUM_UNNECESSARY;
lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY;
lro_mgr->max_desc = T3_MAX_LRO_SES;
lro_mgr->lro_arr = qs->lro_desc;
lro_mgr->get_frag_header = t3_get_frag_header;
lro_mgr->get_skb_header = t3_get_skb_header;
lro_mgr->max_aggr = T3_MAX_LRO_MAX_PKTS;
if (lro_mgr->max_aggr > MAX_SKB_FRAGS)
lro_mgr->max_aggr = MAX_SKB_FRAGS;
}
/**
* handle_rsp_cntrl_info - handles control information in a response
* @qs: the queue set corresponding to the response
@ -1947,6 +2171,12 @@ static inline int is_new_response(const struct rsp_desc *r,
return (r->intr_gen & F_RSPD_GEN2) == q->gen;
}
static inline void clear_rspq_bufstate(struct sge_rspq * const q)
{
q->pg_skb = NULL;
q->rx_recycle_buf = 0;
}
#define RSPD_GTS_MASK (F_RSPD_TXQ0_GTS | F_RSPD_TXQ1_GTS)
#define RSPD_CTRL_MASK (RSPD_GTS_MASK | \
V_RSPD_TXQ0_CR(M_RSPD_TXQ0_CR) | \
@ -1984,10 +2214,11 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
q->next_holdoff = q->holdoff_tmr;
while (likely(budget_left && is_new_response(r, q))) {
int eth, ethpad = 2;
int packet_complete, eth, ethpad = 2, lro = qs->lro_enabled;
struct sk_buff *skb = NULL;
u32 len, flags = ntohl(r->flags);
__be32 rss_hi = *(const __be32 *)r, rss_lo = r->rss_hdr.rss_hash_val;
__be32 rss_hi = *(const __be32 *)r,
rss_lo = r->rss_hdr.rss_hash_val;
eth = r->rss_hdr.opcode == CPL_RX_PKT;
@ -2015,6 +2246,9 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
} else if ((len = ntohl(r->len_cq)) != 0) {
struct sge_fl *fl;
if (eth)
lro = qs->lro_enabled && is_eth_tcp(rss_hi);
fl = (len & F_RSPD_FLQ) ? &qs->fl[1] : &qs->fl[0];
if (fl->use_pages) {
void *addr = fl->sdesc[fl->cidx].pg_chunk.va;
@ -2024,9 +2258,18 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
prefetch(addr + L1_CACHE_BYTES);
#endif
__refill_fl(adap, fl);
if (lro > 0) {
lro_add_page(adap, qs, fl,
G_RSPD_LEN(len),
flags & F_RSPD_EOP);
goto next_fl;
}
skb = get_packet_pg(adap, fl, G_RSPD_LEN(len),
eth ? SGE_RX_DROP_THRES : 0);
skb = get_packet_pg(adap, fl, q,
G_RSPD_LEN(len),
eth ?
SGE_RX_DROP_THRES : 0);
q->pg_skb = skb;
} else
skb = get_packet(adap, fl, G_RSPD_LEN(len),
eth ? SGE_RX_DROP_THRES : 0);
@ -2036,7 +2279,7 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
q->rx_drops++;
} else if (unlikely(r->rss_hdr.opcode == CPL_TRACE_PKT))
__skb_pull(skb, 2);
next_fl:
if (++fl->cidx == fl->size)
fl->cidx = 0;
} else
@ -2060,9 +2303,13 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
q->credits = 0;
}
if (likely(skb != NULL)) {
packet_complete = flags &
(F_RSPD_EOP | F_RSPD_IMM_DATA_VALID |
F_RSPD_ASYNC_NOTIF);
if (skb != NULL && packet_complete) {
if (eth)
rx_eth(adap, q, skb, ethpad);
rx_eth(adap, q, skb, ethpad, lro);
else {
q->offload_pkts++;
/* Preserve the RSS info in csum & priority */
@ -2072,11 +2319,19 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
offload_skbs,
ngathered);
}
if (flags & F_RSPD_EOP)
clear_rspq_bufstate(q);
}
--budget_left;
}
deliver_partial_bundle(&adap->tdev, q, offload_skbs, ngathered);
lro_flush_all(&qs->lro_mgr);
qs->port_stats[SGE_PSTAT_LRO_AGGR] = qs->lro_mgr.stats.aggregated;
qs->port_stats[SGE_PSTAT_LRO_FLUSHED] = qs->lro_mgr.stats.flushed;
qs->port_stats[SGE_PSTAT_LRO_NO_DESC] = qs->lro_mgr.stats.no_desc;
if (sleeping)
check_ring_db(adap, qs, sleeping);
@ -2618,8 +2873,9 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
int irq_vec_idx, const struct qset_params *p,
int ntxq, struct net_device *dev)
{
int i, ret = -ENOMEM;
int i, avail, ret = -ENOMEM;
struct sge_qset *q = &adapter->sge.qs[id];
struct net_lro_mgr *lro_mgr = &q->lro_mgr;
init_qset_cntxt(q, id);
init_timer(&q->tx_reclaim_timer);
@ -2687,11 +2943,23 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
#else
q->fl[0].buf_size = SGE_RX_SM_BUF_SIZE + sizeof(struct cpl_rx_data);
#endif
q->fl[0].use_pages = FL0_PG_CHUNK_SIZE > 0;
#if FL1_PG_CHUNK_SIZE > 0
q->fl[1].buf_size = FL1_PG_CHUNK_SIZE;
#else
q->fl[1].buf_size = is_offload(adapter) ?
(16 * 1024) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) :
MAX_FRAME_SIZE + 2 + sizeof(struct cpl_rx_pkt);
#endif
q->fl[0].use_pages = FL0_PG_CHUNK_SIZE > 0;
q->fl[1].use_pages = FL1_PG_CHUNK_SIZE > 0;
q->fl[0].order = FL0_PG_ORDER;
q->fl[1].order = FL1_PG_ORDER;
q->lro_frag_tbl = kcalloc(MAX_FRAME_SIZE / FL1_PG_CHUNK_SIZE + 1,
sizeof(struct skb_frag_struct),
GFP_KERNEL);
q->lro_nfrags = q->lro_frag_len = 0;
spin_lock_irq(&adapter->sge.reg_lock);
/* FL threshold comparison uses < */
@ -2742,8 +3010,23 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
q->netdev = dev;
t3_update_qset_coalesce(q, p);
refill_fl(adapter, &q->fl[0], q->fl[0].size, GFP_KERNEL);
refill_fl(adapter, &q->fl[1], q->fl[1].size, GFP_KERNEL);
init_lro_mgr(q, lro_mgr);
avail = refill_fl(adapter, &q->fl[0], q->fl[0].size,
GFP_KERNEL | __GFP_COMP);
if (!avail) {
CH_ALERT(adapter, "free list queue 0 initialization failed\n");
goto err;
}
if (avail < q->fl[0].size)
CH_WARN(adapter, "free list queue 0 enabled with %d credits\n",
avail);
avail = refill_fl(adapter, &q->fl[1], q->fl[1].size,
GFP_KERNEL | __GFP_COMP);
if (avail < q->fl[1].size)
CH_WARN(adapter, "free list queue 1 enabled with %d credits\n",
avail);
refill_rspq(adapter, &q->rspq, q->rspq.size - 1);
t3_write_reg(adapter, A_SG_GTS, V_RSPQ(q->rspq.cntxt_id) |

View File

@ -174,6 +174,13 @@ enum { /* TCP congestion control algorithms */
CONG_ALG_HIGHSPEED
};
enum { /* RSS hash type */
RSS_HASH_NONE = 0,
RSS_HASH_2_TUPLE = 1,
RSS_HASH_4_TUPLE = 2,
RSS_HASH_TCPV6 = 3
};
union opcode_tid {
__be32 opcode_tid;
__u8 opcode;
@ -184,6 +191,13 @@ union opcode_tid {
#define G_OPCODE(x) (((x) >> S_OPCODE) & 0xFF)
#define G_TID(x) ((x) & 0xFFFFFF)
#define S_QNUM 0
#define G_QNUM(x) (((x) >> S_QNUM) & 0xFFFF)
#define S_HASHTYPE 22
#define M_HASHTYPE 0x3
#define G_HASHTYPE(x) (((x) >> S_HASHTYPE) & M_HASHTYPE)
/* tid is assumed to be 24-bits */
#define MK_OPCODE_TID(opcode, tid) (V_OPCODE(opcode) | (tid))
@ -768,6 +782,12 @@ struct tx_data_wr {
__be32 param;
};
/* tx_data_wr.flags fields */
#define S_TX_ACK_PAGES 21
#define M_TX_ACK_PAGES 0x7
#define V_TX_ACK_PAGES(x) ((x) << S_TX_ACK_PAGES)
#define G_TX_ACK_PAGES(x) (((x) >> S_TX_ACK_PAGES) & M_TX_ACK_PAGES)
/* tx_data_wr.param fields */
#define S_TX_PORT 0
#define M_TX_PORT 0x7
@ -1441,4 +1461,35 @@ struct cpl_rdma_terminate {
#define M_TERM_TID 0xFFFFF
#define V_TERM_TID(x) ((x) << S_TERM_TID)
#define G_TERM_TID(x) (((x) >> S_TERM_TID) & M_TERM_TID)
/* ULP_TX opcodes */
enum { ULP_MEM_READ = 2, ULP_MEM_WRITE = 3, ULP_TXPKT = 4 };
#define S_ULPTX_CMD 28
#define M_ULPTX_CMD 0xF
#define V_ULPTX_CMD(x) ((x) << S_ULPTX_CMD)
#define S_ULPTX_NFLITS 0
#define M_ULPTX_NFLITS 0xFF
#define V_ULPTX_NFLITS(x) ((x) << S_ULPTX_NFLITS)
struct ulp_mem_io {
WR_HDR;
__be32 cmd_lock_addr;
__be32 len;
};
/* ulp_mem_io.cmd_lock_addr fields */
#define S_ULP_MEMIO_ADDR 0
#define M_ULP_MEMIO_ADDR 0x7FFFFFF
#define V_ULP_MEMIO_ADDR(x) ((x) << S_ULP_MEMIO_ADDR)
#define S_ULP_MEMIO_LOCK 27
#define V_ULP_MEMIO_LOCK(x) ((x) << S_ULP_MEMIO_LOCK)
#define F_ULP_MEMIO_LOCK V_ULP_MEMIO_LOCK(1U)
/* ulp_mem_io.len fields */
#define S_ULP_MEMIO_DATA_LEN 28
#define M_ULP_MEMIO_DATA_LEN 0xF
#define V_ULP_MEMIO_DATA_LEN(x) ((x) << S_ULP_MEMIO_DATA_LEN)
#endif /* T3_CPL_H */

View File

@ -45,7 +45,8 @@ struct cxgb3_client;
enum t3ctype {
T3A = 0,
T3B
T3B,
T3C,
};
struct t3cdev {
@ -63,6 +64,7 @@ struct t3cdev {
void *l3opt; /* optional layer 3 data */
void *l4opt; /* optional layer 4 data */
void *ulp; /* ulp stuff */
void *ulp_iscsi; /* ulp iscsi */
};
#endif /* _T3CDEV_H_ */

View File

@ -773,8 +773,6 @@ static irqreturn_t lance_interrupt(int irq, void *dev_id)
return IRQ_HANDLED;
}
struct net_device *last_dev = 0;
static int lance_open(struct net_device *dev)
{
volatile u16 *ib = (volatile u16 *)dev->mem_start;
@ -782,8 +780,6 @@ static int lance_open(struct net_device *dev)
volatile struct lance_regs *ll = lp->ll;
int status = 0;
last_dev = dev;
/* Stop the Lance */
writereg(&ll->rap, LE_CSR0);
writereg(&ll->rdp, LE_C0_STOP);

View File

@ -499,7 +499,7 @@ rio_timer (unsigned long data)
entry = np->old_rx % RX_RING_SIZE;
/* Dropped packets don't need to re-allocate */
if (np->rx_skbuff[entry] == NULL) {
skb = dev_alloc_skb (np->rx_buf_sz);
skb = netdev_alloc_skb (dev, np->rx_buf_sz);
if (skb == NULL) {
np->rx_ring[entry].fraginfo = 0;
printk (KERN_INFO
@ -570,7 +570,7 @@ alloc_list (struct net_device *dev)
/* Allocate the rx buffers */
for (i = 0; i < RX_RING_SIZE; i++) {
/* Allocated fixed size of skbuff */
struct sk_buff *skb = dev_alloc_skb (np->rx_buf_sz);
struct sk_buff *skb = netdev_alloc_skb (dev, np->rx_buf_sz);
np->rx_skbuff[i] = skb;
if (skb == NULL) {
printk (KERN_ERR
@ -867,7 +867,7 @@ receive_packet (struct net_device *dev)
PCI_DMA_FROMDEVICE);
skb_put (skb = np->rx_skbuff[entry], pkt_len);
np->rx_skbuff[entry] = NULL;
} else if ((skb = dev_alloc_skb (pkt_len + 2)) != NULL) {
} else if ((skb = netdev_alloc_skb(dev, pkt_len + 2))) {
pci_dma_sync_single_for_cpu(np->pdev,
desc_to_dma(desc),
np->rx_buf_sz,
@ -904,7 +904,7 @@ receive_packet (struct net_device *dev)
struct sk_buff *skb;
/* Dropped packets don't need to re-allocate */
if (np->rx_skbuff[entry] == NULL) {
skb = dev_alloc_skb (np->rx_buf_sz);
skb = netdev_alloc_skb(dev, np->rx_buf_sz);
if (skb == NULL) {
np->rx_ring[entry].fraginfo = 0;
printk (KERN_INFO
@ -1753,7 +1753,7 @@ rio_close (struct net_device *dev)
/* Stop Tx and Rx logics */
writel (TxDisable | RxDisable | StatsDisable, ioaddr + MACCtrl);
synchronize_irq (dev->irq);
free_irq (dev->irq, dev);
del_timer_sync (&np->timer);

File diff suppressed because it is too large Load Diff

View File

@ -45,6 +45,9 @@
#define DM9000_CHIPR 0x2C
#define DM9000_SMCR 0x2F
#define CHIPR_DM9000A 0x19
#define CHIPR_DM9000B 0x1B
#define DM9000_MRCMDX 0xF0
#define DM9000_MRCMD 0xF2
#define DM9000_MRRL 0xF4
@ -131,5 +134,13 @@
#define DM9000_PKT_RDY 0x01 /* Packet ready to receive */
#define DM9000_PKT_MAX 1536 /* Received packet max size */
/* DM9000A / DM9000B definitions */
#define IMR_LNKCHNG (1<<5)
#define IMR_UNDERRUN (1<<4)
#define ISR_LNKCHNG (1<<5)
#define ISR_UNDERRUN (1<<4)
#endif /* _DM9000X_H_ */

View File

@ -47,12 +47,6 @@ static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation
* Macro expands to...
* {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
*/
#ifdef CONFIG_E1000E_ENABLED
#define PCIE(x)
#else
#define PCIE(x) x,
#endif
static struct pci_device_id e1000_pci_tbl[] = {
INTEL_E1000_ETHERNET_DEVICE(0x1000),
INTEL_E1000_ETHERNET_DEVICE(0x1001),
@ -79,14 +73,6 @@ static struct pci_device_id e1000_pci_tbl[] = {
INTEL_E1000_ETHERNET_DEVICE(0x1026),
INTEL_E1000_ETHERNET_DEVICE(0x1027),
INTEL_E1000_ETHERNET_DEVICE(0x1028),
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1049))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x104A))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x104B))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x104C))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x104D))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x105E))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x105F))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1060))
INTEL_E1000_ETHERNET_DEVICE(0x1075),
INTEL_E1000_ETHERNET_DEVICE(0x1076),
INTEL_E1000_ETHERNET_DEVICE(0x1077),
@ -95,28 +81,9 @@ PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1060))
INTEL_E1000_ETHERNET_DEVICE(0x107A),
INTEL_E1000_ETHERNET_DEVICE(0x107B),
INTEL_E1000_ETHERNET_DEVICE(0x107C),
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x107D))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x107E))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x107F))
INTEL_E1000_ETHERNET_DEVICE(0x108A),
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x108B))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x108C))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1096))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1098))
INTEL_E1000_ETHERNET_DEVICE(0x1099),
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x109A))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10A4))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10A5))
INTEL_E1000_ETHERNET_DEVICE(0x10B5),
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10B9))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10BA))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10BB))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10BC))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10C4))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10C5))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10D5))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10D9))
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10DA))
/* required last entry */
{0,}
};
@ -1505,6 +1472,8 @@ e1000_open(struct net_device *netdev)
e1000_irq_enable(adapter);
netif_start_queue(netdev);
/* fire a link status change interrupt to start the watchdog */
E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_LSC);
@ -2510,11 +2479,16 @@ e1000_set_rx_mode(struct net_device *netdev)
if (netdev->flags & IFF_PROMISC) {
rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
} else if (netdev->flags & IFF_ALLMULTI) {
rctl &= ~E1000_RCTL_VFE;
} else {
if (netdev->flags & IFF_ALLMULTI) {
rctl |= E1000_RCTL_MPE;
} else {
rctl &= ~E1000_RCTL_MPE;
}
if (adapter->hw.mac_type != e1000_ich8lan)
rctl |= E1000_RCTL_VFE;
}
uc_ptr = NULL;
if (netdev->uc_count > rar_entries - 1) {
@ -4310,8 +4284,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
if (unlikely(adapter->vlgrp &&
(status & E1000_RXD_STAT_VP))) {
vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->special) &
E1000_RXD_SPC_VLAN_MASK);
le16_to_cpu(rx_desc->special));
} else {
netif_receive_skb(skb);
}
@ -4319,8 +4292,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
if (unlikely(adapter->vlgrp &&
(status & E1000_RXD_STAT_VP))) {
vlan_hwaccel_rx(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->special) &
E1000_RXD_SPC_VLAN_MASK);
le16_to_cpu(rx_desc->special));
} else {
netif_rx(skb);
}
@ -4497,16 +4469,14 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
#ifdef CONFIG_E1000_NAPI
if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->wb.middle.vlan) &
E1000_RXD_SPC_VLAN_MASK);
le16_to_cpu(rx_desc->wb.middle.vlan));
} else {
netif_receive_skb(skb);
}
#else /* CONFIG_E1000_NAPI */
if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
vlan_hwaccel_rx(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->wb.middle.vlan) &
E1000_RXD_SPC_VLAN_MASK);
le16_to_cpu(rx_desc->wb.middle.vlan));
} else {
netif_rx(skb);
}
@ -4999,7 +4969,6 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
if (adapter->hw.mac_type != e1000_ich8lan) {
/* enable VLAN receive filtering */
rctl = E1000_READ_REG(&adapter->hw, RCTL);
rctl |= E1000_RCTL_VFE;
rctl &= ~E1000_RCTL_CFIEN;
E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
e1000_update_mng_vlan(adapter);
@ -5011,10 +4980,6 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
if (adapter->hw.mac_type != e1000_ich8lan) {
/* disable VLAN filtering */
rctl = E1000_READ_REG(&adapter->hw, RCTL);
rctl &= ~E1000_RCTL_VFE;
E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
if (adapter->mng_vlan_id !=
(u16)E1000_MNG_VLAN_NONE) {
e1000_vlan_rx_kill_vid(netdev,
@ -5284,7 +5249,6 @@ e1000_netpoll(struct net_device *netdev)
disable_irq(adapter->pdev->irq);
e1000_intr(adapter->pdev->irq, netdev);
e1000_clean_tx_irq(adapter, adapter->tx_ring);
#ifndef CONFIG_E1000_NAPI
adapter->clean_rx(adapter, adapter->rx_ring);
#endif

View File

@ -283,6 +283,10 @@ struct e1000_adapter {
unsigned long led_status;
unsigned int flags;
/* for ioport free */
int bars;
int need_ioport;
};
struct e1000_info {

View File

@ -98,8 +98,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter,
if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
le16_to_cpu(vlan) &
E1000_RXD_SPC_VLAN_MASK);
le16_to_cpu(vlan));
else
netif_receive_skb(skb);
@ -1793,7 +1792,6 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
/* enable VLAN receive filtering */
rctl = er32(RCTL);
rctl |= E1000_RCTL_VFE;
rctl &= ~E1000_RCTL_CFIEN;
ew32(RCTL, rctl);
e1000_update_mng_vlan(adapter);
@ -1805,10 +1803,6 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
ew32(CTRL, ctrl);
if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
/* disable VLAN filtering */
rctl = er32(RCTL);
rctl &= ~E1000_RCTL_VFE;
ew32(RCTL, rctl);
if (adapter->mng_vlan_id !=
(u16)E1000_MNG_VLAN_NONE) {
e1000_vlan_rx_kill_vid(netdev,
@ -2231,12 +2225,17 @@ static void e1000_set_multi(struct net_device *netdev)
if (netdev->flags & IFF_PROMISC) {
rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
} else if (netdev->flags & IFF_ALLMULTI) {
rctl &= ~E1000_RCTL_VFE;
} else {
if (netdev->flags & IFF_ALLMULTI) {
rctl |= E1000_RCTL_MPE;
rctl &= ~E1000_RCTL_UPE;
} else {
rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
}
if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
rctl |= E1000_RCTL_VFE;
}
ew32(RCTL, rctl);
@ -2514,7 +2513,7 @@ void e1000e_down(struct e1000_adapter *adapter)
ew32(RCTL, rctl & ~E1000_RCTL_EN);
/* flush and sleep below */
netif_stop_queue(netdev);
netif_tx_stop_all_queues(netdev);
/* disable transmits in the hardware */
tctl = er32(TCTL);
@ -2664,6 +2663,8 @@ static int e1000_open(struct net_device *netdev)
e1000_irq_enable(adapter);
netif_tx_start_all_queues(netdev);
/* fire a link status change interrupt to start the watchdog */
ew32(ICS, E1000_ICS_LSC);
@ -3119,7 +3120,7 @@ static void e1000_watchdog_task(struct work_struct *work)
ew32(TCTL, tctl);
netif_carrier_on(netdev);
netif_wake_queue(netdev);
netif_tx_wake_all_queues(netdev);
if (!test_bit(__E1000_DOWN, &adapter->state))
mod_timer(&adapter->phy_info_timer,
@ -3131,7 +3132,7 @@ static void e1000_watchdog_task(struct work_struct *work)
adapter->link_duplex = 0;
ndev_info(netdev, "Link is Down\n");
netif_carrier_off(netdev);
netif_stop_queue(netdev);
netif_tx_stop_all_queues(netdev);
if (!test_bit(__E1000_DOWN, &adapter->state))
mod_timer(&adapter->phy_info_timer,
round_jiffies(jiffies + 2 * HZ));
@ -4003,7 +4004,11 @@ static int e1000_resume(struct pci_dev *pdev)
pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
e1000e_disable_l1aspm(pdev);
if (adapter->need_ioport)
err = pci_enable_device(pdev);
else
err = pci_enable_device_mem(pdev);
if (err) {
dev_err(&pdev->dev,
"Cannot enable PCI device from suspend\n");
@ -4104,9 +4109,14 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw;
int err;
e1000e_disable_l1aspm(pdev);
if (pci_enable_device(pdev)) {
if (adapter->need_ioport)
err = pci_enable_device(pdev);
else
err = pci_enable_device_mem(pdev);
if (err) {
dev_err(&pdev->dev,
"Cannot re-enable PCI device after reset.\n");
return PCI_ERS_RESULT_DISCONNECT;
@ -4184,6 +4194,21 @@ static void e1000_print_device_info(struct e1000_adapter *adapter)
(pba_num >> 8), (pba_num & 0xff));
}
/**
* e1000e_is_need_ioport - determine if an adapter needs ioport resources or not
* @pdev: PCI device information struct
*
* Returns true if an adapters needs ioport resources
**/
static int e1000e_is_need_ioport(struct pci_dev *pdev)
{
switch (pdev->device) {
/* Currently there are no adapters that need ioport resources */
default:
return false;
}
}
/**
* e1000_probe - Device Initialization Routine
* @pdev: PCI device information struct
@ -4209,9 +4234,19 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
int i, err, pci_using_dac;
u16 eeprom_data = 0;
u16 eeprom_apme_mask = E1000_EEPROM_APME;
int bars, need_ioport;
e1000e_disable_l1aspm(pdev);
/* do not allocate ioport bars when not needed */
need_ioport = e1000e_is_need_ioport(pdev);
if (need_ioport) {
bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
err = pci_enable_device(pdev);
} else {
bars = pci_select_bars(pdev, IORESOURCE_MEM);
err = pci_enable_device_mem(pdev);
}
if (err)
return err;
@ -4234,7 +4269,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
}
}
err = pci_request_regions(pdev, e1000e_driver_name);
err = pci_request_selected_regions(pdev, bars, e1000e_driver_name);
if (err)
goto err_pci_reg;
@ -4259,6 +4294,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
adapter->hw.adapter = adapter;
adapter->hw.mac.type = ei->mac;
adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
adapter->bars = bars;
adapter->need_ioport = need_ioport;
mmio_start = pci_resource_start(pdev, 0);
mmio_len = pci_resource_len(pdev, 0);
@ -4344,6 +4381,11 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
netdev->features |= NETIF_F_TSO;
netdev->features |= NETIF_F_TSO6;
netdev->vlan_features |= NETIF_F_TSO;
netdev->vlan_features |= NETIF_F_TSO6;
netdev->vlan_features |= NETIF_F_HW_CSUM;
netdev->vlan_features |= NETIF_F_SG;
if (pci_using_dac)
netdev->features |= NETIF_F_HIGHDMA;
@ -4464,7 +4506,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
/* tell the stack to leave us alone until e1000_open() is called */
netif_carrier_off(netdev);
netif_stop_queue(netdev);
netif_tx_stop_all_queues(netdev);
strcpy(netdev->name, "eth%d");
err = register_netdev(netdev);
@ -4493,7 +4535,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
err_ioremap:
free_netdev(netdev);
err_alloc_etherdev:
pci_release_regions(pdev);
pci_release_selected_regions(pdev, bars);
err_pci_reg:
err_dma:
pci_disable_device(pdev);
@ -4541,7 +4583,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
iounmap(adapter->hw.hw_addr);
if (adapter->hw.flash_address)
iounmap(adapter->hw.flash_address);
pci_release_regions(pdev);
pci_release_selected_regions(pdev, adapter->bars);
free_netdev(netdev);

View File

@ -90,6 +90,7 @@ static int full_duplex[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
#include <asm/processor.h> /* Processor type for cache alignment. */
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/byteorder.h>
/* These identify the driver base version and may not be removed. */
static char version[] =
@ -861,40 +862,20 @@ static int netdev_open(struct net_device *dev)
Wait the specified 50 PCI cycles after a reset by initializing
Tx and Rx queues and the address filter list.
FIXME (Ueimor): optimistic for alpha + posted writes ? */
#if defined(__powerpc__) || defined(__sparc__)
// 89/9/1 modify,
// np->bcrvalue=0x04 | 0x0x38; /* big-endian, 256 burst length */
np->bcrvalue = 0x04 | 0x10; /* big-endian, tx 8 burst length */
np->crvalue = 0xe00; /* rx 128 burst length */
#elif defined(__alpha__) || defined(__x86_64__)
// 89/9/1 modify,
// np->bcrvalue=0x38; /* little-endian, 256 burst length */
np->bcrvalue = 0x10; /* little-endian, 8 burst length */
np->crvalue = 0xe00; /* rx 128 burst length */
#elif defined(__i386__)
#if defined(MODULE)
// 89/9/1 modify,
// np->bcrvalue=0x38; /* little-endian, 256 burst length */
np->bcrvalue = 0x10; /* little-endian, 8 burst length */
np->crvalue = 0xe00; /* rx 128 burst length */
#else
/* When not a module we can work around broken '486 PCI boards. */
#define x86 boot_cpu_data.x86
// 89/9/1 modify,
// np->bcrvalue=(x86 <= 4 ? 0x10 : 0x38);
np->bcrvalue = 0x10;
np->crvalue = (x86 <= 4 ? 0xa00 : 0xe00);
if (x86 <= 4)
printk(KERN_INFO "%s: This is a 386/486 PCI system, setting burst "
"length to %x.\n", dev->name, (x86 <= 4 ? 0x10 : 0x38));
#ifdef __BIG_ENDIAN
np->bcrvalue |= 0x04; /* big-endian */
#endif
#else
// 89/9/1 modify,
// np->bcrvalue=0x38;
np->bcrvalue = 0x10;
np->crvalue = 0xe00; /* rx 128 burst length */
#warning Processor architecture undefined!
#if defined(__i386__) && !defined(MODULE)
if (boot_cpu_data.x86 <= 4)
np->crvalue = 0xa00;
else
#endif
np->crvalue = 0xe00; /* rx 128 burst length */
// 89/12/29 add,
// 90/1/16 modify,
// np->imrvalue=FBE|TUNF|CNTOVF|RBU|TI|RI;

View File

@ -197,7 +197,7 @@ static void mpc52xx_fec_adjust_link(struct net_device *dev)
if (priv->link == PHY_DOWN) {
new_state = 1;
priv->link = phydev->link;
netif_schedule(dev);
netif_tx_schedule_all(dev);
netif_carrier_on(dev);
netif_start_queue(dev);
}

Some files were not shown because too many files have changed in this diff Show More