Netdev List
 help / color / mirror / Atom feed
* Re: [PATCH net-next] vxlan: preserve type of dst_port parm for encap_bypass_if_local()
From: Jiri Benc @ 2017-01-19 18:16 UTC (permalink / raw)
  To: Lance Richardson; +Cc: netdev
In-Reply-To: <1484771097-5692-1-git-send-email-lrichard@redhat.com>

On Wed, 18 Jan 2017 15:24:57 -0500, Lance Richardson wrote:
> Eliminate sparse warning by maintaining type of dst_port
> as __be16.

Fixes: fee1fad7c73d ("vxlan: simplify RTF_LOCAL handling.")

> Signed-off-by: Lance Richardson <lrichard@redhat.com>

Acked-by: Jiri Benc <jbenc@redhat.com>

^ permalink raw reply

* Re: xennet_start_xmit assumptions
From: Sowmini Varadhan @ 2017-01-19 18:47 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Paul.Durrant, wei.liu2, xen-devel, konrad.wilk
In-Reply-To: <20170119.113759.555556955190770932.davem@davemloft.net>

On (01/19/17 11:37), David Miller wrote:
> 
> I thought we had code which made sure that at least a minimal
> link layer header was present in the SKB?
> 
> Specifically I'm talking about the dev_validate_header() check.
> That is supposed to protect us from these kinds of situations.

ah, but I run my pf_packet application as root, so I have 
capable(CAP_SYS_RAWIO), so I slip through the dev_validate_header()
check.

--Sowmini

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply

* Re: Inconsistency in packet drop due to MTU (eth vs veth)
From: Eric Dumazet @ 2017-01-19 18:53 UTC (permalink / raw)
  To: Fredrik Markstrom
  Cc: netdev, Evan Jones, David S. Miller, Cong Wang,
	Greg Kroah-Hartman, Vijay Pandurangan, linux-kernel
In-Reply-To: <159b79aa979.e23be6a5186096.2767722456700391441@gmail.com>

On Thu, 2017-01-19 at 17:41 +0100, Fredrik Markstrom wrote:
> Hello,
> 
> I've noticed an inconsistency between how physical ethernet and veth handles mtu.
> 
> If I setup two physical interfaces (directly connected) with different mtu:s, only the size of the outgoing packets are limited by the mtu. But with veth a packet is dropped if the mtu of the receiving interface is smaller then the packet size. 
> 
> This seems inconsistent to me, but maybe there is a reason for it ? 
> 
> Can someone confirm if it's a deliberate inconsistency or just a side effect of using dev_forward_skb() ?

It looks this was added in commit
38d408152a86598a50680a82fe3353b506630409
("veth: Allow setting the L3 MTU")

But what was really needed here was a way to change MRU :(

^ permalink raw reply

* Re: [PATCH net-next v4] bridge: multicast to unicast
From: Stephen Hemminger @ 2017-01-19 19:05 UTC (permalink / raw)
  To: Linus Lüssing
  Cc: Nikolay Aleksandrov, netdev, bridge, linux-wireless, linux-kernel,
	David S . Miller, Felix Fietkau
In-Reply-To: <20170119024510.3284-1-linus.luessing@c0d3.blue>

On Thu, 19 Jan 2017 03:45:10 +0100
Linus Lüssing <linus.luessing@c0d3.blue> wrote:

> From: Felix Fietkau <nbd@nbd.name>
> 
> Implements an optional, per bridge port flag and feature to deliver
> multicast packets to any host on the according port via unicast
> individually. This is done by copying the packet per host and
> changing the multicast destination MAC to a unicast one accordingly.
> 
> multicast-to-unicast works on top of the multicast snooping feature of
> the bridge. Which means unicast copies are only delivered to hosts which
> are interested in it and signalized this via IGMP/MLD reports
> previously.
> 
> This feature is intended for interface types which have a more reliable
> and/or efficient way to deliver unicast packets than broadcast ones
> (e.g. wifi).
> 
> However, it should only be enabled on interfaces where no IGMPv2/MLDv1
> report suppression takes place. This feature is disabled by default.
> 
> The initial patch and idea is from Felix Fietkau.
> 
> Signed-off-by: Felix Fietkau <nbd@nbd.name>
> [linus.luessing@c0d3.blue: various bug + style fixes, commit message]
> Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
> 

In general this looks good.

One issue I see is how existing entries are handled when the bridge port flags
are changed dynamically. It might be better to always record the necessary data
in the bridge_port_group and not have a per-entry flag bit. In your current
patch the API changes the response to future IGMP but does not take instant
effect. Code would be simpler if there was less logic to handle per-entry flags.

Also, you might want to add sysfs interface for the attribute as well.

^ permalink raw reply

* Re: [RFC] RESEND - rdmatool - tool for RDMA users
From: Leon Romanovsky @ 2017-01-19 19:12 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Bart Van Assche, Or Gerlitz, Ariel Almog,
	linux-rdma@vger.kernel.org, Linux Netdev List
In-Reply-To: <20170119180308.GD8109@obsidianresearch.com>

[-- Attachment #1: Type: text/plain, Size: 2586 bytes --]

On Thu, Jan 19, 2017 at 11:03:08AM -0700, Jason Gunthorpe wrote:
> On Thu, Jan 19, 2017 at 08:33:26AM +0200, Leon Romanovsky wrote:
> > On Wed, Jan 18, 2017 at 01:45:14PM -0800, Bart Van Assche wrote:
> > > On 01/18/2017 10:31 AM, Jason Gunthorpe wrote:
> > > > I think it depends on what this tool is supposed to cover, but based
> > > > on the description, I would start with netlink-only.
> > > >
> > > > The only place verbs covers a similar ground is in 'device
> > > > capabilities' - for some of that you might want to open a new-uAPI
> > > > verbs fd, but even the capability data from that would not be
> > > > totally offensive to be accessed over netlink.
> > > >
> > > > IMHO netlink should cover almost everything found in sysfs today.
> > >
> > > We would need a very strong argument to introduce a netlink API that
> > > duplicates existing sysfs API functionality. Since the sysfs API is
> > > extensible, why not extend that API further? E.g. the SCST sysfs API
> > > shows that more is possible with sysfs than what most kernel drivers
> > > realize.
> >
> > We didn't look deeply on sysfs mainly because it is unpopular
> > in netdev community. Maybe we were misled and it is simply not true.
>
> sysfs is unpopular because the 'one value per file' dogma is laregly
> unsuitable for complex mulit-value atomic changes which are common in
> netdev. You can force it to work, but it is pretty horrible..
>
> It is also very expensive if you want to shuttle a lot of data, eg I
> could not see doing something like 'netstat' for IB through sysfs
>
> Maybe you should start by showing some examples of command out you
> wish to have in a rdmatool ..

Ariel wrote very simplified version in his proposal:
Functionality
*************
The rdmatool will provide a platform which can grow as needed. The
initial functionality might include:
* help – man page
* version – version number
* statistics – RDMA statistics – such as port and QP statistics
  	       To allow easy reading of statistics, we offer to use a filter
  	       functionality, allowing reading of statistics families, such
	       as link layer, error counters, etc.
* protocol – RoCE/iWARP/InfiniBand related configuration, such as RDMA
	     congestion configuration and statistics
* query – RDMA objects (qp, cq, srq, ..) information such as owner,
	  status, type
* debug – an interface to allow read and write from user space
	  to the provider RDMA driver, exposing debug information.

Commands similar to "ip" program.

>
> Jason

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* Re: [PATCH net] net/mlx5e: Do not recycle pages from emergency reserve
From: Saeed Mahameed @ 2017-01-19 19:14 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: David Miller, netdev, Tariq Toukan, Saeed Mahameed
In-Reply-To: <1484809388.16328.19.camel@edumazet-glaptop3.roam.corp.google.com>

On Thu, Jan 19, 2017 at 9:03 AM, Eric Dumazet <eric.dumazet@gmail.com> wrote:
> From: Eric Dumazet <edumazet@google.com>
>
> A driver using dev_alloc_page() must not reuse a page allocated from
> emergency memory reserve.
>
> Otherwise all packets using this page will be immediately dropped,
> unless for very specific sockets having SOCK_MEMALLOC bit set.
>
> This issue might be hard to debug, because only a fraction of received
> packets would be dropped.

Hi Eric,

When you say reuse, you mean point to the same page from several SKBs ?

Because in our page cache implementation we don't reuse pages that
already passed to the stack,
we just keep them in the page cache until the ref count drop back to
one, so we recycle them (i,e they will be re-used only when no one
else is using them).

on mlx5e rx re-post to the HW buffer we will call
mlx5e_page_alloc_mapped->mlx5e_rx_cache_get, and  mlx5e_rx_cache_get
will only return a page that is already freed by all stack users,
otherwise it will allocated a brand new one.

a page form mlx5e_page_cache can have one of 2 states
1. passed to the stack (not free)
2. free (already used and freed by the stack)

a non free page will never get reused for another SKB.

this is true for both mlx5 rx modes (striding and non-striding)

but in the striding mode regardless of page cache, small packets can
always fit in one page and this page can get pointed to by several
SKBs - should we be concerned about this case ?

Anyway, if you meant by this patch to avoid keeping such special pages
in the mlx5 page cache,
then it looks very good to me.

Thanks,
Saeed.


>
> Fixes: 4415a0319f92 ("net/mlx5e: Implement RX mapped page cache for page recycle")
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> Cc: Tariq Toukan <tariqt@mellanox.com>
> Cc: Saeed Mahameed <saeedm@mellanox.com>
> ---
>  drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |    3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> index 0e2fb3ed1790900ccdc0bbbef8bc5c33267df092..ce46409bde2736ea4d1246ca97855098f052f271 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> @@ -193,6 +193,9 @@ static inline bool mlx5e_rx_cache_put(struct mlx5e_rq *rq,
>                 return false;
>         }
>
> +       if (unlikely(page_is_pfmemalloc(dma_info->page)))
> +               return false;
> +
>         cache->page_cache[cache->tail] = *dma_info;
>         cache->tail = tail_next;
>         return true;
>
>

^ permalink raw reply

* Re: [PATCH iproute2 v4 3/4] ifstat: Add 64 bits based stats to extended statistics
From: Stephen Hemminger @ 2017-01-19 19:11 UTC (permalink / raw)
  To: Roopa Prabhu
  Cc: Nogah Frankel, netdev@vger.kernel.org, roszenrami@gmail.com,
	Jiri Pirko, Ido Schimmel, Elad Raz, Yotam Gigi, Or Gerlitz
In-Reply-To: <5880E3FD.6010604@cumulusnetworks.com>

On Thu, 19 Jan 2017 08:06:21 -0800
Roopa Prabhu <roopa@cumulusnetworks.com> wrote:

> On 1/19/17, 7:21 AM, Nogah Frankel wrote:
> >> -----Original Message-----
> >> From: Nogah Frankel
> >> Sent: Sunday, January 15, 2017 3:55 PM
> >> To: 'Stephen Hemminger' <stephen@networkplumber.org>
> >> Cc: netdev@vger.kernel.org; roszenrami@gmail.com; roopa@cumulusnetworks.com; Jiri
> >> Pirko <jiri@mellanox.com>; Ido Schimmel <idosch@mellanox.com>; Elad Raz
> >> <eladr@mellanox.com>; Yotam Gigi <yotamg@mellanox.com>; Or Gerlitz
> >> <ogerlitz@mellanox.com>
> >> Subject: RE: [PATCH iproute2 v4 3/4] ifstat: Add 64 bits based stats to extended statistics
> >>
> >>
> >>  
> >>> -----Original Message-----
> >>> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> >>> Sent: Friday, January 13, 2017 3:44 AM
> >>> To: Nogah Frankel <nogahf@mellanox.com>
> >>> Cc: netdev@vger.kernel.org; roszenrami@gmail.com; roopa@cumulusnetworks.com;  
> >> Jiri  
> >>> Pirko <jiri@mellanox.com>; Ido Schimmel <idosch@mellanox.com>; Elad Raz
> >>> <eladr@mellanox.com>; Yotam Gigi <yotamg@mellanox.com>; Or Gerlitz
> >>> <ogerlitz@mellanox.com>
> >>> Subject: Re: [PATCH iproute2 v4 3/4] ifstat: Add 64 bits based stats to extended statistics
> >>>
> >>> On Thu, 12 Jan 2017 15:49:50 +0200
> >>> Nogah Frankel <nogahf@mellanox.com> wrote:
> >>>  
> >>>> The default stats for ifstat are 32 bits based.
> >>>> The kernel supports 64 bits based stats. (They are returned in struct
> >>>> rtnl_link_stats64 which is an exact copy of struct rtnl_link_stats, in
> >>>> which the "normal" stats are returned, but with fields of u64 instead of
> >>>> u32). This patch adds them as an extended stats.
> >>>>
> >>>> It is read with filter type IFLA_STATS_LINK_64 and no sub type.
> >>>>
> >>>> It is under the name 64bits
> >>>> (or any shorten of it as "64")
> >>>>
> >>>> For example:
> >>>> ifstat -x 64bit
> >>>>
> >>>> Signed-off-by: Nogah Frankel <nogahf@mellanox.com>
> >>>> Reviewed-by: Jiri Pirko <jiri@mellanox.com>  
> >>> Other commands (like ip link) always use the 64 bit statistics if available
> >>> from the device. I see no reason that ifstat needs to be different.
> >>>  
> >> Do you mean to change the default ifstat results to be 64 bits based?
> >> I tried it in the first version, but Roopa commented that it was not a good idea.
> >> She said they tried it in the past and it caused backward compatibilities problems.
> >> (Or maybe I didn't understand correctly)  
> > So, can I leave the default ifstat results to be 32 bits based, for the time being?
> >  
> From past discussions: Moving the default to 64bit has compat issues with the old history file.
> There is a way to make it work by using a new file header (to indicate that it is 64 bit) in
> a freshly created history file and also check this header before dumping stats into the history file.
> ie maintain backward compat without introducing a new option. It is doable.
> 
> One approach is, you can drop the 64bit option from this series and
> try updating the default to 64 bit (with compat handling code) in a later series.

The ifstat code could do conversion based on file size.

  if (history_file_is_32bit()) {
	printf("converting to 64 bit format\n");
        ...
  }

^ permalink raw reply

* Re: [PATCH] net: ethtool: avoid allocation failure for dump_regs
From: David Miller @ 2017-01-19 19:22 UTC (permalink / raw)
  To: kvalo-sgV2jX0FEOL9JmXXK+q4OQ
  Cc: linville-2XuSBdqkA4R54TAoqtyWWQ, darcari-H+wXaHxf7aLQT0dZR+AlfA,
	netdev-u79uwXL29TY76Z2rM5mHXA,
	johannes.berg-ral2JQCrhuEAvxtiuMwx3w,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <87h94uorc1.fsf-HodKDYzPHsUD5k0oWYwrnHL1okKdlPRT@public.gmane.org>

From: Kalle Valo <kvalo-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Date: Thu, 19 Jan 2017 20:08:30 +0200

> "John W. Linville" <linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org> writes:
> 
>> I forgot to Cc Johannes and Kalle...
> 
> Also adding linux-wireless.
> 
>> On Thu, Jan 19, 2017 at 09:15:09AM -0500, John W. Linville wrote:
>>> On Thu, Jan 19, 2017 at 07:35:22AM -0500, David Arcari wrote:
>>> > On 01/18/2017 11:45 AM, David Miller wrote:
>>> > > From: David Arcari <darcari-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
>>> > > Date: Wed, 18 Jan 2017 08:34:05 -0500
>>> > >
>>> > >> If the user executes 'ethtool -d' for an interface and the associated
>>> > >> get_regs_len() function returns 0, the user will see a call trace from
>>> > >> the vmalloc() call in ethtool_get_regs().  This patch modifies
>>> > >> ethtool_get_regs() to avoid the call to vmalloc when the size is zero.
>>> > >>
>>> > >> Signed-off-by: David Arcari <darcari-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
>>> > > I think when the driver indicates this, it is equivalent to saying that
>>> > > the operation isn't supported.
>>> > >
>>> > > Also, this guards us against ->get_regs() methods that don't handle
>>> > > zero length requests properly.  I see many which are going to do
>>> > > really terrible things in that situation.
>>> > >
>>> > > Therefore, if get_regs_len() returns zero, treat it the safe as if the
>>> > > ethtool operations were NULL.
>>> > >
>>> > > Thanks.
>>> > 
>>> > That was actually the fix that I was originally considering, but it
>>> > turns out
>>> > there is a problem with it.
>>> > 
>>> > I found that the vmalloc error was occurring because
>>> > ieee80211_get_regs_len() in
>>> > net/mac80211/ethtool.c was returning zero.  The ieee80211_get_regs in
>>> > the same
>>> > file returns the hw version. It turns out that this information is used
>>> > by the
>>> > at76c50x-usb driver in the user space ethtool to report which HW variant
>>> > is in
>>> > use.  Returning an error when regs_len() returns zero would break this
>>> > functionality.
>>> > 
>>> > -Dave
>>> 
>>> I'm responsible for this mess. The original idea was for various
>>> mac80211-based drivers to override the ethtool operation and provide
>>> their own dump operation, but the mac80211 crowd never embraced
>>> the idea.
>>> 
>>> In the meantime, I added the default implementation which just
>>> passed-up wdev->wiphy->hw_version as the version info for a 0-length
>>> register dump. I then implemented a driver-specific regiser dump
>>> handler for userland ethtool that would interpret the hardware version
>>> information for the at76c50x-usb driver.
>>> 
>>> So the net of it is, if we treat a return of 0 from get_regs_len()
>>> as "not supported", we break this one driver-specific feature for
>>> userland ethtool. Realistically, there are probably very few users
>>> to care. But I can't guarantee that the number is zero.
> 
> I know the number is not zero, because I remember using it years back
> with something else than at76c50x-usb. But is the number more than one,
> I don't know :)

I'm trying to dig down and figure out why this problem is showing up now.
ethtool_get_regs() has been using vzalloc() since 2011, and before that it
used plain vmalloc().

This code has therefore been using v{m,z}alloc() forever.  What changed?

The zero size check has been in the vmalloc implementation since at least
2009.

I don't understand why this is all triggering and being noticed now.  The
whole ieee80211 "return zero length regs and return hw version in get_regs"
thing should have been failing for at least 7 years now.

^ permalink raw reply

* Re: [PATCH v2 1/4] dt-bindings: phy: Add documentation for NSP USB3 PHY
From: Rob Herring @ 2017-01-19 19:26 UTC (permalink / raw)
  To: Yendapally Reddy Dhananjaya Reddy
  Cc: Mark Rutland, devicetree, Florian Fainelli, Scott Branden,
	Jon Mason, Ray Jui, Russell King, Kishon Vijay Abraham I,
	bcm-kernel-feedback-list, linux-arm-kernel, netdev, linux-kernel
In-Reply-To: <1484669670-4201-2-git-send-email-yendapally.reddy@broadcom.com>

On Tue, Jan 17, 2017 at 11:14:27AM -0500, Yendapally Reddy Dhananjaya Reddy wrote:
> Add documentation for USB3 PHY available in Northstar plus SoC
> 
> Signed-off-by: Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com>
> ---
>  .../devicetree/bindings/phy/brcm,nsp-usb3-phy.txt  | 39 ++++++++++++++++++++++
>  1 file changed, 39 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/phy/brcm,nsp-usb3-phy.txt

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply

* Re: [PATCH net] net/mlx5e: Do not recycle pages from emergency reserve
From: Eric Dumazet @ 2017-01-19 19:25 UTC (permalink / raw)
  To: Saeed Mahameed; +Cc: David Miller, netdev, Tariq Toukan, Saeed Mahameed
In-Reply-To: <CALzJLG8DzzpO97ehxWAdm=18Hw3Q9N6poTviDYuEFgyc9+O9RA@mail.gmail.com>

On Thu, 2017-01-19 at 21:14 +0200, Saeed Mahameed wrote:
> On Thu, Jan 19, 2017 at 9:03 AM, Eric Dumazet <eric.dumazet@gmail.com> wrote:
> > From: Eric Dumazet <edumazet@google.com>
> >
> > A driver using dev_alloc_page() must not reuse a page allocated from
> > emergency memory reserve.
> >
> > Otherwise all packets using this page will be immediately dropped,
> > unless for very specific sockets having SOCK_MEMALLOC bit set.
> >
> > This issue might be hard to debug, because only a fraction of received
> > packets would be dropped.
> 
> Hi Eric,
> 
> When you say reuse, you mean point to the same page from several SKBs ?
> 
> Because in our page cache implementation we don't reuse pages that
> already passed to the stack,
> we just keep them in the page cache until the ref count drop back to
> one, so we recycle them (i,e they will be re-used only when no one
> else is using them).

Look at other page_is_pfmemalloc() calls in other network drivers.

The point is :

We do not want to reuse a page that was initially allocated from
emergency reserve.

Chances are high that the packet will be simply dropped.

If your cache is not refilled with such problematic pages,
future dev_page_alloc() will likely give you sane pages, after stress
has ended.

By definition, emergency reserves are small, we do not want to keep
pages from the reserve in another cache, depleting the reserve for too
long.

dev_alloc_page() in mlx5 was introduced in commit
bc77b240b3c57236cdcc08d64ca390655d3a16ff
("net/mlx5e: Add fragmented memory support for RX multi packet WQE")

Maybe my Fixes: tag was slightly wrong.

> 
> on mlx5e rx re-post to the HW buffer we will call
> mlx5e_page_alloc_mapped->mlx5e_rx_cache_get, and  mlx5e_rx_cache_get
> will only return a page that is already freed by all stack users,
> otherwise it will allocated a brand new one.
> 
> a page form mlx5e_page_cache can have one of 2 states
> 1. passed to the stack (not free)
> 2. free (already used and freed by the stack)
> 
> a non free page will never get reused for another SKB.


Of course.

> 
> this is true for both mlx5 rx modes (striding and non-striding)
> 
> but in the striding mode regardless of page cache, small packets can
> always fit in one page and this page can get pointed to by several
> SKBs - should we be concerned about this case ?
> 
> Anyway, if you meant by this patch to avoid keeping such special pages
> in the mlx5 page cache,
> then it looks very good to me.
> 
> Thanks,
> Saeed.
> 
> 
> >
> > Fixes: 4415a0319f92 ("net/mlx5e: Implement RX mapped page cache for page recycle")
> > Signed-off-by: Eric Dumazet <edumazet@google.com>
> > Cc: Tariq Toukan <tariqt@mellanox.com>
> > Cc: Saeed Mahameed <saeedm@mellanox.com>
> > ---
> >  drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |    3 +++
> >  1 file changed, 3 insertions(+)
> >
> > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> > index 0e2fb3ed1790900ccdc0bbbef8bc5c33267df092..ce46409bde2736ea4d1246ca97855098f052f271 100644
> > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> > @@ -193,6 +193,9 @@ static inline bool mlx5e_rx_cache_put(struct mlx5e_rq *rq,
> >                 return false;
> >         }
> >
> > +       if (unlikely(page_is_pfmemalloc(dma_info->page)))
> > +               return false;
> > +
> >         cache->page_cache[cache->tail] = *dma_info;
> >         cache->tail = tail_next;
> >         return true;
> >
> >

^ permalink raw reply

* Re: [PATCH v2 2/4] net: phy: Initialize mdio clock at probe function
From: Florian Fainelli @ 2017-01-19 19:26 UTC (permalink / raw)
  To: Yendapally Reddy Dhananjaya Reddy, Rob Herring, Mark Rutland,
	Russell King, Ray Jui, Scott Branden, Jon Mason, Florian Fainelli,
	Kishon Vijay Abraham I
  Cc: devicetree, bcm-kernel-feedback-list, linux-kernel,
	linux-arm-kernel, netdev
In-Reply-To: <1484669670-4201-3-git-send-email-yendapally.reddy@broadcom.com>

On 01/17/2017 08:14 AM, Yendapally Reddy Dhananjaya Reddy wrote:
> Initialize mdio clock divisor in probe function. The ext bus
> bit available in the same register will be used by mdio mux
> to enable external mdio.
> 
> Signed-off-by: Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply

* Re: [PATCH RFC 0/7] Clean up PHY MMD accessors
From: Florian Fainelli @ 2017-01-19 19:42 UTC (permalink / raw)
  To: Russell King - ARM Linux
  Cc: Woojung Huh, netdev, linux-usb, linux-arm-kernel,
	Microchip Linux Driver Support
In-Reply-To: <20170113152059.GR14217@n2100.armlinux.org.uk>

On 01/13/2017 07:20 AM, Russell King - ARM Linux wrote:
> This series cleans up phylib's MMD accessors, so that we have a common
> way of accessing the Clause 45 register set.
> 
> The current situation is far from ideal - we have phy_(read|write)_mmd()
> which accesses Clause 45 registers over Clause 45 accesses, and we have
> phy_(read|write)_mmd_indirect(), which accesses Clause 45 registers via
> Clause 22 register 13/14.
> 
> Generic code uses the indirect methods to access standard Clause 45
> features, and when we come to add Clause 45 PHY support to phylib, we
> would need to make these conditional upon the PHY type, or duplicate
> these functions.
> 
> An alternative solution is to merge these accessors together, and select
> the appropriate access method depending upon the 802.3 clause that the
> PHY conforms with.  The result is that we have a single set of
> phy_(read|write)_mmd() accessors.
> 
> For cases which require special handling, we still allow PHY drivers to
> override all MMD accesses - except rather than just overriding the
> indirect accesses.  This keeps existing overrides working.
> 
> Combining the two also has another beneficial side effect - we get rid
> of similar functions that take arguments in different orders.  The
> old direct accessors took the phy structure, devad and register number,
> whereas the indirect accessors took the phy structure, register number
> and devad in that order.  Care must be taken when updating future
> drivers that the argument order is correct, and the function name is
> not merely replaced.

I really like that series, this is much much cleaner, do you mind
resubmitting this without a RFC tag so David can apply it?

Thanks!
-- 
Florian

^ permalink raw reply

* Re: [PATCH net] net/mlx5e: Do not recycle pages from emergency reserve
From: Saeed Mahameed @ 2017-01-19 19:39 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: David Miller, netdev, Tariq Toukan, Saeed Mahameed
In-Reply-To: <1484853949.16328.39.camel@edumazet-glaptop3.roam.corp.google.com>

On Thu, Jan 19, 2017 at 9:25 PM, Eric Dumazet <eric.dumazet@gmail.com> wrote:
> On Thu, 2017-01-19 at 21:14 +0200, Saeed Mahameed wrote:
>> On Thu, Jan 19, 2017 at 9:03 AM, Eric Dumazet <eric.dumazet@gmail.com> wrote:
>> > From: Eric Dumazet <edumazet@google.com>
>> >
>> > A driver using dev_alloc_page() must not reuse a page allocated from
>> > emergency memory reserve.
>> >
>> > Otherwise all packets using this page will be immediately dropped,
>> > unless for very specific sockets having SOCK_MEMALLOC bit set.
>> >
>> > This issue might be hard to debug, because only a fraction of received
>> > packets would be dropped.
>>
>> Hi Eric,
>>
>> When you say reuse, you mean point to the same page from several SKBs ?
>>
>> Because in our page cache implementation we don't reuse pages that
>> already passed to the stack,
>> we just keep them in the page cache until the ref count drop back to
>> one, so we recycle them (i,e they will be re-used only when no one
>> else is using them).
>
> Look at other page_is_pfmemalloc() calls in other network drivers.
>
> The point is :
>
> We do not want to reuse a page that was initially allocated from
> emergency reserve.
>
> Chances are high that the packet will be simply dropped.
>
> If your cache is not refilled with such problematic pages,
> future dev_page_alloc() will likely give you sane pages, after stress
> has ended.
>
> By definition, emergency reserves are small, we do not want to keep
> pages from the reserve in another cache, depleting the reserve for too
> long.

Got it, Thanks for the explanation, I got confused since the term "reuse"
can also imply "reuse same page for another RX packet", I guess the
correct term for
mlx5 page cache is "recycle".

>
> dev_alloc_page() in mlx5 was introduced in commit
> bc77b240b3c57236cdcc08d64ca390655d3a16ff
> ("net/mlx5e: Add fragmented memory support for RX multi packet WQE")
>
> Maybe my Fixes: tag was slightly wrong.
>

No, i think you got it right in first place, you are fixing the RX
cache to not keep hold on such pages.
before the RX cache we didn't have this issue.

>>
>> on mlx5e rx re-post to the HW buffer we will call
>> mlx5e_page_alloc_mapped->mlx5e_rx_cache_get, and  mlx5e_rx_cache_get
>> will only return a page that is already freed by all stack users,
>> otherwise it will allocated a brand new one.
>>
>> a page form mlx5e_page_cache can have one of 2 states
>> 1. passed to the stack (not free)
>> 2. free (already used and freed by the stack)
>>
>> a non free page will never get reused for another SKB.
>
>
> Of course.
>
>>
>> this is true for both mlx5 rx modes (striding and non-striding)
>>
>> but in the striding mode regardless of page cache, small packets can
>> always fit in one page and this page can get pointed to by several
>> SKBs - should we be concerned about this case ?
>>
>> Anyway, if you meant by this patch to avoid keeping such special pages
>> in the mlx5 page cache,
>> then it looks very good to me.
>>
>> Thanks,
>> Saeed.
>>
>>
>> >
>> > Fixes: 4415a0319f92 ("net/mlx5e: Implement RX mapped page cache for page recycle")
>> > Signed-off-by: Eric Dumazet <edumazet@google.com>
>> > Cc: Tariq Toukan <tariqt@mellanox.com>
>> > Cc: Saeed Mahameed <saeedm@mellanox.com>
>> > ---
>> >  drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |    3 +++
>> >  1 file changed, 3 insertions(+)
>> >
>> > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
>> > index 0e2fb3ed1790900ccdc0bbbef8bc5c33267df092..ce46409bde2736ea4d1246ca97855098f052f271 100644
>> > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
>> > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
>> > @@ -193,6 +193,9 @@ static inline bool mlx5e_rx_cache_put(struct mlx5e_rq *rq,
>> >                 return false;
>> >         }
>> >
>> > +       if (unlikely(page_is_pfmemalloc(dma_info->page)))
>> > +               return false;
>> > +
>> >         cache->page_cache[cache->tail] = *dma_info;
>> >         cache->tail = tail_next;
>> >         return true;
>> >
>> >
>
>

^ permalink raw reply

* Re: [PATCH RFC 0/7] Clean up PHY MMD accessors
From: Russell King - ARM Linux @ 2017-01-19 19:58 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: Woojung Huh, netdev, linux-usb, linux-arm-kernel,
	Microchip Linux Driver Support
In-Reply-To: <9fb97d58-6ad3-f9d1-c255-9f91e5857f88@gmail.com>

On Thu, Jan 19, 2017 at 11:42:47AM -0800, Florian Fainelli wrote:
> On 01/13/2017 07:20 AM, Russell King - ARM Linux wrote:
> > This series cleans up phylib's MMD accessors, so that we have a common
> > way of accessing the Clause 45 register set.
> > 
> > The current situation is far from ideal - we have phy_(read|write)_mmd()
> > which accesses Clause 45 registers over Clause 45 accesses, and we have
> > phy_(read|write)_mmd_indirect(), which accesses Clause 45 registers via
> > Clause 22 register 13/14.
> > 
> > Generic code uses the indirect methods to access standard Clause 45
> > features, and when we come to add Clause 45 PHY support to phylib, we
> > would need to make these conditional upon the PHY type, or duplicate
> > these functions.
> > 
> > An alternative solution is to merge these accessors together, and select
> > the appropriate access method depending upon the 802.3 clause that the
> > PHY conforms with.  The result is that we have a single set of
> > phy_(read|write)_mmd() accessors.
> > 
> > For cases which require special handling, we still allow PHY drivers to
> > override all MMD accesses - except rather than just overriding the
> > indirect accesses.  This keeps existing overrides working.
> > 
> > Combining the two also has another beneficial side effect - we get rid
> > of similar functions that take arguments in different orders.  The
> > old direct accessors took the phy structure, devad and register number,
> > whereas the indirect accessors took the phy structure, register number
> > and devad in that order.  Care must be taken when updating future
> > drivers that the argument order is correct, and the function name is
> > not merely replaced.
> 
> I really like that series, this is much much cleaner, do you mind
> resubmitting this without a RFC tag so David can apply it?

Hi Florian,

Thanks.

Will do in the next couple of days - I'd prefer to make one change
to the series before submitting it for real: provide compatibility
functions marked as deprecated so this doesn't create a flag day.
We can remove the deprecated _indirect functions later when we know
there's no new users.

I'd like to get the phy.h untanglement stuff into David's tree first.
I'm almost there, my allmodconfig from last night almost built fine
but for something I missed in bgmac.c, and 0-day found a MIPS file
affected by the change.  New code pushed out for 0-day and I'm
expecting tonights allmodconfig to be clear.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

^ permalink raw reply

* [net-next:master 177/195] drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:4646: warning: unused variable 'port_vec'
From: kbuild test robot @ 2017-01-19 20:17 UTC (permalink / raw)
  To: Ganesh Goudar; +Cc: kbuild-all, netdev

[-- Attachment #1: Type: text/plain, Size: 2286 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git master
head:   4567d686f5c6d955e57a3afa1741944c1e7f4033
commit: 96fe11f27b70f6b64f62a2d13ed209aa02e02a48 [177/195] cxgb4: Implement ndo_get_phys_port_id for mgmt dev
config: x86_64-randconfig-a0-01200234 (attached as .config)
compiler: gcc-4.4 (Debian 4.4.7-8) 4.4.7
reproduce:
        git checkout 96fe11f27b70f6b64f62a2d13ed209aa02e02a48
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

   drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c: In function 'init_one':
>> drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:4646: warning: unused variable 'port_vec'
>> drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:4646: warning: unused variable 'v'
   drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c: In function 'cxgb_select_queue':
   drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:923: warning: 'vlan_tci' may be used uninitialized in this function
   At top level:
   cc1: warning: unrecognized command line option "-Wno-maybe-uninitialized"
   drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.o: warning: objtool: __skb_put()+0x65: function has unreachable instruction

vim +/port_vec +4646 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c

  4630			fill_vf_station_mac_addr(adap);
  4631		return num_vfs;
  4632	}
  4633	#endif
  4634	
  4635	static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
  4636	{
  4637		int func, i, err, s_qpp, qpp, num_seg;
  4638		struct port_info *pi;
  4639		bool highdma = false;
  4640		struct adapter *adapter = NULL;
  4641		struct net_device *netdev;
  4642		void __iomem *regs;
  4643		u32 whoami, pl_rev;
  4644		enum chip_type chip;
  4645		static int adap_idx = 1;
> 4646		u32 v, port_vec;
  4647	
  4648		printk_once(KERN_INFO "%s - version %s\n", DRV_DESC, DRV_VERSION);
  4649	
  4650		err = pci_request_regions(pdev, KBUILD_MODNAME);
  4651		if (err) {
  4652			/* Just info, some other driver may have claimed the device. */
  4653			dev_info(&pdev->dev, "cannot obtain PCI resources\n");
  4654			return err;

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 34801 bytes --]

^ permalink raw reply

* Re: [PATCHv3 net-next 4/4] sctp: implement sender-side procedures for Add Incoming/Outgoing Streams Request Parameter
From: Neil Horman @ 2017-01-19 20:17 UTC (permalink / raw)
  To: Xin Long
  Cc: network dev, linux-sctp, Marcelo Ricardo Leitner, Vlad Yasevich,
	davem
In-Reply-To: <daa150a23548dda0a2fd513c622773f0ff9b2df3.1484845510.git.lucien.xin@gmail.com>

On Fri, Jan 20, 2017 at 01:19:14AM +0800, Xin Long wrote:
> This patch is to implement Sender-Side Procedures for the Add
> Outgoing and Incoming Streams Request Parameter described in
> rfc6525 section 5.1.5-5.1.6.
> 
> It is also to add sockopt SCTP_ADD_STREAMS in rfc6525 section
> 6.3.4 for users.
> 
> Signed-off-by: Xin Long <lucien.xin@gmail.com>
> ---
>  include/net/sctp/sctp.h   |  2 +
>  include/uapi/linux/sctp.h |  7 ++++
>  net/sctp/socket.c         | 29 ++++++++++++++
>  net/sctp/stream.c         | 99 +++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 137 insertions(+)
> 
> diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
> index b93820f..68ee1a6 100644
> --- a/include/net/sctp/sctp.h
> +++ b/include/net/sctp/sctp.h
> @@ -199,6 +199,8 @@ int sctp_offload_init(void);
>  int sctp_send_reset_streams(struct sctp_association *asoc,
>  			    struct sctp_reset_streams *params);
>  int sctp_send_reset_assoc(struct sctp_association *asoc);
> +int sctp_send_add_streams(struct sctp_association *asoc,
> +			  struct sctp_add_streams *params);
>  
>  /*
>   * Module global variables
> diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h
> index c0bd8c3..a91a9cc 100644
> --- a/include/uapi/linux/sctp.h
> +++ b/include/uapi/linux/sctp.h
> @@ -118,6 +118,7 @@ typedef __s32 sctp_assoc_t;
>  #define SCTP_ENABLE_STREAM_RESET	118
>  #define SCTP_RESET_STREAMS	119
>  #define SCTP_RESET_ASSOC	120
> +#define SCTP_ADD_STREAMS	121
>  
>  /* PR-SCTP policies */
>  #define SCTP_PR_SCTP_NONE	0x0000
> @@ -1027,4 +1028,10 @@ struct sctp_reset_streams {
>  	uint16_t srs_stream_list[];	/* list if srs_num_streams is not 0 */
>  };
>  
> +struct sctp_add_streams {
> +	sctp_assoc_t sas_assoc_id;
> +	uint16_t sas_instrms;
> +	uint16_t sas_outstrms;
> +};
> +
>  #endif /* _UAPI_SCTP_H */
> diff --git a/net/sctp/socket.c b/net/sctp/socket.c
> index 2c5c9ca..ae0a99e 100644
> --- a/net/sctp/socket.c
> +++ b/net/sctp/socket.c
> @@ -3838,6 +3838,32 @@ static int sctp_setsockopt_reset_assoc(struct sock *sk,
>  	return retval;
>  }
>  
> +static int sctp_setsockopt_add_streams(struct sock *sk,
> +				       char __user *optval,
> +				       unsigned int optlen)
> +{
you are going to need to provide some locking here or in sctp_send_add_streams.
By replacing the in/out streams pointer you run the risk of multiple callers
modifying the pointers in parallel, or in the sctp state machine reading it
while you do.

Neil

^ permalink raw reply

* [PATCH] rtlwifi: rtl8723bs: Add firmware for new driver
From: Larry Finger @ 2017-01-19 21:04 UTC (permalink / raw)
  To: linux-firmware-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-wireless-u79uwXL29TY76Z2rM5mHXA, Larry Finger,
	netdev-u79uwXL29TY76Z2rM5mHXA

This driver is being added for Fedora users, and will then be added
to the mainline kernel.

Signed-off-by: Larry Finger <Larry.Finger-tQ5ms3gMjBLk1uMJSBkQmQ@public.gmane.org>
c: Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
---
 WHENCE                          |  13 +++++++++++++
 rtlwifi/rtl8723bs_ap_wowlan.bin | Bin 0 -> 20886 bytes
 rtlwifi/rtl8723bs_bt.bin        | Bin 0 -> 9120 bytes
 rtlwifi/rtl8723bs_nic.bin       | Bin 0 -> 32108 bytes
 rtlwifi/rtl8723bs_wowlan.bin    | Bin 0 -> 26398 bytes
 5 files changed, 13 insertions(+)
 create mode 100644 rtlwifi/rtl8723bs_ap_wowlan.bin
 create mode 100644 rtlwifi/rtl8723bs_bt.bin
 create mode 100644 rtlwifi/rtl8723bs_nic.bin
 create mode 100644 rtlwifi/rtl8723bs_wowlan.bin

diff --git a/WHENCE b/WHENCE
index fd68b71..21c1b68 100644
--- a/WHENCE
+++ b/WHENCE
@@ -2402,6 +2402,19 @@ Licence: Redistributable. See LICENCE.rtlwifi_firmware.txt for details.
 
 --------------------------------------------------------------------------
 
+Driver: rtl8723bs - Realtek 802.11n WLAN driver for RTL8723BS
+
+Info: Firmware files extracted from data statements in Realtek driver
+      v4.3.5.5_12290.20140916_BTCOEX20140507-4E40.
+File: rtlwifi/rtl8723bs_bt.bin
+File: rtlwifi/rtl8723bs_nic.bin
+File: rtlwifi/rtl8723bs_ap_wowlan.bin
+File: rtlwifi/rtl8723bs_wowlan.bin
+
+Licence: Redistributable. See LICENCE.rtlwifi_firmware.txt for details.
+
+--------------------------------------------------------------------------
+
 Driver: rtl8xxxu - Realtek 802.11n WLAN driver for RTL8XXX USB devices
 
 Info: rtl8723au taken from Realtek driver
diff --git a/rtlwifi/rtl8723bs_ap_wowlan.bin b/rtlwifi/rtl8723bs_ap_wowlan.bin
new file mode 100644
index 0000000000000000000000000000000000000000..944bc16c3d55d495c1660710dac1a59a7e60868a
GIT binary patch
literal 20886
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
BtC#=)

literal 0
HcmV?d00001

diff --git a/rtlwifi/rtl8723bs_bt.bin b/rtlwifi/rtl8723bs_bt.bin
new file mode 100644
index 0000000000000000000000000000000000000000..f29df42f93347813a18df81767acfd3adcbc1f72
GIT binary patch
literal 9120
zcmb_Bdt6iZy}y&3yhwl(KshMN5wTUE)<Q(PR|7^x3_e>$tKA8Y9y~b*ExJB-XFXcC
z>4Z%Rim%=Uf|~=})dbpmch@Z>u(jeg2zFi3-HTN_Oadk<b+_AX?)R4vw7a{X&;GdZ
z`JUhV@qK@P-~6>gRsOpNNmi@h;9xJk7n)(scSyA13HDN+Gta>e=Q;D?n;-o;q~Mv>
zciN5CdVg4`^Q(pPfw$Y6FUju{!jV8{fD9t>eBk({?CzW{+qIm@Z!XkxyQAMHp#DU6
z^t%x1%R?Fgg^pgz?RsN4x9i|A623kBo#F2e9~wS9ObYe>k<fuwDflh74DMIwPlQwI
z{1o)R#qH`H36;AEs}y40Qs^c3Eaz;v_Ya?BhgHq!4q5Rfq?eWg?EiO4`ojz;-=?HP
zD!tU#MM;0A^^y_B=KX?_)X;afo085zIRSGFYP}Q>Wi_<xq5qmvFP(pflCskD(k&=o
zh5i)R23gq$@1^|&#^*!-e^)5V$$_{FM>!-SdS3q08iHT#Tlt4w{4!S@Z+5BqQkSBc
zJc{nfE7l#;OTVw!SiWI!{Q$bJ;P-MH`r~;fxWdB(Rpd+Eh`yVrta*zgcw}XQYkQgC
z#$Lg}1VyOT0PF&I381#u72@5l(CcowRVKJX-*Q(vU7^F!a|qxqx8$)nksw{&f0YgG
zYBh1P-6~eT+ZI%@1bj(0k#gPDSzq;)btU=5o33EBT?(e<5G7%&;EUTDvLJfXb`4qL
zm4a0EUJlN;Z|B~Ea!o4}{6X8Ap}pK%Z|Rlo(9>vVg6p7HrdWN&>}7&U(0<B}=x<+F
zld{Yb?=EUPhZa3C`cyld$S>_KyZvQH((UEfM}mh6qu8!(T+_tn)%)1HW$$n27KJK{
zjP|`yO3Oxq&-JivaBj$K8VSDABem}3MuI1Ln4r-<5?s?m@a)~KJ&0~S-Ozz&6`Q11
zS>6kIC{)*zoO$O#2Cwshj08>ZD+O}sui|Vcnn<r<CQ^4Qh8Q|wk<zP#+cBZ)B4Y=h
zh3K_E)Q~bRA#*QaCczo@7DRvjI;x86LiF=cmJFz2MMFD7SIr|t8Ktw943)gOv3Wzo
zdf;z%MJ4d}=6by(0;FuzOMiGyFP*qaMr4F?BGDCU_qam8@Pv7}Sm$$ve(sS8+HT++
z^d16u%fp6@9;pw}XMS>kQ#z299kvWBK&IstkM4V|Vr4nHuLSui>6i1HJjwhP&n$=7
zs@^?=4GS9c3I9w7AtnVHK4wC{YwH|Od<=y)w6FAc`r<Nynw@(&1-aQ%lvn0Kbov@n
zk>D`5#?_{<QK^V`Cizy~7zw`EO6-oauy;4L|Ly#haHFgWRE6bv+gGA^;ybMvKs@by
zi!)v=yh;X@*6Pd8_HOFk+*{VWrFU!Z^S#@8xA(r#`}N*LtBNO4El9Glm$AzE-M!y{
zdSNf3Yu`W0?d8Z|9ADf|@JG1~a6{kw8$BzVR{(|anV7B-{P{UkC&j}_Y1Z0a7Aytc
zYo;@HZj=38?(2Og`;LKJ8vB@FQQxV)<4`w2eR<#MzGkSeg!-z!GkquQui4+~d%aHv
zx@UpDioV%Ud$BJGzSYp?0agQV?7t?-C<X9cFb(j1bd%h|x1SZc{RWTPQP{rEN|Ggc
zf^RQ}XtEDu@(>Ta_G-nd^5Vgj187Hr1LSUa&M+Cwfc09({!nqd_ClVABoY03@9IBP
z+6uw42)+d_lWSFTal=ZW$h-=C2h4-mJ%9(*TG$B<6Oo;gCf67Ds~iVg3nR9)(yejF
zDEcT4>619jbX2yg#2Q0qK=G{7@-$dpA;4J0z(MykJR+oY*W}mv#apc1(<%fKVb6n$
zFZ<8?E8On__Oq?kzmZ#O`z-DIL_WXM|1P(?&v@!sA4wMFA^K;%&-VQ-4a$0`h>mO)
z5N&BA#PEX*t1Lv+nEn0Z!Z_}gpCv>jv;hs}XL~_29%6#5JKRwXiOS<&!KWz)6$9Uz
z-0L*~R>H2C+-xW8TP>Z|-8PS|K7HJ9<3WbFYNRu8!ngWr>FHJ1ORpvc>aOm+OIRyL
zWo*UmS(ZocQw_G{Qvxt`a}RG68^>eF>gF~_&XS)M$5qYB1_khkjM)6YRA|c8gQ@|&
zW96xEb=@dYLS`m{O?fvRRp}YDLwkV$JD__z1o-u*lY`$qf#?hADI($*y$7=C(lo0Z
zRIr<3Qs)Gao2So3X+{pjZh^52TXjC!>M!1M%OoXqJ_NW$$8cYirn(C;st%sRl#-t<
z5+r(f0TN>JW^y5Z)faqNjK&P$qrUQepCXem%d;>(YI5d<N}G`veCq6#Cy0^-ne-%{
zS(I#ta68PKZ>#1=boT<_);XeN-Fq~(ck+Iu)$CW!U3ZQNE^y%yEd{vS(zcQ;QG%%;
zrzAQE>%K@^OpDlkkRS`98jM35m*ePZ-^YJNxKv;sU*JHWx(cv=mY*$+$kU{h{X<+8
zrz9{&X`N5LBj>i8%l$heGLVD6w*t?O(sy%&zJ%~aJP<;Yu>=x&BXZsb@-(RrHCQ9a
zHBo&aMC}EP$>u2zfv*RSnOsr2KFY1APDJEyVCjXUwzW1=AsI>oYiyDMWbNNe1ADpR
zjvv_m$eH_Bb+rGqv>!(DtMiNVM4#N+=@)&wY-@gd%21v6dVal6F;{aRSxfypf2*Y8
zf(T@()W4nEc?t1zs6TS1#oeEDo+oO4?7uvwo0llQa;tajM_m1w%^(@xfPcV2><kdA
z!(ykOdj3xqQ$A7hN3PQ+enM`o>zA`2aon}k?cC+|^^?-Mm-|h}y2<)>?zio0r}}@_
zv1YOkx)IR~Z2w|<Hbpm}TDV5=5o<PH#C(s^pByr^sH*KPYw~nHlOYjoYNxN>M~Kl?
z%X-L0Ps?UO@cpXbCBRTOF8BrtO2;w936X6fc%oYHX){eNQgOK0JPHy$svUJbkS&t)
z@{gasxC!osrAs=A^09?E4p#Kl{CfXi9%Mk&jCC|Uh`^%id>*dOS2~X8<DGxqvZAF-
za7~>Q(^?YW0jz#?i(GJXV0Fi1x+~G&%tloeEmFiQgdujDof*Si=aar5hq2xIT1G;%
zCU<<VVB}ufY612m#L{ss^>FQem=U#RLIiJA_0R%6N@t1gf*ZuvVcfv_1Y<S^_hZar
zXJh+=t>i-tiY955@AP)8@88(rD!}-I4!<C?Tz`;J^Tb6aSlp6m9VifhQh0XMW<AvM
ziWU_w7i#m(e#L5p{YEvWJ~>1-X282d=YuzcZ&sIhlL-ym<pM-t1@9H;A~=<f_xvPg
zA0pNP_C}L3K!{+`MK^aoGIO&K!w|5GP=*krbct#5L+V8J4Zkm9viSFDgm$>OC#I~&
zqZEo!FUDmg402f)G3IUD7qR`{n9lrv$26uh!ua3A5x;$+_#vy#Ar4!IW0(LZtl(`T
z9vsUTzP~Uo(Rm;*QE!dq=(7rKdEB68ps0=H=C;k=I&wFTCAFr!RX2>^E4_jIs0vkm
z6)i_6QHJci>`$`o^8NBgd5ioVd7r#b(We-a_melsKE+>1jUrXCQn6XFL-C5@u%cek
zpg65Kudq#|JB;n`CdK%NZzT)K|IfH0>h}=+%4RrOB<_R6&_CbM$FUQ%BhD(g)mG7s
z;|<<@l+tdI?xwQr1ac_nRJLM|C*4iVR#FFBjn+E9EN6lHb;>w_oZ2m`><c`$AOg&?
zo|<<<I$R&YEEOF?9q2aF5b=bb$R}nJbBP=RO;FBCJ0S=GeU=QqWR^r%0?kq>SuJUa
z`aeDRK|A=tc#4Em<1%INB{L=30)5y=?t#*EUwzSfGH|l=q;g2{A;yUGK8g{%OncOP
zX^*mzY_fi&Xs-V#@X=$Gbf3Cd*&^dbcsGeYi9VWR>dB_q`{~Yub~#v?Iv**R11h-L
zk$^cM(Qhm`=uuFFPzv>goP!?YeF|n8`FfwpgRQxV(<CwX(_v4%8tian*UhkNWs4C`
zG4%ve2|-TD1cH)dA2uIV-AI+_g@D0-LYWNZRVc@y|3fIZLphY0RO<@O0B=EBKhl$1
zT%i;;%C~=%%m16dpE!XY9yOosDfOWA7iTJml#Q*Nf<I_q?IT{Q18g*w==~HQAUf$e
zBq)w4DA`ML3kkR%gf-&KZ*$*CUAsjJ#j~b1^;RjQVF#W2_?C`bU$Fsf?xdF~>_2Ez
z@pgNiZ=K<#$-ZTt9jS3!Ol?(dY$$<c^Gp5UH-sLC5NKN5^R{&Aa^QSG8vbQ>mZ9O6
z)LCaJ4;Vu;Eb=W%7T&vHkLvuaTSrN)ZLI|4W|Ui4_X%#F^^Bp@U+=GUI~?;qmRf%5
zOyui)HoM7?F?p)dvoLiz+>`<Onc9BjY_l8lp73q#|8|=SW||F8N9N5)HMRZFiAOf{
zFK+{D>`6{N?Rd;x*~Yo6+N#~U)MiIT>(>_V6Mnw94qgCtw=3N9+(hb|j)gF1C(PO9
z{%rd99Zx~47FxUA_og3luCm9~=346Ph>zQofM1;@Wr4#E{9bhhi`&Rr1uthYM-VSL
z>+R}2+u1O$fjRplFH<J;FRcV`9#hUkq1p~E0Jfhu=X}Ev(N2CPb)*P<VL-kOWQ2#k
zg%iG7C+vL#@*HjCZjEImc<v1EJbQH{Sl4Ox)b&3`#WEkGmdB|>MM6NfEeqC0Uedlw
zXXGV)Bl?m~f|oR$>Fe~z&t*fu=qz)#_e&vLX9s)_be6(y3SK$6pL*+mSV(@YlLyLz
ztWz7EOz@xKy}2FWTXxA{%##fDK9MSQ8iV`oM#yR~!F^Nx7OK!;0IGchsP?kEZ2DIn
zOQ7{Cv|e+spT4#b`+LpSP3*QwABt_8+5Z}F&Fs%Dc$GJgZ<~6JJUxA(^T=sK_oj}{
zz>%vmVKJ56)o})|XwB>N7v)*6O{C6q)}PMl-U>77ua2i?cAbA@T)cKG^;OW*mqAZo
znLO`WYMS%7{W<%dsT-@Q6z55Mnf;Zi9*7|YWK~g!&VBMIM^Q+STTR?igBW<jwckcX
zWY^-doshwvKUnDIw9Ro1nxl~Yx}&VX`8(_*GSFYcCU_q%1;F_f{MN<(6`^pL8AUw7
z8~YG%{1vW49NPWdE!$bfxgPlSvtHn<Q0Jqz-nX!!LVJ9z+%k=ang?5RW9XZ14SfH}
zZG`-pF|-%pb$3>fva+G_OUegnP*z^j-o@<~FC|RGL0Nr?oWM~p8{#h^s|(tYhXW7*
zYA(SIz+VlxsmT4pzyWi>JQnb6zJ)%uEk>W(7ys+n&`tCyMBbl9qG4;&*oi<=;P5SG
z6ym!!Y|Tk0kqH=iBG^<N0{od#f{(=#%9<=Lr3=xE^A%irHe?*>`PWHB*jnS0XB#0O
zmJHdc>PV)o%&&DM`Acuuf~Pu+pwEiTLXZrw0Ku*Oh=0_Vw=Ie0Z?G?C+f3Xu5T!D^
z<1H!9{imRolibB#!(cg;+*R+l45w0yc2BdEw<hFJPFKhN)<xC|_arCXwo{moGLRIB
zw&fgvJSIUQe)4sW!pP>Kq-T#%z&iqA{$jjR9c-&~Mm=}B!`6x;*-l?r?DWmbCPcl%
z=1y`LTPbKKXCBDw^ikmJNN<8e0ie3_nMex839_c`Ui{8zK2JuG4%V${21$s#l_kj6
zHUWOcbE0{;XNnS0gq8y&Cv}D=s6C06WwythGT}2({FpsWUdifGTv2*eL!>b0-t?Mu
zDm<azlVw?Hd(rlW4Qp`~d||E+-ne;%_lO$NH{B`TG+vci$)RaZ#ZZM!<s}8>ko&=m
z$emD?bPm5eaTJkA5kdJLIZFifd$g7~r`7=yc3J@5Almk<PK;6ucoTi;+t3A^JH&ZE
zAYC{bYpn+lsBymBq3I&T^8A<cjb}Rjs%|!)&4+iC&v-3LYpfsJV0}3Jd1PIJBhgtq
zoap=pzzzTbU?;$f0RIHQ0!Z}w`L7NqI1?b_AIqnV9@a~L{3Rv*2H;(Q^8jxF)C0@`
z&;t+vKY5pu(w~gw!cjHdMdq!#$+m-q*`2@^8X=;)>1uxl;u#zVB2iWh+A%u2%x^)}
z3IEXCOqd(XqC<=gI#ve|iyz?}tZidqUUx<Ld-4N?cN;}E>Y6IyTqC|kZ5caqFQb}R
zZ62-6FUk{dZpvdiOnGwc!$?z)($G$bHA~^U8ClRXf-Zo>BuddJ%PaA#SvO~#w5KYs
z>P>}rAB=z3VB|{!(dc%NO9wkwklw)26aks%Y1zpRO{7L;>m6jIrp=}tg(J*+sz{5B
zXz=G>y2z1D7z3Hv93ZcdZz>xrd^Ste7Gg^XRt0zo`GIakp|_`U9o1PJQ2Bb4$_v=p
zK?L?g7euuxON8Rr5&cxU)J{|I%S^4-5(d3C@*G4L(NO{Jt)k+yaVspWx(>XFMCq>f
zD0c=^ALb|it0KN!H>e#5SECxpUPa~^g{_mGAnIpuh7GW=LXPLbY<P2T1#0DvtG$@x
znj!U@nnrm|>6A|r#=q7j(c(f>rDU)jD@aGxySOZh5c?vz52H{hEDg$Q@M?VCQ|WO6
zs(yX)MEs64`(<;HRU4ssoIn&uWMFjUp1LexA*}NwyK9E<E$|+LoccKSlz2Bncpdt_
z*VfBv8r5FS+&O~!ZZvBYc|q<_QF9{aL|f+D)13rQf`!;0(%1Cfn+CrgC<io=Ul2&I
zrV(2t#gMuYpRa(d0iKssW166MDhIJuQhC>N@y)shEoik0csT-cy9ewb*6oRkY2_({
z$peV~<&VNU-snQ2L@!$SLe0xH`{DkJ7UFga&<N4LIg7uCBH!P&;`&GMC9JQ4y~Ezq
z(uTxm;C+j0dau4Q*9Z5h)_HY)-LdlgTtC5kxC7kBoPJ26zqgQt8M<R~=tDx{&S+1O
zAw$$Re$TKeuQSl;gV7r874r8;@Nm%?ao(aO8G>&~-5t$`n-<rNX^(4~)F0%I<&NhD
z;y;LMZvKS&ef;s<I|)~Y{uJ|ZCjv3gm-wN+F)8q`V@YEdZ|Va2Z5me7sBKaoi)%i4
z<Ja&aAG`G&r90-~<oqKyD#);2DiFr0W1n!jcQS-ckaNBVzBKATbybN?!tEvCPh-CI
z5Eu2Q$8IGw>BjWi!#Crb(5E9y(5E++JPz}ih~LE?_s@5d?u6hT6l)KtSis}h$xrYt
z&fiF)K<}FVE7GdJp{4ZO<QB^6;nbAon7aAjBK>1GxO|;ILof#@(7Dw<$XNv5E7+4?
zKQ4|(q;MR|54Lj&lbnHegflV@`w7VPIzJPMyJ->6r5uR<8m011YffoM1}V{27-V{>
z65^fD;kQdHCsX<dJeBRq;;K0PhnGh)EYlqOTXo>wb+u_0#3y%2XIu{s7?QK}T|~*U
zzyp@*0`Cic5+r0|M$PqmXs3FJ^hSN9x>4WUzzu-5Enw`ANN8ZTUP`y43%2hNDE8YG
zIe=e9s7l5qI@nW*4kXn0WZ4N0=~ROAfZ>3_cpC5)B}1nVN3_PPh`u!s3HViXl#5wy
z7W{r*^J{Y}p<D#EEEdzyjx=Y5?=cGvyV1_?`{(4y+Ecq{QK?-;%a;XaSX`~J_s(T2
zmW`%ZmfxBi&|CJOWzR|wLk0pP_fkNTmW{+a<fRQC<KGhlqZhf4=RX?X1jF$AF6bMM
zJ)Y~B``sTw8HPUWBe73~to8j^P9oZV=jm8G8Y`GONsg#Zv|vr22C;|n%xB`rU3HDp
zTX?2$B7P?+sJwbA5h4|RHlCxKnxmhbldw|(b1>bp=8{hx<)*xR6{hj?5T``Xe&J`a
zv!m^+f72G8|KfN<-51+qQ{%ykjPluovj$9^(tT75zvNob8I#R=Zbe>dEj=U!)s{JD
z!Vp>Ij-`30!!Jzg<3DqyHSOC&vdDV<{`8%4s>(({NeLz!dF5*m7fo+c4}B&oucS4x
zAiJt7uh|Z8ki8iq;I*Z_a^#%u%HpnhHxITXc!faxmE|^4Nc66-QQnm{y|>tw<XvS;
z_LkUEysK?9BGz-7mwt0bW4QLK_yxFQsqb<4Wq97lBf%9dL~XtWUV<&!TD>I`<O0#d
z=@&S3HxaV0YepB&KXMY$?dhOXcN2Rar|2daqr0!q7)ooJ(U`htnq_(yM3td~XX<dC
z)<!p_ie|ru3qy>+(3Z!uc9Il*jG^zKqnvhXcR9t-Kb?!JGMZ;M%mOW>z*b}4)O|S`
zA3s|h{cRV=Vx%^aj7v~!6TvCZMDL)DL;>1K{8+XT&6oYRd>&Gf3Ic|Z0$@)eLCr&`
z_A!93BJ}w}bnM4@0GS9Kd>q;M`2Y)$JTn^+Ob&Yg{F4Cr2)UL3d<Ej<L?odE<Q`mv
z<}y#AY;_*0B=b>`(SR;Lz8DP@7a(L@f+)pOq(e`mU9wC>x^mDmlnVgs)+3~(o`HSR
z(Hw->xX50xZVevGf_}sz0`HIa!hO%+iz6kP4qt#Q3L#357NI1BNIV{wSuQg$&t)!U
z&bbV8Cc*`C!k^Pj;*K!<C8N`OlTiYjjQ)9BGKyQ2jQ;#&GV04nMn@sKI=wdy#?oLc
z4aU-7EDgreU<|LFhKy($axnmf0M!780WJUx0^FMc<1=6!pb(%M;4r`ifI)zJcn`I9
ze$GN`&5`f_)*JZ)jNO37I>0hjhR|h9hX{V`eF8BAk})s}U}R8n5rYU5lq(ptzZm*T
z81!c|lxvu!#5!it<qZr{Kg&>cn;0}w#-Mdu86<6E5c2}e!F#Ehl#~Q0Wen@Wbe1tp
fq{R1n^e=iYgLDjq5?~K}KK^@j4z3RuE|mTUWw=ti

literal 0
HcmV?d00001

diff --git a/rtlwifi/rtl8723bs_nic.bin b/rtlwifi/rtl8723bs_nic.bin
new file mode 100644
index 0000000000000000000000000000000000000000..8d534053823e47ba4e49c8600463af47fbec7306
GIT binary patch
literal 32108
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

literal 0
HcmV?d00001

diff --git a/rtlwifi/rtl8723bs_wowlan.bin b/rtlwifi/rtl8723bs_wowlan.bin
new file mode 100644
index 0000000000000000000000000000000000000000..473e29c3217fb06046aa0df7a22b2e613b331235
GIT binary patch
literal 26398
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%0D9(z1wjTOY@OzRPq2uwrhby&7hjG
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

literal 0
HcmV?d00001

-- 
2.10.2

^ permalink raw reply related

* Re: [net PATCH v5 6/6] virtio_net: XDP support for adjust_head
From: Michael S. Tsirkin @ 2017-01-19 21:11 UTC (permalink / raw)
  To: Jason Wang
  Cc: John Fastabend, john.r.fastabend, netdev, alexei.starovoitov,
	daniel
In-Reply-To: <40e9a46a-1115-c21a-49f3-fdedb0a34101@redhat.com>

On Thu, Jan 19, 2017 at 11:05:40AM +0800, Jason Wang wrote:
> 
> 
> On 2017年01月18日 23:15, Michael S. Tsirkin wrote:
> > On Tue, Jan 17, 2017 at 02:22:59PM -0800, John Fastabend wrote:
> > > Add support for XDP adjust head by allocating a 256B header region
> > > that XDP programs can grow into. This is only enabled when a XDP
> > > program is loaded.
> > > 
> > > In order to ensure that we do not have to unwind queue headroom push
> > > queue setup below bpf_prog_add. It reads better to do a prog ref
> > > unwind vs another queue setup call.
> > > 
> > > At the moment this code must do a full reset to ensure old buffers
> > > without headroom on program add or with headroom on program removal
> > > are not used incorrectly in the datapath. Ideally we would only
> > > have to disable/enable the RX queues being updated but there is no
> > > API to do this at the moment in virtio so use the big hammer. In
> > > practice it is likely not that big of a problem as this will only
> > > happen when XDP is enabled/disabled changing programs does not
> > > require the reset. There is some risk that the driver may either
> > > have an allocation failure or for some reason fail to correctly
> > > negotiate with the underlying backend in this case the driver will
> > > be left uninitialized. I have not seen this ever happen on my test
> > > systems and for what its worth this same failure case can occur
> > > from probe and other contexts in virtio framework.
> > > 
> > > Signed-off-by: John Fastabend<john.r.fastabend@intel.com>
> > I've been thinking about it - can't we drop
> > old buffers without the head room which were posted before
> > xdp attached?
> > 
> > Avoiding the reset would be much nicer.
> > 
> > Thoughts?
> > 
> 
> As been discussed before, device may use them in the same time so it's not
> safe. Or do you mean detect them after xdp were set and drop the buffer
> without head room, this looks sub-optimal.
> 
> Thanks

Yes, this is what I mean.  Why is this suboptimal? It's a single branch
in code. Yes we might lose some packets but the big hammer of device
reset will likely lose more.

-- 
MST

^ permalink raw reply

* [PATCH v7 01/13] net: ethernet: aquantia: Make and configuration files.
From: Alexander Loktionov @ 2017-01-19 21:33 UTC (permalink / raw)
  To: netdev, David VomLehn
  Cc: David S . Miller, Simon Edelhaus, Alexander Loktionov,
	Dmitrii Tarakanov, Pavel Belous, Dmitry Bezrukov
In-Reply-To: <cover.1484860589.git.vomlehn@texas.net>

From: David VomLehn <vomlehn@texas.net>

Patches to create the make and configuration files.

Signed-off-by: Alexander Loktionov <Alexander.Loktionov@aquantia.com>
Signed-off-by: Dmitrii Tarakanov <Dmitrii.Tarakanov@aquantia.com>
Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>
Signed-off-by: Dmitry Bezrukov <Dmitry.Bezrukov@aquantia.com>
Signed-off-by: David M. VomLehn <vomlehn@texas.net>
---
 drivers/net/ethernet/aquantia/Kconfig           | 20 ++++++++++++
 drivers/net/ethernet/aquantia/Makefile          |  5 +++
 drivers/net/ethernet/aquantia/atlantic/Kconfig  |  9 ++++++
 drivers/net/ethernet/aquantia/atlantic/Makefile | 42 +++++++++++++++++++++++++
 drivers/net/ethernet/aquantia/atlantic/ver.h    | 18 +++++++++++
 5 files changed, 94 insertions(+)
 create mode 100644 drivers/net/ethernet/aquantia/Kconfig
 create mode 100644 drivers/net/ethernet/aquantia/Makefile
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/Kconfig
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/Makefile
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/ver.h

diff --git a/drivers/net/ethernet/aquantia/Kconfig b/drivers/net/ethernet/aquantia/Kconfig
new file mode 100644
index 0000000..3ec2d6b
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/Kconfig
@@ -0,0 +1,20 @@
+#
+# aQuantia device configuration
+#
+
+config NET_VENDOR_AQUANTIA
+	bool "aQuantia devices"
+	default y
+	---help---
+	  Set this to y if you have an Ethernet network cards that uses the aQuantia
+	  AQC107/AQC108 chipset.
+
+	  This option does not build any drivers; it casues the aQuantia
+	  drivers that can be built to appear in the list of Ethernet drivers.
+
+
+if NET_VENDOR_AQUANTIA
+
+source "drivers/net/ethernet/aquantia/atlantic/Kconfig"
+
+endif # NET_VENDOR_AQUANTIA
diff --git a/drivers/net/ethernet/aquantia/Makefile b/drivers/net/ethernet/aquantia/Makefile
new file mode 100644
index 0000000..4f4897b
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/Makefile
@@ -0,0 +1,5 @@
+#
+# Makefile for the aQuantia device drivers.
+#
+
+obj-$(CONFIG_AQTION) += atlantic/
diff --git a/drivers/net/ethernet/aquantia/atlantic/Kconfig b/drivers/net/ethernet/aquantia/atlantic/Kconfig
new file mode 100644
index 0000000..5edc4ef
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/Kconfig
@@ -0,0 +1,9 @@
+#
+# aQuantia device configuration
+#
+
+config AQTION
+	tristate "aQuantia AQtion(tm) Support"
+	depends on PCI
+	---help---
+	  This enables the support for the aQuantia AQtion(tm) Ethernet card.
diff --git a/drivers/net/ethernet/aquantia/atlantic/Makefile b/drivers/net/ethernet/aquantia/atlantic/Makefile
new file mode 100644
index 0000000..e4ae696
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/Makefile
@@ -0,0 +1,42 @@
+################################################################################
+#
+# aQuantia Ethernet Controller AQtion Linux Driver
+# Copyright(c) 2014-2017 aQuantia Corporation.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms and conditions of the GNU General Public License,
+# version 2, as published by the Free Software Foundation.
+#
+# This program is distributed in the hope 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.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# The full GNU General Public License is included in this distribution in
+# the file called "COPYING".
+#
+# Contact Information: <rdc-drv@aquantia.com>
+# aQuantia Corporation, 105 E. Tasman Dr. San Jose, CA 95134, USA
+#
+################################################################################
+
+#
+# Makefile for the AQtion(tm) Ethernet driver
+#
+
+obj-$(CONFIG_AQTION) += atlantic.o
+
+atlantic-objs := aq_main.o \
+	aq_nic.o \
+	aq_pci_func.o \
+	aq_vec.o \
+	aq_ring.o \
+	aq_hw_utils.o \
+	aq_ethtool.o \
+	hw_atl/hw_atl_a0.o \
+	hw_atl/hw_atl_b0.o \
+	hw_atl/hw_atl_utils.o \
+	hw_atl/hw_atl_llh.o
diff --git a/drivers/net/ethernet/aquantia/atlantic/ver.h b/drivers/net/ethernet/aquantia/atlantic/ver.h
new file mode 100644
index 0000000..0de858d
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/ver.h
@@ -0,0 +1,18 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+#ifndef VER_H
+#define VER_H
+
+#define NIC_MAJOR_DRIVER_VERSION           1
+#define NIC_MINOR_DRIVER_VERSION           5
+#define NIC_BUILD_DRIVER_VERSION           345
+#define NIC_REVISION_DRIVER_VERSION        0
+
+#endif /* VER_H */
-- 
2.9.3

^ permalink raw reply related

* [PATCH v7 03/13] net: ethernet: aquantia: Add ring support code
From: Alexander Loktionov @ 2017-01-19 21:33 UTC (permalink / raw)
  To: netdev, David VomLehn
  Cc: David S . Miller, Simon Edelhaus, Alexander Loktionov,
	Dmitrii Tarakanov, Pavel Belous, Dmitry Bezrukov
In-Reply-To: <cover.1484860589.git.vomlehn@texas.net>

From: David VomLehn <vomlehn@texas.net>

Add code to support the transmit and receive ring buffers.

Signed-off-by: Alexander Loktionov <Alexander.Loktionov@aquantia.com>
Signed-off-by: Dmitrii Tarakanov <Dmitrii.Tarakanov@aquantia.com>
Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>
Signed-off-by: Dmitry Bezrukov <Dmitry.Bezrukov@aquantia.com>
Signed-off-by: David M. VomLehn <vomlehn@texas.net>
---
 drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 377 +++++++++++++++++++++++
 drivers/net/ethernet/aquantia/atlantic/aq_ring.h | 157 ++++++++++
 2 files changed, 534 insertions(+)
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_ring.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_ring.h

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
new file mode 100644
index 0000000..65e30cc
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
@@ -0,0 +1,377 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_ring.c: Definition of functions for Rx/Tx rings. */
+
+#include "aq_ring.h"
+#include "aq_nic.h"
+#include "aq_hw.h"
+
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+
+static struct aq_ring_s *aq_ring_alloc(struct aq_ring_s *self,
+				       struct aq_nic_s *aq_nic)
+{
+	int err = 0;
+
+	self->buff_ring =
+		kzalloc(sizeof(struct aq_ring_buff_s) * self->size,
+			GFP_KERNEL);
+
+	if (!self->buff_ring) {
+		err = -ENOMEM;
+		goto err_exit;
+	}
+	self->dx_ring = dma_alloc_coherent(aq_nic_get_dev(aq_nic),
+						self->size * self->dx_size,
+						&self->dx_ring_pa, GFP_KERNEL);
+	if (!self->dx_ring) {
+		err = -ENOMEM;
+		goto err_exit;
+	}
+
+err_exit:
+	if (err < 0) {
+		aq_ring_free(self);
+		self = NULL;
+	}
+	return self;
+}
+
+struct aq_ring_s *aq_ring_tx_alloc(struct aq_ring_s *self,
+				   struct aq_nic_s *aq_nic,
+				   unsigned int idx,
+				   struct aq_nic_cfg_s *aq_nic_cfg)
+{
+	int err = 0;
+
+	self->aq_nic = aq_nic;
+	self->idx = idx;
+	self->size = aq_nic_cfg->txds;
+	self->dx_size = aq_nic_cfg->aq_hw_caps->txd_size;
+
+	self = aq_ring_alloc(self, aq_nic);
+	if (!self) {
+		err = -ENOMEM;
+		goto err_exit;
+	}
+
+err_exit:
+	if (err < 0) {
+		aq_ring_free(self);
+		self = NULL;
+	}
+	return self;
+}
+
+struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,
+				   struct aq_nic_s *aq_nic,
+				   unsigned int idx,
+				   struct aq_nic_cfg_s *aq_nic_cfg)
+{
+	int err = 0;
+
+	self->aq_nic = aq_nic;
+	self->idx = idx;
+	self->size = aq_nic_cfg->rxds;
+	self->dx_size = aq_nic_cfg->aq_hw_caps->rxd_size;
+
+	self = aq_ring_alloc(self, aq_nic);
+	if (!self) {
+		err = -ENOMEM;
+		goto err_exit;
+	}
+
+err_exit:
+	if (err < 0) {
+		aq_ring_free(self);
+		self = NULL;
+	}
+	return self;
+}
+
+int aq_ring_init(struct aq_ring_s *self)
+{
+	self->hw_head = 0;
+	self->sw_head = 0;
+	self->sw_tail = 0;
+	return 0;
+}
+
+void aq_ring_tx_append_buffs(struct aq_ring_s *self,
+			     struct aq_ring_buff_s *buffer,
+			     unsigned int buffers)
+{
+	if (likely(self->sw_tail + buffers < self->size)) {
+		memcpy(&self->buff_ring[self->sw_tail], buffer,
+		       sizeof(buffer[0]) * buffers);
+	} else {
+		unsigned int first_part = self->size - self->sw_tail;
+		unsigned int second_part = buffers - first_part;
+
+		memcpy(&self->buff_ring[self->sw_tail], buffer,
+		       sizeof(buffer[0]) * first_part);
+
+		memcpy(&self->buff_ring[0], &buffer[first_part],
+		       sizeof(buffer[0]) * second_part);
+	}
+}
+
+int aq_ring_tx_clean(struct aq_ring_s *self)
+{
+	struct device *dev = aq_nic_get_dev(self->aq_nic);
+
+	for (; self->sw_head != self->hw_head;
+		self->sw_head = aq_ring_next_dx(self, self->sw_head)) {
+		struct aq_ring_buff_s *buff = &self->buff_ring[self->sw_head];
+
+		if (likely(buff->is_mapped)) {
+			if (unlikely(buff->is_sop))
+				dma_unmap_single(dev, buff->pa, buff->len,
+						 DMA_TO_DEVICE);
+			else
+				dma_unmap_page(dev, buff->pa, buff->len,
+					       DMA_TO_DEVICE);
+		}
+
+		if (unlikely(buff->is_eop))
+			dev_kfree_skb_any(buff->skb);
+	}
+
+	if (aq_ring_avail_dx(self) > AQ_CFG_SKB_FRAGS_MAX)
+		aq_nic_ndev_queue_start(self->aq_nic, self->idx);
+
+	return 0;
+}
+
+static inline unsigned int aq_ring_dx_in_range(unsigned int h, unsigned int i,
+					       unsigned int t)
+{
+	return (h < t) ? ((h < i) && (i < t)) : ((h < i) || (i < t));
+}
+
+#define AQ_SKB_ALIGN SKB_DATA_ALIGN(sizeof(struct skb_shared_info))
+int aq_ring_rx_clean(struct aq_ring_s *self, int *work_done, int budget)
+{
+	struct net_device *ndev = aq_nic_get_ndev(self->aq_nic);
+	int err = 0;
+	bool is_rsc_completed = true;
+
+	for (; (self->sw_head != self->hw_head) && budget;
+		self->sw_head = aq_ring_next_dx(self, self->sw_head),
+		--budget, ++(*work_done)) {
+		struct aq_ring_buff_s *buff = &self->buff_ring[self->sw_head];
+		struct sk_buff *skb = NULL;
+		unsigned int next_ = 0U;
+		unsigned int i = 0U;
+		struct aq_ring_buff_s *buff_ = NULL;
+
+		if (buff->is_error) {
+			__free_pages(buff->page, 0);
+			continue;
+		}
+
+		if (buff->is_cleaned)
+			continue;
+
+		if (!buff->is_eop) {
+			for (next_ = buff->next,
+			     buff_ = &self->buff_ring[next_]; true;
+			     next_ = buff_->next,
+			     buff_ = &self->buff_ring[next_]) {
+				is_rsc_completed =
+					aq_ring_dx_in_range(self->sw_head,
+							    next_,
+							    self->hw_head);
+
+				if (unlikely(!is_rsc_completed)) {
+					is_rsc_completed = false;
+					break;
+				}
+
+				if (buff_->is_eop)
+					break;
+			}
+
+			if (!is_rsc_completed) {
+				err = 0;
+				goto err_exit;
+			}
+		}
+
+		/* for single fragment packets use build_skb() */
+		if (buff->is_eop) {
+			skb = build_skb(page_address(buff->page),
+					buff->len + AQ_SKB_ALIGN);
+			if (unlikely(!skb)) {
+				err = -ENOMEM;
+				goto err_exit;
+			}
+
+			skb->dev = ndev;
+			skb_put(skb, buff->len);
+		} else {
+			skb = netdev_alloc_skb(ndev, ETH_HLEN);
+			if (unlikely(!skb)) {
+				err = -ENOMEM;
+				goto err_exit;
+			}
+			skb_put(skb, ETH_HLEN);
+			memcpy(skb->data, page_address(buff->page), ETH_HLEN);
+
+			skb_add_rx_frag(skb, 0, buff->page, ETH_HLEN,
+					buff->len - ETH_HLEN,
+					SKB_TRUESIZE(buff->len - ETH_HLEN));
+
+			for (i = 1U, next_ = buff->next,
+			     buff_ = &self->buff_ring[next_]; true;
+			     next_ = buff_->next,
+			     buff_ = &self->buff_ring[next_], ++i) {
+				skb_add_rx_frag(skb, i, buff_->page, 0,
+						buff_->len,
+						SKB_TRUESIZE(buff->len -
+						ETH_HLEN));
+				buff_->is_cleaned = 1;
+
+				if (buff_->is_eop)
+					break;
+			}
+		}
+
+		skb->protocol = eth_type_trans(skb, ndev);
+		if (unlikely(buff->is_cso_err)) {
+			++self->stats.rx.errors;
+			__skb_mark_checksum_bad(skb);
+		} else {
+			if (buff->is_ip_cso) {
+				__skb_incr_checksum_unnecessary(skb);
+				if (buff->is_udp_cso || buff->is_tcp_cso)
+					__skb_incr_checksum_unnecessary(skb);
+			} else {
+				skb->ip_summed = CHECKSUM_NONE;
+			}
+		}
+
+		skb_set_hash(skb, buff->rss_hash,
+			     buff->is_hash_l4 ? PKT_HASH_TYPE_L4 :
+			     PKT_HASH_TYPE_NONE);
+
+		skb_record_rx_queue(skb, self->idx);
+
+		netif_receive_skb(skb);
+
+		++self->stats.rx.packets;
+		self->stats.rx.bytes += skb->len;
+	}
+
+err_exit:
+	return err;
+}
+
+int aq_ring_rx_fill(struct aq_ring_s *self)
+{
+	struct aq_ring_buff_s *buff = NULL;
+	int err = 0;
+	int i = 0;
+
+	for (i = aq_ring_avail_dx(self); i--;
+		self->sw_tail = aq_ring_next_dx(self, self->sw_tail)) {
+		buff = &self->buff_ring[self->sw_tail];
+
+		buff->flags = 0U;
+		buff->len = AQ_CFG_RX_FRAME_MAX;
+
+		buff->page = alloc_pages(GFP_ATOMIC | __GFP_COLD |
+					 __GFP_COMP, 0);
+		if (!buff->page) {
+			err = -ENOMEM;
+			goto err_exit;
+		}
+
+		buff->pa = dma_map_page(aq_nic_get_dev(self->aq_nic),
+					buff->page, 0,
+					AQ_CFG_RX_FRAME_MAX, DMA_FROM_DEVICE);
+
+		err = dma_mapping_error(aq_nic_get_dev(self->aq_nic), buff->pa);
+		if (err < 0)
+			goto err_exit;
+
+		buff = NULL;
+	}
+	if (err < 0)
+		goto err_exit;
+
+err_exit:
+	if (err < 0) {
+		if (buff && buff->page)
+			__free_pages(buff->page, 0);
+	}
+
+	return err;
+}
+
+void aq_ring_rx_deinit(struct aq_ring_s *self)
+{
+	if (!self)
+		goto err_exit;
+
+	for (; self->sw_head != self->sw_tail;
+		self->sw_head = aq_ring_next_dx(self, self->sw_head)) {
+		struct aq_ring_buff_s *buff = &self->buff_ring[self->sw_head];
+
+		dma_unmap_page(aq_nic_get_dev(self->aq_nic), buff->pa,
+			       AQ_CFG_RX_FRAME_MAX, DMA_FROM_DEVICE);
+
+		__free_pages(buff->page, 0);
+	}
+
+err_exit:;
+}
+
+void aq_ring_tx_deinit(struct aq_ring_s *self)
+{
+	if (!self)
+		goto err_exit;
+
+	for (; self->sw_head != self->sw_tail;
+		self->sw_head = aq_ring_next_dx(self, self->sw_head)) {
+		struct aq_ring_buff_s *buff = &self->buff_ring[self->sw_head];
+		struct device *ndev = aq_nic_get_dev(self->aq_nic);
+
+		if (likely(buff->is_mapped)) {
+			if (unlikely(buff->is_sop)) {
+				dma_unmap_single(ndev, buff->pa, buff->len,
+						 DMA_TO_DEVICE);
+			} else {
+				dma_unmap_page(ndev, buff->pa, buff->len,
+					       DMA_TO_DEVICE);
+			}
+		}
+
+		if (unlikely(buff->is_eop))
+			dev_kfree_skb_any(buff->skb);
+	}
+err_exit:;
+}
+
+void aq_ring_free(struct aq_ring_s *self)
+{
+	if (!self)
+		goto err_exit;
+
+	kfree(self->buff_ring);
+
+	if (self->dx_ring)
+		dma_free_coherent(aq_nic_get_dev(self->aq_nic),
+				  self->size * self->dx_size, self->dx_ring,
+				  self->dx_ring_pa);
+
+err_exit:;
+}
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
new file mode 100644
index 0000000..0ac3f9e
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
@@ -0,0 +1,157 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_ring.h: Declaration of functions for Rx/Tx rings. */
+
+#ifndef AQ_RING_H
+#define AQ_RING_H
+
+#include "aq_common.h"
+
+struct page;
+
+/*           TxC       SOP        DX         EOP
+ *         +----------+----------+----------+-----------
+ *   8bytes|len l3,l4 | pa       | pa       | pa
+ *         +----------+----------+----------+-----------
+ * 4/8bytes|len pkt   |len pkt   |          | skb
+ *         +----------+----------+----------+-----------
+ * 4/8bytes|is_txc    |len,flags |len       |len,is_eop
+ *         +----------+----------+----------+-----------
+ *
+ *  This aq_ring_buff_s doesn't have endianness dependency.
+ *  It is __packed for cache line optimizations.
+ */
+struct __packed aq_ring_buff_s {
+	union {
+		/* RX */
+		struct {
+			u32 rss_hash;
+			u16 next;
+			u8 is_hash_l4;
+			u8 rsvd1;
+			struct page *page;
+		};
+		/* EOP */
+		struct {
+			dma_addr_t pa_eop;
+			struct sk_buff *skb;
+		};
+		/* DX */
+		struct {
+			dma_addr_t pa;
+		};
+		/* SOP */
+		struct {
+			dma_addr_t pa_sop;
+			u32 len_pkt_sop;
+		};
+		/* TxC */
+		struct {
+			u32 mss;
+			u8 len_l2;
+			u8 len_l3;
+			u8 len_l4;
+			u8 rsvd2;
+			u32 len_pkt;
+		};
+	};
+	union {
+		struct {
+			u32 len:16;
+			u32 is_ip_cso:1;
+			u32 is_udp_cso:1;
+			u32 is_tcp_cso:1;
+			u32 is_cso_err:1;
+			u32 is_sop:1;
+			u32 is_eop:1;
+			u32 is_txc:1;
+			u32 is_mapped:1;
+			u32 is_cleaned:1;
+			u32 is_error:1;
+			u32 rsvd3:6;
+		};
+		u32 flags;
+	};
+};
+
+struct aq_ring_stats_rx_s {
+	u64 errors;
+	u64 packets;
+	u64 bytes;
+	u64 lro_packets;
+	u64 jumbo_packets;
+};
+
+struct aq_ring_stats_tx_s {
+	u64 errors;
+	u64 packets;
+	u64 bytes;
+};
+
+union aq_ring_stats_s {
+	struct aq_ring_stats_rx_s rx;
+	struct aq_ring_stats_tx_s tx;
+};
+
+struct aq_ring_s {
+	struct aq_obj_s header;
+	struct aq_ring_buff_s *buff_ring;
+	u8 *dx_ring;		/* descriptors ring, dma shared mem */
+	struct aq_nic_s *aq_nic;
+	unsigned int idx;	/* for HW layer registers operations */
+	unsigned int hw_head;
+	unsigned int sw_head;
+	unsigned int sw_tail;
+	unsigned int size;	/* descriptors number */
+	unsigned int dx_size;	/* TX or RX descriptor size,  */
+				/* stored here for fater math */
+	union aq_ring_stats_s stats;
+	dma_addr_t dx_ring_pa;
+};
+
+struct aq_ring_param_s {
+	unsigned int vec_idx;
+	unsigned int cpu;
+	cpumask_t affinity_mask;
+};
+
+static inline unsigned int aq_ring_next_dx(struct aq_ring_s *self,
+					   unsigned int dx)
+{
+	return (++dx >= self->size) ? 0U : dx;
+}
+
+static inline unsigned int aq_ring_avail_dx(struct aq_ring_s *self)
+{
+	return (((self->sw_tail >= self->sw_head)) ?
+		(self->size - 1) - self->sw_tail + self->sw_head :
+		self->sw_head - self->sw_tail - 1);
+}
+
+struct aq_ring_s *aq_ring_tx_alloc(struct aq_ring_s *self,
+				   struct aq_nic_s *aq_nic,
+				   unsigned int idx,
+				   struct aq_nic_cfg_s *aq_nic_cfg);
+struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,
+				   struct aq_nic_s *aq_nic,
+				   unsigned int idx,
+				   struct aq_nic_cfg_s *aq_nic_cfg);
+int aq_ring_init(struct aq_ring_s *self);
+void aq_ring_tx_deinit(struct aq_ring_s *self);
+void aq_ring_rx_deinit(struct aq_ring_s *self);
+void aq_ring_free(struct aq_ring_s *self);
+void aq_ring_tx_append_buffs(struct aq_ring_s *ring,
+			     struct aq_ring_buff_s *buffer,
+			     unsigned int buffers);
+int aq_ring_tx_clean(struct aq_ring_s *self);
+int aq_ring_rx_clean(struct aq_ring_s *self, int *work_done, int budget);
+int aq_ring_rx_fill(struct aq_ring_s *self);
+
+#endif /* AQ_RING_H */
-- 
2.9.3

^ permalink raw reply related

* [PATCH v7 02/13] net: ethernet: aquantia: Common functions and definitions
From: Alexander Loktionov @ 2017-01-19 21:33 UTC (permalink / raw)
  To: netdev, David VomLehn
  Cc: David S . Miller, Simon Edelhaus, Alexander Loktionov,
	Dmitrii Tarakanov, Pavel Belous, Dmitry Bezrukov
In-Reply-To: <cover.1484860589.git.vomlehn@texas.net>

From: David VomLehn <vomlehn@texas.net>

Add files containing the functions and definitions used in common in
different functional areas.

Signed-off-by: Alexander Loktionov <Alexander.Loktionov@aquantia.com>
Signed-off-by: Dmitrii Tarakanov <Dmitrii.Tarakanov@aquantia.com>
Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>
Signed-off-by: Dmitry Bezrukov <Dmitry.Bezrukov@aquantia.com>
Signed-off-by: David M. VomLehn <vomlehn@texas.net>
---
 drivers/net/ethernet/aquantia/atlantic/aq_cfg.h    | 77 ++++++++++++++++++++++
 drivers/net/ethernet/aquantia/atlantic/aq_common.h | 23 +++++++
 drivers/net/ethernet/aquantia/atlantic/aq_utils.h  | 50 ++++++++++++++
 3 files changed, 150 insertions(+)
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_common.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_utils.h

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
new file mode 100644
index 0000000..5f99237
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
@@ -0,0 +1,77 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_cfg.h: Definition of configuration parameters and constants. */
+
+#ifndef AQ_CFG_H
+#define AQ_CFG_H
+
+#define AQ_CFG_VECS_DEF   4U
+#define AQ_CFG_TCS_DEF    1U
+
+#define AQ_CFG_TXDS_DEF    4096U
+#define AQ_CFG_RXDS_DEF    1024U
+
+#define AQ_CFG_IS_POLLING_DEF 0U
+
+#define AQ_CFG_FORCE_LEGACY_INT 0U
+
+#define AQ_CFG_IS_INTERRUPT_MODERATION_DEF   1U
+#define AQ_CFG_INTERRUPT_MODERATION_RATE_DEF 0xFFFFU
+#define AQ_CFG_IRQ_MASK                      0x1FFU
+
+#define AQ_CFG_VECS_MAX   8U
+#define AQ_CFG_TCS_MAX    8U
+
+#define AQ_CFG_TX_FRAME_MAX  (16U * 1024U)
+#define AQ_CFG_RX_FRAME_MAX  (4U * 1024U)
+
+/* LRO */
+#define AQ_CFG_IS_LRO_DEF           1U
+
+/* RSS */
+#define AQ_CFG_RSS_INDIRECTION_TABLE_MAX  128U
+#define AQ_CFG_RSS_HASHKEY_SIZE           320U
+
+#define AQ_CFG_IS_RSS_DEF           1U
+#define AQ_CFG_NUM_RSS_QUEUES_DEF   AQ_CFG_VECS_DEF
+#define AQ_CFG_RSS_BASE_CPU_NUM_DEF 0U
+
+#define AQ_CFG_PCI_FUNC_MSIX_IRQS   9U
+#define AQ_CFG_PCI_FUNC_PORTS       2U
+
+#define AQ_CFG_SERVICE_TIMER_INTERVAL    (2 * HZ)
+#define AQ_CFG_POLLING_TIMER_INTERVAL   ((unsigned int)(2 * HZ))
+
+#define AQ_CFG_SKB_FRAGS_MAX   32U
+
+#define AQ_CFG_NAPI_WEIGHT     64U
+
+#define AQ_CFG_MULTICAST_ADDRESS_MAX     32U
+
+/*#define AQ_CFG_MAC_ADDR_PERMANENT {0x30, 0x0E, 0xE3, 0x12, 0x34, 0x56}*/
+
+#define AQ_CFG_FC_MODE 3U
+
+#define AQ_CFG_SPEED_MSK  0xFFFFU	/* 0xFFFFU==auto_neg */
+
+#define AQ_CFG_IS_AUTONEG_DEF       1U
+#define AQ_CFG_MTU_DEF              1514U
+
+#define AQ_CFG_LOCK_TRYS   100U
+
+#define AQ_CFG_DRV_AUTHOR      "aQuantia"
+#define AQ_CFG_DRV_DESC        "aQuantia Corporation(R) Network Driver"
+#define AQ_CFG_DRV_NAME        "aquantia"
+#define AQ_CFG_DRV_VERSION	__stringify(NIC_MAJOR_DRIVER_VERSION)"."\
+				__stringify(NIC_MINOR_DRIVER_VERSION)"."\
+				__stringify(NIC_BUILD_DRIVER_VERSION)"."\
+				__stringify(NIC_REVISION_DRIVER_VERSION)
+
+#endif /* AQ_CFG_H */
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_common.h b/drivers/net/ethernet/aquantia/atlantic/aq_common.h
new file mode 100644
index 0000000..9eb5e22
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_common.h
@@ -0,0 +1,23 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_common.h: Basic includes for all files in project. */
+
+#ifndef AQ_COMMON_H
+#define AQ_COMMON_H
+
+#include <linux/etherdevice.h>
+#include <linux/pci.h>
+
+#include "ver.h"
+#include "aq_nic.h"
+#include "aq_cfg.h"
+#include "aq_utils.h"
+
+#endif /* AQ_COMMON_H */
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_utils.h b/drivers/net/ethernet/aquantia/atlantic/aq_utils.h
new file mode 100644
index 0000000..4446bd9
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_utils.h
@@ -0,0 +1,50 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_utils.h: Useful macro and structures used in all layers of driver. */
+
+#ifndef AQ_UTILS_H
+#define AQ_UTILS_H
+
+#include "aq_common.h"
+
+#define AQ_DIMOF(_ARY_)  ARRAY_SIZE(_ARY_)
+
+struct aq_obj_s {
+	spinlock_t lock; /* spinlock for nic/rings processing */
+	atomic_t flags;
+	atomic_t busy_count;
+};
+
+static inline void aq_utils_obj_set(atomic_t *flags, u32 mask)
+{
+	unsigned long flags_old, flags_new;
+
+	do {
+		flags_old = atomic_read(flags);
+		flags_new = flags_old | (mask);
+	} while (atomic_cmpxchg(flags, flags_old, flags_new) != flags_old);
+}
+
+static inline void aq_utils_obj_clear(atomic_t *flags, u32 mask)
+{
+	unsigned long flags_old, flags_new;
+
+	do {
+		flags_old = atomic_read(flags);
+		flags_new = flags_old & ~(mask);
+	} while (atomic_cmpxchg(flags, flags_old, flags_new) != flags_old);
+}
+
+static inline bool aq_utils_obj_test(atomic_t *flags, u32 mask)
+{
+	return atomic_read(flags) & mask;
+}
+
+#endif /* AQ_UTILS_H */
-- 
2.9.3

^ permalink raw reply related

* [PATCH v7 00/13] net: ethernet: aquantia: Add AQtion 2.5/5 GB NIC driver
From: Alexander Loktionov @ 2017-01-19 21:33 UTC (permalink / raw)
  To: netdev, David VomLehn
  Cc: David S . Miller, Simon Edelhaus, Alexander Loktionov,
	Dmitrii Tarakanov, Pavel Belous, Dmitry Bezrukov

From: David VomLehn <vomlehn@texas.net>

This series introduces the AQtion NIC driver for the aQuantia
AQC107/AQC108 network devices.

v1: Initial version
v2: o Make necessary drivers/net/ethernet changes to integrate software
    o Drop intermediate atlantic directory
    o Remove Makefile things only appropriate to out of tree module
      building
v3: o Move changes to drivers/net/ethernet/{Kconfig,Makefile} to the last
      patch to ensure clean bisection.
    o Removed inline attribute aq_hw_write_req() as it was defined in
      only one .c file.
    o #included pci.h in aq_common.h to get struct pci definition.
    o Modified code to unlock based execution flow rather than using a flag.
    o Made a number of functions that were only used in a single file static.
    o Cleaned up error and return code handling in various places.
    o Remove AQ_CFG_IP_ALIGN definition.
    o Other minor code clean up.
v4: o Using do_div for 64 bit division.
    o Modified NIC statistics code.
    o Using build_skb instead netdev_alloc_skb for single fragment packets.
    o Removed extra aq_nic.o from Makefile
v5: o Removed extra newline at the end of the files.
v6: o Removed unnecessary cast from void*.
    o Reworked strings array for ethtool statistics.
    o Added stringset == ETH_SS_STATS checking.
    o AQ_OBJ_HEADER replaced to aq_obj_header_s struct.
    o AQ_OBJ_SET/TST/CLR macroses replaced to inline functions.
    o Driver sources placed in to atlantic directory.
    o Fixed compilation warnings (Make W=1)
    o Added firmware version checking.
    o Code cleaning.
v7  o Removed unnecessary cast from memory allocation function (aq_ring.c).

Signed-off-by: Alexander Loktionov <Alexander.Loktionov@aquantia.com>
Signed-off-by: Dmitrii Tarakanov <Dmitrii.Tarakanov@aquantia.com>
Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>
Signed-off-by: Dmitry Bezrukov <Dmitry.Bezrukov@aquantia.com>
Signed-off-by: David M. VomLehn <vomlehn@texas.net>
---
David VomLehn (13):
  net: ethernet: aquantia: Make and configuration files.
  net: ethernet: aquantia: Common functions and definitions
  net: ethernet: aquantia: Add ring support code
  net: ethernet: aquantia: Low-level hardware interfaces
  net: ethernet: aquantia: Support for NIC-specific code
  net: ethernet: aquantia: Atlantic A0 and B0 specific functions.
  net: ethernet: aquantia: Vector operations
  net: ethernet: aquantia: PCI operations
  net: ethernet: aquantia: Atlantic hardware abstraction layer
  net: ethernet: aquantia: Hardware interface and utility functions
  net: ethernet: aquantia: Ethtool support
  net: ethernet: aquantia: Receive side scaling
  net: ethernet: aquantia: Integrate AQtion 2.5/5 GB NIC driver

 drivers/net/ethernet/Kconfig                       |    1 +
 drivers/net/ethernet/Makefile                      |    1 +
 drivers/net/ethernet/aquantia/Kconfig              |   20 +
 drivers/net/ethernet/aquantia/Makefile             |    5 +
 drivers/net/ethernet/aquantia/atlantic/Kconfig     |    9 +
 drivers/net/ethernet/aquantia/atlantic/Makefile    |   42 +
 drivers/net/ethernet/aquantia/atlantic/aq_cfg.h    |   77 +
 drivers/net/ethernet/aquantia/atlantic/aq_common.h |   23 +
 .../net/ethernet/aquantia/atlantic/aq_ethtool.c    |  258 +++
 .../net/ethernet/aquantia/atlantic/aq_ethtool.h    |   19 +
 drivers/net/ethernet/aquantia/atlantic/aq_hw.h     |  177 ++
 .../net/ethernet/aquantia/atlantic/aq_hw_utils.c   |   68 +
 .../net/ethernet/aquantia/atlantic/aq_hw_utils.h   |   47 +
 drivers/net/ethernet/aquantia/atlantic/aq_main.c   |  273 +++
 drivers/net/ethernet/aquantia/atlantic/aq_main.h   |   17 +
 drivers/net/ethernet/aquantia/atlantic/aq_nic.c    |  937 ++++++++
 drivers/net/ethernet/aquantia/atlantic/aq_nic.h    |  108 +
 .../ethernet/aquantia/atlantic/aq_nic_internal.h   |   46 +
 .../net/ethernet/aquantia/atlantic/aq_pci_func.c   |  345 +++
 .../net/ethernet/aquantia/atlantic/aq_pci_func.h   |   34 +
 drivers/net/ethernet/aquantia/atlantic/aq_ring.c   |  377 ++++
 drivers/net/ethernet/aquantia/atlantic/aq_ring.h   |  157 ++
 drivers/net/ethernet/aquantia/atlantic/aq_rss.h    |   26 +
 drivers/net/ethernet/aquantia/atlantic/aq_utils.h  |   50 +
 drivers/net/ethernet/aquantia/atlantic/aq_vec.c    |  392 ++++
 drivers/net/ethernet/aquantia/atlantic/aq_vec.h    |   42 +
 .../ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c  |  905 ++++++++
 .../ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.h  |   34 +
 .../aquantia/atlantic/hw_atl/hw_atl_a0_internal.h  |  155 ++
 .../ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c  |  958 ++++++++
 .../ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.h  |   34 +
 .../aquantia/atlantic/hw_atl/hw_atl_b0_internal.h  |  207 ++
 .../ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c | 1394 ++++++++++++
 .../ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h |  677 ++++++
 .../aquantia/atlantic/hw_atl/hw_atl_llh_internal.h | 2375 ++++++++++++++++++++
 .../aquantia/atlantic/hw_atl/hw_atl_utils.c        |  569 +++++
 .../aquantia/atlantic/hw_atl/hw_atl_utils.h        |  210 ++
 drivers/net/ethernet/aquantia/atlantic/ver.h       |   18 +
 38 files changed, 11087 insertions(+)
 create mode 100644 drivers/net/ethernet/aquantia/Kconfig
 create mode 100644 drivers/net/ethernet/aquantia/Makefile
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/Kconfig
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/Makefile
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_common.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_ethtool.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_hw.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_hw_utils.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_hw_utils.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_main.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_main.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_nic.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_nic.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_pci_func.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_ring.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_ring.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_rss.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_utils.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_vec.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_vec.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0_internal.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/ver.h

-- 
2.9.3

^ permalink raw reply

* [PATCH v7 04/13] net: ethernet: aquantia: Low-level hardware interfaces
From: Alexander Loktionov @ 2017-01-19 21:33 UTC (permalink / raw)
  To: netdev, David VomLehn
  Cc: David S . Miller, Simon Edelhaus, Alexander Loktionov,
	Dmitrii Tarakanov, Pavel . Belous, Dmitry Bezrukov
In-Reply-To: <cover.1484860589.git.vomlehn@texas.net>

From: David VomLehn <vomlehn@texas.net>

Add definitions of functions that interface directly with the hardware.

Signed-off-by: Alexander Loktionov <Alexander.Loktionov@aquantia.com>
Signed-off-by: Dmitrii Tarakanov <Dmitrii.Tarakanov@aquantia.com>
Signed-off-by: Pavel.Belous <Pavel.Belous@aquantia.com>
Signed-off-by: Dmitry Bezrukov <Dmitry.Bezrukov@aquantia.com>
Signed-off-by: David M. VomLehn <vomlehn@texas.net>
---
 .../ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c | 1394 ++++++++++++
 .../ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h |  677 ++++++
 .../aquantia/atlantic/hw_atl/hw_atl_llh_internal.h | 2375 ++++++++++++++++++++
 3 files changed, 4446 insertions(+)
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h

diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c
new file mode 100644
index 0000000..3de651a
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c
@@ -0,0 +1,1394 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File hw_atl_llh.c: Definitions of bitfield and register access functions for
+ * Atlantic registers.
+ */
+
+#include "hw_atl_llh.h"
+#include "hw_atl_llh_internal.h"
+#include "../aq_hw_utils.h"
+
+/* global */
+void reg_glb_cpu_sem_set(struct aq_hw_s *aq_hw, u32 glb_cpu_sem, u32 semaphore)
+{
+	aq_hw_write_reg(aq_hw, glb_cpu_sem_adr(semaphore), glb_cpu_sem);
+}
+
+u32 reg_glb_cpu_sem_get(struct aq_hw_s *aq_hw, u32 semaphore)
+{
+	return aq_hw_read_reg(aq_hw, glb_cpu_sem_adr(semaphore));
+}
+
+void glb_glb_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 glb_reg_res_dis)
+{
+	aq_hw_write_reg_bit(aq_hw, glb_reg_res_dis_adr,
+			    glb_reg_res_dis_msk,
+			    glb_reg_res_dis_shift,
+			    glb_reg_res_dis);
+}
+
+void glb_soft_res_set(struct aq_hw_s *aq_hw, u32 soft_res)
+{
+	aq_hw_write_reg_bit(aq_hw, glb_soft_res_adr, glb_soft_res_msk,
+			    glb_soft_res_shift, soft_res);
+}
+
+u32 glb_soft_res_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg_bit(aq_hw, glb_soft_res_adr,
+				  glb_soft_res_msk,
+				  glb_soft_res_shift);
+}
+
+u32 reg_rx_dma_stat_counter7get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, rx_dma_stat_counter7_adr);
+}
+
+u32 reg_glb_mif_id_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, glb_mif_id_adr);
+}
+
+/* stats */
+u32 rpb_rx_dma_drop_pkt_cnt_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, rpb_rx_dma_drop_pkt_cnt_adr);
+}
+
+u32 stats_rx_dma_good_octet_counterlsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, stats_rx_dma_good_octet_counterlsw__adr);
+}
+
+u32 stats_rx_dma_good_pkt_counterlsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, stats_rx_dma_good_pkt_counterlsw__adr);
+}
+
+u32 stats_tx_dma_good_octet_counterlsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, stats_tx_dma_good_octet_counterlsw__adr);
+}
+
+u32 stats_tx_dma_good_pkt_counterlsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, stats_tx_dma_good_pkt_counterlsw__adr);
+}
+
+u32 stats_rx_dma_good_octet_countermsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, stats_rx_dma_good_octet_countermsw__adr);
+}
+
+u32 stats_rx_dma_good_pkt_countermsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, stats_rx_dma_good_pkt_countermsw__adr);
+}
+
+u32 stats_tx_dma_good_octet_countermsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, stats_tx_dma_good_octet_countermsw__adr);
+}
+
+u32 stats_tx_dma_good_pkt_countermsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, stats_tx_dma_good_pkt_countermsw__adr);
+}
+
+/* interrupt */
+void itr_irq_auto_masklsw_set(struct aq_hw_s *aq_hw, u32 irq_auto_masklsw)
+{
+	aq_hw_write_reg(aq_hw, itr_iamrlsw_adr, irq_auto_masklsw);
+}
+
+void itr_irq_map_en_rx_set(struct aq_hw_s *aq_hw, u32 irq_map_en_rx, u32 rx)
+{
+/* register address for bitfield imr_rx{r}_en */
+	static u32 itr_imr_rxren_adr[32] = {
+			0x00002100U, 0x00002100U, 0x00002104U, 0x00002104U,
+			0x00002108U, 0x00002108U, 0x0000210cU, 0x0000210cU,
+			0x00002110U, 0x00002110U, 0x00002114U, 0x00002114U,
+			0x00002118U, 0x00002118U, 0x0000211cU, 0x0000211cU,
+			0x00002120U, 0x00002120U, 0x00002124U, 0x00002124U,
+			0x00002128U, 0x00002128U, 0x0000212cU, 0x0000212cU,
+			0x00002130U, 0x00002130U, 0x00002134U, 0x00002134U,
+			0x00002138U, 0x00002138U, 0x0000213cU, 0x0000213cU
+		};
+
+/* bitmask for bitfield imr_rx{r}_en */
+	static u32 itr_imr_rxren_msk[32] = {
+			0x00008000U, 0x00000080U, 0x00008000U, 0x00000080U,
+			0x00008000U, 0x00000080U, 0x00008000U, 0x00000080U,
+			0x00008000U, 0x00000080U, 0x00008000U, 0x00000080U,
+			0x00008000U, 0x00000080U, 0x00008000U, 0x00000080U,
+			0x00008000U, 0x00000080U, 0x00008000U, 0x00000080U,
+			0x00008000U, 0x00000080U, 0x00008000U, 0x00000080U,
+			0x00008000U, 0x00000080U, 0x00008000U, 0x00000080U,
+			0x00008000U, 0x00000080U, 0x00008000U, 0x00000080U
+		};
+
+/* lower bit position of bitfield imr_rx{r}_en */
+	static u32 itr_imr_rxren_shift[32] = {
+			15U, 7U, 15U, 7U, 15U, 7U, 15U, 7U,
+			15U, 7U, 15U, 7U, 15U, 7U, 15U, 7U,
+			15U, 7U, 15U, 7U, 15U, 7U, 15U, 7U,
+			15U, 7U, 15U, 7U, 15U, 7U, 15U, 7U
+		};
+
+	aq_hw_write_reg_bit(aq_hw, itr_imr_rxren_adr[rx],
+			    itr_imr_rxren_msk[rx],
+			    itr_imr_rxren_shift[rx],
+			    irq_map_en_rx);
+}
+
+void itr_irq_map_en_tx_set(struct aq_hw_s *aq_hw, u32 irq_map_en_tx, u32 tx)
+{
+/* register address for bitfield imr_tx{t}_en */
+	static u32 itr_imr_txten_adr[32] = {
+			0x00002100U, 0x00002100U, 0x00002104U, 0x00002104U,
+			0x00002108U, 0x00002108U, 0x0000210cU, 0x0000210cU,
+			0x00002110U, 0x00002110U, 0x00002114U, 0x00002114U,
+			0x00002118U, 0x00002118U, 0x0000211cU, 0x0000211cU,
+			0x00002120U, 0x00002120U, 0x00002124U, 0x00002124U,
+			0x00002128U, 0x00002128U, 0x0000212cU, 0x0000212cU,
+			0x00002130U, 0x00002130U, 0x00002134U, 0x00002134U,
+			0x00002138U, 0x00002138U, 0x0000213cU, 0x0000213cU
+		};
+
+/* bitmask for bitfield imr_tx{t}_en */
+	static u32 itr_imr_txten_msk[32] = {
+			0x80000000U, 0x00800000U, 0x80000000U, 0x00800000U,
+			0x80000000U, 0x00800000U, 0x80000000U, 0x00800000U,
+			0x80000000U, 0x00800000U, 0x80000000U, 0x00800000U,
+			0x80000000U, 0x00800000U, 0x80000000U, 0x00800000U,
+			0x80000000U, 0x00800000U, 0x80000000U, 0x00800000U,
+			0x80000000U, 0x00800000U, 0x80000000U, 0x00800000U,
+			0x80000000U, 0x00800000U, 0x80000000U, 0x00800000U,
+			0x80000000U, 0x00800000U, 0x80000000U, 0x00800000U
+		};
+
+/* lower bit position of bitfield imr_tx{t}_en */
+	static u32 itr_imr_txten_shift[32] = {
+			31U, 23U, 31U, 23U, 31U, 23U, 31U, 23U,
+			31U, 23U, 31U, 23U, 31U, 23U, 31U, 23U,
+			31U, 23U, 31U, 23U, 31U, 23U, 31U, 23U,
+			31U, 23U, 31U, 23U, 31U, 23U, 31U, 23U
+		};
+
+	aq_hw_write_reg_bit(aq_hw, itr_imr_txten_adr[tx],
+			    itr_imr_txten_msk[tx],
+			    itr_imr_txten_shift[tx],
+			    irq_map_en_tx);
+}
+
+void itr_irq_map_rx_set(struct aq_hw_s *aq_hw, u32 irq_map_rx, u32 rx)
+{
+/* register address for bitfield imr_rx{r}[4:0] */
+	static u32 itr_imr_rxr_adr[32] = {
+			0x00002100U, 0x00002100U, 0x00002104U, 0x00002104U,
+			0x00002108U, 0x00002108U, 0x0000210cU, 0x0000210cU,
+			0x00002110U, 0x00002110U, 0x00002114U, 0x00002114U,
+			0x00002118U, 0x00002118U, 0x0000211cU, 0x0000211cU,
+			0x00002120U, 0x00002120U, 0x00002124U, 0x00002124U,
+			0x00002128U, 0x00002128U, 0x0000212cU, 0x0000212cU,
+			0x00002130U, 0x00002130U, 0x00002134U, 0x00002134U,
+			0x00002138U, 0x00002138U, 0x0000213cU, 0x0000213cU
+		};
+
+/* bitmask for bitfield imr_rx{r}[4:0] */
+	static u32 itr_imr_rxr_msk[32] = {
+			0x00001f00U, 0x0000001fU, 0x00001f00U, 0x0000001fU,
+			0x00001f00U, 0x0000001fU, 0x00001f00U, 0x0000001fU,
+			0x00001f00U, 0x0000001fU, 0x00001f00U, 0x0000001fU,
+			0x00001f00U, 0x0000001fU, 0x00001f00U, 0x0000001fU,
+			0x00001f00U, 0x0000001fU, 0x00001f00U, 0x0000001fU,
+			0x00001f00U, 0x0000001fU, 0x00001f00U, 0x0000001fU,
+			0x00001f00U, 0x0000001fU, 0x00001f00U, 0x0000001fU,
+			0x00001f00U, 0x0000001fU, 0x00001f00U, 0x0000001fU
+		};
+
+/* lower bit position of bitfield imr_rx{r}[4:0] */
+	static u32 itr_imr_rxr_shift[32] = {
+			8U, 0U, 8U, 0U, 8U, 0U, 8U, 0U,
+			8U, 0U, 8U, 0U, 8U, 0U, 8U, 0U,
+			8U, 0U, 8U, 0U, 8U, 0U, 8U, 0U,
+			8U, 0U, 8U, 0U, 8U, 0U, 8U, 0U
+		};
+
+	aq_hw_write_reg_bit(aq_hw, itr_imr_rxr_adr[rx],
+			    itr_imr_rxr_msk[rx],
+			    itr_imr_rxr_shift[rx],
+			    irq_map_rx);
+}
+
+void itr_irq_map_tx_set(struct aq_hw_s *aq_hw, u32 irq_map_tx, u32 tx)
+{
+/* register address for bitfield imr_tx{t}[4:0] */
+	static u32 itr_imr_txt_adr[32] = {
+			0x00002100U, 0x00002100U, 0x00002104U, 0x00002104U,
+			0x00002108U, 0x00002108U, 0x0000210cU, 0x0000210cU,
+			0x00002110U, 0x00002110U, 0x00002114U, 0x00002114U,
+			0x00002118U, 0x00002118U, 0x0000211cU, 0x0000211cU,
+			0x00002120U, 0x00002120U, 0x00002124U, 0x00002124U,
+			0x00002128U, 0x00002128U, 0x0000212cU, 0x0000212cU,
+			0x00002130U, 0x00002130U, 0x00002134U, 0x00002134U,
+			0x00002138U, 0x00002138U, 0x0000213cU, 0x0000213cU
+		};
+
+/* bitmask for bitfield imr_tx{t}[4:0] */
+	static u32 itr_imr_txt_msk[32] = {
+			0x1f000000U, 0x001f0000U, 0x1f000000U, 0x001f0000U,
+			0x1f000000U, 0x001f0000U, 0x1f000000U, 0x001f0000U,
+			0x1f000000U, 0x001f0000U, 0x1f000000U, 0x001f0000U,
+			0x1f000000U, 0x001f0000U, 0x1f000000U, 0x001f0000U,
+			0x1f000000U, 0x001f0000U, 0x1f000000U, 0x001f0000U,
+			0x1f000000U, 0x001f0000U, 0x1f000000U, 0x001f0000U,
+			0x1f000000U, 0x001f0000U, 0x1f000000U, 0x001f0000U,
+			0x1f000000U, 0x001f0000U, 0x1f000000U, 0x001f0000U
+		};
+
+/* lower bit position of bitfield imr_tx{t}[4:0] */
+	static u32 itr_imr_txt_shift[32] = {
+			24U, 16U, 24U, 16U, 24U, 16U, 24U, 16U,
+			24U, 16U, 24U, 16U, 24U, 16U, 24U, 16U,
+			24U, 16U, 24U, 16U, 24U, 16U, 24U, 16U,
+			24U, 16U, 24U, 16U, 24U, 16U, 24U, 16U
+		};
+
+	aq_hw_write_reg_bit(aq_hw, itr_imr_txt_adr[tx],
+			    itr_imr_txt_msk[tx],
+			    itr_imr_txt_shift[tx],
+			    irq_map_tx);
+}
+
+void itr_irq_msk_clearlsw_set(struct aq_hw_s *aq_hw, u32 irq_msk_clearlsw)
+{
+	aq_hw_write_reg(aq_hw, itr_imcrlsw_adr, irq_msk_clearlsw);
+}
+
+void itr_irq_msk_setlsw_set(struct aq_hw_s *aq_hw, u32 irq_msk_setlsw)
+{
+	aq_hw_write_reg(aq_hw, itr_imsrlsw_adr, irq_msk_setlsw);
+}
+
+void itr_irq_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 irq_reg_res_dis)
+{
+	aq_hw_write_reg_bit(aq_hw, itr_reg_res_dsbl_adr,
+			    itr_reg_res_dsbl_msk,
+			    itr_reg_res_dsbl_shift, irq_reg_res_dis);
+}
+
+void itr_irq_status_clearlsw_set(struct aq_hw_s *aq_hw,
+				 u32 irq_status_clearlsw)
+{
+	aq_hw_write_reg(aq_hw, itr_iscrlsw_adr, irq_status_clearlsw);
+}
+
+u32 itr_irq_statuslsw_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, itr_isrlsw_adr);
+}
+
+u32 itr_res_irq_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg_bit(aq_hw, itr_res_adr, itr_res_msk,
+				  itr_res_shift);
+}
+
+void itr_res_irq_set(struct aq_hw_s *aq_hw, u32 res_irq)
+{
+	aq_hw_write_reg_bit(aq_hw, itr_res_adr, itr_res_msk,
+			    itr_res_shift, res_irq);
+}
+
+/* rdm */
+void rdm_cpu_id_set(struct aq_hw_s *aq_hw, u32 cpuid, u32 dca)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_dcadcpuid_adr(dca),
+			    rdm_dcadcpuid_msk,
+			    rdm_dcadcpuid_shift, cpuid);
+}
+
+void rdm_rx_dca_en_set(struct aq_hw_s *aq_hw, u32 rx_dca_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_dca_en_adr, rdm_dca_en_msk,
+			    rdm_dca_en_shift, rx_dca_en);
+}
+
+void rdm_rx_dca_mode_set(struct aq_hw_s *aq_hw, u32 rx_dca_mode)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_dca_mode_adr, rdm_dca_mode_msk,
+			    rdm_dca_mode_shift, rx_dca_mode);
+}
+
+void rdm_rx_desc_data_buff_size_set(struct aq_hw_s *aq_hw,
+				    u32 rx_desc_data_buff_size, u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_descddata_size_adr(descriptor),
+			    rdm_descddata_size_msk,
+			    rdm_descddata_size_shift,
+			    rx_desc_data_buff_size);
+}
+
+void rdm_rx_desc_dca_en_set(struct aq_hw_s *aq_hw, u32 rx_desc_dca_en, u32 dca)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_dcaddesc_en_adr(dca),
+			    rdm_dcaddesc_en_msk,
+			    rdm_dcaddesc_en_shift,
+			    rx_desc_dca_en);
+}
+
+void rdm_rx_desc_en_set(struct aq_hw_s *aq_hw, u32 rx_desc_en, u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_descden_adr(descriptor),
+			    rdm_descden_msk,
+			    rdm_descden_shift,
+			    rx_desc_en);
+}
+
+void rdm_rx_desc_head_buff_size_set(struct aq_hw_s *aq_hw,
+				    u32 rx_desc_head_buff_size, u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_descdhdr_size_adr(descriptor),
+			    rdm_descdhdr_size_msk,
+			    rdm_descdhdr_size_shift,
+			    rx_desc_head_buff_size);
+}
+
+void rdm_rx_desc_head_splitting_set(struct aq_hw_s *aq_hw,
+				    u32 rx_desc_head_splitting, u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_descdhdr_split_adr(descriptor),
+			    rdm_descdhdr_split_msk,
+			    rdm_descdhdr_split_shift,
+			    rx_desc_head_splitting);
+}
+
+u32 rdm_rx_desc_head_ptr_get(struct aq_hw_s *aq_hw, u32 descriptor)
+{
+	return aq_hw_read_reg_bit(aq_hw, rdm_descdhd_adr(descriptor),
+				  rdm_descdhd_msk, rdm_descdhd_shift);
+}
+
+void rdm_rx_desc_len_set(struct aq_hw_s *aq_hw, u32 rx_desc_len, u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_descdlen_adr(descriptor),
+			    rdm_descdlen_msk, rdm_descdlen_shift,
+			    rx_desc_len);
+}
+
+void rdm_rx_desc_res_set(struct aq_hw_s *aq_hw, u32 rx_desc_res, u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_descdreset_adr(descriptor),
+			    rdm_descdreset_msk, rdm_descdreset_shift,
+			    rx_desc_res);
+}
+
+void rdm_rx_desc_wr_wb_irq_en_set(struct aq_hw_s *aq_hw,
+				  u32 rx_desc_wr_wb_irq_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_int_desc_wrb_en_adr,
+			    rdm_int_desc_wrb_en_msk,
+			    rdm_int_desc_wrb_en_shift,
+			    rx_desc_wr_wb_irq_en);
+}
+
+void rdm_rx_head_dca_en_set(struct aq_hw_s *aq_hw, u32 rx_head_dca_en, u32 dca)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_dcadhdr_en_adr(dca),
+			    rdm_dcadhdr_en_msk,
+			    rdm_dcadhdr_en_shift,
+			    rx_head_dca_en);
+}
+
+void rdm_rx_pld_dca_en_set(struct aq_hw_s *aq_hw, u32 rx_pld_dca_en, u32 dca)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_dcadpay_en_adr(dca),
+			    rdm_dcadpay_en_msk, rdm_dcadpay_en_shift,
+			    rx_pld_dca_en);
+}
+
+void rdm_rdm_intr_moder_en_set(struct aq_hw_s *aq_hw, u32 rdm_intr_moder_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rdm_int_rim_en_adr,
+			    rdm_int_rim_en_msk,
+			    rdm_int_rim_en_shift,
+			    rdm_intr_moder_en);
+}
+
+/* reg */
+void reg_gen_irq_map_set(struct aq_hw_s *aq_hw, u32 gen_intr_map, u32 regidx)
+{
+	aq_hw_write_reg(aq_hw, gen_intr_map_adr(regidx), gen_intr_map);
+}
+
+u32 reg_gen_irq_status_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, gen_intr_stat_adr);
+}
+
+void reg_irq_glb_ctl_set(struct aq_hw_s *aq_hw, u32 intr_glb_ctl)
+{
+	aq_hw_write_reg(aq_hw, intr_glb_ctl_adr, intr_glb_ctl);
+}
+
+void reg_irq_thr_set(struct aq_hw_s *aq_hw, u32 intr_thr, u32 throttle)
+{
+	aq_hw_write_reg(aq_hw, intr_thr_adr(throttle), intr_thr);
+}
+
+void reg_rx_dma_desc_base_addresslswset(struct aq_hw_s *aq_hw,
+					u32 rx_dma_desc_base_addrlsw,
+					u32 descriptor)
+{
+	aq_hw_write_reg(aq_hw, rx_dma_desc_base_addrlsw_adr(descriptor),
+			rx_dma_desc_base_addrlsw);
+}
+
+void reg_rx_dma_desc_base_addressmswset(struct aq_hw_s *aq_hw,
+					u32 rx_dma_desc_base_addrmsw,
+					u32 descriptor)
+{
+	aq_hw_write_reg(aq_hw, rx_dma_desc_base_addrmsw_adr(descriptor),
+			rx_dma_desc_base_addrmsw);
+}
+
+u32 reg_rx_dma_desc_status_get(struct aq_hw_s *aq_hw, u32 descriptor)
+{
+	return aq_hw_read_reg(aq_hw, rx_dma_desc_stat_adr(descriptor));
+}
+
+void reg_rx_dma_desc_tail_ptr_set(struct aq_hw_s *aq_hw,
+				  u32 rx_dma_desc_tail_ptr, u32 descriptor)
+{
+	aq_hw_write_reg(aq_hw, rx_dma_desc_tail_ptr_adr(descriptor),
+			rx_dma_desc_tail_ptr);
+}
+
+void reg_rx_flr_mcst_flr_msk_set(struct aq_hw_s *aq_hw, u32 rx_flr_mcst_flr_msk)
+{
+	aq_hw_write_reg(aq_hw, rx_flr_mcst_flr_msk_adr, rx_flr_mcst_flr_msk);
+}
+
+void reg_rx_flr_mcst_flr_set(struct aq_hw_s *aq_hw, u32 rx_flr_mcst_flr,
+			     u32 filter)
+{
+	aq_hw_write_reg(aq_hw, rx_flr_mcst_flr_adr(filter), rx_flr_mcst_flr);
+}
+
+void reg_rx_flr_rss_control1set(struct aq_hw_s *aq_hw, u32 rx_flr_rss_control1)
+{
+	aq_hw_write_reg(aq_hw, rx_flr_rss_control1_adr, rx_flr_rss_control1);
+}
+
+void reg_rx_flr_control2_set(struct aq_hw_s *aq_hw, u32 rx_filter_control2)
+{
+	aq_hw_write_reg(aq_hw, rx_flr_control2_adr, rx_filter_control2);
+}
+
+void reg_rx_intr_moder_ctrl_set(struct aq_hw_s *aq_hw,
+				u32 rx_intr_moderation_ctl,
+				u32 queue)
+{
+	aq_hw_write_reg(aq_hw, rx_intr_moderation_ctl_adr(queue),
+			rx_intr_moderation_ctl);
+}
+
+void reg_tx_dma_debug_ctl_set(struct aq_hw_s *aq_hw, u32 tx_dma_debug_ctl)
+{
+	aq_hw_write_reg(aq_hw, tx_dma_debug_ctl_adr, tx_dma_debug_ctl);
+}
+
+void reg_tx_dma_desc_base_addresslswset(struct aq_hw_s *aq_hw,
+					u32 tx_dma_desc_base_addrlsw,
+					u32 descriptor)
+{
+	aq_hw_write_reg(aq_hw, tx_dma_desc_base_addrlsw_adr(descriptor),
+			tx_dma_desc_base_addrlsw);
+}
+
+void reg_tx_dma_desc_base_addressmswset(struct aq_hw_s *aq_hw,
+					u32 tx_dma_desc_base_addrmsw,
+					u32 descriptor)
+{
+	aq_hw_write_reg(aq_hw, tx_dma_desc_base_addrmsw_adr(descriptor),
+			tx_dma_desc_base_addrmsw);
+}
+
+void reg_tx_dma_desc_tail_ptr_set(struct aq_hw_s *aq_hw,
+				  u32 tx_dma_desc_tail_ptr, u32 descriptor)
+{
+	aq_hw_write_reg(aq_hw, tx_dma_desc_tail_ptr_adr(descriptor),
+			tx_dma_desc_tail_ptr);
+}
+
+void reg_tx_intr_moder_ctrl_set(struct aq_hw_s *aq_hw,
+				u32 tx_intr_moderation_ctl,
+				u32 queue)
+{
+	aq_hw_write_reg(aq_hw, tx_intr_moderation_ctl_adr(queue),
+			tx_intr_moderation_ctl);
+}
+
+/* RPB: rx packet buffer */
+void rpb_dma_sys_lbk_set(struct aq_hw_s *aq_hw, u32 dma_sys_lbk)
+{
+	aq_hw_write_reg_bit(aq_hw, rpb_dma_sys_lbk_adr,
+			    rpb_dma_sys_lbk_msk,
+			    rpb_dma_sys_lbk_shift, dma_sys_lbk);
+}
+
+void rpb_rpf_rx_traf_class_mode_set(struct aq_hw_s *aq_hw,
+				    u32 rx_traf_class_mode)
+{
+	aq_hw_write_reg_bit(aq_hw, rpb_rpf_rx_tc_mode_adr,
+			    rpb_rpf_rx_tc_mode_msk,
+			    rpb_rpf_rx_tc_mode_shift,
+			    rx_traf_class_mode);
+}
+
+void rpb_rx_buff_en_set(struct aq_hw_s *aq_hw, u32 rx_buff_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpb_rx_buf_en_adr, rpb_rx_buf_en_msk,
+			    rpb_rx_buf_en_shift, rx_buff_en);
+}
+
+void rpb_rx_buff_hi_threshold_per_tc_set(struct aq_hw_s *aq_hw,
+					 u32 rx_buff_hi_threshold_per_tc,
+					 u32 buffer)
+{
+	aq_hw_write_reg_bit(aq_hw, rpb_rxbhi_thresh_adr(buffer),
+			    rpb_rxbhi_thresh_msk, rpb_rxbhi_thresh_shift,
+			    rx_buff_hi_threshold_per_tc);
+}
+
+void rpb_rx_buff_lo_threshold_per_tc_set(struct aq_hw_s *aq_hw,
+					 u32 rx_buff_lo_threshold_per_tc,
+					 u32 buffer)
+{
+	aq_hw_write_reg_bit(aq_hw, rpb_rxblo_thresh_adr(buffer),
+			    rpb_rxblo_thresh_msk,
+			    rpb_rxblo_thresh_shift,
+			    rx_buff_lo_threshold_per_tc);
+}
+
+void rpb_rx_flow_ctl_mode_set(struct aq_hw_s *aq_hw, u32 rx_flow_ctl_mode)
+{
+	aq_hw_write_reg_bit(aq_hw, rpb_rx_fc_mode_adr,
+			    rpb_rx_fc_mode_msk,
+			    rpb_rx_fc_mode_shift, rx_flow_ctl_mode);
+}
+
+void rpb_rx_pkt_buff_size_per_tc_set(struct aq_hw_s *aq_hw,
+				     u32 rx_pkt_buff_size_per_tc, u32 buffer)
+{
+	aq_hw_write_reg_bit(aq_hw, rpb_rxbbuf_size_adr(buffer),
+			    rpb_rxbbuf_size_msk, rpb_rxbbuf_size_shift,
+			    rx_pkt_buff_size_per_tc);
+}
+
+void rpb_rx_xoff_en_per_tc_set(struct aq_hw_s *aq_hw, u32 rx_xoff_en_per_tc,
+			       u32 buffer)
+{
+	aq_hw_write_reg_bit(aq_hw, rpb_rxbxoff_en_adr(buffer),
+			    rpb_rxbxoff_en_msk, rpb_rxbxoff_en_shift,
+			    rx_xoff_en_per_tc);
+}
+
+/* rpf */
+
+void rpfl2broadcast_count_threshold_set(struct aq_hw_s *aq_hw,
+					u32 l2broadcast_count_threshold)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2bc_thresh_adr,
+			    rpfl2bc_thresh_msk,
+			    rpfl2bc_thresh_shift,
+			    l2broadcast_count_threshold);
+}
+
+void rpfl2broadcast_en_set(struct aq_hw_s *aq_hw, u32 l2broadcast_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2bc_en_adr, rpfl2bc_en_msk,
+			    rpfl2bc_en_shift, l2broadcast_en);
+}
+
+void rpfl2broadcast_flr_act_set(struct aq_hw_s *aq_hw, u32 l2broadcast_flr_act)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2bc_act_adr, rpfl2bc_act_msk,
+			    rpfl2bc_act_shift, l2broadcast_flr_act);
+}
+
+void rpfl2multicast_flr_en_set(struct aq_hw_s *aq_hw, u32 l2multicast_flr_en,
+			       u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2mc_enf_adr(filter),
+			    rpfl2mc_enf_msk,
+			    rpfl2mc_enf_shift, l2multicast_flr_en);
+}
+
+void rpfl2promiscuous_mode_en_set(struct aq_hw_s *aq_hw,
+				  u32 l2promiscuous_mode_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2promis_mode_adr,
+			    rpfl2promis_mode_msk,
+			    rpfl2promis_mode_shift,
+			    l2promiscuous_mode_en);
+}
+
+void rpfl2unicast_flr_act_set(struct aq_hw_s *aq_hw, u32 l2unicast_flr_act,
+			      u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2uc_actf_adr(filter),
+			    rpfl2uc_actf_msk, rpfl2uc_actf_shift,
+			    l2unicast_flr_act);
+}
+
+void rpfl2_uc_flr_en_set(struct aq_hw_s *aq_hw, u32 l2unicast_flr_en,
+			 u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2uc_enf_adr(filter),
+			    rpfl2uc_enf_msk,
+			    rpfl2uc_enf_shift, l2unicast_flr_en);
+}
+
+void rpfl2unicast_dest_addresslsw_set(struct aq_hw_s *aq_hw,
+				      u32 l2unicast_dest_addresslsw,
+				      u32 filter)
+{
+	aq_hw_write_reg(aq_hw, rpfl2uc_daflsw_adr(filter),
+			l2unicast_dest_addresslsw);
+}
+
+void rpfl2unicast_dest_addressmsw_set(struct aq_hw_s *aq_hw,
+				      u32 l2unicast_dest_addressmsw,
+				      u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2uc_dafmsw_adr(filter),
+			    rpfl2uc_dafmsw_msk, rpfl2uc_dafmsw_shift,
+			    l2unicast_dest_addressmsw);
+}
+
+void rpfl2_accept_all_mc_packets_set(struct aq_hw_s *aq_hw,
+				     u32 l2_accept_all_mc_packets)
+{
+	aq_hw_write_reg_bit(aq_hw, rpfl2mc_accept_all_adr,
+			    rpfl2mc_accept_all_msk,
+			    rpfl2mc_accept_all_shift,
+			    l2_accept_all_mc_packets);
+}
+
+void rpf_rpb_user_priority_tc_map_set(struct aq_hw_s *aq_hw,
+				      u32 user_priority_tc_map, u32 tc)
+{
+/* register address for bitfield rx_tc_up{t}[2:0] */
+	static u32 rpf_rpb_rx_tc_upt_adr[8] = {
+			0x000054c4U, 0x000054c4U, 0x000054c4U, 0x000054c4U,
+			0x000054c4U, 0x000054c4U, 0x000054c4U, 0x000054c4U
+		};
+
+/* bitmask for bitfield rx_tc_up{t}[2:0] */
+	static u32 rpf_rpb_rx_tc_upt_msk[8] = {
+			0x00000007U, 0x00000070U, 0x00000700U, 0x00007000U,
+			0x00070000U, 0x00700000U, 0x07000000U, 0x70000000U
+		};
+
+/* lower bit position of bitfield rx_tc_up{t}[2:0] */
+	static u32 rpf_rpb_rx_tc_upt_shft[8] = {
+			0U, 4U, 8U, 12U, 16U, 20U, 24U, 28U
+		};
+
+	aq_hw_write_reg_bit(aq_hw, rpf_rpb_rx_tc_upt_adr[tc],
+			    rpf_rpb_rx_tc_upt_msk[tc],
+			    rpf_rpb_rx_tc_upt_shft[tc],
+			    user_priority_tc_map);
+}
+
+void rpf_rss_key_addr_set(struct aq_hw_s *aq_hw, u32 rss_key_addr)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_rss_key_addr_adr,
+			    rpf_rss_key_addr_msk,
+			    rpf_rss_key_addr_shift,
+			    rss_key_addr);
+}
+
+void rpf_rss_key_wr_data_set(struct aq_hw_s *aq_hw, u32 rss_key_wr_data)
+{
+	aq_hw_write_reg(aq_hw, rpf_rss_key_wr_data_adr,
+			rss_key_wr_data);
+}
+
+u32 rpf_rss_key_wr_en_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg_bit(aq_hw, rpf_rss_key_wr_eni_adr,
+				  rpf_rss_key_wr_eni_msk,
+				  rpf_rss_key_wr_eni_shift);
+}
+
+void rpf_rss_key_wr_en_set(struct aq_hw_s *aq_hw, u32 rss_key_wr_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_rss_key_wr_eni_adr,
+			    rpf_rss_key_wr_eni_msk,
+			    rpf_rss_key_wr_eni_shift,
+			    rss_key_wr_en);
+}
+
+void rpf_rss_redir_tbl_addr_set(struct aq_hw_s *aq_hw, u32 rss_redir_tbl_addr)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_rss_redir_addr_adr,
+			    rpf_rss_redir_addr_msk,
+			    rpf_rss_redir_addr_shift, rss_redir_tbl_addr);
+}
+
+void rpf_rss_redir_tbl_wr_data_set(struct aq_hw_s *aq_hw,
+				   u32 rss_redir_tbl_wr_data)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_rss_redir_wr_data_adr,
+			    rpf_rss_redir_wr_data_msk,
+			    rpf_rss_redir_wr_data_shift,
+			    rss_redir_tbl_wr_data);
+}
+
+u32 rpf_rss_redir_wr_en_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg_bit(aq_hw, rpf_rss_redir_wr_eni_adr,
+				  rpf_rss_redir_wr_eni_msk,
+				  rpf_rss_redir_wr_eni_shift);
+}
+
+void rpf_rss_redir_wr_en_set(struct aq_hw_s *aq_hw, u32 rss_redir_wr_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_rss_redir_wr_eni_adr,
+			    rpf_rss_redir_wr_eni_msk,
+			    rpf_rss_redir_wr_eni_shift, rss_redir_wr_en);
+}
+
+void rpf_tpo_to_rpf_sys_lbk_set(struct aq_hw_s *aq_hw, u32 tpo_to_rpf_sys_lbk)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_tpo_rpf_sys_lbk_adr,
+			    rpf_tpo_rpf_sys_lbk_msk,
+			    rpf_tpo_rpf_sys_lbk_shift,
+			    tpo_to_rpf_sys_lbk);
+}
+
+void rpf_vlan_inner_etht_set(struct aq_hw_s *aq_hw, u32 vlan_inner_etht)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_vl_inner_tpid_adr,
+			    rpf_vl_inner_tpid_msk,
+			    rpf_vl_inner_tpid_shift,
+			    vlan_inner_etht);
+}
+
+void rpf_vlan_outer_etht_set(struct aq_hw_s *aq_hw, u32 vlan_outer_etht)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_vl_outer_tpid_adr,
+			    rpf_vl_outer_tpid_msk,
+			    rpf_vl_outer_tpid_shift,
+			    vlan_outer_etht);
+}
+
+void rpf_vlan_prom_mode_en_set(struct aq_hw_s *aq_hw, u32 vlan_prom_mode_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_vl_promis_mode_adr,
+			    rpf_vl_promis_mode_msk,
+			    rpf_vl_promis_mode_shift,
+			    vlan_prom_mode_en);
+}
+
+void rpf_vlan_accept_untagged_packets_set(struct aq_hw_s *aq_hw,
+					  u32 vlan_accept_untagged_packets)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_vl_accept_untagged_mode_adr,
+			    rpf_vl_accept_untagged_mode_msk,
+			    rpf_vl_accept_untagged_mode_shift,
+			    vlan_accept_untagged_packets);
+}
+
+void rpf_vlan_untagged_act_set(struct aq_hw_s *aq_hw, u32 vlan_untagged_act)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_vl_untagged_act_adr,
+			    rpf_vl_untagged_act_msk,
+			    rpf_vl_untagged_act_shift,
+			    vlan_untagged_act);
+}
+
+void rpf_vlan_flr_en_set(struct aq_hw_s *aq_hw, u32 vlan_flr_en, u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_vl_en_f_adr(filter),
+			    rpf_vl_en_f_msk,
+			    rpf_vl_en_f_shift,
+			    vlan_flr_en);
+}
+
+void rpf_vlan_flr_act_set(struct aq_hw_s *aq_hw, u32 vlan_flr_act, u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_vl_act_f_adr(filter),
+			    rpf_vl_act_f_msk,
+			    rpf_vl_act_f_shift,
+			    vlan_flr_act);
+}
+
+void rpf_vlan_id_flr_set(struct aq_hw_s *aq_hw, u32 vlan_id_flr, u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_vl_id_f_adr(filter),
+			    rpf_vl_id_f_msk,
+			    rpf_vl_id_f_shift,
+			    vlan_id_flr);
+}
+
+void rpf_etht_flr_en_set(struct aq_hw_s *aq_hw, u32 etht_flr_en, u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_et_enf_adr(filter),
+			    rpf_et_enf_msk,
+			    rpf_et_enf_shift, etht_flr_en);
+}
+
+void rpf_etht_user_priority_en_set(struct aq_hw_s *aq_hw,
+				   u32 etht_user_priority_en, u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_et_upfen_adr(filter),
+			    rpf_et_upfen_msk, rpf_et_upfen_shift,
+			    etht_user_priority_en);
+}
+
+void rpf_etht_rx_queue_en_set(struct aq_hw_s *aq_hw, u32 etht_rx_queue_en,
+			      u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_et_rxqfen_adr(filter),
+			    rpf_et_rxqfen_msk, rpf_et_rxqfen_shift,
+			    etht_rx_queue_en);
+}
+
+void rpf_etht_user_priority_set(struct aq_hw_s *aq_hw, u32 etht_user_priority,
+				u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_et_upf_adr(filter),
+			    rpf_et_upf_msk,
+			    rpf_et_upf_shift, etht_user_priority);
+}
+
+void rpf_etht_rx_queue_set(struct aq_hw_s *aq_hw, u32 etht_rx_queue,
+			   u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_et_rxqf_adr(filter),
+			    rpf_et_rxqf_msk,
+			    rpf_et_rxqf_shift, etht_rx_queue);
+}
+
+void rpf_etht_mgt_queue_set(struct aq_hw_s *aq_hw, u32 etht_mgt_queue,
+			    u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_et_mng_rxqf_adr(filter),
+			    rpf_et_mng_rxqf_msk, rpf_et_mng_rxqf_shift,
+			    etht_mgt_queue);
+}
+
+void rpf_etht_flr_act_set(struct aq_hw_s *aq_hw, u32 etht_flr_act, u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_et_actf_adr(filter),
+			    rpf_et_actf_msk,
+			    rpf_et_actf_shift, etht_flr_act);
+}
+
+void rpf_etht_flr_set(struct aq_hw_s *aq_hw, u32 etht_flr, u32 filter)
+{
+	aq_hw_write_reg_bit(aq_hw, rpf_et_valf_adr(filter),
+			    rpf_et_valf_msk,
+			    rpf_et_valf_shift, etht_flr);
+}
+
+/* RPO: rx packet offload */
+void rpo_ipv4header_crc_offload_en_set(struct aq_hw_s *aq_hw,
+				       u32 ipv4header_crc_offload_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_ipv4chk_en_adr,
+			    rpo_ipv4chk_en_msk,
+			    rpo_ipv4chk_en_shift,
+			    ipv4header_crc_offload_en);
+}
+
+void rpo_rx_desc_vlan_stripping_set(struct aq_hw_s *aq_hw,
+				    u32 rx_desc_vlan_stripping, u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_descdvl_strip_adr(descriptor),
+			    rpo_descdvl_strip_msk,
+			    rpo_descdvl_strip_shift,
+			    rx_desc_vlan_stripping);
+}
+
+void rpo_tcp_udp_crc_offload_en_set(struct aq_hw_s *aq_hw,
+				    u32 tcp_udp_crc_offload_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpol4chk_en_adr, rpol4chk_en_msk,
+			    rpol4chk_en_shift, tcp_udp_crc_offload_en);
+}
+
+void rpo_lro_en_set(struct aq_hw_s *aq_hw, u32 lro_en)
+{
+	aq_hw_write_reg(aq_hw, rpo_lro_en_adr, lro_en);
+}
+
+void rpo_lro_patch_optimization_en_set(struct aq_hw_s *aq_hw,
+				       u32 lro_patch_optimization_en)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_lro_ptopt_en_adr,
+			    rpo_lro_ptopt_en_msk,
+			    rpo_lro_ptopt_en_shift,
+			    lro_patch_optimization_en);
+}
+
+void rpo_lro_qsessions_lim_set(struct aq_hw_s *aq_hw,
+			       u32 lro_qsessions_lim)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_lro_qses_lmt_adr,
+			    rpo_lro_qses_lmt_msk,
+			    rpo_lro_qses_lmt_shift,
+			    lro_qsessions_lim);
+}
+
+void rpo_lro_total_desc_lim_set(struct aq_hw_s *aq_hw, u32 lro_total_desc_lim)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_lro_tot_dsc_lmt_adr,
+			    rpo_lro_tot_dsc_lmt_msk,
+			    rpo_lro_tot_dsc_lmt_shift,
+			    lro_total_desc_lim);
+}
+
+void rpo_lro_min_pay_of_first_pkt_set(struct aq_hw_s *aq_hw,
+				      u32 lro_min_pld_of_first_pkt)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_lro_pkt_min_adr,
+			    rpo_lro_pkt_min_msk,
+			    rpo_lro_pkt_min_shift,
+			    lro_min_pld_of_first_pkt);
+}
+
+void rpo_lro_pkt_lim_set(struct aq_hw_s *aq_hw, u32 lro_pkt_lim)
+{
+	aq_hw_write_reg(aq_hw, rpo_lro_rsc_max_adr, lro_pkt_lim);
+}
+
+void rpo_lro_max_num_of_descriptors_set(struct aq_hw_s *aq_hw,
+					u32 lro_max_number_of_descriptors,
+					u32 lro)
+{
+/* Register address for bitfield lro{L}_des_max[1:0] */
+	static u32 rpo_lro_ldes_max_adr[32] = {
+			0x000055A0U, 0x000055A0U, 0x000055A0U, 0x000055A0U,
+			0x000055A0U, 0x000055A0U, 0x000055A0U, 0x000055A0U,
+			0x000055A4U, 0x000055A4U, 0x000055A4U, 0x000055A4U,
+			0x000055A4U, 0x000055A4U, 0x000055A4U, 0x000055A4U,
+			0x000055A8U, 0x000055A8U, 0x000055A8U, 0x000055A8U,
+			0x000055A8U, 0x000055A8U, 0x000055A8U, 0x000055A8U,
+			0x000055ACU, 0x000055ACU, 0x000055ACU, 0x000055ACU,
+			0x000055ACU, 0x000055ACU, 0x000055ACU, 0x000055ACU
+		};
+
+/* Bitmask for bitfield lro{L}_des_max[1:0] */
+	static u32 rpo_lro_ldes_max_msk[32] = {
+			0x00000003U, 0x00000030U, 0x00000300U, 0x00003000U,
+			0x00030000U, 0x00300000U, 0x03000000U, 0x30000000U,
+			0x00000003U, 0x00000030U, 0x00000300U, 0x00003000U,
+			0x00030000U, 0x00300000U, 0x03000000U, 0x30000000U,
+			0x00000003U, 0x00000030U, 0x00000300U, 0x00003000U,
+			0x00030000U, 0x00300000U, 0x03000000U, 0x30000000U,
+			0x00000003U, 0x00000030U, 0x00000300U, 0x00003000U,
+			0x00030000U, 0x00300000U, 0x03000000U, 0x30000000U
+		};
+
+/* Lower bit position of bitfield lro{L}_des_max[1:0] */
+	static u32 rpo_lro_ldes_max_shift[32] = {
+			0U, 4U, 8U, 12U, 16U, 20U, 24U, 28U,
+			0U, 4U, 8U, 12U, 16U, 20U, 24U, 28U,
+			0U, 4U, 8U, 12U, 16U, 20U, 24U, 28U,
+			0U, 4U, 8U, 12U, 16U, 20U, 24U, 28U
+		};
+
+	aq_hw_write_reg_bit(aq_hw, rpo_lro_ldes_max_adr[lro],
+			    rpo_lro_ldes_max_msk[lro],
+			    rpo_lro_ldes_max_shift[lro],
+			    lro_max_number_of_descriptors);
+}
+
+void rpo_lro_time_base_divider_set(struct aq_hw_s *aq_hw,
+				   u32 lro_time_base_divider)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_lro_tb_div_adr,
+			    rpo_lro_tb_div_msk,
+			    rpo_lro_tb_div_shift,
+			    lro_time_base_divider);
+}
+
+void rpo_lro_inactive_interval_set(struct aq_hw_s *aq_hw,
+				   u32 lro_inactive_interval)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_lro_ina_ival_adr,
+			    rpo_lro_ina_ival_msk,
+			    rpo_lro_ina_ival_shift,
+			    lro_inactive_interval);
+}
+
+void rpo_lro_max_coalescing_interval_set(struct aq_hw_s *aq_hw,
+					 u32 lro_max_coalescing_interval)
+{
+	aq_hw_write_reg_bit(aq_hw, rpo_lro_max_ival_adr,
+			    rpo_lro_max_ival_msk,
+			    rpo_lro_max_ival_shift,
+			    lro_max_coalescing_interval);
+}
+
+/* rx */
+void rx_rx_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 rx_reg_res_dis)
+{
+	aq_hw_write_reg_bit(aq_hw, rx_reg_res_dsbl_adr,
+			    rx_reg_res_dsbl_msk,
+			    rx_reg_res_dsbl_shift,
+			    rx_reg_res_dis);
+}
+
+/* tdm */
+void tdm_cpu_id_set(struct aq_hw_s *aq_hw, u32 cpuid, u32 dca)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_dcadcpuid_adr(dca),
+			    tdm_dcadcpuid_msk,
+			    tdm_dcadcpuid_shift, cpuid);
+}
+
+void tdm_large_send_offload_en_set(struct aq_hw_s *aq_hw,
+				   u32 large_send_offload_en)
+{
+	aq_hw_write_reg(aq_hw, tdm_lso_en_adr, large_send_offload_en);
+}
+
+void tdm_tx_dca_en_set(struct aq_hw_s *aq_hw, u32 tx_dca_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_dca_en_adr, tdm_dca_en_msk,
+			    tdm_dca_en_shift, tx_dca_en);
+}
+
+void tdm_tx_dca_mode_set(struct aq_hw_s *aq_hw, u32 tx_dca_mode)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_dca_mode_adr, tdm_dca_mode_msk,
+			    tdm_dca_mode_shift, tx_dca_mode);
+}
+
+void tdm_tx_desc_dca_en_set(struct aq_hw_s *aq_hw, u32 tx_desc_dca_en, u32 dca)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_dcaddesc_en_adr(dca),
+			    tdm_dcaddesc_en_msk, tdm_dcaddesc_en_shift,
+			    tx_desc_dca_en);
+}
+
+void tdm_tx_desc_en_set(struct aq_hw_s *aq_hw, u32 tx_desc_en, u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_descden_adr(descriptor),
+			    tdm_descden_msk,
+			    tdm_descden_shift,
+			    tx_desc_en);
+}
+
+u32 tdm_tx_desc_head_ptr_get(struct aq_hw_s *aq_hw, u32 descriptor)
+{
+	return aq_hw_read_reg_bit(aq_hw, tdm_descdhd_adr(descriptor),
+				  tdm_descdhd_msk, tdm_descdhd_shift);
+}
+
+void tdm_tx_desc_len_set(struct aq_hw_s *aq_hw, u32 tx_desc_len,
+			 u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_descdlen_adr(descriptor),
+			    tdm_descdlen_msk,
+			    tdm_descdlen_shift,
+			    tx_desc_len);
+}
+
+void tdm_tx_desc_wr_wb_irq_en_set(struct aq_hw_s *aq_hw,
+				  u32 tx_desc_wr_wb_irq_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_int_desc_wrb_en_adr,
+			    tdm_int_desc_wrb_en_msk,
+			    tdm_int_desc_wrb_en_shift,
+			    tx_desc_wr_wb_irq_en);
+}
+
+void tdm_tx_desc_wr_wb_threshold_set(struct aq_hw_s *aq_hw,
+				     u32 tx_desc_wr_wb_threshold,
+				     u32 descriptor)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_descdwrb_thresh_adr(descriptor),
+			    tdm_descdwrb_thresh_msk,
+			    tdm_descdwrb_thresh_shift,
+			    tx_desc_wr_wb_threshold);
+}
+
+void tdm_tdm_intr_moder_en_set(struct aq_hw_s *aq_hw,
+			       u32 tdm_irq_moderation_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tdm_int_mod_en_adr,
+			    tdm_int_mod_en_msk,
+			    tdm_int_mod_en_shift,
+			    tdm_irq_moderation_en);
+}
+
+/* thm */
+void thm_lso_tcp_flag_of_first_pkt_set(struct aq_hw_s *aq_hw,
+				       u32 lso_tcp_flag_of_first_pkt)
+{
+	aq_hw_write_reg_bit(aq_hw, thm_lso_tcp_flag_first_adr,
+			    thm_lso_tcp_flag_first_msk,
+			    thm_lso_tcp_flag_first_shift,
+			    lso_tcp_flag_of_first_pkt);
+}
+
+void thm_lso_tcp_flag_of_last_pkt_set(struct aq_hw_s *aq_hw,
+				      u32 lso_tcp_flag_of_last_pkt)
+{
+	aq_hw_write_reg_bit(aq_hw, thm_lso_tcp_flag_last_adr,
+			    thm_lso_tcp_flag_last_msk,
+			    thm_lso_tcp_flag_last_shift,
+			    lso_tcp_flag_of_last_pkt);
+}
+
+void thm_lso_tcp_flag_of_middle_pkt_set(struct aq_hw_s *aq_hw,
+					u32 lso_tcp_flag_of_middle_pkt)
+{
+	aq_hw_write_reg_bit(aq_hw, thm_lso_tcp_flag_mid_adr,
+			    thm_lso_tcp_flag_mid_msk,
+			    thm_lso_tcp_flag_mid_shift,
+			    lso_tcp_flag_of_middle_pkt);
+}
+
+/* TPB: tx packet buffer */
+void tpb_tx_buff_en_set(struct aq_hw_s *aq_hw, u32 tx_buff_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tpb_tx_buf_en_adr, tpb_tx_buf_en_msk,
+			    tpb_tx_buf_en_shift, tx_buff_en);
+}
+
+void tpb_tx_buff_hi_threshold_per_tc_set(struct aq_hw_s *aq_hw,
+					 u32 tx_buff_hi_threshold_per_tc,
+					 u32 buffer)
+{
+	aq_hw_write_reg_bit(aq_hw, tpb_txbhi_thresh_adr(buffer),
+			    tpb_txbhi_thresh_msk, tpb_txbhi_thresh_shift,
+			    tx_buff_hi_threshold_per_tc);
+}
+
+void tpb_tx_buff_lo_threshold_per_tc_set(struct aq_hw_s *aq_hw,
+					 u32 tx_buff_lo_threshold_per_tc,
+					 u32 buffer)
+{
+	aq_hw_write_reg_bit(aq_hw, tpb_txblo_thresh_adr(buffer),
+			    tpb_txblo_thresh_msk, tpb_txblo_thresh_shift,
+			    tx_buff_lo_threshold_per_tc);
+}
+
+void tpb_tx_dma_sys_lbk_en_set(struct aq_hw_s *aq_hw, u32 tx_dma_sys_lbk_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tpb_dma_sys_lbk_adr,
+			    tpb_dma_sys_lbk_msk,
+			    tpb_dma_sys_lbk_shift,
+			    tx_dma_sys_lbk_en);
+}
+
+void tpb_tx_pkt_buff_size_per_tc_set(struct aq_hw_s *aq_hw,
+				     u32 tx_pkt_buff_size_per_tc, u32 buffer)
+{
+	aq_hw_write_reg_bit(aq_hw, tpb_txbbuf_size_adr(buffer),
+			    tpb_txbbuf_size_msk,
+			    tpb_txbbuf_size_shift,
+			    tx_pkt_buff_size_per_tc);
+}
+
+void tpb_tx_path_scp_ins_en_set(struct aq_hw_s *aq_hw, u32 tx_path_scp_ins_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tpb_tx_scp_ins_en_adr,
+			    tpb_tx_scp_ins_en_msk,
+			    tpb_tx_scp_ins_en_shift,
+			    tx_path_scp_ins_en);
+}
+
+/* TPO: tx packet offload */
+void tpo_ipv4header_crc_offload_en_set(struct aq_hw_s *aq_hw,
+				       u32 ipv4header_crc_offload_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tpo_ipv4chk_en_adr,
+			    tpo_ipv4chk_en_msk,
+			    tpo_ipv4chk_en_shift,
+			    ipv4header_crc_offload_en);
+}
+
+void tpo_tcp_udp_crc_offload_en_set(struct aq_hw_s *aq_hw,
+				    u32 tcp_udp_crc_offload_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tpol4chk_en_adr,
+			    tpol4chk_en_msk,
+			    tpol4chk_en_shift,
+			    tcp_udp_crc_offload_en);
+}
+
+void tpo_tx_pkt_sys_lbk_en_set(struct aq_hw_s *aq_hw, u32 tx_pkt_sys_lbk_en)
+{
+	aq_hw_write_reg_bit(aq_hw, tpo_pkt_sys_lbk_adr,
+			    tpo_pkt_sys_lbk_msk,
+			    tpo_pkt_sys_lbk_shift,
+			    tx_pkt_sys_lbk_en);
+}
+
+/* TPS: tx packet scheduler */
+void tps_tx_pkt_shed_data_arb_mode_set(struct aq_hw_s *aq_hw,
+				       u32 tx_pkt_shed_data_arb_mode)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_data_tc_arb_mode_adr,
+			    tps_data_tc_arb_mode_msk,
+			    tps_data_tc_arb_mode_shift,
+			    tx_pkt_shed_data_arb_mode);
+}
+
+void tps_tx_pkt_shed_desc_rate_curr_time_res_set(struct aq_hw_s *aq_hw,
+						 u32 curr_time_res)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_desc_rate_ta_rst_adr,
+			    tps_desc_rate_ta_rst_msk,
+			    tps_desc_rate_ta_rst_shift,
+			    curr_time_res);
+}
+
+void tps_tx_pkt_shed_desc_rate_lim_set(struct aq_hw_s *aq_hw,
+				       u32 tx_pkt_shed_desc_rate_lim)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_desc_rate_lim_adr,
+			    tps_desc_rate_lim_msk,
+			    tps_desc_rate_lim_shift,
+			    tx_pkt_shed_desc_rate_lim);
+}
+
+void tps_tx_pkt_shed_desc_tc_arb_mode_set(struct aq_hw_s *aq_hw,
+					  u32 tx_pkt_shed_desc_tc_arb_mode)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_desc_tc_arb_mode_adr,
+			    tps_desc_tc_arb_mode_msk,
+			    tps_desc_tc_arb_mode_shift,
+			    tx_pkt_shed_desc_tc_arb_mode);
+}
+
+void tps_tx_pkt_shed_desc_tc_max_credit_set(struct aq_hw_s *aq_hw,
+					    u32 tx_pkt_shed_desc_tc_max_credit,
+					    u32 tc)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_desc_tctcredit_max_adr(tc),
+			    tps_desc_tctcredit_max_msk,
+			    tps_desc_tctcredit_max_shift,
+			    tx_pkt_shed_desc_tc_max_credit);
+}
+
+void tps_tx_pkt_shed_desc_tc_weight_set(struct aq_hw_s *aq_hw,
+					u32 tx_pkt_shed_desc_tc_weight, u32 tc)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_desc_tctweight_adr(tc),
+			    tps_desc_tctweight_msk,
+			    tps_desc_tctweight_shift,
+			    tx_pkt_shed_desc_tc_weight);
+}
+
+void tps_tx_pkt_shed_desc_vm_arb_mode_set(struct aq_hw_s *aq_hw,
+					  u32 tx_pkt_shed_desc_vm_arb_mode)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_desc_vm_arb_mode_adr,
+			    tps_desc_vm_arb_mode_msk,
+			    tps_desc_vm_arb_mode_shift,
+			    tx_pkt_shed_desc_vm_arb_mode);
+}
+
+void tps_tx_pkt_shed_tc_data_max_credit_set(struct aq_hw_s *aq_hw,
+					    u32 tx_pkt_shed_tc_data_max_credit,
+					    u32 tc)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_data_tctcredit_max_adr(tc),
+			    tps_data_tctcredit_max_msk,
+			    tps_data_tctcredit_max_shift,
+			    tx_pkt_shed_tc_data_max_credit);
+}
+
+void tps_tx_pkt_shed_tc_data_weight_set(struct aq_hw_s *aq_hw,
+					u32 tx_pkt_shed_tc_data_weight, u32 tc)
+{
+	aq_hw_write_reg_bit(aq_hw, tps_data_tctweight_adr(tc),
+			    tps_data_tctweight_msk,
+			    tps_data_tctweight_shift,
+			    tx_pkt_shed_tc_data_weight);
+}
+
+/* tx */
+void tx_tx_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 tx_reg_res_dis)
+{
+	aq_hw_write_reg_bit(aq_hw, tx_reg_res_dsbl_adr,
+			    tx_reg_res_dsbl_msk,
+			    tx_reg_res_dsbl_shift, tx_reg_res_dis);
+}
+
+/* msm */
+u32 msm_reg_access_status_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg_bit(aq_hw, msm_reg_access_busy_adr,
+				  msm_reg_access_busy_msk,
+				  msm_reg_access_busy_shift);
+}
+
+void msm_reg_addr_for_indirect_addr_set(struct aq_hw_s *aq_hw,
+					u32 reg_addr_for_indirect_addr)
+{
+	aq_hw_write_reg_bit(aq_hw, msm_reg_addr_adr,
+			    msm_reg_addr_msk,
+			    msm_reg_addr_shift,
+			    reg_addr_for_indirect_addr);
+}
+
+void msm_reg_rd_strobe_set(struct aq_hw_s *aq_hw, u32 reg_rd_strobe)
+{
+	aq_hw_write_reg_bit(aq_hw, msm_reg_rd_strobe_adr,
+			    msm_reg_rd_strobe_msk,
+			    msm_reg_rd_strobe_shift,
+			    reg_rd_strobe);
+}
+
+u32 msm_reg_rd_data_get(struct aq_hw_s *aq_hw)
+{
+	return aq_hw_read_reg(aq_hw, msm_reg_rd_data_adr);
+}
+
+void msm_reg_wr_data_set(struct aq_hw_s *aq_hw, u32 reg_wr_data)
+{
+	aq_hw_write_reg(aq_hw, msm_reg_wr_data_adr, reg_wr_data);
+}
+
+void msm_reg_wr_strobe_set(struct aq_hw_s *aq_hw, u32 reg_wr_strobe)
+{
+	aq_hw_write_reg_bit(aq_hw, msm_reg_wr_strobe_adr,
+			    msm_reg_wr_strobe_msk,
+			    msm_reg_wr_strobe_shift,
+			    reg_wr_strobe);
+}
+
+/* pci */
+void pci_pci_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 pci_reg_res_dis)
+{
+	aq_hw_write_reg_bit(aq_hw, pci_reg_res_dsbl_adr,
+			    pci_reg_res_dsbl_msk,
+			    pci_reg_res_dsbl_shift,
+			    pci_reg_res_dis);
+}
+
+void reg_glb_cpu_scratch_scp_set(struct aq_hw_s *aq_hw, u32 glb_cpu_scratch_scp,
+				 u32 scratch_scp)
+{
+	aq_hw_write_reg(aq_hw, glb_cpu_scratch_scp_adr(scratch_scp),
+			glb_cpu_scratch_scp);
+}
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h
new file mode 100644
index 0000000..ed1085b
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h
@@ -0,0 +1,677 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File hw_atl_llh.h: Declarations of bitfield and register access functions for
+ * Atlantic registers.
+ */
+
+#ifndef HW_ATL_LLH_H
+#define HW_ATL_LLH_H
+
+#include <linux/types.h>
+
+struct aq_hw_s;
+
+/* global */
+
+/* set global microprocessor semaphore */
+void reg_glb_cpu_sem_set(struct aq_hw_s *aq_hw,	u32 glb_cpu_sem,
+			 u32 semaphore);
+
+/* get global microprocessor semaphore */
+u32 reg_glb_cpu_sem_get(struct aq_hw_s *aq_hw, u32 semaphore);
+
+/* set global register reset disable */
+void glb_glb_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 glb_reg_res_dis);
+
+/* set soft reset */
+void glb_soft_res_set(struct aq_hw_s *aq_hw, u32 soft_res);
+
+/* get soft reset */
+u32 glb_soft_res_get(struct aq_hw_s *aq_hw);
+
+/* stats */
+
+u32 rpb_rx_dma_drop_pkt_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get rx dma good octet counter lsw */
+u32 stats_rx_dma_good_octet_counterlsw_get(struct aq_hw_s *aq_hw);
+
+/* get rx dma good packet counter lsw */
+u32 stats_rx_dma_good_pkt_counterlsw_get(struct aq_hw_s *aq_hw);
+
+/* get tx dma good octet counter lsw */
+u32 stats_tx_dma_good_octet_counterlsw_get(struct aq_hw_s *aq_hw);
+
+/* get tx dma good packet counter lsw */
+u32 stats_tx_dma_good_pkt_counterlsw_get(struct aq_hw_s *aq_hw);
+
+/* get rx dma good octet counter msw */
+u32 stats_rx_dma_good_octet_countermsw_get(struct aq_hw_s *aq_hw);
+
+/* get rx dma good packet counter msw */
+u32 stats_rx_dma_good_pkt_countermsw_get(struct aq_hw_s *aq_hw);
+
+/* get tx dma good octet counter msw */
+u32 stats_tx_dma_good_octet_countermsw_get(struct aq_hw_s *aq_hw);
+
+/* get tx dma good packet counter msw */
+u32 stats_tx_dma_good_pkt_countermsw_get(struct aq_hw_s *aq_hw);
+
+/* get msm rx errors counter register */
+u32 reg_mac_msm_rx_errs_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get msm rx unicast frames counter register */
+u32 reg_mac_msm_rx_ucst_frm_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get msm rx multicast frames counter register */
+u32 reg_mac_msm_rx_mcst_frm_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get msm rx broadcast frames counter register */
+u32 reg_mac_msm_rx_bcst_frm_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get msm rx broadcast octets counter register 1 */
+u32 reg_mac_msm_rx_bcst_octets_counter1get(struct aq_hw_s *aq_hw);
+
+/* get msm rx unicast octets counter register 0 */
+u32 reg_mac_msm_rx_ucst_octets_counter0get(struct aq_hw_s *aq_hw);
+
+/* get rx dma statistics counter 7 */
+u32 reg_rx_dma_stat_counter7get(struct aq_hw_s *aq_hw);
+
+/* get msm tx errors counter register */
+u32 reg_mac_msm_tx_errs_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get msm tx unicast frames counter register */
+u32 reg_mac_msm_tx_ucst_frm_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get msm tx multicast frames counter register */
+u32 reg_mac_msm_tx_mcst_frm_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get msm tx broadcast frames counter register */
+u32 reg_mac_msm_tx_bcst_frm_cnt_get(struct aq_hw_s *aq_hw);
+
+/* get msm tx multicast octets counter register 1 */
+u32 reg_mac_msm_tx_mcst_octets_counter1get(struct aq_hw_s *aq_hw);
+
+/* get msm tx broadcast octets counter register 1 */
+u32 reg_mac_msm_tx_bcst_octets_counter1get(struct aq_hw_s *aq_hw);
+
+/* get msm tx unicast octets counter register 0 */
+u32 reg_mac_msm_tx_ucst_octets_counter0get(struct aq_hw_s *aq_hw);
+
+/* get global mif identification */
+u32 reg_glb_mif_id_get(struct aq_hw_s *aq_hw);
+
+/* interrupt */
+
+/* set interrupt auto mask lsw */
+void itr_irq_auto_masklsw_set(struct aq_hw_s *aq_hw, u32 irq_auto_masklsw);
+
+/* set interrupt mapping enable rx */
+void itr_irq_map_en_rx_set(struct aq_hw_s *aq_hw, u32 irq_map_en_rx, u32 rx);
+
+/* set interrupt mapping enable tx */
+void itr_irq_map_en_tx_set(struct aq_hw_s *aq_hw, u32 irq_map_en_tx, u32 tx);
+
+/* set interrupt mapping rx */
+void itr_irq_map_rx_set(struct aq_hw_s *aq_hw, u32 irq_map_rx, u32 rx);
+
+/* set interrupt mapping tx */
+void itr_irq_map_tx_set(struct aq_hw_s *aq_hw, u32 irq_map_tx, u32 tx);
+
+/* set interrupt mask clear lsw */
+void itr_irq_msk_clearlsw_set(struct aq_hw_s *aq_hw, u32 irq_msk_clearlsw);
+
+/* set interrupt mask set lsw */
+void itr_irq_msk_setlsw_set(struct aq_hw_s *aq_hw, u32 irq_msk_setlsw);
+
+/* set interrupt register reset disable */
+void itr_irq_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 irq_reg_res_dis);
+
+/* set interrupt status clear lsw */
+void itr_irq_status_clearlsw_set(struct aq_hw_s *aq_hw,
+				 u32 irq_status_clearlsw);
+
+/* get interrupt status lsw */
+u32 itr_irq_statuslsw_get(struct aq_hw_s *aq_hw);
+
+/* get reset interrupt */
+u32 itr_res_irq_get(struct aq_hw_s *aq_hw);
+
+/* set reset interrupt */
+void itr_res_irq_set(struct aq_hw_s *aq_hw, u32 res_irq);
+
+/* rdm */
+
+/* set cpu id */
+void rdm_cpu_id_set(struct aq_hw_s *aq_hw, u32 cpuid, u32 dca);
+
+/* set rx dca enable */
+void rdm_rx_dca_en_set(struct aq_hw_s *aq_hw, u32 rx_dca_en);
+
+/* set rx dca mode */
+void rdm_rx_dca_mode_set(struct aq_hw_s *aq_hw, u32 rx_dca_mode);
+
+/* set rx descriptor data buffer size */
+void rdm_rx_desc_data_buff_size_set(struct aq_hw_s *aq_hw,
+				    u32 rx_desc_data_buff_size,
+				    u32 descriptor);
+
+/* set rx descriptor dca enable */
+void rdm_rx_desc_dca_en_set(struct aq_hw_s *aq_hw, u32 rx_desc_dca_en,
+			    u32 dca);
+
+/* set rx descriptor enable */
+void rdm_rx_desc_en_set(struct aq_hw_s *aq_hw, u32 rx_desc_en,
+			u32 descriptor);
+
+/* set rx descriptor header splitting */
+void rdm_rx_desc_head_splitting_set(struct aq_hw_s *aq_hw,
+				    u32 rx_desc_head_splitting,
+				    u32 descriptor);
+
+/* get rx descriptor head pointer */
+u32 rdm_rx_desc_head_ptr_get(struct aq_hw_s *aq_hw, u32 descriptor);
+
+/* set rx descriptor length */
+void rdm_rx_desc_len_set(struct aq_hw_s *aq_hw, u32 rx_desc_len,
+			 u32 descriptor);
+
+/* set rx descriptor write-back interrupt enable */
+void rdm_rx_desc_wr_wb_irq_en_set(struct aq_hw_s *aq_hw,
+				  u32 rx_desc_wr_wb_irq_en);
+
+/* set rx header dca enable */
+void rdm_rx_head_dca_en_set(struct aq_hw_s *aq_hw, u32 rx_head_dca_en,
+			    u32 dca);
+
+/* set rx payload dca enable */
+void rdm_rx_pld_dca_en_set(struct aq_hw_s *aq_hw, u32 rx_pld_dca_en, u32 dca);
+
+/* set rx descriptor header buffer size */
+void rdm_rx_desc_head_buff_size_set(struct aq_hw_s *aq_hw,
+				    u32 rx_desc_head_buff_size,
+				    u32 descriptor);
+
+/* set rx descriptor reset */
+void rdm_rx_desc_res_set(struct aq_hw_s *aq_hw, u32 rx_desc_res,
+			 u32 descriptor);
+
+/* Set RDM Interrupt Moderation Enable */
+void rdm_rdm_intr_moder_en_set(struct aq_hw_s *aq_hw, u32 rdm_intr_moder_en);
+
+/* reg */
+
+/* set general interrupt mapping register */
+void reg_gen_irq_map_set(struct aq_hw_s *aq_hw, u32 gen_intr_map, u32 regidx);
+
+/* get general interrupt status register */
+u32 reg_gen_irq_status_get(struct aq_hw_s *aq_hw);
+
+/* set interrupt global control register */
+void reg_irq_glb_ctl_set(struct aq_hw_s *aq_hw, u32 intr_glb_ctl);
+
+/* set interrupt throttle register */
+void reg_irq_thr_set(struct aq_hw_s *aq_hw, u32 intr_thr, u32 throttle);
+
+/* set rx dma descriptor base address lsw */
+void reg_rx_dma_desc_base_addresslswset(struct aq_hw_s *aq_hw,
+					u32 rx_dma_desc_base_addrlsw,
+					u32 descriptor);
+
+/* set rx dma descriptor base address msw */
+void reg_rx_dma_desc_base_addressmswset(struct aq_hw_s *aq_hw,
+					u32 rx_dma_desc_base_addrmsw,
+					u32 descriptor);
+
+/* get rx dma descriptor status register */
+u32 reg_rx_dma_desc_status_get(struct aq_hw_s *aq_hw, u32 descriptor);
+
+/* set rx dma descriptor tail pointer register */
+void reg_rx_dma_desc_tail_ptr_set(struct aq_hw_s *aq_hw,
+				  u32 rx_dma_desc_tail_ptr,
+				  u32 descriptor);
+
+/* set rx filter multicast filter mask register */
+void reg_rx_flr_mcst_flr_msk_set(struct aq_hw_s *aq_hw,
+				 u32 rx_flr_mcst_flr_msk);
+
+/* set rx filter multicast filter register */
+void reg_rx_flr_mcst_flr_set(struct aq_hw_s *aq_hw, u32 rx_flr_mcst_flr,
+			     u32 filter);
+
+/* set rx filter rss control register 1 */
+void reg_rx_flr_rss_control1set(struct aq_hw_s *aq_hw,
+				u32 rx_flr_rss_control1);
+
+/* Set RX Filter Control Register 2 */
+void reg_rx_flr_control2_set(struct aq_hw_s *aq_hw, u32 rx_flr_control2);
+
+/* Set RX Interrupt Moderation Control Register */
+void reg_rx_intr_moder_ctrl_set(struct aq_hw_s *aq_hw,
+				u32 rx_intr_moderation_ctl,
+				u32 queue);
+
+/* set tx dma debug control */
+void reg_tx_dma_debug_ctl_set(struct aq_hw_s *aq_hw, u32 tx_dma_debug_ctl);
+
+/* set tx dma descriptor base address lsw */
+void reg_tx_dma_desc_base_addresslswset(struct aq_hw_s *aq_hw,
+					u32 tx_dma_desc_base_addrlsw,
+					u32 descriptor);
+
+/* set tx dma descriptor base address msw */
+void reg_tx_dma_desc_base_addressmswset(struct aq_hw_s *aq_hw,
+					u32 tx_dma_desc_base_addrmsw,
+					u32 descriptor);
+
+/* set tx dma descriptor tail pointer register */
+void reg_tx_dma_desc_tail_ptr_set(struct aq_hw_s *aq_hw,
+				  u32 tx_dma_desc_tail_ptr,
+				  u32 descriptor);
+
+/* Set TX Interrupt Moderation Control Register */
+void reg_tx_intr_moder_ctrl_set(struct aq_hw_s *aq_hw,
+				u32 tx_intr_moderation_ctl,
+				u32 queue);
+
+/* set global microprocessor scratch pad */
+void reg_glb_cpu_scratch_scp_set(struct aq_hw_s *aq_hw,
+				 u32 glb_cpu_scratch_scp, u32 scratch_scp);
+
+/* rpb */
+
+/* set dma system loopback */
+void rpb_dma_sys_lbk_set(struct aq_hw_s *aq_hw, u32 dma_sys_lbk);
+
+/* set rx traffic class mode */
+void rpb_rpf_rx_traf_class_mode_set(struct aq_hw_s *aq_hw,
+				    u32 rx_traf_class_mode);
+
+/* set rx buffer enable */
+void rpb_rx_buff_en_set(struct aq_hw_s *aq_hw, u32 rx_buff_en);
+
+/* set rx buffer high threshold (per tc) */
+void rpb_rx_buff_hi_threshold_per_tc_set(struct aq_hw_s *aq_hw,
+					 u32 rx_buff_hi_threshold_per_tc,
+					 u32 buffer);
+
+/* set rx buffer low threshold (per tc) */
+void rpb_rx_buff_lo_threshold_per_tc_set(struct aq_hw_s *aq_hw,
+					 u32 rx_buff_lo_threshold_per_tc,
+					 u32 buffer);
+
+/* set rx flow control mode */
+void rpb_rx_flow_ctl_mode_set(struct aq_hw_s *aq_hw, u32 rx_flow_ctl_mode);
+
+/* set rx packet buffer size (per tc) */
+void rpb_rx_pkt_buff_size_per_tc_set(struct aq_hw_s *aq_hw,
+				     u32 rx_pkt_buff_size_per_tc,
+				     u32 buffer);
+
+/* set rx xoff enable (per tc) */
+void rpb_rx_xoff_en_per_tc_set(struct aq_hw_s *aq_hw, u32 rx_xoff_en_per_tc,
+			       u32 buffer);
+
+/* rpf */
+
+/* set l2 broadcast count threshold */
+void rpfl2broadcast_count_threshold_set(struct aq_hw_s *aq_hw,
+					u32 l2broadcast_count_threshold);
+
+/* set l2 broadcast enable */
+void rpfl2broadcast_en_set(struct aq_hw_s *aq_hw, u32 l2broadcast_en);
+
+/* set l2 broadcast filter action */
+void rpfl2broadcast_flr_act_set(struct aq_hw_s *aq_hw,
+				u32 l2broadcast_flr_act);
+
+/* set l2 multicast filter enable */
+void rpfl2multicast_flr_en_set(struct aq_hw_s *aq_hw, u32 l2multicast_flr_en,
+			       u32 filter);
+
+/* set l2 promiscuous mode enable */
+void rpfl2promiscuous_mode_en_set(struct aq_hw_s *aq_hw,
+				  u32 l2promiscuous_mode_en);
+
+/* set l2 unicast filter action */
+void rpfl2unicast_flr_act_set(struct aq_hw_s *aq_hw, u32 l2unicast_flr_act,
+			      u32 filter);
+
+/* set l2 unicast filter enable */
+void rpfl2_uc_flr_en_set(struct aq_hw_s *aq_hw, u32 l2unicast_flr_en,
+			 u32 filter);
+
+/* set l2 unicast destination address lsw */
+void rpfl2unicast_dest_addresslsw_set(struct aq_hw_s *aq_hw,
+				      u32 l2unicast_dest_addresslsw,
+				      u32 filter);
+
+/* set l2 unicast destination address msw */
+void rpfl2unicast_dest_addressmsw_set(struct aq_hw_s *aq_hw,
+				      u32 l2unicast_dest_addressmsw,
+				      u32 filter);
+
+/* Set L2 Accept all Multicast packets */
+void rpfl2_accept_all_mc_packets_set(struct aq_hw_s *aq_hw,
+				     u32 l2_accept_all_mc_packets);
+
+/* set user-priority tc mapping */
+void rpf_rpb_user_priority_tc_map_set(struct aq_hw_s *aq_hw,
+				      u32 user_priority_tc_map, u32 tc);
+
+/* set rss key address */
+void rpf_rss_key_addr_set(struct aq_hw_s *aq_hw, u32 rss_key_addr);
+
+/* set rss key write data */
+void rpf_rss_key_wr_data_set(struct aq_hw_s *aq_hw, u32 rss_key_wr_data);
+
+/* get rss key write enable */
+u32 rpf_rss_key_wr_en_get(struct aq_hw_s *aq_hw);
+
+/* set rss key write enable */
+void rpf_rss_key_wr_en_set(struct aq_hw_s *aq_hw, u32 rss_key_wr_en);
+
+/* set rss redirection table address */
+void rpf_rss_redir_tbl_addr_set(struct aq_hw_s *aq_hw,
+				u32 rss_redir_tbl_addr);
+
+/* set rss redirection table write data */
+void rpf_rss_redir_tbl_wr_data_set(struct aq_hw_s *aq_hw,
+				   u32 rss_redir_tbl_wr_data);
+
+/* get rss redirection write enable */
+u32 rpf_rss_redir_wr_en_get(struct aq_hw_s *aq_hw);
+
+/* set rss redirection write enable */
+void rpf_rss_redir_wr_en_set(struct aq_hw_s *aq_hw, u32 rss_redir_wr_en);
+
+/* set tpo to rpf system loopback */
+void rpf_tpo_to_rpf_sys_lbk_set(struct aq_hw_s *aq_hw,
+				u32 tpo_to_rpf_sys_lbk);
+
+/* set vlan inner ethertype */
+void rpf_vlan_inner_etht_set(struct aq_hw_s *aq_hw, u32 vlan_inner_etht);
+
+/* set vlan outer ethertype */
+void rpf_vlan_outer_etht_set(struct aq_hw_s *aq_hw, u32 vlan_outer_etht);
+
+/* set vlan promiscuous mode enable */
+void rpf_vlan_prom_mode_en_set(struct aq_hw_s *aq_hw, u32 vlan_prom_mode_en);
+
+/* Set VLAN untagged action */
+void rpf_vlan_untagged_act_set(struct aq_hw_s *aq_hw, u32 vlan_untagged_act);
+
+/* Set VLAN accept untagged packets */
+void rpf_vlan_accept_untagged_packets_set(struct aq_hw_s *aq_hw,
+					  u32 vlan_accept_untagged_packets);
+
+/* Set VLAN filter enable */
+void rpf_vlan_flr_en_set(struct aq_hw_s *aq_hw, u32 vlan_flr_en, u32 filter);
+
+/* Set VLAN Filter Action */
+void rpf_vlan_flr_act_set(struct aq_hw_s *aq_hw, u32 vlan_filter_act,
+			  u32 filter);
+
+/* Set VLAN ID Filter */
+void rpf_vlan_id_flr_set(struct aq_hw_s *aq_hw, u32 vlan_id_flr, u32 filter);
+
+/* set ethertype filter enable */
+void rpf_etht_flr_en_set(struct aq_hw_s *aq_hw, u32 etht_flr_en, u32 filter);
+
+/* set  ethertype user-priority enable */
+void rpf_etht_user_priority_en_set(struct aq_hw_s *aq_hw,
+				   u32 etht_user_priority_en, u32 filter);
+
+/* set  ethertype rx queue enable */
+void rpf_etht_rx_queue_en_set(struct aq_hw_s *aq_hw, u32 etht_rx_queue_en,
+			      u32 filter);
+
+/* set ethertype rx queue */
+void rpf_etht_rx_queue_set(struct aq_hw_s *aq_hw, u32 etht_rx_queue,
+			   u32 filter);
+
+/* set ethertype user-priority */
+void rpf_etht_user_priority_set(struct aq_hw_s *aq_hw, u32 etht_user_priority,
+				u32 filter);
+
+/* set ethertype management queue */
+void rpf_etht_mgt_queue_set(struct aq_hw_s *aq_hw, u32 etht_mgt_queue,
+			    u32 filter);
+
+/* set ethertype filter action */
+void rpf_etht_flr_act_set(struct aq_hw_s *aq_hw, u32 etht_flr_act,
+			  u32 filter);
+
+/* set ethertype filter */
+void rpf_etht_flr_set(struct aq_hw_s *aq_hw, u32 etht_flr, u32 filter);
+
+/* rpo */
+
+/* set ipv4 header checksum offload enable */
+void rpo_ipv4header_crc_offload_en_set(struct aq_hw_s *aq_hw,
+				       u32 ipv4header_crc_offload_en);
+
+/* set rx descriptor vlan stripping */
+void rpo_rx_desc_vlan_stripping_set(struct aq_hw_s *aq_hw,
+				    u32 rx_desc_vlan_stripping,
+				    u32 descriptor);
+
+/* set tcp/udp checksum offload enable */
+void rpo_tcp_udp_crc_offload_en_set(struct aq_hw_s *aq_hw,
+				    u32 tcp_udp_crc_offload_en);
+
+/* Set LRO Patch Optimization Enable. */
+void rpo_lro_patch_optimization_en_set(struct aq_hw_s *aq_hw,
+				       u32 lro_patch_optimization_en);
+
+/* Set Large Receive Offload Enable */
+void rpo_lro_en_set(struct aq_hw_s *aq_hw, u32 lro_en);
+
+/* Set LRO Q Sessions Limit */
+void rpo_lro_qsessions_lim_set(struct aq_hw_s *aq_hw, u32 lro_qsessions_lim);
+
+/* Set LRO Total Descriptor Limit */
+void rpo_lro_total_desc_lim_set(struct aq_hw_s *aq_hw, u32 lro_total_desc_lim);
+
+/* Set LRO Min Payload of First Packet */
+void rpo_lro_min_pay_of_first_pkt_set(struct aq_hw_s *aq_hw,
+				      u32 lro_min_pld_of_first_pkt);
+
+/* Set LRO Packet Limit */
+void rpo_lro_pkt_lim_set(struct aq_hw_s *aq_hw, u32 lro_packet_lim);
+
+/* Set LRO Max Number of Descriptors */
+void rpo_lro_max_num_of_descriptors_set(struct aq_hw_s *aq_hw,
+					u32 lro_max_desc_num, u32 lro);
+
+/* Set LRO Time Base Divider */
+void rpo_lro_time_base_divider_set(struct aq_hw_s *aq_hw,
+				   u32 lro_time_base_divider);
+
+/*Set LRO Inactive Interval */
+void rpo_lro_inactive_interval_set(struct aq_hw_s *aq_hw,
+				   u32 lro_inactive_interval);
+
+/*Set LRO Max Coalescing Interval */
+void rpo_lro_max_coalescing_interval_set(struct aq_hw_s *aq_hw,
+					 u32 lro_max_coalescing_interval);
+
+/* rx */
+
+/* set rx register reset disable */
+void rx_rx_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 rx_reg_res_dis);
+
+/* tdm */
+
+/* set cpu id */
+void tdm_cpu_id_set(struct aq_hw_s *aq_hw, u32 cpuid, u32 dca);
+
+/* set large send offload enable */
+void tdm_large_send_offload_en_set(struct aq_hw_s *aq_hw,
+				   u32 large_send_offload_en);
+
+/* set tx descriptor enable */
+void tdm_tx_desc_en_set(struct aq_hw_s *aq_hw, u32 tx_desc_en, u32 descriptor);
+
+/* set tx dca enable */
+void tdm_tx_dca_en_set(struct aq_hw_s *aq_hw, u32 tx_dca_en);
+
+/* set tx dca mode */
+void tdm_tx_dca_mode_set(struct aq_hw_s *aq_hw, u32 tx_dca_mode);
+
+/* set tx descriptor dca enable */
+void tdm_tx_desc_dca_en_set(struct aq_hw_s *aq_hw, u32 tx_desc_dca_en, u32 dca);
+
+/* get tx descriptor head pointer */
+u32 tdm_tx_desc_head_ptr_get(struct aq_hw_s *aq_hw, u32 descriptor);
+
+/* set tx descriptor length */
+void tdm_tx_desc_len_set(struct aq_hw_s *aq_hw, u32 tx_desc_len,
+			 u32 descriptor);
+
+/* set tx descriptor write-back interrupt enable */
+void tdm_tx_desc_wr_wb_irq_en_set(struct aq_hw_s *aq_hw,
+				  u32 tx_desc_wr_wb_irq_en);
+
+/* set tx descriptor write-back threshold */
+void tdm_tx_desc_wr_wb_threshold_set(struct aq_hw_s *aq_hw,
+				     u32 tx_desc_wr_wb_threshold,
+				     u32 descriptor);
+
+/* Set TDM Interrupt Moderation Enable */
+void tdm_tdm_intr_moder_en_set(struct aq_hw_s *aq_hw,
+			       u32 tdm_irq_moderation_en);
+/* thm */
+
+/* set lso tcp flag of first packet */
+void thm_lso_tcp_flag_of_first_pkt_set(struct aq_hw_s *aq_hw,
+				       u32 lso_tcp_flag_of_first_pkt);
+
+/* set lso tcp flag of last packet */
+void thm_lso_tcp_flag_of_last_pkt_set(struct aq_hw_s *aq_hw,
+				      u32 lso_tcp_flag_of_last_pkt);
+
+/* set lso tcp flag of middle packet */
+void thm_lso_tcp_flag_of_middle_pkt_set(struct aq_hw_s *aq_hw,
+					u32 lso_tcp_flag_of_middle_pkt);
+
+/* tpb */
+
+/* set tx buffer enable */
+void tpb_tx_buff_en_set(struct aq_hw_s *aq_hw, u32 tx_buff_en);
+
+/* set tx buffer high threshold (per tc) */
+void tpb_tx_buff_hi_threshold_per_tc_set(struct aq_hw_s *aq_hw,
+					 u32 tx_buff_hi_threshold_per_tc,
+					 u32 buffer);
+
+/* set tx buffer low threshold (per tc) */
+void tpb_tx_buff_lo_threshold_per_tc_set(struct aq_hw_s *aq_hw,
+					 u32 tx_buff_lo_threshold_per_tc,
+					 u32 buffer);
+
+/* set tx dma system loopback enable */
+void tpb_tx_dma_sys_lbk_en_set(struct aq_hw_s *aq_hw, u32 tx_dma_sys_lbk_en);
+
+/* set tx packet buffer size (per tc) */
+void tpb_tx_pkt_buff_size_per_tc_set(struct aq_hw_s *aq_hw,
+				     u32 tx_pkt_buff_size_per_tc, u32 buffer);
+
+/* set tx path pad insert enable */
+void tpb_tx_path_scp_ins_en_set(struct aq_hw_s *aq_hw, u32 tx_path_scp_ins_en);
+
+/* tpo */
+
+/* set ipv4 header checksum offload enable */
+void tpo_ipv4header_crc_offload_en_set(struct aq_hw_s *aq_hw,
+				       u32 ipv4header_crc_offload_en);
+
+/* set tcp/udp checksum offload enable */
+void tpo_tcp_udp_crc_offload_en_set(struct aq_hw_s *aq_hw,
+				    u32 tcp_udp_crc_offload_en);
+
+/* set tx pkt system loopback enable */
+void tpo_tx_pkt_sys_lbk_en_set(struct aq_hw_s *aq_hw, u32 tx_pkt_sys_lbk_en);
+
+/* tps */
+
+/* set tx packet scheduler data arbitration mode */
+void tps_tx_pkt_shed_data_arb_mode_set(struct aq_hw_s *aq_hw,
+				       u32 tx_pkt_shed_data_arb_mode);
+
+/* set tx packet scheduler descriptor rate current time reset */
+void tps_tx_pkt_shed_desc_rate_curr_time_res_set(struct aq_hw_s *aq_hw,
+						 u32 curr_time_res);
+
+/* set tx packet scheduler descriptor rate limit */
+void tps_tx_pkt_shed_desc_rate_lim_set(struct aq_hw_s *aq_hw,
+				       u32 tx_pkt_shed_desc_rate_lim);
+
+/* set tx packet scheduler descriptor tc arbitration mode */
+void tps_tx_pkt_shed_desc_tc_arb_mode_set(struct aq_hw_s *aq_hw,
+					  u32 tx_pkt_shed_desc_tc_arb_mode);
+
+/* set tx packet scheduler descriptor tc max credit */
+void tps_tx_pkt_shed_desc_tc_max_credit_set(struct aq_hw_s *aq_hw,
+					    u32 tx_pkt_shed_desc_tc_max_credit,
+					    u32 tc);
+
+/* set tx packet scheduler descriptor tc weight */
+void tps_tx_pkt_shed_desc_tc_weight_set(struct aq_hw_s *aq_hw,
+					u32 tx_pkt_shed_desc_tc_weight,
+					u32 tc);
+
+/* set tx packet scheduler descriptor vm arbitration mode */
+void tps_tx_pkt_shed_desc_vm_arb_mode_set(struct aq_hw_s *aq_hw,
+					  u32 tx_pkt_shed_desc_vm_arb_mode);
+
+/* set tx packet scheduler tc data max credit */
+void tps_tx_pkt_shed_tc_data_max_credit_set(struct aq_hw_s *aq_hw,
+					    u32 tx_pkt_shed_tc_data_max_credit,
+					    u32 tc);
+
+/* set tx packet scheduler tc data weight */
+void tps_tx_pkt_shed_tc_data_weight_set(struct aq_hw_s *aq_hw,
+					u32 tx_pkt_shed_tc_data_weight,
+					u32 tc);
+
+/* tx */
+
+/* set tx register reset disable */
+void tx_tx_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 tx_reg_res_dis);
+
+/* msm */
+
+/* get register access status */
+u32 msm_reg_access_status_get(struct aq_hw_s *aq_hw);
+
+/* set  register address for indirect address */
+void msm_reg_addr_for_indirect_addr_set(struct aq_hw_s *aq_hw,
+					u32 reg_addr_for_indirect_addr);
+
+/* set register read strobe */
+void msm_reg_rd_strobe_set(struct aq_hw_s *aq_hw, u32 reg_rd_strobe);
+
+/* get  register read data */
+u32 msm_reg_rd_data_get(struct aq_hw_s *aq_hw);
+
+/* set  register write data */
+void msm_reg_wr_data_set(struct aq_hw_s *aq_hw, u32 reg_wr_data);
+
+/* set register write strobe */
+void msm_reg_wr_strobe_set(struct aq_hw_s *aq_hw, u32 reg_wr_strobe);
+
+/* pci */
+
+/* set pci register reset disable */
+void pci_pci_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 pci_reg_res_dis);
+
+#endif /* HW_ATL_LLH_H */
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h
new file mode 100644
index 0000000..5527fc0
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h
@@ -0,0 +1,2375 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File hw_atl_llh_internal.h: Preprocessor definitions
+ * for Atlantic registers.
+ */
+
+#ifndef HW_ATL_LLH_INTERNAL_H
+#define HW_ATL_LLH_INTERNAL_H
+
+/* global microprocessor semaphore  definitions
+ * base address: 0x000003a0
+ * parameter: semaphore {s} | stride size 0x4 | range [0, 15]
+ */
+#define glb_cpu_sem_adr(semaphore)  (0x000003a0u + (semaphore) * 0x4)
+/* register address for bitfield rx dma good octet counter lsw [1f:0] */
+#define stats_rx_dma_good_octet_counterlsw__adr 0x00006808
+/* register address for bitfield rx dma good packet counter lsw [1f:0] */
+#define stats_rx_dma_good_pkt_counterlsw__adr 0x00006800
+/* register address for bitfield tx dma good octet counter lsw [1f:0] */
+#define stats_tx_dma_good_octet_counterlsw__adr 0x00008808
+/* register address for bitfield tx dma good packet counter lsw [1f:0] */
+#define stats_tx_dma_good_pkt_counterlsw__adr 0x00008800
+
+/* register address for bitfield rx dma good octet counter msw [3f:20] */
+#define stats_rx_dma_good_octet_countermsw__adr 0x0000680c
+/* register address for bitfield rx dma good packet counter msw [3f:20] */
+#define stats_rx_dma_good_pkt_countermsw__adr 0x00006804
+/* register address for bitfield tx dma good octet counter msw [3f:20] */
+#define stats_tx_dma_good_octet_countermsw__adr 0x0000880c
+/* register address for bitfield tx dma good packet counter msw [3f:20] */
+#define stats_tx_dma_good_pkt_countermsw__adr 0x00008804
+
+/* preprocessor definitions for msm rx errors counter register */
+#define mac_msm_rx_errs_cnt_adr 0x00000120u
+
+/* preprocessor definitions for msm rx unicast frames counter register */
+#define mac_msm_rx_ucst_frm_cnt_adr 0x000000e0u
+
+/* preprocessor definitions for msm rx multicast frames counter register */
+#define mac_msm_rx_mcst_frm_cnt_adr 0x000000e8u
+
+/* preprocessor definitions for msm rx broadcast frames counter register */
+#define mac_msm_rx_bcst_frm_cnt_adr 0x000000f0u
+
+/* preprocessor definitions for msm rx broadcast octets counter register 1 */
+#define mac_msm_rx_bcst_octets_counter1_adr 0x000001b0u
+
+/* preprocessor definitions for msm rx broadcast octets counter register 2 */
+#define mac_msm_rx_bcst_octets_counter2_adr 0x000001b4u
+
+/* preprocessor definitions for msm rx unicast octets counter register 0 */
+#define mac_msm_rx_ucst_octets_counter0_adr 0x000001b8u
+
+/* preprocessor definitions for rx dma statistics counter 7 */
+#define rx_dma_stat_counter7_adr 0x00006818u
+
+/* preprocessor definitions for msm tx unicast frames counter register */
+#define mac_msm_tx_ucst_frm_cnt_adr 0x00000108u
+
+/* preprocessor definitions for msm tx multicast frames counter register */
+#define mac_msm_tx_mcst_frm_cnt_adr 0x00000110u
+
+/* preprocessor definitions for global mif identification */
+#define glb_mif_id_adr 0x0000001cu
+
+/* register address for bitfield iamr_lsw[1f:0] */
+#define itr_iamrlsw_adr 0x00002090
+/* register address for bitfield rx dma drop packet counter [1f:0] */
+#define rpb_rx_dma_drop_pkt_cnt_adr 0x00006818
+
+/* register address for bitfield imcr_lsw[1f:0] */
+#define itr_imcrlsw_adr 0x00002070
+/* register address for bitfield imsr_lsw[1f:0] */
+#define itr_imsrlsw_adr 0x00002060
+/* register address for bitfield itr_reg_res_dsbl */
+#define itr_reg_res_dsbl_adr 0x00002300
+/* bitmask for bitfield itr_reg_res_dsbl */
+#define itr_reg_res_dsbl_msk 0x20000000
+/* lower bit position of bitfield itr_reg_res_dsbl */
+#define itr_reg_res_dsbl_shift 29
+/* register address for bitfield iscr_lsw[1f:0] */
+#define itr_iscrlsw_adr 0x00002050
+/* register address for bitfield isr_lsw[1f:0] */
+#define itr_isrlsw_adr 0x00002000
+/* register address for bitfield itr_reset */
+#define itr_res_adr 0x00002300
+/* bitmask for bitfield itr_reset */
+#define itr_res_msk 0x80000000
+/* lower bit position of bitfield itr_reset */
+#define itr_res_shift 31
+/* register address for bitfield dca{d}_cpuid[7:0] */
+#define rdm_dcadcpuid_adr(dca) (0x00006100 + (dca) * 0x4)
+/* bitmask for bitfield dca{d}_cpuid[7:0] */
+#define rdm_dcadcpuid_msk 0x000000ff
+/* lower bit position of bitfield dca{d}_cpuid[7:0] */
+#define rdm_dcadcpuid_shift 0
+/* register address for bitfield dca_en */
+#define rdm_dca_en_adr 0x00006180
+
+/* rx dca_en bitfield definitions
+ * preprocessor definitions for the bitfield "dca_en".
+ * port="pif_rdm_dca_en_i"
+ */
+
+/* register address for bitfield dca_en */
+#define rdm_dca_en_adr 0x00006180
+/* bitmask for bitfield dca_en */
+#define rdm_dca_en_msk 0x80000000
+/* inverted bitmask for bitfield dca_en */
+#define rdm_dca_en_mskn 0x7fffffff
+/* lower bit position of bitfield dca_en */
+#define rdm_dca_en_shift 31
+/* width of bitfield dca_en */
+#define rdm_dca_en_width 1
+/* default value of bitfield dca_en */
+#define rdm_dca_en_default 0x1
+
+/* rx dca_mode[3:0] bitfield definitions
+ * preprocessor definitions for the bitfield "dca_mode[3:0]".
+ * port="pif_rdm_dca_mode_i[3:0]"
+ */
+
+/* register address for bitfield dca_mode[3:0] */
+#define rdm_dca_mode_adr 0x00006180
+/* bitmask for bitfield dca_mode[3:0] */
+#define rdm_dca_mode_msk 0x0000000f
+/* inverted bitmask for bitfield dca_mode[3:0] */
+#define rdm_dca_mode_mskn 0xfffffff0
+/* lower bit position of bitfield dca_mode[3:0] */
+#define rdm_dca_mode_shift 0
+/* width of bitfield dca_mode[3:0] */
+#define rdm_dca_mode_width 4
+/* default value of bitfield dca_mode[3:0] */
+#define rdm_dca_mode_default 0x0
+
+/* rx desc{d}_data_size[4:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_data_size[4:0]".
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ * port="pif_rdm_desc0_data_size_i[4:0]"
+ */
+
+/* register address for bitfield desc{d}_data_size[4:0] */
+#define rdm_descddata_size_adr(descriptor) (0x00005b18 + (descriptor) * 0x20)
+/* bitmask for bitfield desc{d}_data_size[4:0] */
+#define rdm_descddata_size_msk 0x0000001f
+/* inverted bitmask for bitfield desc{d}_data_size[4:0] */
+#define rdm_descddata_size_mskn 0xffffffe0
+/* lower bit position of bitfield desc{d}_data_size[4:0] */
+#define rdm_descddata_size_shift 0
+/* width of bitfield desc{d}_data_size[4:0] */
+#define rdm_descddata_size_width 5
+/* default value of bitfield desc{d}_data_size[4:0] */
+#define rdm_descddata_size_default 0x0
+
+/* rx dca{d}_desc_en bitfield definitions
+ * preprocessor definitions for the bitfield "dca{d}_desc_en".
+ * parameter: dca {d} | stride size 0x4 | range [0, 31]
+ * port="pif_rdm_dca_desc_en_i[0]"
+ */
+
+/* register address for bitfield dca{d}_desc_en */
+#define rdm_dcaddesc_en_adr(dca) (0x00006100 + (dca) * 0x4)
+/* bitmask for bitfield dca{d}_desc_en */
+#define rdm_dcaddesc_en_msk 0x80000000
+/* inverted bitmask for bitfield dca{d}_desc_en */
+#define rdm_dcaddesc_en_mskn 0x7fffffff
+/* lower bit position of bitfield dca{d}_desc_en */
+#define rdm_dcaddesc_en_shift 31
+/* width of bitfield dca{d}_desc_en */
+#define rdm_dcaddesc_en_width 1
+/* default value of bitfield dca{d}_desc_en */
+#define rdm_dcaddesc_en_default 0x0
+
+/* rx desc{d}_en bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_en".
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ * port="pif_rdm_desc_en_i[0]"
+ */
+
+/* register address for bitfield desc{d}_en */
+#define rdm_descden_adr(descriptor) (0x00005b08 + (descriptor) * 0x20)
+/* bitmask for bitfield desc{d}_en */
+#define rdm_descden_msk 0x80000000
+/* inverted bitmask for bitfield desc{d}_en */
+#define rdm_descden_mskn 0x7fffffff
+/* lower bit position of bitfield desc{d}_en */
+#define rdm_descden_shift 31
+/* width of bitfield desc{d}_en */
+#define rdm_descden_width 1
+/* default value of bitfield desc{d}_en */
+#define rdm_descden_default 0x0
+
+/* rx desc{d}_hdr_size[4:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_hdr_size[4:0]".
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ * port="pif_rdm_desc0_hdr_size_i[4:0]"
+ */
+
+/* register address for bitfield desc{d}_hdr_size[4:0] */
+#define rdm_descdhdr_size_adr(descriptor) (0x00005b18 + (descriptor) * 0x20)
+/* bitmask for bitfield desc{d}_hdr_size[4:0] */
+#define rdm_descdhdr_size_msk 0x00001f00
+/* inverted bitmask for bitfield desc{d}_hdr_size[4:0] */
+#define rdm_descdhdr_size_mskn 0xffffe0ff
+/* lower bit position of bitfield desc{d}_hdr_size[4:0] */
+#define rdm_descdhdr_size_shift 8
+/* width of bitfield desc{d}_hdr_size[4:0] */
+#define rdm_descdhdr_size_width 5
+/* default value of bitfield desc{d}_hdr_size[4:0] */
+#define rdm_descdhdr_size_default 0x0
+
+/* rx desc{d}_hdr_split bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_hdr_split".
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ * port="pif_rdm_desc_hdr_split_i[0]"
+ */
+
+/* register address for bitfield desc{d}_hdr_split */
+#define rdm_descdhdr_split_adr(descriptor) (0x00005b08 + (descriptor) * 0x20)
+/* bitmask for bitfield desc{d}_hdr_split */
+#define rdm_descdhdr_split_msk 0x10000000
+/* inverted bitmask for bitfield desc{d}_hdr_split */
+#define rdm_descdhdr_split_mskn 0xefffffff
+/* lower bit position of bitfield desc{d}_hdr_split */
+#define rdm_descdhdr_split_shift 28
+/* width of bitfield desc{d}_hdr_split */
+#define rdm_descdhdr_split_width 1
+/* default value of bitfield desc{d}_hdr_split */
+#define rdm_descdhdr_split_default 0x0
+
+/* rx desc{d}_hd[c:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_hd[c:0]".
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ * port="rdm_pif_desc0_hd_o[12:0]"
+ */
+
+/* register address for bitfield desc{d}_hd[c:0] */
+#define rdm_descdhd_adr(descriptor) (0x00005b0c + (descriptor) * 0x20)
+/* bitmask for bitfield desc{d}_hd[c:0] */
+#define rdm_descdhd_msk 0x00001fff
+/* inverted bitmask for bitfield desc{d}_hd[c:0] */
+#define rdm_descdhd_mskn 0xffffe000
+/* lower bit position of bitfield desc{d}_hd[c:0] */
+#define rdm_descdhd_shift 0
+/* width of bitfield desc{d}_hd[c:0] */
+#define rdm_descdhd_width 13
+
+/* rx desc{d}_len[9:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_len[9:0]".
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ * port="pif_rdm_desc0_len_i[9:0]"
+ */
+
+/* register address for bitfield desc{d}_len[9:0] */
+#define rdm_descdlen_adr(descriptor) (0x00005b08 + (descriptor) * 0x20)
+/* bitmask for bitfield desc{d}_len[9:0] */
+#define rdm_descdlen_msk 0x00001ff8
+/* inverted bitmask for bitfield desc{d}_len[9:0] */
+#define rdm_descdlen_mskn 0xffffe007
+/* lower bit position of bitfield desc{d}_len[9:0] */
+#define rdm_descdlen_shift 3
+/* width of bitfield desc{d}_len[9:0] */
+#define rdm_descdlen_width 10
+/* default value of bitfield desc{d}_len[9:0] */
+#define rdm_descdlen_default 0x0
+
+/* rx desc{d}_reset bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_reset".
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ * port="pif_rdm_q_pf_res_i[0]"
+ */
+
+/* register address for bitfield desc{d}_reset */
+#define rdm_descdreset_adr(descriptor) (0x00005b08 + (descriptor) * 0x20)
+/* bitmask for bitfield desc{d}_reset */
+#define rdm_descdreset_msk 0x02000000
+/* inverted bitmask for bitfield desc{d}_reset */
+#define rdm_descdreset_mskn 0xfdffffff
+/* lower bit position of bitfield desc{d}_reset */
+#define rdm_descdreset_shift 25
+/* width of bitfield desc{d}_reset */
+#define rdm_descdreset_width 1
+/* default value of bitfield desc{d}_reset */
+#define rdm_descdreset_default 0x0
+
+/* rx int_desc_wrb_en bitfield definitions
+ * preprocessor definitions for the bitfield "int_desc_wrb_en".
+ * port="pif_rdm_int_desc_wrb_en_i"
+ */
+
+/* register address for bitfield int_desc_wrb_en */
+#define rdm_int_desc_wrb_en_adr 0x00005a30
+/* bitmask for bitfield int_desc_wrb_en */
+#define rdm_int_desc_wrb_en_msk 0x00000004
+/* inverted bitmask for bitfield int_desc_wrb_en */
+#define rdm_int_desc_wrb_en_mskn 0xfffffffb
+/* lower bit position of bitfield int_desc_wrb_en */
+#define rdm_int_desc_wrb_en_shift 2
+/* width of bitfield int_desc_wrb_en */
+#define rdm_int_desc_wrb_en_width 1
+/* default value of bitfield int_desc_wrb_en */
+#define rdm_int_desc_wrb_en_default 0x0
+
+/* rx dca{d}_hdr_en bitfield definitions
+ * preprocessor definitions for the bitfield "dca{d}_hdr_en".
+ * parameter: dca {d} | stride size 0x4 | range [0, 31]
+ * port="pif_rdm_dca_hdr_en_i[0]"
+ */
+
+/* register address for bitfield dca{d}_hdr_en */
+#define rdm_dcadhdr_en_adr(dca) (0x00006100 + (dca) * 0x4)
+/* bitmask for bitfield dca{d}_hdr_en */
+#define rdm_dcadhdr_en_msk 0x40000000
+/* inverted bitmask for bitfield dca{d}_hdr_en */
+#define rdm_dcadhdr_en_mskn 0xbfffffff
+/* lower bit position of bitfield dca{d}_hdr_en */
+#define rdm_dcadhdr_en_shift 30
+/* width of bitfield dca{d}_hdr_en */
+#define rdm_dcadhdr_en_width 1
+/* default value of bitfield dca{d}_hdr_en */
+#define rdm_dcadhdr_en_default 0x0
+
+/* rx dca{d}_pay_en bitfield definitions
+ * preprocessor definitions for the bitfield "dca{d}_pay_en".
+ * parameter: dca {d} | stride size 0x4 | range [0, 31]
+ * port="pif_rdm_dca_pay_en_i[0]"
+ */
+
+/* register address for bitfield dca{d}_pay_en */
+#define rdm_dcadpay_en_adr(dca) (0x00006100 + (dca) * 0x4)
+/* bitmask for bitfield dca{d}_pay_en */
+#define rdm_dcadpay_en_msk 0x20000000
+/* inverted bitmask for bitfield dca{d}_pay_en */
+#define rdm_dcadpay_en_mskn 0xdfffffff
+/* lower bit position of bitfield dca{d}_pay_en */
+#define rdm_dcadpay_en_shift 29
+/* width of bitfield dca{d}_pay_en */
+#define rdm_dcadpay_en_width 1
+/* default value of bitfield dca{d}_pay_en */
+#define rdm_dcadpay_en_default 0x0
+
+/* RX rdm_int_rim_en Bitfield Definitions
+ * Preprocessor definitions for the bitfield "rdm_int_rim_en".
+ * PORT="pif_rdm_int_rim_en_i"
+ */
+
+/* Register address for bitfield rdm_int_rim_en */
+#define rdm_int_rim_en_adr 0x00005A30
+/* Bitmask for bitfield rdm_int_rim_en */
+#define rdm_int_rim_en_msk 0x00000008
+/* Inverted bitmask for bitfield rdm_int_rim_en */
+#define rdm_int_rim_en_mskn 0xFFFFFFF7
+/* Lower bit position of bitfield rdm_int_rim_en */
+#define rdm_int_rim_en_shift 3
+/* Width of bitfield rdm_int_rim_en */
+#define rdm_int_rim_en_width 1
+/* Default value of bitfield rdm_int_rim_en */
+#define rdm_int_rim_en_default 0x0
+
+/* general interrupt mapping register definitions
+ * preprocessor definitions for general interrupt mapping register
+ * base address: 0x00002180
+ * parameter: regidx {f} | stride size 0x4 | range [0, 3]
+ */
+#define gen_intr_map_adr(regidx) (0x00002180u + (regidx) * 0x4)
+
+/* general interrupt status register definitions
+ * preprocessor definitions for general interrupt status register
+ * address: 0x000021A0
+ */
+
+#define gen_intr_stat_adr 0x000021A4U
+
+/* interrupt global control register  definitions
+ * preprocessor definitions for interrupt global control register
+ * address: 0x00002300
+ */
+#define intr_glb_ctl_adr 0x00002300u
+
+/* interrupt throttle register definitions
+ * preprocessor definitions for interrupt throttle register
+ * base address: 0x00002800
+ * parameter: throttle {t} | stride size 0x4 | range [0, 31]
+ */
+#define intr_thr_adr(throttle) (0x00002800u + (throttle) * 0x4)
+
+/* rx dma descriptor base address lsw definitions
+ * preprocessor definitions for rx dma descriptor base address lsw
+ * base address: 0x00005b00
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ */
+#define rx_dma_desc_base_addrlsw_adr(descriptor) \
+(0x00005b00u + (descriptor) * 0x20)
+
+/* rx dma descriptor base address msw definitions
+ * preprocessor definitions for rx dma descriptor base address msw
+ * base address: 0x00005b04
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ */
+#define rx_dma_desc_base_addrmsw_adr(descriptor) \
+(0x00005b04u + (descriptor) * 0x20)
+
+/* rx dma descriptor status register definitions
+ * preprocessor definitions for rx dma descriptor status register
+ * base address: 0x00005b14
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ */
+#define rx_dma_desc_stat_adr(descriptor) (0x00005b14u + (descriptor) * 0x20)
+
+/* rx dma descriptor tail pointer register definitions
+ * preprocessor definitions for rx dma descriptor tail pointer register
+ * base address: 0x00005b10
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ */
+#define rx_dma_desc_tail_ptr_adr(descriptor) (0x00005b10u + (descriptor) * 0x20)
+
+/* rx interrupt moderation control register definitions
+ * Preprocessor definitions for RX Interrupt Moderation Control Register
+ * Base Address: 0x00005A40
+ * Parameter: RIM {R} | stride size 0x4 | range [0, 31]
+ */
+#define rx_intr_moderation_ctl_adr(rim) (0x00005A40u + (rim) * 0x4)
+
+/* rx filter multicast filter mask register definitions
+ * preprocessor definitions for rx filter multicast filter mask register
+ * address: 0x00005270
+ */
+#define rx_flr_mcst_flr_msk_adr 0x00005270u
+
+/* rx filter multicast filter register definitions
+ * preprocessor definitions for rx filter multicast filter register
+ * base address: 0x00005250
+ * parameter: filter {f} | stride size 0x4 | range [0, 7]
+ */
+#define rx_flr_mcst_flr_adr(filter) (0x00005250u + (filter) * 0x4)
+
+/* RX Filter RSS Control Register 1 Definitions
+ * Preprocessor definitions for RX Filter RSS Control Register 1
+ * Address: 0x000054C0
+ */
+#define rx_flr_rss_control1_adr 0x000054C0u
+
+/* RX Filter Control Register 2 Definitions
+ * Preprocessor definitions for RX Filter Control Register 2
+ * Address: 0x00005104
+ */
+#define rx_flr_control2_adr 0x00005104u
+
+/* tx tx dma debug control [1f:0] bitfield definitions
+ * preprocessor definitions for the bitfield "tx dma debug control [1f:0]".
+ * port="pif_tdm_debug_cntl_i[31:0]"
+ */
+
+/* register address for bitfield tx dma debug control [1f:0] */
+#define tdm_tx_dma_debug_ctl_adr 0x00008920
+/* bitmask for bitfield tx dma debug control [1f:0] */
+#define tdm_tx_dma_debug_ctl_msk 0xffffffff
+/* inverted bitmask for bitfield tx dma debug control [1f:0] */
+#define tdm_tx_dma_debug_ctl_mskn 0x00000000
+/* lower bit position of bitfield tx dma debug control [1f:0] */
+#define tdm_tx_dma_debug_ctl_shift 0
+/* width of bitfield tx dma debug control [1f:0] */
+#define tdm_tx_dma_debug_ctl_width 32
+/* default value of bitfield tx dma debug control [1f:0] */
+#define tdm_tx_dma_debug_ctl_default 0x0
+
+/* tx dma descriptor base address lsw definitions
+ * preprocessor definitions for tx dma descriptor base address lsw
+ * base address: 0x00007c00
+ * parameter: descriptor {d} | stride size 0x40 | range [0, 31]
+ */
+#define tx_dma_desc_base_addrlsw_adr(descriptor) \
+	(0x00007c00u + (descriptor) * 0x40)
+
+/* tx dma descriptor tail pointer register definitions
+ * preprocessor definitions for tx dma descriptor tail pointer register
+ * base address: 0x00007c10
+ *  parameter: descriptor {d} | stride size 0x40 | range [0, 31]
+ */
+#define tx_dma_desc_tail_ptr_adr(descriptor) (0x00007c10u + (descriptor) * 0x40)
+
+/* rx dma_sys_loopback bitfield definitions
+ * preprocessor definitions for the bitfield "dma_sys_loopback".
+ * port="pif_rpb_dma_sys_lbk_i"
+ */
+
+/* register address for bitfield dma_sys_loopback */
+#define rpb_dma_sys_lbk_adr 0x00005000
+/* bitmask for bitfield dma_sys_loopback */
+#define rpb_dma_sys_lbk_msk 0x00000040
+/* inverted bitmask for bitfield dma_sys_loopback */
+#define rpb_dma_sys_lbk_mskn 0xffffffbf
+/* lower bit position of bitfield dma_sys_loopback */
+#define rpb_dma_sys_lbk_shift 6
+/* width of bitfield dma_sys_loopback */
+#define rpb_dma_sys_lbk_width 1
+/* default value of bitfield dma_sys_loopback */
+#define rpb_dma_sys_lbk_default 0x0
+
+/* rx rx_tc_mode bitfield definitions
+ * preprocessor definitions for the bitfield "rx_tc_mode".
+ * port="pif_rpb_rx_tc_mode_i,pif_rpf_rx_tc_mode_i"
+ */
+
+/* register address for bitfield rx_tc_mode */
+#define rpb_rpf_rx_tc_mode_adr 0x00005700
+/* bitmask for bitfield rx_tc_mode */
+#define rpb_rpf_rx_tc_mode_msk 0x00000100
+/* inverted bitmask for bitfield rx_tc_mode */
+#define rpb_rpf_rx_tc_mode_mskn 0xfffffeff
+/* lower bit position of bitfield rx_tc_mode */
+#define rpb_rpf_rx_tc_mode_shift 8
+/* width of bitfield rx_tc_mode */
+#define rpb_rpf_rx_tc_mode_width 1
+/* default value of bitfield rx_tc_mode */
+#define rpb_rpf_rx_tc_mode_default 0x0
+
+/* rx rx_buf_en bitfield definitions
+ * preprocessor definitions for the bitfield "rx_buf_en".
+ * port="pif_rpb_rx_buf_en_i"
+ */
+
+/* register address for bitfield rx_buf_en */
+#define rpb_rx_buf_en_adr 0x00005700
+/* bitmask for bitfield rx_buf_en */
+#define rpb_rx_buf_en_msk 0x00000001
+/* inverted bitmask for bitfield rx_buf_en */
+#define rpb_rx_buf_en_mskn 0xfffffffe
+/* lower bit position of bitfield rx_buf_en */
+#define rpb_rx_buf_en_shift 0
+/* width of bitfield rx_buf_en */
+#define rpb_rx_buf_en_width 1
+/* default value of bitfield rx_buf_en */
+#define rpb_rx_buf_en_default 0x0
+
+/* rx rx{b}_hi_thresh[d:0] bitfield definitions
+ * preprocessor definitions for the bitfield "rx{b}_hi_thresh[d:0]".
+ * parameter: buffer {b} | stride size 0x10 | range [0, 7]
+ * port="pif_rpb_rx0_hi_thresh_i[13:0]"
+ */
+
+/* register address for bitfield rx{b}_hi_thresh[d:0] */
+#define rpb_rxbhi_thresh_adr(buffer) (0x00005714 + (buffer) * 0x10)
+/* bitmask for bitfield rx{b}_hi_thresh[d:0] */
+#define rpb_rxbhi_thresh_msk 0x3fff0000
+/* inverted bitmask for bitfield rx{b}_hi_thresh[d:0] */
+#define rpb_rxbhi_thresh_mskn 0xc000ffff
+/* lower bit position of bitfield rx{b}_hi_thresh[d:0] */
+#define rpb_rxbhi_thresh_shift 16
+/* width of bitfield rx{b}_hi_thresh[d:0] */
+#define rpb_rxbhi_thresh_width 14
+/* default value of bitfield rx{b}_hi_thresh[d:0] */
+#define rpb_rxbhi_thresh_default 0x0
+
+/* rx rx{b}_lo_thresh[d:0] bitfield definitions
+ * preprocessor definitions for the bitfield "rx{b}_lo_thresh[d:0]".
+ * parameter: buffer {b} | stride size 0x10 | range [0, 7]
+ * port="pif_rpb_rx0_lo_thresh_i[13:0]"
+ */
+
+/* register address for bitfield rx{b}_lo_thresh[d:0] */
+#define rpb_rxblo_thresh_adr(buffer) (0x00005714 + (buffer) * 0x10)
+/* bitmask for bitfield rx{b}_lo_thresh[d:0] */
+#define rpb_rxblo_thresh_msk 0x00003fff
+/* inverted bitmask for bitfield rx{b}_lo_thresh[d:0] */
+#define rpb_rxblo_thresh_mskn 0xffffc000
+/* lower bit position of bitfield rx{b}_lo_thresh[d:0] */
+#define rpb_rxblo_thresh_shift 0
+/* width of bitfield rx{b}_lo_thresh[d:0] */
+#define rpb_rxblo_thresh_width 14
+/* default value of bitfield rx{b}_lo_thresh[d:0] */
+#define rpb_rxblo_thresh_default 0x0
+
+/* rx rx_fc_mode[1:0] bitfield definitions
+ * preprocessor definitions for the bitfield "rx_fc_mode[1:0]".
+ * port="pif_rpb_rx_fc_mode_i[1:0]"
+ */
+
+/* register address for bitfield rx_fc_mode[1:0] */
+#define rpb_rx_fc_mode_adr 0x00005700
+/* bitmask for bitfield rx_fc_mode[1:0] */
+#define rpb_rx_fc_mode_msk 0x00000030
+/* inverted bitmask for bitfield rx_fc_mode[1:0] */
+#define rpb_rx_fc_mode_mskn 0xffffffcf
+/* lower bit position of bitfield rx_fc_mode[1:0] */
+#define rpb_rx_fc_mode_shift 4
+/* width of bitfield rx_fc_mode[1:0] */
+#define rpb_rx_fc_mode_width 2
+/* default value of bitfield rx_fc_mode[1:0] */
+#define rpb_rx_fc_mode_default 0x0
+
+/* rx rx{b}_buf_size[8:0] bitfield definitions
+ * preprocessor definitions for the bitfield "rx{b}_buf_size[8:0]".
+ * parameter: buffer {b} | stride size 0x10 | range [0, 7]
+ * port="pif_rpb_rx0_buf_size_i[8:0]"
+ */
+
+/* register address for bitfield rx{b}_buf_size[8:0] */
+#define rpb_rxbbuf_size_adr(buffer) (0x00005710 + (buffer) * 0x10)
+/* bitmask for bitfield rx{b}_buf_size[8:0] */
+#define rpb_rxbbuf_size_msk 0x000001ff
+/* inverted bitmask for bitfield rx{b}_buf_size[8:0] */
+#define rpb_rxbbuf_size_mskn 0xfffffe00
+/* lower bit position of bitfield rx{b}_buf_size[8:0] */
+#define rpb_rxbbuf_size_shift 0
+/* width of bitfield rx{b}_buf_size[8:0] */
+#define rpb_rxbbuf_size_width 9
+/* default value of bitfield rx{b}_buf_size[8:0] */
+#define rpb_rxbbuf_size_default 0x0
+
+/* rx rx{b}_xoff_en bitfield definitions
+ * preprocessor definitions for the bitfield "rx{b}_xoff_en".
+ * parameter: buffer {b} | stride size 0x10 | range [0, 7]
+ * port="pif_rpb_rx_xoff_en_i[0]"
+ */
+
+/* register address for bitfield rx{b}_xoff_en */
+#define rpb_rxbxoff_en_adr(buffer) (0x00005714 + (buffer) * 0x10)
+/* bitmask for bitfield rx{b}_xoff_en */
+#define rpb_rxbxoff_en_msk 0x80000000
+/* inverted bitmask for bitfield rx{b}_xoff_en */
+#define rpb_rxbxoff_en_mskn 0x7fffffff
+/* lower bit position of bitfield rx{b}_xoff_en */
+#define rpb_rxbxoff_en_shift 31
+/* width of bitfield rx{b}_xoff_en */
+#define rpb_rxbxoff_en_width 1
+/* default value of bitfield rx{b}_xoff_en */
+#define rpb_rxbxoff_en_default 0x0
+
+/* rx l2_bc_thresh[f:0] bitfield definitions
+ * preprocessor definitions for the bitfield "l2_bc_thresh[f:0]".
+ * port="pif_rpf_l2_bc_thresh_i[15:0]"
+ */
+
+/* register address for bitfield l2_bc_thresh[f:0] */
+#define rpfl2bc_thresh_adr 0x00005100
+/* bitmask for bitfield l2_bc_thresh[f:0] */
+#define rpfl2bc_thresh_msk 0xffff0000
+/* inverted bitmask for bitfield l2_bc_thresh[f:0] */
+#define rpfl2bc_thresh_mskn 0x0000ffff
+/* lower bit position of bitfield l2_bc_thresh[f:0] */
+#define rpfl2bc_thresh_shift 16
+/* width of bitfield l2_bc_thresh[f:0] */
+#define rpfl2bc_thresh_width 16
+/* default value of bitfield l2_bc_thresh[f:0] */
+#define rpfl2bc_thresh_default 0x0
+
+/* rx l2_bc_en bitfield definitions
+ * preprocessor definitions for the bitfield "l2_bc_en".
+ * port="pif_rpf_l2_bc_en_i"
+ */
+
+/* register address for bitfield l2_bc_en */
+#define rpfl2bc_en_adr 0x00005100
+/* bitmask for bitfield l2_bc_en */
+#define rpfl2bc_en_msk 0x00000001
+/* inverted bitmask for bitfield l2_bc_en */
+#define rpfl2bc_en_mskn 0xfffffffe
+/* lower bit position of bitfield l2_bc_en */
+#define rpfl2bc_en_shift 0
+/* width of bitfield l2_bc_en */
+#define rpfl2bc_en_width 1
+/* default value of bitfield l2_bc_en */
+#define rpfl2bc_en_default 0x0
+
+/* rx l2_bc_act[2:0] bitfield definitions
+ * preprocessor definitions for the bitfield "l2_bc_act[2:0]".
+ * port="pif_rpf_l2_bc_act_i[2:0]"
+ */
+
+/* register address for bitfield l2_bc_act[2:0] */
+#define rpfl2bc_act_adr 0x00005100
+/* bitmask for bitfield l2_bc_act[2:0] */
+#define rpfl2bc_act_msk 0x00007000
+/* inverted bitmask for bitfield l2_bc_act[2:0] */
+#define rpfl2bc_act_mskn 0xffff8fff
+/* lower bit position of bitfield l2_bc_act[2:0] */
+#define rpfl2bc_act_shift 12
+/* width of bitfield l2_bc_act[2:0] */
+#define rpfl2bc_act_width 3
+/* default value of bitfield l2_bc_act[2:0] */
+#define rpfl2bc_act_default 0x0
+
+/* rx l2_mc_en{f} bitfield definitions
+ * preprocessor definitions for the bitfield "l2_mc_en{f}".
+ * parameter: filter {f} | stride size 0x4 | range [0, 7]
+ * port="pif_rpf_l2_mc_en_i[0]"
+ */
+
+/* register address for bitfield l2_mc_en{f} */
+#define rpfl2mc_enf_adr(filter) (0x00005250 + (filter) * 0x4)
+/* bitmask for bitfield l2_mc_en{f} */
+#define rpfl2mc_enf_msk 0x80000000
+/* inverted bitmask for bitfield l2_mc_en{f} */
+#define rpfl2mc_enf_mskn 0x7fffffff
+/* lower bit position of bitfield l2_mc_en{f} */
+#define rpfl2mc_enf_shift 31
+/* width of bitfield l2_mc_en{f} */
+#define rpfl2mc_enf_width 1
+/* default value of bitfield l2_mc_en{f} */
+#define rpfl2mc_enf_default 0x0
+
+/* rx l2_promis_mode bitfield definitions
+ * preprocessor definitions for the bitfield "l2_promis_mode".
+ * port="pif_rpf_l2_promis_mode_i"
+ */
+
+/* register address for bitfield l2_promis_mode */
+#define rpfl2promis_mode_adr 0x00005100
+/* bitmask for bitfield l2_promis_mode */
+#define rpfl2promis_mode_msk 0x00000008
+/* inverted bitmask for bitfield l2_promis_mode */
+#define rpfl2promis_mode_mskn 0xfffffff7
+/* lower bit position of bitfield l2_promis_mode */
+#define rpfl2promis_mode_shift 3
+/* width of bitfield l2_promis_mode */
+#define rpfl2promis_mode_width 1
+/* default value of bitfield l2_promis_mode */
+#define rpfl2promis_mode_default 0x0
+
+/* rx l2_uc_act{f}[2:0] bitfield definitions
+ * preprocessor definitions for the bitfield "l2_uc_act{f}[2:0]".
+ * parameter: filter {f} | stride size 0x8 | range [0, 37]
+ * port="pif_rpf_l2_uc_act0_i[2:0]"
+ */
+
+/* register address for bitfield l2_uc_act{f}[2:0] */
+#define rpfl2uc_actf_adr(filter) (0x00005114 + (filter) * 0x8)
+/* bitmask for bitfield l2_uc_act{f}[2:0] */
+#define rpfl2uc_actf_msk 0x00070000
+/* inverted bitmask for bitfield l2_uc_act{f}[2:0] */
+#define rpfl2uc_actf_mskn 0xfff8ffff
+/* lower bit position of bitfield l2_uc_act{f}[2:0] */
+#define rpfl2uc_actf_shift 16
+/* width of bitfield l2_uc_act{f}[2:0] */
+#define rpfl2uc_actf_width 3
+/* default value of bitfield l2_uc_act{f}[2:0] */
+#define rpfl2uc_actf_default 0x0
+
+/* rx l2_uc_en{f} bitfield definitions
+ * preprocessor definitions for the bitfield "l2_uc_en{f}".
+ * parameter: filter {f} | stride size 0x8 | range [0, 37]
+ * port="pif_rpf_l2_uc_en_i[0]"
+ */
+
+/* register address for bitfield l2_uc_en{f} */
+#define rpfl2uc_enf_adr(filter) (0x00005114 + (filter) * 0x8)
+/* bitmask for bitfield l2_uc_en{f} */
+#define rpfl2uc_enf_msk 0x80000000
+/* inverted bitmask for bitfield l2_uc_en{f} */
+#define rpfl2uc_enf_mskn 0x7fffffff
+/* lower bit position of bitfield l2_uc_en{f} */
+#define rpfl2uc_enf_shift 31
+/* width of bitfield l2_uc_en{f} */
+#define rpfl2uc_enf_width 1
+/* default value of bitfield l2_uc_en{f} */
+#define rpfl2uc_enf_default 0x0
+
+/* register address for bitfield l2_uc_da{f}_lsw[1f:0] */
+#define rpfl2uc_daflsw_adr(filter) (0x00005110 + (filter) * 0x8)
+/* register address for bitfield l2_uc_da{f}_msw[f:0] */
+#define rpfl2uc_dafmsw_adr(filter) (0x00005114 + (filter) * 0x8)
+/* bitmask for bitfield l2_uc_da{f}_msw[f:0] */
+#define rpfl2uc_dafmsw_msk 0x0000ffff
+/* lower bit position of bitfield l2_uc_da{f}_msw[f:0] */
+#define rpfl2uc_dafmsw_shift 0
+
+/* rx l2_mc_accept_all bitfield definitions
+ * Preprocessor definitions for the bitfield "l2_mc_accept_all".
+ * PORT="pif_rpf_l2_mc_all_accept_i"
+ */
+
+/* Register address for bitfield l2_mc_accept_all */
+#define rpfl2mc_accept_all_adr 0x00005270
+/* Bitmask for bitfield l2_mc_accept_all */
+#define rpfl2mc_accept_all_msk 0x00004000
+/* Inverted bitmask for bitfield l2_mc_accept_all */
+#define rpfl2mc_accept_all_mskn 0xFFFFBFFF
+/* Lower bit position of bitfield l2_mc_accept_all */
+#define rpfl2mc_accept_all_shift 14
+/* Width of bitfield l2_mc_accept_all */
+#define rpfl2mc_accept_all_width 1
+/* Default value of bitfield l2_mc_accept_all */
+#define rpfl2mc_accept_all_default 0x0
+
+/* width of bitfield rx_tc_up{t}[2:0] */
+#define rpf_rpb_rx_tc_upt_width 3
+/* default value of bitfield rx_tc_up{t}[2:0] */
+#define rpf_rpb_rx_tc_upt_default 0x0
+
+/* rx rss_key_addr[4:0] bitfield definitions
+ * preprocessor definitions for the bitfield "rss_key_addr[4:0]".
+ * port="pif_rpf_rss_key_addr_i[4:0]"
+ */
+
+/* register address for bitfield rss_key_addr[4:0] */
+#define rpf_rss_key_addr_adr 0x000054d0
+/* bitmask for bitfield rss_key_addr[4:0] */
+#define rpf_rss_key_addr_msk 0x0000001f
+/* inverted bitmask for bitfield rss_key_addr[4:0] */
+#define rpf_rss_key_addr_mskn 0xffffffe0
+/* lower bit position of bitfield rss_key_addr[4:0] */
+#define rpf_rss_key_addr_shift 0
+/* width of bitfield rss_key_addr[4:0] */
+#define rpf_rss_key_addr_width 5
+/* default value of bitfield rss_key_addr[4:0] */
+#define rpf_rss_key_addr_default 0x0
+
+/* rx rss_key_wr_data[1f:0] bitfield definitions
+ * preprocessor definitions for the bitfield "rss_key_wr_data[1f:0]".
+ * port="pif_rpf_rss_key_wr_data_i[31:0]"
+ */
+
+/* register address for bitfield rss_key_wr_data[1f:0] */
+#define rpf_rss_key_wr_data_adr 0x000054d4
+/* bitmask for bitfield rss_key_wr_data[1f:0] */
+#define rpf_rss_key_wr_data_msk 0xffffffff
+/* inverted bitmask for bitfield rss_key_wr_data[1f:0] */
+#define rpf_rss_key_wr_data_mskn 0x00000000
+/* lower bit position of bitfield rss_key_wr_data[1f:0] */
+#define rpf_rss_key_wr_data_shift 0
+/* width of bitfield rss_key_wr_data[1f:0] */
+#define rpf_rss_key_wr_data_width 32
+/* default value of bitfield rss_key_wr_data[1f:0] */
+#define rpf_rss_key_wr_data_default 0x0
+
+/* rx rss_key_wr_en_i bitfield definitions
+ * preprocessor definitions for the bitfield "rss_key_wr_en_i".
+ * port="pif_rpf_rss_key_wr_en_i"
+ */
+
+/* register address for bitfield rss_key_wr_en_i */
+#define rpf_rss_key_wr_eni_adr 0x000054d0
+/* bitmask for bitfield rss_key_wr_en_i */
+#define rpf_rss_key_wr_eni_msk 0x00000020
+/* inverted bitmask for bitfield rss_key_wr_en_i */
+#define rpf_rss_key_wr_eni_mskn 0xffffffdf
+/* lower bit position of bitfield rss_key_wr_en_i */
+#define rpf_rss_key_wr_eni_shift 5
+/* width of bitfield rss_key_wr_en_i */
+#define rpf_rss_key_wr_eni_width 1
+/* default value of bitfield rss_key_wr_en_i */
+#define rpf_rss_key_wr_eni_default 0x0
+
+/* rx rss_redir_addr[3:0] bitfield definitions
+ * preprocessor definitions for the bitfield "rss_redir_addr[3:0]".
+ * port="pif_rpf_rss_redir_addr_i[3:0]"
+ */
+
+/* register address for bitfield rss_redir_addr[3:0] */
+#define rpf_rss_redir_addr_adr 0x000054e0
+/* bitmask for bitfield rss_redir_addr[3:0] */
+#define rpf_rss_redir_addr_msk 0x0000000f
+/* inverted bitmask for bitfield rss_redir_addr[3:0] */
+#define rpf_rss_redir_addr_mskn 0xfffffff0
+/* lower bit position of bitfield rss_redir_addr[3:0] */
+#define rpf_rss_redir_addr_shift 0
+/* width of bitfield rss_redir_addr[3:0] */
+#define rpf_rss_redir_addr_width 4
+/* default value of bitfield rss_redir_addr[3:0] */
+#define rpf_rss_redir_addr_default 0x0
+
+/* rx rss_redir_wr_data[f:0] bitfield definitions
+ * preprocessor definitions for the bitfield "rss_redir_wr_data[f:0]".
+ * port="pif_rpf_rss_redir_wr_data_i[15:0]"
+ */
+
+/* register address for bitfield rss_redir_wr_data[f:0] */
+#define rpf_rss_redir_wr_data_adr 0x000054e4
+/* bitmask for bitfield rss_redir_wr_data[f:0] */
+#define rpf_rss_redir_wr_data_msk 0x0000ffff
+/* inverted bitmask for bitfield rss_redir_wr_data[f:0] */
+#define rpf_rss_redir_wr_data_mskn 0xffff0000
+/* lower bit position of bitfield rss_redir_wr_data[f:0] */
+#define rpf_rss_redir_wr_data_shift 0
+/* width of bitfield rss_redir_wr_data[f:0] */
+#define rpf_rss_redir_wr_data_width 16
+/* default value of bitfield rss_redir_wr_data[f:0] */
+#define rpf_rss_redir_wr_data_default 0x0
+
+/* rx rss_redir_wr_en_i bitfield definitions
+ * preprocessor definitions for the bitfield "rss_redir_wr_en_i".
+ * port="pif_rpf_rss_redir_wr_en_i"
+ */
+
+/* register address for bitfield rss_redir_wr_en_i */
+#define rpf_rss_redir_wr_eni_adr 0x000054e0
+/* bitmask for bitfield rss_redir_wr_en_i */
+#define rpf_rss_redir_wr_eni_msk 0x00000010
+/* inverted bitmask for bitfield rss_redir_wr_en_i */
+#define rpf_rss_redir_wr_eni_mskn 0xffffffef
+/* lower bit position of bitfield rss_redir_wr_en_i */
+#define rpf_rss_redir_wr_eni_shift 4
+/* width of bitfield rss_redir_wr_en_i */
+#define rpf_rss_redir_wr_eni_width 1
+/* default value of bitfield rss_redir_wr_en_i */
+#define rpf_rss_redir_wr_eni_default 0x0
+
+/* rx tpo_rpf_sys_loopback bitfield definitions
+ * preprocessor definitions for the bitfield "tpo_rpf_sys_loopback".
+ * port="pif_rpf_tpo_pkt_sys_lbk_i"
+ */
+
+/* register address for bitfield tpo_rpf_sys_loopback */
+#define rpf_tpo_rpf_sys_lbk_adr 0x00005000
+/* bitmask for bitfield tpo_rpf_sys_loopback */
+#define rpf_tpo_rpf_sys_lbk_msk 0x00000100
+/* inverted bitmask for bitfield tpo_rpf_sys_loopback */
+#define rpf_tpo_rpf_sys_lbk_mskn 0xfffffeff
+/* lower bit position of bitfield tpo_rpf_sys_loopback */
+#define rpf_tpo_rpf_sys_lbk_shift 8
+/* width of bitfield tpo_rpf_sys_loopback */
+#define rpf_tpo_rpf_sys_lbk_width 1
+/* default value of bitfield tpo_rpf_sys_loopback */
+#define rpf_tpo_rpf_sys_lbk_default 0x0
+
+/* rx vl_inner_tpid[f:0] bitfield definitions
+ * preprocessor definitions for the bitfield "vl_inner_tpid[f:0]".
+ * port="pif_rpf_vl_inner_tpid_i[15:0]"
+ */
+
+/* register address for bitfield vl_inner_tpid[f:0] */
+#define rpf_vl_inner_tpid_adr 0x00005284
+/* bitmask for bitfield vl_inner_tpid[f:0] */
+#define rpf_vl_inner_tpid_msk 0x0000ffff
+/* inverted bitmask for bitfield vl_inner_tpid[f:0] */
+#define rpf_vl_inner_tpid_mskn 0xffff0000
+/* lower bit position of bitfield vl_inner_tpid[f:0] */
+#define rpf_vl_inner_tpid_shift 0
+/* width of bitfield vl_inner_tpid[f:0] */
+#define rpf_vl_inner_tpid_width 16
+/* default value of bitfield vl_inner_tpid[f:0] */
+#define rpf_vl_inner_tpid_default 0x8100
+
+/* rx vl_outer_tpid[f:0] bitfield definitions
+ * preprocessor definitions for the bitfield "vl_outer_tpid[f:0]".
+ * port="pif_rpf_vl_outer_tpid_i[15:0]"
+ */
+
+/* register address for bitfield vl_outer_tpid[f:0] */
+#define rpf_vl_outer_tpid_adr 0x00005284
+/* bitmask for bitfield vl_outer_tpid[f:0] */
+#define rpf_vl_outer_tpid_msk 0xffff0000
+/* inverted bitmask for bitfield vl_outer_tpid[f:0] */
+#define rpf_vl_outer_tpid_mskn 0x0000ffff
+/* lower bit position of bitfield vl_outer_tpid[f:0] */
+#define rpf_vl_outer_tpid_shift 16
+/* width of bitfield vl_outer_tpid[f:0] */
+#define rpf_vl_outer_tpid_width 16
+/* default value of bitfield vl_outer_tpid[f:0] */
+#define rpf_vl_outer_tpid_default 0x88a8
+
+/* rx vl_promis_mode bitfield definitions
+ * preprocessor definitions for the bitfield "vl_promis_mode".
+ * port="pif_rpf_vl_promis_mode_i"
+ */
+
+/* register address for bitfield vl_promis_mode */
+#define rpf_vl_promis_mode_adr 0x00005280
+/* bitmask for bitfield vl_promis_mode */
+#define rpf_vl_promis_mode_msk 0x00000002
+/* inverted bitmask for bitfield vl_promis_mode */
+#define rpf_vl_promis_mode_mskn 0xfffffffd
+/* lower bit position of bitfield vl_promis_mode */
+#define rpf_vl_promis_mode_shift 1
+/* width of bitfield vl_promis_mode */
+#define rpf_vl_promis_mode_width 1
+/* default value of bitfield vl_promis_mode */
+#define rpf_vl_promis_mode_default 0x0
+
+/* RX vl_accept_untagged_mode Bitfield Definitions
+ * Preprocessor definitions for the bitfield "vl_accept_untagged_mode".
+ * PORT="pif_rpf_vl_accept_untagged_i"
+ */
+
+/* Register address for bitfield vl_accept_untagged_mode */
+#define rpf_vl_accept_untagged_mode_adr 0x00005280
+/* Bitmask for bitfield vl_accept_untagged_mode */
+#define rpf_vl_accept_untagged_mode_msk 0x00000004
+/* Inverted bitmask for bitfield vl_accept_untagged_mode */
+#define rpf_vl_accept_untagged_mode_mskn 0xFFFFFFFB
+/* Lower bit position of bitfield vl_accept_untagged_mode */
+#define rpf_vl_accept_untagged_mode_shift 2
+/* Width of bitfield vl_accept_untagged_mode */
+#define rpf_vl_accept_untagged_mode_width 1
+/* Default value of bitfield vl_accept_untagged_mode */
+#define rpf_vl_accept_untagged_mode_default 0x0
+
+/* rX vl_untagged_act[2:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "vl_untagged_act[2:0]".
+ * PORT="pif_rpf_vl_untagged_act_i[2:0]"
+ */
+
+/* Register address for bitfield vl_untagged_act[2:0] */
+#define rpf_vl_untagged_act_adr 0x00005280
+/* Bitmask for bitfield vl_untagged_act[2:0] */
+#define rpf_vl_untagged_act_msk 0x00000038
+/* Inverted bitmask for bitfield vl_untagged_act[2:0] */
+#define rpf_vl_untagged_act_mskn 0xFFFFFFC7
+/* Lower bit position of bitfield vl_untagged_act[2:0] */
+#define rpf_vl_untagged_act_shift 3
+/* Width of bitfield vl_untagged_act[2:0] */
+#define rpf_vl_untagged_act_width 3
+/* Default value of bitfield vl_untagged_act[2:0] */
+#define rpf_vl_untagged_act_default 0x0
+
+/* RX vl_en{F} Bitfield Definitions
+ * Preprocessor definitions for the bitfield "vl_en{F}".
+ * Parameter: filter {F} | stride size 0x4 | range [0, 15]
+ * PORT="pif_rpf_vl_en_i[0]"
+ */
+
+/* Register address for bitfield vl_en{F} */
+#define rpf_vl_en_f_adr(filter) (0x00005290 + (filter) * 0x4)
+/* Bitmask for bitfield vl_en{F} */
+#define rpf_vl_en_f_msk 0x80000000
+/* Inverted bitmask for bitfield vl_en{F} */
+#define rpf_vl_en_f_mskn 0x7FFFFFFF
+/* Lower bit position of bitfield vl_en{F} */
+#define rpf_vl_en_f_shift 31
+/* Width of bitfield vl_en{F} */
+#define rpf_vl_en_f_width 1
+/* Default value of bitfield vl_en{F} */
+#define rpf_vl_en_f_default 0x0
+
+/* RX vl_act{F}[2:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "vl_act{F}[2:0]".
+ * Parameter: filter {F} | stride size 0x4 | range [0, 15]
+ * PORT="pif_rpf_vl_act0_i[2:0]"
+ */
+
+/* Register address for bitfield vl_act{F}[2:0] */
+#define rpf_vl_act_f_adr(filter) (0x00005290 + (filter) * 0x4)
+/* Bitmask for bitfield vl_act{F}[2:0] */
+#define rpf_vl_act_f_msk 0x00070000
+/* Inverted bitmask for bitfield vl_act{F}[2:0] */
+#define rpf_vl_act_f_mskn 0xFFF8FFFF
+/* Lower bit position of bitfield vl_act{F}[2:0] */
+#define rpf_vl_act_f_shift 16
+/* Width of bitfield vl_act{F}[2:0] */
+#define rpf_vl_act_f_width 3
+/* Default value of bitfield vl_act{F}[2:0] */
+#define rpf_vl_act_f_default 0x0
+
+/* RX vl_id{F}[B:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "vl_id{F}[B:0]".
+ * Parameter: filter {F} | stride size 0x4 | range [0, 15]
+ * PORT="pif_rpf_vl_id0_i[11:0]"
+ */
+
+/* Register address for bitfield vl_id{F}[B:0] */
+#define rpf_vl_id_f_adr(filter) (0x00005290 + (filter) * 0x4)
+/* Bitmask for bitfield vl_id{F}[B:0] */
+#define rpf_vl_id_f_msk 0x00000FFF
+/* Inverted bitmask for bitfield vl_id{F}[B:0] */
+#define rpf_vl_id_f_mskn 0xFFFFF000
+/* Lower bit position of bitfield vl_id{F}[B:0] */
+#define rpf_vl_id_f_shift 0
+/* Width of bitfield vl_id{F}[B:0] */
+#define rpf_vl_id_f_width 12
+/* Default value of bitfield vl_id{F}[B:0] */
+#define rpf_vl_id_f_default 0x0
+
+/* RX et_en{F} Bitfield Definitions
+ * Preprocessor definitions for the bitfield "et_en{F}".
+ * Parameter: filter {F} | stride size 0x4 | range [0, 15]
+ * PORT="pif_rpf_et_en_i[0]"
+ */
+
+/* Register address for bitfield et_en{F} */
+#define rpf_et_en_f_adr(filter) (0x00005300 + (filter) * 0x4)
+/* Bitmask for bitfield et_en{F} */
+#define rpf_et_en_f_msk 0x80000000
+/* Inverted bitmask for bitfield et_en{F} */
+#define rpf_et_en_f_mskn 0x7FFFFFFF
+/* Lower bit position of bitfield et_en{F} */
+#define rpf_et_en_f_shift 31
+/* Width of bitfield et_en{F} */
+#define rpf_et_en_f_width 1
+/* Default value of bitfield et_en{F} */
+#define rpf_et_en_f_default 0x0
+
+/* rx et_en{f} bitfield definitions
+ * preprocessor definitions for the bitfield "et_en{f}".
+ * parameter: filter {f} | stride size 0x4 | range [0, 15]
+ * port="pif_rpf_et_en_i[0]"
+ */
+
+/* register address for bitfield et_en{f} */
+#define rpf_et_enf_adr(filter) (0x00005300 + (filter) * 0x4)
+/* bitmask for bitfield et_en{f} */
+#define rpf_et_enf_msk 0x80000000
+/* inverted bitmask for bitfield et_en{f} */
+#define rpf_et_enf_mskn 0x7fffffff
+/* lower bit position of bitfield et_en{f} */
+#define rpf_et_enf_shift 31
+/* width of bitfield et_en{f} */
+#define rpf_et_enf_width 1
+/* default value of bitfield et_en{f} */
+#define rpf_et_enf_default 0x0
+
+/* rx et_up{f}_en bitfield definitions
+ * preprocessor definitions for the bitfield "et_up{f}_en".
+ * parameter: filter {f} | stride size 0x4 | range [0, 15]
+ * port="pif_rpf_et_up_en_i[0]"
+ */
+
+/* register address for bitfield et_up{f}_en */
+#define rpf_et_upfen_adr(filter) (0x00005300 + (filter) * 0x4)
+/* bitmask for bitfield et_up{f}_en */
+#define rpf_et_upfen_msk 0x40000000
+/* inverted bitmask for bitfield et_up{f}_en */
+#define rpf_et_upfen_mskn 0xbfffffff
+/* lower bit position of bitfield et_up{f}_en */
+#define rpf_et_upfen_shift 30
+/* width of bitfield et_up{f}_en */
+#define rpf_et_upfen_width 1
+/* default value of bitfield et_up{f}_en */
+#define rpf_et_upfen_default 0x0
+
+/* rx et_rxq{f}_en bitfield definitions
+ * preprocessor definitions for the bitfield "et_rxq{f}_en".
+ * parameter: filter {f} | stride size 0x4 | range [0, 15]
+ * port="pif_rpf_et_rxq_en_i[0]"
+ */
+
+/* register address for bitfield et_rxq{f}_en */
+#define rpf_et_rxqfen_adr(filter) (0x00005300 + (filter) * 0x4)
+/* bitmask for bitfield et_rxq{f}_en */
+#define rpf_et_rxqfen_msk 0x20000000
+/* inverted bitmask for bitfield et_rxq{f}_en */
+#define rpf_et_rxqfen_mskn 0xdfffffff
+/* lower bit position of bitfield et_rxq{f}_en */
+#define rpf_et_rxqfen_shift 29
+/* width of bitfield et_rxq{f}_en */
+#define rpf_et_rxqfen_width 1
+/* default value of bitfield et_rxq{f}_en */
+#define rpf_et_rxqfen_default 0x0
+
+/* rx et_up{f}[2:0] bitfield definitions
+ * preprocessor definitions for the bitfield "et_up{f}[2:0]".
+ * parameter: filter {f} | stride size 0x4 | range [0, 15]
+ * port="pif_rpf_et_up0_i[2:0]"
+ */
+
+/* register address for bitfield et_up{f}[2:0] */
+#define rpf_et_upf_adr(filter) (0x00005300 + (filter) * 0x4)
+/* bitmask for bitfield et_up{f}[2:0] */
+#define rpf_et_upf_msk 0x1c000000
+/* inverted bitmask for bitfield et_up{f}[2:0] */
+#define rpf_et_upf_mskn 0xe3ffffff
+/* lower bit position of bitfield et_up{f}[2:0] */
+#define rpf_et_upf_shift 26
+/* width of bitfield et_up{f}[2:0] */
+#define rpf_et_upf_width 3
+/* default value of bitfield et_up{f}[2:0] */
+#define rpf_et_upf_default 0x0
+
+/* rx et_rxq{f}[4:0] bitfield definitions
+ * preprocessor definitions for the bitfield "et_rxq{f}[4:0]".
+ * parameter: filter {f} | stride size 0x4 | range [0, 15]
+ * port="pif_rpf_et_rxq0_i[4:0]"
+ */
+
+/* register address for bitfield et_rxq{f}[4:0] */
+#define rpf_et_rxqf_adr(filter) (0x00005300 + (filter) * 0x4)
+/* bitmask for bitfield et_rxq{f}[4:0] */
+#define rpf_et_rxqf_msk 0x01f00000
+/* inverted bitmask for bitfield et_rxq{f}[4:0] */
+#define rpf_et_rxqf_mskn 0xfe0fffff
+/* lower bit position of bitfield et_rxq{f}[4:0] */
+#define rpf_et_rxqf_shift 20
+/* width of bitfield et_rxq{f}[4:0] */
+#define rpf_et_rxqf_width 5
+/* default value of bitfield et_rxq{f}[4:0] */
+#define rpf_et_rxqf_default 0x0
+
+/* rx et_mng_rxq{f} bitfield definitions
+ * preprocessor definitions for the bitfield "et_mng_rxq{f}".
+ * parameter: filter {f} | stride size 0x4 | range [0, 15]
+ * port="pif_rpf_et_mng_rxq_i[0]"
+ */
+
+/* register address for bitfield et_mng_rxq{f} */
+#define rpf_et_mng_rxqf_adr(filter) (0x00005300 + (filter) * 0x4)
+/* bitmask for bitfield et_mng_rxq{f} */
+#define rpf_et_mng_rxqf_msk 0x00080000
+/* inverted bitmask for bitfield et_mng_rxq{f} */
+#define rpf_et_mng_rxqf_mskn 0xfff7ffff
+/* lower bit position of bitfield et_mng_rxq{f} */
+#define rpf_et_mng_rxqf_shift 19
+/* width of bitfield et_mng_rxq{f} */
+#define rpf_et_mng_rxqf_width 1
+/* default value of bitfield et_mng_rxq{f} */
+#define rpf_et_mng_rxqf_default 0x0
+
+/* rx et_act{f}[2:0] bitfield definitions
+ * preprocessor definitions for the bitfield "et_act{f}[2:0]".
+ * parameter: filter {f} | stride size 0x4 | range [0, 15]
+ * port="pif_rpf_et_act0_i[2:0]"
+ */
+
+/* register address for bitfield et_act{f}[2:0] */
+#define rpf_et_actf_adr(filter) (0x00005300 + (filter) * 0x4)
+/* bitmask for bitfield et_act{f}[2:0] */
+#define rpf_et_actf_msk 0x00070000
+/* inverted bitmask for bitfield et_act{f}[2:0] */
+#define rpf_et_actf_mskn 0xfff8ffff
+/* lower bit position of bitfield et_act{f}[2:0] */
+#define rpf_et_actf_shift 16
+/* width of bitfield et_act{f}[2:0] */
+#define rpf_et_actf_width 3
+/* default value of bitfield et_act{f}[2:0] */
+#define rpf_et_actf_default 0x0
+
+/* rx et_val{f}[f:0] bitfield definitions
+ * preprocessor definitions for the bitfield "et_val{f}[f:0]".
+ * parameter: filter {f} | stride size 0x4 | range [0, 15]
+ * port="pif_rpf_et_val0_i[15:0]"
+ */
+
+/* register address for bitfield et_val{f}[f:0] */
+#define rpf_et_valf_adr(filter) (0x00005300 + (filter) * 0x4)
+/* bitmask for bitfield et_val{f}[f:0] */
+#define rpf_et_valf_msk 0x0000ffff
+/* inverted bitmask for bitfield et_val{f}[f:0] */
+#define rpf_et_valf_mskn 0xffff0000
+/* lower bit position of bitfield et_val{f}[f:0] */
+#define rpf_et_valf_shift 0
+/* width of bitfield et_val{f}[f:0] */
+#define rpf_et_valf_width 16
+/* default value of bitfield et_val{f}[f:0] */
+#define rpf_et_valf_default 0x0
+
+/* rx ipv4_chk_en bitfield definitions
+ * preprocessor definitions for the bitfield "ipv4_chk_en".
+ * port="pif_rpo_ipv4_chk_en_i"
+ */
+
+/* register address for bitfield ipv4_chk_en */
+#define rpo_ipv4chk_en_adr 0x00005580
+/* bitmask for bitfield ipv4_chk_en */
+#define rpo_ipv4chk_en_msk 0x00000002
+/* inverted bitmask for bitfield ipv4_chk_en */
+#define rpo_ipv4chk_en_mskn 0xfffffffd
+/* lower bit position of bitfield ipv4_chk_en */
+#define rpo_ipv4chk_en_shift 1
+/* width of bitfield ipv4_chk_en */
+#define rpo_ipv4chk_en_width 1
+/* default value of bitfield ipv4_chk_en */
+#define rpo_ipv4chk_en_default 0x0
+
+/* rx desc{d}_vl_strip bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_vl_strip".
+ * parameter: descriptor {d} | stride size 0x20 | range [0, 31]
+ * port="pif_rpo_desc_vl_strip_i[0]"
+ */
+
+/* register address for bitfield desc{d}_vl_strip */
+#define rpo_descdvl_strip_adr(descriptor) (0x00005b08 + (descriptor) * 0x20)
+/* bitmask for bitfield desc{d}_vl_strip */
+#define rpo_descdvl_strip_msk 0x20000000
+/* inverted bitmask for bitfield desc{d}_vl_strip */
+#define rpo_descdvl_strip_mskn 0xdfffffff
+/* lower bit position of bitfield desc{d}_vl_strip */
+#define rpo_descdvl_strip_shift 29
+/* width of bitfield desc{d}_vl_strip */
+#define rpo_descdvl_strip_width 1
+/* default value of bitfield desc{d}_vl_strip */
+#define rpo_descdvl_strip_default 0x0
+
+/* rx l4_chk_en bitfield definitions
+ * preprocessor definitions for the bitfield "l4_chk_en".
+ * port="pif_rpo_l4_chk_en_i"
+ */
+
+/* register address for bitfield l4_chk_en */
+#define rpol4chk_en_adr 0x00005580
+/* bitmask for bitfield l4_chk_en */
+#define rpol4chk_en_msk 0x00000001
+/* inverted bitmask for bitfield l4_chk_en */
+#define rpol4chk_en_mskn 0xfffffffe
+/* lower bit position of bitfield l4_chk_en */
+#define rpol4chk_en_shift 0
+/* width of bitfield l4_chk_en */
+#define rpol4chk_en_width 1
+/* default value of bitfield l4_chk_en */
+#define rpol4chk_en_default 0x0
+
+/* rx reg_res_dsbl bitfield definitions
+ * preprocessor definitions for the bitfield "reg_res_dsbl".
+ * port="pif_rx_reg_res_dsbl_i"
+ */
+
+/* register address for bitfield reg_res_dsbl */
+#define rx_reg_res_dsbl_adr 0x00005000
+/* bitmask for bitfield reg_res_dsbl */
+#define rx_reg_res_dsbl_msk 0x20000000
+/* inverted bitmask for bitfield reg_res_dsbl */
+#define rx_reg_res_dsbl_mskn 0xdfffffff
+/* lower bit position of bitfield reg_res_dsbl */
+#define rx_reg_res_dsbl_shift 29
+/* width of bitfield reg_res_dsbl */
+#define rx_reg_res_dsbl_width 1
+/* default value of bitfield reg_res_dsbl */
+#define rx_reg_res_dsbl_default 0x1
+
+/* tx dca{d}_cpuid[7:0] bitfield definitions
+ * preprocessor definitions for the bitfield "dca{d}_cpuid[7:0]".
+ * parameter: dca {d} | stride size 0x4 | range [0, 31]
+ * port="pif_tdm_dca0_cpuid_i[7:0]"
+ */
+
+/* register address for bitfield dca{d}_cpuid[7:0] */
+#define tdm_dcadcpuid_adr(dca) (0x00008400 + (dca) * 0x4)
+/* bitmask for bitfield dca{d}_cpuid[7:0] */
+#define tdm_dcadcpuid_msk 0x000000ff
+/* inverted bitmask for bitfield dca{d}_cpuid[7:0] */
+#define tdm_dcadcpuid_mskn 0xffffff00
+/* lower bit position of bitfield dca{d}_cpuid[7:0] */
+#define tdm_dcadcpuid_shift 0
+/* width of bitfield dca{d}_cpuid[7:0] */
+#define tdm_dcadcpuid_width 8
+/* default value of bitfield dca{d}_cpuid[7:0] */
+#define tdm_dcadcpuid_default 0x0
+
+/* tx lso_en[1f:0] bitfield definitions
+ * preprocessor definitions for the bitfield "lso_en[1f:0]".
+ * port="pif_tdm_lso_en_i[31:0]"
+ */
+
+/* register address for bitfield lso_en[1f:0] */
+#define tdm_lso_en_adr 0x00007810
+/* bitmask for bitfield lso_en[1f:0] */
+#define tdm_lso_en_msk 0xffffffff
+/* inverted bitmask for bitfield lso_en[1f:0] */
+#define tdm_lso_en_mskn 0x00000000
+/* lower bit position of bitfield lso_en[1f:0] */
+#define tdm_lso_en_shift 0
+/* width of bitfield lso_en[1f:0] */
+#define tdm_lso_en_width 32
+/* default value of bitfield lso_en[1f:0] */
+#define tdm_lso_en_default 0x0
+
+/* tx dca_en bitfield definitions
+ * preprocessor definitions for the bitfield "dca_en".
+ * port="pif_tdm_dca_en_i"
+ */
+
+/* register address for bitfield dca_en */
+#define tdm_dca_en_adr 0x00008480
+/* bitmask for bitfield dca_en */
+#define tdm_dca_en_msk 0x80000000
+/* inverted bitmask for bitfield dca_en */
+#define tdm_dca_en_mskn 0x7fffffff
+/* lower bit position of bitfield dca_en */
+#define tdm_dca_en_shift 31
+/* width of bitfield dca_en */
+#define tdm_dca_en_width 1
+/* default value of bitfield dca_en */
+#define tdm_dca_en_default 0x1
+
+/* tx dca_mode[3:0] bitfield definitions
+ * preprocessor definitions for the bitfield "dca_mode[3:0]".
+ * port="pif_tdm_dca_mode_i[3:0]"
+ */
+
+/* register address for bitfield dca_mode[3:0] */
+#define tdm_dca_mode_adr 0x00008480
+/* bitmask for bitfield dca_mode[3:0] */
+#define tdm_dca_mode_msk 0x0000000f
+/* inverted bitmask for bitfield dca_mode[3:0] */
+#define tdm_dca_mode_mskn 0xfffffff0
+/* lower bit position of bitfield dca_mode[3:0] */
+#define tdm_dca_mode_shift 0
+/* width of bitfield dca_mode[3:0] */
+#define tdm_dca_mode_width 4
+/* default value of bitfield dca_mode[3:0] */
+#define tdm_dca_mode_default 0x0
+
+/* tx dca{d}_desc_en bitfield definitions
+ * preprocessor definitions for the bitfield "dca{d}_desc_en".
+ * parameter: dca {d} | stride size 0x4 | range [0, 31]
+ * port="pif_tdm_dca_desc_en_i[0]"
+ */
+
+/* register address for bitfield dca{d}_desc_en */
+#define tdm_dcaddesc_en_adr(dca) (0x00008400 + (dca) * 0x4)
+/* bitmask for bitfield dca{d}_desc_en */
+#define tdm_dcaddesc_en_msk 0x80000000
+/* inverted bitmask for bitfield dca{d}_desc_en */
+#define tdm_dcaddesc_en_mskn 0x7fffffff
+/* lower bit position of bitfield dca{d}_desc_en */
+#define tdm_dcaddesc_en_shift 31
+/* width of bitfield dca{d}_desc_en */
+#define tdm_dcaddesc_en_width 1
+/* default value of bitfield dca{d}_desc_en */
+#define tdm_dcaddesc_en_default 0x0
+
+/* tx desc{d}_en bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_en".
+ * parameter: descriptor {d} | stride size 0x40 | range [0, 31]
+ * port="pif_tdm_desc_en_i[0]"
+ */
+
+/* register address for bitfield desc{d}_en */
+#define tdm_descden_adr(descriptor) (0x00007c08 + (descriptor) * 0x40)
+/* bitmask for bitfield desc{d}_en */
+#define tdm_descden_msk 0x80000000
+/* inverted bitmask for bitfield desc{d}_en */
+#define tdm_descden_mskn 0x7fffffff
+/* lower bit position of bitfield desc{d}_en */
+#define tdm_descden_shift 31
+/* width of bitfield desc{d}_en */
+#define tdm_descden_width 1
+/* default value of bitfield desc{d}_en */
+#define tdm_descden_default 0x0
+
+/* tx desc{d}_hd[c:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_hd[c:0]".
+ * parameter: descriptor {d} | stride size 0x40 | range [0, 31]
+ * port="tdm_pif_desc0_hd_o[12:0]"
+ */
+
+/* register address for bitfield desc{d}_hd[c:0] */
+#define tdm_descdhd_adr(descriptor) (0x00007c0c + (descriptor) * 0x40)
+/* bitmask for bitfield desc{d}_hd[c:0] */
+#define tdm_descdhd_msk 0x00001fff
+/* inverted bitmask for bitfield desc{d}_hd[c:0] */
+#define tdm_descdhd_mskn 0xffffe000
+/* lower bit position of bitfield desc{d}_hd[c:0] */
+#define tdm_descdhd_shift 0
+/* width of bitfield desc{d}_hd[c:0] */
+#define tdm_descdhd_width 13
+
+/* tx desc{d}_len[9:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_len[9:0]".
+ * parameter: descriptor {d} | stride size 0x40 | range [0, 31]
+ * port="pif_tdm_desc0_len_i[9:0]"
+ */
+
+/* register address for bitfield desc{d}_len[9:0] */
+#define tdm_descdlen_adr(descriptor) (0x00007c08 + (descriptor) * 0x40)
+/* bitmask for bitfield desc{d}_len[9:0] */
+#define tdm_descdlen_msk 0x00001ff8
+/* inverted bitmask for bitfield desc{d}_len[9:0] */
+#define tdm_descdlen_mskn 0xffffe007
+/* lower bit position of bitfield desc{d}_len[9:0] */
+#define tdm_descdlen_shift 3
+/* width of bitfield desc{d}_len[9:0] */
+#define tdm_descdlen_width 10
+/* default value of bitfield desc{d}_len[9:0] */
+#define tdm_descdlen_default 0x0
+
+/* tx int_desc_wrb_en bitfield definitions
+ * preprocessor definitions for the bitfield "int_desc_wrb_en".
+ * port="pif_tdm_int_desc_wrb_en_i"
+ */
+
+/* register address for bitfield int_desc_wrb_en */
+#define tdm_int_desc_wrb_en_adr 0x00007b40
+/* bitmask for bitfield int_desc_wrb_en */
+#define tdm_int_desc_wrb_en_msk 0x00000002
+/* inverted bitmask for bitfield int_desc_wrb_en */
+#define tdm_int_desc_wrb_en_mskn 0xfffffffd
+/* lower bit position of bitfield int_desc_wrb_en */
+#define tdm_int_desc_wrb_en_shift 1
+/* width of bitfield int_desc_wrb_en */
+#define tdm_int_desc_wrb_en_width 1
+/* default value of bitfield int_desc_wrb_en */
+#define tdm_int_desc_wrb_en_default 0x0
+
+/* tx desc{d}_wrb_thresh[6:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc{d}_wrb_thresh[6:0]".
+ * parameter: descriptor {d} | stride size 0x40 | range [0, 31]
+ * port="pif_tdm_desc0_wrb_thresh_i[6:0]"
+ */
+
+/* register address for bitfield desc{d}_wrb_thresh[6:0] */
+#define tdm_descdwrb_thresh_adr(descriptor) (0x00007c18 + (descriptor) * 0x40)
+/* bitmask for bitfield desc{d}_wrb_thresh[6:0] */
+#define tdm_descdwrb_thresh_msk 0x00007f00
+/* inverted bitmask for bitfield desc{d}_wrb_thresh[6:0] */
+#define tdm_descdwrb_thresh_mskn 0xffff80ff
+/* lower bit position of bitfield desc{d}_wrb_thresh[6:0] */
+#define tdm_descdwrb_thresh_shift 8
+/* width of bitfield desc{d}_wrb_thresh[6:0] */
+#define tdm_descdwrb_thresh_width 7
+/* default value of bitfield desc{d}_wrb_thresh[6:0] */
+#define tdm_descdwrb_thresh_default 0x0
+
+/* tx lso_tcp_flag_first[b:0] bitfield definitions
+ * preprocessor definitions for the bitfield "lso_tcp_flag_first[b:0]".
+ * port="pif_thm_lso_tcp_flag_first_i[11:0]"
+ */
+
+/* register address for bitfield lso_tcp_flag_first[b:0] */
+#define thm_lso_tcp_flag_first_adr 0x00007820
+/* bitmask for bitfield lso_tcp_flag_first[b:0] */
+#define thm_lso_tcp_flag_first_msk 0x00000fff
+/* inverted bitmask for bitfield lso_tcp_flag_first[b:0] */
+#define thm_lso_tcp_flag_first_mskn 0xfffff000
+/* lower bit position of bitfield lso_tcp_flag_first[b:0] */
+#define thm_lso_tcp_flag_first_shift 0
+/* width of bitfield lso_tcp_flag_first[b:0] */
+#define thm_lso_tcp_flag_first_width 12
+/* default value of bitfield lso_tcp_flag_first[b:0] */
+#define thm_lso_tcp_flag_first_default 0x0
+
+/* tx lso_tcp_flag_last[b:0] bitfield definitions
+ * preprocessor definitions for the bitfield "lso_tcp_flag_last[b:0]".
+ * port="pif_thm_lso_tcp_flag_last_i[11:0]"
+ */
+
+/* register address for bitfield lso_tcp_flag_last[b:0] */
+#define thm_lso_tcp_flag_last_adr 0x00007824
+/* bitmask for bitfield lso_tcp_flag_last[b:0] */
+#define thm_lso_tcp_flag_last_msk 0x00000fff
+/* inverted bitmask for bitfield lso_tcp_flag_last[b:0] */
+#define thm_lso_tcp_flag_last_mskn 0xfffff000
+/* lower bit position of bitfield lso_tcp_flag_last[b:0] */
+#define thm_lso_tcp_flag_last_shift 0
+/* width of bitfield lso_tcp_flag_last[b:0] */
+#define thm_lso_tcp_flag_last_width 12
+/* default value of bitfield lso_tcp_flag_last[b:0] */
+#define thm_lso_tcp_flag_last_default 0x0
+
+/* tx lso_tcp_flag_mid[b:0] bitfield definitions
+ * preprocessor definitions for the bitfield "lso_tcp_flag_mid[b:0]".
+ * port="pif_thm_lso_tcp_flag_mid_i[11:0]"
+ */
+
+/* Register address for bitfield lro_rsc_max[1F:0] */
+#define rpo_lro_rsc_max_adr 0x00005598
+/* Bitmask for bitfield lro_rsc_max[1F:0] */
+#define rpo_lro_rsc_max_msk 0xFFFFFFFF
+/* Inverted bitmask for bitfield lro_rsc_max[1F:0] */
+#define rpo_lro_rsc_max_mskn 0x00000000
+/* Lower bit position of bitfield lro_rsc_max[1F:0] */
+#define rpo_lro_rsc_max_shift 0
+/* Width of bitfield lro_rsc_max[1F:0] */
+#define rpo_lro_rsc_max_width 32
+/* Default value of bitfield lro_rsc_max[1F:0] */
+#define rpo_lro_rsc_max_default 0x0
+
+/* RX lro_en[1F:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "lro_en[1F:0]".
+ * PORT="pif_rpo_lro_en_i[31:0]"
+ */
+
+/* Register address for bitfield lro_en[1F:0] */
+#define rpo_lro_en_adr 0x00005590
+/* Bitmask for bitfield lro_en[1F:0] */
+#define rpo_lro_en_msk 0xFFFFFFFF
+/* Inverted bitmask for bitfield lro_en[1F:0] */
+#define rpo_lro_en_mskn 0x00000000
+/* Lower bit position of bitfield lro_en[1F:0] */
+#define rpo_lro_en_shift 0
+/* Width of bitfield lro_en[1F:0] */
+#define rpo_lro_en_width 32
+/* Default value of bitfield lro_en[1F:0] */
+#define rpo_lro_en_default 0x0
+
+/* RX lro_ptopt_en Bitfield Definitions
+ * Preprocessor definitions for the bitfield "lro_ptopt_en".
+ * PORT="pif_rpo_lro_ptopt_en_i"
+ */
+
+/* Register address for bitfield lro_ptopt_en */
+#define rpo_lro_ptopt_en_adr 0x00005594
+/* Bitmask for bitfield lro_ptopt_en */
+#define rpo_lro_ptopt_en_msk 0x00008000
+/* Inverted bitmask for bitfield lro_ptopt_en */
+#define rpo_lro_ptopt_en_mskn 0xFFFF7FFF
+/* Lower bit position of bitfield lro_ptopt_en */
+#define rpo_lro_ptopt_en_shift 15
+/* Width of bitfield lro_ptopt_en */
+#define rpo_lro_ptopt_en_width 1
+/* Default value of bitfield lro_ptopt_en */
+#define rpo_lro_ptopt_en_defalt 0x1
+
+/* RX lro_q_ses_lmt Bitfield Definitions
+ * Preprocessor definitions for the bitfield "lro_q_ses_lmt".
+ * PORT="pif_rpo_lro_q_ses_lmt_i[1:0]"
+ */
+
+/* Register address for bitfield lro_q_ses_lmt */
+#define rpo_lro_qses_lmt_adr 0x00005594
+/* Bitmask for bitfield lro_q_ses_lmt */
+#define rpo_lro_qses_lmt_msk 0x00003000
+/* Inverted bitmask for bitfield lro_q_ses_lmt */
+#define rpo_lro_qses_lmt_mskn 0xFFFFCFFF
+/* Lower bit position of bitfield lro_q_ses_lmt */
+#define rpo_lro_qses_lmt_shift 12
+/* Width of bitfield lro_q_ses_lmt */
+#define rpo_lro_qses_lmt_width 2
+/* Default value of bitfield lro_q_ses_lmt */
+#define rpo_lro_qses_lmt_default 0x1
+
+/* RX lro_tot_dsc_lmt[1:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "lro_tot_dsc_lmt[1:0]".
+ * PORT="pif_rpo_lro_tot_dsc_lmt_i[1:0]"
+ */
+
+/* Register address for bitfield lro_tot_dsc_lmt[1:0] */
+#define rpo_lro_tot_dsc_lmt_adr 0x00005594
+/* Bitmask for bitfield lro_tot_dsc_lmt[1:0] */
+#define rpo_lro_tot_dsc_lmt_msk 0x00000060
+/* Inverted bitmask for bitfield lro_tot_dsc_lmt[1:0] */
+#define rpo_lro_tot_dsc_lmt_mskn 0xFFFFFF9F
+/* Lower bit position of bitfield lro_tot_dsc_lmt[1:0] */
+#define rpo_lro_tot_dsc_lmt_shift 5
+/* Width of bitfield lro_tot_dsc_lmt[1:0] */
+#define rpo_lro_tot_dsc_lmt_width 2
+/* Default value of bitfield lro_tot_dsc_lmt[1:0] */
+#define rpo_lro_tot_dsc_lmt_defalt 0x1
+
+/* RX lro_pkt_min[4:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "lro_pkt_min[4:0]".
+ * PORT="pif_rpo_lro_pkt_min_i[4:0]"
+ */
+
+/* Register address for bitfield lro_pkt_min[4:0] */
+#define rpo_lro_pkt_min_adr 0x00005594
+/* Bitmask for bitfield lro_pkt_min[4:0] */
+#define rpo_lro_pkt_min_msk 0x0000001F
+/* Inverted bitmask for bitfield lro_pkt_min[4:0] */
+#define rpo_lro_pkt_min_mskn 0xFFFFFFE0
+/* Lower bit position of bitfield lro_pkt_min[4:0] */
+#define rpo_lro_pkt_min_shift 0
+/* Width of bitfield lro_pkt_min[4:0] */
+#define rpo_lro_pkt_min_width 5
+/* Default value of bitfield lro_pkt_min[4:0] */
+#define rpo_lro_pkt_min_default 0x8
+
+/* Width of bitfield lro{L}_des_max[1:0] */
+#define rpo_lro_ldes_max_width 2
+/* Default value of bitfield lro{L}_des_max[1:0] */
+#define rpo_lro_ldes_max_default 0x0
+
+/* RX lro_tb_div[11:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "lro_tb_div[11:0]".
+ * PORT="pif_rpo_lro_tb_div_i[11:0]"
+ */
+
+/* Register address for bitfield lro_tb_div[11:0] */
+#define rpo_lro_tb_div_adr 0x00005620
+/* Bitmask for bitfield lro_tb_div[11:0] */
+#define rpo_lro_tb_div_msk 0xFFF00000
+/* Inverted bitmask for bitfield lro_tb_div[11:0] */
+#define rpo_lro_tb_div_mskn 0x000FFFFF
+/* Lower bit position of bitfield lro_tb_div[11:0] */
+#define rpo_lro_tb_div_shift 20
+/* Width of bitfield lro_tb_div[11:0] */
+#define rpo_lro_tb_div_width 12
+/* Default value of bitfield lro_tb_div[11:0] */
+#define rpo_lro_tb_div_default 0xC35
+
+/* RX lro_ina_ival[9:0] Bitfield Definitions
+ *   Preprocessor definitions for the bitfield "lro_ina_ival[9:0]".
+ *   PORT="pif_rpo_lro_ina_ival_i[9:0]"
+ */
+
+/* Register address for bitfield lro_ina_ival[9:0] */
+#define rpo_lro_ina_ival_adr 0x00005620
+/* Bitmask for bitfield lro_ina_ival[9:0] */
+#define rpo_lro_ina_ival_msk 0x000FFC00
+/* Inverted bitmask for bitfield lro_ina_ival[9:0] */
+#define rpo_lro_ina_ival_mskn 0xFFF003FF
+/* Lower bit position of bitfield lro_ina_ival[9:0] */
+#define rpo_lro_ina_ival_shift 10
+/* Width of bitfield lro_ina_ival[9:0] */
+#define rpo_lro_ina_ival_width 10
+/* Default value of bitfield lro_ina_ival[9:0] */
+#define rpo_lro_ina_ival_default 0xA
+
+/* RX lro_max_ival[9:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "lro_max_ival[9:0]".
+ * PORT="pif_rpo_lro_max_ival_i[9:0]"
+ */
+
+/* Register address for bitfield lro_max_ival[9:0] */
+#define rpo_lro_max_ival_adr 0x00005620
+/* Bitmask for bitfield lro_max_ival[9:0] */
+#define rpo_lro_max_ival_msk 0x000003FF
+/* Inverted bitmask for bitfield lro_max_ival[9:0] */
+#define rpo_lro_max_ival_mskn 0xFFFFFC00
+/* Lower bit position of bitfield lro_max_ival[9:0] */
+#define rpo_lro_max_ival_shift 0
+/* Width of bitfield lro_max_ival[9:0] */
+#define rpo_lro_max_ival_width 10
+/* Default value of bitfield lro_max_ival[9:0] */
+#define rpo_lro_max_ival_default 0x19
+
+/* TX dca{D}_cpuid[7:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "dca{D}_cpuid[7:0]".
+ * Parameter: DCA {D} | stride size 0x4 | range [0, 31]
+ * PORT="pif_tdm_dca0_cpuid_i[7:0]"
+ */
+
+/* Register address for bitfield dca{D}_cpuid[7:0] */
+#define tdm_dca_dcpuid_adr(dca) (0x00008400 + (dca) * 0x4)
+/* Bitmask for bitfield dca{D}_cpuid[7:0] */
+#define tdm_dca_dcpuid_msk 0x000000FF
+/* Inverted bitmask for bitfield dca{D}_cpuid[7:0] */
+#define tdm_dca_dcpuid_mskn 0xFFFFFF00
+/* Lower bit position of bitfield dca{D}_cpuid[7:0] */
+#define tdm_dca_dcpuid_shift 0
+/* Width of bitfield dca{D}_cpuid[7:0] */
+#define tdm_dca_dcpuid_width 8
+/* Default value of bitfield dca{D}_cpuid[7:0] */
+#define tdm_dca_dcpuid_default 0x0
+
+/* TX dca{D}_desc_en Bitfield Definitions
+ * Preprocessor definitions for the bitfield "dca{D}_desc_en".
+ * Parameter: DCA {D} | stride size 0x4 | range [0, 31]
+ * PORT="pif_tdm_dca_desc_en_i[0]"
+ */
+
+/* Register address for bitfield dca{D}_desc_en */
+#define tdm_dca_ddesc_en_adr(dca) (0x00008400 + (dca) * 0x4)
+/* Bitmask for bitfield dca{D}_desc_en */
+#define tdm_dca_ddesc_en_msk 0x80000000
+/* Inverted bitmask for bitfield dca{D}_desc_en */
+#define tdm_dca_ddesc_en_mskn 0x7FFFFFFF
+/* Lower bit position of bitfield dca{D}_desc_en */
+#define tdm_dca_ddesc_en_shift 31
+/* Width of bitfield dca{D}_desc_en */
+#define tdm_dca_ddesc_en_width 1
+/* Default value of bitfield dca{D}_desc_en */
+#define tdm_dca_ddesc_en_default 0x0
+
+/* TX desc{D}_en Bitfield Definitions
+ * Preprocessor definitions for the bitfield "desc{D}_en".
+ * Parameter: descriptor {D} | stride size 0x40 | range [0, 31]
+ * PORT="pif_tdm_desc_en_i[0]"
+ */
+
+/* Register address for bitfield desc{D}_en */
+#define tdm_desc_den_adr(descriptor) (0x00007C08 + (descriptor) * 0x40)
+/* Bitmask for bitfield desc{D}_en */
+#define tdm_desc_den_msk 0x80000000
+/* Inverted bitmask for bitfield desc{D}_en */
+#define tdm_desc_den_mskn 0x7FFFFFFF
+/* Lower bit position of bitfield desc{D}_en */
+#define tdm_desc_den_shift 31
+/* Width of bitfield desc{D}_en */
+#define tdm_desc_den_width 1
+/* Default value of bitfield desc{D}_en */
+#define tdm_desc_den_default 0x0
+
+/* TX desc{D}_hd[C:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "desc{D}_hd[C:0]".
+ * Parameter: descriptor {D} | stride size 0x40 | range [0, 31]
+ * PORT="tdm_pif_desc0_hd_o[12:0]"
+ */
+
+/* Register address for bitfield desc{D}_hd[C:0] */
+#define tdm_desc_dhd_adr(descriptor) (0x00007C0C + (descriptor) * 0x40)
+/* Bitmask for bitfield desc{D}_hd[C:0] */
+#define tdm_desc_dhd_msk 0x00001FFF
+/* Inverted bitmask for bitfield desc{D}_hd[C:0] */
+#define tdm_desc_dhd_mskn 0xFFFFE000
+/* Lower bit position of bitfield desc{D}_hd[C:0] */
+#define tdm_desc_dhd_shift 0
+/* Width of bitfield desc{D}_hd[C:0] */
+#define tdm_desc_dhd_width 13
+
+/* TX desc{D}_len[9:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "desc{D}_len[9:0]".
+ * Parameter: descriptor {D} | stride size 0x40 | range [0, 31]
+ * PORT="pif_tdm_desc0_len_i[9:0]"
+ */
+
+/* Register address for bitfield desc{D}_len[9:0] */
+#define tdm_desc_dlen_adr(descriptor) (0x00007C08 + (descriptor) * 0x40)
+/* Bitmask for bitfield desc{D}_len[9:0] */
+#define tdm_desc_dlen_msk 0x00001FF8
+/* Inverted bitmask for bitfield desc{D}_len[9:0] */
+#define tdm_desc_dlen_mskn 0xFFFFE007
+/* Lower bit position of bitfield desc{D}_len[9:0] */
+#define tdm_desc_dlen_shift 3
+/* Width of bitfield desc{D}_len[9:0] */
+#define tdm_desc_dlen_width 10
+/* Default value of bitfield desc{D}_len[9:0] */
+#define tdm_desc_dlen_default 0x0
+
+/* TX desc{D}_wrb_thresh[6:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "desc{D}_wrb_thresh[6:0]".
+ * Parameter: descriptor {D} | stride size 0x40 | range [0, 31]
+ * PORT="pif_tdm_desc0_wrb_thresh_i[6:0]"
+ */
+
+/* Register address for bitfield desc{D}_wrb_thresh[6:0] */
+#define tdm_desc_dwrb_thresh_adr(descriptor) \
+	(0x00007C18 + (descriptor) * 0x40)
+/* Bitmask for bitfield desc{D}_wrb_thresh[6:0] */
+#define tdm_desc_dwrb_thresh_msk 0x00007F00
+/* Inverted bitmask for bitfield desc{D}_wrb_thresh[6:0] */
+#define tdm_desc_dwrb_thresh_mskn 0xFFFF80FF
+/* Lower bit position of bitfield desc{D}_wrb_thresh[6:0] */
+#define tdm_desc_dwrb_thresh_shift 8
+/* Width of bitfield desc{D}_wrb_thresh[6:0] */
+#define tdm_desc_dwrb_thresh_width 7
+/* Default value of bitfield desc{D}_wrb_thresh[6:0] */
+#define tdm_desc_dwrb_thresh_default 0x0
+
+/* TX tdm_int_mod_en Bitfield Definitions
+ * Preprocessor definitions for the bitfield "tdm_int_mod_en".
+ * PORT="pif_tdm_int_mod_en_i"
+ */
+
+/* Register address for bitfield tdm_int_mod_en */
+#define tdm_int_mod_en_adr 0x00007B40
+/* Bitmask for bitfield tdm_int_mod_en */
+#define tdm_int_mod_en_msk 0x00000010
+/* Inverted bitmask for bitfield tdm_int_mod_en */
+#define tdm_int_mod_en_mskn 0xFFFFFFEF
+/* Lower bit position of bitfield tdm_int_mod_en */
+#define tdm_int_mod_en_shift 4
+/* Width of bitfield tdm_int_mod_en */
+#define tdm_int_mod_en_width 1
+/* Default value of bitfield tdm_int_mod_en */
+#define tdm_int_mod_en_default 0x0
+
+/* TX lso_tcp_flag_mid[B:0] Bitfield Definitions
+ * Preprocessor definitions for the bitfield "lso_tcp_flag_mid[B:0]".
+ * PORT="pif_thm_lso_tcp_flag_mid_i[11:0]"
+ */
+/* register address for bitfield lso_tcp_flag_mid[b:0] */
+#define thm_lso_tcp_flag_mid_adr 0x00007820
+/* bitmask for bitfield lso_tcp_flag_mid[b:0] */
+#define thm_lso_tcp_flag_mid_msk 0x0fff0000
+/* inverted bitmask for bitfield lso_tcp_flag_mid[b:0] */
+#define thm_lso_tcp_flag_mid_mskn 0xf000ffff
+/* lower bit position of bitfield lso_tcp_flag_mid[b:0] */
+#define thm_lso_tcp_flag_mid_shift 16
+/* width of bitfield lso_tcp_flag_mid[b:0] */
+#define thm_lso_tcp_flag_mid_width 12
+/* default value of bitfield lso_tcp_flag_mid[b:0] */
+#define thm_lso_tcp_flag_mid_default 0x0
+
+/* tx tx_buf_en bitfield definitions
+ * preprocessor definitions for the bitfield "tx_buf_en".
+ * port="pif_tpb_tx_buf_en_i"
+ */
+
+/* register address for bitfield tx_buf_en */
+#define tpb_tx_buf_en_adr 0x00007900
+/* bitmask for bitfield tx_buf_en */
+#define tpb_tx_buf_en_msk 0x00000001
+/* inverted bitmask for bitfield tx_buf_en */
+#define tpb_tx_buf_en_mskn 0xfffffffe
+/* lower bit position of bitfield tx_buf_en */
+#define tpb_tx_buf_en_shift 0
+/* width of bitfield tx_buf_en */
+#define tpb_tx_buf_en_width 1
+/* default value of bitfield tx_buf_en */
+#define tpb_tx_buf_en_default 0x0
+
+/* tx tx{b}_hi_thresh[c:0] bitfield definitions
+ * preprocessor definitions for the bitfield "tx{b}_hi_thresh[c:0]".
+ * parameter: buffer {b} | stride size 0x10 | range [0, 7]
+ * port="pif_tpb_tx0_hi_thresh_i[12:0]"
+ */
+
+/* register address for bitfield tx{b}_hi_thresh[c:0] */
+#define tpb_txbhi_thresh_adr(buffer) (0x00007914 + (buffer) * 0x10)
+/* bitmask for bitfield tx{b}_hi_thresh[c:0] */
+#define tpb_txbhi_thresh_msk 0x1fff0000
+/* inverted bitmask for bitfield tx{b}_hi_thresh[c:0] */
+#define tpb_txbhi_thresh_mskn 0xe000ffff
+/* lower bit position of bitfield tx{b}_hi_thresh[c:0] */
+#define tpb_txbhi_thresh_shift 16
+/* width of bitfield tx{b}_hi_thresh[c:0] */
+#define tpb_txbhi_thresh_width 13
+/* default value of bitfield tx{b}_hi_thresh[c:0] */
+#define tpb_txbhi_thresh_default 0x0
+
+/* tx tx{b}_lo_thresh[c:0] bitfield definitions
+ * preprocessor definitions for the bitfield "tx{b}_lo_thresh[c:0]".
+ * parameter: buffer {b} | stride size 0x10 | range [0, 7]
+ * port="pif_tpb_tx0_lo_thresh_i[12:0]"
+ */
+
+/* register address for bitfield tx{b}_lo_thresh[c:0] */
+#define tpb_txblo_thresh_adr(buffer) (0x00007914 + (buffer) * 0x10)
+/* bitmask for bitfield tx{b}_lo_thresh[c:0] */
+#define tpb_txblo_thresh_msk 0x00001fff
+/* inverted bitmask for bitfield tx{b}_lo_thresh[c:0] */
+#define tpb_txblo_thresh_mskn 0xffffe000
+/* lower bit position of bitfield tx{b}_lo_thresh[c:0] */
+#define tpb_txblo_thresh_shift 0
+/* width of bitfield tx{b}_lo_thresh[c:0] */
+#define tpb_txblo_thresh_width 13
+/* default value of bitfield tx{b}_lo_thresh[c:0] */
+#define tpb_txblo_thresh_default 0x0
+
+/* tx dma_sys_loopback bitfield definitions
+ * preprocessor definitions for the bitfield "dma_sys_loopback".
+ * port="pif_tpb_dma_sys_lbk_i"
+ */
+
+/* register address for bitfield dma_sys_loopback */
+#define tpb_dma_sys_lbk_adr 0x00007000
+/* bitmask for bitfield dma_sys_loopback */
+#define tpb_dma_sys_lbk_msk 0x00000040
+/* inverted bitmask for bitfield dma_sys_loopback */
+#define tpb_dma_sys_lbk_mskn 0xffffffbf
+/* lower bit position of bitfield dma_sys_loopback */
+#define tpb_dma_sys_lbk_shift 6
+/* width of bitfield dma_sys_loopback */
+#define tpb_dma_sys_lbk_width 1
+/* default value of bitfield dma_sys_loopback */
+#define tpb_dma_sys_lbk_default 0x0
+
+/* tx tx{b}_buf_size[7:0] bitfield definitions
+ * preprocessor definitions for the bitfield "tx{b}_buf_size[7:0]".
+ * parameter: buffer {b} | stride size 0x10 | range [0, 7]
+ * port="pif_tpb_tx0_buf_size_i[7:0]"
+ */
+
+/* register address for bitfield tx{b}_buf_size[7:0] */
+#define tpb_txbbuf_size_adr(buffer) (0x00007910 + (buffer) * 0x10)
+/* bitmask for bitfield tx{b}_buf_size[7:0] */
+#define tpb_txbbuf_size_msk 0x000000ff
+/* inverted bitmask for bitfield tx{b}_buf_size[7:0] */
+#define tpb_txbbuf_size_mskn 0xffffff00
+/* lower bit position of bitfield tx{b}_buf_size[7:0] */
+#define tpb_txbbuf_size_shift 0
+/* width of bitfield tx{b}_buf_size[7:0] */
+#define tpb_txbbuf_size_width 8
+/* default value of bitfield tx{b}_buf_size[7:0] */
+#define tpb_txbbuf_size_default 0x0
+
+/* tx tx_scp_ins_en bitfield definitions
+ * preprocessor definitions for the bitfield "tx_scp_ins_en".
+ * port="pif_tpb_scp_ins_en_i"
+ */
+
+/* register address for bitfield tx_scp_ins_en */
+#define tpb_tx_scp_ins_en_adr 0x00007900
+/* bitmask for bitfield tx_scp_ins_en */
+#define tpb_tx_scp_ins_en_msk 0x00000004
+/* inverted bitmask for bitfield tx_scp_ins_en */
+#define tpb_tx_scp_ins_en_mskn 0xfffffffb
+/* lower bit position of bitfield tx_scp_ins_en */
+#define tpb_tx_scp_ins_en_shift 2
+/* width of bitfield tx_scp_ins_en */
+#define tpb_tx_scp_ins_en_width 1
+/* default value of bitfield tx_scp_ins_en */
+#define tpb_tx_scp_ins_en_default 0x0
+
+/* tx ipv4_chk_en bitfield definitions
+ * preprocessor definitions for the bitfield "ipv4_chk_en".
+ * port="pif_tpo_ipv4_chk_en_i"
+ */
+
+/* register address for bitfield ipv4_chk_en */
+#define tpo_ipv4chk_en_adr 0x00007800
+/* bitmask for bitfield ipv4_chk_en */
+#define tpo_ipv4chk_en_msk 0x00000002
+/* inverted bitmask for bitfield ipv4_chk_en */
+#define tpo_ipv4chk_en_mskn 0xfffffffd
+/* lower bit position of bitfield ipv4_chk_en */
+#define tpo_ipv4chk_en_shift 1
+/* width of bitfield ipv4_chk_en */
+#define tpo_ipv4chk_en_width 1
+/* default value of bitfield ipv4_chk_en */
+#define tpo_ipv4chk_en_default 0x0
+
+/* tx l4_chk_en bitfield definitions
+ * preprocessor definitions for the bitfield "l4_chk_en".
+ * port="pif_tpo_l4_chk_en_i"
+ */
+
+/* register address for bitfield l4_chk_en */
+#define tpol4chk_en_adr 0x00007800
+/* bitmask for bitfield l4_chk_en */
+#define tpol4chk_en_msk 0x00000001
+/* inverted bitmask for bitfield l4_chk_en */
+#define tpol4chk_en_mskn 0xfffffffe
+/* lower bit position of bitfield l4_chk_en */
+#define tpol4chk_en_shift 0
+/* width of bitfield l4_chk_en */
+#define tpol4chk_en_width 1
+/* default value of bitfield l4_chk_en */
+#define tpol4chk_en_default 0x0
+
+/* tx pkt_sys_loopback bitfield definitions
+ * preprocessor definitions for the bitfield "pkt_sys_loopback".
+ * port="pif_tpo_pkt_sys_lbk_i"
+ */
+
+/* register address for bitfield pkt_sys_loopback */
+#define tpo_pkt_sys_lbk_adr 0x00007000
+/* bitmask for bitfield pkt_sys_loopback */
+#define tpo_pkt_sys_lbk_msk 0x00000080
+/* inverted bitmask for bitfield pkt_sys_loopback */
+#define tpo_pkt_sys_lbk_mskn 0xffffff7f
+/* lower bit position of bitfield pkt_sys_loopback */
+#define tpo_pkt_sys_lbk_shift 7
+/* width of bitfield pkt_sys_loopback */
+#define tpo_pkt_sys_lbk_width 1
+/* default value of bitfield pkt_sys_loopback */
+#define tpo_pkt_sys_lbk_default 0x0
+
+/* tx data_tc_arb_mode bitfield definitions
+ * preprocessor definitions for the bitfield "data_tc_arb_mode".
+ * port="pif_tps_data_tc_arb_mode_i"
+ */
+
+/* register address for bitfield data_tc_arb_mode */
+#define tps_data_tc_arb_mode_adr 0x00007100
+/* bitmask for bitfield data_tc_arb_mode */
+#define tps_data_tc_arb_mode_msk 0x00000001
+/* inverted bitmask for bitfield data_tc_arb_mode */
+#define tps_data_tc_arb_mode_mskn 0xfffffffe
+/* lower bit position of bitfield data_tc_arb_mode */
+#define tps_data_tc_arb_mode_shift 0
+/* width of bitfield data_tc_arb_mode */
+#define tps_data_tc_arb_mode_width 1
+/* default value of bitfield data_tc_arb_mode */
+#define tps_data_tc_arb_mode_default 0x0
+
+/* tx desc_rate_ta_rst bitfield definitions
+ * preprocessor definitions for the bitfield "desc_rate_ta_rst".
+ * port="pif_tps_desc_rate_ta_rst_i"
+ */
+
+/* register address for bitfield desc_rate_ta_rst */
+#define tps_desc_rate_ta_rst_adr 0x00007310
+/* bitmask for bitfield desc_rate_ta_rst */
+#define tps_desc_rate_ta_rst_msk 0x80000000
+/* inverted bitmask for bitfield desc_rate_ta_rst */
+#define tps_desc_rate_ta_rst_mskn 0x7fffffff
+/* lower bit position of bitfield desc_rate_ta_rst */
+#define tps_desc_rate_ta_rst_shift 31
+/* width of bitfield desc_rate_ta_rst */
+#define tps_desc_rate_ta_rst_width 1
+/* default value of bitfield desc_rate_ta_rst */
+#define tps_desc_rate_ta_rst_default 0x0
+
+/* tx desc_rate_limit[a:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc_rate_limit[a:0]".
+ * port="pif_tps_desc_rate_lim_i[10:0]"
+ */
+
+/* register address for bitfield desc_rate_limit[a:0] */
+#define tps_desc_rate_lim_adr 0x00007310
+/* bitmask for bitfield desc_rate_limit[a:0] */
+#define tps_desc_rate_lim_msk 0x000007ff
+/* inverted bitmask for bitfield desc_rate_limit[a:0] */
+#define tps_desc_rate_lim_mskn 0xfffff800
+/* lower bit position of bitfield desc_rate_limit[a:0] */
+#define tps_desc_rate_lim_shift 0
+/* width of bitfield desc_rate_limit[a:0] */
+#define tps_desc_rate_lim_width 11
+/* default value of bitfield desc_rate_limit[a:0] */
+#define tps_desc_rate_lim_default 0x0
+
+/* tx desc_tc_arb_mode[1:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc_tc_arb_mode[1:0]".
+ * port="pif_tps_desc_tc_arb_mode_i[1:0]"
+ */
+
+/* register address for bitfield desc_tc_arb_mode[1:0] */
+#define tps_desc_tc_arb_mode_adr 0x00007200
+/* bitmask for bitfield desc_tc_arb_mode[1:0] */
+#define tps_desc_tc_arb_mode_msk 0x00000003
+/* inverted bitmask for bitfield desc_tc_arb_mode[1:0] */
+#define tps_desc_tc_arb_mode_mskn 0xfffffffc
+/* lower bit position of bitfield desc_tc_arb_mode[1:0] */
+#define tps_desc_tc_arb_mode_shift 0
+/* width of bitfield desc_tc_arb_mode[1:0] */
+#define tps_desc_tc_arb_mode_width 2
+/* default value of bitfield desc_tc_arb_mode[1:0] */
+#define tps_desc_tc_arb_mode_default 0x0
+
+/* tx desc_tc{t}_credit_max[b:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc_tc{t}_credit_max[b:0]".
+ * parameter: tc {t} | stride size 0x4 | range [0, 7]
+ * port="pif_tps_desc_tc0_credit_max_i[11:0]"
+ */
+
+/* register address for bitfield desc_tc{t}_credit_max[b:0] */
+#define tps_desc_tctcredit_max_adr(tc) (0x00007210 + (tc) * 0x4)
+/* bitmask for bitfield desc_tc{t}_credit_max[b:0] */
+#define tps_desc_tctcredit_max_msk 0x0fff0000
+/* inverted bitmask for bitfield desc_tc{t}_credit_max[b:0] */
+#define tps_desc_tctcredit_max_mskn 0xf000ffff
+/* lower bit position of bitfield desc_tc{t}_credit_max[b:0] */
+#define tps_desc_tctcredit_max_shift 16
+/* width of bitfield desc_tc{t}_credit_max[b:0] */
+#define tps_desc_tctcredit_max_width 12
+/* default value of bitfield desc_tc{t}_credit_max[b:0] */
+#define tps_desc_tctcredit_max_default 0x0
+
+/* tx desc_tc{t}_weight[8:0] bitfield definitions
+ * preprocessor definitions for the bitfield "desc_tc{t}_weight[8:0]".
+ * parameter: tc {t} | stride size 0x4 | range [0, 7]
+ * port="pif_tps_desc_tc0_weight_i[8:0]"
+ */
+
+/* register address for bitfield desc_tc{t}_weight[8:0] */
+#define tps_desc_tctweight_adr(tc) (0x00007210 + (tc) * 0x4)
+/* bitmask for bitfield desc_tc{t}_weight[8:0] */
+#define tps_desc_tctweight_msk 0x000001ff
+/* inverted bitmask for bitfield desc_tc{t}_weight[8:0] */
+#define tps_desc_tctweight_mskn 0xfffffe00
+/* lower bit position of bitfield desc_tc{t}_weight[8:0] */
+#define tps_desc_tctweight_shift 0
+/* width of bitfield desc_tc{t}_weight[8:0] */
+#define tps_desc_tctweight_width 9
+/* default value of bitfield desc_tc{t}_weight[8:0] */
+#define tps_desc_tctweight_default 0x0
+
+/* tx desc_vm_arb_mode bitfield definitions
+ * preprocessor definitions for the bitfield "desc_vm_arb_mode".
+ * port="pif_tps_desc_vm_arb_mode_i"
+ */
+
+/* register address for bitfield desc_vm_arb_mode */
+#define tps_desc_vm_arb_mode_adr 0x00007300
+/* bitmask for bitfield desc_vm_arb_mode */
+#define tps_desc_vm_arb_mode_msk 0x00000001
+/* inverted bitmask for bitfield desc_vm_arb_mode */
+#define tps_desc_vm_arb_mode_mskn 0xfffffffe
+/* lower bit position of bitfield desc_vm_arb_mode */
+#define tps_desc_vm_arb_mode_shift 0
+/* width of bitfield desc_vm_arb_mode */
+#define tps_desc_vm_arb_mode_width 1
+/* default value of bitfield desc_vm_arb_mode */
+#define tps_desc_vm_arb_mode_default 0x0
+
+/* tx data_tc{t}_credit_max[b:0] bitfield definitions
+ * preprocessor definitions for the bitfield "data_tc{t}_credit_max[b:0]".
+ * parameter: tc {t} | stride size 0x4 | range [0, 7]
+ * port="pif_tps_data_tc0_credit_max_i[11:0]"
+ */
+
+/* register address for bitfield data_tc{t}_credit_max[b:0] */
+#define tps_data_tctcredit_max_adr(tc) (0x00007110 + (tc) * 0x4)
+/* bitmask for bitfield data_tc{t}_credit_max[b:0] */
+#define tps_data_tctcredit_max_msk 0x0fff0000
+/* inverted bitmask for bitfield data_tc{t}_credit_max[b:0] */
+#define tps_data_tctcredit_max_mskn 0xf000ffff
+/* lower bit position of bitfield data_tc{t}_credit_max[b:0] */
+#define tps_data_tctcredit_max_shift 16
+/* width of bitfield data_tc{t}_credit_max[b:0] */
+#define tps_data_tctcredit_max_width 12
+/* default value of bitfield data_tc{t}_credit_max[b:0] */
+#define tps_data_tctcredit_max_default 0x0
+
+/* tx data_tc{t}_weight[8:0] bitfield definitions
+ * preprocessor definitions for the bitfield "data_tc{t}_weight[8:0]".
+ * parameter: tc {t} | stride size 0x4 | range [0, 7]
+ * port="pif_tps_data_tc0_weight_i[8:0]"
+ */
+
+/* register address for bitfield data_tc{t}_weight[8:0] */
+#define tps_data_tctweight_adr(tc) (0x00007110 + (tc) * 0x4)
+/* bitmask for bitfield data_tc{t}_weight[8:0] */
+#define tps_data_tctweight_msk 0x000001ff
+/* inverted bitmask for bitfield data_tc{t}_weight[8:0] */
+#define tps_data_tctweight_mskn 0xfffffe00
+/* lower bit position of bitfield data_tc{t}_weight[8:0] */
+#define tps_data_tctweight_shift 0
+/* width of bitfield data_tc{t}_weight[8:0] */
+#define tps_data_tctweight_width 9
+/* default value of bitfield data_tc{t}_weight[8:0] */
+#define tps_data_tctweight_default 0x0
+
+/* tx reg_res_dsbl bitfield definitions
+ * preprocessor definitions for the bitfield "reg_res_dsbl".
+ * port="pif_tx_reg_res_dsbl_i"
+ */
+
+/* register address for bitfield reg_res_dsbl */
+#define tx_reg_res_dsbl_adr 0x00007000
+/* bitmask for bitfield reg_res_dsbl */
+#define tx_reg_res_dsbl_msk 0x20000000
+/* inverted bitmask for bitfield reg_res_dsbl */
+#define tx_reg_res_dsbl_mskn 0xdfffffff
+/* lower bit position of bitfield reg_res_dsbl */
+#define tx_reg_res_dsbl_shift 29
+/* width of bitfield reg_res_dsbl */
+#define tx_reg_res_dsbl_width 1
+/* default value of bitfield reg_res_dsbl */
+#define tx_reg_res_dsbl_default 0x1
+
+/* mac_phy register access busy bitfield definitions
+ * preprocessor definitions for the bitfield "register access busy".
+ * port="msm_pif_reg_busy_o"
+ */
+
+/* register address for bitfield register access busy */
+#define msm_reg_access_busy_adr 0x00004400
+/* bitmask for bitfield register access busy */
+#define msm_reg_access_busy_msk 0x00001000
+/* inverted bitmask for bitfield register access busy */
+#define msm_reg_access_busy_mskn 0xffffefff
+/* lower bit position of bitfield register access busy */
+#define msm_reg_access_busy_shift 12
+/* width of bitfield register access busy */
+#define msm_reg_access_busy_width 1
+
+/* mac_phy msm register address[7:0] bitfield definitions
+ * preprocessor definitions for the bitfield "msm register address[7:0]".
+ * port="pif_msm_reg_addr_i[7:0]"
+ */
+
+/* register address for bitfield msm register address[7:0] */
+#define msm_reg_addr_adr 0x00004400
+/* bitmask for bitfield msm register address[7:0] */
+#define msm_reg_addr_msk 0x000000ff
+/* inverted bitmask for bitfield msm register address[7:0] */
+#define msm_reg_addr_mskn 0xffffff00
+/* lower bit position of bitfield msm register address[7:0] */
+#define msm_reg_addr_shift 0
+/* width of bitfield msm register address[7:0] */
+#define msm_reg_addr_width 8
+/* default value of bitfield msm register address[7:0] */
+#define msm_reg_addr_default 0x0
+
+/* mac_phy register read strobe bitfield definitions
+ * preprocessor definitions for the bitfield "register read strobe".
+ * port="pif_msm_reg_rden_i"
+ */
+
+/* register address for bitfield register read strobe */
+#define msm_reg_rd_strobe_adr 0x00004400
+/* bitmask for bitfield register read strobe */
+#define msm_reg_rd_strobe_msk 0x00000200
+/* inverted bitmask for bitfield register read strobe */
+#define msm_reg_rd_strobe_mskn 0xfffffdff
+/* lower bit position of bitfield register read strobe */
+#define msm_reg_rd_strobe_shift 9
+/* width of bitfield register read strobe */
+#define msm_reg_rd_strobe_width 1
+/* default value of bitfield register read strobe */
+#define msm_reg_rd_strobe_default 0x0
+
+/* mac_phy msm register read data[31:0] bitfield definitions
+ * preprocessor definitions for the bitfield "msm register read data[31:0]".
+ * port="msm_pif_reg_rd_data_o[31:0]"
+ */
+
+/* register address for bitfield msm register read data[31:0] */
+#define msm_reg_rd_data_adr 0x00004408
+/* bitmask for bitfield msm register read data[31:0] */
+#define msm_reg_rd_data_msk 0xffffffff
+/* inverted bitmask for bitfield msm register read data[31:0] */
+#define msm_reg_rd_data_mskn 0x00000000
+/* lower bit position of bitfield msm register read data[31:0] */
+#define msm_reg_rd_data_shift 0
+/* width of bitfield msm register read data[31:0] */
+#define msm_reg_rd_data_width 32
+
+/* mac_phy msm register write data[31:0] bitfield definitions
+ * preprocessor definitions for the bitfield "msm register write data[31:0]".
+ * port="pif_msm_reg_wr_data_i[31:0]"
+ */
+
+/* register address for bitfield msm register write data[31:0] */
+#define msm_reg_wr_data_adr 0x00004404
+/* bitmask for bitfield msm register write data[31:0] */
+#define msm_reg_wr_data_msk 0xffffffff
+/* inverted bitmask for bitfield msm register write data[31:0] */
+#define msm_reg_wr_data_mskn 0x00000000
+/* lower bit position of bitfield msm register write data[31:0] */
+#define msm_reg_wr_data_shift 0
+/* width of bitfield msm register write data[31:0] */
+#define msm_reg_wr_data_width 32
+/* default value of bitfield msm register write data[31:0] */
+#define msm_reg_wr_data_default 0x0
+
+/* mac_phy register write strobe bitfield definitions
+ * preprocessor definitions for the bitfield "register write strobe".
+ * port="pif_msm_reg_wren_i"
+ */
+
+/* register address for bitfield register write strobe */
+#define msm_reg_wr_strobe_adr 0x00004400
+/* bitmask for bitfield register write strobe */
+#define msm_reg_wr_strobe_msk 0x00000100
+/* inverted bitmask for bitfield register write strobe */
+#define msm_reg_wr_strobe_mskn 0xfffffeff
+/* lower bit position of bitfield register write strobe */
+#define msm_reg_wr_strobe_shift 8
+/* width of bitfield register write strobe */
+#define msm_reg_wr_strobe_width 1
+/* default value of bitfield register write strobe */
+#define msm_reg_wr_strobe_default 0x0
+
+/* mif soft reset bitfield definitions
+ * preprocessor definitions for the bitfield "soft reset".
+ * port="pif_glb_res_i"
+ */
+
+/* register address for bitfield soft reset */
+#define glb_soft_res_adr 0x00000000
+/* bitmask for bitfield soft reset */
+#define glb_soft_res_msk 0x00008000
+/* inverted bitmask for bitfield soft reset */
+#define glb_soft_res_mskn 0xffff7fff
+/* lower bit position of bitfield soft reset */
+#define glb_soft_res_shift 15
+/* width of bitfield soft reset */
+#define glb_soft_res_width 1
+/* default value of bitfield soft reset */
+#define glb_soft_res_default 0x0
+
+/* mif register reset disable bitfield definitions
+ * preprocessor definitions for the bitfield "register reset disable".
+ * port="pif_glb_reg_res_dsbl_i"
+ */
+
+/* register address for bitfield register reset disable */
+#define glb_reg_res_dis_adr 0x00000000
+/* bitmask for bitfield register reset disable */
+#define glb_reg_res_dis_msk 0x00004000
+/* inverted bitmask for bitfield register reset disable */
+#define glb_reg_res_dis_mskn 0xffffbfff
+/* lower bit position of bitfield register reset disable */
+#define glb_reg_res_dis_shift 14
+/* width of bitfield register reset disable */
+#define glb_reg_res_dis_width 1
+/* default value of bitfield register reset disable */
+#define glb_reg_res_dis_default 0x1
+
+/* tx dma debug control definitions */
+#define tx_dma_debug_ctl_adr 0x00008920u
+
+/* tx dma descriptor base address msw definitions */
+#define tx_dma_desc_base_addrmsw_adr(descriptor) \
+			(0x00007c04u + (descriptor) * 0x40)
+
+/* tx interrupt moderation control register definitions
+ * Preprocessor definitions for TX Interrupt Moderation Control Register
+ * Base Address: 0x00008980
+ * Parameter: queue {Q} | stride size 0x4 | range [0, 31]
+ */
+
+#define tx_intr_moderation_ctl_adr(queue) (0x00008980u + (queue) * 0x4)
+
+/* pcie reg_res_dsbl bitfield definitions
+ * preprocessor definitions for the bitfield "reg_res_dsbl".
+ * port="pif_pci_reg_res_dsbl_i"
+ */
+
+/* register address for bitfield reg_res_dsbl */
+#define pci_reg_res_dsbl_adr 0x00001000
+/* bitmask for bitfield reg_res_dsbl */
+#define pci_reg_res_dsbl_msk 0x20000000
+/* inverted bitmask for bitfield reg_res_dsbl */
+#define pci_reg_res_dsbl_mskn 0xdfffffff
+/* lower bit position of bitfield reg_res_dsbl */
+#define pci_reg_res_dsbl_shift 29
+/* width of bitfield reg_res_dsbl */
+#define pci_reg_res_dsbl_width 1
+/* default value of bitfield reg_res_dsbl */
+#define pci_reg_res_dsbl_default 0x1
+
+/* global microprocessor scratch pad definitions */
+#define glb_cpu_scratch_scp_adr(scratch_scp) (0x00000300u + (scratch_scp) * 0x4)
+
+#endif /* HW_ATL_LLH_INTERNAL_H */
-- 
2.9.3

^ permalink raw reply related

* [PATCH v7 07/13] net: ethernet: aquantia: Vector operations
From: Alexander Loktionov @ 2017-01-19 21:33 UTC (permalink / raw)
  To: netdev, David VomLehn
  Cc: David S . Miller, Simon Edelhaus, Alexander Loktionov,
	Dmitrii Tarakanov, Pavel . Belous, Dmitry Bezrukov
In-Reply-To: <cover.1484860589.git.vomlehn@texas.net>

From: David VomLehn <vomlehn@texas.net>

Add functions to manululate the vector of receive and transmit rings.

Signed-off-by: Alexander Loktionov <Alexander.Loktionov@aquantia.com>
Signed-off-by: Dmitrii Tarakanov <Dmitrii.Tarakanov@aquantia.com>
Signed-off-by: Pavel.Belous <Pavel.Belous@aquantia.com>
Signed-off-by: Dmitry Bezrukov <Dmitry.Bezrukov@aquantia.com>
Signed-off-by: David M. VomLehn <vomlehn@texas.net>
---
 drivers/net/ethernet/aquantia/atlantic/aq_vec.c | 392 ++++++++++++++++++++++++
 drivers/net/ethernet/aquantia/atlantic/aq_vec.h |  42 +++
 2 files changed, 434 insertions(+)
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_vec.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_vec.h

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
new file mode 100644
index 0000000..140962f
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
@@ -0,0 +1,392 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_vec.c: Definition of common structure for vector of Rx and Tx rings.
+ * Definition of functions for Rx and Tx rings. Friendly module for aq_nic.
+ */
+
+#include "aq_vec.h"
+#include "aq_nic.h"
+#include "aq_ring.h"
+#include "aq_hw.h"
+
+#include <linux/netdevice.h>
+
+struct aq_vec_s {
+	struct aq_obj_s header;
+	struct aq_hw_ops *aq_hw_ops;
+	struct aq_hw_s *aq_hw;
+	struct aq_nic_s *aq_nic;
+	unsigned int tx_rings;
+	unsigned int rx_rings;
+	struct aq_ring_param_s aq_ring_param;
+	struct napi_struct napi;
+	struct aq_ring_s ring[AQ_CFG_TCS_MAX][2];
+};
+
+#define AQ_VEC_TX_ID 0
+#define AQ_VEC_RX_ID 1
+
+static int aq_vec_poll(struct napi_struct *napi, int budget)
+__releases(&self->lock)
+__acquires(&self->lock)
+{
+	struct aq_vec_s *self = container_of(napi, struct aq_vec_s, napi);
+	struct aq_ring_s *ring = NULL;
+	int work_done = 0;
+	int err = 0;
+	unsigned int i = 0U;
+	unsigned int sw_tail_old = 0U;
+	bool was_tx_cleaned = false;
+
+	if (!self) {
+		err = -EINVAL;
+	} else if (spin_trylock(&self->header.lock)) {
+		for (i = 0U, ring = self->ring[0];
+			self->tx_rings > i; ++i, ring = self->ring[i]) {
+			if (self->aq_hw_ops->hw_ring_tx_head_update) {
+				err = self->aq_hw_ops->hw_ring_tx_head_update(
+							self->aq_hw,
+							&ring[AQ_VEC_TX_ID]);
+				if (err < 0)
+					goto err_exit;
+			}
+
+			if (ring[AQ_VEC_TX_ID].sw_head !=
+				ring[AQ_VEC_TX_ID].hw_head) {
+				err = aq_ring_tx_clean(&ring[AQ_VEC_TX_ID]);
+				if (err < 0)
+					goto err_exit;
+				was_tx_cleaned = true;
+			}
+
+			err = self->aq_hw_ops->hw_ring_rx_receive(self->aq_hw,
+					    &ring[AQ_VEC_RX_ID]);
+			if (err < 0)
+				goto err_exit;
+
+			if (ring[AQ_VEC_RX_ID].sw_head !=
+				ring[AQ_VEC_RX_ID].hw_head) {
+				err = aq_ring_rx_clean(&ring[AQ_VEC_RX_ID],
+						       &work_done,
+						       budget - work_done);
+				if (err < 0)
+					goto err_exit;
+
+				sw_tail_old = ring[AQ_VEC_RX_ID].sw_tail;
+
+				err = aq_ring_rx_fill(&ring[AQ_VEC_RX_ID]);
+				if (err < 0)
+					goto err_exit;
+
+				err = self->aq_hw_ops->hw_ring_rx_fill(
+					self->aq_hw,
+					&ring[AQ_VEC_RX_ID], sw_tail_old);
+				if (err < 0)
+					goto err_exit;
+			}
+		}
+
+		if (was_tx_cleaned)
+			work_done = budget;
+
+		if (work_done < budget) {
+			napi_complete(napi);
+			self->aq_hw_ops->hw_irq_enable(self->aq_hw,
+					1U << self->aq_ring_param.vec_idx);
+		}
+
+err_exit:
+		spin_unlock(&self->header.lock);
+	}
+
+	return work_done;
+}
+
+struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx,
+			      struct aq_nic_cfg_s *aq_nic_cfg)
+{
+	struct aq_vec_s *self = NULL;
+	struct aq_ring_s *ring = NULL;
+	unsigned int i = 0U;
+	int err = 0;
+
+	self = kzalloc(sizeof(*self), GFP_KERNEL);
+	if (!self) {
+		err = -ENOMEM;
+		goto err_exit;
+	}
+
+	self->aq_nic = aq_nic;
+	self->aq_ring_param.vec_idx = idx;
+	self->aq_ring_param.cpu =
+		idx + aq_nic_cfg->aq_rss.base_cpu_number;
+
+	cpumask_set_cpu(self->aq_ring_param.cpu,
+			&self->aq_ring_param.affinity_mask);
+
+	self->tx_rings = 0;
+	self->rx_rings = 0;
+
+	netif_napi_add(aq_nic_get_ndev(aq_nic), &self->napi,
+		       aq_vec_poll, AQ_CFG_NAPI_WEIGHT);
+
+	for (i = 0; i < aq_nic_cfg->tcs; ++i) {
+		unsigned int idx_ring = AQ_NIC_TCVEC2RING(self->nic,
+						self->tx_rings,
+						self->aq_ring_param.vec_idx);
+
+		ring = aq_ring_tx_alloc(&self->ring[i][AQ_VEC_TX_ID], aq_nic,
+					idx_ring, aq_nic_cfg);
+		if (!ring) {
+			err = -ENOMEM;
+			goto err_exit;
+		}
+
+		++self->tx_rings;
+
+		aq_nic_set_tx_ring(aq_nic, idx_ring, ring);
+
+		ring = aq_ring_rx_alloc(&self->ring[i][AQ_VEC_RX_ID], aq_nic,
+					idx_ring, aq_nic_cfg);
+		if (!ring) {
+			err = -ENOMEM;
+			goto err_exit;
+		}
+
+		++self->rx_rings;
+	}
+
+err_exit:
+	if (err < 0) {
+		aq_vec_free(self);
+		self = NULL;
+	}
+	return self;
+}
+
+int aq_vec_init(struct aq_vec_s *self, struct aq_hw_ops *aq_hw_ops,
+		struct aq_hw_s *aq_hw)
+{
+	struct aq_ring_s *ring = NULL;
+	unsigned int i = 0U;
+	int err = 0;
+
+	self->aq_hw_ops = aq_hw_ops;
+	self->aq_hw = aq_hw;
+
+	spin_lock_init(&self->header.lock);
+
+	for (i = 0U, ring = self->ring[0];
+		self->tx_rings > i; ++i, ring = self->ring[i]) {
+		err = aq_ring_init(&ring[AQ_VEC_TX_ID]);
+		if (err < 0)
+			goto err_exit;
+
+		err = self->aq_hw_ops->hw_ring_tx_init(self->aq_hw,
+						       &ring[AQ_VEC_TX_ID],
+						       &self->aq_ring_param);
+		if (err < 0)
+			goto err_exit;
+
+		err = aq_ring_init(&ring[AQ_VEC_RX_ID]);
+		if (err < 0)
+			goto err_exit;
+
+		err = self->aq_hw_ops->hw_ring_rx_init(self->aq_hw,
+						       &ring[AQ_VEC_RX_ID],
+						       &self->aq_ring_param);
+		if (err < 0)
+			goto err_exit;
+
+		err = aq_ring_rx_fill(&ring[AQ_VEC_RX_ID]);
+		if (err < 0)
+			goto err_exit;
+
+		err = self->aq_hw_ops->hw_ring_rx_fill(self->aq_hw,
+						       &ring[AQ_VEC_RX_ID], 0U);
+		if (err < 0)
+			goto err_exit;
+	}
+
+err_exit:
+	return err;
+}
+
+int aq_vec_start(struct aq_vec_s *self)
+{
+	struct aq_ring_s *ring = NULL;
+	unsigned int i = 0U;
+	int err = 0;
+
+	for (i = 0U, ring = self->ring[0];
+		self->tx_rings > i; ++i, ring = self->ring[i]) {
+		err = self->aq_hw_ops->hw_ring_tx_start(self->aq_hw,
+							&ring[AQ_VEC_TX_ID]);
+		if (err < 0)
+			goto err_exit;
+
+		err = self->aq_hw_ops->hw_ring_rx_start(self->aq_hw,
+							&ring[AQ_VEC_RX_ID]);
+		if (err < 0)
+			goto err_exit;
+	}
+
+	napi_enable(&self->napi);
+
+err_exit:
+	return err;
+}
+
+void aq_vec_stop(struct aq_vec_s *self)
+{
+	struct aq_ring_s *ring = NULL;
+	unsigned int i = 0U;
+
+	for (i = 0U, ring = self->ring[0];
+		self->tx_rings > i; ++i, ring = self->ring[i]) {
+		self->aq_hw_ops->hw_ring_tx_stop(self->aq_hw,
+						 &ring[AQ_VEC_TX_ID]);
+
+		self->aq_hw_ops->hw_ring_rx_stop(self->aq_hw,
+						 &ring[AQ_VEC_RX_ID]);
+	}
+
+	napi_disable(&self->napi);
+}
+
+void aq_vec_deinit(struct aq_vec_s *self)
+{
+	struct aq_ring_s *ring = NULL;
+	unsigned int i = 0U;
+
+	if (!self)
+		goto err_exit;
+
+	for (i = 0U, ring = self->ring[0];
+		self->tx_rings > i; ++i, ring = self->ring[i]) {
+		aq_ring_tx_deinit(&ring[AQ_VEC_TX_ID]);
+		aq_ring_rx_deinit(&ring[AQ_VEC_RX_ID]);
+	}
+err_exit:;
+}
+
+void aq_vec_free(struct aq_vec_s *self)
+{
+	struct aq_ring_s *ring = NULL;
+	unsigned int i = 0U;
+
+	if (!self)
+		goto err_exit;
+
+	for (i = 0U, ring = self->ring[0];
+		self->tx_rings > i; ++i, ring = self->ring[i]) {
+		aq_ring_free(&ring[AQ_VEC_TX_ID]);
+		aq_ring_free(&ring[AQ_VEC_RX_ID]);
+	}
+
+	netif_napi_del(&self->napi);
+
+	kfree(self);
+
+err_exit:;
+}
+
+irqreturn_t aq_vec_isr(int irq, void *private)
+{
+	struct aq_vec_s *self = private;
+	int err = 0;
+
+	if (!self) {
+		err = -EINVAL;
+		goto err_exit;
+	}
+	napi_schedule(&self->napi);
+
+err_exit:
+	return err >= 0 ? IRQ_HANDLED : IRQ_NONE;
+}
+
+irqreturn_t aq_vec_isr_legacy(int irq, void *private)
+{
+	struct aq_vec_s *self = private;
+	u64 irq_mask = 0U;
+	irqreturn_t err = 0;
+
+	if (!self) {
+		err = -EINVAL;
+		goto err_exit;
+	}
+	err = self->aq_hw_ops->hw_irq_read(self->aq_hw, &irq_mask);
+	if (err < 0)
+		goto err_exit;
+
+	if (irq_mask) {
+		self->aq_hw_ops->hw_irq_disable(self->aq_hw,
+			      1U << self->aq_ring_param.vec_idx);
+		napi_schedule(&self->napi);
+	} else {
+		self->aq_hw_ops->hw_irq_enable(self->aq_hw, 1U);
+		err = IRQ_NONE;
+	}
+
+err_exit:
+	return err >= 0 ? IRQ_HANDLED : IRQ_NONE;
+}
+
+cpumask_t *aq_vec_get_affinity_mask(struct aq_vec_s *self)
+{
+	return &self->aq_ring_param.affinity_mask;
+}
+
+void aq_vec_add_stats(struct aq_vec_s *self,
+		      struct aq_ring_stats_rx_s *stats_rx,
+		      struct aq_ring_stats_tx_s *stats_tx)
+{
+	struct aq_ring_s *ring = NULL;
+	unsigned int r = 0U;
+
+	for (r = 0U, ring = self->ring[0];
+		self->tx_rings > r; ++r, ring = self->ring[r]) {
+		struct aq_ring_stats_tx_s *tx = &ring[AQ_VEC_TX_ID].stats.tx;
+		struct aq_ring_stats_rx_s *rx = &ring[AQ_VEC_RX_ID].stats.rx;
+
+		stats_rx->packets += rx->packets;
+		stats_rx->bytes += rx->bytes;
+		stats_rx->errors += rx->errors;
+		stats_rx->jumbo_packets += rx->jumbo_packets;
+		stats_rx->lro_packets += rx->lro_packets;
+
+		stats_tx->packets += tx->packets;
+		stats_tx->bytes += tx->bytes;
+		stats_tx->errors += tx->errors;
+	}
+}
+
+int aq_vec_get_sw_stats(struct aq_vec_s *self, u64 *data, unsigned int *p_count)
+{
+	unsigned int count = 0U;
+	struct aq_ring_stats_rx_s stats_rx;
+	struct aq_ring_stats_tx_s stats_tx;
+
+	memset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s));
+	memset(&stats_tx, 0U, sizeof(struct aq_ring_stats_tx_s));
+	aq_vec_add_stats(self, &stats_rx, &stats_tx);
+
+	data[count] += stats_rx.packets;
+	data[++count] += stats_tx.packets;
+	data[++count] += stats_rx.jumbo_packets;
+	data[++count] += stats_rx.lro_packets;
+	data[++count] += stats_rx.errors;
+
+	if (p_count)
+		*p_count = ++count;
+
+	return 0;
+}
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.h b/drivers/net/ethernet/aquantia/atlantic/aq_vec.h
new file mode 100644
index 0000000..6c68b18
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.h
@@ -0,0 +1,42 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_vec.h: Definition of common structures for vector of Rx and Tx rings.
+ * Declaration of functions for Rx and Tx rings.
+ */
+
+#ifndef AQ_VEC_H
+#define AQ_VEC_H
+
+#include "aq_common.h"
+#include <linux/irqreturn.h>
+
+struct aq_hw_s;
+struct aq_hw_ops;
+struct aq_ring_stats_rx_s;
+struct aq_ring_stats_tx_s;
+
+irqreturn_t aq_vec_isr(int irq, void *private);
+irqreturn_t aq_vec_isr_legacy(int irq, void *private);
+struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx,
+			      struct aq_nic_cfg_s *aq_nic_cfg);
+int aq_vec_init(struct aq_vec_s *self, struct aq_hw_ops *aq_hw_ops,
+		struct aq_hw_s *aq_hw);
+void aq_vec_deinit(struct aq_vec_s *self);
+void aq_vec_free(struct aq_vec_s *self);
+int aq_vec_start(struct aq_vec_s *self);
+void aq_vec_stop(struct aq_vec_s *self);
+cpumask_t *aq_vec_get_affinity_mask(struct aq_vec_s *self);
+int aq_vec_get_sw_stats(struct aq_vec_s *self, u64 *data,
+			unsigned int *p_count);
+void aq_vec_add_stats(struct aq_vec_s *self,
+		      struct aq_ring_stats_rx_s *stats_rx,
+		      struct aq_ring_stats_tx_s *stats_tx);
+
+#endif /* AQ_VEC_H */
-- 
2.9.3

^ permalink raw reply related

* [PATCH v7 05/13] net: ethernet: aquantia: Support for NIC-specific code
From: Alexander Loktionov @ 2017-01-19 21:33 UTC (permalink / raw)
  To: netdev, David VomLehn
  Cc: David S . Miller, Simon Edelhaus, Alexander Loktionov,
	Dmitrii Tarakanov, Pavel Belous, Dmitry Bezrukov
In-Reply-To: <cover.1484860589.git.vomlehn@texas.net>

From: David VomLehn <vomlehn@texas.net>

Add support for code specific to the Atlantic NIC.

Signed-off-by: Alexander Loktionov <Alexander.Loktionov@aquantia.com>
Signed-off-by: Dmitrii Tarakanov <Dmitrii.Tarakanov@aquantia.com>
Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>
Signed-off-by: Dmitry Bezrukov <Dmitry.Bezrukov@aquantia.com>
Signed-off-by: David M. VomLehn <vomlehn@texas.net>
---
 drivers/net/ethernet/aquantia/atlantic/aq_main.c   | 273 ++++++
 drivers/net/ethernet/aquantia/atlantic/aq_main.h   |  17 +
 drivers/net/ethernet/aquantia/atlantic/aq_nic.c    | 937 +++++++++++++++++++++
 drivers/net/ethernet/aquantia/atlantic/aq_nic.h    | 108 +++
 .../ethernet/aquantia/atlantic/aq_nic_internal.h   |  46 +
 5 files changed, 1381 insertions(+)
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_main.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_main.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_nic.c
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_nic.h
 create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.c b/drivers/net/ethernet/aquantia/atlantic/aq_main.c
new file mode 100644
index 0000000..c17c70a
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c
@@ -0,0 +1,273 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_main.c: Main file for aQuantia Linux driver. */
+
+#include "aq_main.h"
+#include "aq_nic.h"
+#include "aq_pci_func.h"
+#include "aq_ethtool.h"
+#include "hw_atl/hw_atl_a0.h"
+#include "hw_atl/hw_atl_b0.h"
+
+#include <linux/netdevice.h>
+#include <linux/module.h>
+
+static const struct pci_device_id aq_pci_tbl[] = {
+	{ PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_0001), },
+	{ PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D100), },
+	{ PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D107), },
+	{ PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D108), },
+	{ PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D109), },
+	{}
+};
+
+MODULE_DEVICE_TABLE(pci, aq_pci_tbl);
+
+MODULE_LICENSE("GPL v2");
+MODULE_VERSION(AQ_CFG_DRV_VERSION);
+MODULE_AUTHOR(AQ_CFG_DRV_AUTHOR);
+MODULE_DESCRIPTION(AQ_CFG_DRV_DESC);
+
+static struct aq_hw_ops *aq_pci_probe_get_hw_ops_by_id(struct pci_dev *pdev)
+{
+	struct aq_hw_ops *ops = NULL;
+
+	ops = hw_atl_a0_get_ops_by_id(pdev);
+	if (!ops)
+		ops = hw_atl_b0_get_ops_by_id(pdev);
+
+	return ops;
+}
+
+static int aq_ndev_open(struct net_device *ndev)
+{
+	struct aq_nic_s *aq_nic = NULL;
+	int err = 0;
+
+	aq_nic = aq_nic_alloc_hot(ndev);
+	if (!aq_nic) {
+		err = -ENOMEM;
+		goto err_exit;
+	}
+	err = aq_nic_init(aq_nic);
+	if (err < 0)
+		goto err_exit;
+	err = aq_nic_start(aq_nic);
+	if (err < 0)
+		goto err_exit;
+
+err_exit:
+	if (err < 0)
+		aq_nic_deinit(aq_nic);
+	return err;
+}
+
+static int aq_ndev_close(struct net_device *ndev)
+{
+	int err = 0;
+	struct aq_nic_s *aq_nic = netdev_priv(ndev);
+
+	err = aq_nic_stop(aq_nic);
+	if (err < 0)
+		goto err_exit;
+	aq_nic_deinit(aq_nic);
+	aq_nic_free_hot_resources(aq_nic);
+
+err_exit:
+	return err;
+}
+
+static int aq_ndev_start_xmit(struct sk_buff *skb, struct net_device *ndev)
+{
+	struct aq_nic_s *aq_nic = netdev_priv(ndev);
+	int err = 0;
+
+	err = aq_nic_xmit(aq_nic, skb);
+	if (err < 0)
+		goto err_exit;
+
+err_exit:
+	return err;
+}
+
+static int aq_ndev_change_mtu(struct net_device *ndev, int new_mtu)
+{
+	struct aq_nic_s *aq_nic = netdev_priv(ndev);
+	int err = 0;
+
+	if (new_mtu == ndev->mtu) {
+		err = 0;
+		goto err_exit;
+	}
+	if (new_mtu < 68) {
+		err = -EINVAL;
+		goto err_exit;
+	}
+	err = aq_nic_set_mtu(aq_nic, new_mtu + ETH_HLEN);
+	if (err < 0)
+		goto err_exit;
+	ndev->mtu = new_mtu;
+
+	if (netif_running(ndev)) {
+		aq_ndev_close(ndev);
+		aq_ndev_open(ndev);
+	}
+
+err_exit:
+	return err;
+}
+
+static int aq_ndev_set_features(struct net_device *ndev,
+				netdev_features_t features)
+{
+	struct aq_nic_s *aq_nic = netdev_priv(ndev);
+	struct aq_nic_cfg_s *aq_cfg = aq_nic_get_cfg(aq_nic);
+	bool is_lro = false;
+
+	if (aq_cfg->hw_features & NETIF_F_LRO) {
+		is_lro = features & NETIF_F_LRO;
+
+		if (aq_cfg->is_lro != is_lro) {
+			aq_cfg->is_lro = is_lro;
+
+			if (netif_running(ndev)) {
+				aq_ndev_close(ndev);
+				aq_ndev_open(ndev);
+			}
+		}
+	}
+
+	return 0;
+}
+
+static int aq_ndev_set_mac_address(struct net_device *ndev, void *addr)
+{
+	struct aq_nic_s *aq_nic = netdev_priv(ndev);
+	int err = 0;
+
+	err = eth_mac_addr(ndev, addr);
+	if (err < 0)
+		goto err_exit;
+	err = aq_nic_set_mac(aq_nic, ndev);
+	if (err < 0)
+		goto err_exit;
+
+err_exit:
+	return err;
+}
+
+static void aq_ndev_set_multicast_settings(struct net_device *ndev)
+{
+	struct aq_nic_s *aq_nic = netdev_priv(ndev);
+	int err = 0;
+
+	err = aq_nic_set_packet_filter(aq_nic, ndev->flags);
+	if (err < 0)
+		goto err_exit;
+
+	if (netdev_mc_count(ndev)) {
+		err = aq_nic_set_multicast_list(aq_nic, ndev);
+		if (err < 0)
+			goto err_exit;
+	}
+
+err_exit:;
+}
+
+static const struct net_device_ops aq_ndev_ops = {
+	.ndo_open = aq_ndev_open,
+	.ndo_stop = aq_ndev_close,
+	.ndo_start_xmit = aq_ndev_start_xmit,
+	.ndo_set_rx_mode = aq_ndev_set_multicast_settings,
+	.ndo_change_mtu = aq_ndev_change_mtu,
+	.ndo_set_mac_address = aq_ndev_set_mac_address,
+	.ndo_set_features = aq_ndev_set_features
+};
+
+static int aq_pci_probe(struct pci_dev *pdev,
+			const struct pci_device_id *pci_id)
+{
+	struct aq_hw_ops *aq_hw_ops = NULL;
+	struct aq_pci_func_s *aq_pci_func = NULL;
+	int err = 0;
+
+	err = pci_enable_device(pdev);
+	if (err < 0)
+		goto err_exit;
+	aq_hw_ops = aq_pci_probe_get_hw_ops_by_id(pdev);
+	aq_pci_func = aq_pci_func_alloc(aq_hw_ops, pdev,
+					&aq_ndev_ops, &aq_ethtool_ops);
+	if (!aq_pci_func) {
+		err = -ENOMEM;
+		goto err_exit;
+	}
+	err = aq_pci_func_init(aq_pci_func);
+	if (err < 0)
+		goto err_exit;
+
+err_exit:
+	if (err < 0) {
+		if (aq_pci_func)
+			aq_pci_func_free(aq_pci_func);
+	}
+	return err;
+}
+
+static void aq_pci_remove(struct pci_dev *pdev)
+{
+	struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
+
+	aq_pci_func_deinit(aq_pci_func);
+	aq_pci_func_free(aq_pci_func);
+}
+
+static int aq_pci_suspend(struct pci_dev *pdev, pm_message_t pm_msg)
+{
+	struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
+
+	return aq_pci_func_change_pm_state(aq_pci_func, &pm_msg);
+}
+
+static int aq_pci_resume(struct pci_dev *pdev)
+{
+	struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
+	pm_message_t pm_msg = PMSG_RESTORE;
+
+	return aq_pci_func_change_pm_state(aq_pci_func, &pm_msg);
+}
+
+static struct pci_driver aq_pci_ops = {
+	.name = AQ_CFG_DRV_NAME,
+	.id_table = aq_pci_tbl,
+	.probe = aq_pci_probe,
+	.remove = aq_pci_remove,
+	.suspend = aq_pci_suspend,
+	.resume = aq_pci_resume,
+};
+
+static int __init aq_module_init(void)
+{
+	int err = 0;
+
+	err = pci_register_driver(&aq_pci_ops);
+	if (err < 0)
+		goto err_exit;
+
+err_exit:
+	return err;
+}
+
+static void __exit aq_module_exit(void)
+{
+	pci_unregister_driver(&aq_pci_ops);
+}
+
+module_init(aq_module_init);
+module_exit(aq_module_exit);
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.h b/drivers/net/ethernet/aquantia/atlantic/aq_main.h
new file mode 100644
index 0000000..9748e7e
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.h
@@ -0,0 +1,17 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_main.h: Main file for aQuantia Linux driver. */
+
+#ifndef AQ_MAIN_H
+#define AQ_MAIN_H
+
+#include "aq_common.h"
+
+#endif /* AQ_MAIN_H */
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
new file mode 100644
index 0000000..84bb441
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
@@ -0,0 +1,937 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_nic.c: Definition of common code for NIC. */
+
+#include "aq_nic.h"
+#include "aq_ring.h"
+#include "aq_vec.h"
+#include "aq_hw.h"
+#include "aq_pci_func.h"
+#include "aq_nic_internal.h"
+
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/timer.h>
+#include <linux/cpu.h>
+#include <linux/ip.h>
+#include <linux/tcp.h>
+#include <net/ip.h>
+
+static void aq_nic_rss_init(struct aq_nic_s *self, unsigned int num_rss_queues)
+{
+	struct aq_nic_cfg_s *cfg = &self->aq_nic_cfg;
+	struct aq_rss_parameters *rss_params = &cfg->aq_rss;
+	int i = 0;
+
+	static u8 rss_key[40] = {
+		0x1e, 0xad, 0x71, 0x87, 0x65, 0xfc, 0x26, 0x7d,
+		0x0d, 0x45, 0x67, 0x74, 0xcd, 0x06, 0x1a, 0x18,
+		0xb6, 0xc1, 0xf0, 0xc7, 0xbb, 0x18, 0xbe, 0xf8,
+		0x19, 0x13, 0x4b, 0xa9, 0xd0, 0x3e, 0xfe, 0x70,
+		0x25, 0x03, 0xab, 0x50, 0x6a, 0x8b, 0x82, 0x0c
+	};
+
+	rss_params->hash_secret_key_size = sizeof(rss_key);
+	memcpy(rss_params->hash_secret_key, rss_key, sizeof(rss_key));
+	rss_params->indirection_table_size = AQ_CFG_RSS_INDIRECTION_TABLE_MAX;
+
+	for (i = rss_params->indirection_table_size; i--;)
+		rss_params->indirection_table[i] = i & (num_rss_queues - 1);
+}
+
+/* Fills aq_nic_cfg with valid defaults */
+static void aq_nic_cfg_init_defaults(struct aq_nic_s *self)
+{
+	struct aq_nic_cfg_s *cfg = &self->aq_nic_cfg;
+
+	cfg->aq_hw_caps = &self->aq_hw_caps;
+
+	cfg->vecs = AQ_CFG_VECS_DEF;
+	cfg->tcs = AQ_CFG_TCS_DEF;
+
+	cfg->rxds = AQ_CFG_RXDS_DEF;
+	cfg->txds = AQ_CFG_TXDS_DEF;
+
+	cfg->is_polling = AQ_CFG_IS_POLLING_DEF;
+
+	cfg->is_interrupt_moderation = AQ_CFG_IS_INTERRUPT_MODERATION_DEF;
+	cfg->itr = cfg->is_interrupt_moderation ?
+		AQ_CFG_INTERRUPT_MODERATION_RATE_DEF : 0U;
+
+	cfg->is_rss = AQ_CFG_IS_RSS_DEF;
+	cfg->num_rss_queues = AQ_CFG_NUM_RSS_QUEUES_DEF;
+	cfg->aq_rss.base_cpu_number = AQ_CFG_RSS_BASE_CPU_NUM_DEF;
+	cfg->flow_control = AQ_CFG_FC_MODE;
+
+	cfg->mtu = AQ_CFG_MTU_DEF;
+	cfg->link_speed_msk = AQ_CFG_SPEED_MSK;
+	cfg->is_autoneg = AQ_CFG_IS_AUTONEG_DEF;
+
+	cfg->is_lro = AQ_CFG_IS_LRO_DEF;
+
+	cfg->vlan_id = 0U;
+
+	aq_nic_rss_init(self, cfg->num_rss_queues);
+}
+
+/* Checks hw_caps and 'corrects' aq_nic_cfg in runtime */
+int aq_nic_cfg_start(struct aq_nic_s *self)
+{
+	struct aq_nic_cfg_s *cfg = &self->aq_nic_cfg;
+
+	/*descriptors */
+	cfg->rxds = min(cfg->rxds, cfg->aq_hw_caps->rxds);
+	cfg->txds = min(cfg->txds, cfg->aq_hw_caps->txds);
+
+	/*rss rings */
+	cfg->vecs = min(cfg->vecs, cfg->aq_hw_caps->vecs);
+	cfg->vecs = min(cfg->vecs, num_online_cpus());
+	/* cfg->vecs should be power of 2 for RSS */
+	if (cfg->vecs >= 8U)
+		cfg->vecs = 8U;
+	else if (cfg->vecs >= 4U)
+		cfg->vecs = 4U;
+	else if (cfg->vecs >= 2U)
+		cfg->vecs = 2U;
+	else
+		cfg->vecs = 1U;
+
+	cfg->irq_type = aq_pci_func_get_irq_type(self->aq_pci_func);
+
+	if ((cfg->irq_type == AQ_HW_IRQ_LEGACY) ||
+	    (self->aq_hw_caps.vecs == 1U) ||
+	    (cfg->vecs == 1U)) {
+		cfg->is_rss = 0U;
+		cfg->vecs = 1U;
+	}
+
+	cfg->link_speed_msk &= self->aq_hw_caps.link_speed_msk;
+	cfg->hw_features = self->aq_hw_caps.hw_features;
+	return 0;
+}
+
+static void aq_nic_service_timer_cb(unsigned long param)
+{
+	struct aq_nic_s *self = (struct aq_nic_s *)param;
+	struct net_device *ndev = aq_nic_get_ndev(self);
+	int err = 0;
+	bool is_busy = false;
+	unsigned int i = 0U;
+	struct aq_hw_link_status_s link_status;
+	struct aq_ring_stats_rx_s stats_rx;
+	struct aq_ring_stats_tx_s stats_tx;
+
+	atomic_inc(&self->header.busy_count);
+	is_busy = true;
+	if (aq_utils_obj_test(&self->header.flags, AQ_NIC_FLAGS_IS_NOT_READY))
+		goto err_exit;
+
+	err = self->aq_hw_ops.hw_get_link_status(self->aq_hw, &link_status);
+	if (err < 0)
+		goto err_exit;
+
+	self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw,
+			    self->aq_nic_cfg.is_interrupt_moderation);
+
+	if (memcmp(&link_status, &self->link_status, sizeof(link_status))) {
+		if (link_status.mbps) {
+			aq_utils_obj_set(&self->header.flags,
+					 AQ_NIC_FLAG_STARTED);
+			aq_utils_obj_clear(&self->header.flags,
+					   AQ_NIC_LINK_DOWN);
+			netif_carrier_on(self->ndev);
+		} else {
+			netif_carrier_off(self->ndev);
+			aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);
+		}
+
+		self->link_status = link_status;
+	}
+
+	memset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s));
+	memset(&stats_tx, 0U, sizeof(struct aq_ring_stats_tx_s));
+	for (i = AQ_DIMOF(self->aq_vec); i--;) {
+		if (self->aq_vec[i])
+			aq_vec_add_stats(self->aq_vec[i], &stats_rx, &stats_tx);
+	}
+
+	ndev->stats.rx_packets = stats_rx.packets;
+	ndev->stats.rx_bytes = stats_rx.bytes;
+	ndev->stats.rx_errors = stats_rx.errors;
+	ndev->stats.tx_packets = stats_tx.packets;
+	ndev->stats.tx_bytes = stats_tx.bytes;
+	ndev->stats.tx_errors = stats_tx.errors;
+
+err_exit:
+	if (is_busy)
+		atomic_dec(&self->header.busy_count);
+	mod_timer(&self->service_timer,
+		  jiffies + AQ_CFG_SERVICE_TIMER_INTERVAL);
+}
+
+static void aq_nic_polling_timer_cb(unsigned long param)
+{
+	struct aq_nic_s *self = (struct aq_nic_s *)param;
+	struct aq_vec_s *aq_vec = NULL;
+	unsigned int i = 0U;
+
+	for (i = 0U, aq_vec = self->aq_vec[0];
+		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
+		aq_vec_isr(i, (void *)aq_vec);
+
+	mod_timer(&self->polling_timer, jiffies +
+		AQ_CFG_POLLING_TIMER_INTERVAL);
+}
+
+static struct net_device *aq_nic_ndev_alloc(void)
+{
+	return alloc_etherdev_mq(sizeof(struct aq_nic_s), AQ_CFG_VECS_MAX);
+}
+
+struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
+				   const struct ethtool_ops *et_ops,
+				   struct device *dev,
+				   struct aq_pci_func_s *aq_pci_func,
+				   unsigned int port,
+				   const struct aq_hw_ops *aq_hw_ops)
+{
+	struct net_device *ndev = NULL;
+	struct aq_nic_s *self = NULL;
+	int err = 0;
+
+	ndev = aq_nic_ndev_alloc();
+	self = netdev_priv(ndev);
+	if (!self) {
+		err = -EINVAL;
+		goto err_exit;
+	}
+
+	ndev->netdev_ops = ndev_ops;
+	ndev->ethtool_ops = et_ops;
+
+	SET_NETDEV_DEV(ndev, dev);
+
+	ndev->if_port = port;
+	self->ndev = ndev;
+
+	self->aq_pci_func = aq_pci_func;
+
+	self->aq_hw_ops = *aq_hw_ops;
+	self->port = (u8)port;
+
+	self->aq_hw = self->aq_hw_ops.create(aq_pci_func, self->port,
+						&self->aq_hw_ops);
+	err = self->aq_hw_ops.get_hw_caps(self->aq_hw, &self->aq_hw_caps);
+	if (err < 0)
+		goto err_exit;
+
+	aq_nic_cfg_init_defaults(self);
+
+err_exit:
+	if (err < 0) {
+		aq_nic_free_hot_resources(self);
+		self = NULL;
+	}
+	return self;
+}
+
+int aq_nic_ndev_register(struct aq_nic_s *self)
+{
+	int err = 0;
+	unsigned int i = 0U;
+
+	if (!self->ndev) {
+		err = -EINVAL;
+		goto err_exit;
+	}
+	err = self->aq_hw_ops.hw_get_mac_permanent(self->aq_hw,
+			    self->aq_nic_cfg.aq_hw_caps,
+			    self->ndev->dev_addr);
+	if (err < 0)
+		goto err_exit;
+
+#if defined(AQ_CFG_MAC_ADDR_PERMANENT)
+	{
+		static u8 mac_addr_permanent[] = AQ_CFG_MAC_ADDR_PERMANENT;
+
+		ether_addr_copy(self->ndev->dev_addr, mac_addr_permanent);
+	}
+#endif
+	err = register_netdev(self->ndev);
+	if (err < 0)
+		goto err_exit;
+
+	self->is_ndev_registered = true;
+	netif_carrier_off(self->ndev);
+
+	for (i = AQ_CFG_VECS_MAX; i--;)
+		aq_nic_ndev_queue_stop(self, i);
+
+err_exit:
+	return err;
+}
+
+int aq_nic_ndev_init(struct aq_nic_s *self)
+{
+	struct aq_hw_caps_s *aq_hw_caps = self->aq_nic_cfg.aq_hw_caps;
+	struct aq_nic_cfg_s *aq_nic_cfg = &self->aq_nic_cfg;
+
+	self->ndev->hw_features |= aq_hw_caps->hw_features;
+	self->ndev->features = aq_hw_caps->hw_features;
+	self->ndev->priv_flags = aq_hw_caps->hw_priv_flags;
+	self->ndev->mtu = aq_nic_cfg->mtu - ETH_HLEN;
+
+	return 0;
+}
+
+void aq_nic_ndev_free(struct aq_nic_s *self)
+{
+	if (!self->ndev)
+		goto err_exit;
+
+	if (self->is_ndev_registered)
+		unregister_netdev(self->ndev);
+
+	if (self->aq_hw)
+		self->aq_hw_ops.destroy(self->aq_hw);
+
+	free_netdev(self->ndev);
+
+err_exit:;
+}
+
+struct aq_nic_s *aq_nic_alloc_hot(struct net_device *ndev)
+{
+	struct aq_nic_s *self = NULL;
+	int err = 0;
+
+	if (!ndev) {
+		err = -EINVAL;
+		goto err_exit;
+	}
+	self = netdev_priv(ndev);
+
+	if (!self) {
+		err = -EINVAL;
+		goto err_exit;
+	}
+	if (netif_running(ndev)) {
+		unsigned int i;
+
+		for (i = AQ_CFG_VECS_MAX; i--;)
+			netif_stop_subqueue(ndev, i);
+	}
+
+	for (self->aq_vecs = 0; self->aq_vecs < self->aq_nic_cfg.vecs;
+		self->aq_vecs++) {
+		self->aq_vec[self->aq_vecs] =
+		    aq_vec_alloc(self, self->aq_vecs, &self->aq_nic_cfg);
+		if (!self->aq_vec[self->aq_vecs]) {
+			err = -ENOMEM;
+			goto err_exit;
+		}
+	}
+
+err_exit:
+	if (err < 0) {
+		aq_nic_free_hot_resources(self);
+		self = NULL;
+	}
+	return self;
+}
+
+void aq_nic_set_tx_ring(struct aq_nic_s *self, unsigned int idx,
+			struct aq_ring_s *ring)
+{
+	self->aq_ring_tx[idx] = ring;
+}
+
+struct device *aq_nic_get_dev(struct aq_nic_s *self)
+{
+	return self->ndev->dev.parent;
+}
+
+struct net_device *aq_nic_get_ndev(struct aq_nic_s *self)
+{
+	return self->ndev;
+}
+
+int aq_nic_init(struct aq_nic_s *self)
+{
+	struct aq_vec_s *aq_vec = NULL;
+	int err = 0;
+	unsigned int i = 0U;
+
+	self->power_state = AQ_HW_POWER_STATE_D0;
+	err = self->aq_hw_ops.hw_reset(self->aq_hw);
+	if (err < 0)
+		goto err_exit;
+
+	err = self->aq_hw_ops.hw_init(self->aq_hw, &self->aq_nic_cfg,
+			    aq_nic_get_ndev(self)->dev_addr);
+	if (err < 0)
+		goto err_exit;
+
+	for (i = 0U, aq_vec = self->aq_vec[0];
+		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
+		aq_vec_init(aq_vec, &self->aq_hw_ops, self->aq_hw);
+
+err_exit:
+	return err;
+}
+
+void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx)
+{
+	netif_start_subqueue(self->ndev, idx);
+}
+
+void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx)
+{
+	netif_stop_subqueue(self->ndev, idx);
+}
+
+int aq_nic_start(struct aq_nic_s *self)
+{
+	struct aq_vec_s *aq_vec = NULL;
+	int err = 0;
+	unsigned int i = 0U;
+
+	err = self->aq_hw_ops.hw_multicast_list_set(self->aq_hw,
+						    self->mc_list.ar,
+						    self->mc_list.count);
+	if (err < 0)
+		goto err_exit;
+
+	err = self->aq_hw_ops.hw_packet_filter_set(self->aq_hw,
+						   self->packet_filter);
+	if (err < 0)
+		goto err_exit;
+
+	for (i = 0U, aq_vec = self->aq_vec[0];
+		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) {
+		err = aq_vec_start(aq_vec);
+		if (err < 0)
+			goto err_exit;
+	}
+
+	err = self->aq_hw_ops.hw_start(self->aq_hw);
+	if (err < 0)
+		goto err_exit;
+
+	err = self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw,
+			    self->aq_nic_cfg.is_interrupt_moderation);
+	if (err < 0)
+		goto err_exit;
+	setup_timer(&self->service_timer, &aq_nic_service_timer_cb,
+		    (unsigned long)self);
+	mod_timer(&self->service_timer, jiffies +
+			AQ_CFG_SERVICE_TIMER_INTERVAL);
+
+	if (self->aq_nic_cfg.is_polling) {
+		setup_timer(&self->polling_timer, &aq_nic_polling_timer_cb,
+			    (unsigned long)self);
+		mod_timer(&self->polling_timer, jiffies +
+			  AQ_CFG_POLLING_TIMER_INTERVAL);
+	} else {
+		for (i = 0U, aq_vec = self->aq_vec[0];
+			self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) {
+			err = aq_pci_func_alloc_irq(self->aq_pci_func, i,
+						    self->ndev->name, aq_vec,
+					aq_vec_get_affinity_mask(aq_vec));
+			if (err < 0)
+				goto err_exit;
+		}
+
+		err = self->aq_hw_ops.hw_irq_enable(self->aq_hw,
+				    AQ_CFG_IRQ_MASK);
+		if (err < 0)
+			goto err_exit;
+	}
+
+	for (i = 0U, aq_vec = self->aq_vec[0];
+		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
+		aq_nic_ndev_queue_start(self, i);
+
+	err = netif_set_real_num_tx_queues(self->ndev, self->aq_vecs);
+	if (err < 0)
+		goto err_exit;
+
+	err = netif_set_real_num_rx_queues(self->ndev, self->aq_vecs);
+	if (err < 0)
+		goto err_exit;
+
+err_exit:
+	return err;
+}
+
+static unsigned int aq_nic_map_skb_frag(struct aq_nic_s *self,
+					struct sk_buff *skb,
+					struct aq_ring_buff_s *dx)
+{
+	unsigned int ret = 0U;
+	unsigned int nr_frags = skb_shinfo(skb)->nr_frags;
+	unsigned int frag_count = 0U;
+
+	dx->flags = 0U;
+	dx->len = skb_headlen(skb);
+	dx->pa = dma_map_single(aq_nic_get_dev(self), skb->data, dx->len,
+				DMA_TO_DEVICE);
+	dx->len_pkt = skb->len;
+	dx->is_sop = 1U;
+	dx->is_mapped = 1U;
+
+	++ret;
+
+	if (skb->ip_summed == CHECKSUM_PARTIAL) {
+		dx->is_ip_cso = (htons(ETH_P_IP) == skb->protocol) ? 1U : 0U;
+		dx->is_tcp_cso =
+			(ip_hdr(skb)->protocol == IPPROTO_TCP) ? 1U : 0U;
+		dx->is_udp_cso =
+			(ip_hdr(skb)->protocol == IPPROTO_UDP) ? 1U : 0U;
+	}
+
+	for (; nr_frags--; ++frag_count) {
+		unsigned int frag_len;
+		dma_addr_t frag_pa;
+		skb_frag_t *frag = &skb_shinfo(skb)->frags[frag_count];
+
+		frag_len = skb_frag_size(frag);
+
+		frag_pa = skb_frag_dma_map(aq_nic_get_dev(self), frag, 0,
+					   frag_len, DMA_TO_DEVICE);
+
+		while (frag_len > AQ_CFG_TX_FRAME_MAX) {
+			++dx;
+			++ret;
+			dx->flags = 0U;
+			dx->len = AQ_CFG_TX_FRAME_MAX;
+			dx->pa = frag_pa;
+			dx->is_mapped = 1U;
+
+			frag_len -= AQ_CFG_TX_FRAME_MAX;
+			frag_pa += AQ_CFG_TX_FRAME_MAX;
+		}
+
+		++dx;
+		++ret;
+
+		dx->flags = 0U;
+		dx->len = frag_len;
+		dx->pa = frag_pa;
+		dx->is_mapped = 1U;
+	}
+
+	dx->is_eop = 1U;
+	dx->skb = skb;
+
+	return ret;
+}
+
+static unsigned int aq_nic_map_skb_lso(struct aq_nic_s *self,
+				       struct sk_buff *skb,
+				       struct aq_ring_buff_s *dx)
+{
+	dx->flags = 0U;
+	dx->len_pkt = skb->len;
+	dx->len_l2 = ETH_HLEN;
+	dx->len_l3 = ip_hdrlen(skb);
+	dx->len_l4 = tcp_hdrlen(skb);
+	dx->mss = skb_shinfo(skb)->gso_size;
+	dx->is_txc = 1U;
+	return 1U;
+}
+
+static unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb,
+				   struct aq_ring_buff_s *dx)
+{
+	unsigned int ret = 0U;
+
+	if (unlikely(skb_is_gso(skb))) {
+		ret = aq_nic_map_skb_lso(self, skb, dx);
+		++dx;
+	}
+
+	ret += aq_nic_map_skb_frag(self, skb, dx);
+
+	return ret;
+}
+
+int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
+__releases(&ring->lock)
+__acquires(&ring->lock)
+{
+	struct aq_ring_s *ring = NULL;
+	unsigned int frags = 0U;
+	unsigned int vec = skb->queue_mapping % self->aq_nic_cfg.vecs;
+	unsigned int tc = 0U;
+	unsigned int trys = AQ_CFG_LOCK_TRYS;
+	int err = 0;
+	bool is_nic_in_bad_state;
+	bool is_busy = false;
+	struct aq_ring_buff_s buffers[AQ_CFG_SKB_FRAGS_MAX];
+
+	frags = skb_shinfo(skb)->nr_frags + 1;
+
+	ring = self->aq_ring_tx[AQ_NIC_TCVEC2RING(self, tc, vec)];
+
+	atomic_inc(&self->header.busy_count);
+	is_busy = true;
+
+	if (frags > AQ_CFG_SKB_FRAGS_MAX) {
+		dev_kfree_skb_any(skb);
+		goto err_exit;
+	}
+
+	is_nic_in_bad_state = aq_utils_obj_test(&self->header.flags,
+						AQ_NIC_FLAGS_IS_NOT_TX_READY) ||
+						(aq_ring_avail_dx(ring) <
+						AQ_CFG_SKB_FRAGS_MAX);
+
+	if (is_nic_in_bad_state) {
+		aq_nic_ndev_queue_stop(self, ring->idx);
+		err = NETDEV_TX_BUSY;
+		goto err_exit;
+	}
+
+	do {
+		if (spin_trylock(&ring->header.lock)) {
+			frags = aq_nic_map_skb(self, skb, &buffers[0]);
+
+			aq_ring_tx_append_buffs(ring, &buffers[0], frags);
+
+			err = self->aq_hw_ops.hw_ring_tx_xmit(self->aq_hw,
+							      ring, frags);
+			if (err >= 0) {
+				if (aq_ring_avail_dx(ring) <
+				    AQ_CFG_SKB_FRAGS_MAX + 1)
+					aq_nic_ndev_queue_stop(self, ring->idx);
+			}
+			spin_unlock(&ring->header.lock);
+
+			if (err >= 0) {
+				++ring->stats.tx.packets;
+				ring->stats.tx.bytes += skb->len;
+			}
+			break;
+		}
+	} while (--trys);
+
+	if (!trys) {
+		err = NETDEV_TX_BUSY;
+		goto err_exit;
+	}
+
+err_exit:
+	if (is_busy)
+		atomic_dec(&self->header.busy_count);
+	return err;
+}
+
+int aq_nic_set_packet_filter(struct aq_nic_s *self, unsigned int flags)
+{
+	int err = 0;
+
+	err = self->aq_hw_ops.hw_packet_filter_set(self->aq_hw, flags);
+	if (err < 0)
+		goto err_exit;
+
+	self->packet_filter = flags;
+
+err_exit:
+	return err;
+}
+
+int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)
+{
+	struct netdev_hw_addr *ha = NULL;
+	unsigned int i = 0U;
+
+	self->mc_list.count = 0U;
+
+	netdev_for_each_mc_addr(ha, ndev) {
+		ether_addr_copy(self->mc_list.ar[i++], ha->addr);
+		++self->mc_list.count;
+	}
+
+	return self->aq_hw_ops.hw_multicast_list_set(self->aq_hw,
+						    self->mc_list.ar,
+						    self->mc_list.count);
+}
+
+int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu)
+{
+	int err = 0;
+
+	if (new_mtu > self->aq_hw_caps.mtu) {
+		err = -EINVAL;
+		goto err_exit;
+	}
+	self->aq_nic_cfg.mtu = new_mtu;
+
+err_exit:
+	return err;
+}
+
+int aq_nic_set_mac(struct aq_nic_s *self, struct net_device *ndev)
+{
+	return self->aq_hw_ops.hw_set_mac_address(self->aq_hw, ndev->dev_addr);
+}
+
+unsigned int aq_nic_get_link_speed(struct aq_nic_s *self)
+{
+	return self->link_status.mbps;
+}
+
+int aq_nic_get_regs(struct aq_nic_s *self, struct ethtool_regs *regs, void *p)
+{
+	u32 *regs_buff = p;
+	int err = 0;
+
+	regs->version = 1;
+
+	err = self->aq_hw_ops.hw_get_regs(self->aq_hw,
+					  &self->aq_hw_caps, regs_buff);
+	if (err < 0)
+		goto err_exit;
+
+err_exit:
+	return err;
+}
+
+int aq_nic_get_regs_count(struct aq_nic_s *self)
+{
+	return self->aq_hw_caps.mac_regs_count;
+}
+
+void aq_nic_get_stats(struct aq_nic_s *self, u64 *data)
+{
+	struct aq_vec_s *aq_vec = NULL;
+	unsigned int i = 0U;
+	unsigned int count = 0U;
+	int err = 0;
+
+	err = self->aq_hw_ops.hw_get_hw_stats(self->aq_hw, data, &count);
+	if (err < 0)
+		goto err_exit;
+
+	data += count;
+	count = 0U;
+
+	for (i = 0U, aq_vec = self->aq_vec[0];
+		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) {
+		data += count;
+		aq_vec_get_sw_stats(aq_vec, data, &count);
+	}
+
+err_exit:;
+	(void)err;
+}
+
+void aq_nic_get_link_settings(struct aq_nic_s *self, struct ethtool_cmd *cmd)
+{
+	cmd->port = PORT_TP;
+	cmd->transceiver = XCVR_EXTERNAL;
+	/* This driver supports only 10G capable adapters, so DUPLEX_FULL */
+	cmd->duplex = DUPLEX_FULL;
+	cmd->autoneg = self->aq_nic_cfg.is_autoneg;
+
+	cmd->supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_10G) ?
+				ADVERTISED_10000baseT_Full : 0U;
+	cmd->supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_1G) ?
+				ADVERTISED_1000baseT_Full : 0U;
+	cmd->supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_100M) ?
+				ADVERTISED_100baseT_Full : 0U;
+	cmd->supported |= self->aq_hw_caps.flow_control ? SUPPORTED_Pause : 0;
+	cmd->supported |= SUPPORTED_Autoneg;
+
+	cmd->advertising = (self->aq_nic_cfg.is_autoneg) ?
+							ADVERTISED_Autoneg : 0U;
+	cmd->advertising |=
+			(self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_10G) ?
+			ADVERTISED_10000baseT_Full : 0U;
+	cmd->advertising |=
+			(self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_1G) ?
+			ADVERTISED_1000baseT_Full : 0U;
+
+	cmd->advertising |=
+			(self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_100M) ?
+			ADVERTISED_100baseT_Full : 0U;
+	cmd->advertising |= (self->aq_nic_cfg.flow_control) ?
+				ADVERTISED_Pause : 0U;
+}
+
+int aq_nic_set_link_settings(struct aq_nic_s *self, struct ethtool_cmd *cmd)
+{
+	u32 speed = 0U;
+	u32 rate = 0U;
+	int err = 0;
+
+	if (cmd->autoneg == AUTONEG_ENABLE) {
+		rate = self->aq_hw_caps.link_speed_msk;
+		self->aq_nic_cfg.is_autoneg = true;
+	} else {
+		speed = ethtool_cmd_speed(cmd);
+
+		switch (speed) {
+		case SPEED_100:
+			rate = AQ_NIC_RATE_100M;
+			break;
+
+		case SPEED_1000:
+			rate = AQ_NIC_RATE_1G;
+			break;
+
+		case SPEED_2500:
+			rate = AQ_NIC_RATE_2GS;
+			break;
+
+		case SPEED_5000:
+			rate = AQ_NIC_RATE_5G;
+			break;
+
+		case SPEED_10000:
+			rate = AQ_NIC_RATE_10G;
+			break;
+
+		default:
+			err = -1;
+			goto err_exit;
+		break;
+		}
+		if (!(self->aq_hw_caps.link_speed_msk & rate)) {
+			err = -1;
+			goto err_exit;
+		}
+
+		self->aq_nic_cfg.is_autoneg = false;
+	}
+
+	err = self->aq_hw_ops.hw_set_link_speed(self->aq_hw, rate);
+	if (err < 0)
+		goto err_exit;
+
+	self->aq_nic_cfg.link_speed_msk = rate;
+
+err_exit:
+	return err;
+}
+
+struct aq_nic_cfg_s *aq_nic_get_cfg(struct aq_nic_s *self)
+{
+	return &self->aq_nic_cfg;
+}
+
+u32 aq_nic_get_fw_version(struct aq_nic_s *self)
+{
+	u32 fw_version = 0U;
+
+	self->aq_hw_ops.hw_get_fw_version(self->aq_hw, &fw_version);
+
+	return fw_version;
+}
+
+int aq_nic_stop(struct aq_nic_s *self)
+{
+	struct aq_vec_s *aq_vec = NULL;
+	unsigned int i = 0U;
+
+	for (i = 0U, aq_vec = self->aq_vec[0];
+		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
+		aq_nic_ndev_queue_stop(self, i);
+
+	del_timer_sync(&self->service_timer);
+
+	self->aq_hw_ops.hw_irq_disable(self->aq_hw, AQ_CFG_IRQ_MASK);
+
+	if (self->aq_nic_cfg.is_polling)
+		del_timer_sync(&self->polling_timer);
+	else
+		aq_pci_func_free_irqs(self->aq_pci_func);
+
+	for (i = 0U, aq_vec = self->aq_vec[0];
+		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
+		aq_vec_stop(aq_vec);
+
+	return self->aq_hw_ops.hw_stop(self->aq_hw);
+}
+
+void aq_nic_deinit(struct aq_nic_s *self)
+{
+	struct aq_vec_s *aq_vec = NULL;
+	unsigned int i = 0U;
+
+	if (!self)
+		goto err_exit;
+
+	for (i = 0U, aq_vec = self->aq_vec[0];
+		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
+		aq_vec_deinit(aq_vec);
+
+	if (self->power_state == AQ_HW_POWER_STATE_D0) {
+		(void)self->aq_hw_ops.hw_deinit(self->aq_hw);
+	} else {
+		(void)self->aq_hw_ops.hw_set_power(self->aq_hw,
+						   self->power_state);
+	}
+
+err_exit:;
+}
+
+void aq_nic_free_hot_resources(struct aq_nic_s *self)
+{
+	unsigned int i = 0U;
+
+	if (!self)
+		goto err_exit;
+
+	for (i = AQ_DIMOF(self->aq_vec); i--;) {
+		if (self->aq_vec[i])
+			aq_vec_free(self->aq_vec[i]);
+	}
+
+err_exit:;
+}
+
+int aq_nic_change_pm_state(struct aq_nic_s *self, pm_message_t *pm_msg)
+{
+	int err = 0;
+
+	if (!netif_running(self->ndev)) {
+		err = 0;
+		goto err_exit;
+	}
+	rtnl_lock();
+	if (pm_msg->event & PM_EVENT_SLEEP || pm_msg->event & PM_EVENT_FREEZE) {
+		self->power_state = AQ_HW_POWER_STATE_D3;
+		netif_device_detach(self->ndev);
+		netif_tx_stop_all_queues(self->ndev);
+
+		err = aq_nic_stop(self);
+		if (err < 0)
+			goto err_exit;
+
+		aq_nic_deinit(self);
+	} else {
+		err = aq_nic_init(self);
+		if (err < 0)
+			goto err_exit;
+
+		err = aq_nic_start(self);
+		if (err < 0)
+			goto err_exit;
+
+		netif_device_attach(self->ndev);
+		netif_tx_start_all_queues(self->ndev);
+	}
+	rtnl_unlock();
+
+err_exit:
+	return err;
+}
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
new file mode 100644
index 0000000..055e2cd
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
@@ -0,0 +1,108 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_nic.h: Declaration of common code for NIC. */
+
+#ifndef AQ_NIC_H
+#define AQ_NIC_H
+
+#include "aq_common.h"
+#include "aq_rss.h"
+
+struct aq_ring_s;
+struct aq_pci_func_s;
+struct aq_hw_ops;
+
+#define AQ_NIC_FC_OFF    0U
+#define AQ_NIC_FC_TX     1U
+#define AQ_NIC_FC_RX     2U
+#define AQ_NIC_FC_FULL   3U
+#define AQ_NIC_FC_AUTO   4U
+
+#define AQ_NIC_RATE_10G        BIT(0)
+#define AQ_NIC_RATE_5G         BIT(1)
+#define AQ_NIC_RATE_5GSR       BIT(2)
+#define AQ_NIC_RATE_2GS        BIT(3)
+#define AQ_NIC_RATE_1G         BIT(4)
+#define AQ_NIC_RATE_100M       BIT(5)
+
+struct aq_nic_cfg_s {
+	struct aq_hw_caps_s *aq_hw_caps;
+	u64 hw_features;
+	u32 rxds;		/* rx ring size, descriptors # */
+	u32 txds;		/* tx ring size, descriptors # */
+	u32 vecs;		/* vecs==allocated irqs */
+	u32 irq_type;
+	u32 itr;
+	u32 num_rss_queues;
+	u32 mtu;
+	u32 ucp_0x364;
+	u32 flow_control;
+	u32 link_speed_msk;
+	u32 vlan_id;
+	u16 is_mc_list_enabled;
+	u16 mc_list_count;
+	bool is_autoneg;
+	bool is_interrupt_moderation;
+	bool is_polling;
+	bool is_rss;
+	bool is_lro;
+	u8  tcs;
+	struct aq_rss_parameters aq_rss;
+};
+
+#define AQ_NIC_FLAG_STARTED     0x00000004U
+#define AQ_NIC_FLAG_STOPPING    0x00000008U
+#define AQ_NIC_FLAG_RESETTING   0x00000010U
+#define AQ_NIC_FLAG_CLOSING     0x00000020U
+#define AQ_NIC_LINK_DOWN        0x04000000U
+#define AQ_NIC_FLAG_ERR_UNPLUG  0x40000000U
+#define AQ_NIC_FLAG_ERR_HW      0x80000000U
+
+#define AQ_NIC_TCVEC2RING(_NIC_, _TC_, _VEC_) \
+	((_TC_) * AQ_CFG_TCS_MAX + (_VEC_))
+
+struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
+				   const struct ethtool_ops *et_ops,
+				   struct device *dev,
+				   struct aq_pci_func_s *aq_pci_func,
+				   unsigned int port,
+				   const struct aq_hw_ops *aq_hw_ops);
+int aq_nic_ndev_init(struct aq_nic_s *self);
+struct aq_nic_s *aq_nic_alloc_hot(struct net_device *ndev);
+void aq_nic_set_tx_ring(struct aq_nic_s *self, unsigned int idx,
+			struct aq_ring_s *ring);
+struct device *aq_nic_get_dev(struct aq_nic_s *self);
+struct net_device *aq_nic_get_ndev(struct aq_nic_s *self);
+int aq_nic_init(struct aq_nic_s *self);
+int aq_nic_cfg_start(struct aq_nic_s *self);
+int aq_nic_ndev_register(struct aq_nic_s *self);
+void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx);
+void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx);
+void aq_nic_ndev_free(struct aq_nic_s *self);
+int aq_nic_start(struct aq_nic_s *self);
+int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb);
+int aq_nic_get_regs(struct aq_nic_s *self, struct ethtool_regs *regs, void *p);
+int aq_nic_get_regs_count(struct aq_nic_s *self);
+void aq_nic_get_stats(struct aq_nic_s *self, u64 *data);
+int aq_nic_stop(struct aq_nic_s *self);
+void aq_nic_deinit(struct aq_nic_s *self);
+void aq_nic_free_hot_resources(struct aq_nic_s *self);
+int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu);
+int aq_nic_set_mac(struct aq_nic_s *self, struct net_device *ndev);
+int aq_nic_set_packet_filter(struct aq_nic_s *self, unsigned int flags);
+int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev);
+unsigned int aq_nic_get_link_speed(struct aq_nic_s *self);
+void aq_nic_get_link_settings(struct aq_nic_s *self, struct ethtool_cmd *cmd);
+int aq_nic_set_link_settings(struct aq_nic_s *self, struct ethtool_cmd *cmd);
+struct aq_nic_cfg_s *aq_nic_get_cfg(struct aq_nic_s *self);
+u32 aq_nic_get_fw_version(struct aq_nic_s *self);
+int aq_nic_change_pm_state(struct aq_nic_s *self, pm_message_t *pm_msg);
+
+#endif /* AQ_NIC_H */
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h
new file mode 100644
index 0000000..f81738a
--- /dev/null
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h
@@ -0,0 +1,46 @@
+/*
+ * aQuantia Corporation Network Driver
+ * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+/* File aq_nic_internal.h: Definition of private object structure. */
+
+#ifndef AQ_NIC_INTERNAL_H
+#define AQ_NIC_INTERNAL_H
+
+struct aq_nic_s {
+	struct aq_obj_s header;
+	struct aq_vec_s *aq_vec[AQ_CFG_VECS_MAX];
+	struct aq_ring_s *aq_ring_tx[AQ_CFG_VECS_MAX * AQ_CFG_TCS_MAX];
+	struct aq_hw_s *aq_hw;
+	struct net_device *ndev;
+	struct aq_pci_func_s *aq_pci_func;
+	unsigned int aq_vecs;
+	unsigned int packet_filter;
+	unsigned int power_state;
+	bool is_ndev_registered;
+	u8 port;
+	struct aq_hw_ops aq_hw_ops;
+	struct aq_hw_caps_s aq_hw_caps;
+	struct aq_nic_cfg_s aq_nic_cfg;
+	struct timer_list service_timer;
+	struct timer_list polling_timer;
+	struct aq_hw_link_status_s link_status;
+	struct {
+		u32 count;
+		u8 ar[AQ_CFG_MULTICAST_ADDRESS_MAX][ETH_ALEN];
+	} mc_list;
+};
+
+#define AQ_NIC_FLAGS_IS_NOT_READY (AQ_NIC_FLAG_STOPPING | \
+			AQ_NIC_FLAG_RESETTING | AQ_NIC_FLAG_CLOSING | \
+			AQ_NIC_FLAG_ERR_UNPLUG | AQ_NIC_FLAG_ERR_HW)
+
+#define AQ_NIC_FLAGS_IS_NOT_TX_READY (AQ_NIC_FLAGS_IS_NOT_READY | \
+					AQ_NIC_LINK_DOWN)
+
+#endif /* AQ_NIC_INTERNAL_H */
-- 
2.9.3

^ permalink raw reply related


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