Tue Jul 7 12:02:29 2020 UTC ()
Also pull up more cosmetic revisions to minimize diffs with HEAD, requested
by jmcneill in ticket #980:

	sys/dev/pci/if_aq.c			1.8,1.17

constify, remove duplicate ;


(martin)
diff -r1.17.2.2 -r1.17.2.3 src/sys/dev/pci/if_aq.c

cvs diff -r1.17.2.2 -r1.17.2.3 src/sys/dev/pci/if_aq.c (switch to unified diff)

--- src/sys/dev/pci/if_aq.c 2020/07/07 10:29:05 1.17.2.2
+++ src/sys/dev/pci/if_aq.c 2020/07/07 12:02:29 1.17.2.3
@@ -1,2136 +1,2136 @@ @@ -1,2136 +1,2136 @@
1/* $NetBSD: if_aq.c,v 1.17.2.2 2020/07/07 10:29:05 martin Exp $ */ 1/* $NetBSD: if_aq.c,v 1.17.2.3 2020/07/07 12:02:29 martin Exp $ */
2 2
3/** 3/**
4 * aQuantia Corporation Network Driver 4 * aQuantia Corporation Network Driver
5 * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved 5 * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 10 *
11 * (1) Redistributions of source code must retain the above 11 * (1) Redistributions of source code must retain the above
12 * copyright notice, this list of conditions and the following 12 * copyright notice, this list of conditions and the following
13 * disclaimer. 13 * disclaimer.
14 * 14 *
15 * (2) Redistributions in binary form must reproduce the above 15 * (2) Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following 16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials provided 17 * disclaimer in the documentation and/or other materials provided
18 * with the distribution. 18 * with the distribution.
19 * 19 *
20 * (3) The name of the author may not be used to endorse or promote 20 * (3) The name of the author may not be used to endorse or promote
21 * products derived from this software without specific prior 21 * products derived from this software without specific prior
22 * written permission. 22 * written permission.
23 * 23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
25 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
28 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
30 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 * 35 *
36 */ 36 */
37 37
38/*- 38/*-
39 * Copyright (c) 2020 Ryo Shimizu <ryo@nerv.org> 39 * Copyright (c) 2020 Ryo Shimizu <ryo@nerv.org>
40 * All rights reserved. 40 * All rights reserved.
41 * 41 *
42 * Redistribution and use in source and binary forms, with or without 42 * Redistribution and use in source and binary forms, with or without
43 * modification, are permitted provided that the following conditions 43 * modification, are permitted provided that the following conditions
44 * are met: 44 * are met:
45 * 1. Redistributions of source code must retain the above copyright 45 * 1. Redistributions of source code must retain the above copyright
46 * notice, this list of conditions and the following disclaimer. 46 * notice, this list of conditions and the following disclaimer.
47 * 2. Redistributions in binary form must reproduce the above copyright 47 * 2. Redistributions in binary form must reproduce the above copyright
48 * notice, this list of conditions and the following disclaimer in the 48 * notice, this list of conditions and the following disclaimer in the
49 * documentation and/or other materials provided with the distribution. 49 * documentation and/or other materials provided with the distribution.
50 * 50 *
51 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 51 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
52 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 52 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
53 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 53 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
54 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 54 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
55 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 55 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
56 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 56 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
57 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 57 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 58 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
59 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 59 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
60 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 60 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
61 * POSSIBILITY OF SUCH DAMAGE. 61 * POSSIBILITY OF SUCH DAMAGE.
62 */ 62 */
63 63
64#include <sys/cdefs.h> 64#include <sys/cdefs.h>
65__KERNEL_RCSID(0, "$NetBSD: if_aq.c,v 1.17.2.2 2020/07/07 10:29:05 martin Exp $"); 65__KERNEL_RCSID(0, "$NetBSD: if_aq.c,v 1.17.2.3 2020/07/07 12:02:29 martin Exp $");
66 66
67#ifdef _KERNEL_OPT 67#ifdef _KERNEL_OPT
68#include "opt_if_aq.h" 68#include "opt_if_aq.h"
69#include "sysmon_envsys.h" 69#include "sysmon_envsys.h"
70#endif 70#endif
71 71
72#include <sys/param.h> 72#include <sys/param.h>
73#include <sys/types.h> 73#include <sys/types.h>
74#include <sys/bitops.h> 74#include <sys/bitops.h>
75#include <sys/cprng.h> 75#include <sys/cprng.h>
76#include <sys/cpu.h> 76#include <sys/cpu.h>
77#include <sys/interrupt.h> 77#include <sys/interrupt.h>
78#include <sys/module.h> 78#include <sys/module.h>
79#include <sys/pcq.h> 79#include <sys/pcq.h>
80 80
81#include <net/bpf.h> 81#include <net/bpf.h>
82#include <net/if.h> 82#include <net/if.h>
83#include <net/if_dl.h> 83#include <net/if_dl.h>
84#include <net/if_media.h> 84#include <net/if_media.h>
85#include <net/if_ether.h> 85#include <net/if_ether.h>
86#include <net/rss_config.h> 86#include <net/rss_config.h>
87 87
88#include <dev/pci/pcivar.h> 88#include <dev/pci/pcivar.h>
89#include <dev/pci/pcireg.h> 89#include <dev/pci/pcireg.h>
90#include <dev/pci/pcidevs.h> 90#include <dev/pci/pcidevs.h>
91#include <dev/sysmon/sysmonvar.h> 91#include <dev/sysmon/sysmonvar.h>
92 92
93/* driver configuration */ 93/* driver configuration */
94#define CONFIG_INTR_MODERATION_ENABLE true /* delayed interrupt */ 94#define CONFIG_INTR_MODERATION_ENABLE true /* delayed interrupt */
95#undef CONFIG_LRO_SUPPORT /* no LRO not suppoted */ 95#undef CONFIG_LRO_SUPPORT /* no LRO not suppoted */
96#undef CONFIG_NO_TXRX_INDEPENDENT /* share TX/RX interrupts */ 96#undef CONFIG_NO_TXRX_INDEPENDENT /* share TX/RX interrupts */
97 97
98#define AQ_NINTR_MAX (AQ_RSSQUEUE_MAX + AQ_RSSQUEUE_MAX + 1) 98#define AQ_NINTR_MAX (AQ_RSSQUEUE_MAX + AQ_RSSQUEUE_MAX + 1)
99 /* TX + RX + LINK. must be <= 32 */ 99 /* TX + RX + LINK. must be <= 32 */
100#define AQ_LINKSTAT_IRQ 31 /* for legacy mode */ 100#define AQ_LINKSTAT_IRQ 31 /* for legacy mode */
101 101
102#define AQ_TXD_NUM 2048 /* per ring. 8*n && 32~8184 */ 102#define AQ_TXD_NUM 2048 /* per ring. 8*n && 32~8184 */
103#define AQ_RXD_NUM 2048 /* per ring. 8*n && 32~8184 */ 103#define AQ_RXD_NUM 2048 /* per ring. 8*n && 32~8184 */
104/* minimum required to send a packet (vlan needs additional TX descriptor) */ 104/* minimum required to send a packet (vlan needs additional TX descriptor) */
105#define AQ_TXD_MIN (1 + 1) 105#define AQ_TXD_MIN (1 + 1)
106 106
107 107
108/* hardware specification */ 108/* hardware specification */
109#define AQ_RINGS_NUM 32 109#define AQ_RINGS_NUM 32
110#define AQ_RSSQUEUE_MAX 8 110#define AQ_RSSQUEUE_MAX 8
111#define AQ_RX_DESCRIPTOR_MIN 32 111#define AQ_RX_DESCRIPTOR_MIN 32
112#define AQ_TX_DESCRIPTOR_MIN 32 112#define AQ_TX_DESCRIPTOR_MIN 32
113#define AQ_RX_DESCRIPTOR_MAX 8184 113#define AQ_RX_DESCRIPTOR_MAX 8184
114#define AQ_TX_DESCRIPTOR_MAX 8184 114#define AQ_TX_DESCRIPTOR_MAX 8184
115#define AQ_TRAFFICCLASS_NUM 8 115#define AQ_TRAFFICCLASS_NUM 8
116#define AQ_RSS_HASHKEY_SIZE 40 116#define AQ_RSS_HASHKEY_SIZE 40
117#define AQ_RSS_INDIRECTION_TABLE_MAX 64 117#define AQ_RSS_INDIRECTION_TABLE_MAX 64
118 118
119/* 119/*
120 * TERMINOLOGY 120 * TERMINOLOGY
121 * MPI = MAC PHY INTERFACE? 121 * MPI = MAC PHY INTERFACE?
122 * RPO = RX Protocol Offloading 122 * RPO = RX Protocol Offloading
123 * TPO = TX Protocol Offloading 123 * TPO = TX Protocol Offloading
124 * RPF = RX Packet Filter 124 * RPF = RX Packet Filter
125 * TPB = TX Packet buffer 125 * TPB = TX Packet buffer
126 * RPB = RX Packet buffer 126 * RPB = RX Packet buffer
127 */ 127 */
128 128
129/* registers */ 129/* registers */
130#define AQ_FW_SOFTRESET_REG 0x0000 130#define AQ_FW_SOFTRESET_REG 0x0000
131#define AQ_FW_SOFTRESET_RESET __BIT(15) /* soft reset bit */ 131#define AQ_FW_SOFTRESET_RESET __BIT(15) /* soft reset bit */
132#define AQ_FW_SOFTRESET_DIS __BIT(14) /* reset disable */ 132#define AQ_FW_SOFTRESET_DIS __BIT(14) /* reset disable */
133 133
134#define AQ_FW_VERSION_REG 0x0018 134#define AQ_FW_VERSION_REG 0x0018
135#define AQ_HW_REVISION_REG 0x001c 135#define AQ_HW_REVISION_REG 0x001c
136#define AQ_GLB_NVR_INTERFACE1_REG 0x0100 136#define AQ_GLB_NVR_INTERFACE1_REG 0x0100
137 137
138#define AQ_FW_MBOX_CMD_REG 0x0200 138#define AQ_FW_MBOX_CMD_REG 0x0200
139#define AQ_FW_MBOX_CMD_EXECUTE 0x00008000 139#define AQ_FW_MBOX_CMD_EXECUTE 0x00008000
140#define AQ_FW_MBOX_CMD_BUSY 0x00000100 140#define AQ_FW_MBOX_CMD_BUSY 0x00000100
141#define AQ_FW_MBOX_ADDR_REG 0x0208 141#define AQ_FW_MBOX_ADDR_REG 0x0208
142#define AQ_FW_MBOX_VAL_REG 0x020c 142#define AQ_FW_MBOX_VAL_REG 0x020c
143 143
144#define FW2X_LED_MIN_VERSION 0x03010026 /* >= 3.1.38 */ 144#define FW2X_LED_MIN_VERSION 0x03010026 /* >= 3.1.38 */
145#define FW2X_LED_REG 0x031c 145#define FW2X_LED_REG 0x031c
146#define FW2X_LED_DEFAULT 0x00000000 146#define FW2X_LED_DEFAULT 0x00000000
147#define FW2X_LED_NONE 0x0000003f 147#define FW2X_LED_NONE 0x0000003f
148#define FW2X_LINKLED __BITS(0,1) 148#define FW2X_LINKLED __BITS(0,1)
149#define FW2X_LINKLED_ACTIVE 0 149#define FW2X_LINKLED_ACTIVE 0
150#define FW2X_LINKLED_ON 1 150#define FW2X_LINKLED_ON 1
151#define FW2X_LINKLED_BLINK 2 151#define FW2X_LINKLED_BLINK 2
152#define FW2X_LINKLED_OFF 3 152#define FW2X_LINKLED_OFF 3
153#define FW2X_STATUSLED __BITS(2,5) 153#define FW2X_STATUSLED __BITS(2,5)
154#define FW2X_STATUSLED_ORANGE 0 154#define FW2X_STATUSLED_ORANGE 0
155#define FW2X_STATUSLED_ORANGE_BLINK 2 155#define FW2X_STATUSLED_ORANGE_BLINK 2
156#define FW2X_STATUSLED_OFF 3 156#define FW2X_STATUSLED_OFF 3
157#define FW2X_STATUSLED_GREEN 4 157#define FW2X_STATUSLED_GREEN 4
158#define FW2X_STATUSLED_ORANGE_GREEN_BLINK 8 158#define FW2X_STATUSLED_ORANGE_GREEN_BLINK 8
159#define FW2X_STATUSLED_GREEN_BLINK 10 159#define FW2X_STATUSLED_GREEN_BLINK 10
160 160
161#define FW_MPI_MBOX_ADDR_REG 0x0360 161#define FW_MPI_MBOX_ADDR_REG 0x0360
162#define FW1X_MPI_INIT1_REG 0x0364 162#define FW1X_MPI_INIT1_REG 0x0364
163#define FW1X_MPI_CONTROL_REG 0x0368 163#define FW1X_MPI_CONTROL_REG 0x0368
164#define FW1X_MPI_STATE_REG 0x036c 164#define FW1X_MPI_STATE_REG 0x036c
165#define FW1X_MPI_STATE_MODE __BITS(7,0) 165#define FW1X_MPI_STATE_MODE __BITS(7,0)
166#define FW1X_MPI_STATE_SPEED __BITS(32,16) 166#define FW1X_MPI_STATE_SPEED __BITS(32,16)
167#define FW1X_MPI_STATE_DISABLE_DIRTYWAKE __BITS(25) 167#define FW1X_MPI_STATE_DISABLE_DIRTYWAKE __BITS(25)
168#define FW1X_MPI_STATE_DOWNSHIFT __BITS(31,28) 168#define FW1X_MPI_STATE_DOWNSHIFT __BITS(31,28)
169#define FW1X_MPI_INIT2_REG 0x0370 169#define FW1X_MPI_INIT2_REG 0x0370
170#define FW1X_MPI_EFUSEADDR_REG 0x0374 170#define FW1X_MPI_EFUSEADDR_REG 0x0374
171 171
172#define FW2X_MPI_EFUSEADDR_REG 0x0364 172#define FW2X_MPI_EFUSEADDR_REG 0x0364
173#define FW2X_MPI_CONTROL_REG 0x0368 /* 64bit */ 173#define FW2X_MPI_CONTROL_REG 0x0368 /* 64bit */
174#define FW2X_MPI_STATE_REG 0x0370 /* 64bit */ 174#define FW2X_MPI_STATE_REG 0x0370 /* 64bit */
175#define FW_BOOT_EXIT_CODE_REG 0x0388 175#define FW_BOOT_EXIT_CODE_REG 0x0388
176#define RBL_STATUS_DEAD 0x0000dead 176#define RBL_STATUS_DEAD 0x0000dead
177#define RBL_STATUS_SUCCESS 0x0000abba 177#define RBL_STATUS_SUCCESS 0x0000abba
178#define RBL_STATUS_FAILURE 0x00000bad 178#define RBL_STATUS_FAILURE 0x00000bad
179#define RBL_STATUS_HOST_BOOT 0x0000f1a7 179#define RBL_STATUS_HOST_BOOT 0x0000f1a7
180 180
181#define AQ_FW_GLB_CPU_SEM_REG(i) (0x03a0 + (i) * 4) 181#define AQ_FW_GLB_CPU_SEM_REG(i) (0x03a0 + (i) * 4)
182#define AQ_FW_SEM_RAM_REG AQ_FW_GLB_CPU_SEM_REG(2) 182#define AQ_FW_SEM_RAM_REG AQ_FW_GLB_CPU_SEM_REG(2)
183 183
184#define AQ_FW_GLB_CTL2_REG 0x0404 184#define AQ_FW_GLB_CTL2_REG 0x0404
185#define AQ_FW_GLB_CTL2_MCP_UP_FORCE_INTERRUPT __BIT(1) 185#define AQ_FW_GLB_CTL2_MCP_UP_FORCE_INTERRUPT __BIT(1)
186 186
187#define AQ_GLB_GENERAL_PROVISIONING9_REG 0x0520 187#define AQ_GLB_GENERAL_PROVISIONING9_REG 0x0520
188#define AQ_GLB_NVR_PROVISIONING2_REG 0x0534 188#define AQ_GLB_NVR_PROVISIONING2_REG 0x0534
189 189
190#define FW_MPI_DAISY_CHAIN_STATUS_REG 0x0704 190#define FW_MPI_DAISY_CHAIN_STATUS_REG 0x0704
191 191
192#define AQ_PCI_REG_CONTROL_6_REG 0x1014 192#define AQ_PCI_REG_CONTROL_6_REG 0x1014
193 193
194// msix bitmap */ 194// msix bitmap */
195#define AQ_INTR_STATUS_REG 0x2000 /* intr status */ 195#define AQ_INTR_STATUS_REG 0x2000 /* intr status */
196#define AQ_INTR_STATUS_CLR_REG 0x2050 /* intr status clear */ 196#define AQ_INTR_STATUS_CLR_REG 0x2050 /* intr status clear */
197#define AQ_INTR_MASK_REG 0x2060 /* intr mask set */ 197#define AQ_INTR_MASK_REG 0x2060 /* intr mask set */
198#define AQ_INTR_MASK_CLR_REG 0x2070 /* intr mask clear */ 198#define AQ_INTR_MASK_CLR_REG 0x2070 /* intr mask clear */
199#define AQ_INTR_AUTOMASK_REG 0x2090 199#define AQ_INTR_AUTOMASK_REG 0x2090
200 200
201/* AQ_INTR_IRQ_MAP_TXRX_REG[AQ_RINGS_NUM] 0x2100-0x2140 */ 201/* AQ_INTR_IRQ_MAP_TXRX_REG[AQ_RINGS_NUM] 0x2100-0x2140 */
202#define AQ_INTR_IRQ_MAP_TXRX_REG(i) (0x2100 + ((i) / 2) * 4) 202#define AQ_INTR_IRQ_MAP_TXRX_REG(i) (0x2100 + ((i) / 2) * 4)
203#define AQ_INTR_IRQ_MAP_TX_REG(i) AQ_INTR_IRQ_MAP_TXRX_REG(i) 203#define AQ_INTR_IRQ_MAP_TX_REG(i) AQ_INTR_IRQ_MAP_TXRX_REG(i)
204#define AQ_INTR_IRQ_MAP_TX_IRQMAP(i) (__BITS(28,24) >> (((i) & 1)*8)) 204#define AQ_INTR_IRQ_MAP_TX_IRQMAP(i) (__BITS(28,24) >> (((i) & 1)*8))
205#define AQ_INTR_IRQ_MAP_TX_EN(i) (__BIT(31) >> (((i) & 1)*8)) 205#define AQ_INTR_IRQ_MAP_TX_EN(i) (__BIT(31) >> (((i) & 1)*8))
206#define AQ_INTR_IRQ_MAP_RX_REG(i) AQ_INTR_IRQ_MAP_TXRX_REG(i) 206#define AQ_INTR_IRQ_MAP_RX_REG(i) AQ_INTR_IRQ_MAP_TXRX_REG(i)
207#define AQ_INTR_IRQ_MAP_RX_IRQMAP(i) (__BITS(12,8) >> (((i) & 1)*8)) 207#define AQ_INTR_IRQ_MAP_RX_IRQMAP(i) (__BITS(12,8) >> (((i) & 1)*8))
208#define AQ_INTR_IRQ_MAP_RX_EN(i) (__BIT(15) >> (((i) & 1)*8)) 208#define AQ_INTR_IRQ_MAP_RX_EN(i) (__BIT(15) >> (((i) & 1)*8))
209 209
210/* AQ_GEN_INTR_MAP_REG[AQ_RINGS_NUM] 0x2180-0x2200 */ 210/* AQ_GEN_INTR_MAP_REG[AQ_RINGS_NUM] 0x2180-0x2200 */
211#define AQ_GEN_INTR_MAP_REG(i) (0x2180 + (i) * 4) 211#define AQ_GEN_INTR_MAP_REG(i) (0x2180 + (i) * 4)
212#define AQ_B0_ERR_INT 8U 212#define AQ_B0_ERR_INT 8U
213 213
214#define AQ_INTR_CTRL_REG 0x2300 214#define AQ_INTR_CTRL_REG 0x2300
215#define AQ_INTR_CTRL_IRQMODE __BITS(1,0) 215#define AQ_INTR_CTRL_IRQMODE __BITS(1,0)
216#define AQ_INTR_CTRL_IRQMODE_LEGACY 0 216#define AQ_INTR_CTRL_IRQMODE_LEGACY 0
217#define AQ_INTR_CTRL_IRQMODE_MSI 1 217#define AQ_INTR_CTRL_IRQMODE_MSI 1
218#define AQ_INTR_CTRL_IRQMODE_MSIX 2 218#define AQ_INTR_CTRL_IRQMODE_MSIX 2
219#define AQ_INTR_CTRL_MULTIVEC __BIT(2) 219#define AQ_INTR_CTRL_MULTIVEC __BIT(2)
220#define AQ_INTR_CTRL_AUTO_MASK __BIT(5) 220#define AQ_INTR_CTRL_AUTO_MASK __BIT(5)
221#define AQ_INTR_CTRL_CLR_ON_READ __BIT(7) 221#define AQ_INTR_CTRL_CLR_ON_READ __BIT(7)
222#define AQ_INTR_CTRL_RESET_DIS __BIT(29) 222#define AQ_INTR_CTRL_RESET_DIS __BIT(29)
223#define AQ_INTR_CTRL_RESET_IRQ __BIT(31) 223#define AQ_INTR_CTRL_RESET_IRQ __BIT(31)
224 224
225#define AQ_MBOXIF_POWER_GATING_CONTROL_REG 0x32a8 225#define AQ_MBOXIF_POWER_GATING_CONTROL_REG 0x32a8
226 226
227#define FW_MPI_RESETCTRL_REG 0x4000 227#define FW_MPI_RESETCTRL_REG 0x4000
228#define FW_MPI_RESETCTRL_RESET_DIS __BIT(29) 228#define FW_MPI_RESETCTRL_RESET_DIS __BIT(29)
229 229
230#define RX_SYSCONTROL_REG 0x5000 230#define RX_SYSCONTROL_REG 0x5000
231#define RX_SYSCONTROL_RPB_DMA_LOOPBACK __BIT(6) 231#define RX_SYSCONTROL_RPB_DMA_LOOPBACK __BIT(6)
232#define RX_SYSCONTROL_RPF_TPO_LOOPBACK __BIT(8) 232#define RX_SYSCONTROL_RPF_TPO_LOOPBACK __BIT(8)
233#define RX_SYSCONTROL_RESET_DIS __BIT(29) 233#define RX_SYSCONTROL_RESET_DIS __BIT(29)
234 234
235#define RX_TCP_RSS_HASH_REG 0x5040 235#define RX_TCP_RSS_HASH_REG 0x5040
236#define RX_TCP_RSS_HASH_RPF2 __BITS(19,16) 236#define RX_TCP_RSS_HASH_RPF2 __BITS(19,16)
237#define RX_TCP_RSS_HASH_TYPE __BITS(15,0) 237#define RX_TCP_RSS_HASH_TYPE __BITS(15,0)
238 238
239/* for RPF_*_REG.ACTION */ 239/* for RPF_*_REG.ACTION */
240#define RPF_ACTION_DISCARD 0 240#define RPF_ACTION_DISCARD 0
241#define RPF_ACTION_HOST 1 241#define RPF_ACTION_HOST 1
242#define RPF_ACTION_MANAGEMENT 2 242#define RPF_ACTION_MANAGEMENT 2
243#define RPF_ACTION_HOST_MANAGEMENT 3 243#define RPF_ACTION_HOST_MANAGEMENT 3
244#define RPF_ACTION_WOL 4 244#define RPF_ACTION_WOL 4
245 245
246#define RPF_L2BC_REG 0x5100 246#define RPF_L2BC_REG 0x5100
247#define RPF_L2BC_EN __BIT(0) 247#define RPF_L2BC_EN __BIT(0)
248#define RPF_L2BC_PROMISC __BIT(3) 248#define RPF_L2BC_PROMISC __BIT(3)
249#define RPF_L2BC_ACTION __BITS(12,14) 249#define RPF_L2BC_ACTION __BITS(12,14)
250#define RPF_L2BC_THRESHOLD __BITS(31,16) 250#define RPF_L2BC_THRESHOLD __BITS(31,16)
251 251
252/* RPF_L2UC_*_REG[34] (actual [38]?) */ 252/* RPF_L2UC_*_REG[34] (actual [38]?) */
253#define RPF_L2UC_LSW_REG(i) (0x5110 + (i) * 8) 253#define RPF_L2UC_LSW_REG(i) (0x5110 + (i) * 8)
254#define RPF_L2UC_MSW_REG(i) (0x5114 + (i) * 8) 254#define RPF_L2UC_MSW_REG(i) (0x5114 + (i) * 8)
255#define RPF_L2UC_MSW_MACADDR_HI __BITS(15,0) 255#define RPF_L2UC_MSW_MACADDR_HI __BITS(15,0)
256#define RPF_L2UC_MSW_ACTION __BITS(18,16) 256#define RPF_L2UC_MSW_ACTION __BITS(18,16)
257#define RPF_L2UC_MSW_EN __BIT(31) 257#define RPF_L2UC_MSW_EN __BIT(31)
258#define AQ_HW_MAC_OWN 0 /* index of own address */ 258#define AQ_HW_MAC_OWN 0 /* index of own address */
259#define AQ_HW_MAC_NUM 34 259#define AQ_HW_MAC_NUM 34
260 260
261/* RPF_MCAST_FILTER_REG[8] 0x5250-0x5270 */ 261/* RPF_MCAST_FILTER_REG[8] 0x5250-0x5270 */
262#define RPF_MCAST_FILTER_REG(i) (0x5250 + (i) * 4) 262#define RPF_MCAST_FILTER_REG(i) (0x5250 + (i) * 4)
263#define RPF_MCAST_FILTER_EN __BIT(31) 263#define RPF_MCAST_FILTER_EN __BIT(31)
264#define RPF_MCAST_FILTER_MASK_REG 0x5270 264#define RPF_MCAST_FILTER_MASK_REG 0x5270
265#define RPF_MCAST_FILTER_MASK_ALLMULTI __BIT(14) 265#define RPF_MCAST_FILTER_MASK_ALLMULTI __BIT(14)
266 266
267#define RPF_VLAN_MODE_REG 0x5280 267#define RPF_VLAN_MODE_REG 0x5280
268#define RPF_VLAN_MODE_PROMISC __BIT(1) 268#define RPF_VLAN_MODE_PROMISC __BIT(1)
269#define RPF_VLAN_MODE_ACCEPT_UNTAGGED __BIT(2) 269#define RPF_VLAN_MODE_ACCEPT_UNTAGGED __BIT(2)
270#define RPF_VLAN_MODE_UNTAGGED_ACTION __BITS(5,3) 270#define RPF_VLAN_MODE_UNTAGGED_ACTION __BITS(5,3)
271 271
272#define RPF_VLAN_TPID_REG 0x5284 272#define RPF_VLAN_TPID_REG 0x5284
273#define RPF_VLAN_TPID_OUTER __BITS(31,16) 273#define RPF_VLAN_TPID_OUTER __BITS(31,16)
274#define RPF_VLAN_TPID_INNER __BITS(15,0) 274#define RPF_VLAN_TPID_INNER __BITS(15,0)
275 275
276/* RPF_VLAN_FILTER_REG[RPF_VLAN_MAX_FILTERS] 0x5290-0x52d0 */ 276/* RPF_VLAN_FILTER_REG[RPF_VLAN_MAX_FILTERS] 0x5290-0x52d0 */
277#define RPF_VLAN_MAX_FILTERS 16 277#define RPF_VLAN_MAX_FILTERS 16
278#define RPF_VLAN_FILTER_REG(i) (0x5290 + (i) * 4) 278#define RPF_VLAN_FILTER_REG(i) (0x5290 + (i) * 4)
279#define RPF_VLAN_FILTER_EN __BIT(31) 279#define RPF_VLAN_FILTER_EN __BIT(31)
280#define RPF_VLAN_FILTER_RXQ_EN __BIT(28) 280#define RPF_VLAN_FILTER_RXQ_EN __BIT(28)
281#define RPF_VLAN_FILTER_RXQ __BITS(24,20) 281#define RPF_VLAN_FILTER_RXQ __BITS(24,20)
282#define RPF_VLAN_FILTER_ACTION __BITS(18,16) 282#define RPF_VLAN_FILTER_ACTION __BITS(18,16)
283#define RPF_VLAN_FILTER_ID __BITS(11,0) 283#define RPF_VLAN_FILTER_ID __BITS(11,0)
284 284
285/* RPF_ETHERTYPE_FILTER_REG[AQ_RINGS_NUM] 0x5300-0x5380 */ 285/* RPF_ETHERTYPE_FILTER_REG[AQ_RINGS_NUM] 0x5300-0x5380 */
286#define RPF_ETHERTYPE_FILTER_REG(i) (0x5300 + (i) * 4) 286#define RPF_ETHERTYPE_FILTER_REG(i) (0x5300 + (i) * 4)
287#define RPF_ETHERTYPE_FILTER_EN __BIT(31) 287#define RPF_ETHERTYPE_FILTER_EN __BIT(31)
288#define RPF_ETHERTYPE_FILTER_PRIO_EN __BIT(30) 288#define RPF_ETHERTYPE_FILTER_PRIO_EN __BIT(30)
289#define RPF_ETHERTYPE_FILTER_RXQF_EN __BIT(29) 289#define RPF_ETHERTYPE_FILTER_RXQF_EN __BIT(29)
290#define RPF_ETHERTYPE_FILTER_PRIO __BITS(28,26) 290#define RPF_ETHERTYPE_FILTER_PRIO __BITS(28,26)
291#define RPF_ETHERTYPE_FILTER_RXQF __BITS(24,20) 291#define RPF_ETHERTYPE_FILTER_RXQF __BITS(24,20)
292#define RPF_ETHERTYPE_FILTER_MNG_RXQF __BIT(19) 292#define RPF_ETHERTYPE_FILTER_MNG_RXQF __BIT(19)
293#define RPF_ETHERTYPE_FILTER_ACTION __BITS(18,16) 293#define RPF_ETHERTYPE_FILTER_ACTION __BITS(18,16)
294#define RPF_ETHERTYPE_FILTER_VAL __BITS(15,0) 294#define RPF_ETHERTYPE_FILTER_VAL __BITS(15,0)
295 295
296/* RPF_L3_FILTER_REG[8] 0x5380-0x53a0 */ 296/* RPF_L3_FILTER_REG[8] 0x5380-0x53a0 */
297#define RPF_L3_FILTER_REG(i) (0x5380 + (i) * 4) 297#define RPF_L3_FILTER_REG(i) (0x5380 + (i) * 4)
298#define RPF_L3_FILTER_L4_EN __BIT(31) 298#define RPF_L3_FILTER_L4_EN __BIT(31)
299#define RPF_L3_FILTER_IPV6_EN __BIT(30) 299#define RPF_L3_FILTER_IPV6_EN __BIT(30)
300#define RPF_L3_FILTER_SRCADDR_EN __BIT(29) 300#define RPF_L3_FILTER_SRCADDR_EN __BIT(29)
301#define RPF_L3_FILTER_DSTADDR_EN __BIT(28) 301#define RPF_L3_FILTER_DSTADDR_EN __BIT(28)
302#define RPF_L3_FILTER_L4_SRCPORT_EN __BIT(27) 302#define RPF_L3_FILTER_L4_SRCPORT_EN __BIT(27)
303#define RPF_L3_FILTER_L4_DSTPORT_EN __BIT(26) 303#define RPF_L3_FILTER_L4_DSTPORT_EN __BIT(26)
304#define RPF_L3_FILTER_L4_PROTO_EN __BIT(25) 304#define RPF_L3_FILTER_L4_PROTO_EN __BIT(25)
305#define RPF_L3_FILTER_ARP_EN __BIT(24) 305#define RPF_L3_FILTER_ARP_EN __BIT(24)
306#define RPF_L3_FILTER_L4_RXQUEUE_EN __BIT(23) 306#define RPF_L3_FILTER_L4_RXQUEUE_EN __BIT(23)
307#define RPF_L3_FILTER_L4_RXQUEUE_MANAGEMENT_EN __BIT(22) 307#define RPF_L3_FILTER_L4_RXQUEUE_MANAGEMENT_EN __BIT(22)
308#define RPF_L3_FILTER_L4_ACTION __BITS(16,18) 308#define RPF_L3_FILTER_L4_ACTION __BITS(16,18)
309#define RPF_L3_FILTER_L4_RXQUEUE __BITS(12,8) 309#define RPF_L3_FILTER_L4_RXQUEUE __BITS(12,8)
310#define RPF_L3_FILTER_L4_PROTO __BITS(2,0) 310#define RPF_L3_FILTER_L4_PROTO __BITS(2,0)
311#define RPF_L3_FILTER_L4_PROTO_TCP 0 311#define RPF_L3_FILTER_L4_PROTO_TCP 0
312#define RPF_L3_FILTER_L4_PROTO_UDP 1 312#define RPF_L3_FILTER_L4_PROTO_UDP 1
313#define RPF_L3_FILTER_L4_PROTO_SCTP 2 313#define RPF_L3_FILTER_L4_PROTO_SCTP 2
314#define RPF_L3_FILTER_L4_PROTO_ICMP 3 314#define RPF_L3_FILTER_L4_PROTO_ICMP 3
315/* parameters of RPF_L3_FILTER_REG[8] */ 315/* parameters of RPF_L3_FILTER_REG[8] */
316#define RPF_L3_FILTER_SRCADDR_REG(i) (0x53b0 + (i) * 4) 316#define RPF_L3_FILTER_SRCADDR_REG(i) (0x53b0 + (i) * 4)
317#define RPF_L3_FILTER_DSTADDR_REG(i) (0x53d0 + (i) * 4) 317#define RPF_L3_FILTER_DSTADDR_REG(i) (0x53d0 + (i) * 4)
318#define RPF_L3_FILTER_L4_SRCPORT_REG(i) (0x5400 + (i) * 4) 318#define RPF_L3_FILTER_L4_SRCPORT_REG(i) (0x5400 + (i) * 4)
319#define RPF_L3_FILTER_L4_DSTPORT_REG(i) (0x5420 + (i) * 4) 319#define RPF_L3_FILTER_L4_DSTPORT_REG(i) (0x5420 + (i) * 4)
320 320
321#define RX_FLR_RSS_CONTROL1_REG 0x54c0 321#define RX_FLR_RSS_CONTROL1_REG 0x54c0
322#define RX_FLR_RSS_CONTROL1_EN __BIT(31) 322#define RX_FLR_RSS_CONTROL1_EN __BIT(31)
323 323
324#define RPF_RPB_RX_TC_UPT_REG 0x54c4 324#define RPF_RPB_RX_TC_UPT_REG 0x54c4
325#define RPF_RPB_RX_TC_UPT_MASK(i) (0x00000007 << ((i) * 4)) 325#define RPF_RPB_RX_TC_UPT_MASK(i) (0x00000007 << ((i) * 4))
326 326
327#define RPF_RSS_KEY_ADDR_REG 0x54d0 327#define RPF_RSS_KEY_ADDR_REG 0x54d0
328#define RPF_RSS_KEY_ADDR __BITS(4,0) 328#define RPF_RSS_KEY_ADDR __BITS(4,0)
329#define RPF_RSS_KEY_WR_EN __BIT(5) 329#define RPF_RSS_KEY_WR_EN __BIT(5)
330#define RPF_RSS_KEY_WR_DATA_REG 0x54d4 330#define RPF_RSS_KEY_WR_DATA_REG 0x54d4
331#define RPF_RSS_KEY_RD_DATA_REG 0x54d8 331#define RPF_RSS_KEY_RD_DATA_REG 0x54d8
332 332
333#define RPF_RSS_REDIR_ADDR_REG 0x54e0 333#define RPF_RSS_REDIR_ADDR_REG 0x54e0
334#define RPF_RSS_REDIR_ADDR __BITS(3,0) 334#define RPF_RSS_REDIR_ADDR __BITS(3,0)
335#define RPF_RSS_REDIR_WR_EN __BIT(4) 335#define RPF_RSS_REDIR_WR_EN __BIT(4)
336 336
337#define RPF_RSS_REDIR_WR_DATA_REG 0x54e4 337#define RPF_RSS_REDIR_WR_DATA_REG 0x54e4
338#define RPF_RSS_REDIR_WR_DATA __BITS(15,0) 338#define RPF_RSS_REDIR_WR_DATA __BITS(15,0)
339 339
340#define RPO_HWCSUM_REG 0x5580 340#define RPO_HWCSUM_REG 0x5580
341#define RPO_HWCSUM_IP4CSUM_EN __BIT(1) 341#define RPO_HWCSUM_IP4CSUM_EN __BIT(1)
342#define RPO_HWCSUM_L4CSUM_EN __BIT(0) /* TCP/UDP/SCTP */ 342#define RPO_HWCSUM_L4CSUM_EN __BIT(0) /* TCP/UDP/SCTP */
343 343
344#define RPO_LRO_ENABLE_REG 0x5590 344#define RPO_LRO_ENABLE_REG 0x5590
345 345
346#define RPO_LRO_CONF_REG 0x5594 346#define RPO_LRO_CONF_REG 0x5594
347#define RPO_LRO_CONF_QSESSION_LIMIT __BITS(13,12) 347#define RPO_LRO_CONF_QSESSION_LIMIT __BITS(13,12)
348#define RPO_LRO_CONF_TOTAL_DESC_LIMIT __BITS(6,5) 348#define RPO_LRO_CONF_TOTAL_DESC_LIMIT __BITS(6,5)
349#define RPO_LRO_CONF_PATCHOPTIMIZATION_EN __BIT(15) 349#define RPO_LRO_CONF_PATCHOPTIMIZATION_EN __BIT(15)
350#define RPO_LRO_CONF_MIN_PAYLOAD_OF_FIRST_PKT __BITS(4,0) 350#define RPO_LRO_CONF_MIN_PAYLOAD_OF_FIRST_PKT __BITS(4,0)
351#define RPO_LRO_RSC_MAX_REG 0x5598 351#define RPO_LRO_RSC_MAX_REG 0x5598
352 352
353/* RPO_LRO_LDES_MAX_REG[32/8] 0x55a0-0x55b0 */ 353/* RPO_LRO_LDES_MAX_REG[32/8] 0x55a0-0x55b0 */
354#define RPO_LRO_LDES_MAX_REG(i) (0x55a0 + (i / 8) * 4) 354#define RPO_LRO_LDES_MAX_REG(i) (0x55a0 + (i / 8) * 4)
355#define RPO_LRO_LDES_MAX_MASK(i) (0x00000003 << ((i & 7) * 4)) 355#define RPO_LRO_LDES_MAX_MASK(i) (0x00000003 << ((i & 7) * 4))
356#define RPO_LRO_TB_DIV_REG 0x5620 356#define RPO_LRO_TB_DIV_REG 0x5620
357#define RPO_LRO_TB_DIV __BITS(20,31) 357#define RPO_LRO_TB_DIV __BITS(20,31)
358#define RPO_LRO_INACTIVE_IVAL_REG 0x5620 358#define RPO_LRO_INACTIVE_IVAL_REG 0x5620
359#define RPO_LRO_INACTIVE_IVAL __BITS(10,19) 359#define RPO_LRO_INACTIVE_IVAL __BITS(10,19)
360#define RPO_LRO_MAX_COALESCING_IVAL_REG 0x5620 360#define RPO_LRO_MAX_COALESCING_IVAL_REG 0x5620
361#define RPO_LRO_MAX_COALESCING_IVAL __BITS(9,0) 361#define RPO_LRO_MAX_COALESCING_IVAL __BITS(9,0)
362 362
363#define RPB_RPF_RX_REG 0x5700 363#define RPB_RPF_RX_REG 0x5700
364#define RPB_RPF_RX_TC_MODE __BIT(8) 364#define RPB_RPF_RX_TC_MODE __BIT(8)
365#define RPB_RPF_RX_FC_MODE __BITS(5,4) 365#define RPB_RPF_RX_FC_MODE __BITS(5,4)
366#define RPB_RPF_RX_BUF_EN __BIT(0) 366#define RPB_RPF_RX_BUF_EN __BIT(0)
367 367
368/* RPB_RXB_BUFSIZE_REG[AQ_TRAFFICCLASS_NUM] 0x5710-0x5790 */ 368/* RPB_RXB_BUFSIZE_REG[AQ_TRAFFICCLASS_NUM] 0x5710-0x5790 */
369#define RPB_RXB_BUFSIZE_REG(i) (0x5710 + (i) * 0x10) 369#define RPB_RXB_BUFSIZE_REG(i) (0x5710 + (i) * 0x10)
370#define RPB_RXB_BUFSIZE __BITS(8,0) 370#define RPB_RXB_BUFSIZE __BITS(8,0)
371#define RPB_RXB_XOFF_REG(i) (0x5714 + (i) * 0x10) 371#define RPB_RXB_XOFF_REG(i) (0x5714 + (i) * 0x10)
372#define RPB_RXB_XOFF_EN __BIT(31) 372#define RPB_RXB_XOFF_EN __BIT(31)
373#define RPB_RXB_XOFF_THRESH_HI __BITS(29,16) 373#define RPB_RXB_XOFF_THRESH_HI __BITS(29,16)
374#define RPB_RXB_XOFF_THRESH_LO __BITS(13,0) 374#define RPB_RXB_XOFF_THRESH_LO __BITS(13,0)
375 375
376#define RX_DMA_DESC_CACHE_INIT_REG 0x5a00 376#define RX_DMA_DESC_CACHE_INIT_REG 0x5a00
377#define RX_DMA_DESC_CACHE_INIT __BIT(0) 377#define RX_DMA_DESC_CACHE_INIT __BIT(0)
378 378
379#define RX_DMA_INT_DESC_WRWB_EN_REG 0x05a30 379#define RX_DMA_INT_DESC_WRWB_EN_REG 0x05a30
380#define RX_DMA_INT_DESC_WRWB_EN __BIT(2) 380#define RX_DMA_INT_DESC_WRWB_EN __BIT(2)
381#define RX_DMA_INT_DESC_MODERATE_EN __BIT(3) 381#define RX_DMA_INT_DESC_MODERATE_EN __BIT(3)
382 382
383/* RX_INTR_MODERATION_CTL_REG[AQ_RINGS_NUM] 0x5a40-0x5ac0 */ 383/* RX_INTR_MODERATION_CTL_REG[AQ_RINGS_NUM] 0x5a40-0x5ac0 */
384#define RX_INTR_MODERATION_CTL_REG(i) (0x5a40 + (i) * 4) 384#define RX_INTR_MODERATION_CTL_REG(i) (0x5a40 + (i) * 4)
385#define RX_INTR_MODERATION_CTL_EN __BIT(1) 385#define RX_INTR_MODERATION_CTL_EN __BIT(1)
386#define RX_INTR_MODERATION_CTL_MIN __BITS(15,8) 386#define RX_INTR_MODERATION_CTL_MIN __BITS(15,8)
387#define RX_INTR_MODERATION_CTL_MAX __BITS(24,16) 387#define RX_INTR_MODERATION_CTL_MAX __BITS(24,16)
388 388
389/* RX_DMA_DESC_*[AQ_RINGS_NUM] 0x5b00-0x5f00 */ 389/* RX_DMA_DESC_*[AQ_RINGS_NUM] 0x5b00-0x5f00 */
390#define RX_DMA_DESC_BASE_ADDRLSW_REG(i) (0x5b00 + (i) * 0x20) 390#define RX_DMA_DESC_BASE_ADDRLSW_REG(i) (0x5b00 + (i) * 0x20)
391#define RX_DMA_DESC_BASE_ADDRMSW_REG(i) (0x5b04 + (i) * 0x20) 391#define RX_DMA_DESC_BASE_ADDRMSW_REG(i) (0x5b04 + (i) * 0x20)
392#define RX_DMA_DESC_REG(i) (0x5b08 + (i) * 0x20) 392#define RX_DMA_DESC_REG(i) (0x5b08 + (i) * 0x20)
393#define RX_DMA_DESC_LEN __BITS(12,3) /* RXD_NUM/8 */ 393#define RX_DMA_DESC_LEN __BITS(12,3) /* RXD_NUM/8 */
394#define RX_DMA_DESC_RESET __BIT(25) 394#define RX_DMA_DESC_RESET __BIT(25)
395#define RX_DMA_DESC_HEADER_SPLIT __BIT(28) 395#define RX_DMA_DESC_HEADER_SPLIT __BIT(28)
396#define RX_DMA_DESC_VLAN_STRIP __BIT(29) 396#define RX_DMA_DESC_VLAN_STRIP __BIT(29)
397#define RX_DMA_DESC_EN __BIT(31) 397#define RX_DMA_DESC_EN __BIT(31)
398#define RX_DMA_DESC_HEAD_PTR_REG(i) (0x5b0c + (i) * 0x20) 398#define RX_DMA_DESC_HEAD_PTR_REG(i) (0x5b0c + (i) * 0x20)
399#define RX_DMA_DESC_HEAD_PTR __BITS(12,0) 399#define RX_DMA_DESC_HEAD_PTR __BITS(12,0)
400#define RX_DMA_DESC_TAIL_PTR_REG(i) (0x5b10 + (i) * 0x20) 400#define RX_DMA_DESC_TAIL_PTR_REG(i) (0x5b10 + (i) * 0x20)
401#define RX_DMA_DESC_BUFSIZE_REG(i) (0x5b18 + (i) * 0x20) 401#define RX_DMA_DESC_BUFSIZE_REG(i) (0x5b18 + (i) * 0x20)
402#define RX_DMA_DESC_BUFSIZE_DATA __BITS(4,0) 402#define RX_DMA_DESC_BUFSIZE_DATA __BITS(4,0)
403#define RX_DMA_DESC_BUFSIZE_HDR __BITS(12,8) 403#define RX_DMA_DESC_BUFSIZE_HDR __BITS(12,8)
404 404
405/* RX_DMA_DCAD_REG[AQ_RINGS_NUM] 0x6100-0x6180 */ 405/* RX_DMA_DCAD_REG[AQ_RINGS_NUM] 0x6100-0x6180 */
406#define RX_DMA_DCAD_REG(i) (0x6100 + (i) * 4) 406#define RX_DMA_DCAD_REG(i) (0x6100 + (i) * 4)
407#define RX_DMA_DCAD_CPUID __BITS(7,0) 407#define RX_DMA_DCAD_CPUID __BITS(7,0)
408#define RX_DMA_DCAD_PAYLOAD_EN __BIT(29) 408#define RX_DMA_DCAD_PAYLOAD_EN __BIT(29)
409#define RX_DMA_DCAD_HEADER_EN __BIT(30) 409#define RX_DMA_DCAD_HEADER_EN __BIT(30)
410#define RX_DMA_DCAD_DESC_EN __BIT(31) 410#define RX_DMA_DCAD_DESC_EN __BIT(31)
411 411
412#define RX_DMA_DCA_REG 0x6180 412#define RX_DMA_DCA_REG 0x6180
413#define RX_DMA_DCA_EN __BIT(31) 413#define RX_DMA_DCA_EN __BIT(31)
414#define RX_DMA_DCA_MODE __BITS(3,0) 414#define RX_DMA_DCA_MODE __BITS(3,0)
415 415
416/* counters */ 416/* counters */
417#define RX_DMA_GOOD_PKT_COUNTERLSW 0x6800 417#define RX_DMA_GOOD_PKT_COUNTERLSW 0x6800
418#define RX_DMA_GOOD_OCTET_COUNTERLSW 0x6808 418#define RX_DMA_GOOD_OCTET_COUNTERLSW 0x6808
419#define RX_DMA_DROP_PKT_CNT_REG 0x6818 419#define RX_DMA_DROP_PKT_CNT_REG 0x6818
420#define RX_DMA_COALESCED_PKT_CNT_REG 0x6820 420#define RX_DMA_COALESCED_PKT_CNT_REG 0x6820
421 421
422#define TX_SYSCONTROL_REG 0x7000 422#define TX_SYSCONTROL_REG 0x7000
423#define TX_SYSCONTROL_TPB_DMA_LOOPBACK __BIT(6) 423#define TX_SYSCONTROL_TPB_DMA_LOOPBACK __BIT(6)
424#define TX_SYSCONTROL_TPO_PKT_LOOPBACK __BIT(7) 424#define TX_SYSCONTROL_TPO_PKT_LOOPBACK __BIT(7)
425#define TX_SYSCONTROL_RESET_DIS __BIT(29) 425#define TX_SYSCONTROL_RESET_DIS __BIT(29)
426 426
427#define TX_TPO2_REG 0x7040 427#define TX_TPO2_REG 0x7040
428#define TX_TPO2_EN __BIT(16) 428#define TX_TPO2_EN __BIT(16)
429 429
430#define TPS_DESC_VM_ARB_MODE_REG 0x7300 430#define TPS_DESC_VM_ARB_MODE_REG 0x7300
431#define TPS_DESC_VM_ARB_MODE __BIT(0) 431#define TPS_DESC_VM_ARB_MODE __BIT(0)
432#define TPS_DESC_RATE_REG 0x7310 432#define TPS_DESC_RATE_REG 0x7310
433#define TPS_DESC_RATE_TA_RST __BIT(31) 433#define TPS_DESC_RATE_TA_RST __BIT(31)
434#define TPS_DESC_RATE_LIM __BITS(10,0) 434#define TPS_DESC_RATE_LIM __BITS(10,0)
435#define TPS_DESC_TC_ARB_MODE_REG 0x7200 435#define TPS_DESC_TC_ARB_MODE_REG 0x7200
436#define TPS_DESC_TC_ARB_MODE __BITS(1,0) 436#define TPS_DESC_TC_ARB_MODE __BITS(1,0)
437#define TPS_DATA_TC_ARB_MODE_REG 0x7100 437#define TPS_DATA_TC_ARB_MODE_REG 0x7100
438#define TPS_DATA_TC_ARB_MODE __BIT(0) 438#define TPS_DATA_TC_ARB_MODE __BIT(0)
439 439
440/* TPS_DATA_TCT_REG[AQ_TRAFFICCLASS_NUM] 0x7110-0x7130 */ 440/* TPS_DATA_TCT_REG[AQ_TRAFFICCLASS_NUM] 0x7110-0x7130 */
441#define TPS_DATA_TCT_REG(i) (0x7110 + (i) * 4) 441#define TPS_DATA_TCT_REG(i) (0x7110 + (i) * 4)
442#define TPS_DATA_TCT_CREDIT_MAX __BITS(16,27) 442#define TPS_DATA_TCT_CREDIT_MAX __BITS(16,27)
443#define TPS_DATA_TCT_WEIGHT __BITS(8,0) 443#define TPS_DATA_TCT_WEIGHT __BITS(8,0)
444/* TPS_DATA_TCT_REG[AQ_TRAFFICCLASS_NUM] 0x7210-0x7230 */ 444/* TPS_DATA_TCT_REG[AQ_TRAFFICCLASS_NUM] 0x7210-0x7230 */
445#define TPS_DESC_TCT_REG(i) (0x7210 + (i) * 4) 445#define TPS_DESC_TCT_REG(i) (0x7210 + (i) * 4)
446#define TPS_DESC_TCT_CREDIT_MAX __BITS(16,27) 446#define TPS_DESC_TCT_CREDIT_MAX __BITS(16,27)
447#define TPS_DESC_TCT_WEIGHT __BITS(8,0) 447#define TPS_DESC_TCT_WEIGHT __BITS(8,0)
448 448
449#define AQ_HW_TXBUF_MAX 160 449#define AQ_HW_TXBUF_MAX 160
450#define AQ_HW_RXBUF_MAX 320 450#define AQ_HW_RXBUF_MAX 320
451 451
452#define TPO_HWCSUM_REG 0x7800 452#define TPO_HWCSUM_REG 0x7800
453#define TPO_HWCSUM_IP4CSUM_EN __BIT(1) 453#define TPO_HWCSUM_IP4CSUM_EN __BIT(1)
454#define TPO_HWCSUM_L4CSUM_EN __BIT(0) /* TCP/UDP/SCTP */ 454#define TPO_HWCSUM_L4CSUM_EN __BIT(0) /* TCP/UDP/SCTP */
455 455
456#define TDM_LSO_EN_REG 0x7810 456#define TDM_LSO_EN_REG 0x7810
457 457
458#define THM_LSO_TCP_FLAG1_REG 0x7820 458#define THM_LSO_TCP_FLAG1_REG 0x7820
459#define THM_LSO_TCP_FLAG1_FIRST __BITS(11,0) 459#define THM_LSO_TCP_FLAG1_FIRST __BITS(11,0)
460#define THM_LSO_TCP_FLAG1_MID __BITS(27,16) 460#define THM_LSO_TCP_FLAG1_MID __BITS(27,16)
461#define THM_LSO_TCP_FLAG2_REG 0x7824 461#define THM_LSO_TCP_FLAG2_REG 0x7824
462#define THM_LSO_TCP_FLAG2_LAST __BITS(11,0) 462#define THM_LSO_TCP_FLAG2_LAST __BITS(11,0)
463 463
464#define TPB_TX_BUF_REG 0x7900 464#define TPB_TX_BUF_REG 0x7900
465#define TPB_TX_BUF_EN __BIT(0) 465#define TPB_TX_BUF_EN __BIT(0)
466#define TPB_TX_BUF_SCP_INS_EN __BIT(2) 466#define TPB_TX_BUF_SCP_INS_EN __BIT(2)
467#define TPB_TX_BUF_TC_MODE_EN __BIT(8) 467#define TPB_TX_BUF_TC_MODE_EN __BIT(8)
468 468
469/* TPB_TXB_BUFSIZE_REG[AQ_TRAFFICCLASS_NUM] 0x7910-7990 */ 469/* TPB_TXB_BUFSIZE_REG[AQ_TRAFFICCLASS_NUM] 0x7910-7990 */
470#define TPB_TXB_BUFSIZE_REG(i) (0x7910 + (i) * 0x10) 470#define TPB_TXB_BUFSIZE_REG(i) (0x7910 + (i) * 0x10)
471#define TPB_TXB_BUFSIZE __BITS(7,0) 471#define TPB_TXB_BUFSIZE __BITS(7,0)
472#define TPB_TXB_THRESH_REG(i) (0x7914 + (i) * 0x10) 472#define TPB_TXB_THRESH_REG(i) (0x7914 + (i) * 0x10)
473#define TPB_TXB_THRESH_HI __BITS(16,28) 473#define TPB_TXB_THRESH_HI __BITS(16,28)
474#define TPB_TXB_THRESH_LO __BITS(12,0) 474#define TPB_TXB_THRESH_LO __BITS(12,0)
475 475
476#define AQ_HW_TX_DMA_TOTAL_REQ_LIMIT_REG 0x7b20 476#define AQ_HW_TX_DMA_TOTAL_REQ_LIMIT_REG 0x7b20
477#define TX_DMA_INT_DESC_WRWB_EN_REG 0x7b40 477#define TX_DMA_INT_DESC_WRWB_EN_REG 0x7b40
478#define TX_DMA_INT_DESC_WRWB_EN __BIT(1) 478#define TX_DMA_INT_DESC_WRWB_EN __BIT(1)
479#define TX_DMA_INT_DESC_MODERATE_EN __BIT(4) 479#define TX_DMA_INT_DESC_MODERATE_EN __BIT(4)
480 480
481/* TX_DMA_DESC_*[AQ_RINGS_NUM] 0x7c00-0x8400 */ 481/* TX_DMA_DESC_*[AQ_RINGS_NUM] 0x7c00-0x8400 */
482#define TX_DMA_DESC_BASE_ADDRLSW_REG(i) (0x7c00 + (i) * 0x40) 482#define TX_DMA_DESC_BASE_ADDRLSW_REG(i) (0x7c00 + (i) * 0x40)
483#define TX_DMA_DESC_BASE_ADDRMSW_REG(i) (0x7c04 + (i) * 0x40) 483#define TX_DMA_DESC_BASE_ADDRMSW_REG(i) (0x7c04 + (i) * 0x40)
484#define TX_DMA_DESC_REG(i) (0x7c08 + (i) * 0x40) 484#define TX_DMA_DESC_REG(i) (0x7c08 + (i) * 0x40)
485#define TX_DMA_DESC_LEN __BITS(12, 3) /* TXD_NUM/8 */ 485#define TX_DMA_DESC_LEN __BITS(12, 3) /* TXD_NUM/8 */
486#define TX_DMA_DESC_EN __BIT(31) 486#define TX_DMA_DESC_EN __BIT(31)
487#define TX_DMA_DESC_HEAD_PTR_REG(i) (0x7c0c + (i) * 0x40) 487#define TX_DMA_DESC_HEAD_PTR_REG(i) (0x7c0c + (i) * 0x40)
488#define TX_DMA_DESC_HEAD_PTR __BITS(12,0) 488#define TX_DMA_DESC_HEAD_PTR __BITS(12,0)
489#define TX_DMA_DESC_TAIL_PTR_REG(i) (0x7c10 + (i) * 0x40) 489#define TX_DMA_DESC_TAIL_PTR_REG(i) (0x7c10 + (i) * 0x40)
490#define TX_DMA_DESC_WRWB_THRESH_REG(i) (0x7c18 + (i) * 0x40) 490#define TX_DMA_DESC_WRWB_THRESH_REG(i) (0x7c18 + (i) * 0x40)
491#define TX_DMA_DESC_WRWB_THRESH __BITS(14,8) 491#define TX_DMA_DESC_WRWB_THRESH __BITS(14,8)
492 492
493/* TDM_DCAD_REG[AQ_RINGS_NUM] 0x8400-0x8480 */ 493/* TDM_DCAD_REG[AQ_RINGS_NUM] 0x8400-0x8480 */
494#define TDM_DCAD_REG(i) (0x8400 + (i) * 4) 494#define TDM_DCAD_REG(i) (0x8400 + (i) * 4)
495#define TDM_DCAD_CPUID __BITS(7,0) 495#define TDM_DCAD_CPUID __BITS(7,0)
496#define TDM_DCAD_CPUID_EN __BIT(31) 496#define TDM_DCAD_CPUID_EN __BIT(31)
497 497
498#define TDM_DCA_REG 0x8480 498#define TDM_DCA_REG 0x8480
499#define TDM_DCA_EN __BIT(31) 499#define TDM_DCA_EN __BIT(31)
500#define TDM_DCA_MODE __BITS(3,0) 500#define TDM_DCA_MODE __BITS(3,0)
501 501
502/* TX_INTR_MODERATION_CTL_REG[AQ_RINGS_NUM] 0x8980-0x8a00 */ 502/* TX_INTR_MODERATION_CTL_REG[AQ_RINGS_NUM] 0x8980-0x8a00 */
503#define TX_INTR_MODERATION_CTL_REG(i) (0x8980 + (i) * 4) 503#define TX_INTR_MODERATION_CTL_REG(i) (0x8980 + (i) * 4)
504#define TX_INTR_MODERATION_CTL_EN __BIT(1) 504#define TX_INTR_MODERATION_CTL_EN __BIT(1)
505#define TX_INTR_MODERATION_CTL_MIN __BITS(15,8) 505#define TX_INTR_MODERATION_CTL_MIN __BITS(15,8)
506#define TX_INTR_MODERATION_CTL_MAX __BITS(24,16) 506#define TX_INTR_MODERATION_CTL_MAX __BITS(24,16)
507 507
508#define FW1X_CTRL_10G __BIT(0) 508#define FW1X_CTRL_10G __BIT(0)
509#define FW1X_CTRL_5G __BIT(1) 509#define FW1X_CTRL_5G __BIT(1)
510#define FW1X_CTRL_5GSR __BIT(2) 510#define FW1X_CTRL_5GSR __BIT(2)
511#define FW1X_CTRL_2G5 __BIT(3) 511#define FW1X_CTRL_2G5 __BIT(3)
512#define FW1X_CTRL_1G __BIT(4) 512#define FW1X_CTRL_1G __BIT(4)
513#define FW1X_CTRL_100M __BIT(5) 513#define FW1X_CTRL_100M __BIT(5)
514 514
515#define FW2X_CTRL_10BASET_HD __BIT(0) 515#define FW2X_CTRL_10BASET_HD __BIT(0)
516#define FW2X_CTRL_10BASET_FD __BIT(1) 516#define FW2X_CTRL_10BASET_FD __BIT(1)
517#define FW2X_CTRL_100BASETX_HD __BIT(2) 517#define FW2X_CTRL_100BASETX_HD __BIT(2)
518#define FW2X_CTRL_100BASET4_HD __BIT(3) 518#define FW2X_CTRL_100BASET4_HD __BIT(3)
519#define FW2X_CTRL_100BASET2_HD __BIT(4) 519#define FW2X_CTRL_100BASET2_HD __BIT(4)
520#define FW2X_CTRL_100BASETX_FD __BIT(5) 520#define FW2X_CTRL_100BASETX_FD __BIT(5)
521#define FW2X_CTRL_100BASET2_FD __BIT(6) 521#define FW2X_CTRL_100BASET2_FD __BIT(6)
522#define FW2X_CTRL_1000BASET_HD __BIT(7) 522#define FW2X_CTRL_1000BASET_HD __BIT(7)
523#define FW2X_CTRL_1000BASET_FD __BIT(8) 523#define FW2X_CTRL_1000BASET_FD __BIT(8)
524#define FW2X_CTRL_2P5GBASET_FD __BIT(9) 524#define FW2X_CTRL_2P5GBASET_FD __BIT(9)
525#define FW2X_CTRL_5GBASET_FD __BIT(10) 525#define FW2X_CTRL_5GBASET_FD __BIT(10)
526#define FW2X_CTRL_10GBASET_FD __BIT(11) 526#define FW2X_CTRL_10GBASET_FD __BIT(11)
527#define FW2X_CTRL_RESERVED1 __BIT(32) 527#define FW2X_CTRL_RESERVED1 __BIT(32)
528#define FW2X_CTRL_10BASET_EEE __BIT(33) 528#define FW2X_CTRL_10BASET_EEE __BIT(33)
529#define FW2X_CTRL_RESERVED2 __BIT(34) 529#define FW2X_CTRL_RESERVED2 __BIT(34)
530#define FW2X_CTRL_PAUSE __BIT(35) 530#define FW2X_CTRL_PAUSE __BIT(35)
531#define FW2X_CTRL_ASYMMETRIC_PAUSE __BIT(36) 531#define FW2X_CTRL_ASYMMETRIC_PAUSE __BIT(36)
532#define FW2X_CTRL_100BASETX_EEE __BIT(37) 532#define FW2X_CTRL_100BASETX_EEE __BIT(37)
533#define FW2X_CTRL_RESERVED3 __BIT(38) 533#define FW2X_CTRL_RESERVED3 __BIT(38)
534#define FW2X_CTRL_RESERVED4 __BIT(39) 534#define FW2X_CTRL_RESERVED4 __BIT(39)
535#define FW2X_CTRL_1000BASET_FD_EEE __BIT(40) 535#define FW2X_CTRL_1000BASET_FD_EEE __BIT(40)
536#define FW2X_CTRL_2P5GBASET_FD_EEE __BIT(41) 536#define FW2X_CTRL_2P5GBASET_FD_EEE __BIT(41)
537#define FW2X_CTRL_5GBASET_FD_EEE __BIT(42) 537#define FW2X_CTRL_5GBASET_FD_EEE __BIT(42)
538#define FW2X_CTRL_10GBASET_FD_EEE __BIT(43) 538#define FW2X_CTRL_10GBASET_FD_EEE __BIT(43)
539#define FW2X_CTRL_RESERVED5 __BIT(44) 539#define FW2X_CTRL_RESERVED5 __BIT(44)
540#define FW2X_CTRL_RESERVED6 __BIT(45) 540#define FW2X_CTRL_RESERVED6 __BIT(45)
541#define FW2X_CTRL_RESERVED7 __BIT(46) 541#define FW2X_CTRL_RESERVED7 __BIT(46)
542#define FW2X_CTRL_RESERVED8 __BIT(47) 542#define FW2X_CTRL_RESERVED8 __BIT(47)
543#define FW2X_CTRL_RESERVED9 __BIT(48) 543#define FW2X_CTRL_RESERVED9 __BIT(48)
544#define FW2X_CTRL_CABLE_DIAG __BIT(49) 544#define FW2X_CTRL_CABLE_DIAG __BIT(49)
545#define FW2X_CTRL_TEMPERATURE __BIT(50) 545#define FW2X_CTRL_TEMPERATURE __BIT(50)
546#define FW2X_CTRL_DOWNSHIFT __BIT(51) 546#define FW2X_CTRL_DOWNSHIFT __BIT(51)
547#define FW2X_CTRL_PTP_AVB_EN __BIT(52) 547#define FW2X_CTRL_PTP_AVB_EN __BIT(52)
548#define FW2X_CTRL_MEDIA_DETECT __BIT(53) 548#define FW2X_CTRL_MEDIA_DETECT __BIT(53)
549#define FW2X_CTRL_LINK_DROP __BIT(54) 549#define FW2X_CTRL_LINK_DROP __BIT(54)
550#define FW2X_CTRL_SLEEP_PROXY __BIT(55) 550#define FW2X_CTRL_SLEEP_PROXY __BIT(55)
551#define FW2X_CTRL_WOL __BIT(56) 551#define FW2X_CTRL_WOL __BIT(56)
552#define FW2X_CTRL_MAC_STOP __BIT(57) 552#define FW2X_CTRL_MAC_STOP __BIT(57)
553#define FW2X_CTRL_EXT_LOOPBACK __BIT(58) 553#define FW2X_CTRL_EXT_LOOPBACK __BIT(58)
554#define FW2X_CTRL_INT_LOOPBACK __BIT(59) 554#define FW2X_CTRL_INT_LOOPBACK __BIT(59)
555#define FW2X_CTRL_EFUSE_AGENT __BIT(60) 555#define FW2X_CTRL_EFUSE_AGENT __BIT(60)
556#define FW2X_CTRL_WOL_TIMER __BIT(61) 556#define FW2X_CTRL_WOL_TIMER __BIT(61)
557#define FW2X_CTRL_STATISTICS __BIT(62) 557#define FW2X_CTRL_STATISTICS __BIT(62)
558#define FW2X_CTRL_TRANSACTION_ID __BIT(63) 558#define FW2X_CTRL_TRANSACTION_ID __BIT(63)
559 559
560#define FW2X_SNPRINTB \ 560#define FW2X_SNPRINTB \
561 "\177\020" \ 561 "\177\020" \
562 "b\x23" "PAUSE\0" \ 562 "b\x23" "PAUSE\0" \
563 "b\x24" "ASYMMETRIC-PAUSE\0" \ 563 "b\x24" "ASYMMETRIC-PAUSE\0" \
564 "b\x31" "CABLE-DIAG\0" \ 564 "b\x31" "CABLE-DIAG\0" \
565 "b\x32" "TEMPERATURE\0" \ 565 "b\x32" "TEMPERATURE\0" \
566 "b\x33" "DOWNSHIFT\0" \ 566 "b\x33" "DOWNSHIFT\0" \
567 "b\x34" "PTP-AVB\0" \ 567 "b\x34" "PTP-AVB\0" \
568 "b\x35" "MEDIA-DETECT\0" \ 568 "b\x35" "MEDIA-DETECT\0" \
569 "b\x36" "LINK-DROP\0" \ 569 "b\x36" "LINK-DROP\0" \
570 "b\x37" "SLEEP-PROXY\0" \ 570 "b\x37" "SLEEP-PROXY\0" \
571 "b\x38" "WOL\0" \ 571 "b\x38" "WOL\0" \
572 "b\x39" "MAC-STOP\0" \ 572 "b\x39" "MAC-STOP\0" \
573 "b\x3a" "EXT-LOOPBACK\0" \ 573 "b\x3a" "EXT-LOOPBACK\0" \
574 "b\x3b" "INT-LOOPBACK\0" \ 574 "b\x3b" "INT-LOOPBACK\0" \
575 "b\x3c" "EFUSE-AGENT\0" \ 575 "b\x3c" "EFUSE-AGENT\0" \
576 "b\x3d" "WOL-TIMER\0" \ 576 "b\x3d" "WOL-TIMER\0" \
577 "b\x3e" "STATISTICS\0" \ 577 "b\x3e" "STATISTICS\0" \
578 "b\x3f" "TRANSACTION-ID\0" \ 578 "b\x3f" "TRANSACTION-ID\0" \
579 "\0" 579 "\0"
580 580
581#define FW2X_CTRL_RATE_100M FW2X_CTRL_100BASETX_FD 581#define FW2X_CTRL_RATE_100M FW2X_CTRL_100BASETX_FD
582#define FW2X_CTRL_RATE_1G FW2X_CTRL_1000BASET_FD 582#define FW2X_CTRL_RATE_1G FW2X_CTRL_1000BASET_FD
583#define FW2X_CTRL_RATE_2G5 FW2X_CTRL_2P5GBASET_FD 583#define FW2X_CTRL_RATE_2G5 FW2X_CTRL_2P5GBASET_FD
584#define FW2X_CTRL_RATE_5G FW2X_CTRL_5GBASET_FD 584#define FW2X_CTRL_RATE_5G FW2X_CTRL_5GBASET_FD
585#define FW2X_CTRL_RATE_10G FW2X_CTRL_10GBASET_FD 585#define FW2X_CTRL_RATE_10G FW2X_CTRL_10GBASET_FD
586#define FW2X_CTRL_RATE_MASK \ 586#define FW2X_CTRL_RATE_MASK \
587 (FW2X_CTRL_RATE_100M | \ 587 (FW2X_CTRL_RATE_100M | \
588 FW2X_CTRL_RATE_1G | \ 588 FW2X_CTRL_RATE_1G | \
589 FW2X_CTRL_RATE_2G5 | \ 589 FW2X_CTRL_RATE_2G5 | \
590 FW2X_CTRL_RATE_5G | \ 590 FW2X_CTRL_RATE_5G | \
591 FW2X_CTRL_RATE_10G) 591 FW2X_CTRL_RATE_10G)
592#define FW2X_CTRL_EEE_MASK \ 592#define FW2X_CTRL_EEE_MASK \
593 (FW2X_CTRL_10BASET_EEE | \ 593 (FW2X_CTRL_10BASET_EEE | \
594 FW2X_CTRL_100BASETX_EEE | \ 594 FW2X_CTRL_100BASETX_EEE | \
595 FW2X_CTRL_1000BASET_FD_EEE | \ 595 FW2X_CTRL_1000BASET_FD_EEE | \
596 FW2X_CTRL_2P5GBASET_FD_EEE | \ 596 FW2X_CTRL_2P5GBASET_FD_EEE | \
597 FW2X_CTRL_5GBASET_FD_EEE | \ 597 FW2X_CTRL_5GBASET_FD_EEE | \
598 FW2X_CTRL_10GBASET_FD_EEE) 598 FW2X_CTRL_10GBASET_FD_EEE)
599 599
600typedef enum aq_fw_bootloader_mode { 600typedef enum aq_fw_bootloader_mode {
601 FW_BOOT_MODE_UNKNOWN = 0, 601 FW_BOOT_MODE_UNKNOWN = 0,
602 FW_BOOT_MODE_FLB, 602 FW_BOOT_MODE_FLB,
603 FW_BOOT_MODE_RBL_FLASH, 603 FW_BOOT_MODE_RBL_FLASH,
604 FW_BOOT_MODE_RBL_HOST_BOOTLOAD 604 FW_BOOT_MODE_RBL_HOST_BOOTLOAD
605} aq_fw_bootloader_mode_t; 605} aq_fw_bootloader_mode_t;
606 606
607#define AQ_WRITE_REG(sc, reg, val) \ 607#define AQ_WRITE_REG(sc, reg, val) \
608 bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val)) 608 bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
609 609
610#define AQ_READ_REG(sc, reg) \ 610#define AQ_READ_REG(sc, reg) \
611 bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg)) 611 bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg))
612 612
613#define AQ_READ64_REG(sc, reg) \ 613#define AQ_READ64_REG(sc, reg) \
614 ((uint64_t)AQ_READ_REG(sc, reg) | \ 614 ((uint64_t)AQ_READ_REG(sc, reg) | \
615 (((uint64_t)AQ_READ_REG(sc, (reg) + 4)) << 32)) 615 (((uint64_t)AQ_READ_REG(sc, (reg) + 4)) << 32))
616 616
617#define AQ_WRITE64_REG(sc, reg, val) \ 617#define AQ_WRITE64_REG(sc, reg, val) \
618 do { \ 618 do { \
619 AQ_WRITE_REG(sc, reg, (uint32_t)val); \ 619 AQ_WRITE_REG(sc, reg, (uint32_t)val); \
620 AQ_WRITE_REG(sc, reg + 4, (uint32_t)(val >> 32)); \ 620 AQ_WRITE_REG(sc, reg + 4, (uint32_t)(val >> 32)); \
621 } while (/* CONSTCOND */0) 621 } while (/* CONSTCOND */0)
622 622
623#define AQ_READ_REG_BIT(sc, reg, mask) \ 623#define AQ_READ_REG_BIT(sc, reg, mask) \
624 __SHIFTOUT(AQ_READ_REG(sc, reg), mask) 624 __SHIFTOUT(AQ_READ_REG(sc, reg), mask)
625 625
626#define AQ_WRITE_REG_BIT(sc, reg, mask, val) \ 626#define AQ_WRITE_REG_BIT(sc, reg, mask, val) \
627 do { \ 627 do { \
628 uint32_t _v; \ 628 uint32_t _v; \
629 _v = AQ_READ_REG((sc), (reg)); \ 629 _v = AQ_READ_REG((sc), (reg)); \
630 _v &= ~(mask); \ 630 _v &= ~(mask); \
631 if ((val) != 0) \ 631 if ((val) != 0) \
632 _v |= __SHIFTIN((val), (mask)); \ 632 _v |= __SHIFTIN((val), (mask)); \
633 AQ_WRITE_REG((sc), (reg), _v); \ 633 AQ_WRITE_REG((sc), (reg), _v); \
634 } while (/* CONSTCOND */ 0) 634 } while (/* CONSTCOND */ 0)
635 635
636#define WAIT_FOR(expr, us, n, errp) \ 636#define WAIT_FOR(expr, us, n, errp) \
637 do { \ 637 do { \
638 unsigned int _n; \ 638 unsigned int _n; \
639 for (_n = n; (!(expr)) && _n != 0; --_n) { \ 639 for (_n = n; (!(expr)) && _n != 0; --_n) { \
640 delay((us)); \ 640 delay((us)); \
641 } \ 641 } \
642 if ((errp != NULL)) { \ 642 if ((errp != NULL)) { \
643 if (_n == 0) \ 643 if (_n == 0) \
644 *(errp) = ETIMEDOUT; \ 644 *(errp) = ETIMEDOUT; \
645 else \ 645 else \
646 *(errp) = 0; \ 646 *(errp) = 0; \
647 } \ 647 } \
648 } while (/* CONSTCOND */ 0) 648 } while (/* CONSTCOND */ 0)
649 649
650#define msec_delay(x) DELAY(1000 * (x)) 650#define msec_delay(x) DELAY(1000 * (x))
651 651
652typedef struct aq_mailbox_header { 652typedef struct aq_mailbox_header {
653 uint32_t version; 653 uint32_t version;
654 uint32_t transaction_id; 654 uint32_t transaction_id;
655 int32_t error; 655 int32_t error;
656} __packed aq_mailbox_header_t; 656} __packed aq_mailbox_header_t;
657 657
658typedef struct aq_hw_stats_s { 658typedef struct aq_hw_stats_s {
659 uint32_t uprc; 659 uint32_t uprc;
660 uint32_t mprc; 660 uint32_t mprc;
661 uint32_t bprc; 661 uint32_t bprc;
662 uint32_t erpt; 662 uint32_t erpt;
663 uint32_t uptc; 663 uint32_t uptc;
664 uint32_t mptc; 664 uint32_t mptc;
665 uint32_t bptc; 665 uint32_t bptc;
666 uint32_t erpr; 666 uint32_t erpr;
667 uint32_t mbtc; 667 uint32_t mbtc;
668 uint32_t bbtc; 668 uint32_t bbtc;
669 uint32_t mbrc; 669 uint32_t mbrc;
670 uint32_t bbrc; 670 uint32_t bbrc;
671 uint32_t ubrc; 671 uint32_t ubrc;
672 uint32_t ubtc; 672 uint32_t ubtc;
673 uint32_t ptc; 673 uint32_t ptc;
674 uint32_t prc; 674 uint32_t prc;
675 uint32_t dpc; /* not exists in fw2x_msm_statistics */ 675 uint32_t dpc; /* not exists in fw2x_msm_statistics */
676 uint32_t cprc; /* not exists in fw2x_msm_statistics */ 676 uint32_t cprc; /* not exists in fw2x_msm_statistics */
677} __packed aq_hw_stats_s_t; 677} __packed aq_hw_stats_s_t;
678 678
679typedef struct fw1x_mailbox { 679typedef struct fw1x_mailbox {
680 aq_mailbox_header_t header; 680 aq_mailbox_header_t header;
681 aq_hw_stats_s_t msm; 681 aq_hw_stats_s_t msm;
682} __packed fw1x_mailbox_t; 682} __packed fw1x_mailbox_t;
683 683
684typedef struct fw2x_msm_statistics { 684typedef struct fw2x_msm_statistics {
685 uint32_t uprc; 685 uint32_t uprc;
686 uint32_t mprc; 686 uint32_t mprc;
687 uint32_t bprc; 687 uint32_t bprc;
688 uint32_t erpt; 688 uint32_t erpt;
689 uint32_t uptc; 689 uint32_t uptc;
690 uint32_t mptc; 690 uint32_t mptc;
691 uint32_t bptc; 691 uint32_t bptc;
692 uint32_t erpr; 692 uint32_t erpr;
693 uint32_t mbtc; 693 uint32_t mbtc;
694 uint32_t bbtc; 694 uint32_t bbtc;
695 uint32_t mbrc; 695 uint32_t mbrc;
696 uint32_t bbrc; 696 uint32_t bbrc;
697 uint32_t ubrc; 697 uint32_t ubrc;
698 uint32_t ubtc; 698 uint32_t ubtc;
699 uint32_t ptc; 699 uint32_t ptc;
700 uint32_t prc; 700 uint32_t prc;
701} __packed fw2x_msm_statistics_t; 701} __packed fw2x_msm_statistics_t;
702 702
703typedef struct fw2x_phy_cable_diag_data { 703typedef struct fw2x_phy_cable_diag_data {
704 uint32_t lane_data[4]; 704 uint32_t lane_data[4];
705} __packed fw2x_phy_cable_diag_data_t; 705} __packed fw2x_phy_cable_diag_data_t;
706 706
707typedef struct fw2x_capabilities { 707typedef struct fw2x_capabilities {
708 uint32_t caps_lo; 708 uint32_t caps_lo;
709 uint32_t caps_hi; 709 uint32_t caps_hi;
710} __packed fw2x_capabilities_t; 710} __packed fw2x_capabilities_t;
711 711
712typedef struct fw2x_mailbox { /* struct fwHostInterface */ 712typedef struct fw2x_mailbox { /* struct fwHostInterface */
713 aq_mailbox_header_t header; 713 aq_mailbox_header_t header;
714 fw2x_msm_statistics_t msm; /* msmStatistics_t msm; */ 714 fw2x_msm_statistics_t msm; /* msmStatistics_t msm; */
715 715
716 uint32_t phy_info1; 716 uint32_t phy_info1;
717#define PHYINFO1_FAULT_CODE __BITS(31,16) 717#define PHYINFO1_FAULT_CODE __BITS(31,16)
718#define PHYINFO1_PHY_H_BIT __BITS(0,15) 718#define PHYINFO1_PHY_H_BIT __BITS(0,15)
719 uint32_t phy_info2; 719 uint32_t phy_info2;
720#define PHYINFO2_TEMPERATURE __BITS(15,0) 720#define PHYINFO2_TEMPERATURE __BITS(15,0)
721#define PHYINFO2_CABLE_LEN __BITS(23,16) 721#define PHYINFO2_CABLE_LEN __BITS(23,16)
722 722
723 fw2x_phy_cable_diag_data_t diag_data; 723 fw2x_phy_cable_diag_data_t diag_data;
724 uint32_t reserved[8]; 724 uint32_t reserved[8];
725 725
726 fw2x_capabilities_t caps; 726 fw2x_capabilities_t caps;
727 727
728 /* ... */ 728 /* ... */
729} __packed fw2x_mailbox_t; 729} __packed fw2x_mailbox_t;
730 730
731typedef enum aq_link_speed { 731typedef enum aq_link_speed {
732 AQ_LINK_NONE = 0, 732 AQ_LINK_NONE = 0,
733 AQ_LINK_100M = (1 << 0), 733 AQ_LINK_100M = (1 << 0),
734 AQ_LINK_1G = (1 << 1), 734 AQ_LINK_1G = (1 << 1),
735 AQ_LINK_2G5 = (1 << 2), 735 AQ_LINK_2G5 = (1 << 2),
736 AQ_LINK_5G = (1 << 3), 736 AQ_LINK_5G = (1 << 3),
737 AQ_LINK_10G = (1 << 4) 737 AQ_LINK_10G = (1 << 4)
738} aq_link_speed_t; 738} aq_link_speed_t;
739#define AQ_LINK_ALL (AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | \ 739#define AQ_LINK_ALL (AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | \
740 AQ_LINK_5G | AQ_LINK_10G ) 740 AQ_LINK_5G | AQ_LINK_10G )
741#define AQ_LINK_AUTO AQ_LINK_ALL 741#define AQ_LINK_AUTO AQ_LINK_ALL
742 742
743typedef enum aq_link_fc { 743typedef enum aq_link_fc {
744 AQ_FC_NONE = 0, 744 AQ_FC_NONE = 0,
745 AQ_FC_RX = __BIT(0), 745 AQ_FC_RX = __BIT(0),
746 AQ_FC_TX = __BIT(1), 746 AQ_FC_TX = __BIT(1),
747 AQ_FC_ALL = (AQ_FC_RX | AQ_FC_TX) 747 AQ_FC_ALL = (AQ_FC_RX | AQ_FC_TX)
748} aq_link_fc_t; 748} aq_link_fc_t;
749 749
750typedef enum aq_link_eee { 750typedef enum aq_link_eee {
751 AQ_EEE_DISABLE = 0, 751 AQ_EEE_DISABLE = 0,
752 AQ_EEE_ENABLE = 1 752 AQ_EEE_ENABLE = 1
753} aq_link_eee_t; 753} aq_link_eee_t;
754 754
755typedef enum aq_hw_fw_mpi_state { 755typedef enum aq_hw_fw_mpi_state {
756 MPI_DEINIT = 0, 756 MPI_DEINIT = 0,
757 MPI_RESET = 1, 757 MPI_RESET = 1,
758 MPI_INIT = 2, 758 MPI_INIT = 2,
759 MPI_POWER = 4 759 MPI_POWER = 4
760} aq_hw_fw_mpi_state_t; 760} aq_hw_fw_mpi_state_t;
761 761
762enum aq_media_type { 762enum aq_media_type {
763 AQ_MEDIA_TYPE_UNKNOWN = 0, 763 AQ_MEDIA_TYPE_UNKNOWN = 0,
764 AQ_MEDIA_TYPE_FIBRE, 764 AQ_MEDIA_TYPE_FIBRE,
765 AQ_MEDIA_TYPE_TP 765 AQ_MEDIA_TYPE_TP
766}; 766};
767 767
768struct aq_rx_desc_read { 768struct aq_rx_desc_read {
769 uint64_t buf_addr; 769 uint64_t buf_addr;
770 uint64_t hdr_addr; 770 uint64_t hdr_addr;
771} __packed; 771} __packed;
772 772
773struct aq_rx_desc_wb { 773struct aq_rx_desc_wb {
774 uint32_t type; 774 uint32_t type;
775#define RXDESC_TYPE_RSSTYPE __BITS(3,0) 775#define RXDESC_TYPE_RSSTYPE __BITS(3,0)
776#define RXDESC_TYPE_RSSTYPE_NONE 0 776#define RXDESC_TYPE_RSSTYPE_NONE 0
777#define RXDESC_TYPE_RSSTYPE_IPV4 2 777#define RXDESC_TYPE_RSSTYPE_IPV4 2
778#define RXDESC_TYPE_RSSTYPE_IPV6 3 778#define RXDESC_TYPE_RSSTYPE_IPV6 3
779#define RXDESC_TYPE_RSSTYPE_IPV4_TCP 4 779#define RXDESC_TYPE_RSSTYPE_IPV4_TCP 4
780#define RXDESC_TYPE_RSSTYPE_IPV6_TCP 5 780#define RXDESC_TYPE_RSSTYPE_IPV6_TCP 5
781#define RXDESC_TYPE_RSSTYPE_IPV4_UDP 6 781#define RXDESC_TYPE_RSSTYPE_IPV4_UDP 6
782#define RXDESC_TYPE_RSSTYPE_IPV6_UDP 7 782#define RXDESC_TYPE_RSSTYPE_IPV6_UDP 7
783#define RXDESC_TYPE_PKTTYPE_ETHER __BITS(5,4) 783#define RXDESC_TYPE_PKTTYPE_ETHER __BITS(5,4)
784#define RXDESC_TYPE_PKTTYPE_ETHER_IPV4 0 784#define RXDESC_TYPE_PKTTYPE_ETHER_IPV4 0
785#define RXDESC_TYPE_PKTTYPE_ETHER_IPV6 1 785#define RXDESC_TYPE_PKTTYPE_ETHER_IPV6 1
786#define RXDESC_TYPE_PKTTYPE_ETHER_OTHERS 2 786#define RXDESC_TYPE_PKTTYPE_ETHER_OTHERS 2
787#define RXDESC_TYPE_PKTTYPE_ETHER_ARP 3 787#define RXDESC_TYPE_PKTTYPE_ETHER_ARP 3
788#define RXDESC_TYPE_PKTTYPE_PROTO __BITS(8,6) 788#define RXDESC_TYPE_PKTTYPE_PROTO __BITS(8,6)
789#define RXDESC_TYPE_PKTTYPE_PROTO_TCP 0 789#define RXDESC_TYPE_PKTTYPE_PROTO_TCP 0
790#define RXDESC_TYPE_PKTTYPE_PROTO_UDP 1 790#define RXDESC_TYPE_PKTTYPE_PROTO_UDP 1
791#define RXDESC_TYPE_PKTTYPE_PROTO_SCTP 2 791#define RXDESC_TYPE_PKTTYPE_PROTO_SCTP 2
792#define RXDESC_TYPE_PKTTYPE_PROTO_ICMP 3 792#define RXDESC_TYPE_PKTTYPE_PROTO_ICMP 3
793#define RXDESC_TYPE_PKTTYPE_PROTO_OTHERS 4 793#define RXDESC_TYPE_PKTTYPE_PROTO_OTHERS 4
794#define RXDESC_TYPE_PKTTYPE_VLAN __BIT(9) 794#define RXDESC_TYPE_PKTTYPE_VLAN __BIT(9)
795#define RXDESC_TYPE_PKTTYPE_VLAN_DOUBLE __BIT(10) 795#define RXDESC_TYPE_PKTTYPE_VLAN_DOUBLE __BIT(10)
796#define RXDESC_TYPE_MAC_DMA_ERR __BIT(12) 796#define RXDESC_TYPE_MAC_DMA_ERR __BIT(12)
797#define RXDESC_TYPE_RESERVED __BITS(18,13) 797#define RXDESC_TYPE_RESERVED __BITS(18,13)
798#define RXDESC_TYPE_IPV4_CSUM_CHECKED __BIT(19) /* PKTTYPE_ETHER_IPV4 */ 798#define RXDESC_TYPE_IPV4_CSUM_CHECKED __BIT(19) /* PKTTYPE_ETHER_IPV4 */
799#define RXDESC_TYPE_TCPUDP_CSUM_CHECKED __BIT(20) 799#define RXDESC_TYPE_TCPUDP_CSUM_CHECKED __BIT(20)
800#define RXDESC_TYPE_SPH __BIT(21) 800#define RXDESC_TYPE_SPH __BIT(21)
801#define RXDESC_TYPE_HDR_LEN __BITS(31,22) 801#define RXDESC_TYPE_HDR_LEN __BITS(31,22)
802 uint32_t rss_hash; 802 uint32_t rss_hash;
803 uint16_t status; 803 uint16_t status;
804#define RXDESC_STATUS_DD __BIT(0) 804#define RXDESC_STATUS_DD __BIT(0)
805#define RXDESC_STATUS_EOP __BIT(1) 805#define RXDESC_STATUS_EOP __BIT(1)
806#define RXDESC_STATUS_MACERR __BIT(2) 806#define RXDESC_STATUS_MACERR __BIT(2)
807#define RXDESC_STATUS_IPV4_CSUM_NG __BIT(3) 807#define RXDESC_STATUS_IPV4_CSUM_NG __BIT(3)
808#define RXDESC_STATUS_TCPUDP_CSUM_ERROR __BIT(4) 808#define RXDESC_STATUS_TCPUDP_CSUM_ERROR __BIT(4)
809#define RXDESC_STATUS_TCPUDP_CSUM_OK __BIT(5) 809#define RXDESC_STATUS_TCPUDP_CSUM_OK __BIT(5)
810 810
811#define RXDESC_STATUS_STAT __BITS(2,5) 811#define RXDESC_STATUS_STAT __BITS(2,5)
812#define RXDESC_STATUS_ESTAT __BITS(6,11) 812#define RXDESC_STATUS_ESTAT __BITS(6,11)
813#define RXDESC_STATUS_RSC_CNT __BITS(12,15) 813#define RXDESC_STATUS_RSC_CNT __BITS(12,15)
814 uint16_t pkt_len; 814 uint16_t pkt_len;
815 uint16_t next_desc_ptr; 815 uint16_t next_desc_ptr;
816 uint16_t vlan; 816 uint16_t vlan;
817} __packed; 817} __packed;
818 818
819typedef union aq_rx_desc { 819typedef union aq_rx_desc {
820 struct aq_rx_desc_read read; 820 struct aq_rx_desc_read read;
821 struct aq_rx_desc_wb wb; 821 struct aq_rx_desc_wb wb;
822} __packed aq_rx_desc_t; 822} __packed aq_rx_desc_t;
823 823
824typedef struct aq_tx_desc { 824typedef struct aq_tx_desc {
825 uint64_t buf_addr; 825 uint64_t buf_addr;
826 uint32_t ctl1; 826 uint32_t ctl1;
827#define AQ_TXDESC_CTL1_TYPE_MASK 0x00000003 827#define AQ_TXDESC_CTL1_TYPE_MASK 0x00000003
828#define AQ_TXDESC_CTL1_TYPE_TXD 0x00000001 828#define AQ_TXDESC_CTL1_TYPE_TXD 0x00000001
829#define AQ_TXDESC_CTL1_TYPE_TXC 0x00000002 829#define AQ_TXDESC_CTL1_TYPE_TXC 0x00000002
830#define AQ_TXDESC_CTL1_BLEN __BITS(19,4) /* TXD */ 830#define AQ_TXDESC_CTL1_BLEN __BITS(19,4) /* TXD */
831#define AQ_TXDESC_CTL1_DD __BIT(20) /* TXD */ 831#define AQ_TXDESC_CTL1_DD __BIT(20) /* TXD */
832#define AQ_TXDESC_CTL1_EOP __BIT(21) /* TXD */ 832#define AQ_TXDESC_CTL1_EOP __BIT(21) /* TXD */
833#define AQ_TXDESC_CTL1_CMD_VLAN __BIT(22) /* TXD */ 833#define AQ_TXDESC_CTL1_CMD_VLAN __BIT(22) /* TXD */
834#define AQ_TXDESC_CTL1_CMD_FCS __BIT(23) /* TXD */ 834#define AQ_TXDESC_CTL1_CMD_FCS __BIT(23) /* TXD */
835#define AQ_TXDESC_CTL1_CMD_IP4CSUM __BIT(24) /* TXD */ 835#define AQ_TXDESC_CTL1_CMD_IP4CSUM __BIT(24) /* TXD */
836#define AQ_TXDESC_CTL1_CMD_L4CSUM __BIT(25) /* TXD */ 836#define AQ_TXDESC_CTL1_CMD_L4CSUM __BIT(25) /* TXD */
837#define AQ_TXDESC_CTL1_CMD_LSO __BIT(26) /* TXD */ 837#define AQ_TXDESC_CTL1_CMD_LSO __BIT(26) /* TXD */
838#define AQ_TXDESC_CTL1_CMD_WB __BIT(27) /* TXD */ 838#define AQ_TXDESC_CTL1_CMD_WB __BIT(27) /* TXD */
839#define AQ_TXDESC_CTL1_CMD_VXLAN __BIT(28) /* TXD */ 839#define AQ_TXDESC_CTL1_CMD_VXLAN __BIT(28) /* TXD */
840#define AQ_TXDESC_CTL1_VID __BITS(15,4) /* TXC */ 840#define AQ_TXDESC_CTL1_VID __BITS(15,4) /* TXC */
841#define AQ_TXDESC_CTL1_LSO_IPV6 __BIT(21) /* TXC */ 841#define AQ_TXDESC_CTL1_LSO_IPV6 __BIT(21) /* TXC */
842#define AQ_TXDESC_CTL1_LSO_TCP __BIT(22) /* TXC */ 842#define AQ_TXDESC_CTL1_LSO_TCP __BIT(22) /* TXC */
843 uint32_t ctl2; 843 uint32_t ctl2;
844#define AQ_TXDESC_CTL2_LEN __BITS(31,14) 844#define AQ_TXDESC_CTL2_LEN __BITS(31,14)
845#define AQ_TXDESC_CTL2_CTX_EN __BIT(13) 845#define AQ_TXDESC_CTL2_CTX_EN __BIT(13)
846#define AQ_TXDESC_CTL2_CTX_IDX __BIT(12) 846#define AQ_TXDESC_CTL2_CTX_IDX __BIT(12)
847} __packed aq_tx_desc_t; 847} __packed aq_tx_desc_t;
848 848
849struct aq_txring { 849struct aq_txring {
850 struct aq_softc *txr_sc; 850 struct aq_softc *txr_sc;
851 int txr_index; 851 int txr_index;
852 kmutex_t txr_mutex; 852 kmutex_t txr_mutex;
853 bool txr_active; 853 bool txr_active;
854 854
855 pcq_t *txr_pcq; 855 pcq_t *txr_pcq;
856 void *txr_softint; 856 void *txr_softint;
857 857
858 aq_tx_desc_t *txr_txdesc; /* aq_tx_desc_t[AQ_TXD_NUM] */ 858 aq_tx_desc_t *txr_txdesc; /* aq_tx_desc_t[AQ_TXD_NUM] */
859 bus_dmamap_t txr_txdesc_dmamap; 859 bus_dmamap_t txr_txdesc_dmamap;
860 bus_dma_segment_t txr_txdesc_seg[1]; 860 bus_dma_segment_t txr_txdesc_seg[1];
861 bus_size_t txr_txdesc_size; 861 bus_size_t txr_txdesc_size;
862 862
863 struct { 863 struct {
864 struct mbuf *m; 864 struct mbuf *m;
865 bus_dmamap_t dmamap; 865 bus_dmamap_t dmamap;
866 } txr_mbufs[AQ_TXD_NUM]; 866 } txr_mbufs[AQ_TXD_NUM];
867 unsigned int txr_prodidx; 867 unsigned int txr_prodidx;
868 unsigned int txr_considx; 868 unsigned int txr_considx;
869 int txr_nfree; 869 int txr_nfree;
870 870
871 /* counters */ 871 /* counters */
872 uint64_t txr_opackets; 872 uint64_t txr_opackets;
873 uint64_t txr_obytes; 873 uint64_t txr_obytes;
874 uint64_t txr_omcasts; 874 uint64_t txr_omcasts;
875 uint64_t txr_oerrors; 875 uint64_t txr_oerrors;
876}; 876};
877 877
878struct aq_rxring { 878struct aq_rxring {
879 struct aq_softc *rxr_sc; 879 struct aq_softc *rxr_sc;
880 int rxr_index; 880 int rxr_index;
881 kmutex_t rxr_mutex; 881 kmutex_t rxr_mutex;
882 bool rxr_active; 882 bool rxr_active;
883 883
884 aq_rx_desc_t *rxr_rxdesc; /* aq_rx_desc_t[AQ_RXD_NUM] */ 884 aq_rx_desc_t *rxr_rxdesc; /* aq_rx_desc_t[AQ_RXD_NUM] */
885 bus_dmamap_t rxr_rxdesc_dmamap; 885 bus_dmamap_t rxr_rxdesc_dmamap;
886 bus_dma_segment_t rxr_rxdesc_seg[1]; 886 bus_dma_segment_t rxr_rxdesc_seg[1];
887 bus_size_t rxr_rxdesc_size; 887 bus_size_t rxr_rxdesc_size;
888 struct { 888 struct {
889 struct mbuf *m; 889 struct mbuf *m;
890 bus_dmamap_t dmamap; 890 bus_dmamap_t dmamap;
891 } rxr_mbufs[AQ_RXD_NUM]; 891 } rxr_mbufs[AQ_RXD_NUM];
892 unsigned int rxr_readidx; 892 unsigned int rxr_readidx;
893 893
894 /* counters */ 894 /* counters */
895 uint64_t rxr_ipackets; 895 uint64_t rxr_ipackets;
896 uint64_t rxr_ibytes; 896 uint64_t rxr_ibytes;
897 uint64_t rxr_ierrors; 897 uint64_t rxr_ierrors;
898 uint64_t rxr_iqdrops; 898 uint64_t rxr_iqdrops;
899}; 899};
900 900
901struct aq_queue { 901struct aq_queue {
902 struct aq_softc *sc; 902 struct aq_softc *sc;
903 struct aq_txring txring; 903 struct aq_txring txring;
904 struct aq_rxring rxring; 904 struct aq_rxring rxring;
905}; 905};
906 906
907struct aq_softc; 907struct aq_softc;
908struct aq_firmware_ops { 908struct aq_firmware_ops {
909 int (*reset)(struct aq_softc *); 909 int (*reset)(struct aq_softc *);
910 int (*set_mode)(struct aq_softc *, aq_hw_fw_mpi_state_t, 910 int (*set_mode)(struct aq_softc *, aq_hw_fw_mpi_state_t,
911 aq_link_speed_t, aq_link_fc_t, aq_link_eee_t); 911 aq_link_speed_t, aq_link_fc_t, aq_link_eee_t);
912 int (*get_mode)(struct aq_softc *, aq_hw_fw_mpi_state_t *, 912 int (*get_mode)(struct aq_softc *, aq_hw_fw_mpi_state_t *,
913 aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *); 913 aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *);
914 int (*get_stats)(struct aq_softc *, aq_hw_stats_s_t *); 914 int (*get_stats)(struct aq_softc *, aq_hw_stats_s_t *);
915#if NSYSMON_ENVSYS > 0 915#if NSYSMON_ENVSYS > 0
916 int (*get_temperature)(struct aq_softc *, uint32_t *); 916 int (*get_temperature)(struct aq_softc *, uint32_t *);
917#endif 917#endif
918}; 918};
919 919
920#ifdef AQ_EVENT_COUNTERS 920#ifdef AQ_EVENT_COUNTERS
921#define AQ_EVCNT_DECL(name) \ 921#define AQ_EVCNT_DECL(name) \
922 char sc_evcount_##name##_name[32]; \ 922 char sc_evcount_##name##_name[32]; \
923 struct evcnt sc_evcount_##name##_ev; 923 struct evcnt sc_evcount_##name##_ev;
924#define AQ_EVCNT_ATTACH(sc, name, desc, evtype) \ 924#define AQ_EVCNT_ATTACH(sc, name, desc, evtype) \
925 do { \ 925 do { \
926 snprintf((sc)->sc_evcount_##name##_name, \ 926 snprintf((sc)->sc_evcount_##name##_name, \
927 sizeof((sc)->sc_evcount_##name##_name), \ 927 sizeof((sc)->sc_evcount_##name##_name), \
928 "%s", desc); \ 928 "%s", desc); \
929 evcnt_attach_dynamic(&(sc)->sc_evcount_##name##_ev, \ 929 evcnt_attach_dynamic(&(sc)->sc_evcount_##name##_ev, \
930 (evtype), NULL, device_xname((sc)->sc_dev), \ 930 (evtype), NULL, device_xname((sc)->sc_dev), \
931 (sc)->sc_evcount_##name##_name); \ 931 (sc)->sc_evcount_##name##_name); \
932 } while (/*CONSTCOND*/0) 932 } while (/*CONSTCOND*/0)
933#define AQ_EVCNT_ATTACH_MISC(sc, name, desc) \ 933#define AQ_EVCNT_ATTACH_MISC(sc, name, desc) \
934 AQ_EVCNT_ATTACH(sc, name, desc, EVCNT_TYPE_MISC) 934 AQ_EVCNT_ATTACH(sc, name, desc, EVCNT_TYPE_MISC)
935#define AQ_EVCNT_DETACH(sc, name) \ 935#define AQ_EVCNT_DETACH(sc, name) \
936 evcnt_detach(&(sc)->sc_evcount_##name##_ev) 936 evcnt_detach(&(sc)->sc_evcount_##name##_ev)
937#define AQ_EVCNT_ADD(sc, name, val) \ 937#define AQ_EVCNT_ADD(sc, name, val) \
938 ((sc)->sc_evcount_##name##_ev.ev_count += (val)) 938 ((sc)->sc_evcount_##name##_ev.ev_count += (val))
939#endif /* AQ_EVENT_COUNTERS */ 939#endif /* AQ_EVENT_COUNTERS */
940 940
941#define AQ_LOCK(sc) mutex_enter(&(sc)->sc_mutex); 941#define AQ_LOCK(sc) mutex_enter(&(sc)->sc_mutex);
942#define AQ_UNLOCK(sc) mutex_exit(&(sc)->sc_mutex); 942#define AQ_UNLOCK(sc) mutex_exit(&(sc)->sc_mutex);
943 943
944/* lock for FW2X_MPI_{CONTROL,STATE]_REG read-modify-write */ 944/* lock for FW2X_MPI_{CONTROL,STATE]_REG read-modify-write */
945#define AQ_MPI_LOCK(sc) mutex_enter(&(sc)->sc_mpi_mutex); 945#define AQ_MPI_LOCK(sc) mutex_enter(&(sc)->sc_mpi_mutex);
946#define AQ_MPI_UNLOCK(sc) mutex_exit(&(sc)->sc_mpi_mutex); 946#define AQ_MPI_UNLOCK(sc) mutex_exit(&(sc)->sc_mpi_mutex);
947 947
948 948
949struct aq_softc { 949struct aq_softc {
950 device_t sc_dev; 950 device_t sc_dev;
951 951
952 bus_space_tag_t sc_iot; 952 bus_space_tag_t sc_iot;
953 bus_space_handle_t sc_ioh; 953 bus_space_handle_t sc_ioh;
954 bus_size_t sc_iosize; 954 bus_size_t sc_iosize;
955 bus_dma_tag_t sc_dmat;; 955 bus_dma_tag_t sc_dmat;
956 956
957 void *sc_ihs[AQ_NINTR_MAX]; 957 void *sc_ihs[AQ_NINTR_MAX];
958 pci_intr_handle_t *sc_intrs; 958 pci_intr_handle_t *sc_intrs;
959 959
960 int sc_tx_irq[AQ_RSSQUEUE_MAX]; 960 int sc_tx_irq[AQ_RSSQUEUE_MAX];
961 int sc_rx_irq[AQ_RSSQUEUE_MAX]; 961 int sc_rx_irq[AQ_RSSQUEUE_MAX];
962 int sc_linkstat_irq; 962 int sc_linkstat_irq;
963 bool sc_use_txrx_independent_intr; 963 bool sc_use_txrx_independent_intr;
964 bool sc_poll_linkstat; 964 bool sc_poll_linkstat;
965 bool sc_detect_linkstat; 965 bool sc_detect_linkstat;
966 966
967#if NSYSMON_ENVSYS > 0 967#if NSYSMON_ENVSYS > 0
968 struct sysmon_envsys *sc_sme; 968 struct sysmon_envsys *sc_sme;
969 envsys_data_t sc_sensor_temp; 969 envsys_data_t sc_sensor_temp;
970#endif 970#endif
971 971
972 callout_t sc_tick_ch; 972 callout_t sc_tick_ch;
973 973
974 int sc_nintrs; 974 int sc_nintrs;
975 bool sc_msix; 975 bool sc_msix;
976 976
977 struct aq_queue sc_queue[AQ_RSSQUEUE_MAX]; 977 struct aq_queue sc_queue[AQ_RSSQUEUE_MAX];
978 int sc_nqueues; 978 int sc_nqueues;
979 979
980 pci_chipset_tag_t sc_pc; 980 pci_chipset_tag_t sc_pc;
981 pcitag_t sc_pcitag; 981 pcitag_t sc_pcitag;
982 uint16_t sc_product; 982 uint16_t sc_product;
983 uint16_t sc_revision; 983 uint16_t sc_revision;
984 984
985 kmutex_t sc_mutex; 985 kmutex_t sc_mutex;
986 kmutex_t sc_mpi_mutex; 986 kmutex_t sc_mpi_mutex;
987 987
988 struct aq_firmware_ops *sc_fw_ops; 988 const struct aq_firmware_ops *sc_fw_ops;
989 uint64_t sc_fw_caps; 989 uint64_t sc_fw_caps;
990 enum aq_media_type sc_media_type; 990 enum aq_media_type sc_media_type;
991 aq_link_speed_t sc_available_rates; 991 aq_link_speed_t sc_available_rates;
992 992
993 aq_link_speed_t sc_link_rate; 993 aq_link_speed_t sc_link_rate;
994 aq_link_fc_t sc_link_fc; 994 aq_link_fc_t sc_link_fc;
995 aq_link_eee_t sc_link_eee; 995 aq_link_eee_t sc_link_eee;
996 996
997 uint32_t sc_fw_version; 997 uint32_t sc_fw_version;
998#define FW_VERSION_MAJOR(sc) (((sc)->sc_fw_version >> 24) & 0xff) 998#define FW_VERSION_MAJOR(sc) (((sc)->sc_fw_version >> 24) & 0xff)
999#define FW_VERSION_MINOR(sc) (((sc)->sc_fw_version >> 16) & 0xff) 999#define FW_VERSION_MINOR(sc) (((sc)->sc_fw_version >> 16) & 0xff)
1000#define FW_VERSION_BUILD(sc) ((sc)->sc_fw_version & 0xffff) 1000#define FW_VERSION_BUILD(sc) ((sc)->sc_fw_version & 0xffff)
1001 uint32_t sc_features; 1001 uint32_t sc_features;
1002#define FEATURES_MIPS 0x00000001 1002#define FEATURES_MIPS 0x00000001
1003#define FEATURES_TPO2 0x00000002 1003#define FEATURES_TPO2 0x00000002
1004#define FEATURES_RPF2 0x00000004 1004#define FEATURES_RPF2 0x00000004
1005#define FEATURES_MPI_AQ 0x00000008 1005#define FEATURES_MPI_AQ 0x00000008
1006#define FEATURES_REV_A0 0x10000000 1006#define FEATURES_REV_A0 0x10000000
1007#define FEATURES_REV_A (FEATURES_REV_A0) 1007#define FEATURES_REV_A (FEATURES_REV_A0)
1008#define FEATURES_REV_B0 0x20000000 1008#define FEATURES_REV_B0 0x20000000
1009#define FEATURES_REV_B1 0x40000000 1009#define FEATURES_REV_B1 0x40000000
1010#define FEATURES_REV_B (FEATURES_REV_B0|FEATURES_REV_B1) 1010#define FEATURES_REV_B (FEATURES_REV_B0|FEATURES_REV_B1)
1011 uint32_t sc_mbox_addr; 1011 uint32_t sc_mbox_addr;
1012 1012
1013 bool sc_rbl_enabled; 1013 bool sc_rbl_enabled;
1014 bool sc_fast_start_enabled; 1014 bool sc_fast_start_enabled;
1015 bool sc_flash_present; 1015 bool sc_flash_present;
1016 1016
1017 bool sc_intr_moderation_enable; 1017 bool sc_intr_moderation_enable;
1018 bool sc_rss_enable; 1018 bool sc_rss_enable;
1019 1019
1020 struct ethercom sc_ethercom; 1020 struct ethercom sc_ethercom;
1021 struct ether_addr sc_enaddr; 1021 struct ether_addr sc_enaddr;
1022 struct ifmedia sc_media; 1022 struct ifmedia sc_media;
1023 int sc_ec_capenable; /* last ec_capenable */ 1023 int sc_ec_capenable; /* last ec_capenable */
1024 unsigned short sc_if_flags; /* last if_flags */ 1024 unsigned short sc_if_flags; /* last if_flags */
1025 1025
1026#ifdef AQ_EVENT_COUNTERS 1026#ifdef AQ_EVENT_COUNTERS
1027 aq_hw_stats_s_t sc_statistics[2]; 1027 aq_hw_stats_s_t sc_statistics[2];
1028 int sc_statistics_idx; 1028 int sc_statistics_idx;
1029 bool sc_poll_statistics; 1029 bool sc_poll_statistics;
1030 1030
1031 AQ_EVCNT_DECL(uprc); 1031 AQ_EVCNT_DECL(uprc);
1032 AQ_EVCNT_DECL(mprc); 1032 AQ_EVCNT_DECL(mprc);
1033 AQ_EVCNT_DECL(bprc); 1033 AQ_EVCNT_DECL(bprc);
1034 AQ_EVCNT_DECL(erpt); 1034 AQ_EVCNT_DECL(erpt);
1035 AQ_EVCNT_DECL(uptc); 1035 AQ_EVCNT_DECL(uptc);
1036 AQ_EVCNT_DECL(mptc); 1036 AQ_EVCNT_DECL(mptc);
1037 AQ_EVCNT_DECL(bptc); 1037 AQ_EVCNT_DECL(bptc);
1038 AQ_EVCNT_DECL(erpr); 1038 AQ_EVCNT_DECL(erpr);
1039 AQ_EVCNT_DECL(mbtc); 1039 AQ_EVCNT_DECL(mbtc);
1040 AQ_EVCNT_DECL(bbtc); 1040 AQ_EVCNT_DECL(bbtc);
1041 AQ_EVCNT_DECL(mbrc); 1041 AQ_EVCNT_DECL(mbrc);
1042 AQ_EVCNT_DECL(bbrc); 1042 AQ_EVCNT_DECL(bbrc);
1043 AQ_EVCNT_DECL(ubrc); 1043 AQ_EVCNT_DECL(ubrc);
1044 AQ_EVCNT_DECL(ubtc); 1044 AQ_EVCNT_DECL(ubtc);
1045 AQ_EVCNT_DECL(ptc); 1045 AQ_EVCNT_DECL(ptc);
1046 AQ_EVCNT_DECL(prc); 1046 AQ_EVCNT_DECL(prc);
1047 AQ_EVCNT_DECL(dpc); 1047 AQ_EVCNT_DECL(dpc);
1048 AQ_EVCNT_DECL(cprc); 1048 AQ_EVCNT_DECL(cprc);
1049#endif 1049#endif
1050}; 1050};
1051 1051
1052static int aq_match(device_t, cfdata_t, void *); 1052static int aq_match(device_t, cfdata_t, void *);
1053static void aq_attach(device_t, device_t, void *); 1053static void aq_attach(device_t, device_t, void *);
1054static int aq_detach(device_t, int); 1054static int aq_detach(device_t, int);
1055 1055
1056static int aq_setup_msix(struct aq_softc *, struct pci_attach_args *, int, 1056static int aq_setup_msix(struct aq_softc *, struct pci_attach_args *, int,
1057 bool, bool); 1057 bool, bool);
1058static int aq_setup_legacy(struct aq_softc *, struct pci_attach_args *, 1058static int aq_setup_legacy(struct aq_softc *, struct pci_attach_args *,
1059 pci_intr_type_t); 1059 pci_intr_type_t);
1060static int aq_establish_msix_intr(struct aq_softc *, bool, bool); 1060static int aq_establish_msix_intr(struct aq_softc *, bool, bool);
1061 1061
1062static int aq_ifmedia_change(struct ifnet * const); 1062static int aq_ifmedia_change(struct ifnet * const);
1063static void aq_ifmedia_status(struct ifnet * const, struct ifmediareq *); 1063static void aq_ifmedia_status(struct ifnet * const, struct ifmediareq *);
1064static int aq_vlan_cb(struct ethercom *ec, uint16_t vid, bool set); 1064static int aq_vlan_cb(struct ethercom *ec, uint16_t vid, bool set);
1065static int aq_ifflags_cb(struct ethercom *); 1065static int aq_ifflags_cb(struct ethercom *);
1066static int aq_init(struct ifnet *); 1066static int aq_init(struct ifnet *);
1067static void aq_send_common_locked(struct ifnet *, struct aq_softc *, 1067static void aq_send_common_locked(struct ifnet *, struct aq_softc *,
1068 struct aq_txring *, bool); 1068 struct aq_txring *, bool);
1069static int aq_transmit(struct ifnet *, struct mbuf *); 1069static int aq_transmit(struct ifnet *, struct mbuf *);
1070static void aq_deferred_transmit(void *); 1070static void aq_deferred_transmit(void *);
1071static void aq_start(struct ifnet *); 1071static void aq_start(struct ifnet *);
1072static void aq_stop(struct ifnet *, int); 1072static void aq_stop(struct ifnet *, int);
1073static void aq_watchdog(struct ifnet *); 1073static void aq_watchdog(struct ifnet *);
1074static int aq_ioctl(struct ifnet *, unsigned long, void *); 1074static int aq_ioctl(struct ifnet *, unsigned long, void *);
1075 1075
1076static int aq_txrx_rings_alloc(struct aq_softc *); 1076static int aq_txrx_rings_alloc(struct aq_softc *);
1077static void aq_txrx_rings_free(struct aq_softc *); 1077static void aq_txrx_rings_free(struct aq_softc *);
1078static int aq_tx_pcq_alloc(struct aq_softc *, struct aq_txring *); 1078static int aq_tx_pcq_alloc(struct aq_softc *, struct aq_txring *);
1079static void aq_tx_pcq_free(struct aq_softc *, struct aq_txring *); 1079static void aq_tx_pcq_free(struct aq_softc *, struct aq_txring *);
1080 1080
1081static void aq_initmedia(struct aq_softc *); 1081static void aq_initmedia(struct aq_softc *);
1082static void aq_enable_intr(struct aq_softc *, bool, bool); 1082static void aq_enable_intr(struct aq_softc *, bool, bool);
1083 1083
1084#if NSYSMON_ENVSYS > 0 1084#if NSYSMON_ENVSYS > 0
1085static void aq_temp_refresh(struct sysmon_envsys *, envsys_data_t *); 1085static void aq_temp_refresh(struct sysmon_envsys *, envsys_data_t *);
1086#endif 1086#endif
1087static void aq_tick(void *); 1087static void aq_tick(void *);
1088static int aq_legacy_intr(void *); 1088static int aq_legacy_intr(void *);
1089static int aq_link_intr(void *); 1089static int aq_link_intr(void *);
1090static int aq_txrx_intr(void *); 1090static int aq_txrx_intr(void *);
1091static int aq_tx_intr(void *); 1091static int aq_tx_intr(void *);
1092static int aq_rx_intr(void *); 1092static int aq_rx_intr(void *);
1093 1093
1094static int aq_set_linkmode(struct aq_softc *, aq_link_speed_t, aq_link_fc_t, 1094static int aq_set_linkmode(struct aq_softc *, aq_link_speed_t, aq_link_fc_t,
1095 aq_link_eee_t); 1095 aq_link_eee_t);
1096static int aq_get_linkmode(struct aq_softc *, aq_link_speed_t *, aq_link_fc_t *, 1096static int aq_get_linkmode(struct aq_softc *, aq_link_speed_t *, aq_link_fc_t *,
1097 aq_link_eee_t *); 1097 aq_link_eee_t *);
1098 1098
1099static int aq_fw_reset(struct aq_softc *); 1099static int aq_fw_reset(struct aq_softc *);
1100static int aq_fw_version_init(struct aq_softc *); 1100static int aq_fw_version_init(struct aq_softc *);
1101static int aq_hw_init(struct aq_softc *); 1101static int aq_hw_init(struct aq_softc *);
1102static int aq_hw_init_ucp(struct aq_softc *); 1102static int aq_hw_init_ucp(struct aq_softc *);
1103static int aq_hw_reset(struct aq_softc *); 1103static int aq_hw_reset(struct aq_softc *);
1104static int aq_fw_downld_dwords(struct aq_softc *, uint32_t, uint32_t *, 1104static int aq_fw_downld_dwords(struct aq_softc *, uint32_t, uint32_t *,
1105 uint32_t); 1105 uint32_t);
1106static int aq_get_mac_addr(struct aq_softc *); 1106static int aq_get_mac_addr(struct aq_softc *);
1107static int aq_init_rss(struct aq_softc *); 1107static int aq_init_rss(struct aq_softc *);
1108static int aq_set_capability(struct aq_softc *); 1108static int aq_set_capability(struct aq_softc *);
1109 1109
1110static int fw1x_reset(struct aq_softc *); 1110static int fw1x_reset(struct aq_softc *);
1111static int fw1x_set_mode(struct aq_softc *, aq_hw_fw_mpi_state_t, 1111static int fw1x_set_mode(struct aq_softc *, aq_hw_fw_mpi_state_t,
1112 aq_link_speed_t, aq_link_fc_t, aq_link_eee_t); 1112 aq_link_speed_t, aq_link_fc_t, aq_link_eee_t);
1113static int fw1x_get_mode(struct aq_softc *, aq_hw_fw_mpi_state_t *, 1113static int fw1x_get_mode(struct aq_softc *, aq_hw_fw_mpi_state_t *,
1114 aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *); 1114 aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *);
1115static int fw1x_get_stats(struct aq_softc *, aq_hw_stats_s_t *); 1115static int fw1x_get_stats(struct aq_softc *, aq_hw_stats_s_t *);
1116 1116
1117static int fw2x_reset(struct aq_softc *); 1117static int fw2x_reset(struct aq_softc *);
1118static int fw2x_set_mode(struct aq_softc *, aq_hw_fw_mpi_state_t, 1118static int fw2x_set_mode(struct aq_softc *, aq_hw_fw_mpi_state_t,
1119 aq_link_speed_t, aq_link_fc_t, aq_link_eee_t); 1119 aq_link_speed_t, aq_link_fc_t, aq_link_eee_t);
1120static int fw2x_get_mode(struct aq_softc *, aq_hw_fw_mpi_state_t *, 1120static int fw2x_get_mode(struct aq_softc *, aq_hw_fw_mpi_state_t *,
1121 aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *); 1121 aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *);
1122static int fw2x_get_stats(struct aq_softc *, aq_hw_stats_s_t *); 1122static int fw2x_get_stats(struct aq_softc *, aq_hw_stats_s_t *);
1123#if NSYSMON_ENVSYS > 0 1123#if NSYSMON_ENVSYS > 0
1124static int fw2x_get_temperature(struct aq_softc *, uint32_t *); 1124static int fw2x_get_temperature(struct aq_softc *, uint32_t *);
1125#endif 1125#endif
1126 1126
1127static struct aq_firmware_ops aq_fw1x_ops = { 1127static const struct aq_firmware_ops aq_fw1x_ops = {
1128 .reset = fw1x_reset, 1128 .reset = fw1x_reset,
1129 .set_mode = fw1x_set_mode, 1129 .set_mode = fw1x_set_mode,
1130 .get_mode = fw1x_get_mode, 1130 .get_mode = fw1x_get_mode,
1131 .get_stats = fw1x_get_stats, 1131 .get_stats = fw1x_get_stats,
1132#if NSYSMON_ENVSYS > 0 1132#if NSYSMON_ENVSYS > 0
1133 .get_temperature = NULL 1133 .get_temperature = NULL
1134#endif 1134#endif
1135}; 1135};
1136 1136
1137static struct aq_firmware_ops aq_fw2x_ops = { 1137static const struct aq_firmware_ops aq_fw2x_ops = {
1138 .reset = fw2x_reset, 1138 .reset = fw2x_reset,
1139 .set_mode = fw2x_set_mode, 1139 .set_mode = fw2x_set_mode,
1140 .get_mode = fw2x_get_mode, 1140 .get_mode = fw2x_get_mode,
1141 .get_stats = fw2x_get_stats, 1141 .get_stats = fw2x_get_stats,
1142#if NSYSMON_ENVSYS > 0 1142#if NSYSMON_ENVSYS > 0
1143 .get_temperature = fw2x_get_temperature 1143 .get_temperature = fw2x_get_temperature
1144#endif 1144#endif
1145}; 1145};
1146 1146
1147CFATTACH_DECL3_NEW(aq, sizeof(struct aq_softc), 1147CFATTACH_DECL3_NEW(aq, sizeof(struct aq_softc),
1148 aq_match, aq_attach, aq_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN); 1148 aq_match, aq_attach, aq_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
1149 1149
1150static const struct aq_product { 1150static const struct aq_product {
1151 pci_vendor_id_t aq_vendor; 1151 pci_vendor_id_t aq_vendor;
1152 pci_product_id_t aq_product; 1152 pci_product_id_t aq_product;
1153 const char *aq_name; 1153 const char *aq_name;
1154 enum aq_media_type aq_media_type; 1154 enum aq_media_type aq_media_type;
1155 aq_link_speed_t aq_available_rates; 1155 aq_link_speed_t aq_available_rates;
1156} aq_products[] = { 1156} aq_products[] = {
1157 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC100, 1157 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC100,
1158 "Aquantia AQC100 10 Gigabit Network Adapter", 1158 "Aquantia AQC100 10 Gigabit Network Adapter",
1159 AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL 1159 AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL
1160 }, 1160 },
1161 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC107, 1161 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC107,
1162 "Aquantia AQC107 10 Gigabit Network Adapter", 1162 "Aquantia AQC107 10 Gigabit Network Adapter",
1163 AQ_MEDIA_TYPE_TP, AQ_LINK_ALL 1163 AQ_MEDIA_TYPE_TP, AQ_LINK_ALL
1164 }, 1164 },
1165 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC108, 1165 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC108,
1166 "Aquantia AQC108 5 Gigabit Network Adapter", 1166 "Aquantia AQC108 5 Gigabit Network Adapter",
1167 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1167 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G
1168 }, 1168 },
1169 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC109, 1169 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC109,
1170 "Aquantia AQC109 2.5 Gigabit Network Adapter", 1170 "Aquantia AQC109 2.5 Gigabit Network Adapter",
1171 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1171 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5
1172 }, 1172 },
1173 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC111, 1173 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC111,
1174 "Aquantia AQC111 5 Gigabit Network Adapter", 1174 "Aquantia AQC111 5 Gigabit Network Adapter",
1175 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1175 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G
1176 }, 1176 },
1177 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC112, 1177 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC112,
1178 "Aquantia AQC112 2.5 Gigabit Network Adapter", 1178 "Aquantia AQC112 2.5 Gigabit Network Adapter",
1179 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1179 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5
1180 }, 1180 },
1181 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC100S, 1181 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC100S,
1182 "Aquantia AQC100S 10 Gigabit Network Adapter", 1182 "Aquantia AQC100S 10 Gigabit Network Adapter",
1183 AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL 1183 AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL
1184 }, 1184 },
1185 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC107S, 1185 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC107S,
1186 "Aquantia AQC107S 10 Gigabit Network Adapter", 1186 "Aquantia AQC107S 10 Gigabit Network Adapter",
1187 AQ_MEDIA_TYPE_TP, AQ_LINK_ALL 1187 AQ_MEDIA_TYPE_TP, AQ_LINK_ALL
1188 }, 1188 },
1189 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC108S, 1189 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC108S,
1190 "Aquantia AQC108S 5 Gigabit Network Adapter", 1190 "Aquantia AQC108S 5 Gigabit Network Adapter",
1191 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1191 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G
1192 }, 1192 },
1193 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC109S, 1193 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC109S,
1194 "Aquantia AQC109S 2.5 Gigabit Network Adapter", 1194 "Aquantia AQC109S 2.5 Gigabit Network Adapter",
1195 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1195 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5
1196 }, 1196 },
1197 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC111S, 1197 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC111S,
1198 "Aquantia AQC111S 5 Gigabit Network Adapter", 1198 "Aquantia AQC111S 5 Gigabit Network Adapter",
1199 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1199 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G
1200 }, 1200 },
1201 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC112S, 1201 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC112S,
1202 "Aquantia AQC112S 2.5 Gigabit Network Adapter", 1202 "Aquantia AQC112S 2.5 Gigabit Network Adapter",
1203 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1203 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5
1204 }, 1204 },
1205 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D100, 1205 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D100,
1206 "Aquantia D100 10 Gigabit Network Adapter", 1206 "Aquantia D100 10 Gigabit Network Adapter",
1207 AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL 1207 AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL
1208 }, 1208 },
1209 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D107, 1209 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D107,
1210 "Aquantia D107 10 Gigabit Network Adapter", 1210 "Aquantia D107 10 Gigabit Network Adapter",
1211 AQ_MEDIA_TYPE_TP, AQ_LINK_ALL 1211 AQ_MEDIA_TYPE_TP, AQ_LINK_ALL
1212 }, 1212 },
1213 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D108, 1213 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D108,
1214 "Aquantia D108 5 Gigabit Network Adapter", 1214 "Aquantia D108 5 Gigabit Network Adapter",
1215 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1215 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G
1216 }, 1216 },
1217 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D109, 1217 { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D109,
1218 "Aquantia D109 2.5 Gigabit Network Adapter", 1218 "Aquantia D109 2.5 Gigabit Network Adapter",
1219 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1219 AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5
1220 } 1220 }
1221}; 1221};
1222 1222
1223static const struct aq_product * 1223static const struct aq_product *
1224aq_lookup(const struct pci_attach_args *pa) 1224aq_lookup(const struct pci_attach_args *pa)
1225{ 1225{
1226 unsigned int i; 1226 unsigned int i;
1227 1227
1228 for (i = 0; i < __arraycount(aq_products); i++) { 1228 for (i = 0; i < __arraycount(aq_products); i++) {
1229 if (PCI_VENDOR(pa->pa_id) == aq_products[i].aq_vendor && 1229 if (PCI_VENDOR(pa->pa_id) == aq_products[i].aq_vendor &&
1230 PCI_PRODUCT(pa->pa_id) == aq_products[i].aq_product) 1230 PCI_PRODUCT(pa->pa_id) == aq_products[i].aq_product)
1231 return &aq_products[i]; 1231 return &aq_products[i];
1232 } 1232 }
1233 return NULL; 1233 return NULL;
1234} 1234}
1235 1235
1236static int 1236static int
1237aq_match(device_t parent, cfdata_t cf, void *aux) 1237aq_match(device_t parent, cfdata_t cf, void *aux)
1238{ 1238{
1239 struct pci_attach_args *pa = aux; 1239 struct pci_attach_args *pa = aux;
1240 1240
1241 if (aq_lookup(pa) != NULL) 1241 if (aq_lookup(pa) != NULL)
1242 return 1; 1242 return 1;
1243 1243
1244 return 0; 1244 return 0;
1245} 1245}
1246 1246
1247static void 1247static void
1248aq_attach(device_t parent, device_t self, void *aux) 1248aq_attach(device_t parent, device_t self, void *aux)
1249{ 1249{
1250 struct aq_softc *sc = device_private(self); 1250 struct aq_softc *sc = device_private(self);
1251 struct pci_attach_args *pa = aux; 1251 struct pci_attach_args *pa = aux;
1252 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1252 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1253 pci_chipset_tag_t pc; 1253 pci_chipset_tag_t pc;
1254 pcitag_t tag; 1254 pcitag_t tag;
1255 pcireg_t command, memtype, bar; 1255 pcireg_t command, memtype, bar;
1256 const struct aq_product *aqp; 1256 const struct aq_product *aqp;
1257 int error; 1257 int error;
1258 1258
1259 sc->sc_dev = self; 1259 sc->sc_dev = self;
1260 mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NET); 1260 mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NET);
1261 mutex_init(&sc->sc_mpi_mutex, MUTEX_DEFAULT, IPL_NET); 1261 mutex_init(&sc->sc_mpi_mutex, MUTEX_DEFAULT, IPL_NET);
1262 1262
1263 sc->sc_pc = pc = pa->pa_pc; 1263 sc->sc_pc = pc = pa->pa_pc;
1264 sc->sc_pcitag = tag = pa->pa_tag; 1264 sc->sc_pcitag = tag = pa->pa_tag;
1265 sc->sc_dmat = pci_dma64_available(pa) ? pa->pa_dmat64 : pa->pa_dmat; 1265 sc->sc_dmat = pci_dma64_available(pa) ? pa->pa_dmat64 : pa->pa_dmat;
1266 1266
1267 command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 1267 command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
1268 command |= PCI_COMMAND_MASTER_ENABLE; 1268 command |= PCI_COMMAND_MASTER_ENABLE;
1269 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, command); 1269 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, command);
1270 1270
1271 sc->sc_product = PCI_PRODUCT(pa->pa_id); 1271 sc->sc_product = PCI_PRODUCT(pa->pa_id);
1272 sc->sc_revision = PCI_REVISION(pa->pa_class); 1272 sc->sc_revision = PCI_REVISION(pa->pa_class);
1273 1273
1274 aqp = aq_lookup(pa); 1274 aqp = aq_lookup(pa);
1275 KASSERT(aqp != NULL); 1275 KASSERT(aqp != NULL);
1276 1276
1277 pci_aprint_devinfo_fancy(pa, "Ethernet controller", aqp->aq_name, 1); 1277 pci_aprint_devinfo_fancy(pa, "Ethernet controller", aqp->aq_name, 1);
1278 1278
1279 bar = pci_conf_read(pc, tag, PCI_BAR(0)); 1279 bar = pci_conf_read(pc, tag, PCI_BAR(0));
1280 if ((PCI_MAPREG_MEM_ADDR(bar) == 0) || 1280 if ((PCI_MAPREG_MEM_ADDR(bar) == 0) ||
1281 (PCI_MAPREG_TYPE(bar) != PCI_MAPREG_TYPE_MEM)) { 1281 (PCI_MAPREG_TYPE(bar) != PCI_MAPREG_TYPE_MEM)) {
1282 aprint_error_dev(sc->sc_dev, "wrong BAR type\n"); 1282 aprint_error_dev(sc->sc_dev, "wrong BAR type\n");
1283 return; 1283 return;
1284 } 1284 }
1285 memtype = pci_mapreg_type(pc, tag, PCI_BAR(0)); 1285 memtype = pci_mapreg_type(pc, tag, PCI_BAR(0));
1286 if (pci_mapreg_map(pa, PCI_BAR(0), memtype, 0, &sc->sc_iot, &sc->sc_ioh, 1286 if (pci_mapreg_map(pa, PCI_BAR(0), memtype, 0, &sc->sc_iot, &sc->sc_ioh,
1287 NULL, &sc->sc_iosize) != 0) { 1287 NULL, &sc->sc_iosize) != 0) {
1288 aprint_error_dev(sc->sc_dev, "unable to map register\n"); 1288 aprint_error_dev(sc->sc_dev, "unable to map register\n");
1289 return; 1289 return;
1290 } 1290 }
1291 1291
1292 sc->sc_nqueues = MIN(ncpu, AQ_RSSQUEUE_MAX); 1292 sc->sc_nqueues = MIN(ncpu, AQ_RSSQUEUE_MAX);
1293 1293
1294 /* max queue num is 8, and must be 2^n */ 1294 /* max queue num is 8, and must be 2^n */
1295 if (ncpu >= 8) 1295 if (ncpu >= 8)
1296 sc->sc_nqueues = 8; 1296 sc->sc_nqueues = 8;
1297 else if (ncpu >= 4) 1297 else if (ncpu >= 4)
1298 sc->sc_nqueues = 4; 1298 sc->sc_nqueues = 4;
1299 else if (ncpu >= 2) 1299 else if (ncpu >= 2)
1300 sc->sc_nqueues = 2; 1300 sc->sc_nqueues = 2;
1301 else 1301 else
1302 sc->sc_nqueues = 1; 1302 sc->sc_nqueues = 1;
1303 1303
1304 int msixcount = pci_msix_count(pa->pa_pc, pa->pa_tag); 1304 int msixcount = pci_msix_count(pa->pa_pc, pa->pa_tag);
1305#ifndef CONFIG_NO_TXRX_INDEPENDENT 1305#ifndef CONFIG_NO_TXRX_INDEPENDENT
1306 if (msixcount >= (sc->sc_nqueues * 2 + 1)) { 1306 if (msixcount >= (sc->sc_nqueues * 2 + 1)) {
1307 /* TX intrs + RX intrs + LINKSTAT intrs */ 1307 /* TX intrs + RX intrs + LINKSTAT intrs */
1308 sc->sc_use_txrx_independent_intr = true; 1308 sc->sc_use_txrx_independent_intr = true;
1309 sc->sc_poll_linkstat = false; 1309 sc->sc_poll_linkstat = false;
1310 sc->sc_msix = true; 1310 sc->sc_msix = true;
1311 } else if (msixcount >= (sc->sc_nqueues * 2)) { 1311 } else if (msixcount >= (sc->sc_nqueues * 2)) {
1312 /* TX intrs + RX intrs */ 1312 /* TX intrs + RX intrs */
1313 sc->sc_use_txrx_independent_intr = true; 1313 sc->sc_use_txrx_independent_intr = true;
1314 sc->sc_poll_linkstat = true; 1314 sc->sc_poll_linkstat = true;
1315 sc->sc_msix = true; 1315 sc->sc_msix = true;
1316 } else 1316 } else
1317#endif 1317#endif
1318 if (msixcount >= (sc->sc_nqueues + 1)) { 1318 if (msixcount >= (sc->sc_nqueues + 1)) {
1319 /* TX/RX intrs LINKSTAT intrs */ 1319 /* TX/RX intrs LINKSTAT intrs */
1320 sc->sc_use_txrx_independent_intr = false; 1320 sc->sc_use_txrx_independent_intr = false;
1321 sc->sc_poll_linkstat = false; 1321 sc->sc_poll_linkstat = false;
1322 sc->sc_msix = true; 1322 sc->sc_msix = true;
1323 } else if (msixcount >= sc->sc_nqueues) { 1323 } else if (msixcount >= sc->sc_nqueues) {
1324 /* TX/RX intrs */ 1324 /* TX/RX intrs */
1325 sc->sc_use_txrx_independent_intr = false; 1325 sc->sc_use_txrx_independent_intr = false;
1326 sc->sc_poll_linkstat = true; 1326 sc->sc_poll_linkstat = true;
1327 sc->sc_msix = true; 1327 sc->sc_msix = true;
1328 } else { 1328 } else {
1329 /* giving up using MSI-X */ 1329 /* giving up using MSI-X */
1330 sc->sc_msix = false; 1330 sc->sc_msix = false;
1331 } 1331 }
1332 1332
1333 /* XXX: on FIBRE, linkstat interrupt does not occur on boot? */ 1333 /* XXX: on FIBRE, linkstat interrupt does not occur on boot? */
1334 if (aqp->aq_media_type == AQ_MEDIA_TYPE_FIBRE) 1334 if (aqp->aq_media_type == AQ_MEDIA_TYPE_FIBRE)
1335 sc->sc_poll_linkstat = true; 1335 sc->sc_poll_linkstat = true;
1336 1336
1337#ifdef AQ_FORCE_POLL_LINKSTAT 1337#ifdef AQ_FORCE_POLL_LINKSTAT
1338 sc->sc_poll_linkstat = true; 1338 sc->sc_poll_linkstat = true;
1339#endif 1339#endif
1340 1340
1341 aprint_debug_dev(sc->sc_dev, 1341 aprint_debug_dev(sc->sc_dev,
1342 "ncpu=%d, pci_msix_count=%d." 1342 "ncpu=%d, pci_msix_count=%d."
1343 " allocate %d interrupts for %d%s queues%s\n", 1343 " allocate %d interrupts for %d%s queues%s\n",
1344 ncpu, msixcount, 1344 ncpu, msixcount,
1345 (sc->sc_use_txrx_independent_intr ? 1345 (sc->sc_use_txrx_independent_intr ?
1346 (sc->sc_nqueues * 2) : sc->sc_nqueues) + 1346 (sc->sc_nqueues * 2) : sc->sc_nqueues) +
1347 (sc->sc_poll_linkstat ? 0 : 1), 1347 (sc->sc_poll_linkstat ? 0 : 1),
1348 sc->sc_nqueues, 1348 sc->sc_nqueues,
1349 sc->sc_use_txrx_independent_intr ? "*2" : "", 1349 sc->sc_use_txrx_independent_intr ? "*2" : "",
1350 sc->sc_poll_linkstat ? "" : ", and link status"); 1350 sc->sc_poll_linkstat ? "" : ", and link status");
1351 1351
1352 if (sc->sc_msix) 1352 if (sc->sc_msix)
1353 error = aq_setup_msix(sc, pa, sc->sc_nqueues, 1353 error = aq_setup_msix(sc, pa, sc->sc_nqueues,
1354 sc->sc_use_txrx_independent_intr, !sc->sc_poll_linkstat); 1354 sc->sc_use_txrx_independent_intr, !sc->sc_poll_linkstat);
1355 else 1355 else
1356 error = ENODEV; 1356 error = ENODEV;
1357 1357
1358 if (error != 0) { 1358 if (error != 0) {
1359 /* if MSI-X failed, fallback to MSI with single queue */ 1359 /* if MSI-X failed, fallback to MSI with single queue */
1360 sc->sc_use_txrx_independent_intr = false; 1360 sc->sc_use_txrx_independent_intr = false;
1361 sc->sc_poll_linkstat = false; 1361 sc->sc_poll_linkstat = false;
1362 sc->sc_msix = false; 1362 sc->sc_msix = false;
1363 sc->sc_nqueues = 1; 1363 sc->sc_nqueues = 1;
1364 error = aq_setup_legacy(sc, pa, PCI_INTR_TYPE_MSI); 1364 error = aq_setup_legacy(sc, pa, PCI_INTR_TYPE_MSI);
1365 } 1365 }
1366 if (error != 0) { 1366 if (error != 0) {
1367 /* if MSI failed, fallback to INTx */ 1367 /* if MSI failed, fallback to INTx */
1368 error = aq_setup_legacy(sc, pa, PCI_INTR_TYPE_INTX); 1368 error = aq_setup_legacy(sc, pa, PCI_INTR_TYPE_INTX);
1369 } 1369 }
1370 if (error != 0) 1370 if (error != 0)
1371 return; 1371 return;
1372 1372
1373 callout_init(&sc->sc_tick_ch, 0); 1373 callout_init(&sc->sc_tick_ch, 0);
1374 callout_setfunc(&sc->sc_tick_ch, aq_tick, sc); 1374 callout_setfunc(&sc->sc_tick_ch, aq_tick, sc);
1375 1375
1376 sc->sc_intr_moderation_enable = CONFIG_INTR_MODERATION_ENABLE; 1376 sc->sc_intr_moderation_enable = CONFIG_INTR_MODERATION_ENABLE;
1377 1377
1378 if (sc->sc_msix && (sc->sc_nqueues > 1)) 1378 if (sc->sc_msix && (sc->sc_nqueues > 1))
1379 sc->sc_rss_enable = true; 1379 sc->sc_rss_enable = true;
1380 else 1380 else
1381 sc->sc_rss_enable = false; 1381 sc->sc_rss_enable = false;
1382 1382
1383 error = aq_txrx_rings_alloc(sc); 1383 error = aq_txrx_rings_alloc(sc);
1384 if (error != 0) 1384 if (error != 0)
1385 goto attach_failure; 1385 goto attach_failure;
1386 1386
1387 error = aq_fw_reset(sc); 1387 error = aq_fw_reset(sc);
1388 if (error != 0) 1388 if (error != 0)
1389 goto attach_failure; 1389 goto attach_failure;
1390 1390
1391 error = aq_fw_version_init(sc); 1391 error = aq_fw_version_init(sc);
1392 if (error != 0) 1392 if (error != 0)
1393 goto attach_failure; 1393 goto attach_failure;
1394 1394
1395 error = aq_hw_init_ucp(sc); 1395 error = aq_hw_init_ucp(sc);
1396 if (error < 0) 1396 if (error < 0)
1397 goto attach_failure; 1397 goto attach_failure;
1398 1398
1399 KASSERT(sc->sc_mbox_addr != 0); 1399 KASSERT(sc->sc_mbox_addr != 0);
1400 error = aq_hw_reset(sc); 1400 error = aq_hw_reset(sc);
1401 if (error != 0) 1401 if (error != 0)
1402 goto attach_failure; 1402 goto attach_failure;
1403 1403
1404 aq_get_mac_addr(sc); 1404 aq_get_mac_addr(sc);
1405 aq_init_rss(sc); 1405 aq_init_rss(sc);
1406 1406
1407 error = aq_hw_init(sc); /* initialize and interrupts */ 1407 error = aq_hw_init(sc); /* initialize and interrupts */
1408 if (error != 0) 1408 if (error != 0)
1409 goto attach_failure; 1409 goto attach_failure;
1410 1410
1411 sc->sc_media_type = aqp->aq_media_type; 1411 sc->sc_media_type = aqp->aq_media_type;
1412 sc->sc_available_rates = aqp->aq_available_rates; 1412 sc->sc_available_rates = aqp->aq_available_rates;
1413 1413
1414 sc->sc_ethercom.ec_ifmedia = &sc->sc_media; 1414 sc->sc_ethercom.ec_ifmedia = &sc->sc_media;
1415 ifmedia_init(&sc->sc_media, IFM_IMASK, 1415 ifmedia_init(&sc->sc_media, IFM_IMASK,
1416 aq_ifmedia_change, aq_ifmedia_status); 1416 aq_ifmedia_change, aq_ifmedia_status);
1417 aq_initmedia(sc); 1417 aq_initmedia(sc);
1418 1418
1419 strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); 1419 strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
1420 ifp->if_softc = sc; 1420 ifp->if_softc = sc;
1421 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 1421 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1422 ifp->if_baudrate = IF_Gbps(10); 1422 ifp->if_baudrate = IF_Gbps(10);
1423 ifp->if_init = aq_init; 1423 ifp->if_init = aq_init;
1424 ifp->if_ioctl = aq_ioctl; 1424 ifp->if_ioctl = aq_ioctl;
1425 if (sc->sc_msix && (sc->sc_nqueues > 1)) 1425 if (sc->sc_msix && (sc->sc_nqueues > 1))
1426 ifp->if_transmit = aq_transmit; 1426 ifp->if_transmit = aq_transmit;
1427 ifp->if_start = aq_start; 1427 ifp->if_start = aq_start;
1428 ifp->if_stop = aq_stop; 1428 ifp->if_stop = aq_stop;
1429 ifp->if_watchdog = aq_watchdog; 1429 ifp->if_watchdog = aq_watchdog;
1430 IFQ_SET_READY(&ifp->if_snd); 1430 IFQ_SET_READY(&ifp->if_snd);
1431 1431
1432 /* initialize capabilities */ 1432 /* initialize capabilities */
1433 sc->sc_ethercom.ec_capabilities = 0; 1433 sc->sc_ethercom.ec_capabilities = 0;
1434 sc->sc_ethercom.ec_capenable = 0; 1434 sc->sc_ethercom.ec_capenable = 0;
1435#if notyet 1435#if notyet
1436 /* TODO */ 1436 /* TODO */
1437 sc->sc_ethercom.ec_capabilities |= ETHERCAP_EEE; 1437 sc->sc_ethercom.ec_capabilities |= ETHERCAP_EEE;
1438#endif 1438#endif
1439 sc->sc_ethercom.ec_capabilities |= 1439 sc->sc_ethercom.ec_capabilities |=
1440 ETHERCAP_JUMBO_MTU | 1440 ETHERCAP_JUMBO_MTU |
1441 ETHERCAP_VLAN_MTU | 1441 ETHERCAP_VLAN_MTU |
1442 ETHERCAP_VLAN_HWTAGGING | 1442 ETHERCAP_VLAN_HWTAGGING |
1443 ETHERCAP_VLAN_HWFILTER; 1443 ETHERCAP_VLAN_HWFILTER;
1444 sc->sc_ethercom.ec_capenable |= 1444 sc->sc_ethercom.ec_capenable |=
1445 ETHERCAP_VLAN_HWTAGGING | 1445 ETHERCAP_VLAN_HWTAGGING |
1446 ETHERCAP_VLAN_HWFILTER; 1446 ETHERCAP_VLAN_HWFILTER;
1447 1447
1448 ifp->if_capabilities = 0; 1448 ifp->if_capabilities = 0;
1449 ifp->if_capenable = 0; 1449 ifp->if_capenable = 0;
1450#ifdef CONFIG_LRO_SUPPORT 1450#ifdef CONFIG_LRO_SUPPORT
1451 ifp->if_capabilities |= IFCAP_LRO; 1451 ifp->if_capabilities |= IFCAP_LRO;
1452 ifp->if_capenable |= IFCAP_LRO; 1452 ifp->if_capenable |= IFCAP_LRO;
1453#endif 1453#endif
1454#if notyet 1454#if notyet
1455 /* TSO */ 1455 /* TSO */
1456 ifp->if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6; 1456 ifp->if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6;
1457#endif 1457#endif
1458 1458
1459#if notyet 1459#if notyet
1460 /* 1460 /*
1461 * XXX: 1461 * XXX:
1462 * Rx L4 CSUM doesn't work well for fragment packet. 1462 * Rx L4 CSUM doesn't work well for fragment packet.
1463 * aq marks 'CHEDKED' and 'BAD' for them. 1463 * aq marks 'CHEDKED' and 'BAD' for them.
1464 * we need to ignore (clear) hw-csum flags if the packet is fragmented 1464 * we need to ignore (clear) hw-csum flags if the packet is fragmented
1465 * 1465 *
1466 * TODO: test with LRO enabled 1466 * TODO: test with LRO enabled
1467 */ 1467 */
1468 ifp->if_capabilities |= IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_TCPv6_Rx; 1468 ifp->if_capabilities |= IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_TCPv6_Rx;
1469 ifp->if_capabilities |= IFCAP_CSUM_UDPv4_Rx | IFCAP_CSUM_UDPv6_Rx; 1469 ifp->if_capabilities |= IFCAP_CSUM_UDPv4_Rx | IFCAP_CSUM_UDPv6_Rx;
1470#endif 1470#endif
1471 /* TX hardware checksum offloadding */ 1471 /* TX hardware checksum offloadding */
1472 ifp->if_capabilities |= IFCAP_CSUM_IPv4_Tx; 1472 ifp->if_capabilities |= IFCAP_CSUM_IPv4_Tx;
1473 ifp->if_capabilities |= IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv6_Tx; 1473 ifp->if_capabilities |= IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv6_Tx;
1474 ifp->if_capabilities |= IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv6_Tx; 1474 ifp->if_capabilities |= IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv6_Tx;
1475 /* RX hardware checksum offloadding */ 1475 /* RX hardware checksum offloadding */
1476 ifp->if_capabilities |= IFCAP_CSUM_IPv4_Rx; 1476 ifp->if_capabilities |= IFCAP_CSUM_IPv4_Rx;
1477 1477
1478 if_attach(ifp); 1478 if_attach(ifp);
1479 if_deferred_start_init(ifp, NULL); 1479 if_deferred_start_init(ifp, NULL);
1480 ether_ifattach(ifp, sc->sc_enaddr.ether_addr_octet); 1480 ether_ifattach(ifp, sc->sc_enaddr.ether_addr_octet);
1481 ether_set_vlan_cb(&sc->sc_ethercom, aq_vlan_cb); 1481 ether_set_vlan_cb(&sc->sc_ethercom, aq_vlan_cb);
1482 ether_set_ifflags_cb(&sc->sc_ethercom, aq_ifflags_cb); 1482 ether_set_ifflags_cb(&sc->sc_ethercom, aq_ifflags_cb);
1483 1483
1484 aq_enable_intr(sc, true, false); /* only intr about link */ 1484 aq_enable_intr(sc, true, false); /* only intr about link */
1485 1485
1486 /* update media */ 1486 /* update media */
1487 aq_ifmedia_change(ifp); 1487 aq_ifmedia_change(ifp);
1488 1488
1489#if NSYSMON_ENVSYS > 0 1489#if NSYSMON_ENVSYS > 0
1490 /* temperature monitoring */ 1490 /* temperature monitoring */
1491 if (sc->sc_fw_ops != NULL && sc->sc_fw_ops->get_temperature != NULL && 1491 if (sc->sc_fw_ops != NULL && sc->sc_fw_ops->get_temperature != NULL &&
1492 (sc->sc_fw_caps & FW2X_CTRL_TEMPERATURE) != 0) { 1492 (sc->sc_fw_caps & FW2X_CTRL_TEMPERATURE) != 0) {
1493 1493
1494 sc->sc_sme = sysmon_envsys_create(); 1494 sc->sc_sme = sysmon_envsys_create();
1495 sc->sc_sme->sme_name = device_xname(self); 1495 sc->sc_sme->sme_name = device_xname(self);
1496 sc->sc_sme->sme_cookie = sc; 1496 sc->sc_sme->sme_cookie = sc;
1497 sc->sc_sme->sme_flags = 0; 1497 sc->sc_sme->sme_flags = 0;
1498 sc->sc_sme->sme_refresh = aq_temp_refresh; 1498 sc->sc_sme->sme_refresh = aq_temp_refresh;
1499 sc->sc_sensor_temp.units = ENVSYS_STEMP; 1499 sc->sc_sensor_temp.units = ENVSYS_STEMP;
1500 sc->sc_sensor_temp.state = ENVSYS_SINVALID; 1500 sc->sc_sensor_temp.state = ENVSYS_SINVALID;
1501 snprintf(sc->sc_sensor_temp.desc, ENVSYS_DESCLEN, "PHY"); 1501 snprintf(sc->sc_sensor_temp.desc, ENVSYS_DESCLEN, "PHY");
1502 1502
1503 sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor_temp); 1503 sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor_temp);
1504 sysmon_envsys_register(sc->sc_sme); 1504 sysmon_envsys_register(sc->sc_sme);
1505 1505
1506 /* 1506 /*
1507 * for unknown reasons, the first call of fw2x_get_temperature() 1507 * for unknown reasons, the first call of fw2x_get_temperature()
1508 * will always fail (firmware matter?), so run once now. 1508 * will always fail (firmware matter?), so run once now.
1509 */ 1509 */
1510 aq_temp_refresh(sc->sc_sme, &sc->sc_sensor_temp); 1510 aq_temp_refresh(sc->sc_sme, &sc->sc_sensor_temp);
1511 } 1511 }
1512#endif 1512#endif
1513 1513
1514#ifdef AQ_EVENT_COUNTERS 1514#ifdef AQ_EVENT_COUNTERS
1515 /* get starting statistics values */ 1515 /* get starting statistics values */
1516 if (sc->sc_fw_ops != NULL && sc->sc_fw_ops->get_stats != NULL && 1516 if (sc->sc_fw_ops != NULL && sc->sc_fw_ops->get_stats != NULL &&
1517 sc->sc_fw_ops->get_stats(sc, &sc->sc_statistics[0]) == 0) { 1517 sc->sc_fw_ops->get_stats(sc, &sc->sc_statistics[0]) == 0) {
1518 sc->sc_poll_statistics = true; 1518 sc->sc_poll_statistics = true;
1519 } 1519 }
1520 1520
1521 AQ_EVCNT_ATTACH_MISC(sc, uprc, "RX unicast packet"); 1521 AQ_EVCNT_ATTACH_MISC(sc, uprc, "RX unicast packet");
1522 AQ_EVCNT_ATTACH_MISC(sc, bprc, "RX broadcast packet"); 1522 AQ_EVCNT_ATTACH_MISC(sc, bprc, "RX broadcast packet");
1523 AQ_EVCNT_ATTACH_MISC(sc, mprc, "RX multicast packet"); 1523 AQ_EVCNT_ATTACH_MISC(sc, mprc, "RX multicast packet");
1524 AQ_EVCNT_ATTACH_MISC(sc, erpr, "RX error packet"); 1524 AQ_EVCNT_ATTACH_MISC(sc, erpr, "RX error packet");
1525 AQ_EVCNT_ATTACH_MISC(sc, ubrc, "RX unicast bytes"); 1525 AQ_EVCNT_ATTACH_MISC(sc, ubrc, "RX unicast bytes");
1526 AQ_EVCNT_ATTACH_MISC(sc, bbrc, "RX broadcast bytes"); 1526 AQ_EVCNT_ATTACH_MISC(sc, bbrc, "RX broadcast bytes");
1527 AQ_EVCNT_ATTACH_MISC(sc, mbrc, "RX multicast bytes"); 1527 AQ_EVCNT_ATTACH_MISC(sc, mbrc, "RX multicast bytes");
1528 AQ_EVCNT_ATTACH_MISC(sc, prc, "RX good packet"); 1528 AQ_EVCNT_ATTACH_MISC(sc, prc, "RX good packet");
1529 AQ_EVCNT_ATTACH_MISC(sc, uptc, "TX unicast packet"); 1529 AQ_EVCNT_ATTACH_MISC(sc, uptc, "TX unicast packet");
1530 AQ_EVCNT_ATTACH_MISC(sc, bptc, "TX broadcast packet"); 1530 AQ_EVCNT_ATTACH_MISC(sc, bptc, "TX broadcast packet");
1531 AQ_EVCNT_ATTACH_MISC(sc, mptc, "TX multicast packet"); 1531 AQ_EVCNT_ATTACH_MISC(sc, mptc, "TX multicast packet");
1532 AQ_EVCNT_ATTACH_MISC(sc, erpt, "TX error packet"); 1532 AQ_EVCNT_ATTACH_MISC(sc, erpt, "TX error packet");
1533 AQ_EVCNT_ATTACH_MISC(sc, ubtc, "TX unicast bytes"); 1533 AQ_EVCNT_ATTACH_MISC(sc, ubtc, "TX unicast bytes");
1534 AQ_EVCNT_ATTACH_MISC(sc, bbtc, "TX broadcast bytes"); 1534 AQ_EVCNT_ATTACH_MISC(sc, bbtc, "TX broadcast bytes");
1535 AQ_EVCNT_ATTACH_MISC(sc, mbtc, "TX multicast bytes"); 1535 AQ_EVCNT_ATTACH_MISC(sc, mbtc, "TX multicast bytes");
1536 AQ_EVCNT_ATTACH_MISC(sc, ptc, "TX good packet"); 1536 AQ_EVCNT_ATTACH_MISC(sc, ptc, "TX good packet");
1537 AQ_EVCNT_ATTACH_MISC(sc, dpc, "DMA drop packet"); 1537 AQ_EVCNT_ATTACH_MISC(sc, dpc, "DMA drop packet");
1538 AQ_EVCNT_ATTACH_MISC(sc, cprc, "RX coalesced packet"); 1538 AQ_EVCNT_ATTACH_MISC(sc, cprc, "RX coalesced packet");
1539#endif 1539#endif
1540 1540
1541 return; 1541 return;
1542 1542
1543 attach_failure: 1543 attach_failure:
1544 aq_detach(self, 0); 1544 aq_detach(self, 0);
1545} 1545}
1546 1546
1547static int 1547static int
1548aq_detach(device_t self, int flags __unused) 1548aq_detach(device_t self, int flags __unused)
1549{ 1549{
1550 struct aq_softc *sc = device_private(self); 1550 struct aq_softc *sc = device_private(self);
1551 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1551 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1552 int i, s; 1552 int i, s;
1553 1553
1554 if (sc->sc_iosize != 0) { 1554 if (sc->sc_iosize != 0) {
1555 if (ifp->if_softc != NULL) { 1555 if (ifp->if_softc != NULL) {
1556 s = splnet(); 1556 s = splnet();
1557 aq_stop(ifp, 0); 1557 aq_stop(ifp, 0);
1558 splx(s); 1558 splx(s);
1559 } 1559 }
1560 1560
1561 for (i = 0; i < AQ_NINTR_MAX; i++) { 1561 for (i = 0; i < AQ_NINTR_MAX; i++) {
1562 if (sc->sc_ihs[i] != NULL) { 1562 if (sc->sc_ihs[i] != NULL) {
1563 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]); 1563 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]);
1564 sc->sc_ihs[i] = NULL; 1564 sc->sc_ihs[i] = NULL;
1565 } 1565 }
1566 } 1566 }
1567 if (sc->sc_nintrs > 0) { 1567 if (sc->sc_nintrs > 0) {
1568 pci_intr_release(sc->sc_pc, sc->sc_intrs, 1568 pci_intr_release(sc->sc_pc, sc->sc_intrs,
1569 sc->sc_nintrs); 1569 sc->sc_nintrs);
1570 sc->sc_intrs = NULL; 1570 sc->sc_intrs = NULL;
1571 sc->sc_nintrs = 0; 1571 sc->sc_nintrs = 0;
1572 } 1572 }
1573 1573
1574 aq_txrx_rings_free(sc); 1574 aq_txrx_rings_free(sc);
1575 1575
1576 if (ifp->if_softc != NULL) { 1576 if (ifp->if_softc != NULL) {
1577 ether_ifdetach(ifp); 1577 ether_ifdetach(ifp);
1578 if_detach(ifp); 1578 if_detach(ifp);
1579 } 1579 }
1580 1580
1581 aprint_debug_dev(sc->sc_dev, "%s: bus_space_unmap\n", __func__); 1581 aprint_debug_dev(sc->sc_dev, "%s: bus_space_unmap\n", __func__);
1582 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize); 1582 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize);
1583 sc->sc_iosize = 0; 1583 sc->sc_iosize = 0;
1584 } 1584 }
1585 1585
1586 callout_stop(&sc->sc_tick_ch); 1586 callout_stop(&sc->sc_tick_ch);
1587 1587
1588#if NSYSMON_ENVSYS > 0 1588#if NSYSMON_ENVSYS > 0
1589 if (sc->sc_sme != NULL) { 1589 if (sc->sc_sme != NULL) {
1590 /* all sensors associated with this will also be detached */ 1590 /* all sensors associated with this will also be detached */
1591 sysmon_envsys_unregister(sc->sc_sme); 1591 sysmon_envsys_unregister(sc->sc_sme);
1592 sc->sc_sme = NULL; 1592 sc->sc_sme = NULL;
1593 } 1593 }
1594#endif 1594#endif
1595 1595
1596#ifdef AQ_EVENT_COUNTERS 1596#ifdef AQ_EVENT_COUNTERS
1597 AQ_EVCNT_DETACH(sc, uprc); 1597 AQ_EVCNT_DETACH(sc, uprc);
1598 AQ_EVCNT_DETACH(sc, mprc); 1598 AQ_EVCNT_DETACH(sc, mprc);
1599 AQ_EVCNT_DETACH(sc, bprc); 1599 AQ_EVCNT_DETACH(sc, bprc);
1600 AQ_EVCNT_DETACH(sc, erpt); 1600 AQ_EVCNT_DETACH(sc, erpt);
1601 AQ_EVCNT_DETACH(sc, uptc); 1601 AQ_EVCNT_DETACH(sc, uptc);
1602 AQ_EVCNT_DETACH(sc, mptc); 1602 AQ_EVCNT_DETACH(sc, mptc);
1603 AQ_EVCNT_DETACH(sc, bptc); 1603 AQ_EVCNT_DETACH(sc, bptc);
1604 AQ_EVCNT_DETACH(sc, erpr); 1604 AQ_EVCNT_DETACH(sc, erpr);
1605 AQ_EVCNT_DETACH(sc, mbtc); 1605 AQ_EVCNT_DETACH(sc, mbtc);
1606 AQ_EVCNT_DETACH(sc, bbtc); 1606 AQ_EVCNT_DETACH(sc, bbtc);
1607 AQ_EVCNT_DETACH(sc, mbrc); 1607 AQ_EVCNT_DETACH(sc, mbrc);
1608 AQ_EVCNT_DETACH(sc, bbrc); 1608 AQ_EVCNT_DETACH(sc, bbrc);
1609 AQ_EVCNT_DETACH(sc, ubrc); 1609 AQ_EVCNT_DETACH(sc, ubrc);
1610 AQ_EVCNT_DETACH(sc, ubtc); 1610 AQ_EVCNT_DETACH(sc, ubtc);
1611 AQ_EVCNT_DETACH(sc, ptc); 1611 AQ_EVCNT_DETACH(sc, ptc);
1612 AQ_EVCNT_DETACH(sc, prc); 1612 AQ_EVCNT_DETACH(sc, prc);
1613 AQ_EVCNT_DETACH(sc, dpc); 1613 AQ_EVCNT_DETACH(sc, dpc);
1614 AQ_EVCNT_DETACH(sc, cprc); 1614 AQ_EVCNT_DETACH(sc, cprc);
1615#endif 1615#endif
1616 1616
1617 mutex_destroy(&sc->sc_mpi_mutex); 1617 mutex_destroy(&sc->sc_mpi_mutex);
1618 mutex_destroy(&sc->sc_mutex); 1618 mutex_destroy(&sc->sc_mutex);
1619 1619
1620 return 0; 1620 return 0;
1621} 1621}
1622 1622
1623static int 1623static int
1624aq_establish_intr(struct aq_softc *sc, int intno, kcpuset_t *affinity, 1624aq_establish_intr(struct aq_softc *sc, int intno, kcpuset_t *affinity,
1625 int (*func)(void *), void *arg, const char *xname) 1625 int (*func)(void *), void *arg, const char *xname)
1626{ 1626{
1627 char intrbuf[PCI_INTRSTR_LEN]; 1627 char intrbuf[PCI_INTRSTR_LEN];
1628 pci_chipset_tag_t pc = sc->sc_pc; 1628 pci_chipset_tag_t pc = sc->sc_pc;
1629 void *vih; 1629 void *vih;
1630 const char *intrstr = NULL; 1630 const char *intrstr = NULL;
1631 1631
1632 intrstr = pci_intr_string(pc, sc->sc_intrs[intno], intrbuf, 1632 intrstr = pci_intr_string(pc, sc->sc_intrs[intno], intrbuf,
1633 sizeof(intrbuf)); 1633 sizeof(intrbuf));
1634 1634
1635 pci_intr_setattr(pc, &sc->sc_intrs[intno], PCI_INTR_MPSAFE, true); 1635 pci_intr_setattr(pc, &sc->sc_intrs[intno], PCI_INTR_MPSAFE, true);
1636 1636
1637 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intno], 1637 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intno],
1638 IPL_NET, func, arg, xname); 1638 IPL_NET, func, arg, xname);
1639 if (vih == NULL) { 1639 if (vih == NULL) {
1640 aprint_error_dev(sc->sc_dev, 1640 aprint_error_dev(sc->sc_dev,
1641 "unable to establish MSI-X%s%s for %s\n", 1641 "unable to establish MSI-X%s%s for %s\n",
1642 intrstr ? " at " : "", 1642 intrstr ? " at " : "",
1643 intrstr ? intrstr : "", xname); 1643 intrstr ? intrstr : "", xname);
1644 return EIO; 1644 return EIO;
1645 } 1645 }
1646 sc->sc_ihs[intno] = vih; 1646 sc->sc_ihs[intno] = vih;
1647 1647
1648 if (affinity != NULL) { 1648 if (affinity != NULL) {
1649 /* Round-robin affinity */ 1649 /* Round-robin affinity */
1650 kcpuset_zero(affinity); 1650 kcpuset_zero(affinity);
1651 kcpuset_set(affinity, intno % ncpu); 1651 kcpuset_set(affinity, intno % ncpu);
1652 interrupt_distribute(vih, affinity, NULL); 1652 interrupt_distribute(vih, affinity, NULL);
1653 } 1653 }
1654 1654
1655 return 0; 1655 return 0;
1656} 1656}
1657 1657
1658static int 1658static int
1659aq_establish_msix_intr(struct aq_softc *sc, bool txrx_independent, 1659aq_establish_msix_intr(struct aq_softc *sc, bool txrx_independent,
1660 bool linkintr) 1660 bool linkintr)
1661{ 1661{
1662 kcpuset_t *affinity; 1662 kcpuset_t *affinity;
1663 int error, intno, i; 1663 int error, intno, i;
1664 char intr_xname[INTRDEVNAMEBUF]; 1664 char intr_xname[INTRDEVNAMEBUF];
1665 1665
1666 kcpuset_create(&affinity, false); 1666 kcpuset_create(&affinity, false);
1667 1667
1668 intno = 0; 1668 intno = 0;
1669 1669
1670 if (txrx_independent) { 1670 if (txrx_independent) {
1671 for (i = 0; i < sc->sc_nqueues; i++) { 1671 for (i = 0; i < sc->sc_nqueues; i++) {
1672 snprintf(intr_xname, sizeof(intr_xname), "%s RX%d", 1672 snprintf(intr_xname, sizeof(intr_xname), "%s RX%d",
1673 device_xname(sc->sc_dev), i); 1673 device_xname(sc->sc_dev), i);
1674 sc->sc_rx_irq[i] = intno; 1674 sc->sc_rx_irq[i] = intno;
1675 error = aq_establish_intr(sc, intno++, affinity, 1675 error = aq_establish_intr(sc, intno++, affinity,
1676 aq_rx_intr, &sc->sc_queue[i].rxring, intr_xname); 1676 aq_rx_intr, &sc->sc_queue[i].rxring, intr_xname);
1677 if (error != 0) 1677 if (error != 0)
1678 goto fail; 1678 goto fail;
1679 } 1679 }
1680 for (i = 0; i < sc->sc_nqueues; i++) { 1680 for (i = 0; i < sc->sc_nqueues; i++) {
1681 snprintf(intr_xname, sizeof(intr_xname), "%s TX%d", 1681 snprintf(intr_xname, sizeof(intr_xname), "%s TX%d",
1682 device_xname(sc->sc_dev), i); 1682 device_xname(sc->sc_dev), i);
1683 sc->sc_tx_irq[i] = intno; 1683 sc->sc_tx_irq[i] = intno;
1684 error = aq_establish_intr(sc, intno++, affinity, 1684 error = aq_establish_intr(sc, intno++, affinity,
1685 aq_tx_intr, &sc->sc_queue[i].txring, intr_xname); 1685 aq_tx_intr, &sc->sc_queue[i].txring, intr_xname);
1686 if (error != 0) 1686 if (error != 0)
1687 goto fail; 1687 goto fail;
1688 } 1688 }
1689 } else { 1689 } else {
1690 for (i = 0; i < sc->sc_nqueues; i++) { 1690 for (i = 0; i < sc->sc_nqueues; i++) {
1691 snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d", 1691 snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
1692 device_xname(sc->sc_dev), i); 1692 device_xname(sc->sc_dev), i);
1693 sc->sc_rx_irq[i] = intno; 1693 sc->sc_rx_irq[i] = intno;
1694 sc->sc_tx_irq[i] = intno; 1694 sc->sc_tx_irq[i] = intno;
1695 error = aq_establish_intr(sc, intno++, affinity, 1695 error = aq_establish_intr(sc, intno++, affinity,
1696 aq_txrx_intr, &sc->sc_queue[i], intr_xname); 1696 aq_txrx_intr, &sc->sc_queue[i], intr_xname);
1697 if (error != 0) 1697 if (error != 0)
1698 goto fail; 1698 goto fail;
1699 } 1699 }
1700 } 1700 }
1701 1701
1702 if (linkintr) { 1702 if (linkintr) {
1703 snprintf(intr_xname, sizeof(intr_xname), "%s LINK", 1703 snprintf(intr_xname, sizeof(intr_xname), "%s LINK",
1704 device_xname(sc->sc_dev)); 1704 device_xname(sc->sc_dev));
1705 sc->sc_linkstat_irq = intno; 1705 sc->sc_linkstat_irq = intno;
1706 error = aq_establish_intr(sc, intno++, affinity, 1706 error = aq_establish_intr(sc, intno++, affinity,
1707 aq_link_intr, sc, intr_xname); 1707 aq_link_intr, sc, intr_xname);
1708 if (error != 0) 1708 if (error != 0)
1709 goto fail; 1709 goto fail;
1710 } 1710 }
1711 1711
1712 kcpuset_destroy(affinity); 1712 kcpuset_destroy(affinity);
1713 return 0; 1713 return 0;
1714 1714
1715 fail: 1715 fail:
1716 for (i = 0; i < AQ_NINTR_MAX; i++) { 1716 for (i = 0; i < AQ_NINTR_MAX; i++) {
1717 if (sc->sc_ihs[i] != NULL) { 1717 if (sc->sc_ihs[i] != NULL) {
1718 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]); 1718 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]);
1719 sc->sc_ihs[i] = NULL; 1719 sc->sc_ihs[i] = NULL;
1720 } 1720 }
1721 } 1721 }
1722 1722
1723 kcpuset_destroy(affinity); 1723 kcpuset_destroy(affinity);
1724 return ENOMEM; 1724 return ENOMEM;
1725} 1725}
1726 1726
1727static int 1727static int
1728aq_setup_msix(struct aq_softc *sc, struct pci_attach_args *pa, int nqueue, 1728aq_setup_msix(struct aq_softc *sc, struct pci_attach_args *pa, int nqueue,
1729 bool txrx_independent, bool linkintr) 1729 bool txrx_independent, bool linkintr)
1730{ 1730{
1731 int error, nintr; 1731 int error, nintr;
1732 1732
1733 if (txrx_independent) 1733 if (txrx_independent)
1734 nintr = nqueue * 2; 1734 nintr = nqueue * 2;
1735 else 1735 else
1736 nintr = nqueue; 1736 nintr = nqueue;
1737 1737
1738 if (linkintr) 1738 if (linkintr)
1739 nintr++; 1739 nintr++;
1740 1740
1741 error = pci_msix_alloc_exact(pa, &sc->sc_intrs, nintr); 1741 error = pci_msix_alloc_exact(pa, &sc->sc_intrs, nintr);
1742 if (error != 0) { 1742 if (error != 0) {
1743 aprint_error_dev(sc->sc_dev, 1743 aprint_error_dev(sc->sc_dev,
1744 "failed to allocate MSI-X interrupts\n"); 1744 "failed to allocate MSI-X interrupts\n");
1745 goto fail; 1745 goto fail;
1746 } 1746 }
1747 1747
1748 error = aq_establish_msix_intr(sc, txrx_independent, linkintr); 1748 error = aq_establish_msix_intr(sc, txrx_independent, linkintr);
1749 if (error == 0) { 1749 if (error == 0) {
1750 sc->sc_nintrs = nintr; 1750 sc->sc_nintrs = nintr;
1751 } else { 1751 } else {
1752 pci_intr_release(sc->sc_pc, sc->sc_intrs, nintr); 1752 pci_intr_release(sc->sc_pc, sc->sc_intrs, nintr);
1753 sc->sc_nintrs = 0; 1753 sc->sc_nintrs = 0;
1754 } 1754 }
1755 fail: 1755 fail:
1756 return error; 1756 return error;
1757 1757
1758} 1758}
1759 1759
1760static int 1760static int
1761aq_setup_legacy(struct aq_softc *sc, struct pci_attach_args *pa, 1761aq_setup_legacy(struct aq_softc *sc, struct pci_attach_args *pa,
1762 pci_intr_type_t inttype) 1762 pci_intr_type_t inttype)
1763{ 1763{
1764 int counts[PCI_INTR_TYPE_SIZE]; 1764 int counts[PCI_INTR_TYPE_SIZE];
1765 int error, nintr; 1765 int error, nintr;
1766 1766
1767 nintr = 1; 1767 nintr = 1;
1768 1768
1769 memset(counts, 0, sizeof(counts)); 1769 memset(counts, 0, sizeof(counts));
1770 counts[inttype] = nintr; 1770 counts[inttype] = nintr;
1771 1771
1772 error = pci_intr_alloc(pa, &sc->sc_intrs, counts, inttype); 1772 error = pci_intr_alloc(pa, &sc->sc_intrs, counts, inttype);
1773 if (error != 0) { 1773 if (error != 0) {
1774 aprint_error_dev(sc->sc_dev, 1774 aprint_error_dev(sc->sc_dev,
1775 "failed to allocate%s interrupts\n", 1775 "failed to allocate%s interrupts\n",
1776 (inttype == PCI_INTR_TYPE_MSI) ? " MSI" : ""); 1776 (inttype == PCI_INTR_TYPE_MSI) ? " MSI" : "");
1777 return error; 1777 return error;
1778 } 1778 }
1779 error = aq_establish_intr(sc, 0, NULL, aq_legacy_intr, sc, 1779 error = aq_establish_intr(sc, 0, NULL, aq_legacy_intr, sc,
1780 device_xname(sc->sc_dev)); 1780 device_xname(sc->sc_dev));
1781 if (error == 0) { 1781 if (error == 0) {
1782 sc->sc_nintrs = nintr; 1782 sc->sc_nintrs = nintr;
1783 } else { 1783 } else {
1784 pci_intr_release(sc->sc_pc, sc->sc_intrs, nintr); 1784 pci_intr_release(sc->sc_pc, sc->sc_intrs, nintr);
1785 sc->sc_nintrs = 0; 1785 sc->sc_nintrs = 0;
1786 } 1786 }
1787 return error; 1787 return error;
1788} 1788}
1789 1789
1790static void 1790static void
1791global_software_reset(struct aq_softc *sc) 1791global_software_reset(struct aq_softc *sc)
1792{ 1792{
1793 uint32_t v; 1793 uint32_t v;
1794 1794
1795 AQ_WRITE_REG_BIT(sc, RX_SYSCONTROL_REG, RX_SYSCONTROL_RESET_DIS, 0); 1795 AQ_WRITE_REG_BIT(sc, RX_SYSCONTROL_REG, RX_SYSCONTROL_RESET_DIS, 0);
1796 AQ_WRITE_REG_BIT(sc, TX_SYSCONTROL_REG, TX_SYSCONTROL_RESET_DIS, 0); 1796 AQ_WRITE_REG_BIT(sc, TX_SYSCONTROL_REG, TX_SYSCONTROL_RESET_DIS, 0);
1797 AQ_WRITE_REG_BIT(sc, FW_MPI_RESETCTRL_REG, 1797 AQ_WRITE_REG_BIT(sc, FW_MPI_RESETCTRL_REG,
1798 FW_MPI_RESETCTRL_RESET_DIS, 0); 1798 FW_MPI_RESETCTRL_RESET_DIS, 0);
1799 1799
1800 v = AQ_READ_REG(sc, AQ_FW_SOFTRESET_REG); 1800 v = AQ_READ_REG(sc, AQ_FW_SOFTRESET_REG);
1801 v &= ~AQ_FW_SOFTRESET_DIS; 1801 v &= ~AQ_FW_SOFTRESET_DIS;
1802 v |= AQ_FW_SOFTRESET_RESET; 1802 v |= AQ_FW_SOFTRESET_RESET;
1803 AQ_WRITE_REG(sc, AQ_FW_SOFTRESET_REG, v); 1803 AQ_WRITE_REG(sc, AQ_FW_SOFTRESET_REG, v);
1804} 1804}
1805 1805
1806static int 1806static int
1807mac_soft_reset_rbl(struct aq_softc *sc, aq_fw_bootloader_mode_t *mode) 1807mac_soft_reset_rbl(struct aq_softc *sc, aq_fw_bootloader_mode_t *mode)
1808{ 1808{
1809 int timo; 1809 int timo;
1810 1810
1811 aprint_debug_dev(sc->sc_dev, "RBL> MAC reset STARTED!\n"); 1811 aprint_debug_dev(sc->sc_dev, "RBL> MAC reset STARTED!\n");
1812 1812
1813 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e1); 1813 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e1);
1814 AQ_WRITE_REG(sc, AQ_FW_GLB_CPU_SEM_REG(0), 1); 1814 AQ_WRITE_REG(sc, AQ_FW_GLB_CPU_SEM_REG(0), 1);
1815 AQ_WRITE_REG(sc, AQ_MBOXIF_POWER_GATING_CONTROL_REG, 0); 1815 AQ_WRITE_REG(sc, AQ_MBOXIF_POWER_GATING_CONTROL_REG, 0);
1816 1816
1817 /* MAC FW will reload PHY FW if 1E.1000.3 was cleaned - #undone */ 1817 /* MAC FW will reload PHY FW if 1E.1000.3 was cleaned - #undone */
1818 AQ_WRITE_REG(sc, FW_BOOT_EXIT_CODE_REG, RBL_STATUS_DEAD); 1818 AQ_WRITE_REG(sc, FW_BOOT_EXIT_CODE_REG, RBL_STATUS_DEAD);
1819 1819
1820 global_software_reset(sc); 1820 global_software_reset(sc);
1821 1821
1822 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e0); 1822 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e0);
1823 1823
1824 /* Wait for RBL to finish boot process. */ 1824 /* Wait for RBL to finish boot process. */
1825#define RBL_TIMEOUT_MS 10000 1825#define RBL_TIMEOUT_MS 10000
1826 uint16_t rbl_status; 1826 uint16_t rbl_status;
1827 for (timo = RBL_TIMEOUT_MS; timo > 0; timo--) { 1827 for (timo = RBL_TIMEOUT_MS; timo > 0; timo--) {
1828 rbl_status = AQ_READ_REG(sc, FW_BOOT_EXIT_CODE_REG) & 0xffff; 1828 rbl_status = AQ_READ_REG(sc, FW_BOOT_EXIT_CODE_REG) & 0xffff;
1829 if (rbl_status != 0 && rbl_status != RBL_STATUS_DEAD) 1829 if (rbl_status != 0 && rbl_status != RBL_STATUS_DEAD)
1830 break; 1830 break;
1831 msec_delay(1); 1831 msec_delay(1);
1832 } 1832 }
1833 if (timo <= 0) { 1833 if (timo <= 0) {
1834 aprint_error_dev(sc->sc_dev, 1834 aprint_error_dev(sc->sc_dev,
1835 "RBL> RBL restart failed: timeout\n"); 1835 "RBL> RBL restart failed: timeout\n");
1836 return EBUSY; 1836 return EBUSY;
1837 } 1837 }
1838 switch (rbl_status) { 1838 switch (rbl_status) {
1839 case RBL_STATUS_SUCCESS: 1839 case RBL_STATUS_SUCCESS:
1840 if (mode != NULL) 1840 if (mode != NULL)
1841 *mode = FW_BOOT_MODE_RBL_FLASH; 1841 *mode = FW_BOOT_MODE_RBL_FLASH;
1842 aprint_debug_dev(sc->sc_dev, "RBL> reset complete! [Flash]\n"); 1842 aprint_debug_dev(sc->sc_dev, "RBL> reset complete! [Flash]\n");
1843 break; 1843 break;
1844 case RBL_STATUS_HOST_BOOT: 1844 case RBL_STATUS_HOST_BOOT:
1845 if (mode != NULL) 1845 if (mode != NULL)
1846 *mode = FW_BOOT_MODE_RBL_HOST_BOOTLOAD; 1846 *mode = FW_BOOT_MODE_RBL_HOST_BOOTLOAD;
1847 aprint_debug_dev(sc->sc_dev, 1847 aprint_debug_dev(sc->sc_dev,
1848 "RBL> reset complete! [Host Bootload]\n"); 1848 "RBL> reset complete! [Host Bootload]\n");
1849 break; 1849 break;
1850 case RBL_STATUS_FAILURE: 1850 case RBL_STATUS_FAILURE:
1851 default: 1851 default:
1852 aprint_error_dev(sc->sc_dev, 1852 aprint_error_dev(sc->sc_dev,
1853 "unknown RBL status 0x%x\n", rbl_status); 1853 "unknown RBL status 0x%x\n", rbl_status);
1854 return EBUSY; 1854 return EBUSY;
1855 } 1855 }
1856 1856
1857 return 0; 1857 return 0;
1858} 1858}
1859 1859
1860static int 1860static int
1861mac_soft_reset_flb(struct aq_softc *sc) 1861mac_soft_reset_flb(struct aq_softc *sc)
1862{ 1862{
1863 uint32_t v; 1863 uint32_t v;
1864 int timo; 1864 int timo;
1865 1865
1866 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e1); 1866 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e1);
1867 /* 1867 /*
1868 * Let Felicity hardware to complete SMBUS transaction before 1868 * Let Felicity hardware to complete SMBUS transaction before
1869 * Global software reset. 1869 * Global software reset.
1870 */ 1870 */
1871 msec_delay(50); 1871 msec_delay(50);
1872 1872
1873 /* 1873 /*
1874 * If SPI burst transaction was interrupted(before running the script), 1874 * If SPI burst transaction was interrupted(before running the script),
1875 * global software reset may not clear SPI interface. 1875 * global software reset may not clear SPI interface.
1876 * Clean it up manually before global reset. 1876 * Clean it up manually before global reset.
1877 */ 1877 */
1878 AQ_WRITE_REG(sc, AQ_GLB_NVR_PROVISIONING2_REG, 0x00a0); 1878 AQ_WRITE_REG(sc, AQ_GLB_NVR_PROVISIONING2_REG, 0x00a0);
1879 AQ_WRITE_REG(sc, AQ_GLB_NVR_INTERFACE1_REG, 0x009f); 1879 AQ_WRITE_REG(sc, AQ_GLB_NVR_INTERFACE1_REG, 0x009f);
1880 AQ_WRITE_REG(sc, AQ_GLB_NVR_INTERFACE1_REG, 0x809f); 1880 AQ_WRITE_REG(sc, AQ_GLB_NVR_INTERFACE1_REG, 0x809f);
1881 msec_delay(50); 1881 msec_delay(50);
1882 1882
1883 v = AQ_READ_REG(sc, AQ_FW_SOFTRESET_REG); 1883 v = AQ_READ_REG(sc, AQ_FW_SOFTRESET_REG);
1884 v &= ~AQ_FW_SOFTRESET_DIS; 1884 v &= ~AQ_FW_SOFTRESET_DIS;
1885 v |= AQ_FW_SOFTRESET_RESET; 1885 v |= AQ_FW_SOFTRESET_RESET;
1886 AQ_WRITE_REG(sc, AQ_FW_SOFTRESET_REG, v); 1886 AQ_WRITE_REG(sc, AQ_FW_SOFTRESET_REG, v);
1887 1887
1888 /* Kickstart. */ 1888 /* Kickstart. */
1889 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x80e0); 1889 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x80e0);
1890 AQ_WRITE_REG(sc, AQ_MBOXIF_POWER_GATING_CONTROL_REG, 0); 1890 AQ_WRITE_REG(sc, AQ_MBOXIF_POWER_GATING_CONTROL_REG, 0);
1891 if (!sc->sc_fast_start_enabled) 1891 if (!sc->sc_fast_start_enabled)
1892 AQ_WRITE_REG(sc, AQ_GLB_GENERAL_PROVISIONING9_REG, 1); 1892 AQ_WRITE_REG(sc, AQ_GLB_GENERAL_PROVISIONING9_REG, 1);
1893 1893
1894 /* 1894 /*
1895 * For the case SPI burst transaction was interrupted (by MCP reset 1895 * For the case SPI burst transaction was interrupted (by MCP reset
1896 * above), wait until it is completed by hardware. 1896 * above), wait until it is completed by hardware.
1897 */ 1897 */
1898 msec_delay(50); 1898 msec_delay(50);
1899 1899
1900 /* MAC Kickstart */ 1900 /* MAC Kickstart */
1901 if (!sc->sc_fast_start_enabled) { 1901 if (!sc->sc_fast_start_enabled) {
1902 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x180e0); 1902 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x180e0);
1903 1903
1904 uint32_t flb_status; 1904 uint32_t flb_status;
1905 for (timo = 0; timo < 1000; timo++) { 1905 for (timo = 0; timo < 1000; timo++) {
1906 flb_status = AQ_READ_REG(sc, 1906 flb_status = AQ_READ_REG(sc,
1907 FW_MPI_DAISY_CHAIN_STATUS_REG) & 0x10; 1907 FW_MPI_DAISY_CHAIN_STATUS_REG) & 0x10;
1908 if (flb_status != 0) 1908 if (flb_status != 0)
1909 break; 1909 break;
1910 msec_delay(1); 1910 msec_delay(1);
1911 } 1911 }
1912 if (flb_status == 0) { 1912 if (flb_status == 0) {
1913 aprint_error_dev(sc->sc_dev, 1913 aprint_error_dev(sc->sc_dev,
1914 "FLB> MAC kickstart failed: timed out\n"); 1914 "FLB> MAC kickstart failed: timed out\n");
1915 return ETIMEDOUT; 1915 return ETIMEDOUT;
1916 } 1916 }
1917 aprint_debug_dev(sc->sc_dev, 1917 aprint_debug_dev(sc->sc_dev,
1918 "FLB> MAC kickstart done, %d ms\n", timo); 1918 "FLB> MAC kickstart done, %d ms\n", timo);
1919 /* FW reset */ 1919 /* FW reset */
1920 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x80e0); 1920 AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x80e0);
1921 /* 1921 /*
1922 * Let Felicity hardware complete SMBUS transaction before 1922 * Let Felicity hardware complete SMBUS transaction before
1923 * Global software reset. 1923 * Global software reset.
1924 */ 1924 */
1925 msec_delay(50); 1925 msec_delay(50);
1926 sc->sc_fast_start_enabled = true; 1926 sc->sc_fast_start_enabled = true;
1927 } 1927 }
1928 AQ_WRITE_REG(sc, AQ_FW_GLB_CPU_SEM_REG(0), 1); 1928 AQ_WRITE_REG(sc, AQ_FW_GLB_CPU_SEM_REG(0), 1);
1929 1929
1930 /* PHY Kickstart: #undone */ 1930 /* PHY Kickstart: #undone */
1931 global_software_reset(sc); 1931 global_software_reset(sc);
1932 1932
1933 for (timo = 0; timo < 1000; timo++) { 1933 for (timo = 0; timo < 1000; timo++) {
1934 if (AQ_READ_REG(sc, AQ_FW_VERSION_REG) != 0) 1934 if (AQ_READ_REG(sc, AQ_FW_VERSION_REG) != 0)
1935 break; 1935 break;
1936 msec_delay(10); 1936 msec_delay(10);
1937 } 1937 }
1938 if (timo >= 1000) { 1938 if (timo >= 1000) {
1939 aprint_error_dev(sc->sc_dev, "FLB> Global Soft Reset failed\n"); 1939 aprint_error_dev(sc->sc_dev, "FLB> Global Soft Reset failed\n");
1940 return ETIMEDOUT; 1940 return ETIMEDOUT;
1941 } 1941 }
1942 aprint_debug_dev(sc->sc_dev, "FLB> F/W restart: %d ms\n", timo * 10); 1942 aprint_debug_dev(sc->sc_dev, "FLB> F/W restart: %d ms\n", timo * 10);
1943 return 0; 1943 return 0;
1944 1944
1945} 1945}
1946 1946
1947static int 1947static int
1948mac_soft_reset(struct aq_softc *sc, aq_fw_bootloader_mode_t *mode) 1948mac_soft_reset(struct aq_softc *sc, aq_fw_bootloader_mode_t *mode)
1949{ 1949{
1950 if (sc->sc_rbl_enabled) 1950 if (sc->sc_rbl_enabled)
1951 return mac_soft_reset_rbl(sc, mode); 1951 return mac_soft_reset_rbl(sc, mode);
1952 1952
1953 if (mode != NULL) 1953 if (mode != NULL)
1954 *mode = FW_BOOT_MODE_FLB; 1954 *mode = FW_BOOT_MODE_FLB;
1955 return mac_soft_reset_flb(sc); 1955 return mac_soft_reset_flb(sc);
1956} 1956}
1957 1957
1958static int 1958static int
1959aq_fw_read_version(struct aq_softc *sc) 1959aq_fw_read_version(struct aq_softc *sc)
1960{ 1960{
1961 int i, error = EBUSY; 1961 int i, error = EBUSY;
1962#define MAC_FW_START_TIMEOUT_MS 10000 1962#define MAC_FW_START_TIMEOUT_MS 10000
1963 for (i = 0; i < MAC_FW_START_TIMEOUT_MS; i++) { 1963 for (i = 0; i < MAC_FW_START_TIMEOUT_MS; i++) {
1964 sc->sc_fw_version = AQ_READ_REG(sc, AQ_FW_VERSION_REG); 1964 sc->sc_fw_version = AQ_READ_REG(sc, AQ_FW_VERSION_REG);
1965 if (sc->sc_fw_version != 0) { 1965 if (sc->sc_fw_version != 0) {
1966 error = 0; 1966 error = 0;
1967 break; 1967 break;
1968 } 1968 }
1969 delay(1000); 1969 delay(1000);
1970 } 1970 }
1971 return error; 1971 return error;
1972} 1972}
1973 1973
1974static int 1974static int
1975aq_fw_reset(struct aq_softc *sc) 1975aq_fw_reset(struct aq_softc *sc)
1976{ 1976{
1977 uint32_t ver, v, bootExitCode; 1977 uint32_t ver, v, bootExitCode;
1978 int i, error; 1978 int i, error;
1979 1979
1980 ver = AQ_READ_REG(sc, AQ_FW_VERSION_REG); 1980 ver = AQ_READ_REG(sc, AQ_FW_VERSION_REG);
1981 1981
1982 for (i = 1000; i > 0; i--) { 1982 for (i = 1000; i > 0; i--) {
1983 v = AQ_READ_REG(sc, FW_MPI_DAISY_CHAIN_STATUS_REG); 1983 v = AQ_READ_REG(sc, FW_MPI_DAISY_CHAIN_STATUS_REG);
1984 bootExitCode = AQ_READ_REG(sc, FW_BOOT_EXIT_CODE_REG); 1984 bootExitCode = AQ_READ_REG(sc, FW_BOOT_EXIT_CODE_REG);
1985 if (v != 0x06000000 || bootExitCode != 0) 1985 if (v != 0x06000000 || bootExitCode != 0)
1986 break; 1986 break;
1987 } 1987 }
1988 if (i <= 0) { 1988 if (i <= 0) {
1989 aprint_error_dev(sc->sc_dev, 1989 aprint_error_dev(sc->sc_dev,
1990 "F/W reset failed. Neither RBL nor FLB started\n"); 1990 "F/W reset failed. Neither RBL nor FLB started\n");
1991 return ETIMEDOUT; 1991 return ETIMEDOUT;
1992 } 1992 }
1993 sc->sc_rbl_enabled = (bootExitCode != 0); 1993 sc->sc_rbl_enabled = (bootExitCode != 0);
1994 1994
1995 /* 1995 /*
1996 * Having FW version 0 is an indicator that cold start 1996 * Having FW version 0 is an indicator that cold start
1997 * is in progress. This means two things: 1997 * is in progress. This means two things:
1998 * 1) Driver have to wait for FW/HW to finish boot (500ms giveup) 1998 * 1) Driver have to wait for FW/HW to finish boot (500ms giveup)
1999 * 2) Driver may skip reset sequence and save time. 1999 * 2) Driver may skip reset sequence and save time.
2000 */ 2000 */
2001 if (sc->sc_fast_start_enabled && (ver != 0)) { 2001 if (sc->sc_fast_start_enabled && (ver != 0)) {
2002 error = aq_fw_read_version(sc); 2002 error = aq_fw_read_version(sc);
2003 /* Skip reset as it just completed */ 2003 /* Skip reset as it just completed */
2004 if (error == 0) 2004 if (error == 0)
2005 return 0; 2005 return 0;
2006 } 2006 }
2007 2007
2008 aq_fw_bootloader_mode_t mode = FW_BOOT_MODE_UNKNOWN; 2008 aq_fw_bootloader_mode_t mode = FW_BOOT_MODE_UNKNOWN;
2009 error = mac_soft_reset(sc, &mode); 2009 error = mac_soft_reset(sc, &mode);
2010 if (error != 0) { 2010 if (error != 0) {
2011 aprint_error_dev(sc->sc_dev, "MAC reset failed: %d\n", error); 2011 aprint_error_dev(sc->sc_dev, "MAC reset failed: %d\n", error);
2012 return error; 2012 return error;
2013 } 2013 }
2014 2014
2015 switch (mode) { 2015 switch (mode) {
2016 case FW_BOOT_MODE_FLB: 2016 case FW_BOOT_MODE_FLB:
2017 aprint_debug_dev(sc->sc_dev, 2017 aprint_debug_dev(sc->sc_dev,
2018 "FLB> F/W successfully loaded from flash.\n"); 2018 "FLB> F/W successfully loaded from flash.\n");
2019 sc->sc_flash_present = true; 2019 sc->sc_flash_present = true;
2020 return aq_fw_read_version(sc); 2020 return aq_fw_read_version(sc);
2021 case FW_BOOT_MODE_RBL_FLASH: 2021 case FW_BOOT_MODE_RBL_FLASH:
2022 aprint_debug_dev(sc->sc_dev, 2022 aprint_debug_dev(sc->sc_dev,
2023 "RBL> F/W loaded from flash. Host Bootload disabled.\n"); 2023 "RBL> F/W loaded from flash. Host Bootload disabled.\n");
2024 sc->sc_flash_present = true; 2024 sc->sc_flash_present = true;
2025 return aq_fw_read_version(sc); 2025 return aq_fw_read_version(sc);
2026 case FW_BOOT_MODE_UNKNOWN: 2026 case FW_BOOT_MODE_UNKNOWN:
2027 aprint_error_dev(sc->sc_dev, 2027 aprint_error_dev(sc->sc_dev,
2028 "F/W bootload error: unknown bootloader type\n"); 2028 "F/W bootload error: unknown bootloader type\n");
2029 return ENOTSUP; 2029 return ENOTSUP;
2030 case FW_BOOT_MODE_RBL_HOST_BOOTLOAD: 2030 case FW_BOOT_MODE_RBL_HOST_BOOTLOAD:
2031 aprint_debug_dev(sc->sc_dev, "RBL> Host Bootload mode\n"); 2031 aprint_debug_dev(sc->sc_dev, "RBL> Host Bootload mode\n");
2032 break; 2032 break;
2033 } 2033 }
2034 2034
2035 /* 2035 /*
2036 * XXX: TODO: add support Host Boot 2036 * XXX: TODO: add support Host Boot
2037 */ 2037 */
2038 aprint_error_dev(sc->sc_dev, 2038 aprint_error_dev(sc->sc_dev,
2039 "RBL> F/W Host Bootload not implemented\n"); 2039 "RBL> F/W Host Bootload not implemented\n");
2040 return ENOTSUP; 2040 return ENOTSUP;
2041} 2041}
2042 2042
2043static int 2043static int
2044aq_hw_reset(struct aq_softc *sc) 2044aq_hw_reset(struct aq_softc *sc)
2045{ 2045{
2046 int error; 2046 int error;
2047 2047
2048 /* disable irq */ 2048 /* disable irq */
2049 AQ_WRITE_REG_BIT(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_RESET_DIS, 0); 2049 AQ_WRITE_REG_BIT(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_RESET_DIS, 0);
2050 2050
2051 /* apply */ 2051 /* apply */
2052 AQ_WRITE_REG_BIT(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_RESET_IRQ, 1); 2052 AQ_WRITE_REG_BIT(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_RESET_IRQ, 1);
2053 2053
2054 /* wait ack 10 times by 1ms */ 2054 /* wait ack 10 times by 1ms */
2055 WAIT_FOR( 2055 WAIT_FOR(
2056 (AQ_READ_REG(sc, AQ_INTR_CTRL_REG) & AQ_INTR_CTRL_RESET_IRQ) == 0, 2056 (AQ_READ_REG(sc, AQ_INTR_CTRL_REG) & AQ_INTR_CTRL_RESET_IRQ) == 0,
2057 1000, 10, &error); 2057 1000, 10, &error);
2058 if (error != 0) { 2058 if (error != 0) {
2059 aprint_error_dev(sc->sc_dev, 2059 aprint_error_dev(sc->sc_dev,
2060 "atlantic: IRQ reset failed: %d\n", error); 2060 "atlantic: IRQ reset failed: %d\n", error);
2061 return error; 2061 return error;
2062 } 2062 }
2063 2063
2064 return sc->sc_fw_ops->reset(sc); 2064 return sc->sc_fw_ops->reset(sc);
2065} 2065}
2066 2066
2067static int 2067static int
2068aq_hw_init_ucp(struct aq_softc *sc) 2068aq_hw_init_ucp(struct aq_softc *sc)
2069{ 2069{
2070 int timo; 2070 int timo;
2071 2071
2072 if (FW_VERSION_MAJOR(sc) == 1) { 2072 if (FW_VERSION_MAJOR(sc) == 1) {
2073 if (AQ_READ_REG(sc, FW1X_MPI_INIT2_REG) == 0) { 2073 if (AQ_READ_REG(sc, FW1X_MPI_INIT2_REG) == 0) {
2074 uint32_t data; 2074 uint32_t data;
2075 cprng_fast(&data, sizeof(data)); 2075 cprng_fast(&data, sizeof(data));
2076 data &= 0xfefefefe; 2076 data &= 0xfefefefe;
2077 data |= 0x02020202; 2077 data |= 0x02020202;
2078 AQ_WRITE_REG(sc, FW1X_MPI_INIT2_REG, data); 2078 AQ_WRITE_REG(sc, FW1X_MPI_INIT2_REG, data);
2079 } 2079 }
2080 AQ_WRITE_REG(sc, FW1X_MPI_INIT1_REG, 0); 2080 AQ_WRITE_REG(sc, FW1X_MPI_INIT1_REG, 0);
2081 } 2081 }
2082 2082
2083 for (timo = 100; timo > 0; timo--) { 2083 for (timo = 100; timo > 0; timo--) {
2084 sc->sc_mbox_addr = AQ_READ_REG(sc, FW_MPI_MBOX_ADDR_REG); 2084 sc->sc_mbox_addr = AQ_READ_REG(sc, FW_MPI_MBOX_ADDR_REG);
2085 if (sc->sc_mbox_addr != 0) 2085 if (sc->sc_mbox_addr != 0)
2086 break; 2086 break;
2087 delay(1000); 2087 delay(1000);
2088 } 2088 }
2089 2089
2090#define AQ_FW_MIN_VERSION 0x01050006 2090#define AQ_FW_MIN_VERSION 0x01050006
2091#define AQ_FW_MIN_VERSION_STR "1.5.6" 2091#define AQ_FW_MIN_VERSION_STR "1.5.6"
2092 if (sc->sc_fw_version < AQ_FW_MIN_VERSION) { 2092 if (sc->sc_fw_version < AQ_FW_MIN_VERSION) {
2093 aprint_error_dev(sc->sc_dev, 2093 aprint_error_dev(sc->sc_dev,
2094 "atlantic: wrong FW version: " AQ_FW_MIN_VERSION_STR 2094 "atlantic: wrong FW version: " AQ_FW_MIN_VERSION_STR
2095 " or later required, this is %d.%d.%d\n", 2095 " or later required, this is %d.%d.%d\n",
2096 FW_VERSION_MAJOR(sc), 2096 FW_VERSION_MAJOR(sc),
2097 FW_VERSION_MINOR(sc), 2097 FW_VERSION_MINOR(sc),
2098 FW_VERSION_BUILD(sc)); 2098 FW_VERSION_BUILD(sc));
2099 return ENOTSUP; 2099 return ENOTSUP;
2100 } 2100 }
2101 2101
2102 return 0; 2102 return 0;
2103} 2103}
2104 2104
2105static int 2105static int
2106aq_fw_version_init(struct aq_softc *sc) 2106aq_fw_version_init(struct aq_softc *sc)
2107{ 2107{
2108 int error = 0; 2108 int error = 0;
2109 char fw_vers[sizeof("F/W version xxxxx.xxxxx.xxxxx")]; 2109 char fw_vers[sizeof("F/W version xxxxx.xxxxx.xxxxx")];
2110 2110
2111 if (FW_VERSION_MAJOR(sc) == 1) { 2111 if (FW_VERSION_MAJOR(sc) == 1) {
2112 sc->sc_fw_ops = &aq_fw1x_ops; 2112 sc->sc_fw_ops = &aq_fw1x_ops;
2113 } else if ((FW_VERSION_MAJOR(sc) == 2) || (FW_VERSION_MAJOR(sc) == 3)) { 2113 } else if ((FW_VERSION_MAJOR(sc) == 2) || (FW_VERSION_MAJOR(sc) == 3)) {
2114 sc->sc_fw_ops = &aq_fw2x_ops; 2114 sc->sc_fw_ops = &aq_fw2x_ops;
2115 } else { 2115 } else {
2116 aprint_error_dev(sc->sc_dev, 2116 aprint_error_dev(sc->sc_dev,
2117 "Unsupported F/W version %d.%d.%d\n", 2117 "Unsupported F/W version %d.%d.%d\n",
2118 FW_VERSION_MAJOR(sc), FW_VERSION_MINOR(sc), 2118 FW_VERSION_MAJOR(sc), FW_VERSION_MINOR(sc),
2119 FW_VERSION_BUILD(sc)); 2119 FW_VERSION_BUILD(sc));
2120 return ENOTSUP; 2120 return ENOTSUP;
2121 } 2121 }
2122 snprintf(fw_vers, sizeof(fw_vers), "F/W version %d.%d.%d", 2122 snprintf(fw_vers, sizeof(fw_vers), "F/W version %d.%d.%d",
2123 FW_VERSION_MAJOR(sc), FW_VERSION_MINOR(sc), FW_VERSION_BUILD(sc)); 2123 FW_VERSION_MAJOR(sc), FW_VERSION_MINOR(sc), FW_VERSION_BUILD(sc));
2124 2124
2125 /* detect revision */ 2125 /* detect revision */
2126 uint32_t hwrev = AQ_READ_REG(sc, AQ_HW_REVISION_REG); 2126 uint32_t hwrev = AQ_READ_REG(sc, AQ_HW_REVISION_REG);
2127 switch (hwrev & 0x0000000f) { 2127 switch (hwrev & 0x0000000f) {
2128 case 0x01: 2128 case 0x01:
2129 aprint_normal_dev(sc->sc_dev, "Atlantic revision A0, %s\n", 2129 aprint_normal_dev(sc->sc_dev, "Atlantic revision A0, %s\n",
2130 fw_vers); 2130 fw_vers);
2131 sc->sc_features |= FEATURES_REV_A0 | 2131 sc->sc_features |= FEATURES_REV_A0 |
2132 FEATURES_MPI_AQ | FEATURES_MIPS; 2132 FEATURES_MPI_AQ | FEATURES_MIPS;
2133 break; 2133 break;
2134 case 0x02: 2134 case 0x02:
2135 aprint_normal_dev(sc->sc_dev, "Atlantic revision B0, %s\n", 2135 aprint_normal_dev(sc->sc_dev, "Atlantic revision B0, %s\n",
2136 fw_vers); 2136 fw_vers);