Netdev List
 help / color / mirror / Atom feed
* Re: tcp timestamp issues with google servers
From: Vijay Subramanian @ 2012-05-22 16:38 UTC (permalink / raw)
  To: Miklos Szeredi; +Cc: Eric Dumazet, netdev, linux-kernel
In-Reply-To: <87mx50rz34.fsf@tucsk.pomaz.szeredi.hu>

> Okay.  Is there a way to find out whether there is a middlebox or not?
>

Miklos,
Maybe tcptraceroute[1] can help you figure this out.

Hope this helps.
Vijay

[1] http://michael.toren.net/code/tcptraceroute/

^ permalink raw reply

* Re: TCPBacklogDrops during aggressive bursts of traffic
From: Eric Dumazet @ 2012-05-22 16:45 UTC (permalink / raw)
  To: Kieran Mansley; +Cc: Ben Hutchings, netdev
In-Reply-To: <1337704382.1698.53.camel@kjm-desktop.uk.level5networks.com>

On Tue, 2012-05-22 at 17:32 +0100, Kieran Mansley wrote:
> On Tue, 2012-05-22 at 18:12 +0200, Eric Dumazet wrote:
> > 
> > __tcp_select_window() ( more precisely tcp_space() takes into account
> > memory used in receive/ofo queue, but not frames in backlog queue)
> > 
> > So if you send bursts, it might explain TCP stack continues to
> > advertise
> > a too big window, instead of anticipate the problem.
> > 
> > Please try the following patch :
> > 
> > diff --git a/include/net/tcp.h b/include/net/tcp.h
> > index e79aa48..82382cb 100644
> > --- a/include/net/tcp.h
> > +++ b/include/net/tcp.h
> > @@ -1042,8 +1042,9 @@ static inline int tcp_win_from_space(int space)
> >  /* Note: caller must be prepared to deal with negative returns */ 
> >  static inline int tcp_space(const struct sock *sk)
> >  {
> > -       return tcp_win_from_space(sk->sk_rcvbuf -
> > -                                 atomic_read(&sk->sk_rmem_alloc));
> > +       int used = atomic_read(&sk->sk_rmem_alloc) +
> > sk->sk_backlog.len;
> > +
> > +       return tcp_win_from_space(sk->sk_rcvbuf - used);
> >  } 
> >  
> >  static inline int tcp_full_space(const struct sock *sk)
> 
> 
> I can give this a try (not sure when - probably later this week) but I
> think this it is back to front.  The patch above will reduce the
> advertised window by sk_backlog.len, but at the time that the window was
> advertised that allowed the dropped packets to be sent the backlog was
> empty.  It is later, when the kernel is waking the application and takes
> the socket lock that the backlog starts to be used and the drop happens.
> But reducing the window advertised at this point is futile - the packets
> that will be dropped are already in flight.
> 

Not really. If we receive these packets while backlog is empty, then the
sender violates TCP rules.

We advertise tcp window directly from memory we are allowed to consume.

(On the premise sender behaves correctly, not sending bytes in small
packets)


> The problem exists because the backlog has a tighter limit on it than
> the receive window does; I think the backlog should be able to accept
> sk_rcvbuf bytes in addition to what is already in the receive buffer (or
> up to the advertised receive window if that's smaller).  At the moment
> it will only accept sk_rcvbuf bytes including what is already in the
> receive buffer.  The logic being that in this case we're using the
> backlog because it's in the process of emptying the receive buffer into
> the application, and so the receive buffer will very soon be empty, and
> so we will very soon be able to accept sk_rcvbuf bytes.  This is evident
> from the packet capture as the kernel stack is quite happy to accept the
> significant quantity of data that arrives as part of the same burst
> immediately after it has dropped a couple of packets.
> 

This is not evident from the capture, you are mistaken.

tcpdump captures packets before tcp stack, it doesnt say if they are :

1) queued in receive of ofo queue
2) queued in socket backlog
3) dropped because we hit socket rcvbuf limit

If socket lock is hold by the user, packets are queued to backlog, or
dropped.

Then, when socket lock is about to be released, we process the backlog.

^ permalink raw reply

* Re: tcp timestamp issues with google servers
From: Eric Dumazet @ 2012-05-22 16:48 UTC (permalink / raw)
  To: Vijay Subramanian; +Cc: Miklos Szeredi, netdev, linux-kernel
In-Reply-To: <CAGK4HS9cGnOcoLAL1pggWvMG1B40rWyqc3BHsddUvnii4EvTcQ@mail.gmail.com>

On Tue, 2012-05-22 at 09:38 -0700, Vijay Subramanian wrote:
> > Okay.  Is there a way to find out whether there is a middlebox or not?
> >
> 
> Miklos,
> Maybe tcptraceroute[1] can help you figure this out.
> 
> Hope this helps.
> Vijay
> 
> [1] http://michael.toren.net/code/tcptraceroute/


The transparent proxy can intercept TCP connections to port 80/443, and
let ICMP being NATed by the box.

So its better to check of the delay between SYN and SYNACK is roughly
independent of the HTTP server.

If you have very large range of delays, you can conclude its not a
transparent proxy.

^ permalink raw reply

* Re: tcp timestamp issues with google servers
From: Rick Jones @ 2012-05-22 16:58 UTC (permalink / raw)
  To: Miklos Szeredi; +Cc: Eric Dumazet, netdev, linux-kernel
In-Reply-To: <87mx50rz34.fsf@tucsk.pomaz.szeredi.hu>

On 05/22/2012 08:54 AM, Miklos Szeredi wrote:
> Eric Dumazet<eric.dumazet@gmail.com>  writes:
>
>> On Tue, 2012-05-22 at 17:25 +0200, Miklos Szeredi wrote:
>>
>>> So it appears.  The IP address is certainly registered to Google.
>>
>> Good, but you could have a middlebox doing transparent proxying.
>>
>> The SYNACK could be send by this box.
>
> Okay.  Is there a way to find out whether there is a middlebox or not?

The source IP in the trace was a 192.168 IP - is it possible/desirable 
to reproduce the problem without the device doing NAT in the path?

What is your "public" IP address?  Given that, and the IP address to 
which you are connecting, it should be possible to validate the RTT you 
are seeing.  If the geographic/topological location of the destination 
Google IP address is far enough from your public source IP that would 
show whether  the RTT you are seeing is even physically possible and so 
could suggest there is a middlebox (other than your NAT), though it 
couldn't show there was not a middlebox.


rick jones

^ permalink raw reply

* Re: Strange latency spikes/TX network stalls on Sun Fire X4150(x86) and e1000e
From: Denys Fedoryshchenko @ 2012-05-22 17:11 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: Tom Herbert, netdev
In-Reply-To: <1337589620.3361.23.camel@edumazet-glaptop>

On 2012-05-21 11:40, Eric Dumazet wrote:
> On Mon, 2012-05-21 at 10:30 +0200, Eric Dumazet wrote:
>> On Mon, 2012-05-21 at 11:06 +0300, Denys Fedoryshchenko wrote:
>>
>> > Not sure it is a lot of time, after all it is 2 x core quad 
>> machine,
>> > should be enough fast for pings.
>> > It will cause stalls on small packets even more seems.
>> >
>> > Tested latest git, net-next, still the same, stalls.
>> > hardware latency detector are silent by the way, so there is no
>> > significant SMI.
>> >
>>
>> I am trying to reproduce your problem here with no luck yet.
>>
>> I wonder of softirq are correctly scheduled on your machine
>>
>
> By the way, fact you have 8 cpus is irrelevant.
>
> Only one cpu has queued the NET_TX_SOFTIRQ softirq (serviced by
> net_tx_action())
>
>
> If this cpu is busy servicing other stuff, no other cpu will help.
>
By the way, if BQL limit is going lower than MTU, is it considered as a 
bug?
If yes, i can try to upload 3.4 to some servers and add condition to 
WARN_ON if limit < 1500.

---
Denys Fedoryshchenko, Network Engineer, Virtual ISP S.A.L.

^ permalink raw reply

* Using jiffies for tcp_time_stamp?
From: Srećko Jurić-Kavelj @ 2012-05-22 17:21 UTC (permalink / raw)
  To: netdev
In-Reply-To: <CAACrLC39Xdm3vTKUsjz43ZPyEq_vHxR-_Uf56SjSm+kUqxOqZg@mail.gmail.com>

Hi,

Recently I tackled round trip time estimation of a TCP connection.
After implementing a straight-forward approach (time stamping sending
and receiving of data using clock_gettime) I found this article:
http://linuxgazette.net/136/pfeiffer.html (using getsockopt() to get
struct tcp_info). The tcp_info structure conveniently has a rtt field.

Using the first method I get 1-3 ms RTT, and by using the second I get
>=10 ms RTT.

By looking at the code it's clear that the time stamping is done with
jiffies, and my kernel has CONFIG_HZ=100.

I understand that this is for performance reasons (and the RTT
smoothing filter is implemented with bit shifting operations), but
would using a more precise time stamp have significant impact on
performance? Since RTT is used to compute RTO, wouldn't there be any
benefits of having more accurate estimate of this value?

Best regards,

Srećko Jurić-Kavelj, dipl.ing. (Ms.E.E)
Research and Teaching Assistant at University of Zagreb
(Faculty of Electrical Engineering and Computing, Department of
Control and Computer Engineering)

E-mail: srecko.juric-kavelj@fer.hr
URL: http://www.fer.hr/srecko.juric-kavelj

Sanctus Hieronymus: "Parce mihi, Domine, quia dalmata sum!"

^ permalink raw reply

* Re: [RFC] net: skb_head_is_locked() should use skb_header_cloned()
From: Alexander Duyck @ 2012-05-22 17:23 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: David Miller, netdev
In-Reply-To: <1337666034.3361.50.camel@edumazet-glaptop>

On 05/21/2012 10:53 PM, Eric Dumazet wrote:
> Hi David and Alexander
>
> There is no hurry since net-next is closed, but I hit the following
> problem :
>
> When IPv6 conntracking is enabled, code from
> net/ipv6/netfilter/nf_conntrack_reasm.c does a cloning of all skbs to
> build a shadow.
>
> Then we run : (skb here is the head of the 'shadow skb' )
>
> void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb,
>                         struct net_device *in, struct net_device *out,
>                         int (*okfn)(struct sk_buff *))
> {
>         struct sk_buff *s, *s2;
>
>         for (s = NFCT_FRAG6_CB(skb)->orig; s;) {
>                 nf_conntrack_put_reasm(s->nfct_reasm);
>                 nf_conntrack_get_reasm(skb);
>                 s->nfct_reasm = skb;
>
>                 s2 = s->next;
>                 s->next = NULL;
>
>                 NF_HOOK_THRESH(NFPROTO_IPV6, hooknum, s, in, out, okfn,
>                                NF_IP6_PRI_CONNTRACK_DEFRAG + 1);
>                 s = s2;
>         }
>         nf_conntrack_put_reasm(skb);
> }
>
> So when all original skbs are fed to real IPv6 reassembly code, their
> clones are still alive and we hit the condition in skb_try_coalesce() :
>
> if (skb_head_is_locked(from))
> 	return false;
>
> I was wondering if skb_head_is_locked() should be changed to :
>
> if (!skb->head_frag || skb_header_cloned(skb))
> 	return false;
>
> Then we could add skb_header_release() calls on the clones of course in
> net/ipv6/netfilter/nf_conntrack_reasm.c 
>
> Not-Yet-Signed-off-by: Eric Dumazet <edumazet@google.com>
> ---
>  include/linux/skbuff.h |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index 0e50171..6509ee1 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -2587,7 +2587,7 @@ static inline bool skb_is_recycleable(const struct sk_buff *skb, int skb_size)
>   */
>  static inline bool skb_head_is_locked(const struct sk_buff *skb)
>  {
> -	return !skb->head_frag || skb_cloned(skb);
> +	return !skb->head_frag || skb_header_cloned(skb);
>  }
>  #endif	/* __KERNEL__ */
>  #endif	/* _LINUX_SKBUFF_H */
>
>
The problem is that the whole reason for checking skb_cloned was to
avoid reference count issues between the skb and the page.  We should
only be using the reference count in one or the other and not both. 
Otherwise we open up the possibility of a data corruption if someone
misinterprets a skb_shinfo()->dataref == 1, or skb_header_cloned
returning false when we have the buffer shared between both the sk_buff
and a page.

The skb_header_cloned check only verifies that the portion between
skb->head and skb->data is currently being unused by the other clones. 
It doesn't guarantee that skb->head is not being used by any other
sk_buff.  As such we run the same risk of messing up the dataref
counting if we were to use it.

The way I see it there are 2 solutions.  The first would be to just
split the reference counts and make it so that calls like skb_cloned
have to check both dataref and page count if skb->head_frag is set.  The
second option would be to look at something like pskb_expand_head where
we could generate a new head fragment and then memcpy the data over to
that frag in order to "unlock" the head.

Thanks,

Alex

^ permalink raw reply

* Re: Strange latency spikes/TX network stalls on Sun Fire X4150(x86) and e1000e
From: Eric Dumazet @ 2012-05-22 17:24 UTC (permalink / raw)
  To: Denys Fedoryshchenko; +Cc: Tom Herbert, netdev
In-Reply-To: <eb8cdd693530010d6736baede0cfebd8@visp.net.lb>

On Tue, 2012-05-22 at 20:11 +0300, Denys Fedoryshchenko wrote:

> By the way, if BQL limit is going lower than MTU, is it considered as a 
> bug?
> If yes, i can try to upload 3.4 to some servers and add condition to 
> WARN_ON if limit < 1500.

There is no problem with BQL limit going lower than the max packet size.

(With TSO it can be 64K)

Remember BQL allows one packet to be sent to device, regardless of its
size.

Next packet might be blocked/stay in Qdisc

If your workload is mostly idle, but sending bursts of 3 packets, then
only one is immediately sent.

Next packets shall wait the TX completion of first packet.

^ permalink raw reply

* net/wanrouter?
From: Joe Perches @ 2012-05-22 17:33 UTC (permalink / raw)
  To: netdev

Does anyone still use this?

^ permalink raw reply

* Re: tcp timestamp issues with google servers
From: Vijay Subramanian @ 2012-05-22 17:38 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: Miklos Szeredi, netdev, linux-kernel
In-Reply-To: <1337705285.3361.229.camel@edumazet-glaptop>

>> Maybe tcptraceroute[1] can help you figure this out.
>>
>> [1] http://michael.toren.net/code/tcptraceroute/
>
>
> The transparent proxy can intercept TCP connections to port 80/443, and
> let ICMP being NATed by the box.

Just to be clear..tcptraceroute uses TCP SYN packets to trace the
route instead of using ICMP packets used by vanilla traceroute
precisely because
of the issue you raised.
The idea is that if the connection is getting terminated at a
middlebox, the trace will end there. Otherwise, the trace route will
end
at destination (google in this case). This avoids the problems of ICMP
and TCP flows being treated differently by the middlebox.
Is this approach workable?

Thanks,
Vijay

^ permalink raw reply

* Re: tcp timestamp issues with google servers
From: Eric Dumazet @ 2012-05-22 17:53 UTC (permalink / raw)
  To: Vijay Subramanian; +Cc: Miklos Szeredi, netdev, linux-kernel
In-Reply-To: <CAGK4HS8b2GSub02ShhofCrYQ1XnOT7Rrjm3KcOhCFFkUF1QqBA@mail.gmail.com>

On Tue, 2012-05-22 at 10:38 -0700, Vijay Subramanian wrote:
> >> Maybe tcptraceroute[1] can help you figure this out.
> >>
> >> [1] http://michael.toren.net/code/tcptraceroute/
> >
> >
> > The transparent proxy can intercept TCP connections to port 80/443, and
> > let ICMP being NATed by the box.
> 
> Just to be clear..tcptraceroute uses TCP SYN packets to trace the
> route instead of using ICMP packets used by vanilla traceroute
> precisely because
> of the issue you raised.
> The idea is that if the connection is getting terminated at a
> middlebox, the trace will end there. Otherwise, the trace route will
> end
> at destination (google in this case). This avoids the problems of ICMP
> and TCP flows being treated differently by the middlebox.
> Is this approach workable?

Yes probably, thanks for detailed description (I indeed thought it was
traceroute)

^ permalink raw reply

* [PATCH 0/5] netdev/phy: 10G PHY support.
From: David Daney @ 2012-05-22 17:59 UTC (permalink / raw)
  To: devicetree-discuss, Grant Likely, Rob Herring, David S. Miller,
	netdev
  Cc: linux-kernel, linux-mips, Andy Fleming, David Daney

From: David Daney <david.daney@cavium.com>

The existing PHY driver infrastructure supports IEEE 802.3 Clause 22
PHYs used with 10/100/1000MB Ethernet.  For 10G Ethernet, many PHYs
use 802.3 Clause 45.  These patches attempt to add core support for
this as well as drivers for several different 10G PHY devices.

This is reworked from patches I send about 9 months ago:

http://marc.info/?l=linux-netdev&m=131844282403852

Several of the patches have device tree bindings in them, so the
device tree people get to enjoy them too.


David Daney (5):
  netdev/phy: Handle IEEE802.3 clause 45 Ethernet PHYs
  netdev/phy/of: Handle IEEE802.3 clause 45 Ethernet PHYs in
    of_mdiobus_register()
  netdev/phy/of: Add more methods for binding PHY devices to drivers.
  netdev/phy: Add driver for Broadcom BCM87XX 10G Ethernet PHYs
  netdev/phy: Add driver for Cortina cs4321 quad 10G PHY.

 .../devicetree/bindings/net/broadcom-bcm87xx.txt   |   29 +
 .../devicetree/bindings/net/cortina-cs4321.txt     |   27 +
 Documentation/devicetree/bindings/net/phy.txt      |   12 +-
 drivers/net/phy/Kconfig                            |   11 +
 drivers/net/phy/Makefile                           |    2 +
 drivers/net/phy/bcm87xx.c                          |  237 ++
 drivers/net/phy/cs4321-ucode.h                     | 4378 ++++++++++++++++++++
 drivers/net/phy/cs4321.c                           | 1147 +++++
 drivers/net/phy/mdio_bus.c                         |    7 +
 drivers/net/phy/phy_device.c                       |  110 +-
 drivers/of/of_mdio.c                               |   14 +-
 include/linux/phy.h                                |   32 +-
 12 files changed, 5993 insertions(+), 13 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt
 create mode 100644 Documentation/devicetree/bindings/net/cortina-cs4321.txt
 create mode 100644 drivers/net/phy/bcm87xx.c
 create mode 100644 drivers/net/phy/cs4321-ucode.h
 create mode 100644 drivers/net/phy/cs4321.c

-- 
1.7.2.3

^ permalink raw reply

* [PATCH 1/5] netdev/phy: Handle IEEE802.3 clause 45 Ethernet PHYs
From: David Daney @ 2012-05-22 17:59 UTC (permalink / raw)
  To: devicetree-discuss, Grant Likely, Rob Herring, David S. Miller,
	netdev
  Cc: linux-kernel, linux-mips, Andy Fleming, David Daney
In-Reply-To: <1337709592-23347-1-git-send-email-ddaney.cavm@gmail.com>

From: David Daney <david.daney@cavium.com>

The IEEE802.3 clause 45 MDIO bus protocol allows for directly
addressing PHY registers using a 21 bit address, and is used by many
10G Ethernet PHYS.  Already existing is the ability of MDIO bus
drivers to use clause 45, with the MII_ADDR_C45 flag.  Here we add
struct phy_c45_device_ids to hold the device identifier registers
present in clause 45. struct phy_device gets a couple of new fields:
c45_ids to hold the identifiers and is_c45 to signal that it is clause
45.

Normally the MII_ADDR_C45 flag is ORed with the register address to
indicate a clause 45 transaction.  Here we also use this flag in the
*device* address passed to get_phy_device() to indicate that probing
should be done with clause 45 transactions.

EXPORT phy_device_create() so that the follow-on patch to of_mdio.c
can use it to create phy devices for PHYs, that have non-standard
device identifier registers, based on the device tree bindings.

Signed-off-by: David Daney <david.daney@cavium.com>
---
 drivers/net/phy/phy_device.c |  110 +++++++++++++++++++++++++++++++++++++++---
 include/linux/phy.h          |   25 +++++++++-
 2 files changed, 126 insertions(+), 9 deletions(-)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index de86a55..3f989ef 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -149,8 +149,8 @@ int phy_scan_fixups(struct phy_device *phydev)
 }
 EXPORT_SYMBOL(phy_scan_fixups);
 
-static struct phy_device* phy_device_create(struct mii_bus *bus,
-					    int addr, int phy_id)
+struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
+				     struct phy_c45_device_ids *c45_ids)
 {
 	struct phy_device *dev;
 
@@ -171,8 +171,12 @@ static struct phy_device* phy_device_create(struct mii_bus *bus,
 
 	dev->autoneg = AUTONEG_ENABLE;
 
+	dev->is_c45 = (addr & MII_ADDR_C45) != 0;
+	addr &= ~MII_ADDR_C45;
 	dev->addr = addr;
 	dev->phy_id = phy_id;
+	if (c45_ids)
+		dev->c45_ids = *c45_ids;
 	dev->bus = bus;
 	dev->dev.parent = bus->parent;
 	dev->dev.bus = &mdio_bus_type;
@@ -197,20 +201,104 @@ static struct phy_device* phy_device_create(struct mii_bus *bus,
 
 	return dev;
 }
+EXPORT_SYMBOL(phy_device_create);
+
+/**
+ * get_phy_c45_ids - reads the specified addr for its 802.3-c45 IDs.
+ * @bus: the target MII bus
+ * @addr: PHY address on the MII bus
+ * @phy_id: where to store the ID retrieved.
+ * @c45_ids: where to store the c45 ID information.
+ *
+ *   If the PHY devices-in-package appears to be valid, it and the
+ *   corresponding identifiers are stored in @c45_ids, zero is stored
+ *   in @phy_id.  Otherwise 0xffffffff is stored in @phy_id.  Returns
+ *   zero on success.
+ *
+ */
+static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
+			   struct phy_c45_device_ids *c45_ids) {
+	int phy_reg;
+	int i, reg_addr;
+
+	/*
+	 * Find first non-zero Devices In package.  Device
+	 * zero is reserved, so don't probe it.
+	 */
+	for (i = 1;
+	     i < ARRAY_SIZE(c45_ids->device_ids) &&
+		     c45_ids->devices_in_package == 0;
+	     i++) {
+		reg_addr = MII_ADDR_C45 | i << 16 | 6;
+		phy_reg = mdiobus_read(bus, addr, reg_addr);
+		if (phy_reg < 0)
+			return -EIO;
+		c45_ids->devices_in_package = (phy_reg & 0xffff) << 16;
+
+
+		reg_addr = MII_ADDR_C45 | i << 16 | 5;
+		phy_reg = mdiobus_read(bus, addr, reg_addr);
+		if (phy_reg < 0)
+			return -EIO;
+		c45_ids->devices_in_package |= (phy_reg & 0xffff);
+
+		/*
+		 * If mostly Fs, there is no device there,
+		 * let's get out of here.
+		 */
+		if ((c45_ids->devices_in_package & 0x1fffffff) == 0x1fffffff) {
+			*phy_id = 0xffffffff;
+			return 0;
+		}
+	}
+
+	/* Now probe Device Identifiers for each device present. */
+	for (i = 1; i < ARRAY_SIZE(c45_ids->device_ids); i++) {
+		if (!(c45_ids->devices_in_package & (1 << i)))
+			continue;
+
+		reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID1;
+		phy_reg = mdiobus_read(bus, addr, reg_addr);
+		if (phy_reg < 0)
+			return -EIO;
+		c45_ids->device_ids[i] = (phy_reg & 0xffff) << 16;
+
+
+		reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID2;
+		phy_reg = mdiobus_read(bus, addr, reg_addr);
+		if (phy_reg < 0)
+			return -EIO;
+		c45_ids->device_ids[i] |= (phy_reg & 0xffff);
+	}
+	*phy_id = 0;
+	return 0;
+}
 
 /**
  * get_phy_id - reads the specified addr for its ID.
  * @bus: the target MII bus
  * @addr: PHY address on the MII bus
  * @phy_id: where to store the ID retrieved.
+ * @c45_ids: where to store the c45 ID information.
+ *
+ * Description: In the case of a 802.3-c22 PHY, reads the ID registers
+ *   of the PHY at @addr on the @bus, stores it in @phy_id and returns
+ *   zero on success.
+ *
+ *   In the case of a 802.3-c45 PHY, get_phy_c45_ids() is invoked, and
+ *   its return value is in turn returned.
  *
- * Description: Reads the ID registers of the PHY at @addr on the
- *   @bus, stores it in @phy_id and returns zero on success.
  */
-static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id)
+static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id,
+		      struct phy_c45_device_ids *c45_ids)
 {
 	int phy_reg;
 
+	if (addr & MII_ADDR_C45) {
+		addr &= ~MII_ADDR_C45;
+
+		return get_phy_c45_ids(bus, addr, phy_id, c45_ids);
+	}
 	/* Grab the bits from PHYIR1, and put them
 	 * in the upper half */
 	phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
@@ -238,14 +326,17 @@ static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id)
  *
  * Description: Reads the ID registers of the PHY at @addr on the
  *   @bus, then allocates and returns the phy_device to represent it.
+ *   If @addr & MII_ADDR_C45 is not zero, the PHY is assumed to be
+ *   802.3-c45.
  */
 struct phy_device * get_phy_device(struct mii_bus *bus, int addr)
 {
 	struct phy_device *dev = NULL;
 	u32 phy_id;
+	struct phy_c45_device_ids c45_ids = {0};
 	int r;
 
-	r = get_phy_id(bus, addr, &phy_id);
+	r = get_phy_id(bus, addr, &phy_id, &c45_ids);
 	if (r)
 		return ERR_PTR(r);
 
@@ -253,7 +344,7 @@ struct phy_device * get_phy_device(struct mii_bus *bus, int addr)
 	if ((phy_id & 0x1fffffff) == 0x1fffffff)
 		return NULL;
 
-	dev = phy_device_create(bus, addr, phy_id);
+	dev = phy_device_create(bus, addr, phy_id, &c45_ids);
 
 	return dev;
 }
@@ -446,6 +537,11 @@ static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
 	/* Assume that if there is no driver, that it doesn't
 	 * exist, and we should use the genphy driver. */
 	if (NULL == d->driver) {
+		if (phydev->is_c45) {
+			pr_err("No driver for phy %x\n", phydev->phy_id);
+			return -ENODEV;
+		}
+
 		d->driver = &genphy_driver.driver;
 
 		err = d->driver->probe(d);
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 9039009..283a318 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -83,8 +83,12 @@ typedef enum {
  */
 #define MII_BUS_ID_SIZE	(20 - 3)
 
-/* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit
-   IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. */
+/*
+ * Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the
+ * 21 bit IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy
+ * chips.  Also may be ORed into the device address in
+ * get_phy_device().
+ */
 #define MII_ADDR_C45 (1<<30)
 
 struct device;
@@ -243,6 +247,16 @@ enum phy_state {
 	PHY_RESUMING
 };
 
+/*
+ * phy_c45_device_ids: 802.3-c45 Device Identifiers
+ *
+ * devices_in_package: Bit vector of devices present.
+ * device_ids: The device identifer for each present device.
+ */
+struct phy_c45_device_ids {
+	u32 devices_in_package;
+	u32 device_ids[8];
+};
 
 /* phy_device: An instance of a PHY
  *
@@ -250,6 +264,8 @@ enum phy_state {
  * bus: Pointer to the bus this PHY is on
  * dev: driver model device structure for this PHY
  * phy_id: UID for this device found during discovery
+ * c45_ids: 802.3-c45 Device Identifers if is_c45.
+ * is_c45:  Set to true if this phy uses clause 45 addressing.
  * state: state of the PHY for management purposes
  * dev_flags: Device-specific flags used by the PHY driver.
  * addr: Bus address of PHY
@@ -285,6 +301,9 @@ struct phy_device {
 
 	u32 phy_id;
 
+	struct phy_c45_device_ids c45_ids;
+	bool is_c45;
+
 	enum phy_state state;
 
 	u32 dev_flags;
@@ -477,6 +496,8 @@ static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)
 	return mdiobus_write(phydev->bus, phydev->addr, regnum, val);
 }
 
+struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
+				     struct phy_c45_device_ids *c45_ids);
 struct phy_device* get_phy_device(struct mii_bus *bus, int addr);
 int phy_device_register(struct phy_device *phy);
 int phy_init_hw(struct phy_device *phydev);
-- 
1.7.2.3

^ permalink raw reply related

* [PATCH 2/5] netdev/phy/of: Handle IEEE802.3 clause 45 Ethernet PHYs in of_mdiobus_register()
From: David Daney @ 2012-05-22 17:59 UTC (permalink / raw)
  To: devicetree-discuss, Grant Likely, Rob Herring, David S. Miller,
	netdev
  Cc: linux-kernel, linux-mips, Andy Fleming, David Daney
In-Reply-To: <1337709592-23347-1-git-send-email-ddaney.cavm@gmail.com>

From: David Daney <david.daney@cavium.com>

Define two new "compatible" values for Ethernet
PHYs. "ethernet-phy-ieee802.3-c22" and "ethernet-phy-ieee802.3-c45"
are used to indicate a PHY uses the corresponding protocol.

If a PHY is "compatible" with "ethernet-phy-ieee802.3-c45", we
indicate this so that get_phy_device() can properly probe the device.

If get_phy_device() fails, it was probably due to failing the probe of
the PHY identifier registers.  Since we have the device tree telling
us the PHY exists, go ahead and add it anyhow with a phy_id of zero.
There may be a driver match based on the "compatible" property.

Signed-off-by: David Daney <david.daney@cavium.com>
---
 Documentation/devicetree/bindings/net/phy.txt |   12 +++++++++++-
 drivers/of/of_mdio.c                          |   14 +++++++++++---
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/Documentation/devicetree/bindings/net/phy.txt b/Documentation/devicetree/bindings/net/phy.txt
index bb8c742..7cd18fb 100644
--- a/Documentation/devicetree/bindings/net/phy.txt
+++ b/Documentation/devicetree/bindings/net/phy.txt
@@ -14,10 +14,20 @@ Required properties:
  - linux,phandle :  phandle for this node; likely referenced by an
    ethernet controller node.
 
+Optional Properties:
+
+- compatible: Compatible list, may contain
+  "ethernet-phy-ieee802.3-c22" or "ethernet-phy-ieee802.3-c45" for
+  PHYs that implement IEEE802.3 clause 22 or IEEE802.3 clause 45
+  specifications. If neither of these are specified, the default is to
+  assume clause 22. The compatible list may also contain other
+  elements.
+
 Example:
 
 ethernet-phy@0 {
-	linux,phandle = <2452000>
+	compatible = "ethernet-phy-ieee802.3-c22";
+	linux,phandle = <2452000>;
 	interrupt-parent = <40000>;
 	interrupts = <35 1>;
 	reg = <0>;
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
index 2574abd..0f08aaf 100644
--- a/drivers/of/of_mdio.c
+++ b/drivers/of/of_mdio.c
@@ -79,11 +79,19 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
 				mdio->irq[addr] = PHY_POLL;
 		}
 
+		if (of_device_is_compatible(child,
+					    "ethernet-phy-ieee802.3-c45"))
+			addr |= MII_ADDR_C45;
+
 		phy = get_phy_device(mdio, addr);
 		if (!phy || IS_ERR(phy)) {
-			dev_err(&mdio->dev, "error probing PHY at address %i\n",
-				addr);
-			continue;
+			phy = phy_device_create(mdio, addr, 0, NULL);
+			if (!phy || IS_ERR(phy)) {
+				dev_err(&mdio->dev,
+					"error creating PHY at address %i\n",
+					addr);
+				continue;
+			}
 		}
 
 		/* Associate the OF node with the device structure so it
-- 
1.7.2.3

^ permalink raw reply related

* [PATCH 3/5] netdev/phy/of: Add more methods for binding PHY devices to drivers.
From: David Daney @ 2012-05-22 17:59 UTC (permalink / raw)
  To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Grant Likely,
	Rob Herring, David S. Miller, netdev-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-mips-6z/3iImG2C8G8FEW9MqTrA, Andy Fleming,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, David Daney
In-Reply-To: <1337709592-23347-1-git-send-email-ddaney.cavm-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

From: David Daney <david.daney-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>

Allow PHY drivers to supply their own device matching function
(match_phy_device()), or to be matched OF compatible properties.

PHYs following IEEE802.3 clause 45 have more than one device
identifier constants, which breaks the default device matching code.
Other 10G PHYs don't follow the standard manufacturer/device
identifier register layout standards, but they do use the standard
MDIO bus protocols for register access.  Both of these require
adjustments to the PHY driver to device matching code.

If the there is an of_node associated with such a PHY, we can match it
to its driver using the "compatible" properties, just as we do with
certain platform devices.  If the "compatible" property match fails,
first check if there is a driver supplied matching function, and if
not fall back to the existing identifier matching rules.

Signed-off-by: David Daney <david.daney-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
---
 drivers/net/phy/mdio_bus.c |    7 +++++++
 include/linux/phy.h        |    7 +++++++
 2 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index 83d5c9f..11c415d 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -22,6 +22,7 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/device.h>
+#include <linux/of_device.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
@@ -305,6 +306,12 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv)
 	struct phy_device *phydev = to_phy_device(dev);
 	struct phy_driver *phydrv = to_phy_driver(drv);
 
+	if (of_driver_match_device(dev, drv))
+		return 1;
+
+	if (phydrv->match_phy_device)
+		return phydrv->match_phy_device(phydev);
+
 	return ((phydrv->phy_id & phydrv->phy_id_mask) ==
 		(phydev->phy_id & phydrv->phy_id_mask));
 }
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 283a318..09dc4c3 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -431,6 +431,13 @@ struct phy_driver {
 	/* Clears up any memory if needed */
 	void (*remove)(struct phy_device *phydev);
 
+	/*
+	 * Returns true if this is a suitable driver for the given
+	 * phydev.  If NULL, matching is based on phy_id and
+	 * phy_id_mask.
+	 */
+	int (*match_phy_device)(struct phy_device *phydev);
+
 	/* Handles SIOCSHWTSTAMP ioctl for hardware time stamping. */
 	int  (*hwtstamp)(struct phy_device *phydev, struct ifreq *ifr);
 
-- 
1.7.2.3

^ permalink raw reply related

* [PATCH 4/5] netdev/phy: Add driver for Broadcom BCM87XX 10G Ethernet PHYs
From: David Daney @ 2012-05-22 17:59 UTC (permalink / raw)
  To: devicetree-discuss, Grant Likely, Rob Herring, David S. Miller,
	netdev
  Cc: linux-kernel, linux-mips, Andy Fleming, David Daney
In-Reply-To: <1337709592-23347-1-git-send-email-ddaney.cavm@gmail.com>

From: David Daney <david.daney@cavium.com>

Add a driver for BCM8706 and BCM8727 devices.  These are a 10Gig PHYs
which use MII_ADDR_C45 addressing.  They are always 10G full duplex, so
there is no autonegotiation.  All we do is report link state and send
interrupts when it changes.

If the PHY has a device tree of_node associated with it, the
"broadcom,c45-reg-init" property is used to supply register
initialization values when config_init() is called.

Signed-off-by: David Daney <david.daney@cavium.com>
---
 .../devicetree/bindings/net/broadcom-bcm87xx.txt   |   29 +++
 drivers/net/phy/Kconfig                            |    5 +
 drivers/net/phy/Makefile                           |    1 +
 drivers/net/phy/bcm87xx.c                          |  237 ++++++++++++++++++++
 4 files changed, 272 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt
 create mode 100644 drivers/net/phy/bcm87xx.c

diff --git a/Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt b/Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt
new file mode 100644
index 0000000..7c86d5e
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt
@@ -0,0 +1,29 @@
+The Broadcom BCM87XX devices are a family of 10G Ethernet PHYs.  They
+have these bindings in addition to the standard PHY bindings.
+
+Compatible: Should contain "broadcom,bcm8706" or "broadcom,bcm8727" and
+            "ethernet-phy-ieee802.3-c45"
+
+Optional Properties:
+
+- broadcom,c45-reg-init : one of more sets of 4 cells.  The first cell
+  is the MDIO Manageable Device (MMD) address, the second a register
+  address within the MMD, the third cell contains a mask to be ANDed
+  with the existing register value, and the fourth cell is ORed with
+  he result to yield the new register value.  If the third cell has a
+  value of zero, no read of the existing value is performed.
+
+Example:
+
+	ethernet-phy@5 {
+		reg = <5>;
+		compatible = "broadcom,bcm8706", "ethernet-phy-ieee802.3-c45";
+		interrupt-parent = <&gpio>;
+		interrupts = <12 8>; /* Pin 12, active low */
+		/*
+		 * Set PMD Digital Control Register for
+		 * GPIO[1] Tx/Rx
+		 * GPIO[0] R64 Sync Acquired
+		 */
+		broadcom,c45-reg-init = <1 0xc808 0xff8f 0x70>;
+	};
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index 32e9be0..9e36c8f 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -67,6 +67,11 @@ config BCM63XX_PHY
 	---help---
 	  Currently supports the 6348 and 6358 PHYs.
 
+config BCM87XX_PHY
+	tristate "Driver for Broadcom BCM8706 and BCM8727 PHYs"
+	help
+	  Currently supports the BCM8706 and BCM8727 10G Ethernet PHYs.
+
 config ICPLUS_PHY
 	tristate "Drivers for ICPlus PHYs"
 	---help---
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
index f51af68..6d2dc6c 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_SMSC_PHY)		+= smsc.o
 obj-$(CONFIG_VITESSE_PHY)	+= vitesse.o
 obj-$(CONFIG_BROADCOM_PHY)	+= broadcom.o
 obj-$(CONFIG_BCM63XX_PHY)	+= bcm63xx.o
+obj-$(CONFIG_BCM87XX_PHY)	+= bcm87xx.o
 obj-$(CONFIG_ICPLUS_PHY)	+= icplus.o
 obj-$(CONFIG_REALTEK_PHY)	+= realtek.o
 obj-$(CONFIG_LSI_ET1011C_PHY)	+= et1011c.o
diff --git a/drivers/net/phy/bcm87xx.c b/drivers/net/phy/bcm87xx.c
new file mode 100644
index 0000000..6883c7c
--- /dev/null
+++ b/drivers/net/phy/bcm87xx.c
@@ -0,0 +1,237 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2011 - 2012 Cavium, Inc.
+ */
+
+#include <linux/module.h>
+#include <linux/phy.h>
+#include <linux/of.h>
+
+#define PHY_ID_BCM8706	0x0143bdc1
+#define PHY_ID_BCM8727	0x0143bff0
+
+#define BCM87XX_PMD_RX_SIGNAL_DETECT	(MII_ADDR_C45 | 0x1000a)
+#define BCM87XX_10GBASER_PCS_STATUS	(MII_ADDR_C45 | 0x30020)
+#define BCM87XX_XGXS_LANE_STATUS	(MII_ADDR_C45 | 0x40018)
+
+#define BCM87XX_LASI_CONTROL (MII_ADDR_C45 | 0x39002)
+#define BCM87XX_LASI_STATUS (MII_ADDR_C45 | 0x39005)
+
+#if IS_ENABLED(CONFIG_OF_MDIO)
+/*
+ * Set and/or override some configuration registers based on the
+ * marvell,reg-init property stored in the of_node for the phydev.
+ *
+ * broadcom,c45-reg-init = <devid reg mask value>,...;
+ *
+ * There may be one or more sets of <devid reg mask value>:
+ *
+ * devid: which sub-device to use.
+ * reg: the register.
+ * mask: if non-zero, ANDed with existing register value.
+ * value: ORed with the masked value and written to the regiser.
+ *
+ */
+static int bcm87xx_of_reg_init(struct phy_device *phydev)
+{
+	const __be32 *paddr;
+	int len, i, ret;
+
+	if (!phydev->dev.of_node)
+		return 0;
+
+	paddr = of_get_property(phydev->dev.of_node,
+				"broadcom,c45-reg-init", &len);
+	if (!paddr || len < (4 * sizeof(*paddr)))
+		return 0;
+
+	ret = 0;
+	len /= sizeof(*paddr);
+	for (i = 0; i < len - 3; i += 4) {
+		u16 devid = be32_to_cpup(paddr + i);
+		u16 reg = be32_to_cpup(paddr + i + 1);
+		u16 mask = be32_to_cpup(paddr + i + 2);
+		u16 val_bits = be32_to_cpup(paddr + i + 3);
+		int val;
+		u32 regnum = MII_ADDR_C45 | (devid << 16) | reg;
+		val = 0;
+		if (mask) {
+			val = phy_read(phydev, regnum);
+			if (val < 0) {
+				ret = val;
+				goto err;
+			}
+			val &= mask;
+		}
+		val |= val_bits;
+
+		ret = phy_write(phydev, regnum, val);
+		if (ret < 0)
+			goto err;
+	}
+err:
+	return ret;
+}
+#else
+static int bcm87xx_of_reg_init(struct phy_device *phydev)
+{
+	return 0;
+}
+#endif /* CONFIG_OF_MDIO */
+
+static int bcm87xx_config_init(struct phy_device *phydev)
+{
+	phydev->supported = SUPPORTED_10000baseR_FEC;
+	phydev->advertising = ADVERTISED_10000baseR_FEC;
+	phydev->state = PHY_NOLINK;
+
+	bcm87xx_of_reg_init(phydev);
+
+	return 0;
+}
+
+static int bcm87xx_config_aneg(struct phy_device *phydev)
+{
+	return -EINVAL;
+}
+
+static int bcm87xx_read_status(struct phy_device *phydev)
+{
+	int rx_signal_detect;
+	int pcs_status;
+	int xgxs_lane_status;
+
+	rx_signal_detect = phy_read(phydev, BCM87XX_PMD_RX_SIGNAL_DETECT);
+	if (rx_signal_detect < 0)
+		return rx_signal_detect;
+
+	if ((rx_signal_detect & 1) == 0)
+		goto no_link;
+
+	pcs_status = phy_read(phydev, BCM87XX_10GBASER_PCS_STATUS);
+	if (pcs_status < 0)
+		return pcs_status;
+
+	if ((pcs_status & 1) == 0)
+		goto no_link;
+
+	xgxs_lane_status = phy_read(phydev, BCM87XX_XGXS_LANE_STATUS);
+	if (xgxs_lane_status < 0)
+		return xgxs_lane_status;
+
+	if ((xgxs_lane_status & 0x1000) == 0)
+		goto no_link;
+
+	phydev->speed = 10000;
+	phydev->link = 1;
+	phydev->duplex = 1;
+	return 0;
+
+no_link:
+	phydev->link = 0;
+	return 0;
+}
+
+static int bcm87xx_config_intr(struct phy_device *phydev)
+{
+	int reg, err;
+
+	reg = phy_read(phydev, BCM87XX_LASI_CONTROL);
+
+	if (reg < 0)
+		return reg;
+
+	if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
+		reg |= 1;
+	else
+		reg &= ~1;
+
+	err = phy_write(phydev, BCM87XX_LASI_CONTROL, reg);
+	return err;
+}
+
+static int bcm87xx_did_interrupt(struct phy_device *phydev)
+{
+	int reg;
+
+	reg = phy_read(phydev, BCM87XX_LASI_STATUS);
+
+	if (reg < 0) {
+		dev_err(&phydev->dev,
+			"Error: Read of BCM87XX_LASI_STATUS failed: %d\n", reg);
+		return 0;
+	}
+	return (reg & 1) != 0;
+}
+
+static int bcm87xx_ack_interrupt(struct phy_device *phydev)
+{
+	/* Reading the LASI status clears it. */
+	bcm87xx_did_interrupt(phydev);
+	return 0;
+}
+
+static int bcm8706_match_phy_device(struct phy_device *phydev)
+{
+	return phydev->c45_ids.device_ids[4] == PHY_ID_BCM8706;
+}
+
+static int bcm8727_match_phy_device(struct phy_device *phydev)
+{
+	return phydev->c45_ids.device_ids[4] == PHY_ID_BCM8727;
+}
+
+static struct phy_driver bcm8706_driver = {
+	.phy_id		= PHY_ID_BCM8706,
+	.phy_id_mask	= 0xffffffff,
+	.name		= "Broadcom BCM8706",
+	.flags		= PHY_HAS_INTERRUPT,
+	.config_init	= bcm87xx_config_init,
+	.config_aneg	= bcm87xx_config_aneg,
+	.read_status	= bcm87xx_read_status,
+	.ack_interrupt	= bcm87xx_ack_interrupt,
+	.config_intr	= bcm87xx_config_intr,
+	.did_interrupt	= bcm87xx_did_interrupt,
+	.match_phy_device = bcm8706_match_phy_device,
+	.driver		= { .owner = THIS_MODULE },
+};
+
+static struct phy_driver bcm8727_driver = {
+	.phy_id		= PHY_ID_BCM8727,
+	.phy_id_mask	= 0xffffffff,
+	.name		= "Broadcom BCM8727",
+	.flags		= PHY_HAS_INTERRUPT,
+	.config_init	= bcm87xx_config_init,
+	.config_aneg	= bcm87xx_config_aneg,
+	.read_status	= bcm87xx_read_status,
+	.ack_interrupt	= bcm87xx_ack_interrupt,
+	.config_intr	= bcm87xx_config_intr,
+	.did_interrupt	= bcm87xx_did_interrupt,
+	.match_phy_device = bcm8727_match_phy_device,
+	.driver		= { .owner = THIS_MODULE },
+};
+
+static int __init bcm87xx_init(void)
+{
+	int ret;
+
+	ret = phy_driver_register(&bcm8706_driver);
+	if (ret)
+		goto err;
+
+	ret = phy_driver_register(&bcm8727_driver);
+err:
+	return ret;
+}
+module_init(bcm87xx_init);
+
+static void __exit bcm87xx_exit(void)
+{
+	phy_driver_unregister(&bcm8706_driver);
+	phy_driver_unregister(&bcm8727_driver);
+}
+module_exit(bcm87xx_exit);
+
-- 
1.7.2.3

^ permalink raw reply related

* [PATCH 5/5] netdev/phy: Add driver for Cortina cs4321 quad 10G PHY.
From: David Daney @ 2012-05-22 17:59 UTC (permalink / raw)
  To: devicetree-discuss, Grant Likely, Rob Herring, David S. Miller,
	netdev
  Cc: linux-kernel, linux-mips, Andy Fleming, David Daney
In-Reply-To: <1337709592-23347-1-git-send-email-ddaney.cavm@gmail.com>

From: David Daney <david.daney@cavium.com>

These phys do *not* implement the standard IEEE 802.3 clause 45
registers.  PHY to driver matching is done with OF compatible
properties.

Signed-off-by: David Daney <david.daney@cavium.com>
---
 .../devicetree/bindings/net/cortina-cs4321.txt     |   27 +
 drivers/net/phy/Kconfig                            |    6 +
 drivers/net/phy/Makefile                           |    1 +
 drivers/net/phy/cs4321-ucode.h                     | 4378 ++++++++++++++++++++
 drivers/net/phy/cs4321.c                           | 1147 +++++
 5 files changed, 5559 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/cortina-cs4321.txt
 create mode 100644 drivers/net/phy/cs4321-ucode.h
 create mode 100644 drivers/net/phy/cs4321.c

diff --git a/Documentation/devicetree/bindings/net/cortina-cs4321.txt b/Documentation/devicetree/bindings/net/cortina-cs4321.txt
new file mode 100644
index 0000000..a1b6f48
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/cortina-cs4321.txt
@@ -0,0 +1,27 @@
+Cortina CS4321 dual RXAIU/quad XAUI 10G Ethernet PHYs.  Each PHY
+within the package is mostly independent and has the following
+properties.  These phys do *not* implement the standard IEEE 802.3
+clause 45 registers.
+
+Required Properties:
+
+- compatible : "cortina,cs4321" or "cortina,cs4318".
+- reg : The address on the system management bus (MDIO/I2C/SPI address)
+- cortina,host-mode : Either "rxaui" or "xaui", the protocol used to
+  communicate with the Ethernet MAC.
+
+Optional Properties:
+
+- interrupts : One set of cells (per the interrupt-parent) for the
+  interrupt line.
+- interrupt-parent : Standard interrupt-parent property for the interrupt.
+
+Example:
+
+	phy0: ethernet-phy@4 {
+		reg = <0x04>;
+		compatible = "cortina,cs4318";
+		interrupt-parent = <&gpio>;
+		interrupts = <11 8>; /* Pin 11, active low */
+		cortina,host-mode = "rxaui";
+	};
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index 9e36c8f..1d977f9 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -72,6 +72,12 @@ config BCM87XX_PHY
 	help
 	  Currently supports the BCM8706 and BCM8727 10G Ethernet PHYs.
 
+config CS4318_PHY
+	tristate "Driver for Cortina cs4318 quad-10G Ethernet PHY"
+	help
+	  Currently supports only the Cortina cs4318 PHY.  This may be
+	  configured as either a quad-RXAUI or dual-XAUI device.
+
 config ICPLUS_PHY
 	tristate "Drivers for ICPlus PHYs"
 	---help---
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
index 6d2dc6c..c99f64c 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_VITESSE_PHY)	+= vitesse.o
 obj-$(CONFIG_BROADCOM_PHY)	+= broadcom.o
 obj-$(CONFIG_BCM63XX_PHY)	+= bcm63xx.o
 obj-$(CONFIG_BCM87XX_PHY)	+= bcm87xx.o
+obj-$(CONFIG_CS4318_PHY)	+= cs4321.o
 obj-$(CONFIG_ICPLUS_PHY)	+= icplus.o
 obj-$(CONFIG_REALTEK_PHY)	+= realtek.o
 obj-$(CONFIG_LSI_ET1011C_PHY)	+= et1011c.o
diff --git a/drivers/net/phy/cs4321-ucode.h b/drivers/net/phy/cs4321-ucode.h
new file mode 100644
index 0000000..98f05ac
--- /dev/null
+++ b/drivers/net/phy/cs4321-ucode.h
@@ -0,0 +1,4378 @@
+/*
+ *    Copyright (C) 2011 by Cortina Systems, Inc.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    This program is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ */
+
+/*
+ * The following arrays contain the microcode data to download to the
+ * device.
+ */
+static u16 cs4321_microcode_prolog[] = {
+	/* Addr, Data */
+	0x001c, 0x0001,
+	0x0020, 0x8004,
+	0x0240, 0x0008,
+	0x024f, 0x0000
+};
+
+/*
+ * Each slice is written:
+ *      0x024f, slice_number
+ *   for each element in slice:
+ *      0x0201, first_value
+ *      0x0202, second_value
+ *      0x0200, element index + 0x9000
+ */
+static u16 cs4321_microcode_slices[8][512 * 2] = {{
+	0x009a, 0xb616,
+	0x0060, 0x01e6,
+	0x0088, 0xbf02,
+	0x0000, 0x0000,
+	0x0083, 0xc184,
+	0x0003, 0xc084,
+	0x0083, 0x4f4b,
+	0x0003, 0x4190,
+	0x0003, 0x4f83,
+	0x0083, 0x408e,
+	0x0083, 0xe0db,
+	0x0083, 0xc0ec,
+	0x0003, 0xc0eb,
+	0x0003, 0xc0ee,
+	0x0083, 0xc0ea,
+	0x0003, 0xc696,
+	0x0004, 0xed04,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x0060, 0x01e6,
+	0x0083, 0xc086,
+	0x001a, 0xb701,
+	0x0060, 0x01e6,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x0020, 0x001f,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x0060, 0x01e6,
+	0x0003, 0xc2bf,
+	0x0060, 0x01e6,
+	0x008a, 0xde02,
+	0x0080, 0x0023,
+	0x008e, 0x8502,
+	0x0080, 0x0015,
+	0x0018, 0x9300,
+	0x0003, 0x0393,
+	0x001b, 0x4f80,
+	0x0083, 0x0380,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x0083, 0xc0b9,
+	0x0083, 0xc7ff,
+	0x0003, 0xc082,
+	0x0024, 0x8508,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x00a0, 0x0035,
+	0x000f, 0x8585,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0x49b8,
+	0x0083, 0xc052,
+	0x0098, 0x5200,
+	0x0083, 0x0352,
+	0x0099, 0xb853,
+	0x0003, 0x03b8,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x00a4, 0x8505,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x0020, 0x0043,
+	0x008f, 0x8587,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x009a, 0x0104,
+	0x0083, 0x03b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0093, 0x0000,
+	0x001f, 0x8761,
+	0x0003, 0x03f6,
+	0x001a, 0x0160,
+	0x001e, 0x03f6,
+	0x0003, 0x03f6,
+	0x0017, 0xd103,
+	0x0041, 0x0056,
+	0x0083, 0xd1fb,
+	0x0080, 0x005d,
+	0x001a, 0x0094,
+	0x0017, 0xf603,
+	0x0041, 0x005c,
+	0x001a, 0x0094,
+	0x0083, 0x03fb,
+	0x0080, 0x005d,
+	0x0083, 0xf6fb,
+	0x0003, 0xc0e4,
+	0x0018, 0xe400,
+	0x0003, 0x03e4,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0083, 0xcbf9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc1b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xcff9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc2b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd5b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcef9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0397,
+	0x0003, 0xd398,
+	0x0083, 0xd399,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x009f, 0xe40f,
+	0x0017, 0xd703,
+	0x00c1, 0x005e,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x008b, 0x8515,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x000b, 0x8511,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x008b, 0x850d,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0004, 0xb609,
+	0x008b, 0x8508,
+	0x001a, 0x001c,
+	0x0097, 0x03b6,
+	0x0041, 0x00a6,
+	0x0097, 0xb64b,
+	0x0041, 0x00a6,
+	0x0083, 0xb64b,
+	0x0083, 0xb84c,
+	0x001a, 0x000b,
+	0x0097, 0x5203,
+	0x00a1, 0x0037,
+	0x0083, 0x4cb8,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x00a4, 0x8505,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x00a0, 0x00b2,
+	0x008f, 0x8584,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0397,
+	0x0003, 0xd398,
+	0x0083, 0xd399,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x001b, 0x57ba,
+	0x0083, 0x03b9,
+	0x009f, 0xd20f,
+	0x0091, 0x0380,
+	0x0083, 0x0380,
+	0x001a, 0xb701,
+	0x0060, 0x01e6,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x0020, 0x00ce,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x0060, 0x01e6,
+	0x0003, 0xc2bf,
+	0x0060, 0x01e6,
+	0x009b, 0x57a3,
+	0x0060, 0x01dc,
+	0x0083, 0x03ef,
+	0x009b, 0x57a0,
+	0x0060, 0x01dc,
+	0x0083, 0x03dc,
+	0x0018, 0xee00,
+	0x0003, 0x03ee,
+	0x0017, 0x59ee,
+	0x0041, 0x011f,
+	0x0003, 0xc0ee,
+	0x0084, 0xed0f,
+	0x009a, 0x8086,
+	0x0083, 0x03bf,
+	0x009a, 0x3408,
+	0x0060, 0x01e6,
+	0x001a, 0xb40b,
+	0x0060, 0x01e6,
+	0x0097, 0xbf60,
+	0x0020, 0x00e5,
+	0x0083, 0xbf60,
+	0x0003, 0xc1bf,
+	0x0080, 0x00e6,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x0060, 0x01e6,
+	0x0093, 0x0000,
+	0x001f, 0x8761,
+	0x0003, 0x03f6,
+	0x001a, 0x0160,
+	0x001e, 0x03f6,
+	0x0003, 0x03f6,
+	0x0017, 0xd103,
+	0x00c1, 0x00f2,
+	0x0083, 0xd1fb,
+	0x0000, 0x00f9,
+	0x001a, 0x0094,
+	0x0017, 0xf603,
+	0x00c1, 0x00f8,
+	0x001a, 0x0094,
+	0x0083, 0x03fb,
+	0x0000, 0x00f9,
+	0x0083, 0xf6fb,
+	0x009b, 0xa155,
+	0x0003, 0x03e2,
+	0x009a, 0x0055,
+	0x0017, 0xe203,
+	0x00c1, 0x0103,
+	0x0084, 0xb90b,
+	0x001f, 0xc10f,
+	0x009e, 0xb903,
+	0x0083, 0x03b9,
+	0x0080, 0x0109,
+	0x0097, 0x54e2,
+	0x00c1, 0x0109,
+	0x0017, 0xb957,
+	0x0020, 0x0109,
+	0x0098, 0xb900,
+	0x0083, 0x03b9,
+	0x009e, 0x55c4,
+	0x0097, 0xb903,
+	0x00c1, 0x0114,
+	0x0004, 0xff13,
+	0x009f, 0xff0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x0019, 0x03c8,
+	0x0083, 0x03b9,
+	0x0000, 0x011f,
+	0x0099, 0xcc55,
+	0x0097, 0x03b9,
+	0x0041, 0x011f,
+	0x009f, 0xff0f,
+	0x0097, 0x03c7,
+	0x0041, 0x011f,
+	0x0018, 0xff00,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x009e, 0x03c8,
+	0x0083, 0x03b9,
+	0x0085, 0xeb07,
+	0x0003, 0xc145,
+	0x0098, 0xea00,
+	0x0083, 0x03ea,
+	0x0097, 0x48ea,
+	0x0041, 0x0134,
+	0x0083, 0xc1eb,
+	0x008f, 0xdc0a,
+	0x001b, 0xa055,
+	0x0017, 0xc903,
+	0x00c1, 0x012d,
+	0x0083, 0xc045,
+	0x0083, 0xc242,
+	0x0000, 0x0134,
+	0x0003, 0xc245,
+	0x0003, 0xc042,
+	0x0000, 0x0134,
+	0x001b, 0xa055,
+	0x0097, 0xc103,
+	0x00c1, 0x012d,
+	0x0000, 0x012a,
+	0x001b, 0xa355,
+	0x0017, 0xcc03,
+	0x00c1, 0x013c,
+	0x001f, 0xc80f,
+	0x009e, 0xd303,
+	0x0003, 0x0344,
+	0x0003, 0xc843,
+	0x0000, 0x0145,
+	0x008f, 0xef06,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xd344,
+	0x0083, 0xc043,
+	0x0000, 0x0145,
+	0x0017, 0xc503,
+	0x00c1, 0x013f,
+	0x0000, 0x0137,
+	0x009b, 0xa155,
+	0x0003, 0x03e2,
+	0x001a, 0x0040,
+	0x0017, 0xe203,
+	0x0041, 0x0152,
+	0x0083, 0xc296,
+	0x009f, 0xd20f,
+	0x0019, 0xc103,
+	0x0083, 0x0398,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xd298,
+	0x0003, 0xc696,
+	0x009b, 0xa755,
+	0x0017, 0x5a03,
+	0x00c1, 0x015c,
+	0x009a, 0x000a,
+	0x009e, 0xd303,
+	0x0083, 0x0346,
+	0x009a, 0x000a,
+	0x0003, 0x0347,
+	0x0000, 0x0164,
+	0x000f, 0xa704,
+	0x0003, 0xd346,
+	0x0003, 0xc047,
+	0x0000, 0x0164,
+	0x009b, 0xa755,
+	0x0097, 0xc203,
+	0x0041, 0x015d,
+	0x0080, 0x0156,
+	0x009f, 0xd20f,
+	0x0011, 0x0344,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0091, 0x0345,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0091, 0x0346,
+	0x0003, 0x0399,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0088, 0xde22,
+	0x001a, 0x000d,
+	0x009e, 0x8303,
+	0x0083, 0x0383,
+	0x0003, 0xcc4b,
+	0x009c, 0x58e5,
+	0x0003, 0x034d,
+	0x009e, 0x834b,
+	0x0083, 0x0383,
+	0x001c, 0x4bc1,
+	0x0003, 0x034b,
+	0x0017, 0x4b4d,
+	0x0020, 0x0184,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0000, 0x017a,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0091, 0x834b,
+	0x0083, 0x0383,
+	0x009d, 0x4bc1,
+	0x0003, 0x034b,
+	0x0017, 0x4bc9,
+	0x00a0, 0x0191,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0080, 0x0187,
+	0x001a, 0x001f,
+	0x0091, 0x8303,
+	0x0083, 0x0383,
+	0x0000, 0x0198,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0080, 0x019a,
+	0x0000, 0x0006,
+	0x0091, 0x40ca,
+	0x0011, 0x5c03,
+	0x0003, 0x038e,
+	0x001e, 0x41c5,
+	0x001e, 0x0348,
+	0x0003, 0x0390,
+	0x001f, 0xc80f,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x009f, 0xd20f,
+	0x0091, 0x0343,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0011, 0x0342,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0011, 0x0347,
+	0x0003, 0x0399,
+	0x0083, 0xcbf9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc1b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x0083, 0x408e,
+	0x0003, 0x4190,
+	0x009f, 0xc50f,
+	0x0099, 0x03c9,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x0003, 0xcff9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc2b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd5b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcef9,
+	0x0098, 0xec00,
+	0x0083, 0x03ec,
+	0x009a, 0x0050,
+	0x0097, 0x03ec,
+	0x00c1, 0x01d8,
+	0x0003, 0x5886,
+	0x0003, 0xc0db,
+	0x008b, 0x85bf,
+	0x0080, 0x00c4,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00ae, 0x8005,
+	0x000f, 0x0303,
+	0x001e, 0x035f,
+	0x00e1, 0x0000,
+	0x0099, 0x5f03,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf85,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+}, {
+	0x009a, 0xb616,
+	0x0009, 0xbf02,
+	0x0000, 0x0000,
+	0x0083, 0xc184,
+	0x0003, 0xc084,
+	0x0083, 0x4f4b,
+	0x0083, 0x408e,
+	0x0003, 0x4f83,
+	0x0003, 0x4190,
+	0x0083, 0xe0db,
+	0x0083, 0xc0ec,
+	0x0004, 0xed04,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x00e0, 0x01a5,
+	0x0083, 0xc086,
+	0x001a, 0xb701,
+	0x00e0, 0x01a5,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x0020, 0x001a,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x00e0, 0x01a5,
+	0x0003, 0xc2bf,
+	0x00e0, 0x01a5,
+	0x008a, 0xde02,
+	0x0000, 0x001e,
+	0x008e, 0x8502,
+	0x0080, 0x0010,
+	0x0018, 0x9300,
+	0x0003, 0x0393,
+	0x001b, 0x4f80,
+	0x0083, 0x0380,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x0083, 0xc0b9,
+	0x0083, 0xc7ff,
+	0x0003, 0xc082,
+	0x0024, 0x8508,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x00a0, 0x0030,
+	0x000c, 0x8585,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0x49b8,
+	0x0083, 0xc052,
+	0x0098, 0x5200,
+	0x0083, 0x0352,
+	0x0099, 0xb853,
+	0x0003, 0x03b8,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x00a4, 0x8505,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x0020, 0x003e,
+	0x008f, 0x8587,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x009a, 0x0104,
+	0x0083, 0x03b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0060, 0x01ae,
+	0x0003, 0xc0e4,
+	0x0018, 0xe400,
+	0x0003, 0x03e4,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0060, 0x01c2,
+	0x00e0, 0x01cf,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0397,
+	0x0003, 0xd398,
+	0x0083, 0xd399,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x009f, 0xe40f,
+	0x0017, 0xd703,
+	0x00c1, 0x0049,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x008b, 0x8515,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x000b, 0x8511,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x008b, 0x850d,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0004, 0xb609,
+	0x008b, 0x8508,
+	0x001a, 0x001c,
+	0x0097, 0x03b6,
+	0x0041, 0x0077,
+	0x0097, 0xb64b,
+	0x0041, 0x0077,
+	0x0083, 0xb64b,
+	0x0083, 0xb84c,
+	0x001a, 0x000b,
+	0x0097, 0x5203,
+	0x00a1, 0x0032,
+	0x0011, 0x4c51,
+	0x0003, 0x03b8,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x00a4, 0x8505,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x00a0, 0x0084,
+	0x008f, 0x8584,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0397,
+	0x0003, 0xd398,
+	0x0083, 0xd399,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x001b, 0x57ba,
+	0x0083, 0x03b9,
+	0x009f, 0xd20f,
+	0x0091, 0x0380,
+	0x0083, 0x0380,
+	0x001a, 0xb701,
+	0x00e0, 0x01a5,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x00a0, 0x00a0,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x00e0, 0x01a5,
+	0x0003, 0xc2bf,
+	0x00e0, 0x01a5,
+	0x001b, 0x57a1,
+	0x00e0, 0x01e2,
+	0x0083, 0x03f2,
+	0x009b, 0x57a0,
+	0x00e0, 0x01e2,
+	0x0083, 0x03dc,
+	0x0083, 0x4a9c,
+	0x0098, 0xea00,
+	0x0083, 0x03ea,
+	0x001f, 0xce0f,
+	0x0097, 0x03ea,
+	0x00c1, 0x00e6,
+	0x0084, 0xed0f,
+	0x009a, 0x8086,
+	0x0083, 0x03bf,
+	0x009a, 0x3408,
+	0x00e0, 0x01a5,
+	0x001a, 0xb40b,
+	0x00e0, 0x01a5,
+	0x0097, 0xbf60,
+	0x00a0, 0x00b8,
+	0x0083, 0xbf60,
+	0x0003, 0xc1bf,
+	0x0080, 0x00b9,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x00e0, 0x01a5,
+	0x0060, 0x01ae,
+	0x009b, 0xa155,
+	0x0042, 0x0000,
+	0x0083, 0x03ea,
+	0x009f, 0xc90f,
+	0x0097, 0xea03,
+	0x00c1, 0x00c7,
+	0x009f, 0xc90f,
+	0x001e, 0x03c6,
+	0x0097, 0x03ea,
+	0x00c1, 0x00ce,
+	0x0080, 0x00d5,
+	0x009f, 0xfa0f,
+	0x0097, 0x03cd,
+	0x0020, 0x00d5,
+	0x0041, 0x00d2,
+	0x0018, 0xfa00,
+	0x0003, 0x03fa,
+	0x0080, 0x00d5,
+	0x009f, 0xfa0f,
+	0x0017, 0xc003,
+	0x0020, 0x00d5,
+	0x00c1, 0x00cb,
+	0x009f, 0xfa0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03fa,
+	0x0083, 0xc0ea,
+	0x001b, 0xa355,
+	0x0003, 0x03e2,
+	0x009e, 0x54c9,
+	0x0017, 0xe203,
+	0x00c1, 0x00e0,
+	0x0084, 0xb90b,
+	0x001f, 0xc10f,
+	0x009e, 0xb903,
+	0x0083, 0x03b9,
+	0x0080, 0x00e6,
+	0x0097, 0x54e2,
+	0x00c1, 0x00e6,
+	0x0017, 0xb957,
+	0x0020, 0x00e6,
+	0x0098, 0xb900,
+	0x0083, 0x03b9,
+	0x009e, 0x55c4,
+	0x0097, 0xb903,
+	0x00c1, 0x00f1,
+	0x0004, 0xff13,
+	0x009f, 0xff0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x0019, 0x03c8,
+	0x0083, 0x03b9,
+	0x0000, 0x00fc,
+	0x0099, 0xcc55,
+	0x0097, 0x03b9,
+	0x0041, 0x00fc,
+	0x009f, 0xff0f,
+	0x0097, 0x03c7,
+	0x0041, 0x00fc,
+	0x0018, 0xff00,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x009e, 0x03c8,
+	0x0083, 0x03b9,
+	0x008f, 0xf20c,
+	0x009b, 0xa155,
+	0x0097, 0x5d03,
+	0x00c1, 0x0105,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0003, 0x0344,
+	0x0003, 0xc243,
+	0x0080, 0x010c,
+	0x0083, 0xd344,
+	0x0083, 0xc043,
+	0x0080, 0x010c,
+	0x009b, 0xa155,
+	0x0097, 0xc103,
+	0x00c1, 0x0105,
+	0x0080, 0x0100,
+	0x001b, 0xa055,
+	0x0097, 0xc803,
+	0x00c1, 0x0114,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0345,
+	0x0083, 0xc242,
+	0x0000, 0x0120,
+	0x0003, 0xd345,
+	0x0003, 0xc042,
+	0x008f, 0xdc0a,
+	0x0097, 0xc103,
+	0x0041, 0x0120,
+	0x001b, 0xa055,
+	0x0017, 0xc003,
+	0x0041, 0x0120,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0345,
+	0x0083, 0xc242,
+	0x0003, 0xd346,
+	0x0003, 0xc047,
+	0x008f, 0xa70a,
+	0x009b, 0xa755,
+	0x0097, 0xce03,
+	0x00c1, 0x012b,
+	0x001e, 0x46c8,
+	0x0083, 0x0346,
+	0x0091, 0x47c8,
+	0x0003, 0x0347,
+	0x0080, 0x0130,
+	0x0080, 0x0130,
+	0x009b, 0xa755,
+	0x0097, 0xc103,
+	0x00c1, 0x012b,
+	0x0000, 0x0126,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x000f, 0xa60a,
+	0x001b, 0xa655,
+	0x0097, 0xce03,
+	0x0041, 0x013b,
+	0x001e, 0x46c2,
+	0x0083, 0x0346,
+	0x0091, 0x47c2,
+	0x0003, 0x0347,
+	0x0000, 0x0140,
+	0x0000, 0x0140,
+	0x001b, 0xa655,
+	0x0097, 0xc103,
+	0x0041, 0x013b,
+	0x0080, 0x0136,
+	0x009f, 0xd20f,
+	0x0091, 0x0345,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0011, 0x0344,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0091, 0x0346,
+	0x0003, 0x0399,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0088, 0xde1e,
+	0x001f, 0xcd0f,
+	0x009e, 0x8303,
+	0x0083, 0x0383,
+	0x0003, 0xcc4b,
+	0x009c, 0x58c8,
+	0x0003, 0x034d,
+	0x009e, 0x834b,
+	0x0083, 0x0383,
+	0x001c, 0x4bc1,
+	0x0003, 0x034b,
+	0x0017, 0x4b4d,
+	0x0020, 0x0160,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0080, 0x0156,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0091, 0x834b,
+	0x0083, 0x0383,
+	0x009d, 0x4bc1,
+	0x0003, 0x034b,
+	0x0017, 0x4bc9,
+	0x00a0, 0x016d,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0080, 0x0163,
+	0x0003, 0x4f83,
+	0x0091, 0x40ca,
+	0x0011, 0x5c03,
+	0x0003, 0x038e,
+	0x001e, 0x41c5,
+	0x001e, 0x0348,
+	0x0003, 0x0390,
+	0x0091, 0x40ca,
+	0x001e, 0x0348,
+	0x009e, 0x0358,
+	0x0083, 0x038f,
+	0x001f, 0xc80f,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x0080, 0x017e,
+	0x0000, 0x0005,
+	0x009f, 0xd20f,
+	0x0011, 0x0342,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0091, 0x0343,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0011, 0x0347,
+	0x0003, 0x0399,
+	0x0060, 0x01c2,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x001e, 0x4058,
+	0x009e, 0x0358,
+	0x0003, 0x038e,
+	0x0003, 0x4190,
+	0x0099, 0x4058,
+	0x0083, 0x038f,
+	0x001a, 0x0025,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x00e0, 0x01cf,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0098, 0xec00,
+	0x0083, 0x03ec,
+	0x009a, 0x0050,
+	0x0097, 0x03ec,
+	0x00c1, 0x019f,
+	0x0003, 0x5886,
+	0x0003, 0xc0db,
+	0x008b, 0x85a2,
+	0x0000, 0x0096,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf85,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0093, 0x0000,
+	0x001f, 0x8761,
+	0x0003, 0x03f6,
+	0x001a, 0x0160,
+	0x001e, 0x03f6,
+	0x0003, 0x03f6,
+	0x0017, 0xd103,
+	0x00c1, 0x01b8,
+	0x0083, 0xd1fb,
+	0x0000, 0x01bf,
+	0x001a, 0x0094,
+	0x0017, 0xf603,
+	0x00c1, 0x01be,
+	0x001a, 0x0094,
+	0x0083, 0x03fb,
+	0x0000, 0x01bf,
+	0x0083, 0xf6fb,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcbf9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc1b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xcff9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc2b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd5b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcef9,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00ae, 0x8005,
+	0x000f, 0x0303,
+	0x001e, 0x035f,
+	0x00e1, 0x0000,
+	0x0099, 0x5f03,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+}, {
+	0x009a, 0xb616,
+	0x00e0, 0x01db,
+	0x008b, 0xbf02,
+	0x0000, 0x0000,
+	0x0083, 0xc184,
+	0x0003, 0xc084,
+	0x0004, 0xed04,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x00e0, 0x01db,
+	0x0083, 0x408e,
+	0x0003, 0x4f83,
+	0x0003, 0x4190,
+	0x0083, 0x4f4b,
+	0x0083, 0xe0db,
+	0x0083, 0xc0ec,
+	0x0083, 0xc0ea,
+	0x0083, 0xc086,
+	0x001a, 0xb701,
+	0x00e0, 0x01db,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x0020, 0x001c,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x00e0, 0x01db,
+	0x0003, 0xc2bf,
+	0x00e0, 0x01db,
+	0x008a, 0xde02,
+	0x0080, 0x0020,
+	0x008e, 0x8502,
+	0x0000, 0x0012,
+	0x0083, 0xc44d,
+	0x0018, 0x9300,
+	0x0003, 0x0393,
+	0x001b, 0x4f80,
+	0x0083, 0x0380,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x0083, 0xc0b9,
+	0x0083, 0xc7ff,
+	0x0003, 0xc082,
+	0x0024, 0x8507,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x0020, 0x0032,
+	0x000f, 0x8585,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0x49b8,
+	0x0083, 0xc052,
+	0x0003, 0xf3fa,
+	0x0080, 0x003e,
+	0x0018, 0x9600,
+	0x0003, 0x0396,
+	0x0083, 0xf1fa,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x0083, 0x49b8,
+	0x0083, 0xc052,
+	0x0098, 0x5200,
+	0x0083, 0x0352,
+	0x0099, 0xb853,
+	0x0003, 0x03b8,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x00a4, 0x8505,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x0020, 0x004a,
+	0x008f, 0x8587,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x009a, 0x0104,
+	0x0083, 0x03b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00e0, 0x01e4,
+	0x0003, 0xc0e4,
+	0x0018, 0xe400,
+	0x0003, 0x03e4,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0060, 0x01ba,
+	0x0060, 0x01c8,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0397,
+	0x0003, 0xd398,
+	0x0083, 0xd399,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x009f, 0xe40f,
+	0x0017, 0xd703,
+	0x0041, 0x0055,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x008b, 0x8516,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x000b, 0x8512,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x008b, 0x850e,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0004, 0xb60a,
+	0x000b, 0x8509,
+	0x001a, 0x001c,
+	0x0097, 0x03b6,
+	0x0041, 0x0081,
+	0x0097, 0xb64b,
+	0x0041, 0x0081,
+	0x0083, 0xb64b,
+	0x0083, 0xb84c,
+	0x0003, 0x964d,
+	0x001a, 0x000b,
+	0x0097, 0x5203,
+	0x00a1, 0x003e,
+	0x009f, 0x960f,
+	0x0017, 0x03c5,
+	0x0021, 0x0036,
+	0x0083, 0x4cb8,
+	0x0003, 0x4d96,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x00a4, 0x8505,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x0020, 0x0091,
+	0x008f, 0x8584,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0397,
+	0x0003, 0xd398,
+	0x0083, 0xd399,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x001b, 0x57ba,
+	0x0083, 0x03b9,
+	0x009f, 0xd20f,
+	0x0091, 0x0380,
+	0x0083, 0x0380,
+	0x009b, 0x57a3,
+	0x00e0, 0x01b2,
+	0x0083, 0x03ef,
+	0x001b, 0x57a1,
+	0x00e0, 0x01b2,
+	0x0083, 0x03f2,
+	0x009b, 0x57a0,
+	0x00e0, 0x01b2,
+	0x0083, 0x03dc,
+	0x009b, 0x57a5,
+	0x00e0, 0x01b2,
+	0x0083, 0x03f4,
+	0x0083, 0x4a9c,
+	0x0098, 0xea00,
+	0x0083, 0x03ea,
+	0x001f, 0xc80f,
+	0x0097, 0x03ea,
+	0x0041, 0x00f0,
+	0x0084, 0xed0f,
+	0x009a, 0x8086,
+	0x0083, 0x03bf,
+	0x009a, 0x3408,
+	0x00e0, 0x01db,
+	0x001a, 0xb40b,
+	0x00e0, 0x01db,
+	0x0097, 0xbf60,
+	0x0020, 0x00c1,
+	0x0083, 0xbf60,
+	0x0003, 0xc1bf,
+	0x0080, 0x00c2,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x00e0, 0x01db,
+	0x00e0, 0x01e4,
+	0x001b, 0xa555,
+	0x0042, 0x0000,
+	0x0083, 0x03ea,
+	0x009f, 0xc90f,
+	0x0019, 0x03c4,
+	0x0097, 0xea03,
+	0x0041, 0x00d1,
+	0x009f, 0xc90f,
+	0x009e, 0x03c4,
+	0x0097, 0x03ea,
+	0x0041, 0x00d8,
+	0x0080, 0x00df,
+	0x009f, 0xfa0f,
+	0x0097, 0x03f1,
+	0x0020, 0x00df,
+	0x00c1, 0x00dc,
+	0x0018, 0xfa00,
+	0x0003, 0x03fa,
+	0x0080, 0x00df,
+	0x009f, 0xfa0f,
+	0x0017, 0xf303,
+	0x0020, 0x00df,
+	0x00c1, 0x00d5,
+	0x009f, 0xfa0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03fa,
+	0x0083, 0xc0ea,
+	0x001b, 0xa355,
+	0x0003, 0x03e2,
+	0x009e, 0x54c9,
+	0x0017, 0xe203,
+	0x00c1, 0x00ea,
+	0x0084, 0xb90b,
+	0x001f, 0xc10f,
+	0x009e, 0xb903,
+	0x0083, 0x03b9,
+	0x0000, 0x00f0,
+	0x0097, 0x54e2,
+	0x0041, 0x00f0,
+	0x0017, 0xb957,
+	0x00a0, 0x00f0,
+	0x0098, 0xb900,
+	0x0083, 0x03b9,
+	0x009e, 0x55c4,
+	0x0097, 0xb903,
+	0x00c1, 0x00fb,
+	0x0004, 0xff13,
+	0x009f, 0xff0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x0019, 0x03c8,
+	0x0083, 0x03b9,
+	0x0080, 0x0106,
+	0x0099, 0xcc55,
+	0x0097, 0x03b9,
+	0x00c1, 0x0106,
+	0x009f, 0xff0f,
+	0x0097, 0x03c7,
+	0x00c1, 0x0106,
+	0x0018, 0xff00,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x009e, 0x03c8,
+	0x0083, 0x03b9,
+	0x000f, 0xf216,
+	0x001b, 0xa555,
+	0x0017, 0x03c9,
+	0x00c1, 0x0111,
+	0x009b, 0xa755,
+	0x0097, 0x03c8,
+	0x00c1, 0x0111,
+	0x009b, 0xa155,
+	0x0017, 0xc903,
+	0x0041, 0x0119,
+	0x0080, 0x0114,
+	0x009b, 0xa155,
+	0x0017, 0x5603,
+	0x0041, 0x0119,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0003, 0x0344,
+	0x0003, 0xc243,
+	0x0000, 0x0120,
+	0x0083, 0xd344,
+	0x0083, 0xc043,
+	0x0000, 0x0120,
+	0x009b, 0xa155,
+	0x0097, 0xc103,
+	0x0041, 0x0119,
+	0x0080, 0x0114,
+	0x008f, 0xf40a,
+	0x001b, 0xa555,
+	0x0097, 0x5403,
+	0x0041, 0x0129,
+	0x001e, 0x44cc,
+	0x0003, 0x0344,
+	0x0091, 0x43cc,
+	0x0083, 0x0343,
+	0x0080, 0x012e,
+	0x0080, 0x012e,
+	0x001b, 0xa555,
+	0x0017, 0xc503,
+	0x0041, 0x0129,
+	0x0080, 0x0124,
+	0x001b, 0xa055,
+	0x0097, 0xc803,
+	0x00c1, 0x0136,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0345,
+	0x0083, 0xc242,
+	0x0080, 0x0142,
+	0x0003, 0xd345,
+	0x0003, 0xc042,
+	0x008f, 0xdc0a,
+	0x0097, 0xc103,
+	0x00c1, 0x0142,
+	0x001b, 0xa055,
+	0x0017, 0xc003,
+	0x00c1, 0x0142,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0345,
+	0x0083, 0xc242,
+	0x0003, 0xd346,
+	0x0003, 0xc047,
+	0x008f, 0xa70a,
+	0x009b, 0xa755,
+	0x0017, 0xc903,
+	0x00c1, 0x014d,
+	0x001e, 0x46c8,
+	0x0083, 0x0346,
+	0x0091, 0x47c8,
+	0x0003, 0x0347,
+	0x0000, 0x0152,
+	0x0000, 0x0152,
+	0x009b, 0xa755,
+	0x0097, 0xc103,
+	0x00c1, 0x014d,
+	0x0080, 0x0148,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0x9e9f,
+	0x009f, 0xd20f,
+	0x0091, 0x0345,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0011, 0x0344,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0091, 0x0346,
+	0x0003, 0x0399,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0088, 0xde24,
+	0x0000, 0x0167,
+	0x0000, 0x0006,
+	0x001a, 0x000d,
+	0x009e, 0x8303,
+	0x0083, 0x0383,
+	0x0003, 0xcc4b,
+	0x009c, 0x58e5,
+	0x0003, 0x034d,
+	0x009e, 0x834b,
+	0x0083, 0x0383,
+	0x001c, 0x4bc1,
+	0x0003, 0x034b,
+	0x0017, 0x4b4d,
+	0x0020, 0x0177,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0000, 0x016d,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0091, 0x834b,
+	0x0083, 0x0383,
+	0x009d, 0x4bc1,
+	0x0003, 0x034b,
+	0x0017, 0x4bc9,
+	0x0020, 0x0184,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0000, 0x017a,
+	0x001a, 0x001f,
+	0x0091, 0x8303,
+	0x0083, 0x0383,
+	0x0080, 0x018b,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0091, 0x40ca,
+	0x0011, 0x5c03,
+	0x0003, 0x038e,
+	0x001e, 0x41c5,
+	0x001e, 0x0348,
+	0x0003, 0x0390,
+	0x001f, 0xc80f,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x009f, 0xd20f,
+	0x0011, 0x0342,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0091, 0x0343,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0011, 0x0347,
+	0x0003, 0x0399,
+	0x0060, 0x01ba,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x0083, 0x408e,
+	0x0003, 0x4190,
+	0x001a, 0x0025,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x0060, 0x01c8,
+	0x0098, 0xec00,
+	0x0083, 0x03ec,
+	0x009a, 0x0050,
+	0x0097, 0x03ec,
+	0x0041, 0x01b0,
+	0x0003, 0x5886,
+	0x0003, 0xc0db,
+	0x000b, 0x85ca,
+	0x0000, 0x00a3,
+	0x00ae, 0x8005,
+	0x000f, 0x0303,
+	0x001e, 0x035f,
+	0x00e1, 0x0000,
+	0x0099, 0x5f03,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcbf9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc1b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xcff9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc2b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd5b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcef9,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf85,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0093, 0x0000,
+	0x001f, 0x8761,
+	0x0003, 0x03f6,
+	0x009a, 0x0170,
+	0x001e, 0x03f6,
+	0x0003, 0x03f6,
+	0x0017, 0xd103,
+	0x00c1, 0x01ee,
+	0x0083, 0xd1fb,
+	0x0080, 0x01f5,
+	0x001a, 0x0094,
+	0x0017, 0xf603,
+	0x0041, 0x01f4,
+	0x001a, 0x0094,
+	0x0083, 0x03fb,
+	0x0080, 0x01f5,
+	0x0083, 0xf6fb,
+	0x009a, 0x00e7,
+	0x0017, 0x03f6,
+	0x0041, 0x01fd,
+	0x001a, 0x00ec,
+	0x0017, 0x03f6,
+	0x0041, 0x01fe,
+	0x0003, 0xeb81,
+	0x0000, 0x01fe,
+	0x0003, 0xe781,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+}, {
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x009a, 0xb616,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf86,
+	0x000a, 0xbf02,
+	0x0080, 0x0007,
+	0x0004, 0xed04,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x0060, 0x0123,
+	0x0083, 0x408e,
+	0x0003, 0x4190,
+	0x0083, 0xc184,
+	0x0083, 0x4f4b,
+	0x0003, 0xccfc,
+	0x0003, 0xc0e1,
+	0x0018, 0x9300,
+	0x0003, 0x0393,
+	0x0003, 0xc084,
+	0x0083, 0xc086,
+	0x0003, 0x4f83,
+	0x0083, 0xe0db,
+	0x001a, 0xb701,
+	0x0060, 0x0123,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x0020, 0x002a,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x0060, 0x0123,
+	0x0003, 0xc2bf,
+	0x0060, 0x0123,
+	0x008a, 0xde02,
+	0x0000, 0x002e,
+	0x008e, 0x8502,
+	0x0080, 0x0020,
+	0x0093, 0x0000,
+	0x001f, 0x8761,
+	0x0003, 0x03f6,
+	0x009a, 0x0170,
+	0x001e, 0x03f6,
+	0x0003, 0x03f6,
+	0x0017, 0xd103,
+	0x00c1, 0x0038,
+	0x0083, 0xd1fb,
+	0x0000, 0x003f,
+	0x001a, 0x0094,
+	0x0017, 0xf603,
+	0x00c1, 0x003e,
+	0x001a, 0x0094,
+	0x0083, 0x03fb,
+	0x0000, 0x003f,
+	0x0083, 0xf6fb,
+	0x0091, 0xc951,
+	0x0083, 0x0391,
+	0x001b, 0x4f80,
+	0x0083, 0x0380,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x0083, 0x49b8,
+	0x0083, 0xc0b9,
+	0x0083, 0xc7ff,
+	0x009f, 0xcc0f,
+	0x0099, 0x03c9,
+	0x0003, 0x039a,
+	0x0003, 0xc096,
+	0x0003, 0xc04d,
+	0x0003, 0xc082,
+	0x0024, 0xde03,
+	0x0042, 0x0000,
+	0x00a4, 0x8581,
+	0x0080, 0x0058,
+	0x0018, 0x9600,
+	0x0003, 0x0396,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x0003, 0xf3fa,
+	0x0008, 0x9302,
+	0x0083, 0xf1fa,
+	0x0011, 0x5149,
+	0x0003, 0x03b8,
+	0x0083, 0xc052,
+	0x009f, 0x960f,
+	0x0017, 0x03c0,
+	0x0021, 0x0065,
+	0x009f, 0xcc0f,
+	0x0099, 0x03c5,
+	0x0003, 0x03fc,
+	0x0080, 0x0076,
+	0x009f, 0x960f,
+	0x0097, 0x03c1,
+	0x0021, 0x006c,
+	0x009f, 0xcc0f,
+	0x0099, 0x03c5,
+	0x0003, 0x03fc,
+	0x0080, 0x0076,
+	0x009f, 0x960f,
+	0x0097, 0x03c2,
+	0x00a1, 0x0073,
+	0x009f, 0xcc0f,
+	0x0019, 0x03c1,
+	0x0003, 0x03fc,
+	0x0080, 0x0076,
+	0x009f, 0xcc0f,
+	0x0019, 0x03c1,
+	0x0003, 0x03fc,
+	0x0098, 0x5200,
+	0x0083, 0x0352,
+	0x0099, 0xb853,
+	0x0003, 0x03b8,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x00a4, 0x8505,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x00a0, 0x0082,
+	0x008f, 0x8587,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x009a, 0x0104,
+	0x0083, 0x03b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc0e4,
+	0x0018, 0xe400,
+	0x0003, 0x03e4,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0083, 0xcbf9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc1b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xcff9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc2b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd5b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcef9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0397,
+	0x0003, 0xd398,
+	0x0083, 0xd399,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x009f, 0xe40f,
+	0x0017, 0xd703,
+	0x00c1, 0x008c,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x000b, 0x8517,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x008b, 0x8513,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x000b, 0x850f,
+	0x0083, 0x5089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0084, 0xb60b,
+	0x000b, 0x850a,
+	0x001a, 0x001c,
+	0x0097, 0x03b6,
+	0x00c1, 0x00d6,
+	0x0097, 0xb64b,
+	0x00c1, 0x00d6,
+	0x0083, 0xb64b,
+	0x0083, 0xb84c,
+	0x0003, 0x964d,
+	0x0003, 0xfc4e,
+	0x0018, 0xe100,
+	0x0003, 0x03e1,
+	0x0003, 0xc0e2,
+	0x001f, 0xc80f,
+	0x0099, 0xc303,
+	0x0097, 0x5203,
+	0x00a1, 0x0076,
+	0x009f, 0x960f,
+	0x0017, 0x03c3,
+	0x0021, 0x0053,
+	0x0003, 0x4d96,
+	0x0011, 0x4c51,
+	0x0003, 0x03b8,
+	0x0003, 0x4efc,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x00a4, 0x8505,
+	0x001b, 0x57ba,
+	0x0097, 0x5703,
+	0x0020, 0x00ec,
+	0x008f, 0x8584,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0397,
+	0x0003, 0xd398,
+	0x0083, 0xd399,
+	0x009a, 0x0104,
+	0x0083, 0x03b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x0011, 0x51ae,
+	0x0083, 0x03ae,
+	0x0083, 0xc086,
+	0x0003, 0xc04d,
+	0x001b, 0x57ba,
+	0x0083, 0x03b9,
+	0x009f, 0xd20f,
+	0x0091, 0x0380,
+	0x0083, 0x0380,
+	0x0003, 0xc0f5,
+	0x0003, 0x554b,
+	0x009a, 0x00b2,
+	0x0017, 0xf603,
+	0x00c1, 0x0112,
+	0x001a, 0x0040,
+	0x0003, 0x03f5,
+	0x0099, 0x034b,
+	0x001c, 0x4bc8,
+	0x001c, 0x03c4,
+	0x0099, 0x0355,
+	0x0000, 0x0115,
+	0x001c, 0x4bc8,
+	0x009c, 0x03c3,
+	0x0099, 0x0355,
+	0x0003, 0x034b,
+	0x009a, 0x0028,
+	0x0003, 0x03e7,
+	0x0003, 0xc99a,
+	0x0083, 0xc55e,
+	0x0083, 0xc0ec,
+	0x0003, 0xc494,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf85,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+}, {
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc0e8,
+	0x0000, 0x000f,
+	0x00ae, 0x8005,
+	0x000f, 0x0303,
+	0x001e, 0x035f,
+	0x00e1, 0x0000,
+	0x0099, 0x5f03,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x00a8, 0xe80d,
+	0x001a, 0xb701,
+	0x00e0, 0x01f0,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x00a0, 0x001b,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x00e0, 0x01f0,
+	0x0003, 0xc2bf,
+	0x00e0, 0x01f0,
+	0x0080, 0x001c,
+	0x0083, 0xc1e8,
+	0x009b, 0x57a3,
+	0x00e0, 0x0008,
+	0x0083, 0x03ef,
+	0x001b, 0x57a2,
+	0x00e0, 0x0008,
+	0x0003, 0x03f0,
+	0x001b, 0x57a1,
+	0x00e0, 0x0008,
+	0x0083, 0x03f2,
+	0x009b, 0x57a0,
+	0x00e0, 0x0008,
+	0x0083, 0x03dc,
+	0x009b, 0x57a5,
+	0x00e0, 0x0008,
+	0x0083, 0x03f4,
+	0x0083, 0x4a9c,
+	0x0098, 0xea00,
+	0x0083, 0x03ea,
+	0x001f, 0xc80f,
+	0x0097, 0x03ea,
+	0x0041, 0x0108,
+	0x0084, 0xed0f,
+	0x009a, 0x8086,
+	0x0083, 0x03bf,
+	0x009a, 0x3408,
+	0x00e0, 0x01f0,
+	0x001a, 0xb40b,
+	0x00e0, 0x01f0,
+	0x0097, 0xbf60,
+	0x0020, 0x003d,
+	0x0083, 0xbf60,
+	0x0003, 0xc1bf,
+	0x0080, 0x003e,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x00e0, 0x01f0,
+	0x0093, 0x0000,
+	0x001f, 0x8761,
+	0x0003, 0x03f6,
+	0x009a, 0x0170,
+	0x001e, 0x03f6,
+	0x0003, 0x03f6,
+	0x0017, 0xd103,
+	0x00c1, 0x004a,
+	0x0083, 0xd1fb,
+	0x0080, 0x0051,
+	0x001a, 0x0094,
+	0x0017, 0xf603,
+	0x0041, 0x0050,
+	0x001a, 0x0094,
+	0x0083, 0x03fb,
+	0x0080, 0x0051,
+	0x0083, 0xf6fb,
+	0x009a, 0x00d4,
+	0x0017, 0x03f6,
+	0x0041, 0x005c,
+	0x001a, 0x00dc,
+	0x0017, 0x03f6,
+	0x0041, 0x005f,
+	0x0083, 0xb1fe,
+	0x0003, 0xcdf1,
+	0x001a, 0x0040,
+	0x0003, 0x03f5,
+	0x0000, 0x005f,
+	0x0083, 0xc3fe,
+	0x0083, 0xebf1,
+	0x0003, 0xc0f5,
+	0x009b, 0xa155,
+	0x0083, 0x03ea,
+	0x009f, 0xc90f,
+	0x0019, 0x03c4,
+	0x0097, 0xea03,
+	0x0041, 0x0093,
+	0x001f, 0xc80f,
+	0x0019, 0x03c2,
+	0x0097, 0xea03,
+	0x00c1, 0x006d,
+	0x000f, 0xa82a,
+	0x009b, 0xa755,
+	0x0097, 0x03c8,
+	0x0041, 0x0074,
+	0x009b, 0xa855,
+	0x0083, 0x03ea,
+	0x008f, 0xa824,
+	0x001f, 0xc80f,
+	0x0099, 0x03c3,
+	0x0097, 0x03ea,
+	0x0041, 0x0093,
+	0x009f, 0xcc0f,
+	0x0019, 0x03c1,
+	0x0017, 0x03fc,
+	0x0041, 0x007b,
+	0x009f, 0xfc0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03fc,
+	0x009b, 0xa855,
+	0x0083, 0x03ea,
+	0x009b, 0xa755,
+	0x0019, 0x03c8,
+	0x0097, 0xea03,
+	0x00c1, 0x00a4,
+	0x009b, 0xa755,
+	0x0017, 0x03c5,
+	0x0041, 0x0088,
+	0x000f, 0xa820,
+	0x009b, 0xa855,
+	0x0097, 0xc403,
+	0x00c1, 0x00a4,
+	0x009e, 0xf14d,
+	0x0017, 0xfa03,
+	0x0020, 0x00bc,
+	0x00c1, 0x008f,
+	0x0018, 0xfa00,
+	0x0003, 0x03fa,
+	0x0080, 0x00bc,
+	0x009f, 0xfa0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03fa,
+	0x0080, 0x00bc,
+	0x001b, 0xa055,
+	0x0097, 0xc403,
+	0x00c1, 0x009b,
+	0x0017, 0x03c6,
+	0x0041, 0x0099,
+	0x0080, 0x009d,
+	0x0003, 0xc75e,
+	0x0080, 0x009d,
+	0x0083, 0xc55e,
+	0x0080, 0x009d,
+	0x009f, 0xcc0f,
+	0x0019, 0x035e,
+	0x0017, 0xfc03,
+	0x0020, 0x00a4,
+	0x00c1, 0x00ab,
+	0x0018, 0xfc00,
+	0x0003, 0x03fc,
+	0x009f, 0xfa0f,
+	0x0017, 0xf303,
+	0x0041, 0x00af,
+	0x009f, 0xfa0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03fa,
+	0x0080, 0x00bc,
+	0x009f, 0xfc0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03fc,
+	0x0080, 0x00a4,
+	0x000f, 0xa804,
+	0x0018, 0xfa00,
+	0x0003, 0x03fa,
+	0x0080, 0x00bc,
+	0x009b, 0xa855,
+	0x0083, 0x03ea,
+	0x009f, 0xc60f,
+	0x0097, 0x03ea,
+	0x00c1, 0x00bc,
+	0x0004, 0xfa04,
+	0x009f, 0xfa0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03fa,
+	0x009b, 0xa755,
+	0x0097, 0x03c4,
+	0x00c1, 0x00ce,
+	0x001b, 0xa655,
+	0x0097, 0x03c4,
+	0x00c1, 0x00ce,
+	0x009b, 0xa255,
+	0x0097, 0x5b03,
+	0x00c1, 0x00ce,
+	0x009b, 0xa855,
+	0x0097, 0x5b03,
+	0x00c1, 0x00ce,
+	0x009f, 0x4d0f,
+	0x0017, 0x03c6,
+	0x0041, 0x00d1,
+	0x0018, 0x4d00,
+	0x0003, 0x034d,
+	0x0000, 0x00d1,
+	0x0084, 0x4d03,
+	0x009e, 0x4dc1,
+	0x0003, 0x034d,
+	0x0083, 0xc0ea,
+	0x001b, 0xa355,
+	0x0003, 0x03e2,
+	0x009e, 0x54c9,
+	0x0017, 0xe203,
+	0x0041, 0x00de,
+	0x001f, 0xc20f,
+	0x0097, 0x03b9,
+	0x00c1, 0x00e6,
+	0x001f, 0xc20f,
+	0x009e, 0xb903,
+	0x0083, 0x03b9,
+	0x0080, 0x00e6,
+	0x0097, 0x54e2,
+	0x00c1, 0x00e6,
+	0x001e, 0x57c2,
+	0x0097, 0xb903,
+	0x0020, 0x00e6,
+	0x001f, 0xc20f,
+	0x0019, 0xb903,
+	0x0083, 0x03b9,
+	0x0019, 0x4bb9,
+	0x0003, 0x034b,
+	0x009d, 0x4bc8,
+	0x001d, 0x03c3,
+	0x0083, 0x03e9,
+	0x001e, 0x4b03,
+	0x0003, 0x034b,
+	0x0099, 0xf555,
+	0x0097, 0xe903,
+	0x0041, 0x00fa,
+	0x0084, 0xff18,
+	0x009f, 0xff0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x0019, 0x03c8,
+	0x0083, 0x03b9,
+	0x0019, 0x4b58,
+	0x0003, 0x034b,
+	0x0000, 0x0108,
+	0x009a, 0x009f,
+	0x0099, 0x03f5,
+	0x0097, 0x03e9,
+	0x0041, 0x0108,
+	0x009f, 0xff0f,
+	0x0097, 0x03c7,
+	0x0041, 0x0108,
+	0x0018, 0xff00,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x009e, 0x03c8,
+	0x0083, 0x03b9,
+	0x009e, 0x4b58,
+	0x0003, 0x034b,
+	0x009b, 0xa855,
+	0x0083, 0x03e3,
+	0x009a, 0x000a,
+	0x0097, 0x03e3,
+	0x00c1, 0x010f,
+	0x0083, 0xc8e7,
+	0x0080, 0x0114,
+	0x0003, 0xcfe7,
+	0x009b, 0xa255,
+	0x0017, 0xc903,
+	0x00c1, 0x0114,
+	0x0003, 0xcce7,
+	0x008f, 0xf20c,
+	0x009b, 0xa155,
+	0x0017, 0xe703,
+	0x00c1, 0x011d,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0003, 0x0344,
+	0x0003, 0xc243,
+	0x0080, 0x0124,
+	0x0083, 0xd344,
+	0x0083, 0xc043,
+	0x0080, 0x0124,
+	0x009b, 0xa155,
+	0x0097, 0xc103,
+	0x00c1, 0x011d,
+	0x0080, 0x0118,
+	0x000f, 0xa702,
+	0x0000, 0x012f,
+	0x000f, 0xa802,
+	0x0000, 0x012f,
+	0x009b, 0xa855,
+	0x0017, 0x03c6,
+	0x0041, 0x012f,
+	0x008f, 0xf40a,
+	0x001b, 0xa555,
+	0x0097, 0xc103,
+	0x0041, 0x0134,
+	0x001e, 0x44cc,
+	0x0003, 0x0344,
+	0x0091, 0x43cc,
+	0x0083, 0x0343,
+	0x0080, 0x0139,
+	0x0080, 0x0139,
+	0x001b, 0xa555,
+	0x0097, 0xc803,
+	0x0041, 0x0134,
+	0x0000, 0x012f,
+	0x001b, 0xa055,
+	0x0097, 0xc803,
+	0x00c1, 0x0141,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0345,
+	0x0083, 0xc242,
+	0x0080, 0x014d,
+	0x0003, 0xd345,
+	0x0003, 0xc042,
+	0x008f, 0xdc0a,
+	0x0097, 0xc103,
+	0x00c1, 0x014d,
+	0x001b, 0xa055,
+	0x0017, 0xc003,
+	0x00c1, 0x014d,
+	0x001f, 0xc20f,
+	0x009e, 0xd303,
+	0x0083, 0x0345,
+	0x0083, 0xc242,
+	0x0003, 0xcfe1,
+	0x009b, 0xa755,
+	0x0017, 0x03c5,
+	0x00c1, 0x0156,
+	0x000f, 0xa804,
+	0x009b, 0xa855,
+	0x0017, 0x03c5,
+	0x00c1, 0x0156,
+	0x0003, 0xc0e1,
+	0x001f, 0xc40f,
+	0x001e, 0x5a03,
+	0x0097, 0x039e,
+	0x00c1, 0x0160,
+	0x009b, 0xa155,
+	0x0097, 0xcd03,
+	0x0041, 0x015e,
+	0x0080, 0x0160,
+	0x0099, 0x5ac0,
+	0x0003, 0x03e1,
+	0x008f, 0xf00b,
+	0x009b, 0xa255,
+	0x0017, 0xe103,
+	0x00c1, 0x0169,
+	0x001e, 0x45c8,
+	0x0083, 0x0345,
+	0x0091, 0x42c8,
+	0x0003, 0x0342,
+	0x0080, 0x016f,
+	0x0042, 0x0000,
+	0x0080, 0x016f,
+	0x009b, 0xa255,
+	0x0097, 0xc103,
+	0x00c1, 0x0169,
+	0x0000, 0x0164,
+	0x0003, 0xd346,
+	0x0003, 0xc047,
+	0x008f, 0xa70a,
+	0x009b, 0xa755,
+	0x0097, 0xce03,
+	0x0041, 0x017a,
+	0x001e, 0x46c8,
+	0x0083, 0x0346,
+	0x0091, 0x47c8,
+	0x0003, 0x0347,
+	0x0000, 0x017f,
+	0x0000, 0x017f,
+	0x009b, 0xa755,
+	0x0097, 0xc103,
+	0x0041, 0x017a,
+	0x0000, 0x0175,
+	0x000f, 0xa60a,
+	0x001b, 0xa655,
+	0x0097, 0xce03,
+	0x00c1, 0x0188,
+	0x001e, 0x46c2,
+	0x0083, 0x0346,
+	0x0091, 0x47c2,
+	0x0003, 0x0347,
+	0x0080, 0x018d,
+	0x0080, 0x018d,
+	0x001b, 0xa655,
+	0x0097, 0xc103,
+	0x00c1, 0x0188,
+	0x0000, 0x0183,
+	0x009f, 0xd20f,
+	0x0091, 0x0345,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0011, 0x0344,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0091, 0x0346,
+	0x0003, 0x0399,
+	0x0083, 0xc0df,
+	0x0098, 0xdf00,
+	0x0083, 0x03df,
+	0x001a, 0x0070,
+	0x0097, 0x03df,
+	0x0041, 0x0197,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0091, 0x40ca,
+	0x0011, 0x5c03,
+	0x0003, 0x038e,
+	0x001e, 0x41c5,
+	0x001e, 0x0348,
+	0x0003, 0x0390,
+	0x0091, 0x40ca,
+	0x001e, 0x0348,
+	0x009e, 0x0358,
+	0x0083, 0x038f,
+	0x001f, 0xc80f,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x0080, 0x01af,
+	0x0000, 0x000f,
+	0x009f, 0xd20f,
+	0x0011, 0x0342,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0091, 0x0343,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0011, 0x0347,
+	0x0003, 0x0399,
+	0x0083, 0xcbf9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc1b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x001e, 0x4058,
+	0x009e, 0x0358,
+	0x0003, 0x038e,
+	0x0003, 0x4190,
+	0x0099, 0x4058,
+	0x0083, 0x038f,
+	0x009f, 0xc50f,
+	0x0099, 0x03cc,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x0003, 0xcff9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc2b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd5b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcef9,
+	0x0098, 0xec00,
+	0x0083, 0x03ec,
+	0x009a, 0x0050,
+	0x0097, 0x03ec,
+	0x0041, 0x01e5,
+	0x0003, 0x5886,
+	0x0003, 0xc0db,
+	0x001f, 0xef0f,
+	0x0017, 0x03d7,
+	0x0041, 0x01ea,
+	0x008b, 0x8502,
+	0x0000, 0x01ae,
+	0x0083, 0xc394,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf85,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000
+}, {
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x009a, 0xb616,
+	0x0060, 0x00ee,
+	0x008d, 0xbf02,
+	0x0080, 0x0007,
+	0x0083, 0xc0e0,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0008, 0xe384,
+	0x0003, 0xc095,
+	0x0083, 0xc184,
+	0x0003, 0xc084,
+	0x0083, 0xd1b9,
+	0x0083, 0xc7ff,
+	0x0003, 0xc082,
+	0x003a, 0x000a,
+	0x0003, 0x03fa,
+	0x0003, 0x4190,
+	0x0003, 0x4f83,
+	0x0083, 0x408e,
+	0x0004, 0xed04,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x0060, 0x00ee,
+	0x0083, 0xc086,
+	0x001a, 0xb701,
+	0x0060, 0x00ee,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x0020, 0x002a,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x0060, 0x00ee,
+	0x0003, 0xc2bf,
+	0x0060, 0x00ee,
+	0x008a, 0xde02,
+	0x0000, 0x002e,
+	0x008e, 0x8502,
+	0x0080, 0x0020,
+	0x0018, 0x9300,
+	0x0003, 0x0393,
+	0x00fa, 0x8040,
+	0x0091, 0x03c1,
+	0x0091, 0x0380,
+	0x0083, 0x0380,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x0083, 0xd1b9,
+	0x0083, 0xc7ff,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00ba, 0x0117,
+	0x0083, 0x03bf,
+	0x003a, 0x3b80,
+	0x0060, 0x00ee,
+	0x0083, 0xc182,
+	0x009a, 0x0104,
+	0x0083, 0x03b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x001f, 0xf80f,
+	0x0011, 0x03d2,
+	0x0083, 0x03f8,
+	0x0000, 0x004b,
+	0x0080, 0x0010,
+	0x0083, 0xc0e3,
+	0x0003, 0x618c,
+	0x0083, 0x628d,
+	0x00ba, 0x0010,
+	0x0083, 0x03e0,
+	0x0003, 0xe171,
+	0x009f, 0x710f,
+	0x009b, 0x03cd,
+	0x0003, 0x0371,
+	0x00e0, 0x0114,
+	0x0060, 0x0123,
+	0x00e0, 0x0171,
+	0x0003, 0xc074,
+	0x0060, 0x01ae,
+	0x0003, 0xc0e7,
+	0x0003, 0xc0e8,
+	0x0098, 0xe600,
+	0x0083, 0x03e6,
+	0x003a, 0x0011,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x00ac, 0xda02,
+	0x002a, 0xda0a,
+	0x0008, 0x8605,
+	0x0060, 0x0125,
+	0x0060, 0x01ae,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0060, 0x0173,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0080, 0x005d,
+	0x003a, 0x0012,
+	0x0083, 0x03e0,
+	0x0011, 0x7274,
+	0x0082, 0x0f74,
+	0x00ba, 0xdc74,
+	0x005a, 0x0257,
+	0x0083, 0x0375,
+	0x00ba, 0x0020,
+	0x0083, 0x03e0,
+	0x0060, 0x0123,
+	0x00e0, 0x0171,
+	0x0060, 0x01b9,
+	0x0060, 0x01ae,
+	0x003a, 0x0021,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x0029, 0x86b1,
+	0x00ac, 0xda02,
+	0x002a, 0xda0a,
+	0x00ba, 0x0023,
+	0x0083, 0x03e0,
+	0x0088, 0x8602,
+	0x0000, 0x0093,
+	0x00ba, 0x002c,
+	0x0083, 0x03e0,
+	0x0060, 0x0173,
+	0x0083, 0x7273,
+	0x0000, 0x0078,
+	0x003a, 0x0024,
+	0x0083, 0x03e0,
+	0x009e, 0x7072,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002b, 0x0322,
+	0x0097, 0x7f72,
+	0x0020, 0x00ae,
+	0x0011, 0x7274,
+	0x0082, 0x0f74,
+	0x0060, 0x01b9,
+	0x0000, 0x007e,
+	0x0083, 0x7072,
+	0x0060, 0x017a,
+	0x003a, 0x0027,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x00a9, 0x86ce,
+	0x00ac, 0xda02,
+	0x002a, 0xda14,
+	0x003a, 0x0028,
+	0x0083, 0x03e0,
+	0x001f, 0x750f,
+	0x0017, 0x0366,
+	0x00c1, 0x00a8,
+	0x00ba, 0x0029,
+	0x0083, 0x03e0,
+	0x0003, 0x71e8,
+	0x0060, 0x0125,
+	0x0083, 0x7372,
+	0x0060, 0x0173,
+	0x0060, 0x01ae,
+	0x0000, 0x0078,
+	0x0003, 0x7471,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x71e1,
+	0x00e0, 0x0114,
+	0x0000, 0x00a0,
+	0x0080, 0x00b0,
+	0x0080, 0x004a,
+	0x003a, 0x0030,
+	0x0083, 0x03e0,
+	0x0003, 0x678c,
+	0x001b, 0x7271,
+	0x0020, 0x00b9,
+	0x0083, 0x7270,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00e0, 0x013c,
+	0x0060, 0x01b9,
+	0x0060, 0x01ad,
+	0x00ba, 0x0031,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x00a9, 0x868f,
+	0x00ac, 0xda02,
+	0x00aa, 0xda08,
+	0x0060, 0x0173,
+	0x00ba, 0x0034,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x0029, 0x8696,
+	0x00ac, 0xda85,
+	0x00aa, 0xda97,
+	0x0008, 0x868d,
+	0x0083, 0xc08a,
+	0x003a, 0x0041,
+	0x0083, 0x03e0,
+	0x001f, 0x700f,
+	0x001c, 0x03c4,
+	0x0011, 0x0372,
+	0x0003, 0x03e4,
+	0x003a, 0x0088,
+	0x0017, 0x03e4,
+	0x00a0, 0x00e7,
+	0x0028, 0xe3a4,
+	0x0003, 0xc2e3,
+	0x0000, 0x00d8,
+	0x0003, 0xc07e,
+	0x0080, 0x00da,
+	0x00a4, 0x860a,
+	0x0080, 0x00d6,
+	0x00ac, 0xda02,
+	0x0000, 0x00ca,
+	0x003a, 0x0009,
+	0x0099, 0x037e,
+	0x0082, 0x0f7e,
+	0x0017, 0x7ee2,
+	0x0041, 0x00e2,
+	0x0080, 0x00da,
+	0x0003, 0xc1e3,
+	0x00ba, 0x1000,
+	0x0011, 0x0395,
+	0x0003, 0x0395,
+	0x0000, 0x00ca,
+	0x0003, 0xc794,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf85,
+	0x0028, 0xe54c,
+	0x00a9, 0xe575,
+	0x001f, 0xe50f,
+	0x009d, 0x03c2,
+	0x00a8, 0x0375,
+	0x0029, 0x0375,
+	0x001f, 0xe50f,
+	0x009d, 0x03c4,
+	0x00a8, 0x0373,
+	0x0029, 0x0373,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc0da,
+	0x0003, 0x6489,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0x7dda,
+	0x0083, 0x6589,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0019, 0x6465,
+	0x009b, 0x034f,
+	0x0099, 0x03c9,
+	0x0019, 0x03c8,
+	0x0019, 0x0375,
+	0x0002, 0x0f75,
+	0x00e1, 0x0000,
+	0x00a8, 0xe3e1,
+	0x003a, 0xbada,
+	0x0083, 0x03e0,
+	0x0000, 0x0110,
+	0x009f, 0x710f,
+	0x009d, 0x03c2,
+	0x00a9, 0x0305,
+	0x0028, 0x0306,
+	0x0029, 0x7107,
+	0x00a8, 0x7108,
+	0x0000, 0x0110,
+	0x0003, 0xc87f,
+	0x00e1, 0x0000,
+	0x0003, 0xc47f,
+	0x00e1, 0x0000,
+	0x0003, 0xc27f,
+	0x00e1, 0x0000,
+	0x0003, 0xc17f,
+	0x00e1, 0x0000,
+	0x0003, 0x7f70,
+	0x0080, 0x013c,
+	0x001f, 0x700f,
+	0x009d, 0x03c2,
+	0x00a9, 0x030a,
+	0x00a8, 0x030e,
+	0x00a9, 0x7010,
+	0x0028, 0x7002,
+	0x0000, 0x0110,
+	0x009f, 0x710f,
+	0x009d, 0x03c2,
+	0x0009, 0x0303,
+	0x0003, 0xc870,
+	0x0080, 0x013c,
+	0x009f, 0x710f,
+	0x009d, 0x03c2,
+	0x0088, 0x0303,
+	0x0003, 0xc470,
+	0x0080, 0x013c,
+	0x0009, 0x7103,
+	0x0003, 0xc270,
+	0x0080, 0x013c,
+	0x0088, 0x718d,
+	0x0003, 0xc170,
+	0x0080, 0x013c,
+	0x0003, 0xc1e5,
+	0x0083, 0xc0bf,
+	0x003a, 0x0018,
+	0x0000, 0x00ee,
+	0x0083, 0xc0e5,
+	0x001f, 0xf70f,
+	0x001b, 0x0377,
+	0x0002, 0x0f7a,
+	0x001f, 0x700f,
+	0x009d, 0x03c2,
+	0x00a9, 0x0305,
+	0x00a8, 0x0308,
+	0x00a9, 0x700d,
+	0x00a8, 0x7012,
+	0x0000, 0x0110,
+	0x001f, 0x7a0f,
+	0x0083, 0x03f7,
+	0x0003, 0xc378,
+	0x0000, 0x0161,
+	0x001f, 0xc10f,
+	0x001c, 0x03c4,
+	0x0091, 0x037a,
+	0x0083, 0x03f7,
+	0x0003, 0xc378,
+	0x0000, 0x0161,
+	0x001f, 0xc20f,
+	0x001c, 0x03c4,
+	0x0091, 0x037a,
+	0x0083, 0x03f7,
+	0x0083, 0xc778,
+	0x0000, 0x0161,
+	0x009f, 0xc30f,
+	0x001c, 0x03c4,
+	0x0091, 0x037a,
+	0x0083, 0x03f7,
+	0x0083, 0xc778,
+	0x0000, 0x0161,
+	0x001f, 0xf80f,
+	0x009b, 0x0376,
+	0x0011, 0x0378,
+	0x0083, 0x03f8,
+	0x0003, 0xc2e5,
+	0x003a, 0x0022,
+	0x0083, 0x03bf,
+	0x003a, 0x0018,
+	0x0000, 0x00ee,
+	0x0083, 0xc0e5,
+	0x00e1, 0x0000,
+	0x0000, 0x00ee,
+	0x0080, 0x017e,
+	0x0080, 0x0181,
+	0x0000, 0x01a8,
+	0x0000, 0x01ab,
+	0x0083, 0xc872,
+	0x0000, 0x017a,
+	0x009f, 0x720f,
+	0x001c, 0x03c4,
+	0x0011, 0x0372,
+	0x009d, 0x03c1,
+	0x009b, 0x03cd,
+	0x0082, 0x0f72,
+	0x0000, 0x017a,
+	0x0003, 0xc4e5,
+	0x0083, 0xc0bf,
+	0x00ba, 0x0015,
+	0x0080, 0x016c,
+	0x0003, 0xc8e5,
+	0x00ba, 0x0016,
+	0x0080, 0x016c,
+	0x0083, 0xc0e5,
+	0x001f, 0xf70f,
+	0x009b, 0x0376,
+	0x0002, 0x0f7c,
+	0x009f, 0x720f,
+	0x009d, 0x03c2,
+	0x0029, 0x0304,
+	0x0028, 0x0306,
+	0x00a9, 0x7209,
+	0x0028, 0x720c,
+	0x0003, 0x7cf7,
+	0x0003, 0xc37b,
+	0x0080, 0x019a,
+	0x0011, 0x7cc1,
+	0x0083, 0x03f7,
+	0x0003, 0xc37b,
+	0x0080, 0x019a,
+	0x0011, 0x7cc2,
+	0x0083, 0x03f7,
+	0x0083, 0xc77b,
+	0x0080, 0x019a,
+	0x0091, 0x7cc3,
+	0x0083, 0x03f7,
+	0x0083, 0xc77b,
+	0x0080, 0x019a,
+	0x009f, 0x810f,
+	0x009b, 0x0376,
+	0x0011, 0x037b,
+	0x0003, 0x0381,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x0083, 0xc9e5,
+	0x003a, 0x0022,
+	0x0083, 0x03bf,
+	0x00ba, 0x0015,
+	0x0080, 0x016c,
+	0x0083, 0xcce5,
+	0x00ba, 0x0016,
+	0x0080, 0x016c,
+	0x0083, 0xc0e5,
+	0x00e1, 0x0000,
+	0x0000, 0x01ae,
+	0x001f, 0xc20f,
+	0x009b, 0x038a,
+	0x0083, 0x038a,
+	0x0042, 0x0000,
+	0x001f, 0xc10f,
+	0x0091, 0x038a,
+	0x0083, 0x038a,
+	0x001a, 0xfffe,
+	0x009b, 0x0386,
+	0x0083, 0x0386,
+	0x00e1, 0x0000,
+	0x001f, 0xc10f,
+	0x009b, 0x038a,
+	0x0083, 0x038a,
+	0x0042, 0x0000,
+	0x001f, 0xc20f,
+	0x0091, 0x038a,
+	0x0083, 0x038a,
+	0x001a, 0xfffd,
+	0x009b, 0x0386,
+	0x0083, 0x0386,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+}, {
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x009a, 0xb616,
+	0x0060, 0x00ee,
+	0x008d, 0xbf02,
+	0x0080, 0x0007,
+	0x0083, 0xc0e0,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0008, 0xe384,
+	0x0003, 0xc095,
+	0x0083, 0xc184,
+	0x0003, 0xc084,
+	0x0083, 0xd1b9,
+	0x0083, 0xc7ff,
+	0x0003, 0xc082,
+	0x003a, 0x000a,
+	0x0003, 0x03fa,
+	0x0003, 0x4190,
+	0x0003, 0x4f83,
+	0x0083, 0x408e,
+	0x0004, 0xed04,
+	0x0083, 0xc0bf,
+	0x001a, 0x3501,
+	0x0060, 0x00ee,
+	0x0083, 0xc086,
+	0x001a, 0xb701,
+	0x0060, 0x00ee,
+	0x00ba, 0x0020,
+	0x009b, 0x03bf,
+	0x0020, 0x002a,
+	0x0083, 0xc0bf,
+	0x001a, 0x3703,
+	0x0060, 0x00ee,
+	0x0003, 0xc2bf,
+	0x0060, 0x00ee,
+	0x008a, 0xde02,
+	0x0000, 0x002e,
+	0x008e, 0x8502,
+	0x0080, 0x0020,
+	0x0018, 0x9300,
+	0x0003, 0x0393,
+	0x00fa, 0x8040,
+	0x0091, 0x03c1,
+	0x0091, 0x0380,
+	0x0083, 0x0380,
+	0x0083, 0xd497,
+	0x0083, 0xd498,
+	0x0003, 0xd499,
+	0x0083, 0xd1b9,
+	0x0083, 0xc7ff,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00ba, 0x0117,
+	0x0083, 0x03bf,
+	0x003a, 0x3b80,
+	0x0060, 0x00ee,
+	0x0083, 0xc182,
+	0x009a, 0x0104,
+	0x0083, 0x03b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x001f, 0xf80f,
+	0x0011, 0x03d2,
+	0x0083, 0x03f8,
+	0x0000, 0x004b,
+	0x0080, 0x0010,
+	0x0083, 0xc0e3,
+	0x0003, 0x618c,
+	0x0083, 0x628d,
+	0x00ba, 0x0010,
+	0x0083, 0x03e0,
+	0x0003, 0xe171,
+	0x009f, 0x710f,
+	0x009b, 0x03cd,
+	0x0003, 0x0371,
+	0x00e0, 0x0114,
+	0x0060, 0x0123,
+	0x00e0, 0x0171,
+	0x0003, 0xc074,
+	0x0060, 0x01ae,
+	0x0003, 0xc0e7,
+	0x0003, 0xc0e8,
+	0x0098, 0xe600,
+	0x0083, 0x03e6,
+	0x003a, 0x0011,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x00ac, 0xda02,
+	0x002a, 0xda0a,
+	0x0008, 0x8605,
+	0x0060, 0x0125,
+	0x0060, 0x01ae,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0060, 0x0173,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0080, 0x005d,
+	0x003a, 0x0012,
+	0x0083, 0x03e0,
+	0x0011, 0x7274,
+	0x0082, 0x0f74,
+	0x00ba, 0xdc74,
+	0x005a, 0x0257,
+	0x0083, 0x0375,
+	0x00ba, 0x0020,
+	0x0083, 0x03e0,
+	0x0060, 0x0123,
+	0x00e0, 0x0171,
+	0x0060, 0x01b9,
+	0x0060, 0x01ae,
+	0x003a, 0x0021,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x0029, 0x86b1,
+	0x00ac, 0xda02,
+	0x002a, 0xda0a,
+	0x00ba, 0x0023,
+	0x0083, 0x03e0,
+	0x0088, 0x8602,
+	0x0000, 0x0093,
+	0x00ba, 0x002c,
+	0x0083, 0x03e0,
+	0x0060, 0x0173,
+	0x0083, 0x7273,
+	0x0000, 0x0078,
+	0x003a, 0x0024,
+	0x0083, 0x03e0,
+	0x009e, 0x7072,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002b, 0x0322,
+	0x0097, 0x7f72,
+	0x0020, 0x00ae,
+	0x0011, 0x7274,
+	0x0082, 0x0f74,
+	0x0060, 0x01b9,
+	0x0000, 0x007e,
+	0x0083, 0x7072,
+	0x0060, 0x017a,
+	0x003a, 0x0027,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x00a9, 0x86ce,
+	0x00ac, 0xda02,
+	0x002a, 0xda14,
+	0x003a, 0x0028,
+	0x0083, 0x03e0,
+	0x001f, 0x750f,
+	0x0017, 0x0366,
+	0x00c1, 0x00a8,
+	0x00ba, 0x0029,
+	0x0083, 0x03e0,
+	0x0003, 0x71e8,
+	0x0060, 0x0125,
+	0x0083, 0x7372,
+	0x0060, 0x0173,
+	0x0060, 0x01ae,
+	0x0000, 0x0078,
+	0x0003, 0x7471,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x71e1,
+	0x00e0, 0x0114,
+	0x0000, 0x00a0,
+	0x0080, 0x00b0,
+	0x0080, 0x004a,
+	0x003a, 0x0030,
+	0x0083, 0x03e0,
+	0x0003, 0x678c,
+	0x001b, 0x7271,
+	0x0020, 0x00b9,
+	0x0083, 0x7270,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00e0, 0x013c,
+	0x0060, 0x01b9,
+	0x0060, 0x01ad,
+	0x00ba, 0x0031,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x00a9, 0x868f,
+	0x00ac, 0xda02,
+	0x00aa, 0xda08,
+	0x0060, 0x0173,
+	0x00ba, 0x0034,
+	0x0083, 0x03e0,
+	0x0060, 0x0101,
+	0x0029, 0x8696,
+	0x00ac, 0xda85,
+	0x00aa, 0xda97,
+	0x0008, 0x868d,
+	0x0083, 0xc08a,
+	0x003a, 0x0041,
+	0x0083, 0x03e0,
+	0x001f, 0x700f,
+	0x001c, 0x03c4,
+	0x0011, 0x0372,
+	0x0003, 0x03e4,
+	0x003a, 0x0088,
+	0x0017, 0x03e4,
+	0x00a0, 0x00e7,
+	0x0028, 0xe3a4,
+	0x0003, 0xc2e3,
+	0x0000, 0x00d8,
+	0x0003, 0xc07e,
+	0x0080, 0x00da,
+	0x00a4, 0x860a,
+	0x0080, 0x00d6,
+	0x00ac, 0xda02,
+	0x0000, 0x00ca,
+	0x003a, 0x0009,
+	0x0099, 0x037e,
+	0x0082, 0x0f7e,
+	0x0017, 0x7ee2,
+	0x0041, 0x00e2,
+	0x0080, 0x00da,
+	0x0003, 0xc1e3,
+	0x00ba, 0x1000,
+	0x0011, 0x0395,
+	0x0003, 0x0395,
+	0x0000, 0x00ca,
+	0x0003, 0xc794,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf85,
+	0x0028, 0xe54c,
+	0x00a9, 0xe575,
+	0x001f, 0xe50f,
+	0x009d, 0x03c2,
+	0x00a8, 0x0375,
+	0x0029, 0x0375,
+	0x001f, 0xe50f,
+	0x009d, 0x03c4,
+	0x00a8, 0x0373,
+	0x0029, 0x0373,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc0da,
+	0x0003, 0x6489,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0x7dda,
+	0x0083, 0x6589,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0019, 0x6465,
+	0x009b, 0x034f,
+	0x0099, 0x03c9,
+	0x0019, 0x03c8,
+	0x0019, 0x0375,
+	0x0002, 0x0f75,
+	0x00e1, 0x0000,
+	0x00a8, 0xe3e1,
+	0x003a, 0xbada,
+	0x0083, 0x03e0,
+	0x0000, 0x0110,
+	0x009f, 0x710f,
+	0x009d, 0x03c2,
+	0x00a9, 0x0305,
+	0x0028, 0x0306,
+	0x0029, 0x7107,
+	0x00a8, 0x7108,
+	0x0000, 0x0110,
+	0x0003, 0xc87f,
+	0x00e1, 0x0000,
+	0x0003, 0xc47f,
+	0x00e1, 0x0000,
+	0x0003, 0xc27f,
+	0x00e1, 0x0000,
+	0x0003, 0xc17f,
+	0x00e1, 0x0000,
+	0x0003, 0x7f70,
+	0x0080, 0x013c,
+	0x001f, 0x700f,
+	0x009d, 0x03c2,
+	0x00a9, 0x030a,
+	0x00a8, 0x030e,
+	0x00a9, 0x7010,
+	0x0028, 0x7002,
+	0x0000, 0x0110,
+	0x009f, 0x710f,
+	0x009d, 0x03c2,
+	0x0009, 0x0303,
+	0x0003, 0xc870,
+	0x0080, 0x013c,
+	0x009f, 0x710f,
+	0x009d, 0x03c2,
+	0x0088, 0x0303,
+	0x0003, 0xc470,
+	0x0080, 0x013c,
+	0x0009, 0x7103,
+	0x0003, 0xc270,
+	0x0080, 0x013c,
+	0x0088, 0x718d,
+	0x0003, 0xc170,
+	0x0080, 0x013c,
+	0x0003, 0xc1e5,
+	0x0083, 0xc0bf,
+	0x003a, 0x0018,
+	0x0000, 0x00ee,
+	0x0083, 0xc0e5,
+	0x001f, 0xf70f,
+	0x001b, 0x0377,
+	0x0002, 0x0f7a,
+	0x001f, 0x700f,
+	0x009d, 0x03c2,
+	0x00a9, 0x0305,
+	0x00a8, 0x0308,
+	0x00a9, 0x700d,
+	0x00a8, 0x7012,
+	0x0000, 0x0110,
+	0x001f, 0x7a0f,
+	0x0083, 0x03f7,
+	0x0003, 0xc378,
+	0x0000, 0x0161,
+	0x001f, 0xc10f,
+	0x001c, 0x03c4,
+	0x0091, 0x037a,
+	0x0083, 0x03f7,
+	0x0003, 0xc378,
+	0x0000, 0x0161,
+	0x001f, 0xc20f,
+	0x001c, 0x03c4,
+	0x0091, 0x037a,
+	0x0083, 0x03f7,
+	0x0083, 0xc778,
+	0x0000, 0x0161,
+	0x009f, 0xc30f,
+	0x001c, 0x03c4,
+	0x0091, 0x037a,
+	0x0083, 0x03f7,
+	0x0083, 0xc778,
+	0x0000, 0x0161,
+	0x001f, 0xf80f,
+	0x009b, 0x0376,
+	0x0011, 0x0378,
+	0x0083, 0x03f8,
+	0x0003, 0xc2e5,
+	0x003a, 0x0022,
+	0x0083, 0x03bf,
+	0x003a, 0x0018,
+	0x0000, 0x00ee,
+	0x0083, 0xc0e5,
+	0x00e1, 0x0000,
+	0x0000, 0x00ee,
+	0x0080, 0x017e,
+	0x0080, 0x0181,
+	0x0000, 0x01a8,
+	0x0000, 0x01ab,
+	0x0083, 0xc872,
+	0x0000, 0x017a,
+	0x009f, 0x720f,
+	0x001c, 0x03c4,
+	0x0011, 0x0372,
+	0x009d, 0x03c1,
+	0x009b, 0x03cd,
+	0x0082, 0x0f72,
+	0x0000, 0x017a,
+	0x0003, 0xc4e5,
+	0x0083, 0xc0bf,
+	0x00ba, 0x0015,
+	0x0080, 0x016c,
+	0x0003, 0xc8e5,
+	0x00ba, 0x0016,
+	0x0080, 0x016c,
+	0x0083, 0xc0e5,
+	0x001f, 0xf70f,
+	0x009b, 0x0376,
+	0x0002, 0x0f7c,
+	0x009f, 0x720f,
+	0x009d, 0x03c2,
+	0x0029, 0x0304,
+	0x0028, 0x0306,
+	0x00a9, 0x7209,
+	0x0028, 0x720c,
+	0x0003, 0x7cf7,
+	0x0003, 0xc37b,
+	0x0080, 0x019a,
+	0x0011, 0x7cc1,
+	0x0083, 0x03f7,
+	0x0003, 0xc37b,
+	0x0080, 0x019a,
+	0x0011, 0x7cc2,
+	0x0083, 0x03f7,
+	0x0083, 0xc77b,
+	0x0080, 0x019a,
+	0x0091, 0x7cc3,
+	0x0083, 0x03f7,
+	0x0083, 0xc77b,
+	0x0080, 0x019a,
+	0x009f, 0x810f,
+	0x009b, 0x0376,
+	0x0011, 0x037b,
+	0x0003, 0x0381,
+	0x0003, 0xc082,
+	0x0003, 0xd689,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc182,
+	0x0083, 0xc9e5,
+	0x003a, 0x0022,
+	0x0083, 0x03bf,
+	0x00ba, 0x0015,
+	0x0080, 0x016c,
+	0x0083, 0xcce5,
+	0x00ba, 0x0016,
+	0x0080, 0x016c,
+	0x0083, 0xc0e5,
+	0x00e1, 0x0000,
+	0x0000, 0x01ae,
+	0x001f, 0xc20f,
+	0x009b, 0x038a,
+	0x0083, 0x038a,
+	0x0042, 0x0000,
+	0x001f, 0xc10f,
+	0x0091, 0x038a,
+	0x0083, 0x038a,
+	0x001a, 0xfffe,
+	0x009b, 0x0386,
+	0x0083, 0x0386,
+	0x00e1, 0x0000,
+	0x001f, 0xc10f,
+	0x009b, 0x038a,
+	0x0083, 0x038a,
+	0x0042, 0x0000,
+	0x001f, 0xc20f,
+	0x0091, 0x038a,
+	0x0083, 0x038a,
+	0x001a, 0xfffd,
+	0x009b, 0x0386,
+	0x0083, 0x0386,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+}, {
+	0x0083, 0xc0ec,
+	0x0003, 0xc0eb,
+	0x0003, 0xc0ee,
+	0x0083, 0xc0ea,
+	0x0003, 0xc696,
+	0x0060, 0x0158,
+	0x00ba, 0x0080,
+	0x0083, 0x03b9,
+	0x0003, 0xc0ee,
+	0x0003, 0xc0eb,
+	0x0018, 0xee00,
+	0x0003, 0x03ee,
+	0x00ba, 0x0010,
+	0x0017, 0x03ee,
+	0x0041, 0x0011,
+	0x0060, 0x0131,
+	0x0003, 0xc0ee,
+	0x009b, 0x55a1,
+	0x0097, 0x03ce,
+	0x00c1, 0x0015,
+	0x0083, 0xd498,
+	0x001f, 0xd30f,
+	0x009e, 0x03c8,
+	0x0083, 0x0398,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0018, 0xeb00,
+	0x0003, 0x03eb,
+	0x00ba, 0x0800,
+	0x0017, 0x03eb,
+	0x0041, 0x000a,
+	0x0003, 0xc0eb,
+	0x0003, 0xc0ee,
+	0x009b, 0x57a3,
+	0x00e0, 0x016c,
+	0x0083, 0x03ef,
+	0x009b, 0x57a0,
+	0x00e0, 0x016c,
+	0x0083, 0x03dc,
+	0x0018, 0xee00,
+	0x0003, 0x03ee,
+	0x0017, 0x59ee,
+	0x00c1, 0x003b,
+	0x0003, 0xc0ee,
+	0x001f, 0xdf0f,
+	0x0017, 0x03fa,
+	0x0041, 0x0039,
+	0x001f, 0xc10f,
+	0x001e, 0xfa03,
+	0x0003, 0x03fa,
+	0x0060, 0x0158,
+	0x0060, 0x0131,
+	0x0085, 0xeb07,
+	0x0003, 0xc145,
+	0x0098, 0xea00,
+	0x0083, 0x03ea,
+	0x0097, 0x48ea,
+	0x0041, 0x0050,
+	0x0083, 0xc1eb,
+	0x008f, 0xdc0a,
+	0x001b, 0xa055,
+	0x0017, 0xc903,
+	0x00c1, 0x0049,
+	0x0083, 0xc045,
+	0x0083, 0xc242,
+	0x0000, 0x0050,
+	0x0003, 0xc245,
+	0x0003, 0xc042,
+	0x0000, 0x0050,
+	0x001b, 0xa055,
+	0x0097, 0xc103,
+	0x00c1, 0x0049,
+	0x0080, 0x0046,
+	0x001b, 0xa355,
+	0x0017, 0xcc03,
+	0x00c1, 0x0058,
+	0x001f, 0xc80f,
+	0x009e, 0xd303,
+	0x0003, 0x0344,
+	0x0003, 0xc843,
+	0x0080, 0x0061,
+	0x008f, 0xef06,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xd344,
+	0x0083, 0xc043,
+	0x0080, 0x0061,
+	0x0017, 0xc503,
+	0x00c1, 0x005b,
+	0x0000, 0x0053,
+	0x009b, 0xa155,
+	0x0003, 0x03f0,
+	0x001a, 0x0040,
+	0x0017, 0xf003,
+	0x00c1, 0x006e,
+	0x0083, 0xc296,
+	0x009f, 0xd20f,
+	0x0019, 0xc103,
+	0x0083, 0x0398,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xd298,
+	0x0003, 0xc696,
+	0x009b, 0xa755,
+	0x0017, 0x5a03,
+	0x0041, 0x0078,
+	0x009a, 0x000a,
+	0x009e, 0xd303,
+	0x0083, 0x0346,
+	0x009a, 0x000a,
+	0x0003, 0x0347,
+	0x0080, 0x0080,
+	0x000f, 0xa704,
+	0x0003, 0xd346,
+	0x0003, 0xc047,
+	0x0080, 0x0080,
+	0x009b, 0xa755,
+	0x0097, 0xc203,
+	0x00c1, 0x0079,
+	0x0000, 0x0072,
+	0x009f, 0xd20f,
+	0x0011, 0x0344,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0091, 0x0345,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0091, 0x0346,
+	0x0003, 0x0399,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd299,
+	0x0083, 0xd298,
+	0x0083, 0xd297,
+	0x0088, 0xde30,
+	0x001a, 0x000d,
+	0x009e, 0x8303,
+	0x0083, 0x0383,
+	0x0003, 0xcc4b,
+	0x001c, 0x58c5,
+	0x0003, 0x034d,
+	0x009e, 0x834b,
+	0x0083, 0x0383,
+	0x001c, 0x4bc1,
+	0x0003, 0x034b,
+	0x0017, 0x4b4d,
+	0x00a0, 0x00a0,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0000, 0x0096,
+	0x0060, 0x0119,
+	0x00a8, 0xe371,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe36e,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe36b,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe368,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x00a8, 0xe365,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe362,
+	0x0091, 0x834b,
+	0x0083, 0x0383,
+	0x009d, 0x4bc1,
+	0x0003, 0x034b,
+	0x0017, 0x4bc9,
+	0x00a0, 0x00bb,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0000, 0x00b1,
+	0x001a, 0x001f,
+	0x0091, 0x8303,
+	0x0083, 0x0383,
+	0x0080, 0x00d0,
+	0x0060, 0x0119,
+	0x0028, 0xe352,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe34f,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe34c,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe349,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe346,
+	0x0083, 0x6389,
+	0x0060, 0x0119,
+	0x0028, 0xe343,
+	0x0091, 0x40ca,
+	0x0011, 0x5c03,
+	0x0003, 0x038e,
+	0x001e, 0x41c5,
+	0x001e, 0x0348,
+	0x0003, 0x0390,
+	0x001f, 0xc80f,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x009f, 0xd20f,
+	0x0091, 0x0343,
+	0x0083, 0x0398,
+	0x009f, 0xd20f,
+	0x0011, 0x0342,
+	0x0083, 0x0397,
+	0x009f, 0xd20f,
+	0x0011, 0x0347,
+	0x0003, 0x0399,
+	0x0083, 0xcbf9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc1b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xd297,
+	0x0083, 0xd298,
+	0x0003, 0xd299,
+	0x0083, 0x408e,
+	0x0003, 0x4190,
+	0x009f, 0xc50f,
+	0x0099, 0x03c9,
+	0x0091, 0x0351,
+	0x0083, 0x0391,
+	0x0083, 0x0392,
+	0x0003, 0xcff9,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xc2b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd089,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0xd5b5,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xcef9,
+	0x0098, 0xec00,
+	0x0083, 0x03ec,
+	0x009a, 0x0050,
+	0x0097, 0x03ec,
+	0x0041, 0x010e,
+	0x0003, 0x5886,
+	0x0003, 0xc0db,
+	0x008b, 0x8504,
+	0x0000, 0x0028,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0083, 0xc694,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x003a, 0x0041,
+	0x0083, 0x03e0,
+	0x001f, 0x700f,
+	0x001c, 0x03c4,
+	0x0011, 0x0372,
+	0x0003, 0x03e4,
+	0x00a8, 0xe38d,
+	0x0003, 0xc2e3,
+	0x0024, 0x860b,
+	0x0003, 0xc07e,
+	0x0080, 0x0124,
+	0x00ac, 0xda02,
+	0x00e1, 0x0000,
+	0x003a, 0x0009,
+	0x0099, 0x037e,
+	0x0082, 0x0f7e,
+	0x0017, 0x7ee2,
+	0x0041, 0x012c,
+	0x0080, 0x0124,
+	0x0003, 0xc1e3,
+	0x00ba, 0x1000,
+	0x0011, 0x0395,
+	0x0003, 0x0395,
+	0x00e1, 0x0000,
+	0x009b, 0xa155,
+	0x0083, 0x03e9,
+	0x009a, 0x0055,
+	0x0097, 0xe903,
+	0x0041, 0x013b,
+	0x0084, 0xb90b,
+	0x001f, 0xc10f,
+	0x009e, 0xb903,
+	0x0083, 0x03b9,
+	0x0080, 0x0141,
+	0x0017, 0x54e9,
+	0x00c1, 0x0141,
+	0x0017, 0xb957,
+	0x0020, 0x0141,
+	0x0098, 0xb900,
+	0x0083, 0x03b9,
+	0x009e, 0x55c4,
+	0x0097, 0xb903,
+	0x0041, 0x014c,
+	0x0004, 0xff13,
+	0x009f, 0xff0f,
+	0x009e, 0x03c1,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x0019, 0x03c8,
+	0x0083, 0x03b9,
+	0x0000, 0x0157,
+	0x0099, 0xcc55,
+	0x0097, 0x03b9,
+	0x0041, 0x0157,
+	0x009f, 0xff0f,
+	0x0097, 0x03c7,
+	0x0041, 0x0157,
+	0x0018, 0xff00,
+	0x0003, 0x03ff,
+	0x001f, 0xb90f,
+	0x009e, 0x03c8,
+	0x0083, 0x03b9,
+	0x00e1, 0x0000,
+	0x0093, 0x0000,
+	0x001f, 0x8761,
+	0x0003, 0x03f6,
+	0x001a, 0x0160,
+	0x001e, 0x03f6,
+	0x0003, 0x03f6,
+	0x0017, 0xd103,
+	0x0041, 0x0162,
+	0x0083, 0xd1fb,
+	0x0000, 0x016b,
+	0x001a, 0x0094,
+	0x0017, 0xf603,
+	0x0041, 0x0168,
+	0x001a, 0x0094,
+	0x0083, 0x03fb,
+	0x0000, 0x016b,
+	0x0083, 0xf6fb,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x00e1, 0x0000,
+	0x00ae, 0x8005,
+	0x000f, 0x0303,
+	0x001e, 0x035f,
+	0x00e1, 0x0000,
+	0x0099, 0x5f03,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0003, 0x03be,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x002f, 0xbf00,
+	0x00aa, 0xbf85,
+	0x00e1, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+	0x0042, 0x0000,
+}};
+
+static u16 cs4321_microcode_epilog[] = {
+	/* Addr, Data */
+	0x0201, 0x8f10, 0x0202, 0x1210, 0x0200, 0x8000,
+	0x0201, 0x8f13, 0x0202, 0x1313, 0x0200, 0x8001,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8002,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8003,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8004,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8005,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8006,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8007,
+	0x0201, 0x0000, 0x0202, 0x0300, 0x0200, 0x8008,
+	0x0201, 0x0000, 0x0202, 0x9101, 0x0200, 0x8009,
+	0x0201, 0x8000, 0x0202, 0x0e00, 0x0200, 0x800a,
+	0x0201, 0x0000, 0x0202, 0xffff, 0x0200, 0x800b,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x800c,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x800d,
+	0x0201, 0x0000, 0x0202, 0x0020, 0x0200, 0x800e,
+	0x0201, 0x7fff, 0x0202, 0xffff, 0x0200, 0x800f,
+	0x0201, 0x8000, 0x0202, 0xc350, 0x0200, 0x8010,
+	0x0201, 0x0000, 0x0202, 0x8000, 0x0200, 0x8011,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8012,
+	0x0201, 0x0000, 0x0202, 0x0a0a, 0x0200, 0x8013,
+	0x0201, 0x0000, 0x0202, 0x0064, 0x0200, 0x8014,
+	0x0201, 0x0000, 0x0202, 0x007f, 0x0200, 0x8015,
+	0x0201, 0x0000, 0x0202, 0x003a, 0x0200, 0x8016,
+	0x0201, 0x0000, 0x0202, 0x00ff, 0x0200, 0x8017,
+	0x0201, 0x0000, 0x0202, 0x0100, 0x0200, 0x8018,
+	0x0201, 0x0000, 0x0202, 0x0032, 0x0200, 0x8019,
+	0x0201, 0x0000, 0x0202, 0x0018, 0x0200, 0x801a,
+	0x0201, 0x0000, 0x0202, 0x0013, 0x0200, 0x801b,
+	0x0201, 0x0000, 0x0202, 0xff00, 0x0200, 0x801c,
+	0x0201, 0x0000, 0x0202, 0x0028, 0x0200, 0x801d,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x801e,
+	0x0201, 0x0000, 0x0202, 0x0080, 0x0200, 0x801f,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8020,
+	0x0201, 0x00f9, 0x0202, 0xac04, 0x0200, 0x8021,
+	0x0201, 0x0a42, 0x0202, 0x6b48, 0x0200, 0x8022,
+	0x0201, 0x8000, 0x0202, 0x19bc, 0x0200, 0x8023,
+	0x0201, 0x8020, 0x0202, 0x6cc8, 0x0200, 0x8024,
+	0x0201, 0x8000, 0x0202, 0x14c0, 0x0200, 0x8025,
+	0x0201, 0x0a76, 0x0202, 0x4c88, 0x0200, 0x8026,
+	0x0201, 0x015f, 0x0202, 0xcf7a, 0x0200, 0x8027,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8028,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8029,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x802a,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x802b,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x802c,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x802d,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x802e,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x802f,
+	0x0201, 0x0000, 0x0202, 0x0008, 0x0200, 0x8030,
+	0x0201, 0x0000, 0x0202, 0x000f, 0x0200, 0x8031,
+	0x0201, 0x0000, 0x0202, 0x0008, 0x0200, 0x8032,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8033,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8034,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8035,
+	0x0201, 0xffff, 0x0202, 0xfff0, 0x0200, 0x8036,
+	0x0201, 0xffff, 0x0202, 0xff0f, 0x0200, 0x8037,
+	0x0201, 0x0000, 0x0202, 0x0003, 0x0200, 0x8038,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x8039,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x803a,
+	0x0201, 0x0000, 0x0202, 0x0003, 0x0200, 0x803b,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x803c,
+	0x0201, 0x2000, 0x0202, 0x0000, 0x0200, 0x803d,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x803e,
+	0x0201, 0x0000, 0x0202, 0x0000, 0x0200, 0x803f,
+
+	0x024f, 0x0000,
+	0x0505, 0x2003,
+	0x0558, 0x2001,
+	0x03d4, 0x0100,
+	0x03d5, 0x00c0,
+	0x03d3, 0x2919,
+	0x021c, 0x8020,
+	0x021d, 0x8040,
+	0x021e, 0x8040,
+	0x03d0, 0x0600,
+	0x0605, 0x1d00,
+	0x0231, 0x8f05,
+	0x0003, 0x0020,
+	0x0004, 0x0021,
+	0x0005, 0x0020,
+	0x0006, 0x0100,
+	0x0007, 0x0020,
+	0x062a, 0x101b,
+	0x062b, 0xc010,
+	0x0529, 0x0808,
+	0x052a, 0x0000,
+	0x0504, 0x0055,
+	0x0622, 0x0001,
+	0x0521, 0x0001,
+	0x0300, 0x0008,
+	0x0308, 0x00e2,
+	0x0310, 0x00d5,
+	0x0318, 0x0076,
+	0x0320, 0x0000,
+	0x0328, 0x00f0,
+	0x0338, 0x00f3,
+	0x0330, 0x00f3,
+	0x0340, 0x0000,
+	0x0348, 0x000a,
+	0x0350, 0x0000,
+	0x0358, 0x00fc,
+	0x0360, 0x0000,
+	0x0301, 0x0008,
+	0x0309, 0x00ed,
+	0x0311, 0x00c6,
+	0x0319, 0x004f,
+	0x0321, 0x0000,
+	0x0329, 0x0000,
+	0x0339, 0x00fd,
+	0x0331, 0x00fd,
+	0x0341, 0x0006,
+	0x0349, 0x0000,
+	0x0351, 0x000b,
+	0x0359, 0x0002,
+	0x0361, 0x0000,
+	0x0302, 0x0000,
+	0x030a, 0x0040,
+	0x0312, 0x00d0,
+	0x031a, 0x006e,
+	0x0322, 0x0000,
+	0x032a, 0x00dc,
+	0x033a, 0x00d7,
+	0x0332, 0x00d7,
+	0x0342, 0x00e6,
+	0x034a, 0x000c,
+	0x0352, 0x00fd,
+	0x035a, 0x0001,
+	0x0362, 0x0000,
+	0x0303, 0x0000,
+	0x030b, 0x00f8,
+	0x0313, 0x0000,
+	0x031b, 0x0064,
+	0x0323, 0x0000,
+	0x032b, 0x00db,
+	0x0333, 0x00e6,
+	0x033b, 0x00e6,
+	0x0343, 0x00f0,
+	0x034b, 0x0010,
+	0x0353, 0x00f8,
+	0x035b, 0x00f7,
+	0x0363, 0x0000,
+	0x0304, 0x0000,
+	0x030c, 0x0000,
+	0x0314, 0x0000,
+	0x031c, 0x0070,
+	0x0324, 0x0000,
+	0x032c, 0x0000,
+	0x033c, 0x0000,
+	0x0334, 0x0000,
+	0x0344, 0x0000,
+	0x034c, 0x0000,
+	0x0354, 0x0000,
+	0x035c, 0x0000,
+	0x0364, 0x0000,
+	0x0305, 0x0000,
+	0x030d, 0x00d4,
+	0x0315, 0x0000,
+	0x031d, 0x0077,
+	0x0325, 0x0000,
+	0x032d, 0x00b7,
+	0x033d, 0x00f8,
+	0x0335, 0x00f8,
+	0x0345, 0x0003,
+	0x034d, 0x00fd,
+	0x0355, 0x00fa,
+	0x035d, 0x00fc,
+	0x0365, 0x0000,
+	0x0306, 0x00f5,
+	0x030e, 0x0040,
+	0x0316, 0x0000,
+	0x031e, 0x00ee,
+	0x0326, 0x0000,
+	0x032e, 0x0000,
+	0x0336, 0x0000,
+	0x033e, 0x0000,
+	0x0346, 0x0000,
+	0x034e, 0x0000,
+	0x0356, 0x0000,
+	0x035e, 0x0000,
+	0x0366, 0x0000,
+	0x0307, 0x00f9,
+	0x030f, 0x0060,
+	0x0317, 0x0000,
+	0x031f, 0x0000,
+	0x0327, 0x0000,
+	0x032f, 0x0000,
+	0x0337, 0x0000,
+	0x033f, 0x0000,
+	0x0347, 0x0000,
+	0x034f, 0x0000,
+	0x0357, 0x0000,
+	0x035f, 0x0000,
+	0x0367, 0x0000,
+	0x0203, 0xfe03,
+	0x03d2, 0x0000,
+	0x040e, 0x0001,
+	0x022f, 0x0004,
+	0x040f, 0xedcf,
+	0x0382, 0x0002,
+	0x0408, 0xffff,
+	0x022b, 0x00b0,
+	0x0205, 0x0603,
+	0x0227, 0x0000,
+	0x0404, 0xdfff,
+	0x0409, 0xf048,
+	0x0296, 0x0000,
+	0x029a, 0x0002,
+	0x028a, 0x000f,
+	0x0270, 0x0005,
+	0x0400, 0xd000,
+	0x020c, 0xf090,
+	0x0537, 0x0136,
+	0x0536, 0x0136,
+	0x0510, 0x0136,
+	0x050f, 0x0136,
+	0x0539, 0xa002,
+	0x0539, 0x2002,
+	0x0512, 0xa002,
+	0x0512, 0x2002,
+	0x0223, 0x0006,
+	0x021f, 0x0134,
+	0x0700, 0x0020,
+	0x0726, 0x0100,
+	0x0403, 0x0020,
+	0x0500, 0x1200,
+	0x0274, 0x0000,
+	0x024f, 0x0000,
+	0x000a, 0x1412,
+	0x0009, 0x2011,
+	0x0008, 0x0929,
+	0x0203, 0xfe03,
+	0x024f, 0x0000,
+	0x001c, 0x0000,
+	0x001f, 0xf574,
+};
diff --git a/drivers/net/phy/cs4321.c b/drivers/net/phy/cs4321.c
new file mode 100644
index 0000000..31b4b19
--- /dev/null
+++ b/drivers/net/phy/cs4321.c
@@ -0,0 +1,1147 @@
+/*
+ *    Based on code from Cortina Systems, Inc.
+ *
+ *    Copyright (C) 2011 by Cortina Systems, Inc.
+ *    Copyright (C) 2011 - 2012 Cavium, Inc.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    This program is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/phy.h>
+#include <linux/of.h>
+
+#include "cs4321-ucode.h"
+
+#define CS4321_GLOBAL_CHIP_ID_LSB			0x0
+#define CS4321_GLOBAL_CHIP_ID_MSB			0x1
+#define CS4321_GLOBAL_INGRESS_SOFT_RESET		0xC
+#define CS4321_GLOBAL_EGRESS_SOFT_RESET			0xD
+#define CS4321_GLOBAL_REF_SOFT_RESET			0xE
+#define CS4321_GLOBAL_MPIF_SOFT_RESET			0xF
+#define CS4321_GLOBAL_MPIF_RESET_DOTREG			0x10
+#define CS4321_GLOBAL_INGRESS_FUNCEN			0x12
+#define CS4321_GLOBAL_EGRESS_FUNCEN			0x13
+#define CS4321_GLOBAL_HOST_MULTILANE_FUNCEN		0x14
+#define CS4321_GLOBAL_INGRESS_CLKEN			0x15
+#define CS4321_GLOBAL_INGRESS_CLKEN2			0x16
+#define CS4321_GLOBAL_EGRESS_CLKEN			0x17
+#define CS4321_GLOBAL_EGRESS_CLKEN2			0x18
+#define CS4321_GLOBAL_HOST_MULTILANE_CLKSEL		0x19
+#define CS4321_GLOBAL_MSEQCLKCTRL			0x20
+#define CS4321_GLOBAL_GT_10KHZ_REF_CLK_CNT1		0x2D
+#define CS4321_GLOBAL_GT_10KHZ_REF_CLK_CNT0		0x2E
+#define CS4321_GLOBAL_MISC_CONFIG			0x33
+#define CS4321_GPIO_GPIO3				0x10C
+#define CS4321_GPIO_GPIO3_DRIVE				0x10E
+#define CS4321_GPIO_GPIO10				0x136
+#define CS4321_GPIO_GPIO10_OUTPUT_CFG			0x137
+#define CS4321_GPIO_GPIO_INT				0x16B
+#define CS4321_GPIO_GPIO_INTE				0x16C
+#define CS4321_GPIO_GPIO_INTS				0x16D
+#define CS4321_MSEQ_ENABLE_MSB				0x204
+#define CS4321_MSEQ_SERDES_PARAM_LSB			0x205
+#define CS4321_MSEQ_POWER_DOWN_LSB			0x208
+#define CS4321_MSEQ_POWER_DOWN_MSB			0x209
+#define CS4321_MSEQ_STATUS				0x20a
+#define CS4321_MSEQ_LEAK_INTERVAL_FFE			0x21C
+#define CS4321_MSEQ_COEF_DSP_DRIVE128			0x21F
+#define CS4321_MSEQ_COEF_INIT_SEL			0x223
+#define CS4321_MSEQ_CAL_RX_EQADJ			0x22A
+#define CS4321_MSEQ_CAL_RX_PHSEL			0x22C
+#define CS4321_MSEQ_CAL_RX_SLICER			0x22D
+#define CS4321_MSEQ_CAL_RX_DFE_EQ			0x22E
+#define CS4321_MSEQ_OPTIONS				0x240
+#define CS4321_MSEQ_PC					0x243
+#define CS4321_MSEQ_BANKSELECT				0x24F
+#define CS4321_MSEQ_RESET_COUNT_LSB			0x250
+#define CS4321_MSEQ_SPARE2_LSB				0x270
+#define CS4321_MSEQ_SPARE9_LSB				0x27E
+#define CS4321_MSEQ_SPARE11_LSB				0x282
+#define CS4321_MSEQ_SPARE15_LSB				0x28A
+#define CS4321_MSEQ_SPARE21_LSB				0x296
+#define CS4321_MSEQ_SPARE23_LSB				0x29A
+#define CS4321_DSP_SDS_DSP_COEF_DFE0_SELECT		0x37B
+#define CS4321_DSP_SDS_DSP_COEF_LARGE_LEAK		0x382
+#define CS4321_DSP_SDS_SERDES_SRX_DAC_ENABLEB_LSB	0x400
+#define CS4321_DSP_SDS_SERDES_SRX_DAC_ENABLEB_MSB	0x401
+#define CS4321_DSP_SDS_SERDES_SRX_DAC_BIAS_SELECT0_MSB	0x403
+#define CS4321_DSP_SDS_SERDES_SRX_DAC_BIAS_SELECT1_MSB	0x405
+#define CS4321_DSP_SDS_SERDES_SRX_FFE_DELAY_CTRL	0x409
+#define CS4321_DSP_SDS_SERDES_SRX_FFE_INBUF_CTRL	0x40A
+#define CS4321_DSP_SDS_SERDES_SRX_FFE_PGA_CTRL		0x40B
+#define CS4321_DSP_SDS_SERDES_SRX_FFE_MISC		0x40C
+#define CS4321_DSP_SDS_SERDES_SRX_DFE0_SELECT		0x40E
+#define CS4321_DSP_SDS_SERDES_SRX_DFE_MISC		0x412
+#define CS4321_DSP_SDS_SERDES_SRX_AGC_MISC		0x413
+#define CS4321_LINE_SDS_COMMON_SRX0_RX_CONFIG		0x500
+#define CS4321_LINE_SDS_COMMON_SRX0_RX_CLKDIV_CTRL	0x501
+#define CS4321_LINE_SDS_COMMON_SRX0_RX_LOOP_FILTER	0x503
+#define CS4321_LINE_SDS_COMMON_SRX0_RX_CPA		0x504
+#define CS4321_LINE_SDS_COMMON_SRX0_RX_CPB		0x505
+#define CS4321_LINE_SDS_COMMON_SRX0_RX_VCO_CTRL		0x507
+#define CS4321_LINE_SDS_COMMON_SRX0_RX_SPARE		0x50C
+#define CS4321_LINE_SDS_COMMON_RXVCO0_CONTROL		0x512
+#define CS4321_LINE_SDS_COMMON_STX0_TX_OUTPUT_CTRLA	0x529
+#define CS4321_LINE_SDS_COMMON_STX0_TX_OUTPUT_CTRLB	0x52A
+#define CS4321_LINE_SDS_COMMON_STX0_TX_CONFIG_LOCAL_TIMING 0x52B
+#define CS4321_LINE_SDS_COMMON_STXP0_TX_CONFIG		0x52C
+#define CS4321_LINE_SDS_COMMON_STXP0_TX_PWRDN		0x52D
+#define CS4321_LINE_SDS_COMMON_STXP0_TX_CLKOUT_CTRL	0x52F
+#define CS4321_LINE_SDS_COMMON_STXP0_TX_LOOP_FILTER	0x530
+#define CS4321_LINE_SDS_COMMON_TXVCO0_CONTROL		0x539
+#define CS4321_HOST_SDS_COMMON_SRX0_RX_CONFIG		0x600
+#define CS4321_HOST_SDS_COMMON_SRX0_RX_CLKDIV_CTRL	0x601
+#define CS4321_HOST_SDS_COMMON_SRX0_RX_CLKOUT_CTRL	0x602
+#define CS4321_HOST_SDS_COMMON_RXVCO0_CONTROL		0x613
+#define CS4321_HOST_SDS_COMMON_STX0_TX_CONFIG_LOCAL_TIMING 0x62C
+#define CS4321_HOST_SDS_COMMON_STXP0_TX_CONFIG		0x62D
+#define CS4321_HOST_SDS_COMMON_STXP0_TX_PWRDN		0x62E
+#define CS4321_HOST_SDS_COMMON_STXP0_TX_CLKDIV_CTRL	0x62F
+#define CS4321_HOST_SDS_COMMON_STXP0_TX_CLKOUT_CTRL	0x630
+#define CS4321_HOST_SDS_COMMON_TXVCO0_CONTROL		0x63A
+#define CS4321_HOST_ML_SDS_COMMON_SRX0_RX_CONFIG	0x700
+#define CS4321_HOST_ML_SDS_COMMON_SRX0_RX_CLKDIV_CTRL	0x701
+#define CS4321_HOST_ML_SDS_COMMON_RXVCO0_CONTROL	0x70F
+#define CS4321_HOST_ML_SDS_COMMON_STXP0_TX_CONFIG	0x725
+#define CS4321_HOST_ML_SDS_COMMON_STXP0_TX_PWRDN	0x726
+#define CS4321_HOST_ML_SDS_COMMON_STXP0_TX_CLKDIV_CTRL	0x727
+#define CS4321_HOST_ML_SDS_COMMON_TXVCO0_CONTROL	0x731
+#define CS4321_XGPCS_LINE_TX_TXCNTRL			0xA00
+#define CS4321_XGPCS_LINE_RX_RXCNTRL			0xA20
+#define CS4321_XGPCS_HOST_TX_TXCNTRL			0xA80
+#define CS4321_XGPCS_HOST_RX_RXCNTRL			0xAA0
+#define CS4321_GIGEPCS_LINE_CONTROL			0xC00
+#define CS4321_GIGEPCS_HOST_CONTROL			0xC80
+#define CS4321_HIF_COMMON_TXCONTROL3			0xD0B
+#define CS4321_XGRS_LINE_TX_TXCNTRL			0xE00
+#define CS4321_XGRS_LINE_RX_RXCNTRL1			0xE10
+#define CS4321_XGRS_HOST_TX_TXCNTRL			0xE80
+#define CS4321_XGRS_HOST_RX_RXCNTRL1			0xE90
+#define CS4321_XGMAC_LINE_RX_CFG_COM			0xF00
+#define CS4321_XGMAC_LINE_TX_CFG_COM			0xF40
+#define CS4321_XGMAC_LINE_TX_CFG_TX			0xF41
+#define CS4321_XGMAC_LINE_TX_CFG_TX_IFG			0xF43
+#define CS4321_XGMAC_HOST_RX_CFG_COM			0xF80
+#define CS4321_XGMAC_HOST_TX_CFG_COM			0xFC0
+#define CS4321_XGMAC_HOST_TX_CFG_TX			0xFC1
+#define CS4321_XGMAC_HOST_TX_CFG_TX_IFG			0xFC3
+#define CS4321_MAC_LAT_CTRL_RESET			0x3000
+#define CS4321_MAC_LAT_CTRL_CONFIG			0x3001
+#define CS4321_RADJ_INGRESS_RX_NRA_MIN_IFG		0x3204
+#define CS4321_RADJ_INGRESS_RX_NRA_SETTLE		0x3206
+#define CS4321_RADJ_INGRESS_TX_ADD_FILL_DATA1		0x3210
+#define CS4321_RADJ_INGRESS_TX_ADD_FILL_DATA0		0x3211
+#define CS4321_RADJ_INGRESS_TX_ADD_FILL_CTRL		0x3212
+#define CS4321_RADJ_INGRESS_TX_PRA_MIN_IFG		0x3214
+#define CS4321_RADJ_INGRESS_TX_PRA_SETTLE		0x3216
+#define CS4321_RADJ_INGRESS_MISC_RESET			0x3220
+#define CS4321_RADJ_EGRESS_RX_NRA_MIN_IFG		0x3284
+#define CS4321_RADJ_EGRESS_RX_NRA_SETTLE		0x3286
+#define CS4321_RADJ_EGRESS_TX_ADD_FILL_DATA1		0x3290
+#define CS4321_RADJ_EGRESS_TX_ADD_FILL_DATA0		0x3291
+#define CS4321_RADJ_EGRESS_TX_ADD_FILL_CTRL		0x3292
+#define CS4321_RADJ_EGRESS_TX_PRA_MIN_IFG		0x3294
+#define CS4321_RADJ_EGRESS_TX_PRA_SETTLE		0x3296
+#define CS4321_RADJ_EGRESS_MISC_RESET			0x32A0
+#define CS4321_PM_CTRL					0x3400
+#define CS4321_EEPROM_LOADER_CONTROL			0x3F00
+#define CS4321_EEPROM_LOADER_STATUS			0x3F01
+
+
+enum cs4321_host_mode {
+	RXAUI,
+	XAUI
+};
+
+struct cs4321_private {
+	enum cs4321_host_mode mode;
+};
+
+struct cs4321_reg_modify {
+	u16 reg;
+	u16 mask_bits;
+	u16 set_bits;
+};
+
+struct cs4321_multi_seq {
+	int reg_offset;
+	const struct cs4321_reg_modify *seq;
+};
+
+static const struct cs4321_reg_modify cs4321_soft_reset_registers[] = {
+	/* Enable all the clocks */
+	{CS4321_GLOBAL_INGRESS_CLKEN, 0, 0xffff},
+	{CS4321_GLOBAL_INGRESS_CLKEN2, 0, 0xffff},
+	{CS4321_GLOBAL_EGRESS_CLKEN, 0, 0xffff},
+	{CS4321_GLOBAL_EGRESS_CLKEN2, 0, 0xffff},
+	/* Reset MPIF registers */
+	{CS4321_GLOBAL_MPIF_RESET_DOTREG, 0, 0x0},
+	/* Re-assert the reset */
+	{CS4321_GLOBAL_MPIF_RESET_DOTREG, 0, 0xffff},
+
+	/* Disable all the clocks */
+	{CS4321_GLOBAL_INGRESS_CLKEN, 0, 0x0},
+	{CS4321_GLOBAL_INGRESS_CLKEN2, 0, 0x0},
+	{CS4321_GLOBAL_EGRESS_CLKEN, 0, 0x0},
+	{CS4321_GLOBAL_EGRESS_CLKEN2, 0, 0x0},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_68xx_4_nic_init[] = {
+	/* Configure chip for common reference clock */
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_CONFIG, 0, 0x2700},
+	/* Set GPIO3 to drive low to enable laser output*/
+	{CS4321_GPIO_GPIO3_DRIVE, 0, 0},
+	{CS4321_GPIO_GPIO3, 0, 0x11},
+	/* Set GPIO10 as GPIO_INT open-drain active low */
+	{CS4321_GPIO_GPIO_INTE, 0, 0},
+	{CS4321_GPIO_GPIO10_OUTPUT_CFG, 0, 6},
+	{CS4321_GPIO_GPIO10, 0, 0x0719},
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_prefix_seq[] = {
+	/* MPIF DeAssert System Reset */
+	{CS4321_GLOBAL_MPIF_RESET_DOTREG, ~0x0001, 0},
+	/*
+	 * Make sure to stall the microsequencer before configuring
+	 * the path.
+	 */
+	{CS4321_GLOBAL_MSEQCLKCTRL, 0, 0x8004},
+	{CS4321_MSEQ_OPTIONS, 0, 0xf},
+	{CS4321_MSEQ_PC, 0, 0x0},
+	/*
+	 * Correct some of the h/w defaults that are incorrect.
+	 *
+	 * The default value of the bias current is incorrect and needs to
+	 * be corrected. This is normally done by Microcode but it doesn't
+	 * always run.
+	 */
+	{CS4321_DSP_SDS_SERDES_SRX_DAC_BIAS_SELECT0_MSB, 0, 0x20},
+	/*
+	 * By default need to power on the voltage monitor since it is required
+	 * by the temperature monitor and this is used by the microcode.
+	 */
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x0},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_ingress_local_timing_rxaui[] = {
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x0000},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CPA, 0, 0x0057},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_LOOP_FILTER, 0, 0x0007},
+	{CS4321_LINE_SDS_COMMON_STX0_TX_CONFIG_LOCAL_TIMING, 0, 0x0001},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_CLKOUT_CTRL, 0, 0x0864},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_LOOP_FILTER, 0, 0x0027},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_PWRDN, 0, 0x0000},
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, ~0x1, 0x0001},
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, ~0x1, 0x0000},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_egress_local_timing_rxaui[] = {
+	{CS4321_HOST_SDS_COMMON_SRX0_RX_CLKDIV_CTRL, 0, 0x40d1},
+	{CS4321_HOST_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x000c},
+	{CS4321_HOST_SDS_COMMON_STX0_TX_CONFIG_LOCAL_TIMING, 0, 0x0001},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_CLKDIV_CTRL, 0, 0x4091},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_CLKOUT_CTRL, 0, 0x1864},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_CONFIG, 0, 0x090c},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_PWRDN, 0, 0x0000},
+	{CS4321_HOST_ML_SDS_COMMON_SRX0_RX_CLKDIV_CTRL, 0, 0x401d},
+	{CS4321_HOST_ML_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x000c},
+	{CS4321_HOST_ML_SDS_COMMON_STXP0_TX_CLKDIV_CTRL, 0, 0x4019},
+	{CS4321_HOST_ML_SDS_COMMON_STXP0_TX_CONFIG, 0, 0x090c},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, ~0x1, 0x0001},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, ~0x1, 0x0000},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, ~0x2, 0x0001},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, ~0x2, 0x0000},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_line_power_down[] = {
+	{CS4321_LINE_SDS_COMMON_STX0_TX_OUTPUT_CTRLA, 0, 0x0000},
+	{CS4321_LINE_SDS_COMMON_STX0_TX_OUTPUT_CTRLB, 0, 0x0000},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x2040},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_VCO_CTRL, 0, 0x01e7},
+	{CS4321_MSEQ_POWER_DOWN_LSB, 0, 0x0000},
+	{CS4321_DSP_SDS_SERDES_SRX_DAC_ENABLEB_MSB, 0, 0xffff},
+	{CS4321_DSP_SDS_SERDES_SRX_DAC_ENABLEB_LSB, 0, 0xffff},
+	{CS4321_DSP_SDS_SERDES_SRX_AGC_MISC, 0, 0x0705},
+	{CS4321_DSP_SDS_SERDES_SRX_DFE_MISC, 0, 0x002b},
+	{CS4321_DSP_SDS_SERDES_SRX_FFE_PGA_CTRL, 0, 0x0021},
+	{CS4321_DSP_SDS_SERDES_SRX_FFE_MISC, 0, 0x0013},
+	{CS4321_DSP_SDS_SERDES_SRX_FFE_INBUF_CTRL, 0, 0x0001},
+	{CS4321_DSP_SDS_SERDES_SRX_DFE0_SELECT, 0, 0x0001},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_ingress_rxaui_pcs_ra[] = {
+	/* Set fen_radj, rx_fen_xgpcs*/
+	{CS4321_GLOBAL_INGRESS_FUNCEN, ~0x0081, 0x0081},
+	/* Set rx_en_radj, rx_en_xgpcs*/
+	{CS4321_GLOBAL_INGRESS_CLKEN, ~0x0021, 0x0021},
+	/* Set tx_en_hif, tx_en_radj*/
+	{CS4321_GLOBAL_INGRESS_CLKEN2, ~0x0120, 0x0120},
+
+	{CS4321_GLOBAL_HOST_MULTILANE_CLKSEL, 0, 0x8000},
+	{CS4321_GLOBAL_HOST_MULTILANE_FUNCEN, 0, 0x0006},
+
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0xffff},
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0x0000},
+	/* MPIF DeAssert Ingress Reset */
+	{CS4321_GLOBAL_MPIF_RESET_DOTREG, ~0x0004, 0},
+
+	{CS4321_XGMAC_LINE_RX_CFG_COM, 0, 0x8010},
+	{CS4321_XGPCS_LINE_RX_RXCNTRL, 0, 0x5000},
+
+	{CS4321_RADJ_INGRESS_RX_NRA_MIN_IFG, 0, 0x0004},
+	{CS4321_RADJ_INGRESS_RX_NRA_SETTLE, 0, 0x0000},
+	{CS4321_RADJ_INGRESS_TX_ADD_FILL_CTRL, 0, 0xf001},
+	{CS4321_RADJ_INGRESS_TX_ADD_FILL_DATA0, 0, 0x0707},
+	{CS4321_RADJ_INGRESS_TX_ADD_FILL_DATA1, 0, 0x0707},
+	{CS4321_RADJ_INGRESS_TX_PRA_MIN_IFG, 0, 0x0004},
+	{CS4321_RADJ_INGRESS_TX_PRA_SETTLE, 0, 0x0000},
+	{CS4321_RADJ_INGRESS_MISC_RESET, 0, 0x0000},
+
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0002},
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0000},
+	{CS4321_RADJ_INGRESS_MISC_RESET, 0, 0x0000},
+
+	{CS4321_PM_CTRL, 0, 0x0000},
+	{CS4321_HIF_COMMON_TXCONTROL3, 0, 0x0010},
+
+	{CS4321_MSEQ_POWER_DOWN_LSB, 0, 0xe01f},
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_egress_rxaui_pcs_ra[] = {
+	/* Set tx_fen_xgpcs, fen_radj */
+	{CS4321_GLOBAL_EGRESS_FUNCEN, ~0x0180, 0x0180},
+	/* Set rx_en_hif, rx_en_radj*/
+	{CS4321_GLOBAL_EGRESS_CLKEN, ~0x0120, 0x0120},
+	/* Set tx_en_radj, tx_en_xgpcs*/
+	{CS4321_GLOBAL_EGRESS_CLKEN2, ~0x0021, 0x0021},
+
+	{CS4321_GLOBAL_HOST_MULTILANE_CLKSEL, 0, 0x8000},
+	{CS4321_GLOBAL_HOST_MULTILANE_FUNCEN, 0, 0x0006},
+
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0xffff},
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0x0000},
+	/* MPIF DeAssert Egress Reset */
+	{CS4321_GLOBAL_MPIF_RESET_DOTREG, ~0x0002, 0},
+
+	{CS4321_XGMAC_LINE_TX_CFG_COM, 0, 0xc000},
+	{CS4321_XGMAC_LINE_TX_CFG_TX_IFG, 0, 0x0005},
+	{CS4321_XGPCS_LINE_TX_TXCNTRL, 0, 0x0000},
+	{CS4321_XGRS_LINE_TX_TXCNTRL, 0, 0xc000},
+
+	{CS4321_RADJ_EGRESS_RX_NRA_MIN_IFG, 0, 0x0004},
+	{CS4321_RADJ_EGRESS_RX_NRA_SETTLE, 0, 0x0000},
+	{CS4321_RADJ_EGRESS_TX_ADD_FILL_CTRL, 0, 0xf001},
+	{CS4321_RADJ_EGRESS_TX_ADD_FILL_DATA0, 0, 0x0707},
+	{CS4321_RADJ_EGRESS_TX_ADD_FILL_DATA1, 0, 0x0707},
+	{CS4321_RADJ_EGRESS_TX_PRA_MIN_IFG, 0, 0x0004},
+	{CS4321_RADJ_EGRESS_TX_PRA_SETTLE, 0, 0x0000},
+	{CS4321_RADJ_EGRESS_MISC_RESET, 0, 0x0000},
+
+	{CS4321_PM_CTRL, 0, 0x0000},
+	{CS4321_HIF_COMMON_TXCONTROL3, 0, 0x0010},
+	{CS4321_MSEQ_POWER_DOWN_LSB, 0, 0xe01f},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_global_timer_156_25[] = {
+	{CS4321_GLOBAL_GT_10KHZ_REF_CLK_CNT0, 0, 15625},
+	{CS4321_GLOBAL_GT_10KHZ_REF_CLK_CNT1, 0, 0},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_mac_latency[] = {
+	{CS4321_MAC_LAT_CTRL_CONFIG, 0, 0},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_ref_clk_src_xaui_rxaui[] = {
+	/* Set edc_stxp_lptime_sel = 1, edc_stxp_pilot_sel = 7 */
+	{CS4321_GLOBAL_MISC_CONFIG, (u16)~0xe700, 0x2700},
+	/* Set STXP_PILOT_SEL = 7, STXP_LPTIME_SEL = 1 */
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_CONFIG, (u16)~0xe700, 0x2700},
+	{0}
+};
+
+
+static const struct cs4321_reg_modify cs4321_init_polarity_inv[] = {
+	/* Inversion disabled*/
+	/* config the slice not to invert polarity on egress */
+	{CS4321_HOST_SDS_COMMON_SRX0_RX_CONFIG, ~0x0800, 0},
+	/* config the slice not to invert polarity on ingress */
+	{CS4321_MSEQ_ENABLE_MSB, ~0x4000, 0},
+	{0}
+};
+
+#if 0
+static const struct cs4321_reg_modify cs4321_hsif_elec_mode_set_cx1_pre[] = {
+	/* Stop the micro-sequencer */
+	{CS4321_GLOBAL_MSEQCLKCTRL, 0, 0x8004},
+	{CS4321_MSEQ_OPTIONS, 0, 0xf},
+	{CS4321_MSEQ_PC, 0, 0x0},
+
+	{CS4321_MSEQ_COEF_DSP_DRIVE128, 0, 0x0114},
+	{CS4321_MSEQ_COEF_INIT_SEL,     0, 0x0004},
+	{CS4321_MSEQ_LEAK_INTERVAL_FFE, 0, 0x8010},
+	{CS4321_MSEQ_BANKSELECT, 0, 0x2},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CPA, 0, 0x55},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_LOOP_FILTER, 0, 0x3},
+	{CS4321_DSP_SDS_SERDES_SRX_DFE0_SELECT, 0, 0x1},
+	{CS4321_DSP_SDS_DSP_COEF_DFE0_SELECT, 0, 0x2},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CPB, 0, 0x2003},
+	{CS4321_DSP_SDS_SERDES_SRX_FFE_DELAY_CTRL, 0, 0xF047},
+	{CS4321_MSEQ_RESET_COUNT_LSB, 0, 0x0},
+	/* enable power savings, ignore optical module LOS */
+	{CS4321_MSEQ_SPARE2_LSB, 0, 0x5},
+
+	{CS4321_MSEQ_SPARE9_LSB, 0, 0x5},
+
+	{CS4321_MSEQ_CAL_RX_PHSEL, 0, 0x23},
+	{CS4321_DSP_SDS_DSP_COEF_LARGE_LEAK, 0, 0x2},
+	{CS4321_DSP_SDS_SERDES_SRX_DAC_ENABLEB_LSB, 0, 0x5000},
+	{CS4321_MSEQ_POWER_DOWN_LSB, 0, 0xFFFF},
+	{CS4321_MSEQ_POWER_DOWN_MSB, 0, 0x0},
+	{CS4321_MSEQ_CAL_RX_SLICER, 0, 0x80},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_SPARE, 0, 0xE0E0},
+	{CS4321_DSP_SDS_SERDES_SRX_DAC_BIAS_SELECT1_MSB, 0, 0xff},
+
+	{CS4321_MSEQ_SERDES_PARAM_LSB, 0, 0x0603},
+	{CS4321_MSEQ_SPARE11_LSB, 0, 0x0603},
+
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_hsif_elec_mode_set_cx1_2in[] = {
+	{CS4321_MSEQ_SPARE15_LSB, 0, 0x0603},
+	{CS4321_MSEQ_SPARE21_LSB, 0, 0xE},
+	{CS4321_MSEQ_SPARE23_LSB, 0, 0x0},
+	{CS4321_MSEQ_CAL_RX_DFE_EQ, 0, 0x3},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_hsif_elec_mode_set_cx1_post[] = {
+	/* Restart the micro-sequencer */
+	{CS4321_GLOBAL_MSEQCLKCTRL, 0, 0x4},
+	{CS4321_MSEQ_OPTIONS, 0, 0x7},
+	{0}
+};
+#endif
+
+static const struct cs4321_reg_modify cs4321_hsif_elec_mode_set_sr_pre[] = {
+	/* Stop the micro-sequencer */
+	{CS4321_GLOBAL_MSEQCLKCTRL, 0, 0x8004},
+	{CS4321_MSEQ_OPTIONS, 0, 0xf},
+	{CS4321_MSEQ_PC, 0, 0x0},
+
+	/* Configure the micro-sequencer for an SR transceiver */
+	{CS4321_MSEQ_COEF_DSP_DRIVE128, 0, 0x0134},
+	{CS4321_MSEQ_COEF_INIT_SEL, 0, 0x0006},
+	{CS4321_MSEQ_LEAK_INTERVAL_FFE, 0, 0x8010},
+	{CS4321_MSEQ_BANKSELECT, 0, 0x0},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CPA, 0, 0x55},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_LOOP_FILTER, 0, 0x3},
+	{CS4321_DSP_SDS_SERDES_SRX_DFE0_SELECT, 0, 0x1},
+	{CS4321_DSP_SDS_DSP_COEF_DFE0_SELECT, 0, 0x2},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CPB, 0, 0x2003},
+	{CS4321_DSP_SDS_SERDES_SRX_FFE_DELAY_CTRL, 0, 0xF048},
+
+	{CS4321_MSEQ_RESET_COUNT_LSB, 0, 0x0},
+	/* enable power savings, ignore */
+	{CS4321_MSEQ_SPARE2_LSB, 0, 0x5},
+
+	{CS4321_MSEQ_SPARE9_LSB, 0, 0x5},
+
+	{CS4321_MSEQ_CAL_RX_PHSEL, 0, 0x1e},
+	{CS4321_DSP_SDS_DSP_COEF_LARGE_LEAK, 0, 0x2},
+	{CS4321_DSP_SDS_SERDES_SRX_DAC_ENABLEB_LSB, 0, 0xD000},
+	{CS4321_MSEQ_POWER_DOWN_LSB, 0, 0xFFFF},
+	{CS4321_MSEQ_POWER_DOWN_MSB, 0, 0x0},
+	{CS4321_MSEQ_CAL_RX_SLICER, 0, 0x80},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_SPARE, 0, 0xE0E0},
+	{CS4321_DSP_SDS_SERDES_SRX_DAC_BIAS_SELECT1_MSB, 0, 0xff},
+
+	/* Setup the trace lengths for the micro-sequencer */
+	{CS4321_MSEQ_SERDES_PARAM_LSB, 0, 0x0603},
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_hsif_elec_mode_set_sr_2in[] = {
+	{CS4321_MSEQ_CAL_RX_EQADJ, 0, 0x0},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_hsif_elec_mode_set_sr_post[] = {
+	{CS4321_MSEQ_CAL_RX_DFE_EQ, 0, 0x0},
+	/* Restart the micro-sequencer */
+	{CS4321_GLOBAL_MSEQCLKCTRL, 0, 0x4},
+	{CS4321_MSEQ_OPTIONS, 0, 0x7},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_resync_vcos_xaui_rxaui[] = {
+	{CS4321_HOST_SDS_COMMON_RXVCO0_CONTROL,  (u16)~0x8000, 0x8000},
+	{CS4321_HOST_SDS_COMMON_RXVCO0_CONTROL,  (u16)~0x8000, 0},
+
+	{CS4321_HOST_SDS_COMMON_TXVCO0_CONTROL,  (u16)~0x8000, 0x8000},
+	{CS4321_HOST_SDS_COMMON_TXVCO0_CONTROL,  (u16)~0x8000, 0},
+
+	{CS4321_LINE_SDS_COMMON_RXVCO0_CONTROL,  (u16)~0x8000, 0x8000},
+	{CS4321_LINE_SDS_COMMON_RXVCO0_CONTROL,  (u16)~0x8000, 0},
+
+	{CS4321_LINE_SDS_COMMON_TXVCO0_CONTROL,  (u16)~0x8000, 0x8000},
+	{CS4321_LINE_SDS_COMMON_TXVCO0_CONTROL,  (u16)~0x8000, 0},
+
+	{CS4321_HOST_ML_SDS_COMMON_RXVCO0_CONTROL,  (u16)~0x8000, 0x8000},
+	{CS4321_HOST_ML_SDS_COMMON_RXVCO0_CONTROL,  (u16)~0x8000, 0},
+
+	{CS4321_HOST_ML_SDS_COMMON_TXVCO0_CONTROL,  (u16)~0x8000, 0x8000},
+	{CS4321_HOST_ML_SDS_COMMON_TXVCO0_CONTROL,  (u16)~0x8000, 0},
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_toggle_resets_xaui_rxaui[] = {
+	{CS4321_HOST_ML_SDS_COMMON_SRX0_RX_CONFIG, ~0x0020, 0},
+	{CS4321_HOST_ML_SDS_COMMON_STXP0_TX_PWRDN, ~0x0100, 0},
+
+	/*
+	 * Now that the device is configured toggle the ingress and
+	 * egress soft resets to make sure the device re-syncs
+	 * properly.
+	 */
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x3},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET,  0, 0x3},
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0000},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET,  0, 0x0000},
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_xaui_egress[] = {
+	{CS4321_LINE_SDS_COMMON_STX0_TX_CONFIG_LOCAL_TIMING, 0, 0x0001},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_CLKOUT_CTRL, 0, 0x0864},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_LOOP_FILTER, 0, 0x0027},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_PWRDN, 0, 0x0000},
+
+	{CS4321_HOST_SDS_COMMON_SRX0_RX_CLKDIV_CTRL, 0, 0x45d2},
+	{CS4321_HOST_SDS_COMMON_SRX0_RX_CLKOUT_CTRL, 0, 0x6a03},
+	{CS4321_HOST_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x000c},
+	{CS4321_HOST_ML_SDS_COMMON_SRX0_RX_CLKDIV_CTRL, 0, 0x412d},
+	{CS4321_HOST_ML_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x000c},
+
+	{CS4321_LINE_SDS_COMMON_STX0_TX_CONFIG_LOCAL_TIMING, 0, 0x0001},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_CLKOUT_CTRL, 0, 0x0864},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_LOOP_FILTER, 0, 0x0027},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_PWRDN, 0, 0x0000},
+
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0003},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, 0, 0xffff},
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0000},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, 0, 0x0000},
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0xffff},
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0x0000},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_xaui_ingress[] = {
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x0000},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CPA, 0, 0x0057},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_LOOP_FILTER, 0, 0x0007},
+
+	{CS4321_HOST_SDS_COMMON_STX0_TX_CONFIG_LOCAL_TIMING, 0, 0x0001},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_CLKDIV_CTRL, 0, 0x4492},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_CLKOUT_CTRL, 0, 0x1864},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_CONFIG, 0, 0x090c},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_PWRDN, 0, 0x0000},
+	{CS4321_HOST_ML_SDS_COMMON_STXP0_TX_CLKDIV_CTRL, 0, 0x4429},
+	{CS4321_HOST_ML_SDS_COMMON_STXP0_TX_CONFIG, 0, 0x090c},
+
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CONFIG, 0, 0x0000},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_CPA, 0, 0x0057},
+	{CS4321_LINE_SDS_COMMON_SRX0_RX_LOOP_FILTER, 0, 0x0007},
+
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0003},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, 0, 0xffff},
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0000},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, 0, 0x0000},
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0xffff},
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0x0000},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_ingress_1[] = {
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0002},
+	{CS4321_GLOBAL_INGRESS_SOFT_RESET, 0, 0x0000},
+	{CS4321_HOST_SDS_COMMON_STXP0_TX_PWRDN, 0, 0x0000},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_2e[] = {
+	{CS4321_GLOBAL_HOST_MULTILANE_CLKSEL, 0, 0x8000},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_2o[] = {
+	{CS4321_GLOBAL_HOST_MULTILANE_CLKSEL, 0, 0x8300},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_ingress_3[] = {
+	/* Set the device in XAUI mode */
+	{CS4321_GLOBAL_HOST_MULTILANE_FUNCEN, 0, 0x0005},
+
+	/* Enable the XGPCS and the Rate Adjust block */
+	/* Set fen_radj, rx_fen_xgpcs */
+	{CS4321_GLOBAL_INGRESS_FUNCEN, ~0x0081, 0x0081},
+
+	/* Setup the clock enables for the XGPCS and Rate Adjust block */
+	/* Set rx_en_radj, rx_en_xgpcs */
+	{CS4321_GLOBAL_INGRESS_CLKEN, ~0x0021, 0x0021},
+
+	/* Setup the clock enables for the HIF and the Rate Adjust block */
+	/* Set tx_en_hif, tx_en_radj */
+	{CS4321_GLOBAL_INGRESS_CLKEN2, ~0x0120, 0x0120},
+
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0xffff},
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0, 0x0000},
+	/* MPIF DeAssert Ingress Reset */
+	{CS4321_GLOBAL_MPIF_RESET_DOTREG, ~0x0004, 0},
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_ingress_4e[] = {
+	{CS4321_XGMAC_LINE_RX_CFG_COM, 0, 0x8010},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_ingress_4o[] = {
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_ingress_5[] = {
+	{CS4321_XGMAC_HOST_TX_CFG_TX_IFG, 0, 0x0005},
+	{CS4321_XGPCS_LINE_RX_RXCNTRL, 0, 0x5000},
+	{CS4321_XGRS_HOST_TX_TXCNTRL, 0, 0xc000},
+	{CS4321_GIGEPCS_LINE_CONTROL, 0, 0x0000},
+	{CS4321_GIGEPCS_HOST_CONTROL, 0, 0x0000},
+
+	{CS4321_RADJ_INGRESS_RX_NRA_MIN_IFG, 0, 0x0004},
+	{CS4321_RADJ_INGRESS_RX_NRA_SETTLE, 0, 0x0000},
+	{CS4321_RADJ_INGRESS_TX_ADD_FILL_CTRL, 0, 0xf001},
+	{CS4321_RADJ_INGRESS_TX_ADD_FILL_DATA0, 0, 0x0707},
+	{CS4321_RADJ_INGRESS_TX_ADD_FILL_DATA1, 0, 0x0707},
+	{CS4321_RADJ_INGRESS_TX_PRA_MIN_IFG, 0, 0x0004},
+	{CS4321_RADJ_INGRESS_TX_PRA_SETTLE, 0, 0x0000},
+	{CS4321_RADJ_INGRESS_MISC_RESET, 0, 0x0000},
+	{CS4321_PM_CTRL, 0, 0x0002},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_6e[] = {
+	{CS4321_HIF_COMMON_TXCONTROL3, 0, 0x0010},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_6o[] = {
+	{CS4321_HIF_COMMON_TXCONTROL3, 0, 0x0011},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_egress_1[] = {
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, 0, 0x1},
+	{CS4321_GLOBAL_EGRESS_SOFT_RESET, 0, 0x0000},
+	{CS4321_LINE_SDS_COMMON_STXP0_TX_PWRDN, 0, 0x0000},
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_egress_3[] = {
+	/* Set the device in XAUI mode */
+	{CS4321_GLOBAL_HOST_MULTILANE_FUNCEN, 0x0005},
+
+	/* Enable the XGPCS and the Rate Adjust block */
+	/* Set tx_fen_xgpcs, fen_radj */
+	{CS4321_GLOBAL_EGRESS_FUNCEN, ~0x0180, 0x0180},
+
+	/* Setup the clock enables for the HIF and the Rate Adjust block */
+	/* Set rx_en_hif, rx_en_radj */
+	{CS4321_GLOBAL_EGRESS_CLKEN, ~0x0120, 0x0120},
+
+	/* Setup the clock enables for the XGPCS and Rate Adjust block */
+	/* Set tx_en_radj, tx_en_xgpcs */
+	{CS4321_GLOBAL_EGRESS_CLKEN2, ~0x0021, 0x0021},
+
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0xffff},
+	{CS4321_GLOBAL_REF_SOFT_RESET, 0x0000},
+
+	/* MPIF DeAssert Egress Reset */
+	{CS4321_GLOBAL_MPIF_RESET_DOTREG, ~0x0002, 0},
+
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_egress_4e[] = {
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_egress_4o[] = {
+	{CS4321_XGMAC_LINE_TX_CFG_COM, 0, 0xc000},
+	{0}
+};
+
+static const struct cs4321_reg_modify cs4321_init_dpath_xaui_pcs_ra_egress_5[] = {
+	{CS4321_XGMAC_LINE_TX_CFG_TX_IFG, 0, 0x0005},
+	{CS4321_XGPCS_LINE_TX_TXCNTRL, 0, 0x0000},
+	{CS4321_XGRS_LINE_TX_TXCNTRL, 0, 0xc000},
+
+	{CS4321_RADJ_EGRESS_RX_NRA_MIN_IFG, 0, 0x0004},
+	{CS4321_RADJ_EGRESS_RX_NRA_SETTLE, 0, 0x0000},
+	{CS4321_RADJ_EGRESS_TX_ADD_FILL_CTRL, 0, 0xf001},
+	{CS4321_RADJ_EGRESS_TX_ADD_FILL_DATA0, 0, 0x0707},
+	{CS4321_RADJ_EGRESS_TX_ADD_FILL_DATA1, 0, 0x0707},
+	{CS4321_RADJ_EGRESS_TX_PRA_MIN_IFG, 0, 0x0004},
+	{CS4321_RADJ_EGRESS_TX_PRA_SETTLE, 0, 0x0000},
+	{CS4321_RADJ_EGRESS_MISC_RESET, 0, 0x0000},
+	{CS4321_PM_CTRL, 0, 0x0002},
+	{0}
+};
+
+const struct cs4321_multi_seq cs4321_init_rxaui_seq[] = {
+	{0, cs4321_init_prefix_seq},
+	{0, cs4321_init_egress_local_timing_rxaui},
+	{0, cs4321_init_ingress_local_timing_rxaui},
+	{0, cs4321_init_dpath_ingress_rxaui_pcs_ra},
+	{0, cs4321_init_dpath_egress_rxaui_pcs_ra},
+	{0, cs4321_resync_vcos_xaui_rxaui},
+	{0, cs4321_toggle_resets_xaui_rxaui},
+	{0, cs4321_hsif_elec_mode_set_sr_pre},
+	{0, cs4321_hsif_elec_mode_set_sr_2in},
+	{0, cs4321_hsif_elec_mode_set_sr_post},
+	{0, cs4321_init_global_timer_156_25},
+	{0, cs4321_init_mac_latency},
+	{0, cs4321_init_ref_clk_src_xaui_rxaui},
+	{0, cs4321_init_polarity_inv},
+
+	{0, NULL}
+};
+
+const struct cs4321_multi_seq cs4321_init_xaui_seq[] = {
+	{0, cs4321_init_prefix_seq},
+	/* Init egress even and odd */
+	{0, cs4321_init_xaui_egress},
+	{1, cs4321_init_xaui_egress},
+
+	/* Init ingress even and odd */
+	{0, cs4321_init_xaui_ingress},
+	{1, cs4321_init_xaui_ingress},
+
+	/* dpath ingress even and odd */
+	{0, cs4321_init_dpath_xaui_pcs_ra_ingress_1},
+	{0, cs4321_init_dpath_xaui_pcs_ra_2e},
+	{0, cs4321_init_dpath_xaui_pcs_ra_ingress_3},
+	{0, cs4321_init_dpath_xaui_pcs_ra_ingress_4e},
+	{0, cs4321_init_dpath_xaui_pcs_ra_ingress_5},
+	{0, cs4321_init_dpath_xaui_pcs_ra_6e},
+
+
+	{1, cs4321_init_dpath_xaui_pcs_ra_ingress_1},
+	{1, cs4321_init_dpath_xaui_pcs_ra_2o},
+	{1, cs4321_init_dpath_xaui_pcs_ra_ingress_3},
+	{1, cs4321_init_dpath_xaui_pcs_ra_ingress_4o},
+	{1, cs4321_init_dpath_xaui_pcs_ra_ingress_5},
+	{1, cs4321_init_dpath_xaui_pcs_ra_6o},
+
+	/* dpath egress even and odd */
+	{0, cs4321_init_dpath_xaui_pcs_ra_egress_1},
+	{0, cs4321_init_dpath_xaui_pcs_ra_2e},
+	{0, cs4321_init_dpath_xaui_pcs_ra_egress_3},
+	{0, cs4321_init_dpath_xaui_pcs_ra_egress_4e},
+	{0, cs4321_init_dpath_xaui_pcs_ra_egress_5},
+	{0, cs4321_init_dpath_xaui_pcs_ra_6e},
+
+	{1, cs4321_init_dpath_xaui_pcs_ra_egress_1},
+	{1, cs4321_init_dpath_xaui_pcs_ra_2o},
+	{1, cs4321_init_dpath_xaui_pcs_ra_egress_3},
+	{1, cs4321_init_dpath_xaui_pcs_ra_egress_4o},
+	{1, cs4321_init_dpath_xaui_pcs_ra_egress_5},
+	{1, cs4321_init_dpath_xaui_pcs_ra_6o},
+
+	/* power down the odd slice's line side */
+	{1, cs4321_init_line_power_down},
+
+	{0, cs4321_resync_vcos_xaui_rxaui},
+	{0, cs4321_toggle_resets_xaui_rxaui},
+	{0, cs4321_hsif_elec_mode_set_sr_pre},
+	{0, cs4321_hsif_elec_mode_set_sr_2in},
+	{0, cs4321_hsif_elec_mode_set_sr_post},
+	{0, cs4321_init_global_timer_156_25},
+	{0, cs4321_init_mac_latency},
+	{0, cs4321_init_ref_clk_src_xaui_rxaui},
+	{0, cs4321_init_polarity_inv},
+
+	{0, NULL}
+};
+
+static int cs4321_phy_read_x(struct phy_device *phydev, int off, u16 regnum)
+{
+	return mdiobus_read(phydev->bus, phydev->addr + off,
+			    MII_ADDR_C45 | regnum);
+}
+
+static int cs4321_phy_write_x(struct phy_device *phydev, int off,
+			      u16 regnum, u16 val)
+{
+	return mdiobus_write(phydev->bus, phydev->addr + off,
+			     MII_ADDR_C45 | regnum, val);
+}
+static int cs4321_phy_read(struct phy_device *phydev, u16 regnum)
+{
+	return cs4321_phy_read_x(phydev, 0, regnum);
+}
+
+static int cs4321_phy_write(struct phy_device *phydev, u16 regnum, u16 val)
+{
+	return cs4321_phy_write_x(phydev, 0, regnum, val);
+}
+
+static int cs4321_write_seq_x(struct phy_device *phydev, int off,
+			    const struct cs4321_reg_modify *seq)
+{
+	int last_reg = -1;
+	int last_val = 0;
+	int ret = 0;
+
+	while (seq->reg) {
+		if (seq->mask_bits) {
+			if (last_reg != seq->reg) {
+				ret = cs4321_phy_read_x(phydev, off, seq->reg);
+				if (ret < 0)
+					goto err;
+				last_val = ret;
+			}
+			last_val &= seq->mask_bits;
+		} else {
+			last_val = 0;
+		}
+		last_val |= seq->set_bits;
+		ret = cs4321_phy_write_x(phydev, off, seq->reg, last_val);
+		if (ret < 0)
+			goto err;
+		seq++;
+	}
+err:
+	return ret;
+}
+
+static int cs4321_write_multi_seq(struct phy_device *phydev,
+				  const struct cs4321_multi_seq *m)
+{
+	int ret = 0;
+
+	while (m->seq) {
+		ret = cs4321_write_seq_x(phydev, m->reg_offset, m->seq);
+		if (ret)
+			goto err;
+		m++;
+	}
+
+err:
+	return ret;
+}
+
+static int cs4321_write_seq(struct phy_device *phydev,
+			    const struct cs4321_reg_modify *seq)
+{
+	return cs4321_write_seq_x(phydev, 0, seq);
+}
+
+static int cs4321_write_multi_reg(struct phy_device *phydev, u16 *dat, int cnt)
+{
+	int i;
+	int ret = 0;
+	for (i = 0; i < (cnt * 2); i += 2) {
+		u16 reg = dat[i];
+		u16 val = dat[i + 1];
+		ret = cs4321_phy_write(phydev, reg, val);
+		if (ret)
+			break;
+	}
+	return ret;
+}
+
+static int cs4321_write_microcode_slice(struct phy_device *phydev, int s)
+{
+	int i;
+	int ret;
+
+	ret = cs4321_phy_write(phydev, 0x024f, s);
+	if (ret)
+		return ret;
+
+	for (i = 0; i < 512; i++) {
+		ret = cs4321_phy_write(phydev,
+				       0x0201,
+				       cs4321_microcode_slices[s][2 * i + 0]);
+		if (ret)
+			return ret;
+
+		ret = cs4321_phy_write(phydev,
+				       0x0202,
+				       cs4321_microcode_slices[s][2 * i + 1]);
+		if (ret)
+			return ret;
+		ret = cs4321_phy_write(phydev, 0x0200, 0x9000 + i);
+		if (ret)
+			return ret;
+	}
+	return 0;
+}
+
+static int cs4321_write_microcode(struct phy_device *phydev)
+{
+	int i;
+	int ret;
+
+	ret = cs4321_write_multi_reg(phydev,
+				     cs4321_microcode_prolog,
+				     ARRAY_SIZE(cs4321_microcode_prolog) / 2);
+	if (ret)
+		return ret;
+
+	for (i = 0; i < 8; i++) {
+		ret = cs4321_write_microcode_slice(phydev, i);
+		if (ret)
+			return ret;
+	}
+	ret = cs4321_write_multi_reg(phydev,
+				     cs4321_microcode_epilog,
+				     ARRAY_SIZE(cs4321_microcode_epilog) / 2);
+	return ret;
+}
+
+static int cs4321_reset(struct phy_device *phydev)
+{
+	int ret;
+	int retry;
+
+	ret = cs4321_phy_write(phydev, CS4321_GLOBAL_MPIF_SOFT_RESET, 0xdead);
+	if (ret)
+		goto err;
+
+	msleep(100);
+
+	/* Disable eeprom loading */
+	ret = cs4321_phy_write(phydev, CS4321_EEPROM_LOADER_CONTROL, 2);
+	if (ret)
+		goto err;
+
+	retry = 0;
+	do {
+		if (retry > 0)
+			mdelay(1);
+		ret = cs4321_phy_read(phydev, CS4321_EEPROM_LOADER_STATUS);
+		if (ret < 0)
+			goto err;
+		retry++;
+	} while ((ret & 4) == 0 && retry < 10);
+
+	if ((ret & 4) == 0) {
+		ret = -ENXIO;
+		goto err;
+	}
+
+	ret = cs4321_write_seq(phydev, cs4321_soft_reset_registers);
+	if (ret)
+		goto err;
+
+	ret = cs4321_write_microcode(phydev);
+	if (ret)
+		goto err;
+
+
+	ret = cs4321_write_seq(phydev, cs4321_68xx_4_nic_init);
+	if (ret)
+		goto err;
+
+err:
+	return ret;
+}
+
+int cs4321_init_rxaui(struct phy_device *phydev)
+{
+	return cs4321_write_multi_seq(phydev,
+				      cs4321_init_rxaui_seq);
+}
+
+int cs4321_init_xaui(struct phy_device *phydev)
+{
+	return cs4321_write_multi_seq(phydev,
+				      cs4321_init_xaui_seq);
+
+}
+
+int cs4321_config_init(struct phy_device *phydev)
+{
+	int ret;
+	struct cs4321_private *p = phydev->priv;
+	const struct cs4321_multi_seq *init_seq;
+
+	ret = cs4321_reset(phydev);
+	if (ret)
+		goto err;
+
+	init_seq = (p->mode == XAUI) ?
+		cs4321_init_xaui_seq : cs4321_init_rxaui_seq;
+
+	ret = cs4321_write_multi_seq(phydev, init_seq);
+
+	phydev->state = PHY_NOLINK;
+
+err:
+	return ret;
+}
+
+int cs4321_probe(struct phy_device *phydev)
+{
+	int ret = 0;
+	int id_lsb, id_msb;
+	enum cs4321_host_mode host_mode;
+	const char *prop_val;
+	struct cs4321_private *p;
+	/*
+	 * CS4312 keeps its ID values in non-standard registers, make
+	 * sure we are talking to what we think we are.
+	 */
+	id_lsb = cs4321_phy_read(phydev, CS4321_GLOBAL_CHIP_ID_LSB);
+	if (id_lsb < 0) {
+		ret = id_lsb;
+		goto err;
+	}
+
+	id_msb = cs4321_phy_read(phydev, CS4321_GLOBAL_CHIP_ID_MSB);
+	if (id_msb < 0) {
+		ret = id_msb;
+		goto err;
+	}
+
+	if (id_lsb != 0x23E5 || id_msb != 0x1002) {
+		ret = -ENODEV;
+		goto err;
+	}
+	ret = of_property_read_string(phydev->dev.of_node,
+				      "cortina,host-mode", &prop_val);
+	if (ret)
+		goto err;
+
+	if (strcmp(prop_val, "rxaui") == 0)
+		host_mode = RXAUI;
+	else if (strcmp(prop_val, "xaui") == 0)
+		host_mode = XAUI;
+	else {
+		dev_err(&phydev->dev,
+			"Invalid \"cortina,host-mode\" property: \"%s\"\n",
+			prop_val);
+		ret = -EINVAL;
+		goto err;
+	}
+	p = devm_kzalloc(&phydev->dev, sizeof(*p), GFP_KERNEL);
+	if (!p) {
+		ret = -ENOMEM;
+		goto err;
+	}
+	p->mode = host_mode;
+	phydev->priv = p;
+err:
+	return ret;
+}
+
+int cs4321_config_aneg(struct phy_device *phydev)
+{
+	return -EINVAL;
+}
+
+int cs4321_read_status(struct phy_device *phydev)
+{
+	int gpio_int_status;
+	int ret = 0;
+
+	gpio_int_status = cs4321_phy_read(phydev, CS4321_GPIO_GPIO_INTS);
+	if (gpio_int_status < 0) {
+		ret = gpio_int_status;
+		goto err;
+	}
+	if (gpio_int_status & 0x8) {
+		/* Up when edc_convergedS set. */
+		phydev->speed = 10000;
+		phydev->duplex = 1;
+		phydev->link = 1;
+	} else {
+		phydev->link = 0;
+	}
+
+err:
+	return ret;
+}
+
+static struct of_device_id cs4321_match[] = {
+	{
+		.compatible = "cortina,cs4321",
+	},
+	{
+		.compatible = "cortina,cs4318",
+	},
+	{},
+};
+MODULE_DEVICE_TABLE(of, cs4321_match);
+
+static struct phy_driver cs4321_phy_driver = {
+	.phy_id		= 0xffffffff,
+	.phy_id_mask	= 0xffffffff,
+	.name		= "Cortina CS4321",
+	.config_init	= cs4321_config_init,
+	.probe		= cs4321_probe,
+	.config_aneg	= cs4321_config_aneg,
+	.read_status	= cs4321_read_status,
+	.driver		= {
+		.owner = THIS_MODULE,
+		.of_match_table = cs4321_match,
+	},
+};
+
+static int __init cs4321_drv_init(void)
+{
+	int ret;
+
+	ret = phy_driver_register(&cs4321_phy_driver);
+
+	return ret;
+}
+module_init(cs4321_drv_init);
+
+static void __exit cs4321_drv_exit(void)
+{
+	phy_driver_unregister(&cs4321_phy_driver);
+}
+module_exit(cs4321_drv_exit);
-- 
1.7.2.3

^ permalink raw reply related

* Re: [PATCH] xen/netback: calculate correctly the SKB slots.
From: Konrad Rzeszutek Wilk @ 2012-05-22 18:01 UTC (permalink / raw)
  To: Ben Hutchings
  Cc: xen-devel, ian.campbell, netdev, davem, linux-kernel,
	Adnan Misherfi
In-Reply-To: <1337627640.2979.33.camel@bwh-desktop.uk.solarflarecom.com>

On Mon, May 21, 2012 at 08:14:00PM +0100, Ben Hutchings wrote:
> On Mon, 2012-05-21 at 13:36 -0400, Konrad Rzeszutek Wilk wrote:
> > From: Adnan Misherfi <adnan.misherfi@oracle.com>
> > 
> > A programming error cause the calculation of receive SKB slots to be
> > wrong, which caused the RX ring to be erroneously declared full,
> > and the receive queue to be stopped. The problem shows up when two
> > guest running on the same server tries to communicates using large
> > MTUs. Each guest is connected to a bridge with VLAN over bond
> > interface, so traffic from one guest leaves the server on one bridge
> > and comes back to the second guest on the second bridge. This can be
> > reproduces using ping, and one guest as follow:
> > 
> > - Create active-back bond (bond0)
> > - Set up VLAN 5 on bond0 (bond0.5)
> > - Create a bridge (br1)
> > - Add bond0.5 to a bridge (br1)
> > - Start a guest and connect it to br1
> > - Set MTU of 9000 across the link
> > 
> > Ping the guest from an external host using packet sizes of 3991, and
> > 4054; ping -s 3991 -c 128 "Guest-IP-Address"
> > 
> > At the beginning ping works fine, but after a while ping packets do
> > not reach the guest because the RX ring becomes full, and the queue
> > get stopped. Once the problem accrued, the only way to get out of it
> > is to reboot the guest, or use xm network-detach/network-attach.
> > 
> > ping works for packets sizes 3990,3992, and many other sizes including
> > 4000,5000,9000, and 1500 ..etc. MTU size of 3991,4054 are the sizes
> > that quickly reproduce this problem.
> > 
> > Signed-off-by: Adnan Misherfi <adnan.misherfi@oracle.com>
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > ---
> >  drivers/net/xen-netback/netback.c |    2 +-
> >  1 files changed, 1 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
> > index 957cf9d..e382e5b 100644
> > --- a/drivers/net/xen-netback/netback.c
> > +++ b/drivers/net/xen-netback/netback.c
> > @@ -212,7 +212,7 @@ unsigned int xenvif_count_skb_slots(struct xenvif *vif, struct sk_buff *skb)
> 
> The function name is xen_netbk_count_skb_slots() in net-next.  This
> appears to depend on the series in
> <http://lists.xen.org/archives/html/xen-devel/2012-01/msg00982.html>.

Ah, this was based off 3.4.

> 
> >  	int i, copy_off;
> >  
> >  	count = DIV_ROUND_UP(
> > -			offset_in_page(skb->data)+skb_headlen(skb), PAGE_SIZE);
> > +			offset_in_page(skb->data + skb_headlen(skb)), PAGE_SIZE);
> 
> The new version would be equivalent to:
> 	count = offset_in_page(skb->data + skb_headlen(skb)) != 0;
> which is not right, as netbk_gop_skb() will use one slot per page.
> 
> The real problem is likely that you're not using the same condition to
> stop and wake the queue.  Though it appears you're also missing an

Hmm..
> smp_mb() at the top of xenvif_notify_tx_completion().
> 
> Ben.
> 
> >  	copy_off = skb_headlen(skb) % PAGE_SIZE;
> >  
> 
> -- 
> Ben Hutchings, Staff Engineer, Solarflare
> Not speaking for my employer; that's the marketing department's job.
> They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply

* Re: [PATCH] xen/netback: calculate correctly the SKB slots.
From: Konrad Rzeszutek Wilk @ 2012-05-22 18:09 UTC (permalink / raw)
  To: Ian Campbell
  Cc: Ben Hutchings, xen-devel@lists.xensource.com,
	netdev@vger.kernel.org, davem@davemloft.net,
	linux-kernel@vger.kernel.org, Adnan Misherfi
In-Reply-To: <1337678512.10118.40.camel@zakaz.uk.xensource.com>

> > > wrong, which caused the RX ring to be erroneously declared full,
> > > and the receive queue to be stopped. The problem shows up when two
> > > guest running on the same server tries to communicates using large
.. snip..
> > The function name is xen_netbk_count_skb_slots() in net-next.  This
> > appears to depend on the series in
> > <http://lists.xen.org/archives/html/xen-devel/2012-01/msg00982.html>.
> 
> Yes, I don't think that patchset was intended for prime time just yet.
> Can this issue be reproduced without it?

It was based on 3.4, but the bug and work to fix this was  done on top of
a 3.4 version of netback backported in a 3.0 kernel. Let me double check
whether there were some missing patches.

> 
> > >  	int i, copy_off;
> > >  
> > >  	count = DIV_ROUND_UP(
> > > -			offset_in_page(skb->data)+skb_headlen(skb), PAGE_SIZE);
> > > +			offset_in_page(skb->data + skb_headlen(skb)), PAGE_SIZE);
> > 
> > The new version would be equivalent to:
> > 	count = offset_in_page(skb->data + skb_headlen(skb)) != 0;
> > which is not right, as netbk_gop_skb() will use one slot per page.
> 
> Just outside the context of this patch we separately count the frag
> pages.
> 
> However I think you are right if skb->data covers > 1 page, since the
> new version can only ever return 0 or 1. I expect this patch papers over
> the underlying issue by not stopping often enough, rather than actually
> fixing the underlying issue.

Ah, any thoughts? Have you guys seen this behavior as well?
> 
> > The real problem is likely that you're not using the same condition to
> > stop and wake the queue.
> 
> Agreed, it would be useful to see the argument for this patch presented
> in that light. In particular the relationship between
> xenvif_rx_schedulable() (used to wake queue) and
> xen_netbk_must_stop_queue() (used to stop queue).

Do you have any debug patches to ... do open-heart surgery on the
rings of netback as its hitting the issues Adnan has found?

> 
> As it stands the description describes a setup which can repro the
> problem but doesn't really analyse what actually happens, nor justify
> the correctness of the fix.

Hm, Adnan - you dug in to this and you got tons of notes. Could you
describe what you saw that caused this?

^ permalink raw reply

* Re: [PATCH 4/5] netdev/phy: Add driver for Broadcom BCM87XX 10G Ethernet PHYs
From: Joe Perches @ 2012-05-22 18:17 UTC (permalink / raw)
  To: David Daney
  Cc: devicetree-discuss, Grant Likely, Rob Herring, David S. Miller,
	netdev, linux-kernel, linux-mips, Andy Fleming, David Daney
In-Reply-To: <1337709592-23347-5-git-send-email-ddaney.cavm@gmail.com>

On Tue, 2012-05-22 at 10:59 -0700, David Daney wrote:
> From: David Daney <david.daney@cavium.com>

trivia:

> diff --git a/drivers/net/phy/bcm87xx.c b/drivers/net/phy/bcm87xx.c
[]
> @@ -0,0 +1,237 @@

> +static int bcm87xx_of_reg_init(struct phy_device *phydev)
> +{
> +	const __be32 *paddr;
> +	int len, i, ret;
> +
> +	if (!phydev->dev.of_node)
> +		return 0;
> +
> +	paddr = of_get_property(phydev->dev.of_node,
> +				"broadcom,c45-reg-init", &len);
> +	if (!paddr || len < (4 * sizeof(*paddr)))
> +		return 0;
> +
> +	ret = 0;
> +	len /= sizeof(*paddr);
> +	for (i = 0; i < len - 3; i += 4) {
> +		u16 devid = be32_to_cpup(paddr + i);
> +		u16 reg = be32_to_cpup(paddr + i + 1);
> +		u16 mask = be32_to_cpup(paddr + i + 2);
> +		u16 val_bits = be32_to_cpup(paddr + i + 3);
> +		int val;

These might read better as

	len /= 4;
	for (i = 0; i < len; i++) {
		u16 devid	= be32_to_cpu(*paddr++);
		u16 reg		= be32_to_cpu(*paddr++);
		u16 mask	= be32_to_cpu(*paddr++);
		u16 val_bits	= be32_to_cpu(*paddr++);
		...
	}

^ permalink raw reply

* Fw: [Bug 43277] New: net/e1000e set mtu larger than 1500 fails
From: Stephen Hemminger @ 2012-05-22 18:19 UTC (permalink / raw)
  To: netdev; +Cc: e1000-devel



Begin forwarded message:

Date: Tue, 22 May 2012 18:13:21 +0000 (UTC)
From: bugzilla-daemon@bugzilla.kernel.org
To: shemminger@linux-foundation.org
Subject: [Bug 43277] New: net/e1000e set mtu larger than 1500 fails


https://bugzilla.kernel.org/show_bug.cgi?id=43277

           Summary: net/e1000e set mtu larger than 1500 fails
           Product: Networking
           Version: 2.5
    Kernel Version: 3.4
          Platform: All
        OS/Version: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: IPV4
        AssignedTo: shemminger@linux-foundation.org
        ReportedBy: che@chrekh.se
        Regression: Yes


In kernel 3.4 I can no longer use jumbo-frames with my e1000e network
interface.

 $ sudo ip link set eth1 mtu 9000
 RTNETLINK answers: Invalid argument

Card-info (from kernel-log)

 e1000e 0000:05:00.1: eth1: (PCI Express:2.5GT/s:Width x4) 00:1b:78:59:84:25
 e1000e 0000:05:00.1: eth1: Intel(R) PRO/1000 Network Connection
 e1000e 0000:05:00.1: eth1: MAC: 0, PHY: 4, PBA No: D51930-003

I have bisected and found:

 70495a500d787c0c90a136acf454cb7d0eecd82e is the first bad commit

-- 
Configure bugmail: https://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.

^ permalink raw reply

* Re: [Bug 43277] New: net/e1000e set mtu larger than 1500 fails
From: Stephen Hemminger @ 2012-05-22 18:25 UTC (permalink / raw)
  To: che; +Cc: netdev, e1000-devel
In-Reply-To: <20120522111950.4548747c@nehalam.linuxnetplumber.net>

On Tue, 22 May 2012 11:19:50 -0700
Stephen Hemminger <shemminger@vyatta.com> wrote:

> 
> 
> Begin forwarded message:
> 
> Date: Tue, 22 May 2012 18:13:21 +0000 (UTC)
> From: bugzilla-daemon@bugzilla.kernel.org
> To: shemminger@linux-foundation.org
> Subject: [Bug 43277] New: net/e1000e set mtu larger than 1500 fails
> 
> 
> https://bugzilla.kernel.org/show_bug.cgi?id=43277
> 
>            Summary: net/e1000e set mtu larger than 1500 fails
>            Product: Networking
>            Version: 2.5
>     Kernel Version: 3.4
>           Platform: All
>         OS/Version: Linux
>               Tree: Mainline
>             Status: NEW
>           Severity: normal
>           Priority: P1
>          Component: IPV4
>         AssignedTo: shemminger@linux-foundation.org
>         ReportedBy: che@chrekh.se
>         Regression: Yes
> 
> 
> In kernel 3.4 I can no longer use jumbo-frames with my e1000e network
> interface.
> 
>  $ sudo ip link set eth1 mtu 9000
>  RTNETLINK answers: Invalid argument

I believe the problem is detected here. Check system console log (dmesg).
The hardware does not allow receive hashing and checksum offload together
in Jumbo mode.

	/*
	 * IP payload checksum (enabled with jumbos/packet-split when
	 * Rx checksum is enabled) and generation of RSS hash is
	 * mutually exclusive in the hardware.
	 */
	if ((netdev->features & NETIF_F_RXCSUM) &&
	    (netdev->features & NETIF_F_RXHASH)) {
		e_err("Jumbo frames cannot be enabled when both receive checksum offload and receive hashing are enabled.  Disable one of the receive offload features before enabling jumbos.\n");
		return -EINVAL;
	}

^ permalink raw reply

* Re: [PATCH 4/5] netdev/phy: Add driver for Broadcom BCM87XX 10G Ethernet PHYs
From: David Daney @ 2012-05-22 18:26 UTC (permalink / raw)
  To: Joe Perches
  Cc: David Daney, devicetree-discuss@lists.ozlabs.org, Grant Likely,
	Rob Herring, David S. Miller, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-mips@linux-mips.org,
	Fleming Andy-AFLEMING
In-Reply-To: <1337710660.3432.8.camel@joe2Laptop>

On 05/22/2012 11:17 AM, Joe Perches wrote:
> On Tue, 2012-05-22 at 10:59 -0700, David Daney wrote:
>> From: David Daney<david.daney@cavium.com>
>
> trivia:

As long as we are splitting hairs...

>
>> diff --git a/drivers/net/phy/bcm87xx.c b/drivers/net/phy/bcm87xx.c
> []
>> @@ -0,0 +1,237 @@
>
>> +static int bcm87xx_of_reg_init(struct phy_device *phydev)
>> +{
>> +	const __be32 *paddr;
>> +	int len, i, ret;
>> +
>> +	if (!phydev->dev.of_node)
>> +		return 0;
>> +
>> +	paddr = of_get_property(phydev->dev.of_node,
>> +				"broadcom,c45-reg-init",&len);
>> +	if (!paddr || len<  (4 * sizeof(*paddr)))
>> +		return 0;
>> +
>> +	ret = 0;
>> +	len /= sizeof(*paddr);
>> +	for (i = 0; i<  len - 3; i += 4) {
>> +		u16 devid = be32_to_cpup(paddr + i);
>> +		u16 reg = be32_to_cpup(paddr + i + 1);
>> +		u16 mask = be32_to_cpup(paddr + i + 2);
>> +		u16 val_bits = be32_to_cpup(paddr + i + 3);
>> +		int val;
>
> These might read better as
>
> 	len /= 4;

Where did the magic value of 4 come from?

> 	for (i = 0; i<  len; i++) {
> 		u16 devid	= be32_to_cpu(*paddr++);
> 		u16 reg		= be32_to_cpu(*paddr++);
> 		u16 mask	= be32_to_cpu(*paddr++);
> 		u16 val_bits	= be32_to_cpu(*paddr++);

Is the main problem that they didn't align, or that the index was 
explicit instead of implicit?

^ permalink raw reply

* RE: [Bug 43277] New: net/e1000e set mtu larger than 1500 fails
From: Allan, Bruce W @ 2012-05-22 18:28 UTC (permalink / raw)
  To: Stephen Hemminger, che@chrekh.se
  Cc: netdev@vger.kernel.org, e1000-devel@lists.sf.net
In-Reply-To: <20120522112518.70294c0e@nehalam.linuxnetplumber.net>

> -----Original Message-----
> From: netdev-owner@vger.kernel.org [mailto:netdev-
> owner@vger.kernel.org] On Behalf Of Stephen Hemminger
> Sent: Tuesday, May 22, 2012 11:25 AM
> To: che@chrekh.se
> Cc: netdev@vger.kernel.org; e1000-devel@lists.sf.net
> Subject: Re: [Bug 43277] New: net/e1000e set mtu larger than 1500
> fails
> 
> On Tue, 22 May 2012 11:19:50 -0700
> Stephen Hemminger <shemminger@vyatta.com> wrote:
> 
> >
> >
> > Begin forwarded message:
> >
> > Date: Tue, 22 May 2012 18:13:21 +0000 (UTC)
> > From: bugzilla-daemon@bugzilla.kernel.org
> > To: shemminger@linux-foundation.org
> > Subject: [Bug 43277] New: net/e1000e set mtu larger than 1500 fails
> >
> >
> > https://bugzilla.kernel.org/show_bug.cgi?id=43277
> >
> >            Summary: net/e1000e set mtu larger than 1500 fails
> >            Product: Networking
> >            Version: 2.5
> >     Kernel Version: 3.4
> >           Platform: All
> >         OS/Version: Linux
> >               Tree: Mainline
> >             Status: NEW
> >           Severity: normal
> >           Priority: P1
> >          Component: IPV4
> >         AssignedTo: shemminger@linux-foundation.org
> >         ReportedBy: che@chrekh.se
> >         Regression: Yes
> >
> >
> > In kernel 3.4 I can no longer use jumbo-frames with my e1000e
> network
> > interface.
> >
> >  $ sudo ip link set eth1 mtu 9000
> >  RTNETLINK answers: Invalid argument
> 
> I believe the problem is detected here. Check system console log
> (dmesg).
> The hardware does not allow receive hashing and checksum offload
> together
> in Jumbo mode.
> 
> 	/*
> 	 * IP payload checksum (enabled with jumbos/packet-split when
> 	 * Rx checksum is enabled) and generation of RSS hash is
> 	 * mutually exclusive in the hardware.
> 	 */
> 	if ((netdev->features & NETIF_F_RXCSUM) &&
> 	    (netdev->features & NETIF_F_RXHASH)) {
> 		e_err("Jumbo frames cannot be enabled when both receive
> checksum offload and receive hashing are enabled.  Disable one of the
> receive offload features before enabling jumbos.\n");
> 		return -EINVAL;
> 	}

That is correct.

^ permalink raw reply

* Re: [PATCH] xen: do not disable netfront in dom0
From: Konrad Rzeszutek Wilk @ 2012-05-22 18:34 UTC (permalink / raw)
  To: Marek Marczykowski, davem
  Cc: netdev, Jeremy Fitzhardinge, virtualization, linux-kernel,
	xen-devel
In-Reply-To: <20120522130558.D828E6C7@duch.mimuw.edu.pl>

On Sun, May 20, 2012 at 01:45:10PM +0200, Marek Marczykowski wrote:
> Netfront driver can be also useful in dom0, eg when all NICs are assigned to
> some domU (aka driver domain). Then using netback in domU and netfront in dom0
> is the only way to get network access in dom0.
> 
> Signed-off-by: Marek Marczykowski <marmarek@invisiblethingslab.com>

Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>


> ---
>  drivers/net/xen-netfront.c |    6 ------
>  1 files changed, 0 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
> index 698b905..e31ebff 100644
> --- a/drivers/net/xen-netfront.c
> +++ b/drivers/net/xen-netfront.c
> @@ -1953,9 +1953,6 @@ static int __init netif_init(void)
>  	if (!xen_domain())
>  		return -ENODEV;
>  
> -	if (xen_initial_domain())
> -		return 0;
> -
>  	printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n");
>  
>  	return xenbus_register_frontend(&netfront_driver);
> @@ -1965,9 +1962,6 @@ module_init(netif_init);
>  
>  static void __exit netif_exit(void)
>  {
> -	if (xen_initial_domain())
> -		return;
> -
>  	xenbus_unregister_driver(&netfront_driver);
>  }
>  module_exit(netif_exit);
> -- 
> 1.7.4.4

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox