1 1.50 andvar /* $NetBSD: if_aq.c,v 1.50 2025/02/26 04:49:46 andvar Exp $ */ 2 1.1 ryo 3 1.1 ryo /** 4 1.1 ryo * aQuantia Corporation Network Driver 5 1.1 ryo * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved 6 1.1 ryo * 7 1.1 ryo * Redistribution and use in source and binary forms, with or without 8 1.1 ryo * modification, are permitted provided that the following conditions 9 1.1 ryo * are met: 10 1.1 ryo * 11 1.1 ryo * (1) Redistributions of source code must retain the above 12 1.1 ryo * copyright notice, this list of conditions and the following 13 1.1 ryo * disclaimer. 14 1.1 ryo * 15 1.1 ryo * (2) Redistributions in binary form must reproduce the above 16 1.1 ryo * copyright notice, this list of conditions and the following 17 1.1 ryo * disclaimer in the documentation and/or other materials provided 18 1.1 ryo * with the distribution. 19 1.1 ryo * 20 1.1 ryo * (3) The name of the author may not be used to endorse or promote 21 1.1 ryo * products derived from this software without specific prior 22 1.1 ryo * written permission. 23 1.1 ryo * 24 1.1 ryo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 25 1.1 ryo * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 26 1.1 ryo * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 1.1 ryo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 28 1.1 ryo * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 1.1 ryo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 30 1.1 ryo * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31 1.1 ryo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 32 1.1 ryo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 33 1.1 ryo * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 34 1.1 ryo * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 1.1 ryo * 36 1.1 ryo */ 37 1.1 ryo 38 1.1 ryo /*- 39 1.46 msaitoh * Copyright (c) 2020 Ryo Shimizu 40 1.1 ryo * All rights reserved. 41 1.1 ryo * 42 1.1 ryo * Redistribution and use in source and binary forms, with or without 43 1.1 ryo * modification, are permitted provided that the following conditions 44 1.1 ryo * are met: 45 1.1 ryo * 1. Redistributions of source code must retain the above copyright 46 1.1 ryo * notice, this list of conditions and the following disclaimer. 47 1.1 ryo * 2. Redistributions in binary form must reproduce the above copyright 48 1.1 ryo * notice, this list of conditions and the following disclaimer in the 49 1.1 ryo * documentation and/or other materials provided with the distribution. 50 1.1 ryo * 51 1.1 ryo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 52 1.1 ryo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 53 1.1 ryo * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 54 1.1 ryo * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 55 1.1 ryo * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 56 1.1 ryo * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 57 1.1 ryo * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 58 1.1 ryo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 59 1.1 ryo * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 60 1.1 ryo * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 61 1.1 ryo * POSSIBILITY OF SUCH DAMAGE. 62 1.1 ryo */ 63 1.1 ryo 64 1.1 ryo #include <sys/cdefs.h> 65 1.50 andvar __KERNEL_RCSID(0, "$NetBSD: if_aq.c,v 1.50 2025/02/26 04:49:46 andvar Exp $"); 66 1.1 ryo 67 1.1 ryo #ifdef _KERNEL_OPT 68 1.1 ryo #include "opt_if_aq.h" 69 1.4 ryo #include "sysmon_envsys.h" 70 1.1 ryo #endif 71 1.1 ryo 72 1.1 ryo #include <sys/param.h> 73 1.1 ryo #include <sys/types.h> 74 1.1 ryo #include <sys/bitops.h> 75 1.1 ryo #include <sys/cprng.h> 76 1.1 ryo #include <sys/cpu.h> 77 1.1 ryo #include <sys/interrupt.h> 78 1.1 ryo #include <sys/module.h> 79 1.1 ryo #include <sys/pcq.h> 80 1.1 ryo 81 1.1 ryo #include <net/bpf.h> 82 1.1 ryo #include <net/if.h> 83 1.1 ryo #include <net/if_dl.h> 84 1.1 ryo #include <net/if_media.h> 85 1.1 ryo #include <net/if_ether.h> 86 1.1 ryo #include <net/rss_config.h> 87 1.1 ryo 88 1.1 ryo #include <dev/pci/pcivar.h> 89 1.1 ryo #include <dev/pci/pcireg.h> 90 1.1 ryo #include <dev/pci/pcidevs.h> 91 1.4 ryo #include <dev/sysmon/sysmonvar.h> 92 1.1 ryo 93 1.1 ryo /* driver configuration */ 94 1.1 ryo #define CONFIG_INTR_MODERATION_ENABLE true /* delayed interrupt */ 95 1.39 andvar #undef CONFIG_LRO_SUPPORT /* no LRO not supported */ 96 1.1 ryo #undef CONFIG_NO_TXRX_INDEPENDENT /* share TX/RX interrupts */ 97 1.1 ryo 98 1.1 ryo #define AQ_NINTR_MAX (AQ_RSSQUEUE_MAX + AQ_RSSQUEUE_MAX + 1) 99 1.1 ryo /* TX + RX + LINK. must be <= 32 */ 100 1.1 ryo #define AQ_LINKSTAT_IRQ 31 /* for legacy mode */ 101 1.1 ryo 102 1.1 ryo #define AQ_TXD_NUM 2048 /* per ring. 8*n && 32~8184 */ 103 1.1 ryo #define AQ_RXD_NUM 2048 /* per ring. 8*n && 32~8184 */ 104 1.1 ryo /* minimum required to send a packet (vlan needs additional TX descriptor) */ 105 1.1 ryo #define AQ_TXD_MIN (1 + 1) 106 1.1 ryo 107 1.1 ryo 108 1.1 ryo /* hardware specification */ 109 1.1 ryo #define AQ_RINGS_NUM 32 110 1.1 ryo #define AQ_RSSQUEUE_MAX 8 111 1.1 ryo #define AQ_RX_DESCRIPTOR_MIN 32 112 1.1 ryo #define AQ_TX_DESCRIPTOR_MIN 32 113 1.1 ryo #define AQ_RX_DESCRIPTOR_MAX 8184 114 1.1 ryo #define AQ_TX_DESCRIPTOR_MAX 8184 115 1.1 ryo #define AQ_TRAFFICCLASS_NUM 8 116 1.1 ryo #define AQ_RSS_HASHKEY_SIZE 40 117 1.1 ryo #define AQ_RSS_INDIRECTION_TABLE_MAX 64 118 1.1 ryo 119 1.43 ryo #define AQ1_JUMBO_MTU_REV_A 9000 120 1.43 ryo #define AQ1_JUMBO_MTU_REV_B 16338 121 1.43 ryo #define AQ2_JUMBO_MTU 16338 122 1.23 ryo 123 1.1 ryo /* 124 1.1 ryo * TERMINOLOGY 125 1.43 ryo * ATL (AQ1) = Atlantic. AQC100,107-109,111,112. 126 1.43 ryo * ATL2 (AQ2) = Atlantic2. AQC113-116. 127 1.1 ryo * MPI = MAC PHY INTERFACE? 128 1.1 ryo * RPO = RX Protocol Offloading 129 1.1 ryo * TPO = TX Protocol Offloading 130 1.1 ryo * RPF = RX Packet Filter 131 1.1 ryo * TPB = TX Packet buffer 132 1.1 ryo * RPB = RX Packet buffer 133 1.43 ryo * ART = Action Resolver Table 134 1.43 ryo * TC = Traffic Class 135 1.1 ryo */ 136 1.1 ryo 137 1.43 ryo enum aq_hwtype { 138 1.43 ryo HWTYPE_AQ1, 139 1.43 ryo HWTYPE_AQ2 140 1.43 ryo }; 141 1.43 ryo 142 1.1 ryo /* registers */ 143 1.1 ryo #define AQ_FW_SOFTRESET_REG 0x0000 144 1.1 ryo #define AQ_FW_SOFTRESET_RESET __BIT(15) /* soft reset bit */ 145 1.1 ryo #define AQ_FW_SOFTRESET_DIS __BIT(14) /* reset disable */ 146 1.1 ryo 147 1.1 ryo #define AQ_FW_VERSION_REG 0x0018 148 1.1 ryo #define AQ_HW_REVISION_REG 0x001c 149 1.43 ryo #define AQ2_HW_FPGA_VERSION_REG 0x00f4 /* AQ2 */ 150 1.1 ryo #define AQ_GLB_NVR_INTERFACE1_REG 0x0100 151 1.1 ryo 152 1.1 ryo #define AQ_FW_MBOX_CMD_REG 0x0200 153 1.1 ryo #define AQ_FW_MBOX_CMD_EXECUTE 0x00008000 154 1.1 ryo #define AQ_FW_MBOX_CMD_BUSY 0x00000100 155 1.1 ryo #define AQ_FW_MBOX_ADDR_REG 0x0208 156 1.1 ryo #define AQ_FW_MBOX_VAL_REG 0x020c 157 1.1 ryo 158 1.1 ryo #define FW2X_LED_MIN_VERSION 0x03010026 /* >= 3.1.38 */ 159 1.1 ryo #define FW2X_LED_REG 0x031c 160 1.1 ryo #define FW2X_LED_DEFAULT 0x00000000 161 1.1 ryo #define FW2X_LED_NONE 0x0000003f 162 1.1 ryo #define FW2X_LINKLED __BITS(0,1) 163 1.1 ryo #define FW2X_LINKLED_ACTIVE 0 164 1.1 ryo #define FW2X_LINKLED_ON 1 165 1.1 ryo #define FW2X_LINKLED_BLINK 2 166 1.1 ryo #define FW2X_LINKLED_OFF 3 167 1.1 ryo #define FW2X_STATUSLED __BITS(2,5) 168 1.1 ryo #define FW2X_STATUSLED_ORANGE 0 169 1.1 ryo #define FW2X_STATUSLED_ORANGE_BLINK 2 170 1.1 ryo #define FW2X_STATUSLED_OFF 3 171 1.1 ryo #define FW2X_STATUSLED_GREEN 4 172 1.1 ryo #define FW2X_STATUSLED_ORANGE_GREEN_BLINK 8 173 1.1 ryo #define FW2X_STATUSLED_GREEN_BLINK 10 174 1.1 ryo 175 1.1 ryo #define FW_MPI_MBOX_ADDR_REG 0x0360 176 1.1 ryo #define FW1X_MPI_INIT1_REG 0x0364 177 1.1 ryo #define FW1X_MPI_CONTROL_REG 0x0368 178 1.1 ryo #define FW1X_MPI_STATE_REG 0x036c 179 1.1 ryo #define FW1X_MPI_STATE_MODE __BITS(7,0) 180 1.1 ryo #define FW1X_MPI_STATE_SPEED __BITS(32,16) 181 1.1 ryo #define FW1X_MPI_STATE_DISABLE_DIRTYWAKE __BITS(25) 182 1.1 ryo #define FW1X_MPI_STATE_DOWNSHIFT __BITS(31,28) 183 1.1 ryo #define FW1X_MPI_INIT2_REG 0x0370 184 1.1 ryo #define FW1X_MPI_EFUSEADDR_REG 0x0374 185 1.1 ryo 186 1.1 ryo #define FW2X_MPI_EFUSEADDR_REG 0x0364 187 1.1 ryo #define FW2X_MPI_CONTROL_REG 0x0368 /* 64bit */ 188 1.1 ryo #define FW2X_MPI_STATE_REG 0x0370 /* 64bit */ 189 1.1 ryo #define FW_BOOT_EXIT_CODE_REG 0x0388 190 1.1 ryo #define RBL_STATUS_DEAD 0x0000dead 191 1.1 ryo #define RBL_STATUS_SUCCESS 0x0000abba 192 1.1 ryo #define RBL_STATUS_FAILURE 0x00000bad 193 1.1 ryo #define RBL_STATUS_HOST_BOOT 0x0000f1a7 194 1.1 ryo 195 1.1 ryo #define AQ_FW_GLB_CPU_SEM_REG(i) (0x03a0 + (i) * 4) 196 1.43 ryo #define AQ1_FW_SEM_RAM_REG AQ_FW_GLB_CPU_SEM_REG(2) 197 1.43 ryo #define AQ2_ART_SEM_REG AQ_FW_GLB_CPU_SEM_REG(3) 198 1.1 ryo 199 1.1 ryo #define AQ_FW_GLB_CTL2_REG 0x0404 200 1.1 ryo #define AQ_FW_GLB_CTL2_MCP_UP_FORCE_INTERRUPT __BIT(1) 201 1.1 ryo 202 1.1 ryo #define AQ_GLB_GENERAL_PROVISIONING9_REG 0x0520 203 1.1 ryo #define AQ_GLB_NVR_PROVISIONING2_REG 0x0534 204 1.1 ryo 205 1.1 ryo #define FW_MPI_DAISY_CHAIN_STATUS_REG 0x0704 206 1.1 ryo 207 1.1 ryo #define AQ_PCI_REG_CONTROL_6_REG 0x1014 208 1.1 ryo 209 1.43 ryo /* msix bitmap */ 210 1.1 ryo #define AQ_INTR_STATUS_REG 0x2000 /* intr status */ 211 1.1 ryo #define AQ_INTR_STATUS_CLR_REG 0x2050 /* intr status clear */ 212 1.1 ryo #define AQ_INTR_MASK_REG 0x2060 /* intr mask set */ 213 1.1 ryo #define AQ_INTR_MASK_CLR_REG 0x2070 /* intr mask clear */ 214 1.1 ryo #define AQ_INTR_AUTOMASK_REG 0x2090 215 1.1 ryo 216 1.1 ryo /* AQ_INTR_IRQ_MAP_TXRX_REG[AQ_RINGS_NUM] 0x2100-0x2140 */ 217 1.1 ryo #define AQ_INTR_IRQ_MAP_TXRX_REG(i) (0x2100 + ((i) / 2) * 4) 218 1.1 ryo #define AQ_INTR_IRQ_MAP_TX_REG(i) AQ_INTR_IRQ_MAP_TXRX_REG(i) 219 1.1 ryo #define AQ_INTR_IRQ_MAP_TX_IRQMAP(i) (__BITS(28,24) >> (((i) & 1)*8)) 220 1.1 ryo #define AQ_INTR_IRQ_MAP_TX_EN(i) (__BIT(31) >> (((i) & 1)*8)) 221 1.1 ryo #define AQ_INTR_IRQ_MAP_RX_REG(i) AQ_INTR_IRQ_MAP_TXRX_REG(i) 222 1.1 ryo #define AQ_INTR_IRQ_MAP_RX_IRQMAP(i) (__BITS(12,8) >> (((i) & 1)*8)) 223 1.1 ryo #define AQ_INTR_IRQ_MAP_RX_EN(i) (__BIT(15) >> (((i) & 1)*8)) 224 1.1 ryo 225 1.1 ryo /* AQ_GEN_INTR_MAP_REG[AQ_RINGS_NUM] 0x2180-0x2200 */ 226 1.1 ryo #define AQ_GEN_INTR_MAP_REG(i) (0x2180 + (i) * 4) 227 1.43 ryo #define AQ_B0_ERR_INT 8 228 1.1 ryo 229 1.1 ryo #define AQ_INTR_CTRL_REG 0x2300 230 1.1 ryo #define AQ_INTR_CTRL_IRQMODE __BITS(1,0) 231 1.1 ryo #define AQ_INTR_CTRL_IRQMODE_LEGACY 0 232 1.1 ryo #define AQ_INTR_CTRL_IRQMODE_MSI 1 233 1.1 ryo #define AQ_INTR_CTRL_IRQMODE_MSIX 2 234 1.1 ryo #define AQ_INTR_CTRL_MULTIVEC __BIT(2) 235 1.1 ryo #define AQ_INTR_CTRL_AUTO_MASK __BIT(5) 236 1.1 ryo #define AQ_INTR_CTRL_CLR_ON_READ __BIT(7) 237 1.1 ryo #define AQ_INTR_CTRL_RESET_DIS __BIT(29) 238 1.1 ryo #define AQ_INTR_CTRL_RESET_IRQ __BIT(31) 239 1.1 ryo 240 1.1 ryo #define AQ_MBOXIF_POWER_GATING_CONTROL_REG 0x32a8 241 1.1 ryo 242 1.1 ryo #define FW_MPI_RESETCTRL_REG 0x4000 243 1.1 ryo #define FW_MPI_RESETCTRL_RESET_DIS __BIT(29) 244 1.1 ryo 245 1.1 ryo #define RX_SYSCONTROL_REG 0x5000 246 1.43 ryo #define RX_SYSCONTROL_RPF_TPO_SYS_LOOPBACK __BIT(8) 247 1.43 ryo #define RX_SYSCONTROL_RPB_DMA_SYS_LOOPBACK __BIT(6) 248 1.43 ryo #define RX_SYSCONTROL_RPB_DMA_NET_LOOPBACK __BIT(4) 249 1.1 ryo #define RX_SYSCONTROL_RESET_DIS __BIT(29) 250 1.1 ryo 251 1.1 ryo #define RX_TCP_RSS_HASH_REG 0x5040 252 1.1 ryo #define RX_TCP_RSS_HASH_RPF2 __BITS(19,16) 253 1.1 ryo #define RX_TCP_RSS_HASH_TYPE __BITS(15,0) 254 1.1 ryo 255 1.1 ryo /* for RPF_*_REG.ACTION */ 256 1.1 ryo #define RPF_ACTION_DISCARD 0 257 1.1 ryo #define RPF_ACTION_HOST 1 258 1.1 ryo #define RPF_ACTION_MANAGEMENT 2 259 1.1 ryo #define RPF_ACTION_HOST_MANAGEMENT 3 260 1.1 ryo #define RPF_ACTION_WOL 4 261 1.1 ryo 262 1.1 ryo #define RPF_L2BC_REG 0x5100 263 1.1 ryo #define RPF_L2BC_EN __BIT(0) 264 1.1 ryo #define RPF_L2BC_PROMISC __BIT(3) 265 1.1 ryo #define RPF_L2BC_ACTION __BITS(12,14) 266 1.1 ryo #define RPF_L2BC_THRESHOLD __BITS(31,16) 267 1.1 ryo 268 1.43 ryo /* RPF_L2UC_*_REG[34] (AQ2 has [38]) */ 269 1.1 ryo #define RPF_L2UC_LSW_REG(i) (0x5110 + (i) * 8) 270 1.1 ryo #define RPF_L2UC_MSW_REG(i) (0x5114 + (i) * 8) 271 1.1 ryo #define RPF_L2UC_MSW_MACADDR_HI __BITS(15,0) 272 1.1 ryo #define RPF_L2UC_MSW_ACTION __BITS(18,16) 273 1.43 ryo #define RPF_L2UC_MSW_TAG __BITS(27,22) /* AQ2 */ 274 1.1 ryo #define RPF_L2UC_MSW_EN __BIT(31) 275 1.43 ryo 276 1.43 ryo #define AQ_HW_MAC_OWN 0 /* index of own address */ 277 1.43 ryo #define AQ1_HW_MAC_NUM 34 278 1.43 ryo #define AQ2_HW_MAC_NUM 38 279 1.43 ryo #define AQ_HW_MAC_NUM(sc) \ 280 1.43 ryo (HWTYPE_AQ2_P((sc)) ? AQ2_HW_MAC_NUM : AQ1_HW_MAC_NUM) 281 1.1 ryo 282 1.9 ryo /* RPF_MCAST_FILTER_REG[8] 0x5250-0x5270 */ 283 1.1 ryo #define RPF_MCAST_FILTER_REG(i) (0x5250 + (i) * 4) 284 1.1 ryo #define RPF_MCAST_FILTER_EN __BIT(31) 285 1.1 ryo #define RPF_MCAST_FILTER_MASK_REG 0x5270 286 1.1 ryo #define RPF_MCAST_FILTER_MASK_ALLMULTI __BIT(14) 287 1.1 ryo 288 1.1 ryo #define RPF_VLAN_MODE_REG 0x5280 289 1.1 ryo #define RPF_VLAN_MODE_PROMISC __BIT(1) 290 1.1 ryo #define RPF_VLAN_MODE_ACCEPT_UNTAGGED __BIT(2) 291 1.1 ryo #define RPF_VLAN_MODE_UNTAGGED_ACTION __BITS(5,3) 292 1.1 ryo 293 1.1 ryo #define RPF_VLAN_TPID_REG 0x5284 294 1.1 ryo #define RPF_VLAN_TPID_OUTER __BITS(31,16) 295 1.1 ryo #define RPF_VLAN_TPID_INNER __BITS(15,0) 296 1.1 ryo 297 1.9 ryo /* RPF_VLAN_FILTER_REG[RPF_VLAN_MAX_FILTERS] 0x5290-0x52d0 */ 298 1.1 ryo #define RPF_VLAN_MAX_FILTERS 16 299 1.1 ryo #define RPF_VLAN_FILTER_REG(i) (0x5290 + (i) * 4) 300 1.1 ryo #define RPF_VLAN_FILTER_EN __BIT(31) 301 1.1 ryo #define RPF_VLAN_FILTER_RXQ_EN __BIT(28) 302 1.1 ryo #define RPF_VLAN_FILTER_RXQ __BITS(24,20) 303 1.1 ryo #define RPF_VLAN_FILTER_ACTION __BITS(18,16) 304 1.43 ryo #define RPF_VLAN_FILTER_TAG __BITS(15,12) /* AQ2 */ 305 1.1 ryo #define RPF_VLAN_FILTER_ID __BITS(11,0) 306 1.1 ryo 307 1.1 ryo /* RPF_ETHERTYPE_FILTER_REG[AQ_RINGS_NUM] 0x5300-0x5380 */ 308 1.1 ryo #define RPF_ETHERTYPE_FILTER_REG(i) (0x5300 + (i) * 4) 309 1.1 ryo #define RPF_ETHERTYPE_FILTER_EN __BIT(31) 310 1.1 ryo #define RPF_ETHERTYPE_FILTER_PRIO_EN __BIT(30) 311 1.1 ryo #define RPF_ETHERTYPE_FILTER_RXQF_EN __BIT(29) 312 1.1 ryo #define RPF_ETHERTYPE_FILTER_PRIO __BITS(28,26) 313 1.1 ryo #define RPF_ETHERTYPE_FILTER_RXQF __BITS(24,20) 314 1.1 ryo #define RPF_ETHERTYPE_FILTER_MNG_RXQF __BIT(19) 315 1.1 ryo #define RPF_ETHERTYPE_FILTER_ACTION __BITS(18,16) 316 1.1 ryo #define RPF_ETHERTYPE_FILTER_VAL __BITS(15,0) 317 1.1 ryo 318 1.1 ryo /* RPF_L3_FILTER_REG[8] 0x5380-0x53a0 */ 319 1.1 ryo #define RPF_L3_FILTER_REG(i) (0x5380 + (i) * 4) 320 1.1 ryo #define RPF_L3_FILTER_L4_EN __BIT(31) 321 1.1 ryo #define RPF_L3_FILTER_IPV6_EN __BIT(30) 322 1.1 ryo #define RPF_L3_FILTER_SRCADDR_EN __BIT(29) 323 1.1 ryo #define RPF_L3_FILTER_DSTADDR_EN __BIT(28) 324 1.1 ryo #define RPF_L3_FILTER_L4_SRCPORT_EN __BIT(27) 325 1.1 ryo #define RPF_L3_FILTER_L4_DSTPORT_EN __BIT(26) 326 1.1 ryo #define RPF_L3_FILTER_L4_PROTO_EN __BIT(25) 327 1.1 ryo #define RPF_L3_FILTER_ARP_EN __BIT(24) 328 1.1 ryo #define RPF_L3_FILTER_L4_RXQUEUE_EN __BIT(23) 329 1.1 ryo #define RPF_L3_FILTER_L4_RXQUEUE_MANAGEMENT_EN __BIT(22) 330 1.1 ryo #define RPF_L3_FILTER_L4_ACTION __BITS(16,18) 331 1.1 ryo #define RPF_L3_FILTER_L4_RXQUEUE __BITS(12,8) 332 1.1 ryo #define RPF_L3_FILTER_L4_PROTO __BITS(2,0) 333 1.1 ryo #define RPF_L3_FILTER_L4_PROTO_TCP 0 334 1.1 ryo #define RPF_L3_FILTER_L4_PROTO_UDP 1 335 1.1 ryo #define RPF_L3_FILTER_L4_PROTO_SCTP 2 336 1.1 ryo #define RPF_L3_FILTER_L4_PROTO_ICMP 3 337 1.1 ryo /* parameters of RPF_L3_FILTER_REG[8] */ 338 1.1 ryo #define RPF_L3_FILTER_SRCADDR_REG(i) (0x53b0 + (i) * 4) 339 1.1 ryo #define RPF_L3_FILTER_DSTADDR_REG(i) (0x53d0 + (i) * 4) 340 1.1 ryo #define RPF_L3_FILTER_L4_SRCPORT_REG(i) (0x5400 + (i) * 4) 341 1.1 ryo #define RPF_L3_FILTER_L4_DSTPORT_REG(i) (0x5420 + (i) * 4) 342 1.1 ryo 343 1.1 ryo #define RX_FLR_RSS_CONTROL1_REG 0x54c0 344 1.1 ryo #define RX_FLR_RSS_CONTROL1_EN __BIT(31) 345 1.1 ryo 346 1.1 ryo #define RPF_RPB_RX_TC_UPT_REG 0x54c4 347 1.1 ryo #define RPF_RPB_RX_TC_UPT_MASK(i) (0x00000007 << ((i) * 4)) 348 1.1 ryo 349 1.1 ryo #define RPF_RSS_KEY_ADDR_REG 0x54d0 350 1.1 ryo #define RPF_RSS_KEY_ADDR __BITS(4,0) 351 1.1 ryo #define RPF_RSS_KEY_WR_EN __BIT(5) 352 1.1 ryo #define RPF_RSS_KEY_WR_DATA_REG 0x54d4 353 1.1 ryo #define RPF_RSS_KEY_RD_DATA_REG 0x54d8 354 1.1 ryo 355 1.1 ryo #define RPF_RSS_REDIR_ADDR_REG 0x54e0 356 1.1 ryo #define RPF_RSS_REDIR_ADDR __BITS(3,0) 357 1.1 ryo #define RPF_RSS_REDIR_WR_EN __BIT(4) 358 1.1 ryo 359 1.1 ryo #define RPF_RSS_REDIR_WR_DATA_REG 0x54e4 360 1.1 ryo #define RPF_RSS_REDIR_WR_DATA __BITS(15,0) 361 1.1 ryo 362 1.1 ryo #define RPO_HWCSUM_REG 0x5580 363 1.1 ryo #define RPO_HWCSUM_IP4CSUM_EN __BIT(1) 364 1.1 ryo #define RPO_HWCSUM_L4CSUM_EN __BIT(0) /* TCP/UDP/SCTP */ 365 1.1 ryo 366 1.1 ryo #define RPO_LRO_ENABLE_REG 0x5590 367 1.1 ryo 368 1.1 ryo #define RPO_LRO_CONF_REG 0x5594 369 1.1 ryo #define RPO_LRO_CONF_QSESSION_LIMIT __BITS(13,12) 370 1.1 ryo #define RPO_LRO_CONF_TOTAL_DESC_LIMIT __BITS(6,5) 371 1.1 ryo #define RPO_LRO_CONF_PATCHOPTIMIZATION_EN __BIT(15) 372 1.1 ryo #define RPO_LRO_CONF_MIN_PAYLOAD_OF_FIRST_PKT __BITS(4,0) 373 1.1 ryo #define RPO_LRO_RSC_MAX_REG 0x5598 374 1.1 ryo 375 1.1 ryo /* RPO_LRO_LDES_MAX_REG[32/8] 0x55a0-0x55b0 */ 376 1.1 ryo #define RPO_LRO_LDES_MAX_REG(i) (0x55a0 + (i / 8) * 4) 377 1.1 ryo #define RPO_LRO_LDES_MAX_MASK(i) (0x00000003 << ((i & 7) * 4)) 378 1.1 ryo #define RPO_LRO_TB_DIV_REG 0x5620 379 1.1 ryo #define RPO_LRO_TB_DIV __BITS(20,31) 380 1.1 ryo #define RPO_LRO_INACTIVE_IVAL_REG 0x5620 381 1.1 ryo #define RPO_LRO_INACTIVE_IVAL __BITS(10,19) 382 1.1 ryo #define RPO_LRO_MAX_COALESCING_IVAL_REG 0x5620 383 1.1 ryo #define RPO_LRO_MAX_COALESCING_IVAL __BITS(9,0) 384 1.1 ryo 385 1.1 ryo #define RPB_RPF_RX_REG 0x5700 386 1.1 ryo #define RPB_RPF_RX_TC_MODE __BIT(8) 387 1.1 ryo #define RPB_RPF_RX_FC_MODE __BITS(5,4) 388 1.1 ryo #define RPB_RPF_RX_BUF_EN __BIT(0) 389 1.1 ryo 390 1.1 ryo /* RPB_RXB_BUFSIZE_REG[AQ_TRAFFICCLASS_NUM] 0x5710-0x5790 */ 391 1.1 ryo #define RPB_RXB_BUFSIZE_REG(i) (0x5710 + (i) * 0x10) 392 1.1 ryo #define RPB_RXB_BUFSIZE __BITS(8,0) 393 1.1 ryo #define RPB_RXB_XOFF_REG(i) (0x5714 + (i) * 0x10) 394 1.1 ryo #define RPB_RXB_XOFF_EN __BIT(31) 395 1.1 ryo #define RPB_RXB_XOFF_THRESH_HI __BITS(29,16) 396 1.1 ryo #define RPB_RXB_XOFF_THRESH_LO __BITS(13,0) 397 1.1 ryo 398 1.1 ryo #define RX_DMA_DESC_CACHE_INIT_REG 0x5a00 399 1.1 ryo #define RX_DMA_DESC_CACHE_INIT __BIT(0) 400 1.1 ryo 401 1.1 ryo #define RX_DMA_INT_DESC_WRWB_EN_REG 0x05a30 402 1.1 ryo #define RX_DMA_INT_DESC_WRWB_EN __BIT(2) 403 1.1 ryo #define RX_DMA_INT_DESC_MODERATE_EN __BIT(3) 404 1.1 ryo 405 1.1 ryo /* RX_INTR_MODERATION_CTL_REG[AQ_RINGS_NUM] 0x5a40-0x5ac0 */ 406 1.1 ryo #define RX_INTR_MODERATION_CTL_REG(i) (0x5a40 + (i) * 4) 407 1.1 ryo #define RX_INTR_MODERATION_CTL_EN __BIT(1) 408 1.1 ryo #define RX_INTR_MODERATION_CTL_MIN __BITS(15,8) 409 1.1 ryo #define RX_INTR_MODERATION_CTL_MAX __BITS(24,16) 410 1.1 ryo 411 1.1 ryo /* RX_DMA_DESC_*[AQ_RINGS_NUM] 0x5b00-0x5f00 */ 412 1.1 ryo #define RX_DMA_DESC_BASE_ADDRLSW_REG(i) (0x5b00 + (i) * 0x20) 413 1.1 ryo #define RX_DMA_DESC_BASE_ADDRMSW_REG(i) (0x5b04 + (i) * 0x20) 414 1.1 ryo #define RX_DMA_DESC_REG(i) (0x5b08 + (i) * 0x20) 415 1.1 ryo #define RX_DMA_DESC_LEN __BITS(12,3) /* RXD_NUM/8 */ 416 1.1 ryo #define RX_DMA_DESC_RESET __BIT(25) 417 1.1 ryo #define RX_DMA_DESC_HEADER_SPLIT __BIT(28) 418 1.1 ryo #define RX_DMA_DESC_VLAN_STRIP __BIT(29) 419 1.1 ryo #define RX_DMA_DESC_EN __BIT(31) 420 1.1 ryo #define RX_DMA_DESC_HEAD_PTR_REG(i) (0x5b0c + (i) * 0x20) 421 1.1 ryo #define RX_DMA_DESC_HEAD_PTR __BITS(12,0) 422 1.1 ryo #define RX_DMA_DESC_TAIL_PTR_REG(i) (0x5b10 + (i) * 0x20) 423 1.1 ryo #define RX_DMA_DESC_BUFSIZE_REG(i) (0x5b18 + (i) * 0x20) 424 1.1 ryo #define RX_DMA_DESC_BUFSIZE_DATA __BITS(4,0) 425 1.1 ryo #define RX_DMA_DESC_BUFSIZE_HDR __BITS(12,8) 426 1.1 ryo 427 1.1 ryo /* RX_DMA_DCAD_REG[AQ_RINGS_NUM] 0x6100-0x6180 */ 428 1.1 ryo #define RX_DMA_DCAD_REG(i) (0x6100 + (i) * 4) 429 1.1 ryo #define RX_DMA_DCAD_CPUID __BITS(7,0) 430 1.1 ryo #define RX_DMA_DCAD_PAYLOAD_EN __BIT(29) 431 1.1 ryo #define RX_DMA_DCAD_HEADER_EN __BIT(30) 432 1.1 ryo #define RX_DMA_DCAD_DESC_EN __BIT(31) 433 1.1 ryo 434 1.1 ryo #define RX_DMA_DCA_REG 0x6180 435 1.1 ryo #define RX_DMA_DCA_EN __BIT(31) 436 1.1 ryo #define RX_DMA_DCA_MODE __BITS(3,0) 437 1.1 ryo 438 1.1 ryo /* counters */ 439 1.1 ryo #define RX_DMA_GOOD_PKT_COUNTERLSW 0x6800 440 1.1 ryo #define RX_DMA_GOOD_OCTET_COUNTERLSW 0x6808 441 1.1 ryo #define RX_DMA_DROP_PKT_CNT_REG 0x6818 442 1.1 ryo #define RX_DMA_COALESCED_PKT_CNT_REG 0x6820 443 1.1 ryo 444 1.1 ryo #define TX_SYSCONTROL_REG 0x7000 445 1.43 ryo #define TX_SYSCONTROL_TPO_PKT_SYS_LOOPBACK __BIT(7) 446 1.43 ryo #define TX_SYSCONTROL_TPB_DMA_SYS_LOOPBACK __BIT(6) 447 1.43 ryo #define TX_SYSCONTROL_TPB_DMA_NET_LOOPBACK __BIT(4) 448 1.1 ryo #define TX_SYSCONTROL_RESET_DIS __BIT(29) 449 1.1 ryo 450 1.1 ryo #define TX_TPO2_REG 0x7040 451 1.1 ryo #define TX_TPO2_EN __BIT(16) 452 1.1 ryo 453 1.1 ryo #define TPS_DESC_VM_ARB_MODE_REG 0x7300 454 1.1 ryo #define TPS_DESC_VM_ARB_MODE __BIT(0) 455 1.1 ryo #define TPS_DESC_RATE_REG 0x7310 456 1.1 ryo #define TPS_DESC_RATE_TA_RST __BIT(31) 457 1.1 ryo #define TPS_DESC_RATE_LIM __BITS(10,0) 458 1.1 ryo #define TPS_DESC_TC_ARB_MODE_REG 0x7200 459 1.1 ryo #define TPS_DESC_TC_ARB_MODE __BITS(1,0) 460 1.1 ryo #define TPS_DATA_TC_ARB_MODE_REG 0x7100 461 1.1 ryo #define TPS_DATA_TC_ARB_MODE __BIT(0) 462 1.1 ryo 463 1.1 ryo /* TPS_DATA_TCT_REG[AQ_TRAFFICCLASS_NUM] 0x7110-0x7130 */ 464 1.1 ryo #define TPS_DATA_TCT_REG(i) (0x7110 + (i) * 4) 465 1.1 ryo #define TPS_DATA_TCT_CREDIT_MAX __BITS(16,27) 466 1.1 ryo #define TPS_DATA_TCT_WEIGHT __BITS(8,0) 467 1.1 ryo /* TPS_DATA_TCT_REG[AQ_TRAFFICCLASS_NUM] 0x7210-0x7230 */ 468 1.1 ryo #define TPS_DESC_TCT_REG(i) (0x7210 + (i) * 4) 469 1.1 ryo #define TPS_DESC_TCT_CREDIT_MAX __BITS(16,27) 470 1.1 ryo #define TPS_DESC_TCT_WEIGHT __BITS(8,0) 471 1.1 ryo 472 1.43 ryo #define AQ1_HW_TXBUF_MAX 160 473 1.43 ryo #define AQ1_HW_RXBUF_MAX 320 474 1.43 ryo #define AQ2_HW_TXBUF_MAX 128 475 1.43 ryo #define AQ2_HW_RXBUF_MAX 192 476 1.1 ryo 477 1.1 ryo #define TPO_HWCSUM_REG 0x7800 478 1.1 ryo #define TPO_HWCSUM_IP4CSUM_EN __BIT(1) 479 1.1 ryo #define TPO_HWCSUM_L4CSUM_EN __BIT(0) /* TCP/UDP/SCTP */ 480 1.1 ryo 481 1.1 ryo #define TDM_LSO_EN_REG 0x7810 482 1.1 ryo 483 1.1 ryo #define THM_LSO_TCP_FLAG1_REG 0x7820 484 1.1 ryo #define THM_LSO_TCP_FLAG1_FIRST __BITS(11,0) 485 1.1 ryo #define THM_LSO_TCP_FLAG1_MID __BITS(27,16) 486 1.1 ryo #define THM_LSO_TCP_FLAG2_REG 0x7824 487 1.1 ryo #define THM_LSO_TCP_FLAG2_LAST __BITS(11,0) 488 1.1 ryo 489 1.1 ryo #define TPB_TX_BUF_REG 0x7900 490 1.1 ryo #define TPB_TX_BUF_EN __BIT(0) 491 1.1 ryo #define TPB_TX_BUF_SCP_INS_EN __BIT(2) 492 1.43 ryo #define TPB_TX_BUF_CLK_GATE_EN __BIT(5) 493 1.43 ryo #define TPB_TX_BUF_TC_MODE __BIT(8) 494 1.43 ryo #define TPB_TX_BUF_TC_Q_RAND_MAP_EN __BIT(9) /* AQ2 */ 495 1.1 ryo 496 1.1 ryo /* TPB_TXB_BUFSIZE_REG[AQ_TRAFFICCLASS_NUM] 0x7910-7990 */ 497 1.1 ryo #define TPB_TXB_BUFSIZE_REG(i) (0x7910 + (i) * 0x10) 498 1.1 ryo #define TPB_TXB_BUFSIZE __BITS(7,0) 499 1.1 ryo #define TPB_TXB_THRESH_REG(i) (0x7914 + (i) * 0x10) 500 1.1 ryo #define TPB_TXB_THRESH_HI __BITS(16,28) 501 1.1 ryo #define TPB_TXB_THRESH_LO __BITS(12,0) 502 1.1 ryo 503 1.1 ryo #define AQ_HW_TX_DMA_TOTAL_REQ_LIMIT_REG 0x7b20 504 1.1 ryo #define TX_DMA_INT_DESC_WRWB_EN_REG 0x7b40 505 1.1 ryo #define TX_DMA_INT_DESC_WRWB_EN __BIT(1) 506 1.1 ryo #define TX_DMA_INT_DESC_MODERATE_EN __BIT(4) 507 1.1 ryo 508 1.1 ryo /* TX_DMA_DESC_*[AQ_RINGS_NUM] 0x7c00-0x8400 */ 509 1.1 ryo #define TX_DMA_DESC_BASE_ADDRLSW_REG(i) (0x7c00 + (i) * 0x40) 510 1.1 ryo #define TX_DMA_DESC_BASE_ADDRMSW_REG(i) (0x7c04 + (i) * 0x40) 511 1.1 ryo #define TX_DMA_DESC_REG(i) (0x7c08 + (i) * 0x40) 512 1.1 ryo #define TX_DMA_DESC_LEN __BITS(12, 3) /* TXD_NUM/8 */ 513 1.1 ryo #define TX_DMA_DESC_EN __BIT(31) 514 1.1 ryo #define TX_DMA_DESC_HEAD_PTR_REG(i) (0x7c0c + (i) * 0x40) 515 1.1 ryo #define TX_DMA_DESC_HEAD_PTR __BITS(12,0) 516 1.1 ryo #define TX_DMA_DESC_TAIL_PTR_REG(i) (0x7c10 + (i) * 0x40) 517 1.1 ryo #define TX_DMA_DESC_WRWB_THRESH_REG(i) (0x7c18 + (i) * 0x40) 518 1.1 ryo #define TX_DMA_DESC_WRWB_THRESH __BITS(14,8) 519 1.1 ryo 520 1.1 ryo /* TDM_DCAD_REG[AQ_RINGS_NUM] 0x8400-0x8480 */ 521 1.1 ryo #define TDM_DCAD_REG(i) (0x8400 + (i) * 4) 522 1.1 ryo #define TDM_DCAD_CPUID __BITS(7,0) 523 1.1 ryo #define TDM_DCAD_CPUID_EN __BIT(31) 524 1.1 ryo 525 1.1 ryo #define TDM_DCA_REG 0x8480 526 1.1 ryo #define TDM_DCA_EN __BIT(31) 527 1.1 ryo #define TDM_DCA_MODE __BITS(3,0) 528 1.1 ryo 529 1.1 ryo /* TX_INTR_MODERATION_CTL_REG[AQ_RINGS_NUM] 0x8980-0x8a00 */ 530 1.1 ryo #define TX_INTR_MODERATION_CTL_REG(i) (0x8980 + (i) * 4) 531 1.1 ryo #define TX_INTR_MODERATION_CTL_EN __BIT(1) 532 1.1 ryo #define TX_INTR_MODERATION_CTL_MIN __BITS(15,8) 533 1.1 ryo #define TX_INTR_MODERATION_CTL_MAX __BITS(24,16) 534 1.1 ryo 535 1.43 ryo /* AQ2 (ATL2) registers */ 536 1.43 ryo #define AQ2_QUEUE_MODE 0x0c9c 537 1.43 ryo 538 1.43 ryo #define AQ2_MIF_HOST_FINISHED_STATUS_WRITE_REG 0x0e00 539 1.43 ryo #define AQ2_MIF_HOST_FINISHED_STATUS_READ_REG 0x0e04 540 1.43 ryo #define AQ2_MIF_HOST_FINISHED_STATUS_ACK __BIT(0) 541 1.43 ryo 542 1.43 ryo #define AQ2_MCP_HOST_REQ_INT_REG 0x0f00 543 1.43 ryo #define AQ2_MCP_HOST_REQ_INT_READY __BIT(0) 544 1.43 ryo #define AQ2_MCP_HOST_REQ_INT_SET_REG 0x0f04 545 1.43 ryo #define AQ2_MCP_HOST_REQ_INT_CLR_REG 0x0f08 546 1.43 ryo 547 1.43 ryo #define AQ2_PHI_EXT_TAG_REG 0x1000 548 1.43 ryo #define AQ2_PHI_EXT_TAG_ENABLE __BIT(5) 549 1.43 ryo 550 1.43 ryo #define AQ2_MIF_BOOT_REG 0x3040 551 1.43 ryo #define AQ2_MIF_BOOT_HOST_DATA_LOADED __BIT(16) 552 1.43 ryo #define AQ2_MIF_BOOT_BOOT_STARTED __BIT(24) 553 1.43 ryo #define AQ2_MIF_BOOT_CRASH_INIT __BIT(27) 554 1.43 ryo #define AQ2_MIF_BOOT_BOOT_CODE_FAILED __BIT(28) 555 1.43 ryo #define AQ2_MIF_BOOT_FW_INIT_FAILED __BIT(29) 556 1.43 ryo #define AQ2_MIF_BOOT_FW_INIT_COMP_SUCCESS __BIT(31) 557 1.43 ryo 558 1.43 ryo /* ART(Action Resolver Table) */ 559 1.43 ryo #define AQ2_ART_ACTION_ACT_MASK __BITS(9,8) 560 1.43 ryo #define AQ2_ART_ACTION_RSS_MASK __BIT(7) 561 1.43 ryo #define AQ2_ART_ACTION_INDEX_MASK __BITS(6,2) 562 1.43 ryo #define AQ2_ART_ACTION_ENABLE_MASK __BIT(0) 563 1.43 ryo #define AQ2_ART_ACTION(act, rss, idx, en) \ 564 1.43 ryo (__SHIFTIN((act), AQ2_ART_ACTION_ACT_MASK) | \ 565 1.43 ryo __SHIFTIN((rss), AQ2_ART_ACTION_RSS_MASK) | \ 566 1.43 ryo __SHIFTIN((idx), AQ2_ART_ACTION_INDEX_MASK) | \ 567 1.43 ryo __SHIFTIN((en), AQ2_ART_ACTION_ENABLE_MASK)) 568 1.43 ryo #define AQ2_ART_ACTION_DROP AQ2_ART_ACTION(0, 0, 0, 1) 569 1.43 ryo #define AQ2_ART_ACTION_DISABLE AQ2_ART_ACTION(0, 0, 0, 0) 570 1.43 ryo #define AQ2_ART_ACTION_ASSIGN_QUEUE(q) AQ2_ART_ACTION(1, 0, (q), 1) 571 1.43 ryo #define AQ2_ART_ACTION_ASSIGN_TC(tc) AQ2_ART_ACTION(1, 1, (tc), 1) 572 1.43 ryo 573 1.43 ryo #define AQ2_RPF_TAG_PCP_MASK __BITS(31,29) 574 1.43 ryo #define AQ2_RPF_TAG_FLEX_MASK __BITS(28,27) 575 1.43 ryo #define AQ2_RPF_TAG_UNKNOWN_MASK __BITS(26,24) 576 1.43 ryo #define AQ2_RPF_TAG_L4_MASK __BITS(23,21) 577 1.43 ryo #define AQ2_RPF_TAG_L3_V6_MASK __BITS(20,18) 578 1.43 ryo #define AQ2_RPF_TAG_L3_V4_MASK __BITS(17,15) 579 1.43 ryo #define AQ2_RPF_TAG_UNTAG_MASK __BIT(14) 580 1.43 ryo #define AQ2_RPF_TAG_VLAN_MASK __BITS(13,10) 581 1.43 ryo #define AQ2_RPF_TAG_ET_MASK __BITS(9,7) 582 1.43 ryo #define AQ2_RPF_TAG_ALLMC_MASK __BIT(6) 583 1.43 ryo #define AQ2_RPF_TAG_UC_MASK __BITS(5,0) 584 1.43 ryo 585 1.43 ryo /* index of aq2_filter_art_set() */ 586 1.43 ryo #define AQ2_RPF_INDEX_L2_PROMISC_OFF 0 587 1.43 ryo #define AQ2_RPF_INDEX_VLAN_PROMISC_OFF 1 588 1.43 ryo #define AQ2_RPF_INDEX_L3L4_USER 8 589 1.43 ryo #define AQ2_RPF_INDEX_ET_PCP_USER 24 590 1.43 ryo #define AQ2_RPF_INDEX_VLAN_USER 40 591 1.43 ryo #define AQ2_RPF_INDEX_PCP_TO_TC 56 592 1.43 ryo 593 1.43 ryo #define AQ2_RPF_L2BC_TAG_REG 0x50f0 594 1.43 ryo #define AQ2_RPF_L2BC_TAG_MASK __BITS(5,0) 595 1.43 ryo 596 1.43 ryo #define AQ2_RPF_NEW_CTRL_REG 0x5104 597 1.43 ryo #define AQ2_RPF_NEW_CTRL_ENABLE __BIT(11) 598 1.43 ryo 599 1.43 ryo #define AQ2_RPF_L2UC_TAG_REG(i) (0x5110 + (i) * 8) 600 1.43 ryo #define AQ2_RPF_L2UC_TAG_MASK __BITS(27,22) 601 1.43 ryo 602 1.43 ryo #define AQ2_RPF_REDIR2_REG 0x54c8 603 1.43 ryo #define AQ2_RPF_REDIR2_INDEX __BIT(12) 604 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE __BITS(8,0) 605 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_NONE 0 606 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_IP __BIT(0) 607 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_TCP4 __BIT(1) 608 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_UDP4 __BIT(2) 609 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_IP6 __BIT(3) 610 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_TCP6 __BIT(4) 611 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_UDP6 __BIT(5) 612 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_IP6EX __BIT(6) 613 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_TCP6EX __BIT(7) 614 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_UDP6EX __BIT(8) 615 1.43 ryo #define AQ2_RPF_REDIR2_HASHTYPE_ALL __BITS(8,0) 616 1.43 ryo 617 1.43 ryo #define AQ2_RX_Q_TC_MAP_REG(i) (0x5900 + (i) * 4) 618 1.43 ryo 619 1.43 ryo #define AQ2_RDM_RX_DESC_RD_REQ_LIMIT_REG 0x5a04 620 1.43 ryo 621 1.43 ryo #define AQ2_RPF_RSS_REDIR_REG(tc, i) \ 622 1.43 ryo (0x6200 + (0x100 * ((tc) >> 2)) + (i) * 4) 623 1.43 ryo #define AQ2_RPF_RSS_REDIR_TC_MASK(tc) \ 624 1.43 ryo (__BITS(4,0) << (5 * ((tc) & 3))) 625 1.43 ryo 626 1.43 ryo #define AQ2_RPF_L3_V6_V4_SELECT_REG 0x6500 627 1.43 ryo #define AQ2_RPF_L3_V6_V4_SELECT_EN __BIT(23) 628 1.43 ryo 629 1.43 ryo #define AQ2_RPF_REC_TAB_ENABLE_REG 0x6ff0 630 1.43 ryo #define AQ2_RPF_REC_TAB_ENABLE_MASK __BITS(15,0) 631 1.43 ryo 632 1.43 ryo #define AQ2_TX_Q_TC_MAP_REG(i) (0x799c + (i) * 4) 633 1.43 ryo 634 1.43 ryo #define AQ2_LAUNCHTIME_CTRL_REG 0x7a1c 635 1.43 ryo #define AQ2_LAUNCHTIME_CTRL_RATIO __BITS(15,8) 636 1.43 ryo #define AQ2_LAUNCHTIME_CTRL_RATIO_SPEED_QUATER 4 637 1.43 ryo #define AQ2_LAUNCHTIME_CTRL_RATIO_SPEED_HALF 2 638 1.43 ryo #define AQ2_LAUNCHTIME_CTRL_RATIO_SPEED_FULL 1 639 1.43 ryo 640 1.43 ryo /* AT2_TX_INTR_MODERATION_CTL_REG[AQ_RINGS_NUM] 0x7c28-0x8428 */ 641 1.43 ryo #define AQ2_TX_INTR_MODERATION_CTL_REG(i) (0x7c28 + (i) * 0x40) 642 1.43 ryo #define AQ2_TX_INTR_MODERATION_CTL_EN __BIT(1) 643 1.43 ryo #define AQ2_TX_INTR_MODERATION_CTL_MIN __BITS(15,8) 644 1.43 ryo #define AQ2_TX_INTR_MODERATION_CTL_MAX __BITS(24,16) 645 1.43 ryo 646 1.43 ryo /* RW shared buffer */ 647 1.43 ryo #define AQ2_FW_INTERFACE_IN_MTU_REG 0x12000 648 1.43 ryo #define AQ2_FW_INTERFACE_IN_MAC_ADDRESS_REG 0x12008 649 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_REG 0x12010 650 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_PROMISCUOUS_MODE __BIT(13) 651 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_FRAME_PADDING_REMOVAL_RX __BIT(12) 652 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_CRC_FORWARDING __BIT(11) 653 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_TX_PADDING __BIT(10) 654 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_CONTROL_FRAME __BIT(9) 655 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_DISCARD_ERROR_FRAME __BIT(8) 656 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_DISABLE_LENGTH_CHECK __BIT(7) 657 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_FLOW_CONTROL_MODE __BIT(6) 658 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_DISCARD_SHORT_FRAMES __BIT(5) 659 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_DISABLE_CRC_CORRUPTION __BIT(4) 660 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE __BITS(3,0) 661 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE_INVALID 0 662 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE_ACTIVE 1 663 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE_SLEEP_PROXY 2 664 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE_LOWPOWER 3 665 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE_SHUTDOWN 4 666 1.43 ryo 667 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_REG 0x12018 668 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_DOWNSHIFT_RETRY __BITS(31,28) 669 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_DOWNSHIFT __BIT(27) 670 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_PAUSE_TX __BIT(25) 671 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_PAUSE_RX __BIT(24) 672 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_EEE_10G __BIT(20) 673 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_EEE_5G __BIT(19) 674 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_EEE_2G5 __BIT(18) 675 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_EEE_1G __BIT(17) 676 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_EEE_100M __BIT(16) 677 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10G __BIT(15) 678 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_N5G __BIT(14) 679 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_5G __BIT(13) 680 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_N2G5 __BIT(12) 681 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_2G5 __BIT(11) 682 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_1G __BIT(10) 683 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_100M __BIT(9) 684 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10M __BIT(8) 685 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_1G_HD __BIT(7) 686 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_100M_HD __BIT(6) 687 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10M_HD __BIT(5) 688 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_EXTERNAL_LOOPBACK __BIT(4) 689 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_INTERNAL_LOOPBACK __BIT(3) 690 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_MINIMAL_LINK_SPEED __BIT(2) 691 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_LINK_RENEGOTIATE __BIT(1) 692 1.43 ryo #define AQ2_FW_INTERFACE_IN_LINK_OPTIONS_LINK_UP __BIT(0) 693 1.43 ryo 694 1.43 ryo #define AQ2_FW_INTERFACE_IN_THERMAL_SHUTDOWN_REG 0x12020 695 1.43 ryo #define AQ2_FW_INTERFACE_IN_THERMAL_SHUTDOWN_WARN_TEMP __BITS(24,31) 696 1.43 ryo #define AQ2_FW_INTERFACE_IN_THERMAL_SHUTDOWN_COLD_TEMP __BITS(16,23) 697 1.43 ryo #define AQ2_FW_INTERFACE_IN_THERMAL_SHUTDOWN_SHUTDOWN_TEMP __BITS(15,8) 698 1.43 ryo #define AQ2_FW_INTERFACE_IN_THERMAL_SHUTDOWN_WARNING_ENABLE __BIT(1) 699 1.43 ryo #define AQ2_FW_INTERFACE_IN_THERMAL_SHUTDOWN_ENABLE __BIT(0) 700 1.43 ryo 701 1.43 ryo #define AQ2_FW_INTERFACE_IN_SLEEP_PROXY 0x12028 702 1.43 ryo #define AQ2_FW_INTERFACE_IN_PAUSE_QUANTA 0x12984 703 1.43 ryo 704 1.43 ryo #define AQ2_FW_INTERFACE_IN_CABLE_DIAG_CONTROL_REG 0x12a44 705 1.43 ryo #define AQ2_FW_INTERFACE_IN_DATA_BUFFER_STATUS_OFF_REG 0x12a4c 706 1.43 ryo #define AQ2_FW_INTERFACE_IN_DATA_BUFFER_STATUS_LEN_REG 0x12a50 707 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_REG 0x12a58 708 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_MCAST_QUEUE_OR_TC __BIT(23) 709 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_MCAST_RX_QUEUE_TC_INDEX __BITS(22,18) 710 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_MCAST_ACCEPT __BIT(16) 711 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_BCAST_QUEUE_OR_TC __BIT(15) 712 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_BCAST_RX_QUEUE_TC_INDEX __BITS(14,10) 713 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_BCAST_ACCEPT __BIT(8) 714 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_PROMISC_QUEUE_OR_TC __BIT(7) 715 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_PROMISC_RX_QUEUE_TX_INDEX __BITS(6,2) 716 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_PROMISC_MCAST __BIT(1) 717 1.43 ryo #define AQ2_FW_INTERFACE_IN_REQUEST_POLICY_PROMISC_ALL __BIT(0) 718 1.43 ryo 719 1.43 ryo /* RO shared buffer */ 720 1.43 ryo #define AQ2_FW_INTERFACE_OUT_TRANSACTION_ID_REG 0x13000 721 1.43 ryo #define AQ2_FW_INTERFACE_OUT_TRANSACTION_ID_B __BITS(31,16) 722 1.43 ryo #define AQ2_FW_INTERFACE_OUT_TRANSACTION_ID_A __BITS(15,0) 723 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_BUNDLE_REG 0x13004 724 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_MAC_REG 0x13008 725 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_PHY_REG 0x1300c 726 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_BUILD __BITS(31,16) 727 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_MINOR __BITS(8,15) 728 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_MAJOR __BITS(7,0) 729 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_IFACE_REG 0x13010 730 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_IFACE_VER __BITS(3,0) 731 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_IFACE_VER_A0 0 732 1.43 ryo #define AQ2_FW_INTERFACE_OUT_VERSION_IFACE_VER_B0 1 733 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_REG 0x13014 734 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_DUPLEX __BIT(11) 735 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_EEE __BIT(10) 736 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_PAUSE_RX __BIT(9) 737 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_PAUSE_TX __BIT(8) 738 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE __BITS(7,4) 739 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_10G 6 740 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_5G 5 741 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_2G5 4 742 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_1G 3 743 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_100M 2 744 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_10M 1 745 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_INVALID 0 746 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LINK_STATUS_STATE __BITS(3,0) 747 1.43 ryo #define AQ2_FW_INTERFACE_OUT_WOL_STATUS_REG 0x13018 748 1.43 ryo 749 1.43 ryo #define AQ2_FW_INTERFACE_OUT_MAC_HEALTH_MONITOR 0x13610 750 1.43 ryo #define AQ2_FW_INTERFACE_OUT_PHY_HEALTH_MONITOR 0x13620 751 1.43 ryo typedef struct aq2_health_monitor { 752 1.43 ryo uint32_t data1; 753 1.43 ryo #define HEALTH_MONITOR_DATA1_READY __BIT(0) 754 1.43 ryo #define HEALTH_MONITOR_DATA1_FAULT __BIT(1) 755 1.43 ryo #define HEALTH_MONITOR_DATA1_FLASHLESS_FINISHED __BIT(2) 756 1.43 ryo #define HEALTH_MONITOR_DATA1_HOT_WARNING __BIT(2) 757 1.43 ryo #define HEALTH_MONITOR_DATA1_TEMPERATURE __BITS(15,8) 758 1.43 ryo #define HEALTH_MONITOR_DATA1_HEARTBEAT __BITS(31,16) 759 1.43 ryo uint32_t data2; 760 1.43 ryo #define HEALTH_MONITOR_DATA2_FAULTCODE __BITS(15,0) 761 1.43 ryo } aq2_health_monitor_t; 762 1.43 ryo 763 1.43 ryo #define AQ2_FW_INTERFACE_OUT_CABLE_DIAG_STATUS_LANE_REG(i) (0x13630 + (i) * 4) 764 1.43 ryo #define AQ2_FW_INTERFACE_OUT_CABLE_DIAG_STATUS_IDSTAT_REG 0x13640 765 1.43 ryo #define AQ2_FW_INTERFACE_OUT_CABLE_DIAG_STATUS_IDSTAT_ID __BITS(7,0) 766 1.43 ryo #define AQ2_FW_INTERFACE_OUT_CABLE_DIAG_STATUS_IDSTAT_STATUS __BITS(8,11) 767 1.43 ryo 768 1.43 ryo #define AQ2_FW_INTERFACE_OUT_DEVICE_LINK_CAPS_REG 0x13648 769 1.43 ryo #define AQ2_FW_INTERFACE_OUT_SLEEP_PROXY_CAPS_REG 0x13650 770 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_REG 0x13660 771 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_PAUSE_TX __BIT(25) 772 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_PAUSE_RX __BIT(24) 773 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_EEE_10G __BIT(23) 774 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_EEE_5G __BIT(21) 775 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_EEE_2G5 __BIT(19) 776 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_EEE_1G __BIT(18) 777 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_EEE_100M __BIT(17) 778 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_10G __BIT(15) 779 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_N5G __BIT(14) 780 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_5G __BIT(13) 781 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_N2G5 __BIT(12) 782 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_2G5 __BIT(11) 783 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_1G __BIT(10) 784 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_100M __BIT(9) 785 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_10M __BIT(8) 786 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_1G_HD __BIT(7) 787 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_100M_HD __BIT(6) 788 1.43 ryo #define AQ2_FW_INTERFACE_OUT_LKP_LINK_CAPS_RATE_10M_HD __BIT(5) 789 1.43 ryo 790 1.43 ryo #define AQ2_FW_INTERFACE_OUT_CORE_DUMP_REG 0x13668 791 1.43 ryo #define AQ2_FW_INTERFACE_OUT_STATS_REG 0x13700 792 1.43 ryo struct aq2_statistics_a0 { 793 1.43 ryo uint32_t link_up; 794 1.43 ryo uint32_t link_down; 795 1.43 ryo uint64_t tx_unicast_octets; 796 1.43 ryo uint64_t tx_multicast_octets; 797 1.43 ryo uint64_t tx_broadcast_octets; 798 1.43 ryo uint64_t rx_unicast_octets; 799 1.43 ryo uint64_t rx_multicast_octets; 800 1.43 ryo uint64_t rx_broadcast_octets; 801 1.43 ryo uint32_t tx_unicast_frames; 802 1.43 ryo uint32_t tx_multicast_frames; 803 1.43 ryo uint32_t tx_broadcast_frames; 804 1.43 ryo uint32_t tx_errors; 805 1.43 ryo uint32_t rx_unicast_frames; 806 1.43 ryo uint32_t rx_multicast_frames; 807 1.43 ryo uint32_t rx_broadcast_frames; 808 1.43 ryo uint32_t rx_dropped_frames; 809 1.43 ryo uint32_t rx_errors; 810 1.43 ryo uint32_t tx_good_frames; 811 1.43 ryo uint32_t rx_good_frames; 812 1.43 ryo uint32_t reserved1; 813 1.43 ryo uint32_t main_loop_cycles; 814 1.43 ryo uint32_t reserved2; 815 1.43 ryo }; 816 1.43 ryo 817 1.43 ryo struct aq2_statistics_b0 { 818 1.43 ryo uint64_t rx_good_octets; 819 1.43 ryo uint64_t rx_pause_frames; 820 1.43 ryo uint64_t rx_good_frames; 821 1.43 ryo uint64_t rx_errors; 822 1.43 ryo uint64_t rx_unicast_frames; 823 1.43 ryo uint64_t rx_multicast_frames; 824 1.43 ryo uint64_t rx_broadcast_frames; 825 1.43 ryo uint64_t tx_good_octets; 826 1.43 ryo uint64_t tx_pause_frames; 827 1.43 ryo uint64_t tx_good_frames; 828 1.43 ryo uint64_t tx_errors; 829 1.43 ryo uint64_t tx_unicast_frames; 830 1.43 ryo uint64_t tx_multicast_frames; 831 1.43 ryo uint64_t tx_broadcast_frames; 832 1.43 ryo uint32_t main_loop_cycles; 833 1.43 ryo } __packed; 834 1.43 ryo 835 1.43 ryo typedef struct aq2_statistics { 836 1.43 ryo union { 837 1.43 ryo struct aq2_statistics_a0 a0; 838 1.43 ryo struct aq2_statistics_b0 b0; 839 1.43 ryo }; 840 1.43 ryo } aq2_statistics_t; 841 1.43 ryo 842 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS_REG 0x13774 843 1.43 ryo typedef struct aq2_filter_caps { 844 1.43 ryo uint32_t caps1; 845 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS1_ETHTYPE_FILTER_COUNT __BITS(24,31) 846 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS1_ETHTYPE_FILTER_BASE_INDEX __BITS(16,23) 847 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS1_L2_FILTER_COUNT __BITS(8,15) 848 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS1_FLEXIBLE_FILTER_MASK __BITS(6,7) 849 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS1_L2_FILTER_BASE_INDEX __BITS(0,5) 850 1.43 ryo uint32_t caps2; 851 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS2_L3_IP6_FILTER_COUNT __BITS(28,31) 852 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS2_L3_IP6_FILTER_BASE_INDEX __BITS(24,27) 853 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS2_L3_IP4_FILTER_COUNT __BITS(20,23) 854 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS2_L3_IP4_FILTER_BASE_INDEX __BITS(16,19) 855 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS2_VLAN_FILTER_COUNT __BITS(8,15) 856 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS2_VLAN_FILTER_BASE_INDEX __BITS(0,7) 857 1.43 ryo uint32_t caps3; 858 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS3_RESOLVER_TABLE_COUNT __BITS(24,31) 859 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS3_RESOLVER_BASE_INDEX __BITS(16,23) 860 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS3_L4_FLEX_FILTER_COUNT __BITS(12,15) 861 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS3_L4_FLEX_FILTER_BASE_INDEX __BITS(8,11) 862 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS3_L4_FILTER_COUNT __BITS(4,7) 863 1.43 ryo #define AQ2_FW_INTERFACE_OUT_FILTER_CAPS3_L4_FILTER_BASE_INDEX __BITS(0,3) 864 1.43 ryo } aq2_filter_caps_t; 865 1.43 ryo 866 1.43 ryo #define AQ2_FW_INTERFACE_OUT_DEVICE_CAPS_REG 0x13780 867 1.43 ryo #define AQ2_FW_INTERFACE_OUT_MANAGEMENT_STATUS_REG 0x1378c 868 1.43 ryo #define AQ2_FW_INTERFACE_OUT_TRACE_REG 0x13800 869 1.43 ryo 870 1.43 ryo #define AQ2_RPF_ACT_ART_REQ_TAG_REG(i) (0x14000 + (i) * 0x10) 871 1.43 ryo #define AQ2_RPF_ACT_ART_REQ_MASK_REG(i) (0x14004 + (i) * 0x10) 872 1.43 ryo #define AQ2_RPF_ACT_ART_REQ_ACTION_REG(i) (0x14008 + (i) * 0x10) 873 1.43 ryo 874 1.1 ryo #define FW1X_CTRL_10G __BIT(0) 875 1.1 ryo #define FW1X_CTRL_5G __BIT(1) 876 1.1 ryo #define FW1X_CTRL_5GSR __BIT(2) 877 1.1 ryo #define FW1X_CTRL_2G5 __BIT(3) 878 1.1 ryo #define FW1X_CTRL_1G __BIT(4) 879 1.1 ryo #define FW1X_CTRL_100M __BIT(5) 880 1.1 ryo 881 1.1 ryo #define FW2X_CTRL_10BASET_HD __BIT(0) 882 1.1 ryo #define FW2X_CTRL_10BASET_FD __BIT(1) 883 1.1 ryo #define FW2X_CTRL_100BASETX_HD __BIT(2) 884 1.1 ryo #define FW2X_CTRL_100BASET4_HD __BIT(3) 885 1.1 ryo #define FW2X_CTRL_100BASET2_HD __BIT(4) 886 1.1 ryo #define FW2X_CTRL_100BASETX_FD __BIT(5) 887 1.1 ryo #define FW2X_CTRL_100BASET2_FD __BIT(6) 888 1.1 ryo #define FW2X_CTRL_1000BASET_HD __BIT(7) 889 1.1 ryo #define FW2X_CTRL_1000BASET_FD __BIT(8) 890 1.1 ryo #define FW2X_CTRL_2P5GBASET_FD __BIT(9) 891 1.1 ryo #define FW2X_CTRL_5GBASET_FD __BIT(10) 892 1.1 ryo #define FW2X_CTRL_10GBASET_FD __BIT(11) 893 1.1 ryo #define FW2X_CTRL_RESERVED1 __BIT(32) 894 1.1 ryo #define FW2X_CTRL_10BASET_EEE __BIT(33) 895 1.1 ryo #define FW2X_CTRL_RESERVED2 __BIT(34) 896 1.1 ryo #define FW2X_CTRL_PAUSE __BIT(35) 897 1.1 ryo #define FW2X_CTRL_ASYMMETRIC_PAUSE __BIT(36) 898 1.1 ryo #define FW2X_CTRL_100BASETX_EEE __BIT(37) 899 1.1 ryo #define FW2X_CTRL_RESERVED3 __BIT(38) 900 1.1 ryo #define FW2X_CTRL_RESERVED4 __BIT(39) 901 1.1 ryo #define FW2X_CTRL_1000BASET_FD_EEE __BIT(40) 902 1.1 ryo #define FW2X_CTRL_2P5GBASET_FD_EEE __BIT(41) 903 1.1 ryo #define FW2X_CTRL_5GBASET_FD_EEE __BIT(42) 904 1.1 ryo #define FW2X_CTRL_10GBASET_FD_EEE __BIT(43) 905 1.1 ryo #define FW2X_CTRL_RESERVED5 __BIT(44) 906 1.1 ryo #define FW2X_CTRL_RESERVED6 __BIT(45) 907 1.1 ryo #define FW2X_CTRL_RESERVED7 __BIT(46) 908 1.1 ryo #define FW2X_CTRL_RESERVED8 __BIT(47) 909 1.1 ryo #define FW2X_CTRL_RESERVED9 __BIT(48) 910 1.1 ryo #define FW2X_CTRL_CABLE_DIAG __BIT(49) 911 1.1 ryo #define FW2X_CTRL_TEMPERATURE __BIT(50) 912 1.1 ryo #define FW2X_CTRL_DOWNSHIFT __BIT(51) 913 1.1 ryo #define FW2X_CTRL_PTP_AVB_EN __BIT(52) 914 1.1 ryo #define FW2X_CTRL_MEDIA_DETECT __BIT(53) 915 1.1 ryo #define FW2X_CTRL_LINK_DROP __BIT(54) 916 1.1 ryo #define FW2X_CTRL_SLEEP_PROXY __BIT(55) 917 1.1 ryo #define FW2X_CTRL_WOL __BIT(56) 918 1.1 ryo #define FW2X_CTRL_MAC_STOP __BIT(57) 919 1.1 ryo #define FW2X_CTRL_EXT_LOOPBACK __BIT(58) 920 1.1 ryo #define FW2X_CTRL_INT_LOOPBACK __BIT(59) 921 1.1 ryo #define FW2X_CTRL_EFUSE_AGENT __BIT(60) 922 1.1 ryo #define FW2X_CTRL_WOL_TIMER __BIT(61) 923 1.1 ryo #define FW2X_CTRL_STATISTICS __BIT(62) 924 1.1 ryo #define FW2X_CTRL_TRANSACTION_ID __BIT(63) 925 1.1 ryo 926 1.1 ryo #define FW2X_SNPRINTB \ 927 1.1 ryo "\177\020" \ 928 1.1 ryo "b\x23" "PAUSE\0" \ 929 1.1 ryo "b\x24" "ASYMMETRIC-PAUSE\0" \ 930 1.1 ryo "b\x31" "CABLE-DIAG\0" \ 931 1.1 ryo "b\x32" "TEMPERATURE\0" \ 932 1.1 ryo "b\x33" "DOWNSHIFT\0" \ 933 1.1 ryo "b\x34" "PTP-AVB\0" \ 934 1.1 ryo "b\x35" "MEDIA-DETECT\0" \ 935 1.1 ryo "b\x36" "LINK-DROP\0" \ 936 1.1 ryo "b\x37" "SLEEP-PROXY\0" \ 937 1.1 ryo "b\x38" "WOL\0" \ 938 1.1 ryo "b\x39" "MAC-STOP\0" \ 939 1.1 ryo "b\x3a" "EXT-LOOPBACK\0" \ 940 1.1 ryo "b\x3b" "INT-LOOPBACK\0" \ 941 1.1 ryo "b\x3c" "EFUSE-AGENT\0" \ 942 1.1 ryo "b\x3d" "WOL-TIMER\0" \ 943 1.1 ryo "b\x3e" "STATISTICS\0" \ 944 1.1 ryo "b\x3f" "TRANSACTION-ID\0" \ 945 1.1 ryo "\0" 946 1.1 ryo 947 1.1 ryo #define FW2X_CTRL_RATE_100M FW2X_CTRL_100BASETX_FD 948 1.1 ryo #define FW2X_CTRL_RATE_1G FW2X_CTRL_1000BASET_FD 949 1.1 ryo #define FW2X_CTRL_RATE_2G5 FW2X_CTRL_2P5GBASET_FD 950 1.1 ryo #define FW2X_CTRL_RATE_5G FW2X_CTRL_5GBASET_FD 951 1.1 ryo #define FW2X_CTRL_RATE_10G FW2X_CTRL_10GBASET_FD 952 1.1 ryo #define FW2X_CTRL_RATE_MASK \ 953 1.1 ryo (FW2X_CTRL_RATE_100M | \ 954 1.1 ryo FW2X_CTRL_RATE_1G | \ 955 1.1 ryo FW2X_CTRL_RATE_2G5 | \ 956 1.1 ryo FW2X_CTRL_RATE_5G | \ 957 1.1 ryo FW2X_CTRL_RATE_10G) 958 1.1 ryo #define FW2X_CTRL_EEE_MASK \ 959 1.1 ryo (FW2X_CTRL_10BASET_EEE | \ 960 1.1 ryo FW2X_CTRL_100BASETX_EEE | \ 961 1.1 ryo FW2X_CTRL_1000BASET_FD_EEE | \ 962 1.1 ryo FW2X_CTRL_2P5GBASET_FD_EEE | \ 963 1.1 ryo FW2X_CTRL_5GBASET_FD_EEE | \ 964 1.1 ryo FW2X_CTRL_10GBASET_FD_EEE) 965 1.1 ryo 966 1.1 ryo typedef enum aq_fw_bootloader_mode { 967 1.1 ryo FW_BOOT_MODE_UNKNOWN = 0, 968 1.1 ryo FW_BOOT_MODE_FLB, 969 1.1 ryo FW_BOOT_MODE_RBL_FLASH, 970 1.1 ryo FW_BOOT_MODE_RBL_HOST_BOOTLOAD 971 1.1 ryo } aq_fw_bootloader_mode_t; 972 1.1 ryo 973 1.1 ryo #define AQ_WRITE_REG(sc, reg, val) \ 974 1.1 ryo bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val)) 975 1.1 ryo 976 1.1 ryo #define AQ_READ_REG(sc, reg) \ 977 1.1 ryo bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg)) 978 1.1 ryo 979 1.43 ryo #define AQ_READ_REGS(sc, reg, p, cnt) \ 980 1.43 ryo bus_space_read_region_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (p), (cnt)) 981 1.43 ryo 982 1.1 ryo #define AQ_READ64_REG(sc, reg) \ 983 1.1 ryo ((uint64_t)AQ_READ_REG(sc, reg) | \ 984 1.1 ryo (((uint64_t)AQ_READ_REG(sc, (reg) + 4)) << 32)) 985 1.1 ryo 986 1.1 ryo #define AQ_WRITE64_REG(sc, reg, val) \ 987 1.1 ryo do { \ 988 1.1 ryo AQ_WRITE_REG(sc, reg, (uint32_t)val); \ 989 1.1 ryo AQ_WRITE_REG(sc, reg + 4, (uint32_t)(val >> 32)); \ 990 1.1 ryo } while (/* CONSTCOND */0) 991 1.1 ryo 992 1.1 ryo #define AQ_READ_REG_BIT(sc, reg, mask) \ 993 1.1 ryo __SHIFTOUT(AQ_READ_REG(sc, reg), mask) 994 1.1 ryo 995 1.1 ryo #define AQ_WRITE_REG_BIT(sc, reg, mask, val) \ 996 1.1 ryo do { \ 997 1.1 ryo uint32_t _v; \ 998 1.1 ryo _v = AQ_READ_REG((sc), (reg)); \ 999 1.1 ryo _v &= ~(mask); \ 1000 1.1 ryo if ((val) != 0) \ 1001 1.1 ryo _v |= __SHIFTIN((val), (mask)); \ 1002 1.1 ryo AQ_WRITE_REG((sc), (reg), _v); \ 1003 1.1 ryo } while (/* CONSTCOND */ 0) 1004 1.1 ryo 1005 1.1 ryo #define WAIT_FOR(expr, us, n, errp) \ 1006 1.1 ryo do { \ 1007 1.1 ryo unsigned int _n; \ 1008 1.1 ryo for (_n = n; (!(expr)) && _n != 0; --_n) { \ 1009 1.1 ryo delay((us)); \ 1010 1.1 ryo } \ 1011 1.1 ryo if ((errp != NULL)) { \ 1012 1.1 ryo if (_n == 0) \ 1013 1.1 ryo *(errp) = ETIMEDOUT; \ 1014 1.1 ryo else \ 1015 1.1 ryo *(errp) = 0; \ 1016 1.1 ryo } \ 1017 1.1 ryo } while (/* CONSTCOND */ 0) 1018 1.1 ryo 1019 1.1 ryo #define msec_delay(x) DELAY(1000 * (x)) 1020 1.1 ryo 1021 1.1 ryo typedef struct aq_mailbox_header { 1022 1.1 ryo uint32_t version; 1023 1.1 ryo uint32_t transaction_id; 1024 1.1 ryo int32_t error; 1025 1.19 ryo } __packed __aligned(4) aq_mailbox_header_t; 1026 1.1 ryo 1027 1.1 ryo typedef struct aq_hw_stats_s { 1028 1.1 ryo uint32_t uprc; 1029 1.1 ryo uint32_t mprc; 1030 1.1 ryo uint32_t bprc; 1031 1.1 ryo uint32_t erpt; 1032 1.1 ryo uint32_t uptc; 1033 1.1 ryo uint32_t mptc; 1034 1.1 ryo uint32_t bptc; 1035 1.1 ryo uint32_t erpr; 1036 1.1 ryo uint32_t mbtc; 1037 1.1 ryo uint32_t bbtc; 1038 1.1 ryo uint32_t mbrc; 1039 1.1 ryo uint32_t bbrc; 1040 1.1 ryo uint32_t ubrc; 1041 1.1 ryo uint32_t ubtc; 1042 1.1 ryo uint32_t ptc; 1043 1.1 ryo uint32_t prc; 1044 1.1 ryo uint32_t dpc; /* not exists in fw2x_msm_statistics */ 1045 1.1 ryo uint32_t cprc; /* not exists in fw2x_msm_statistics */ 1046 1.19 ryo } __packed __aligned(4) aq_hw_stats_s_t; 1047 1.1 ryo 1048 1.1 ryo typedef struct fw1x_mailbox { 1049 1.1 ryo aq_mailbox_header_t header; 1050 1.1 ryo aq_hw_stats_s_t msm; 1051 1.19 ryo } __packed __aligned(4) fw1x_mailbox_t; 1052 1.1 ryo 1053 1.1 ryo typedef struct fw2x_msm_statistics { 1054 1.1 ryo uint32_t uprc; 1055 1.1 ryo uint32_t mprc; 1056 1.1 ryo uint32_t bprc; 1057 1.1 ryo uint32_t erpt; 1058 1.1 ryo uint32_t uptc; 1059 1.1 ryo uint32_t mptc; 1060 1.1 ryo uint32_t bptc; 1061 1.1 ryo uint32_t erpr; 1062 1.1 ryo uint32_t mbtc; 1063 1.1 ryo uint32_t bbtc; 1064 1.1 ryo uint32_t mbrc; 1065 1.1 ryo uint32_t bbrc; 1066 1.1 ryo uint32_t ubrc; 1067 1.1 ryo uint32_t ubtc; 1068 1.1 ryo uint32_t ptc; 1069 1.1 ryo uint32_t prc; 1070 1.19 ryo } __packed __aligned(4) fw2x_msm_statistics_t; 1071 1.1 ryo 1072 1.1 ryo typedef struct fw2x_phy_cable_diag_data { 1073 1.1 ryo uint32_t lane_data[4]; 1074 1.19 ryo } __packed __aligned(4) fw2x_phy_cable_diag_data_t; 1075 1.1 ryo 1076 1.1 ryo typedef struct fw2x_capabilities { 1077 1.1 ryo uint32_t caps_lo; 1078 1.1 ryo uint32_t caps_hi; 1079 1.19 ryo } __packed __aligned(4) fw2x_capabilities_t; 1080 1.1 ryo 1081 1.1 ryo typedef struct fw2x_mailbox { /* struct fwHostInterface */ 1082 1.1 ryo aq_mailbox_header_t header; 1083 1.1 ryo fw2x_msm_statistics_t msm; /* msmStatistics_t msm; */ 1084 1.4 ryo 1085 1.4 ryo uint32_t phy_info1; 1086 1.4 ryo #define PHYINFO1_FAULT_CODE __BITS(31,16) 1087 1.4 ryo #define PHYINFO1_PHY_H_BIT __BITS(0,15) 1088 1.4 ryo uint32_t phy_info2; 1089 1.4 ryo #define PHYINFO2_TEMPERATURE __BITS(15,0) 1090 1.4 ryo #define PHYINFO2_CABLE_LEN __BITS(23,16) 1091 1.4 ryo 1092 1.1 ryo fw2x_phy_cable_diag_data_t diag_data; 1093 1.1 ryo uint32_t reserved[8]; 1094 1.1 ryo 1095 1.1 ryo fw2x_capabilities_t caps; 1096 1.1 ryo 1097 1.1 ryo /* ... */ 1098 1.19 ryo } __packed __aligned(4) fw2x_mailbox_t; 1099 1.1 ryo 1100 1.1 ryo typedef enum aq_link_speed { 1101 1.1 ryo AQ_LINK_NONE = 0, 1102 1.43 ryo AQ_LINK_10G = __BIT(0), 1103 1.43 ryo AQ_LINK_5G = __BIT(1), 1104 1.43 ryo AQ_LINK_2G5 = __BIT(2), 1105 1.43 ryo AQ_LINK_1G = __BIT(3), 1106 1.43 ryo AQ_LINK_100M = __BIT(4), 1107 1.43 ryo AQ_LINK_10M = __BIT(5) 1108 1.1 ryo } aq_link_speed_t; 1109 1.1 ryo #define AQ_LINK_ALL (AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | \ 1110 1.1 ryo AQ_LINK_5G | AQ_LINK_10G ) 1111 1.43 ryo #define AQ_LINK_AUTO __BITS(31, 0) 1112 1.1 ryo 1113 1.1 ryo typedef enum aq_link_fc { 1114 1.1 ryo AQ_FC_NONE = 0, 1115 1.1 ryo AQ_FC_RX = __BIT(0), 1116 1.1 ryo AQ_FC_TX = __BIT(1), 1117 1.1 ryo AQ_FC_ALL = (AQ_FC_RX | AQ_FC_TX) 1118 1.1 ryo } aq_link_fc_t; 1119 1.1 ryo 1120 1.1 ryo typedef enum aq_link_eee { 1121 1.1 ryo AQ_EEE_DISABLE = 0, 1122 1.1 ryo AQ_EEE_ENABLE = 1 1123 1.1 ryo } aq_link_eee_t; 1124 1.1 ryo 1125 1.1 ryo typedef enum aq_hw_fw_mpi_state { 1126 1.1 ryo MPI_DEINIT = 0, 1127 1.1 ryo MPI_RESET = 1, 1128 1.1 ryo MPI_INIT = 2, 1129 1.1 ryo MPI_POWER = 4 1130 1.1 ryo } aq_hw_fw_mpi_state_t; 1131 1.1 ryo 1132 1.1 ryo enum aq_media_type { 1133 1.1 ryo AQ_MEDIA_TYPE_UNKNOWN = 0, 1134 1.1 ryo AQ_MEDIA_TYPE_FIBRE, 1135 1.1 ryo AQ_MEDIA_TYPE_TP 1136 1.1 ryo }; 1137 1.1 ryo 1138 1.1 ryo struct aq_rx_desc_read { 1139 1.1 ryo uint64_t buf_addr; 1140 1.1 ryo uint64_t hdr_addr; 1141 1.19 ryo } __packed __aligned(8); 1142 1.1 ryo 1143 1.1 ryo struct aq_rx_desc_wb { 1144 1.1 ryo uint32_t type; 1145 1.1 ryo #define RXDESC_TYPE_RSSTYPE __BITS(3,0) 1146 1.1 ryo #define RXDESC_TYPE_RSSTYPE_NONE 0 1147 1.1 ryo #define RXDESC_TYPE_RSSTYPE_IPV4 2 1148 1.1 ryo #define RXDESC_TYPE_RSSTYPE_IPV6 3 1149 1.1 ryo #define RXDESC_TYPE_RSSTYPE_IPV4_TCP 4 1150 1.1 ryo #define RXDESC_TYPE_RSSTYPE_IPV6_TCP 5 1151 1.1 ryo #define RXDESC_TYPE_RSSTYPE_IPV4_UDP 6 1152 1.1 ryo #define RXDESC_TYPE_RSSTYPE_IPV6_UDP 7 1153 1.1 ryo #define RXDESC_TYPE_PKTTYPE_ETHER __BITS(5,4) 1154 1.1 ryo #define RXDESC_TYPE_PKTTYPE_ETHER_IPV4 0 1155 1.1 ryo #define RXDESC_TYPE_PKTTYPE_ETHER_IPV6 1 1156 1.1 ryo #define RXDESC_TYPE_PKTTYPE_ETHER_OTHERS 2 1157 1.1 ryo #define RXDESC_TYPE_PKTTYPE_ETHER_ARP 3 1158 1.1 ryo #define RXDESC_TYPE_PKTTYPE_PROTO __BITS(8,6) 1159 1.1 ryo #define RXDESC_TYPE_PKTTYPE_PROTO_TCP 0 1160 1.1 ryo #define RXDESC_TYPE_PKTTYPE_PROTO_UDP 1 1161 1.1 ryo #define RXDESC_TYPE_PKTTYPE_PROTO_SCTP 2 1162 1.1 ryo #define RXDESC_TYPE_PKTTYPE_PROTO_ICMP 3 1163 1.1 ryo #define RXDESC_TYPE_PKTTYPE_PROTO_OTHERS 4 1164 1.1 ryo #define RXDESC_TYPE_PKTTYPE_VLAN __BIT(9) 1165 1.1 ryo #define RXDESC_TYPE_PKTTYPE_VLAN_DOUBLE __BIT(10) 1166 1.1 ryo #define RXDESC_TYPE_MAC_DMA_ERR __BIT(12) 1167 1.1 ryo #define RXDESC_TYPE_RESERVED __BITS(18,13) 1168 1.1 ryo #define RXDESC_TYPE_IPV4_CSUM_CHECKED __BIT(19) /* PKTTYPE_ETHER_IPV4 */ 1169 1.1 ryo #define RXDESC_TYPE_TCPUDP_CSUM_CHECKED __BIT(20) 1170 1.1 ryo #define RXDESC_TYPE_SPH __BIT(21) 1171 1.1 ryo #define RXDESC_TYPE_HDR_LEN __BITS(31,22) 1172 1.1 ryo uint32_t rss_hash; 1173 1.1 ryo uint16_t status; 1174 1.1 ryo #define RXDESC_STATUS_DD __BIT(0) 1175 1.1 ryo #define RXDESC_STATUS_EOP __BIT(1) 1176 1.1 ryo #define RXDESC_STATUS_MACERR __BIT(2) 1177 1.1 ryo #define RXDESC_STATUS_IPV4_CSUM_NG __BIT(3) 1178 1.1 ryo #define RXDESC_STATUS_TCPUDP_CSUM_ERROR __BIT(4) 1179 1.1 ryo #define RXDESC_STATUS_TCPUDP_CSUM_OK __BIT(5) 1180 1.1 ryo 1181 1.1 ryo #define RXDESC_STATUS_STAT __BITS(2,5) 1182 1.1 ryo #define RXDESC_STATUS_ESTAT __BITS(6,11) 1183 1.1 ryo #define RXDESC_STATUS_RSC_CNT __BITS(12,15) 1184 1.1 ryo uint16_t pkt_len; 1185 1.1 ryo uint16_t next_desc_ptr; 1186 1.1 ryo uint16_t vlan; 1187 1.19 ryo } __packed __aligned(4); 1188 1.1 ryo 1189 1.1 ryo typedef union aq_rx_desc { 1190 1.1 ryo struct aq_rx_desc_read read; 1191 1.1 ryo struct aq_rx_desc_wb wb; 1192 1.19 ryo } __packed __aligned(8) aq_rx_desc_t; 1193 1.1 ryo 1194 1.1 ryo typedef struct aq_tx_desc { 1195 1.1 ryo uint64_t buf_addr; 1196 1.1 ryo uint32_t ctl1; 1197 1.1 ryo #define AQ_TXDESC_CTL1_TYPE_MASK 0x00000003 1198 1.1 ryo #define AQ_TXDESC_CTL1_TYPE_TXD 0x00000001 1199 1.1 ryo #define AQ_TXDESC_CTL1_TYPE_TXC 0x00000002 1200 1.1 ryo #define AQ_TXDESC_CTL1_BLEN __BITS(19,4) /* TXD */ 1201 1.1 ryo #define AQ_TXDESC_CTL1_DD __BIT(20) /* TXD */ 1202 1.1 ryo #define AQ_TXDESC_CTL1_EOP __BIT(21) /* TXD */ 1203 1.1 ryo #define AQ_TXDESC_CTL1_CMD_VLAN __BIT(22) /* TXD */ 1204 1.1 ryo #define AQ_TXDESC_CTL1_CMD_FCS __BIT(23) /* TXD */ 1205 1.1 ryo #define AQ_TXDESC_CTL1_CMD_IP4CSUM __BIT(24) /* TXD */ 1206 1.1 ryo #define AQ_TXDESC_CTL1_CMD_L4CSUM __BIT(25) /* TXD */ 1207 1.1 ryo #define AQ_TXDESC_CTL1_CMD_LSO __BIT(26) /* TXD */ 1208 1.1 ryo #define AQ_TXDESC_CTL1_CMD_WB __BIT(27) /* TXD */ 1209 1.1 ryo #define AQ_TXDESC_CTL1_CMD_VXLAN __BIT(28) /* TXD */ 1210 1.1 ryo #define AQ_TXDESC_CTL1_VID __BITS(15,4) /* TXC */ 1211 1.1 ryo #define AQ_TXDESC_CTL1_LSO_IPV6 __BIT(21) /* TXC */ 1212 1.1 ryo #define AQ_TXDESC_CTL1_LSO_TCP __BIT(22) /* TXC */ 1213 1.1 ryo uint32_t ctl2; 1214 1.1 ryo #define AQ_TXDESC_CTL2_LEN __BITS(31,14) 1215 1.1 ryo #define AQ_TXDESC_CTL2_CTX_EN __BIT(13) 1216 1.1 ryo #define AQ_TXDESC_CTL2_CTX_IDX __BIT(12) 1217 1.19 ryo } __packed __aligned(8) aq_tx_desc_t; 1218 1.1 ryo 1219 1.1 ryo struct aq_txring { 1220 1.1 ryo struct aq_softc *txr_sc; 1221 1.1 ryo int txr_index; 1222 1.1 ryo kmutex_t txr_mutex; 1223 1.1 ryo bool txr_active; 1224 1.33 skrll bool txr_stopping; 1225 1.33 skrll bool txr_sending; 1226 1.33 skrll time_t txr_lastsent; 1227 1.1 ryo 1228 1.1 ryo pcq_t *txr_pcq; 1229 1.1 ryo void *txr_softint; 1230 1.1 ryo 1231 1.1 ryo aq_tx_desc_t *txr_txdesc; /* aq_tx_desc_t[AQ_TXD_NUM] */ 1232 1.1 ryo bus_dmamap_t txr_txdesc_dmamap; 1233 1.1 ryo bus_dma_segment_t txr_txdesc_seg[1]; 1234 1.1 ryo bus_size_t txr_txdesc_size; 1235 1.1 ryo 1236 1.1 ryo struct { 1237 1.1 ryo struct mbuf *m; 1238 1.1 ryo bus_dmamap_t dmamap; 1239 1.1 ryo } txr_mbufs[AQ_TXD_NUM]; 1240 1.1 ryo unsigned int txr_prodidx; 1241 1.1 ryo unsigned int txr_considx; 1242 1.1 ryo int txr_nfree; 1243 1.1 ryo }; 1244 1.1 ryo 1245 1.1 ryo struct aq_rxring { 1246 1.1 ryo struct aq_softc *rxr_sc; 1247 1.1 ryo int rxr_index; 1248 1.1 ryo kmutex_t rxr_mutex; 1249 1.1 ryo bool rxr_active; 1250 1.28 ryo bool rxr_discarding; 1251 1.33 skrll bool rxr_stopping; 1252 1.28 ryo struct mbuf *rxr_receiving_m; /* receiving jumboframe */ 1253 1.28 ryo struct mbuf *rxr_receiving_m_last; /* last mbuf of jumboframe */ 1254 1.1 ryo 1255 1.1 ryo aq_rx_desc_t *rxr_rxdesc; /* aq_rx_desc_t[AQ_RXD_NUM] */ 1256 1.1 ryo bus_dmamap_t rxr_rxdesc_dmamap; 1257 1.1 ryo bus_dma_segment_t rxr_rxdesc_seg[1]; 1258 1.1 ryo bus_size_t rxr_rxdesc_size; 1259 1.1 ryo struct { 1260 1.1 ryo struct mbuf *m; 1261 1.1 ryo bus_dmamap_t dmamap; 1262 1.1 ryo } rxr_mbufs[AQ_RXD_NUM]; 1263 1.1 ryo unsigned int rxr_readidx; 1264 1.1 ryo }; 1265 1.1 ryo 1266 1.1 ryo struct aq_queue { 1267 1.1 ryo struct aq_softc *sc; 1268 1.1 ryo struct aq_txring txring; 1269 1.1 ryo struct aq_rxring rxring; 1270 1.1 ryo }; 1271 1.1 ryo 1272 1.1 ryo struct aq_softc; 1273 1.1 ryo struct aq_firmware_ops { 1274 1.1 ryo int (*reset)(struct aq_softc *); 1275 1.43 ryo int (*get_mac_addr)(struct aq_softc *); 1276 1.1 ryo int (*set_mode)(struct aq_softc *, aq_hw_fw_mpi_state_t, 1277 1.1 ryo aq_link_speed_t, aq_link_fc_t, aq_link_eee_t); 1278 1.1 ryo int (*get_mode)(struct aq_softc *, aq_hw_fw_mpi_state_t *, 1279 1.1 ryo aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *); 1280 1.1 ryo int (*get_stats)(struct aq_softc *, aq_hw_stats_s_t *); 1281 1.4 ryo #if NSYSMON_ENVSYS > 0 1282 1.4 ryo int (*get_temperature)(struct aq_softc *, uint32_t *); 1283 1.4 ryo #endif 1284 1.1 ryo }; 1285 1.1 ryo 1286 1.1 ryo #ifdef AQ_EVENT_COUNTERS 1287 1.1 ryo #define AQ_EVCNT_DECL(name) \ 1288 1.1 ryo char sc_evcount_##name##_name[32]; \ 1289 1.1 ryo struct evcnt sc_evcount_##name##_ev; 1290 1.1 ryo #define AQ_EVCNT_ATTACH(sc, name, desc, evtype) \ 1291 1.1 ryo do { \ 1292 1.1 ryo snprintf((sc)->sc_evcount_##name##_name, \ 1293 1.1 ryo sizeof((sc)->sc_evcount_##name##_name), \ 1294 1.1 ryo "%s", desc); \ 1295 1.1 ryo evcnt_attach_dynamic(&(sc)->sc_evcount_##name##_ev, \ 1296 1.1 ryo (evtype), NULL, device_xname((sc)->sc_dev), \ 1297 1.1 ryo (sc)->sc_evcount_##name##_name); \ 1298 1.1 ryo } while (/*CONSTCOND*/0) 1299 1.1 ryo #define AQ_EVCNT_ATTACH_MISC(sc, name, desc) \ 1300 1.1 ryo AQ_EVCNT_ATTACH(sc, name, desc, EVCNT_TYPE_MISC) 1301 1.1 ryo #define AQ_EVCNT_DETACH(sc, name) \ 1302 1.41 ryo if ((sc)->sc_evcount_##name##_name[0] != '\0') \ 1303 1.41 ryo evcnt_detach(&(sc)->sc_evcount_##name##_ev) 1304 1.1 ryo #define AQ_EVCNT_ADD(sc, name, val) \ 1305 1.1 ryo ((sc)->sc_evcount_##name##_ev.ev_count += (val)) 1306 1.1 ryo #endif /* AQ_EVENT_COUNTERS */ 1307 1.1 ryo 1308 1.1 ryo #define AQ_LOCK(sc) mutex_enter(&(sc)->sc_mutex); 1309 1.1 ryo #define AQ_UNLOCK(sc) mutex_exit(&(sc)->sc_mutex); 1310 1.33 skrll #define AQ_LOCKED(sc) KASSERT(mutex_owned(&(sc)->sc_mutex)); 1311 1.1 ryo 1312 1.43 ryo /* lock for firmware interface */ 1313 1.4 ryo #define AQ_MPI_LOCK(sc) mutex_enter(&(sc)->sc_mpi_mutex); 1314 1.4 ryo #define AQ_MPI_UNLOCK(sc) mutex_exit(&(sc)->sc_mpi_mutex); 1315 1.33 skrll #define AQ_MPI_LOCKED(sc) KASSERT(mutex_owned(&(sc)->sc_mpi_mutex)); 1316 1.4 ryo 1317 1.4 ryo 1318 1.1 ryo struct aq_softc { 1319 1.1 ryo device_t sc_dev; 1320 1.1 ryo 1321 1.1 ryo bus_space_tag_t sc_iot; 1322 1.1 ryo bus_space_handle_t sc_ioh; 1323 1.1 ryo bus_size_t sc_iosize; 1324 1.17 msaitoh bus_dma_tag_t sc_dmat; 1325 1.1 ryo 1326 1.1 ryo void *sc_ihs[AQ_NINTR_MAX]; 1327 1.1 ryo pci_intr_handle_t *sc_intrs; 1328 1.1 ryo 1329 1.1 ryo int sc_tx_irq[AQ_RSSQUEUE_MAX]; 1330 1.1 ryo int sc_rx_irq[AQ_RSSQUEUE_MAX]; 1331 1.1 ryo int sc_linkstat_irq; 1332 1.1 ryo bool sc_use_txrx_independent_intr; 1333 1.47 mrg bool sc_no_link_intr; 1334 1.1 ryo 1335 1.4 ryo #if NSYSMON_ENVSYS > 0 1336 1.4 ryo struct sysmon_envsys *sc_sme; 1337 1.4 ryo envsys_data_t sc_sensor_temp; 1338 1.4 ryo #endif 1339 1.4 ryo 1340 1.1 ryo callout_t sc_tick_ch; 1341 1.1 ryo 1342 1.1 ryo int sc_nintrs; 1343 1.1 ryo bool sc_msix; 1344 1.1 ryo 1345 1.1 ryo struct aq_queue sc_queue[AQ_RSSQUEUE_MAX]; 1346 1.1 ryo int sc_nqueues; 1347 1.43 ryo uint32_t sc_tc_mode; /* traffic class mode (4 or 8) */ 1348 1.43 ryo uint32_t sc_tcs; /* traffic class num */ 1349 1.1 ryo 1350 1.1 ryo pci_chipset_tag_t sc_pc; 1351 1.1 ryo pcitag_t sc_pcitag; 1352 1.1 ryo uint16_t sc_product; 1353 1.1 ryo uint16_t sc_revision; 1354 1.1 ryo 1355 1.1 ryo kmutex_t sc_mutex; 1356 1.4 ryo kmutex_t sc_mpi_mutex; 1357 1.1 ryo 1358 1.8 maxv const struct aq_firmware_ops *sc_fw_ops; 1359 1.43 ryo uint64_t sc_fw_caps; /* AQ1 */ 1360 1.43 ryo aq2_filter_caps_t sc_filter_caps; /* AQ2 */ 1361 1.43 ryo uint32_t sc_filter_art_base_index; /* AQ2 */ 1362 1.1 ryo enum aq_media_type sc_media_type; 1363 1.1 ryo aq_link_speed_t sc_available_rates; 1364 1.1 ryo 1365 1.1 ryo aq_link_speed_t sc_link_rate; 1366 1.1 ryo aq_link_fc_t sc_link_fc; 1367 1.1 ryo aq_link_eee_t sc_link_eee; 1368 1.1 ryo 1369 1.1 ryo uint32_t sc_fw_version; 1370 1.1 ryo #define FW_VERSION_MAJOR(sc) (((sc)->sc_fw_version >> 24) & 0xff) 1371 1.1 ryo #define FW_VERSION_MINOR(sc) (((sc)->sc_fw_version >> 16) & 0xff) 1372 1.1 ryo #define FW_VERSION_BUILD(sc) ((sc)->sc_fw_version & 0xffff) 1373 1.1 ryo uint32_t sc_features; 1374 1.1 ryo #define FEATURES_MIPS 0x00000001 1375 1.1 ryo #define FEATURES_TPO2 0x00000002 1376 1.1 ryo #define FEATURES_RPF2 0x00000004 1377 1.1 ryo #define FEATURES_MPI_AQ 0x00000008 1378 1.43 ryo #define FEATURES_AQ1_REV_A0 0x01000000 1379 1.43 ryo #define FEATURES_AQ1_REV_A (FEATURES_AQ1_REV_A0) 1380 1.43 ryo #define FEATURES_AQ1_REV_B0 0x02000000 1381 1.43 ryo #define FEATURES_AQ1_REV_B1 0x04000000 1382 1.43 ryo #define FEATURES_AQ1_REV_B (FEATURES_AQ1_REV_B0 | FEATURES_AQ1_REV_B1) 1383 1.43 ryo #define FEATURES_AQ1 (FEATURES_AQ1_REV_A | FEATURES_AQ1_REV_B) 1384 1.43 ryo #define FEATURES_AQ2 0x10000000 1385 1.43 ryo #define FEATURES_AQ2_IFACE_A0 0x20000000 1386 1.43 ryo #define FEATURES_AQ2_IFACE_B0 0x40000000 1387 1.43 ryo #define HWTYPE_AQ1_P(sc) (((sc)->sc_features & FEATURES_AQ1) != 0) 1388 1.43 ryo #define HWTYPE_AQ2_P(sc) (((sc)->sc_features & FEATURES_AQ2) != 0) 1389 1.43 ryo 1390 1.40 ryo int sc_max_mtu; 1391 1.1 ryo uint32_t sc_mbox_addr; 1392 1.1 ryo 1393 1.1 ryo bool sc_rbl_enabled; 1394 1.1 ryo bool sc_fast_start_enabled; 1395 1.1 ryo bool sc_flash_present; 1396 1.1 ryo 1397 1.1 ryo bool sc_intr_moderation_enable; 1398 1.1 ryo bool sc_rss_enable; 1399 1.1 ryo 1400 1.1 ryo struct ethercom sc_ethercom; 1401 1.1 ryo struct ether_addr sc_enaddr; 1402 1.1 ryo struct ifmedia sc_media; 1403 1.1 ryo int sc_ec_capenable; /* last ec_capenable */ 1404 1.1 ryo unsigned short sc_if_flags; /* last if_flags */ 1405 1.1 ryo 1406 1.33 skrll bool sc_tx_sending; 1407 1.33 skrll bool sc_stopping; 1408 1.33 skrll 1409 1.33 skrll struct workqueue *sc_reset_wq; 1410 1.33 skrll struct work sc_reset_work; 1411 1.33 skrll volatile unsigned sc_reset_pending; 1412 1.33 skrll 1413 1.33 skrll bool sc_trigger_reset; 1414 1.33 skrll 1415 1.1 ryo #ifdef AQ_EVENT_COUNTERS 1416 1.1 ryo aq_hw_stats_s_t sc_statistics[2]; 1417 1.1 ryo int sc_statistics_idx; 1418 1.1 ryo bool sc_poll_statistics; 1419 1.1 ryo 1420 1.1 ryo AQ_EVCNT_DECL(uprc); 1421 1.1 ryo AQ_EVCNT_DECL(mprc); 1422 1.1 ryo AQ_EVCNT_DECL(bprc); 1423 1.1 ryo AQ_EVCNT_DECL(erpt); 1424 1.1 ryo AQ_EVCNT_DECL(uptc); 1425 1.1 ryo AQ_EVCNT_DECL(mptc); 1426 1.1 ryo AQ_EVCNT_DECL(bptc); 1427 1.1 ryo AQ_EVCNT_DECL(erpr); 1428 1.1 ryo AQ_EVCNT_DECL(mbtc); 1429 1.1 ryo AQ_EVCNT_DECL(bbtc); 1430 1.1 ryo AQ_EVCNT_DECL(mbrc); 1431 1.1 ryo AQ_EVCNT_DECL(bbrc); 1432 1.1 ryo AQ_EVCNT_DECL(ubrc); 1433 1.1 ryo AQ_EVCNT_DECL(ubtc); 1434 1.1 ryo AQ_EVCNT_DECL(ptc); 1435 1.1 ryo AQ_EVCNT_DECL(prc); 1436 1.1 ryo AQ_EVCNT_DECL(dpc); 1437 1.1 ryo AQ_EVCNT_DECL(cprc); 1438 1.1 ryo #endif 1439 1.1 ryo }; 1440 1.1 ryo 1441 1.1 ryo static int aq_match(device_t, cfdata_t, void *); 1442 1.1 ryo static void aq_attach(device_t, device_t, void *); 1443 1.1 ryo static int aq_detach(device_t, int); 1444 1.1 ryo 1445 1.47 mrg static int aq_setup_msix(struct aq_softc *, struct pci_attach_args *); 1446 1.1 ryo static int aq_setup_legacy(struct aq_softc *, struct pci_attach_args *, 1447 1.1 ryo pci_intr_type_t); 1448 1.1 ryo 1449 1.1 ryo static int aq_ifmedia_change(struct ifnet * const); 1450 1.1 ryo static void aq_ifmedia_status(struct ifnet * const, struct ifmediareq *); 1451 1.10 ryo static int aq_vlan_cb(struct ethercom *ec, uint16_t vid, bool set); 1452 1.1 ryo static int aq_ifflags_cb(struct ethercom *); 1453 1.1 ryo static int aq_init(struct ifnet *); 1454 1.33 skrll static int aq_init_locked(struct ifnet *); 1455 1.1 ryo static void aq_send_common_locked(struct ifnet *, struct aq_softc *, 1456 1.1 ryo struct aq_txring *, bool); 1457 1.1 ryo static int aq_transmit(struct ifnet *, struct mbuf *); 1458 1.1 ryo static void aq_deferred_transmit(void *); 1459 1.1 ryo static void aq_start(struct ifnet *); 1460 1.1 ryo static void aq_stop(struct ifnet *, int); 1461 1.33 skrll static void aq_stop_locked(struct ifnet *, bool); 1462 1.1 ryo static int aq_ioctl(struct ifnet *, unsigned long, void *); 1463 1.1 ryo 1464 1.1 ryo static int aq_txrx_rings_alloc(struct aq_softc *); 1465 1.1 ryo static void aq_txrx_rings_free(struct aq_softc *); 1466 1.1 ryo static int aq_tx_pcq_alloc(struct aq_softc *, struct aq_txring *); 1467 1.1 ryo static void aq_tx_pcq_free(struct aq_softc *, struct aq_txring *); 1468 1.1 ryo 1469 1.1 ryo static void aq_initmedia(struct aq_softc *); 1470 1.1 ryo static void aq_enable_intr(struct aq_softc *, bool, bool); 1471 1.1 ryo 1472 1.33 skrll static void aq_handle_reset_work(struct work *, void *); 1473 1.33 skrll static void aq_unset_stopping_flags(struct aq_softc *); 1474 1.33 skrll static void aq_set_stopping_flags(struct aq_softc *); 1475 1.33 skrll 1476 1.4 ryo #if NSYSMON_ENVSYS > 0 1477 1.4 ryo static void aq_temp_refresh(struct sysmon_envsys *, envsys_data_t *); 1478 1.4 ryo #endif 1479 1.1 ryo static void aq_tick(void *); 1480 1.1 ryo static int aq_legacy_intr(void *); 1481 1.1 ryo static int aq_link_intr(void *); 1482 1.1 ryo static int aq_txrx_intr(void *); 1483 1.1 ryo static int aq_tx_intr(void *); 1484 1.1 ryo static int aq_rx_intr(void *); 1485 1.1 ryo 1486 1.1 ryo static int aq_set_linkmode(struct aq_softc *, aq_link_speed_t, aq_link_fc_t, 1487 1.1 ryo aq_link_eee_t); 1488 1.1 ryo static int aq_get_linkmode(struct aq_softc *, aq_link_speed_t *, aq_link_fc_t *, 1489 1.1 ryo aq_link_eee_t *); 1490 1.1 ryo 1491 1.43 ryo static int aq1_fw_reboot(struct aq_softc *); 1492 1.43 ryo static int aq1_fw_version_init(struct aq_softc *); 1493 1.1 ryo static int aq_hw_init(struct aq_softc *); 1494 1.43 ryo static int aq1_hw_init_ucp(struct aq_softc *); 1495 1.1 ryo static int aq_hw_reset(struct aq_softc *); 1496 1.43 ryo static int aq1_fw_downld_dwords(struct aq_softc *, uint32_t, uint32_t *, 1497 1.1 ryo uint32_t); 1498 1.43 ryo static int aq1_get_mac_addr(struct aq_softc *); 1499 1.1 ryo static int aq_init_rss(struct aq_softc *); 1500 1.1 ryo static int aq_set_capability(struct aq_softc *); 1501 1.1 ryo 1502 1.1 ryo static int fw1x_reset(struct aq_softc *); 1503 1.1 ryo static int fw1x_set_mode(struct aq_softc *, aq_hw_fw_mpi_state_t, 1504 1.1 ryo aq_link_speed_t, aq_link_fc_t, aq_link_eee_t); 1505 1.1 ryo static int fw1x_get_mode(struct aq_softc *, aq_hw_fw_mpi_state_t *, 1506 1.1 ryo aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *); 1507 1.1 ryo static int fw1x_get_stats(struct aq_softc *, aq_hw_stats_s_t *); 1508 1.1 ryo 1509 1.1 ryo static int fw2x_reset(struct aq_softc *); 1510 1.1 ryo static int fw2x_set_mode(struct aq_softc *, aq_hw_fw_mpi_state_t, 1511 1.1 ryo aq_link_speed_t, aq_link_fc_t, aq_link_eee_t); 1512 1.1 ryo static int fw2x_get_mode(struct aq_softc *, aq_hw_fw_mpi_state_t *, 1513 1.1 ryo aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *); 1514 1.1 ryo static int fw2x_get_stats(struct aq_softc *, aq_hw_stats_s_t *); 1515 1.4 ryo #if NSYSMON_ENVSYS > 0 1516 1.4 ryo static int fw2x_get_temperature(struct aq_softc *, uint32_t *); 1517 1.4 ryo #endif 1518 1.1 ryo 1519 1.33 skrll #ifndef AQ_WATCHDOG_TIMEOUT 1520 1.33 skrll #define AQ_WATCHDOG_TIMEOUT 5 1521 1.33 skrll #endif 1522 1.33 skrll static int aq_watchdog_timeout = AQ_WATCHDOG_TIMEOUT; 1523 1.33 skrll 1524 1.43 ryo static int aq2_fw_reboot(struct aq_softc *); 1525 1.43 ryo static int aq2_fw_reset(struct aq_softc *); 1526 1.43 ryo static int aq2_get_mac_addr(struct aq_softc *); 1527 1.43 ryo static int aq2_fw_set_mode(struct aq_softc *, aq_hw_fw_mpi_state_t, 1528 1.43 ryo aq_link_speed_t, aq_link_fc_t, aq_link_eee_t); 1529 1.43 ryo static int aq2_fw_get_mode(struct aq_softc *, aq_hw_fw_mpi_state_t *, 1530 1.43 ryo aq_link_speed_t *, aq_link_fc_t *, aq_link_eee_t *); 1531 1.43 ryo static int aq2_init_filter(struct aq_softc *); 1532 1.43 ryo static int aq2_filter_art_set(struct aq_softc *, uint32_t, uint32_t, uint32_t, 1533 1.43 ryo uint32_t); 1534 1.43 ryo static int aq2_fw_get_stats(struct aq_softc *, aq_hw_stats_s_t *); 1535 1.43 ryo #if NSYSMON_ENVSYS > 0 1536 1.43 ryo static int aq2_fw_get_temperature(struct aq_softc *, uint32_t *); 1537 1.43 ryo #endif 1538 1.33 skrll 1539 1.8 maxv static const struct aq_firmware_ops aq_fw1x_ops = { 1540 1.1 ryo .reset = fw1x_reset, 1541 1.43 ryo .get_mac_addr = aq1_get_mac_addr, 1542 1.1 ryo .set_mode = fw1x_set_mode, 1543 1.1 ryo .get_mode = fw1x_get_mode, 1544 1.4 ryo .get_stats = fw1x_get_stats, 1545 1.4 ryo #if NSYSMON_ENVSYS > 0 1546 1.4 ryo .get_temperature = NULL 1547 1.4 ryo #endif 1548 1.1 ryo }; 1549 1.1 ryo 1550 1.8 maxv static const struct aq_firmware_ops aq_fw2x_ops = { 1551 1.1 ryo .reset = fw2x_reset, 1552 1.43 ryo .get_mac_addr = aq1_get_mac_addr, 1553 1.1 ryo .set_mode = fw2x_set_mode, 1554 1.1 ryo .get_mode = fw2x_get_mode, 1555 1.4 ryo .get_stats = fw2x_get_stats, 1556 1.4 ryo #if NSYSMON_ENVSYS > 0 1557 1.4 ryo .get_temperature = fw2x_get_temperature 1558 1.4 ryo #endif 1559 1.1 ryo }; 1560 1.1 ryo 1561 1.43 ryo static const struct aq_firmware_ops aq2_fw_ops = { 1562 1.43 ryo .reset = aq2_fw_reset, 1563 1.43 ryo .get_mac_addr = aq2_get_mac_addr, 1564 1.43 ryo .set_mode = aq2_fw_set_mode, 1565 1.43 ryo .get_mode = aq2_fw_get_mode, 1566 1.43 ryo .get_stats = aq2_fw_get_stats, 1567 1.43 ryo #if NSYSMON_ENVSYS > 0 1568 1.43 ryo .get_temperature = aq2_fw_get_temperature 1569 1.43 ryo #endif 1570 1.43 ryo }; 1571 1.43 ryo 1572 1.1 ryo CFATTACH_DECL3_NEW(aq, sizeof(struct aq_softc), 1573 1.1 ryo aq_match, aq_attach, aq_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN); 1574 1.1 ryo 1575 1.1 ryo static const struct aq_product { 1576 1.1 ryo pci_vendor_id_t aq_vendor; 1577 1.1 ryo pci_product_id_t aq_product; 1578 1.1 ryo const char *aq_name; 1579 1.43 ryo enum aq_hwtype aq_hwtype; 1580 1.1 ryo enum aq_media_type aq_media_type; 1581 1.1 ryo aq_link_speed_t aq_available_rates; 1582 1.1 ryo } aq_products[] = { 1583 1.14 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC100, 1584 1.43 ryo "Aquantia AQC100 10 Gigabit Network Adapter", HWTYPE_AQ1, 1585 1.14 ryo AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL 1586 1.14 ryo }, 1587 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC107, 1588 1.43 ryo "Aquantia AQC107 10 Gigabit Network Adapter", HWTYPE_AQ1, 1589 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_ALL 1590 1.1 ryo }, 1591 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC108, 1592 1.43 ryo "Aquantia AQC108 5 Gigabit Network Adapter", HWTYPE_AQ1, 1593 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1594 1.1 ryo }, 1595 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC109, 1596 1.43 ryo "Aquantia AQC109 2.5 Gigabit Network Adapter", HWTYPE_AQ1, 1597 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1598 1.1 ryo }, 1599 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC111, 1600 1.43 ryo "Aquantia AQC111 5 Gigabit Network Adapter", HWTYPE_AQ1, 1601 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1602 1.1 ryo }, 1603 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC112, 1604 1.43 ryo "Aquantia AQC112 2.5 Gigabit Network Adapter", HWTYPE_AQ1, 1605 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1606 1.1 ryo }, 1607 1.15 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC100S, 1608 1.43 ryo "Aquantia AQC100S 10 Gigabit Network Adapter", HWTYPE_AQ1, 1609 1.15 ryo AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL 1610 1.15 ryo }, 1611 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC107S, 1612 1.43 ryo "Aquantia AQC107S 10 Gigabit Network Adapter", HWTYPE_AQ1, 1613 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_ALL 1614 1.1 ryo }, 1615 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC108S, 1616 1.43 ryo "Aquantia AQC108S 5 Gigabit Network Adapter", HWTYPE_AQ1, 1617 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1618 1.1 ryo }, 1619 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC109S, 1620 1.43 ryo "Aquantia AQC109S 2.5 Gigabit Network Adapter", HWTYPE_AQ1, 1621 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1622 1.1 ryo }, 1623 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC111S, 1624 1.43 ryo "Aquantia AQC111S 5 Gigabit Network Adapter", HWTYPE_AQ1, 1625 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1626 1.1 ryo }, 1627 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC112S, 1628 1.43 ryo "Aquantia AQC112S 2.5 Gigabit Network Adapter", HWTYPE_AQ1, 1629 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1630 1.1 ryo }, 1631 1.15 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D100, 1632 1.43 ryo "Aquantia D100 10 Gigabit Network Adapter", HWTYPE_AQ1, 1633 1.15 ryo AQ_MEDIA_TYPE_FIBRE, AQ_LINK_ALL 1634 1.15 ryo }, 1635 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D107, 1636 1.43 ryo "Aquantia D107 10 Gigabit Network Adapter", HWTYPE_AQ1, 1637 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_ALL 1638 1.1 ryo }, 1639 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D108, 1640 1.43 ryo "Aquantia D108 5 Gigabit Network Adapter", HWTYPE_AQ1, 1641 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1642 1.1 ryo }, 1643 1.1 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_D109, 1644 1.43 ryo "Aquantia D109 2.5 Gigabit Network Adapter", HWTYPE_AQ1, 1645 1.1 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1646 1.43 ryo }, 1647 1.43 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC113DEV, 1648 1.43 ryo "Aquantia AQC113DEV 10 Gigabit Network Adapter", HWTYPE_AQ2, 1649 1.43 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_ALL | AQ_LINK_10M 1650 1.43 ryo }, 1651 1.43 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC113, 1652 1.43 ryo "Aquantia AQC113 10 Gigabit Network Adapter", HWTYPE_AQ2, 1653 1.43 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_ALL | AQ_LINK_10M 1654 1.43 ryo }, 1655 1.43 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC113C, 1656 1.43 ryo "Aquantia AQC113C 10 Gigabit Network Adapter", HWTYPE_AQ2, 1657 1.43 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_ALL | AQ_LINK_10M 1658 1.43 ryo }, 1659 1.43 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC113CA, 1660 1.43 ryo "Aquantia AQC113CA 10 Gigabit Network Adapter", HWTYPE_AQ2, 1661 1.43 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_ALL | AQ_LINK_10M 1662 1.43 ryo }, 1663 1.43 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC113CS, 1664 1.43 ryo "Aquantia AQC113CS 10 Gigabit Network Adapter", HWTYPE_AQ2, 1665 1.43 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_ALL | AQ_LINK_10M 1666 1.43 ryo }, 1667 1.43 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC114CS, 1668 1.43 ryo "Aquantia AQC114CS 5 Gigabit Network Adapter", HWTYPE_AQ2, 1669 1.43 ryo AQ_MEDIA_TYPE_TP, 1670 1.43 ryo AQ_LINK_10M | AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G 1671 1.43 ryo }, 1672 1.43 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC115C, 1673 1.43 ryo "Aquantia AQC115C 2.5 Gigabit Network Adapter", HWTYPE_AQ2, 1674 1.43 ryo AQ_MEDIA_TYPE_TP, 1675 1.43 ryo AQ_LINK_10M | AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 1676 1.43 ryo }, 1677 1.43 ryo { PCI_VENDOR_AQUANTIA, PCI_PRODUCT_AQUANTIA_AQC116C, 1678 1.43 ryo "Aquantia AQC116C Gigabit Network Adapter", HWTYPE_AQ2, 1679 1.43 ryo AQ_MEDIA_TYPE_TP, AQ_LINK_10M | AQ_LINK_100M | AQ_LINK_1G 1680 1.1 ryo } 1681 1.1 ryo }; 1682 1.1 ryo 1683 1.1 ryo static const struct aq_product * 1684 1.1 ryo aq_lookup(const struct pci_attach_args *pa) 1685 1.1 ryo { 1686 1.1 ryo unsigned int i; 1687 1.1 ryo 1688 1.1 ryo for (i = 0; i < __arraycount(aq_products); i++) { 1689 1.1 ryo if (PCI_VENDOR(pa->pa_id) == aq_products[i].aq_vendor && 1690 1.1 ryo PCI_PRODUCT(pa->pa_id) == aq_products[i].aq_product) 1691 1.1 ryo return &aq_products[i]; 1692 1.1 ryo } 1693 1.1 ryo return NULL; 1694 1.1 ryo } 1695 1.1 ryo 1696 1.1 ryo static int 1697 1.1 ryo aq_match(device_t parent, cfdata_t cf, void *aux) 1698 1.1 ryo { 1699 1.32 skrll struct pci_attach_args * const pa = aux; 1700 1.1 ryo 1701 1.1 ryo if (aq_lookup(pa) != NULL) 1702 1.1 ryo return 1; 1703 1.1 ryo 1704 1.1 ryo return 0; 1705 1.1 ryo } 1706 1.1 ryo 1707 1.1 ryo static void 1708 1.1 ryo aq_attach(device_t parent, device_t self, void *aux) 1709 1.1 ryo { 1710 1.32 skrll struct aq_softc * const sc = device_private(self); 1711 1.32 skrll struct pci_attach_args * const pa = aux; 1712 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 1713 1.1 ryo pci_chipset_tag_t pc; 1714 1.1 ryo pcitag_t tag; 1715 1.1 ryo pcireg_t command, memtype, bar; 1716 1.1 ryo const struct aq_product *aqp; 1717 1.1 ryo int error; 1718 1.1 ryo 1719 1.1 ryo sc->sc_dev = self; 1720 1.1 ryo mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NET); 1721 1.4 ryo mutex_init(&sc->sc_mpi_mutex, MUTEX_DEFAULT, IPL_NET); 1722 1.1 ryo 1723 1.1 ryo sc->sc_pc = pc = pa->pa_pc; 1724 1.1 ryo sc->sc_pcitag = tag = pa->pa_tag; 1725 1.1 ryo sc->sc_dmat = pci_dma64_available(pa) ? pa->pa_dmat64 : pa->pa_dmat; 1726 1.1 ryo 1727 1.1 ryo command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 1728 1.1 ryo command |= PCI_COMMAND_MASTER_ENABLE; 1729 1.1 ryo pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, command); 1730 1.1 ryo 1731 1.1 ryo sc->sc_product = PCI_PRODUCT(pa->pa_id); 1732 1.1 ryo sc->sc_revision = PCI_REVISION(pa->pa_class); 1733 1.1 ryo 1734 1.1 ryo aqp = aq_lookup(pa); 1735 1.1 ryo KASSERT(aqp != NULL); 1736 1.1 ryo 1737 1.1 ryo pci_aprint_devinfo_fancy(pa, "Ethernet controller", aqp->aq_name, 1); 1738 1.1 ryo 1739 1.1 ryo bar = pci_conf_read(pc, tag, PCI_BAR(0)); 1740 1.1 ryo if ((PCI_MAPREG_MEM_ADDR(bar) == 0) || 1741 1.1 ryo (PCI_MAPREG_TYPE(bar) != PCI_MAPREG_TYPE_MEM)) { 1742 1.1 ryo aprint_error_dev(sc->sc_dev, "wrong BAR type\n"); 1743 1.1 ryo return; 1744 1.1 ryo } 1745 1.1 ryo memtype = pci_mapreg_type(pc, tag, PCI_BAR(0)); 1746 1.1 ryo if (pci_mapreg_map(pa, PCI_BAR(0), memtype, 0, &sc->sc_iot, &sc->sc_ioh, 1747 1.1 ryo NULL, &sc->sc_iosize) != 0) { 1748 1.1 ryo aprint_error_dev(sc->sc_dev, "unable to map register\n"); 1749 1.1 ryo return; 1750 1.1 ryo } 1751 1.1 ryo 1752 1.43 ryo switch (aqp->aq_hwtype) { 1753 1.43 ryo case HWTYPE_AQ1: 1754 1.43 ryo error = aq1_fw_reboot(sc); 1755 1.43 ryo break; 1756 1.43 ryo case HWTYPE_AQ2: 1757 1.43 ryo error = aq2_fw_reboot(sc); 1758 1.43 ryo break; 1759 1.43 ryo default: 1760 1.43 ryo error = ENOTSUP; 1761 1.43 ryo break; 1762 1.43 ryo } 1763 1.31 ryo if (error != 0) 1764 1.31 ryo goto attach_failure; 1765 1.31 ryo 1766 1.1 ryo /* max queue num is 8, and must be 2^n */ 1767 1.1 ryo if (ncpu >= 8) 1768 1.1 ryo sc->sc_nqueues = 8; 1769 1.1 ryo else if (ncpu >= 4) 1770 1.1 ryo sc->sc_nqueues = 4; 1771 1.1 ryo else if (ncpu >= 2) 1772 1.1 ryo sc->sc_nqueues = 2; 1773 1.1 ryo else 1774 1.1 ryo sc->sc_nqueues = 1; 1775 1.1 ryo 1776 1.43 ryo sc->sc_tc_mode = (sc->sc_nqueues <= 4) ? 8 : 4; 1777 1.43 ryo sc->sc_tcs = 1; 1778 1.43 ryo 1779 1.1 ryo int msixcount = pci_msix_count(pa->pa_pc, pa->pa_tag); 1780 1.1 ryo #ifndef CONFIG_NO_TXRX_INDEPENDENT 1781 1.1 ryo if (msixcount >= (sc->sc_nqueues * 2 + 1)) { 1782 1.1 ryo /* TX intrs + RX intrs + LINKSTAT intrs */ 1783 1.1 ryo sc->sc_use_txrx_independent_intr = true; 1784 1.1 ryo sc->sc_msix = true; 1785 1.1 ryo } else if (msixcount >= (sc->sc_nqueues * 2)) { 1786 1.1 ryo /* TX intrs + RX intrs */ 1787 1.1 ryo sc->sc_use_txrx_independent_intr = true; 1788 1.1 ryo sc->sc_msix = true; 1789 1.1 ryo } else 1790 1.1 ryo #endif 1791 1.1 ryo if (msixcount >= (sc->sc_nqueues + 1)) { 1792 1.1 ryo /* TX/RX intrs LINKSTAT intrs */ 1793 1.1 ryo sc->sc_use_txrx_independent_intr = false; 1794 1.1 ryo sc->sc_msix = true; 1795 1.1 ryo } else if (msixcount >= sc->sc_nqueues) { 1796 1.1 ryo /* TX/RX intrs */ 1797 1.1 ryo sc->sc_use_txrx_independent_intr = false; 1798 1.47 mrg sc->sc_no_link_intr = true; 1799 1.1 ryo sc->sc_msix = true; 1800 1.1 ryo } else { 1801 1.1 ryo /* giving up using MSI-X */ 1802 1.1 ryo sc->sc_msix = false; 1803 1.1 ryo } 1804 1.1 ryo 1805 1.1 ryo aprint_debug_dev(sc->sc_dev, 1806 1.1 ryo "ncpu=%d, pci_msix_count=%d." 1807 1.1 ryo " allocate %d interrupts for %d%s queues%s\n", 1808 1.1 ryo ncpu, msixcount, 1809 1.1 ryo (sc->sc_use_txrx_independent_intr ? 1810 1.1 ryo (sc->sc_nqueues * 2) : sc->sc_nqueues) + 1811 1.47 mrg (sc->sc_no_link_intr ? 0 : 1), 1812 1.1 ryo sc->sc_nqueues, 1813 1.1 ryo sc->sc_use_txrx_independent_intr ? "*2" : "", 1814 1.47 mrg (sc->sc_no_link_intr) ? "" : ", and link status"); 1815 1.1 ryo 1816 1.1 ryo if (sc->sc_msix) 1817 1.47 mrg error = aq_setup_msix(sc, pa); 1818 1.1 ryo else 1819 1.1 ryo error = ENODEV; 1820 1.1 ryo 1821 1.1 ryo if (error != 0) { 1822 1.1 ryo /* if MSI-X failed, fallback to MSI with single queue */ 1823 1.1 ryo sc->sc_use_txrx_independent_intr = false; 1824 1.1 ryo sc->sc_msix = false; 1825 1.1 ryo sc->sc_nqueues = 1; 1826 1.47 mrg sc->sc_no_link_intr = false; 1827 1.47 mrg aprint_debug_dev(sc->sc_dev, "MSI-X failed: %d, trying MSI", 1828 1.47 mrg error); 1829 1.1 ryo error = aq_setup_legacy(sc, pa, PCI_INTR_TYPE_MSI); 1830 1.1 ryo } 1831 1.1 ryo if (error != 0) { 1832 1.1 ryo /* if MSI failed, fallback to INTx */ 1833 1.47 mrg aprint_debug_dev(sc->sc_dev, "MSI failed: %d, trying legacy", 1834 1.47 mrg error); 1835 1.1 ryo error = aq_setup_legacy(sc, pa, PCI_INTR_TYPE_INTX); 1836 1.1 ryo } 1837 1.1 ryo if (error != 0) 1838 1.31 ryo goto attach_failure; 1839 1.1 ryo 1840 1.33 skrll callout_init(&sc->sc_tick_ch, CALLOUT_MPSAFE); 1841 1.1 ryo callout_setfunc(&sc->sc_tick_ch, aq_tick, sc); 1842 1.1 ryo 1843 1.33 skrll char wqname[MAXCOMLEN]; 1844 1.33 skrll snprintf(wqname, sizeof(wqname), "%sReset", device_xname(sc->sc_dev)); 1845 1.33 skrll error = workqueue_create(&sc->sc_reset_wq, wqname, 1846 1.33 skrll aq_handle_reset_work, sc, PRI_SOFTNET, IPL_SOFTCLOCK, 1847 1.33 skrll WQ_MPSAFE); 1848 1.47 mrg if (error != 0) { 1849 1.33 skrll aprint_error_dev(sc->sc_dev, 1850 1.33 skrll "unable to create reset workqueue\n"); 1851 1.33 skrll goto attach_failure; 1852 1.33 skrll } 1853 1.33 skrll 1854 1.1 ryo sc->sc_intr_moderation_enable = CONFIG_INTR_MODERATION_ENABLE; 1855 1.1 ryo 1856 1.1 ryo if (sc->sc_msix && (sc->sc_nqueues > 1)) 1857 1.1 ryo sc->sc_rss_enable = true; 1858 1.1 ryo else 1859 1.1 ryo sc->sc_rss_enable = false; 1860 1.1 ryo 1861 1.1 ryo error = aq_txrx_rings_alloc(sc); 1862 1.1 ryo if (error != 0) 1863 1.1 ryo goto attach_failure; 1864 1.1 ryo 1865 1.43 ryo error = aq_hw_reset(sc); 1866 1.1 ryo if (error != 0) 1867 1.1 ryo goto attach_failure; 1868 1.1 ryo 1869 1.43 ryo error = sc->sc_fw_ops->get_mac_addr(sc); 1870 1.1 ryo if (error != 0) 1871 1.1 ryo goto attach_failure; 1872 1.1 ryo 1873 1.1 ryo aq_init_rss(sc); 1874 1.1 ryo 1875 1.1 ryo error = aq_hw_init(sc); /* initialize and interrupts */ 1876 1.1 ryo if (error != 0) 1877 1.1 ryo goto attach_failure; 1878 1.1 ryo 1879 1.1 ryo sc->sc_media_type = aqp->aq_media_type; 1880 1.1 ryo sc->sc_available_rates = aqp->aq_available_rates; 1881 1.1 ryo 1882 1.1 ryo sc->sc_ethercom.ec_ifmedia = &sc->sc_media; 1883 1.1 ryo ifmedia_init(&sc->sc_media, IFM_IMASK, 1884 1.1 ryo aq_ifmedia_change, aq_ifmedia_status); 1885 1.1 ryo aq_initmedia(sc); 1886 1.1 ryo 1887 1.1 ryo strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); 1888 1.1 ryo ifp->if_softc = sc; 1889 1.1 ryo ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 1890 1.20 ryo ifp->if_extflags = IFEF_MPSAFE; 1891 1.1 ryo ifp->if_baudrate = IF_Gbps(10); 1892 1.1 ryo ifp->if_init = aq_init; 1893 1.1 ryo ifp->if_ioctl = aq_ioctl; 1894 1.1 ryo if (sc->sc_msix && (sc->sc_nqueues > 1)) 1895 1.1 ryo ifp->if_transmit = aq_transmit; 1896 1.1 ryo ifp->if_start = aq_start; 1897 1.1 ryo ifp->if_stop = aq_stop; 1898 1.33 skrll ifp->if_watchdog = NULL; 1899 1.1 ryo IFQ_SET_READY(&ifp->if_snd); 1900 1.1 ryo 1901 1.1 ryo /* initialize capabilities */ 1902 1.1 ryo sc->sc_ethercom.ec_capabilities = 0; 1903 1.1 ryo sc->sc_ethercom.ec_capenable = 0; 1904 1.1 ryo #if notyet 1905 1.1 ryo /* TODO */ 1906 1.1 ryo sc->sc_ethercom.ec_capabilities |= ETHERCAP_EEE; 1907 1.1 ryo #endif 1908 1.1 ryo sc->sc_ethercom.ec_capabilities |= 1909 1.1 ryo ETHERCAP_JUMBO_MTU | 1910 1.1 ryo ETHERCAP_VLAN_MTU | 1911 1.10 ryo ETHERCAP_VLAN_HWTAGGING | 1912 1.10 ryo ETHERCAP_VLAN_HWFILTER; 1913 1.1 ryo sc->sc_ethercom.ec_capenable |= 1914 1.10 ryo ETHERCAP_VLAN_HWTAGGING | 1915 1.10 ryo ETHERCAP_VLAN_HWFILTER; 1916 1.1 ryo 1917 1.1 ryo ifp->if_capabilities = 0; 1918 1.1 ryo ifp->if_capenable = 0; 1919 1.1 ryo #ifdef CONFIG_LRO_SUPPORT 1920 1.1 ryo ifp->if_capabilities |= IFCAP_LRO; 1921 1.1 ryo ifp->if_capenable |= IFCAP_LRO; 1922 1.1 ryo #endif 1923 1.1 ryo #if notyet 1924 1.1 ryo /* TSO */ 1925 1.1 ryo ifp->if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6; 1926 1.1 ryo #endif 1927 1.1 ryo 1928 1.25 ryo /* TX hardware checksum offloading */ 1929 1.1 ryo ifp->if_capabilities |= IFCAP_CSUM_IPv4_Tx; 1930 1.1 ryo ifp->if_capabilities |= IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv6_Tx; 1931 1.1 ryo ifp->if_capabilities |= IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv6_Tx; 1932 1.25 ryo /* RX hardware checksum offloading */ 1933 1.1 ryo ifp->if_capabilities |= IFCAP_CSUM_IPv4_Rx; 1934 1.21 ryo ifp->if_capabilities |= IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_TCPv6_Rx; 1935 1.21 ryo ifp->if_capabilities |= IFCAP_CSUM_UDPv4_Rx | IFCAP_CSUM_UDPv6_Rx; 1936 1.1 ryo 1937 1.27 riastrad if_initialize(ifp); 1938 1.20 ryo ifp->if_percpuq = if_percpuq_create(ifp); 1939 1.1 ryo if_deferred_start_init(ifp, NULL); 1940 1.1 ryo ether_ifattach(ifp, sc->sc_enaddr.ether_addr_octet); 1941 1.10 ryo ether_set_vlan_cb(&sc->sc_ethercom, aq_vlan_cb); 1942 1.1 ryo ether_set_ifflags_cb(&sc->sc_ethercom, aq_ifflags_cb); 1943 1.20 ryo if_register(ifp); 1944 1.1 ryo 1945 1.37 riastrad /* only intr about link */ 1946 1.37 riastrad aq_enable_intr(sc, /*link*/true, /*txrx*/false); 1947 1.1 ryo 1948 1.1 ryo /* update media */ 1949 1.1 ryo aq_ifmedia_change(ifp); 1950 1.1 ryo 1951 1.4 ryo #if NSYSMON_ENVSYS > 0 1952 1.4 ryo /* temperature monitoring */ 1953 1.4 ryo if (sc->sc_fw_ops != NULL && sc->sc_fw_ops->get_temperature != NULL && 1954 1.43 ryo (((sc->sc_fw_caps & FW2X_CTRL_TEMPERATURE) != 0) || 1955 1.43 ryo HWTYPE_AQ2_P(sc))) { 1956 1.4 ryo sc->sc_sme = sysmon_envsys_create(); 1957 1.4 ryo sc->sc_sme->sme_name = device_xname(self); 1958 1.4 ryo sc->sc_sme->sme_cookie = sc; 1959 1.4 ryo sc->sc_sme->sme_flags = 0; 1960 1.4 ryo sc->sc_sme->sme_refresh = aq_temp_refresh; 1961 1.4 ryo sc->sc_sensor_temp.units = ENVSYS_STEMP; 1962 1.4 ryo sc->sc_sensor_temp.state = ENVSYS_SINVALID; 1963 1.4 ryo snprintf(sc->sc_sensor_temp.desc, ENVSYS_DESCLEN, "PHY"); 1964 1.4 ryo 1965 1.4 ryo sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor_temp); 1966 1.26 mlelstv if (sysmon_envsys_register(sc->sc_sme)) { 1967 1.26 mlelstv sysmon_envsys_destroy(sc->sc_sme); 1968 1.26 mlelstv sc->sc_sme = NULL; 1969 1.47 mrg aprint_debug_dev(sc->sc_dev, "failed to create envsys"); 1970 1.47 mrg error = EINVAL; 1971 1.26 mlelstv goto attach_failure; 1972 1.26 mlelstv } 1973 1.4 ryo 1974 1.4 ryo /* 1975 1.4 ryo * for unknown reasons, the first call of fw2x_get_temperature() 1976 1.4 ryo * will always fail (firmware matter?), so run once now. 1977 1.4 ryo */ 1978 1.4 ryo aq_temp_refresh(sc->sc_sme, &sc->sc_sensor_temp); 1979 1.4 ryo } 1980 1.4 ryo #endif 1981 1.4 ryo 1982 1.1 ryo #ifdef AQ_EVENT_COUNTERS 1983 1.1 ryo /* get starting statistics values */ 1984 1.1 ryo if (sc->sc_fw_ops != NULL && sc->sc_fw_ops->get_stats != NULL && 1985 1.1 ryo sc->sc_fw_ops->get_stats(sc, &sc->sc_statistics[0]) == 0) { 1986 1.1 ryo sc->sc_poll_statistics = true; 1987 1.1 ryo } 1988 1.1 ryo 1989 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, uprc, "RX unicast packet"); 1990 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, bprc, "RX broadcast packet"); 1991 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, mprc, "RX multicast packet"); 1992 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, erpr, "RX error packet"); 1993 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, ubrc, "RX unicast bytes"); 1994 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, bbrc, "RX broadcast bytes"); 1995 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, mbrc, "RX multicast bytes"); 1996 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, prc, "RX good packet"); 1997 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, uptc, "TX unicast packet"); 1998 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, bptc, "TX broadcast packet"); 1999 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, mptc, "TX multicast packet"); 2000 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, erpt, "TX error packet"); 2001 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, ubtc, "TX unicast bytes"); 2002 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, bbtc, "TX broadcast bytes"); 2003 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, mbtc, "TX multicast bytes"); 2004 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, ptc, "TX good packet"); 2005 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, dpc, "DMA drop packet"); 2006 1.1 ryo AQ_EVCNT_ATTACH_MISC(sc, cprc, "RX coalesced packet"); 2007 1.1 ryo #endif 2008 1.1 ryo 2009 1.29 msaitoh if (pmf_device_register(self, NULL, NULL)) 2010 1.29 msaitoh pmf_class_network_register(self, ifp); 2011 1.29 msaitoh else 2012 1.29 msaitoh aprint_error_dev(self, "couldn't establish power handler\n"); 2013 1.29 msaitoh 2014 1.1 ryo return; 2015 1.1 ryo 2016 1.1 ryo attach_failure: 2017 1.47 mrg aprint_debug_dev(sc->sc_dev, "attach failed: %d", error); 2018 1.1 ryo aq_detach(self, 0); 2019 1.1 ryo } 2020 1.1 ryo 2021 1.1 ryo static int 2022 1.1 ryo aq_detach(device_t self, int flags __unused) 2023 1.1 ryo { 2024 1.32 skrll struct aq_softc * const sc = device_private(self); 2025 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 2026 1.32 skrll int i; 2027 1.1 ryo 2028 1.41 ryo if (sc->sc_dev == NULL) 2029 1.41 ryo return 0; 2030 1.41 ryo 2031 1.1 ryo if (sc->sc_iosize != 0) { 2032 1.1 ryo if (ifp->if_softc != NULL) { 2033 1.35 skrll IFNET_LOCK(ifp); 2034 1.35 skrll aq_stop(ifp, 1); 2035 1.35 skrll IFNET_UNLOCK(ifp); 2036 1.1 ryo } 2037 1.1 ryo 2038 1.1 ryo for (i = 0; i < AQ_NINTR_MAX; i++) { 2039 1.1 ryo if (sc->sc_ihs[i] != NULL) { 2040 1.1 ryo pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]); 2041 1.1 ryo sc->sc_ihs[i] = NULL; 2042 1.1 ryo } 2043 1.1 ryo } 2044 1.1 ryo if (sc->sc_nintrs > 0) { 2045 1.41 ryo callout_stop(&sc->sc_tick_ch); 2046 1.41 ryo 2047 1.1 ryo pci_intr_release(sc->sc_pc, sc->sc_intrs, 2048 1.1 ryo sc->sc_nintrs); 2049 1.1 ryo sc->sc_intrs = NULL; 2050 1.1 ryo sc->sc_nintrs = 0; 2051 1.1 ryo } 2052 1.1 ryo 2053 1.41 ryo if (sc->sc_reset_wq != NULL) { 2054 1.41 ryo workqueue_destroy(sc->sc_reset_wq); 2055 1.41 ryo sc->sc_reset_wq = NULL; 2056 1.41 ryo } 2057 1.41 ryo 2058 1.1 ryo aq_txrx_rings_free(sc); 2059 1.1 ryo 2060 1.1 ryo if (ifp->if_softc != NULL) { 2061 1.1 ryo ether_ifdetach(ifp); 2062 1.1 ryo if_detach(ifp); 2063 1.1 ryo } 2064 1.1 ryo 2065 1.1 ryo bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize); 2066 1.1 ryo sc->sc_iosize = 0; 2067 1.1 ryo } 2068 1.1 ryo 2069 1.4 ryo #if NSYSMON_ENVSYS > 0 2070 1.4 ryo if (sc->sc_sme != NULL) { 2071 1.4 ryo /* all sensors associated with this will also be detached */ 2072 1.4 ryo sysmon_envsys_unregister(sc->sc_sme); 2073 1.4 ryo } 2074 1.4 ryo #endif 2075 1.4 ryo 2076 1.1 ryo #ifdef AQ_EVENT_COUNTERS 2077 1.1 ryo AQ_EVCNT_DETACH(sc, uprc); 2078 1.1 ryo AQ_EVCNT_DETACH(sc, mprc); 2079 1.1 ryo AQ_EVCNT_DETACH(sc, bprc); 2080 1.1 ryo AQ_EVCNT_DETACH(sc, erpt); 2081 1.1 ryo AQ_EVCNT_DETACH(sc, uptc); 2082 1.1 ryo AQ_EVCNT_DETACH(sc, mptc); 2083 1.1 ryo AQ_EVCNT_DETACH(sc, bptc); 2084 1.1 ryo AQ_EVCNT_DETACH(sc, erpr); 2085 1.1 ryo AQ_EVCNT_DETACH(sc, mbtc); 2086 1.1 ryo AQ_EVCNT_DETACH(sc, bbtc); 2087 1.1 ryo AQ_EVCNT_DETACH(sc, mbrc); 2088 1.1 ryo AQ_EVCNT_DETACH(sc, bbrc); 2089 1.1 ryo AQ_EVCNT_DETACH(sc, ubrc); 2090 1.1 ryo AQ_EVCNT_DETACH(sc, ubtc); 2091 1.1 ryo AQ_EVCNT_DETACH(sc, ptc); 2092 1.1 ryo AQ_EVCNT_DETACH(sc, prc); 2093 1.1 ryo AQ_EVCNT_DETACH(sc, dpc); 2094 1.1 ryo AQ_EVCNT_DETACH(sc, cprc); 2095 1.1 ryo #endif 2096 1.1 ryo 2097 1.41 ryo if (sc->sc_ethercom.ec_ifmedia != NULL) { 2098 1.41 ryo ifmedia_fini(&sc->sc_media); 2099 1.41 ryo sc->sc_ethercom.ec_ifmedia = NULL; 2100 1.41 ryo } 2101 1.7 thorpej 2102 1.4 ryo mutex_destroy(&sc->sc_mpi_mutex); 2103 1.1 ryo mutex_destroy(&sc->sc_mutex); 2104 1.41 ryo sc->sc_dev = NULL; 2105 1.1 ryo 2106 1.1 ryo return 0; 2107 1.1 ryo } 2108 1.1 ryo 2109 1.1 ryo static int 2110 1.1 ryo aq_establish_intr(struct aq_softc *sc, int intno, kcpuset_t *affinity, 2111 1.1 ryo int (*func)(void *), void *arg, const char *xname) 2112 1.1 ryo { 2113 1.1 ryo char intrbuf[PCI_INTRSTR_LEN]; 2114 1.1 ryo pci_chipset_tag_t pc = sc->sc_pc; 2115 1.1 ryo void *vih; 2116 1.1 ryo const char *intrstr = NULL; 2117 1.1 ryo 2118 1.1 ryo intrstr = pci_intr_string(pc, sc->sc_intrs[intno], intrbuf, 2119 1.1 ryo sizeof(intrbuf)); 2120 1.1 ryo 2121 1.1 ryo pci_intr_setattr(pc, &sc->sc_intrs[intno], PCI_INTR_MPSAFE, true); 2122 1.1 ryo 2123 1.1 ryo vih = pci_intr_establish_xname(pc, sc->sc_intrs[intno], 2124 1.1 ryo IPL_NET, func, arg, xname); 2125 1.1 ryo if (vih == NULL) { 2126 1.1 ryo aprint_error_dev(sc->sc_dev, 2127 1.1 ryo "unable to establish MSI-X%s%s for %s\n", 2128 1.1 ryo intrstr ? " at " : "", 2129 1.1 ryo intrstr ? intrstr : "", xname); 2130 1.1 ryo return EIO; 2131 1.1 ryo } 2132 1.1 ryo sc->sc_ihs[intno] = vih; 2133 1.1 ryo 2134 1.1 ryo if (affinity != NULL) { 2135 1.1 ryo /* Round-robin affinity */ 2136 1.1 ryo kcpuset_zero(affinity); 2137 1.1 ryo kcpuset_set(affinity, intno % ncpu); 2138 1.1 ryo interrupt_distribute(vih, affinity, NULL); 2139 1.1 ryo } 2140 1.1 ryo 2141 1.1 ryo return 0; 2142 1.1 ryo } 2143 1.1 ryo 2144 1.1 ryo static int 2145 1.47 mrg aq_establish_msix_intr(struct aq_softc *sc) 2146 1.1 ryo { 2147 1.1 ryo kcpuset_t *affinity; 2148 1.1 ryo int error, intno, i; 2149 1.1 ryo char intr_xname[INTRDEVNAMEBUF]; 2150 1.1 ryo 2151 1.1 ryo kcpuset_create(&affinity, false); 2152 1.1 ryo 2153 1.1 ryo intno = 0; 2154 1.1 ryo 2155 1.47 mrg if (sc->sc_use_txrx_independent_intr) { 2156 1.1 ryo for (i = 0; i < sc->sc_nqueues; i++) { 2157 1.1 ryo snprintf(intr_xname, sizeof(intr_xname), "%s RX%d", 2158 1.1 ryo device_xname(sc->sc_dev), i); 2159 1.1 ryo sc->sc_rx_irq[i] = intno; 2160 1.1 ryo error = aq_establish_intr(sc, intno++, affinity, 2161 1.1 ryo aq_rx_intr, &sc->sc_queue[i].rxring, intr_xname); 2162 1.1 ryo if (error != 0) 2163 1.1 ryo goto fail; 2164 1.1 ryo } 2165 1.1 ryo for (i = 0; i < sc->sc_nqueues; i++) { 2166 1.1 ryo snprintf(intr_xname, sizeof(intr_xname), "%s TX%d", 2167 1.1 ryo device_xname(sc->sc_dev), i); 2168 1.1 ryo sc->sc_tx_irq[i] = intno; 2169 1.1 ryo error = aq_establish_intr(sc, intno++, affinity, 2170 1.1 ryo aq_tx_intr, &sc->sc_queue[i].txring, intr_xname); 2171 1.1 ryo if (error != 0) 2172 1.1 ryo goto fail; 2173 1.1 ryo } 2174 1.1 ryo } else { 2175 1.1 ryo for (i = 0; i < sc->sc_nqueues; i++) { 2176 1.1 ryo snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d", 2177 1.1 ryo device_xname(sc->sc_dev), i); 2178 1.1 ryo sc->sc_rx_irq[i] = intno; 2179 1.1 ryo sc->sc_tx_irq[i] = intno; 2180 1.1 ryo error = aq_establish_intr(sc, intno++, affinity, 2181 1.1 ryo aq_txrx_intr, &sc->sc_queue[i], intr_xname); 2182 1.1 ryo if (error != 0) 2183 1.1 ryo goto fail; 2184 1.1 ryo } 2185 1.1 ryo } 2186 1.1 ryo 2187 1.47 mrg if (!sc->sc_no_link_intr) { 2188 1.1 ryo snprintf(intr_xname, sizeof(intr_xname), "%s LINK", 2189 1.1 ryo device_xname(sc->sc_dev)); 2190 1.1 ryo sc->sc_linkstat_irq = intno; 2191 1.1 ryo error = aq_establish_intr(sc, intno++, affinity, 2192 1.1 ryo aq_link_intr, sc, intr_xname); 2193 1.1 ryo if (error != 0) 2194 1.1 ryo goto fail; 2195 1.1 ryo } 2196 1.1 ryo 2197 1.1 ryo kcpuset_destroy(affinity); 2198 1.1 ryo return 0; 2199 1.1 ryo 2200 1.1 ryo fail: 2201 1.1 ryo for (i = 0; i < AQ_NINTR_MAX; i++) { 2202 1.1 ryo if (sc->sc_ihs[i] != NULL) { 2203 1.1 ryo pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]); 2204 1.1 ryo sc->sc_ihs[i] = NULL; 2205 1.1 ryo } 2206 1.1 ryo } 2207 1.1 ryo 2208 1.1 ryo kcpuset_destroy(affinity); 2209 1.1 ryo return ENOMEM; 2210 1.1 ryo } 2211 1.1 ryo 2212 1.1 ryo static int 2213 1.47 mrg aq_setup_msix(struct aq_softc *sc, struct pci_attach_args *pa) 2214 1.1 ryo { 2215 1.47 mrg int nqueue = sc->sc_nqueues; 2216 1.47 mrg bool txrx_independent = sc->sc_use_txrx_independent_intr; 2217 1.47 mrg bool linkintr = !sc->sc_no_link_intr; 2218 1.1 ryo int error, nintr; 2219 1.1 ryo 2220 1.1 ryo if (txrx_independent) 2221 1.1 ryo nintr = nqueue * 2; 2222 1.1 ryo else 2223 1.1 ryo nintr = nqueue; 2224 1.1 ryo 2225 1.1 ryo if (linkintr) 2226 1.1 ryo nintr++; 2227 1.1 ryo 2228 1.1 ryo error = pci_msix_alloc_exact(pa, &sc->sc_intrs, nintr); 2229 1.1 ryo if (error != 0) { 2230 1.1 ryo aprint_error_dev(sc->sc_dev, 2231 1.1 ryo "failed to allocate MSI-X interrupts\n"); 2232 1.1 ryo goto fail; 2233 1.1 ryo } 2234 1.1 ryo 2235 1.47 mrg error = aq_establish_msix_intr(sc); 2236 1.1 ryo if (error == 0) { 2237 1.1 ryo sc->sc_nintrs = nintr; 2238 1.1 ryo } else { 2239 1.1 ryo pci_intr_release(sc->sc_pc, sc->sc_intrs, nintr); 2240 1.1 ryo sc->sc_nintrs = 0; 2241 1.1 ryo } 2242 1.1 ryo fail: 2243 1.1 ryo return error; 2244 1.1 ryo 2245 1.1 ryo } 2246 1.1 ryo 2247 1.1 ryo static int 2248 1.1 ryo aq_setup_legacy(struct aq_softc *sc, struct pci_attach_args *pa, 2249 1.1 ryo pci_intr_type_t inttype) 2250 1.1 ryo { 2251 1.1 ryo int counts[PCI_INTR_TYPE_SIZE]; 2252 1.1 ryo int error, nintr; 2253 1.1 ryo 2254 1.1 ryo nintr = 1; 2255 1.1 ryo 2256 1.1 ryo memset(counts, 0, sizeof(counts)); 2257 1.1 ryo counts[inttype] = nintr; 2258 1.1 ryo 2259 1.1 ryo error = pci_intr_alloc(pa, &sc->sc_intrs, counts, inttype); 2260 1.1 ryo if (error != 0) { 2261 1.1 ryo aprint_error_dev(sc->sc_dev, 2262 1.1 ryo "failed to allocate%s interrupts\n", 2263 1.1 ryo (inttype == PCI_INTR_TYPE_MSI) ? " MSI" : ""); 2264 1.1 ryo return error; 2265 1.1 ryo } 2266 1.1 ryo error = aq_establish_intr(sc, 0, NULL, aq_legacy_intr, sc, 2267 1.1 ryo device_xname(sc->sc_dev)); 2268 1.1 ryo if (error == 0) { 2269 1.1 ryo sc->sc_nintrs = nintr; 2270 1.1 ryo } else { 2271 1.1 ryo pci_intr_release(sc->sc_pc, sc->sc_intrs, nintr); 2272 1.1 ryo sc->sc_nintrs = 0; 2273 1.1 ryo } 2274 1.1 ryo return error; 2275 1.1 ryo } 2276 1.1 ryo 2277 1.1 ryo static void 2278 1.43 ryo aq1_global_software_reset(struct aq_softc *sc) 2279 1.1 ryo { 2280 1.1 ryo uint32_t v; 2281 1.1 ryo 2282 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_SYSCONTROL_REG, RX_SYSCONTROL_RESET_DIS, 0); 2283 1.1 ryo AQ_WRITE_REG_BIT(sc, TX_SYSCONTROL_REG, TX_SYSCONTROL_RESET_DIS, 0); 2284 1.1 ryo AQ_WRITE_REG_BIT(sc, FW_MPI_RESETCTRL_REG, 2285 1.1 ryo FW_MPI_RESETCTRL_RESET_DIS, 0); 2286 1.1 ryo 2287 1.1 ryo v = AQ_READ_REG(sc, AQ_FW_SOFTRESET_REG); 2288 1.1 ryo v &= ~AQ_FW_SOFTRESET_DIS; 2289 1.1 ryo v |= AQ_FW_SOFTRESET_RESET; 2290 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_SOFTRESET_REG, v); 2291 1.1 ryo } 2292 1.1 ryo 2293 1.1 ryo static int 2294 1.43 ryo aq1_mac_soft_reset_rbl(struct aq_softc *sc, aq_fw_bootloader_mode_t *mode) 2295 1.1 ryo { 2296 1.1 ryo int timo; 2297 1.1 ryo 2298 1.1 ryo aprint_debug_dev(sc->sc_dev, "RBL> MAC reset STARTED!\n"); 2299 1.1 ryo 2300 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e1); 2301 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_GLB_CPU_SEM_REG(0), 1); 2302 1.1 ryo AQ_WRITE_REG(sc, AQ_MBOXIF_POWER_GATING_CONTROL_REG, 0); 2303 1.1 ryo 2304 1.1 ryo /* MAC FW will reload PHY FW if 1E.1000.3 was cleaned - #undone */ 2305 1.1 ryo AQ_WRITE_REG(sc, FW_BOOT_EXIT_CODE_REG, RBL_STATUS_DEAD); 2306 1.1 ryo 2307 1.43 ryo aq1_global_software_reset(sc); 2308 1.1 ryo 2309 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e0); 2310 1.1 ryo 2311 1.1 ryo /* Wait for RBL to finish boot process. */ 2312 1.1 ryo #define RBL_TIMEOUT_MS 10000 2313 1.1 ryo uint16_t rbl_status; 2314 1.1 ryo for (timo = RBL_TIMEOUT_MS; timo > 0; timo--) { 2315 1.1 ryo rbl_status = AQ_READ_REG(sc, FW_BOOT_EXIT_CODE_REG) & 0xffff; 2316 1.1 ryo if (rbl_status != 0 && rbl_status != RBL_STATUS_DEAD) 2317 1.1 ryo break; 2318 1.1 ryo msec_delay(1); 2319 1.1 ryo } 2320 1.1 ryo if (timo <= 0) { 2321 1.1 ryo aprint_error_dev(sc->sc_dev, 2322 1.1 ryo "RBL> RBL restart failed: timeout\n"); 2323 1.1 ryo return EBUSY; 2324 1.1 ryo } 2325 1.1 ryo switch (rbl_status) { 2326 1.1 ryo case RBL_STATUS_SUCCESS: 2327 1.1 ryo if (mode != NULL) 2328 1.1 ryo *mode = FW_BOOT_MODE_RBL_FLASH; 2329 1.1 ryo aprint_debug_dev(sc->sc_dev, "RBL> reset complete! [Flash]\n"); 2330 1.1 ryo break; 2331 1.1 ryo case RBL_STATUS_HOST_BOOT: 2332 1.1 ryo if (mode != NULL) 2333 1.1 ryo *mode = FW_BOOT_MODE_RBL_HOST_BOOTLOAD; 2334 1.1 ryo aprint_debug_dev(sc->sc_dev, 2335 1.1 ryo "RBL> reset complete! [Host Bootload]\n"); 2336 1.1 ryo break; 2337 1.1 ryo case RBL_STATUS_FAILURE: 2338 1.1 ryo default: 2339 1.1 ryo aprint_error_dev(sc->sc_dev, 2340 1.1 ryo "unknown RBL status 0x%x\n", rbl_status); 2341 1.1 ryo return EBUSY; 2342 1.1 ryo } 2343 1.1 ryo 2344 1.1 ryo return 0; 2345 1.1 ryo } 2346 1.1 ryo 2347 1.1 ryo static int 2348 1.43 ryo aq1_mac_soft_reset_flb(struct aq_softc *sc) 2349 1.1 ryo { 2350 1.1 ryo uint32_t v; 2351 1.1 ryo int timo; 2352 1.1 ryo 2353 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x40e1); 2354 1.1 ryo /* 2355 1.1 ryo * Let Felicity hardware to complete SMBUS transaction before 2356 1.1 ryo * Global software reset. 2357 1.1 ryo */ 2358 1.1 ryo msec_delay(50); 2359 1.1 ryo 2360 1.1 ryo /* 2361 1.1 ryo * If SPI burst transaction was interrupted(before running the script), 2362 1.1 ryo * global software reset may not clear SPI interface. 2363 1.1 ryo * Clean it up manually before global reset. 2364 1.1 ryo */ 2365 1.1 ryo AQ_WRITE_REG(sc, AQ_GLB_NVR_PROVISIONING2_REG, 0x00a0); 2366 1.1 ryo AQ_WRITE_REG(sc, AQ_GLB_NVR_INTERFACE1_REG, 0x009f); 2367 1.1 ryo AQ_WRITE_REG(sc, AQ_GLB_NVR_INTERFACE1_REG, 0x809f); 2368 1.1 ryo msec_delay(50); 2369 1.1 ryo 2370 1.1 ryo v = AQ_READ_REG(sc, AQ_FW_SOFTRESET_REG); 2371 1.1 ryo v &= ~AQ_FW_SOFTRESET_DIS; 2372 1.1 ryo v |= AQ_FW_SOFTRESET_RESET; 2373 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_SOFTRESET_REG, v); 2374 1.1 ryo 2375 1.1 ryo /* Kickstart. */ 2376 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x80e0); 2377 1.1 ryo AQ_WRITE_REG(sc, AQ_MBOXIF_POWER_GATING_CONTROL_REG, 0); 2378 1.1 ryo if (!sc->sc_fast_start_enabled) 2379 1.1 ryo AQ_WRITE_REG(sc, AQ_GLB_GENERAL_PROVISIONING9_REG, 1); 2380 1.1 ryo 2381 1.1 ryo /* 2382 1.1 ryo * For the case SPI burst transaction was interrupted (by MCP reset 2383 1.1 ryo * above), wait until it is completed by hardware. 2384 1.1 ryo */ 2385 1.1 ryo msec_delay(50); 2386 1.1 ryo 2387 1.1 ryo /* MAC Kickstart */ 2388 1.1 ryo if (!sc->sc_fast_start_enabled) { 2389 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x180e0); 2390 1.1 ryo 2391 1.1 ryo uint32_t flb_status; 2392 1.1 ryo for (timo = 0; timo < 1000; timo++) { 2393 1.1 ryo flb_status = AQ_READ_REG(sc, 2394 1.1 ryo FW_MPI_DAISY_CHAIN_STATUS_REG) & 0x10; 2395 1.1 ryo if (flb_status != 0) 2396 1.1 ryo break; 2397 1.1 ryo msec_delay(1); 2398 1.1 ryo } 2399 1.1 ryo if (flb_status == 0) { 2400 1.1 ryo aprint_error_dev(sc->sc_dev, 2401 1.1 ryo "FLB> MAC kickstart failed: timed out\n"); 2402 1.1 ryo return ETIMEDOUT; 2403 1.1 ryo } 2404 1.1 ryo aprint_debug_dev(sc->sc_dev, 2405 1.1 ryo "FLB> MAC kickstart done, %d ms\n", timo); 2406 1.1 ryo /* FW reset */ 2407 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_GLB_CTL2_REG, 0x80e0); 2408 1.1 ryo /* 2409 1.1 ryo * Let Felicity hardware complete SMBUS transaction before 2410 1.1 ryo * Global software reset. 2411 1.1 ryo */ 2412 1.1 ryo msec_delay(50); 2413 1.1 ryo sc->sc_fast_start_enabled = true; 2414 1.1 ryo } 2415 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_GLB_CPU_SEM_REG(0), 1); 2416 1.1 ryo 2417 1.1 ryo /* PHY Kickstart: #undone */ 2418 1.43 ryo aq1_global_software_reset(sc); 2419 1.1 ryo 2420 1.1 ryo for (timo = 0; timo < 1000; timo++) { 2421 1.1 ryo if (AQ_READ_REG(sc, AQ_FW_VERSION_REG) != 0) 2422 1.1 ryo break; 2423 1.1 ryo msec_delay(10); 2424 1.1 ryo } 2425 1.1 ryo if (timo >= 1000) { 2426 1.1 ryo aprint_error_dev(sc->sc_dev, "FLB> Global Soft Reset failed\n"); 2427 1.1 ryo return ETIMEDOUT; 2428 1.1 ryo } 2429 1.1 ryo aprint_debug_dev(sc->sc_dev, "FLB> F/W restart: %d ms\n", timo * 10); 2430 1.1 ryo return 0; 2431 1.1 ryo 2432 1.1 ryo } 2433 1.1 ryo 2434 1.1 ryo static int 2435 1.43 ryo aq1_mac_soft_reset(struct aq_softc *sc, aq_fw_bootloader_mode_t *mode) 2436 1.1 ryo { 2437 1.1 ryo if (sc->sc_rbl_enabled) 2438 1.43 ryo return aq1_mac_soft_reset_rbl(sc, mode); 2439 1.1 ryo 2440 1.1 ryo if (mode != NULL) 2441 1.1 ryo *mode = FW_BOOT_MODE_FLB; 2442 1.43 ryo return aq1_mac_soft_reset_flb(sc); 2443 1.1 ryo } 2444 1.1 ryo 2445 1.1 ryo static int 2446 1.43 ryo aq1_fw_read_version(struct aq_softc *sc) 2447 1.1 ryo { 2448 1.1 ryo int i, error = EBUSY; 2449 1.1 ryo #define MAC_FW_START_TIMEOUT_MS 10000 2450 1.1 ryo for (i = 0; i < MAC_FW_START_TIMEOUT_MS; i++) { 2451 1.1 ryo sc->sc_fw_version = AQ_READ_REG(sc, AQ_FW_VERSION_REG); 2452 1.1 ryo if (sc->sc_fw_version != 0) { 2453 1.1 ryo error = 0; 2454 1.1 ryo break; 2455 1.1 ryo } 2456 1.1 ryo delay(1000); 2457 1.1 ryo } 2458 1.1 ryo return error; 2459 1.1 ryo } 2460 1.1 ryo 2461 1.1 ryo static int 2462 1.43 ryo aq1_fw_reboot(struct aq_softc *sc) 2463 1.1 ryo { 2464 1.1 ryo uint32_t ver, v, bootExitCode; 2465 1.1 ryo int i, error; 2466 1.1 ryo 2467 1.1 ryo ver = AQ_READ_REG(sc, AQ_FW_VERSION_REG); 2468 1.1 ryo 2469 1.1 ryo for (i = 1000; i > 0; i--) { 2470 1.1 ryo v = AQ_READ_REG(sc, FW_MPI_DAISY_CHAIN_STATUS_REG); 2471 1.1 ryo bootExitCode = AQ_READ_REG(sc, FW_BOOT_EXIT_CODE_REG); 2472 1.1 ryo if (v != 0x06000000 || bootExitCode != 0) 2473 1.1 ryo break; 2474 1.1 ryo } 2475 1.1 ryo if (i <= 0) { 2476 1.1 ryo aprint_error_dev(sc->sc_dev, 2477 1.1 ryo "F/W reset failed. Neither RBL nor FLB started\n"); 2478 1.1 ryo return ETIMEDOUT; 2479 1.1 ryo } 2480 1.1 ryo sc->sc_rbl_enabled = (bootExitCode != 0); 2481 1.1 ryo 2482 1.1 ryo /* 2483 1.1 ryo * Having FW version 0 is an indicator that cold start 2484 1.1 ryo * is in progress. This means two things: 2485 1.1 ryo * 1) Driver have to wait for FW/HW to finish boot (500ms giveup) 2486 1.1 ryo * 2) Driver may skip reset sequence and save time. 2487 1.1 ryo */ 2488 1.1 ryo if (sc->sc_fast_start_enabled && (ver != 0)) { 2489 1.43 ryo error = aq1_fw_read_version(sc); 2490 1.1 ryo /* Skip reset as it just completed */ 2491 1.1 ryo if (error == 0) 2492 1.1 ryo return 0; 2493 1.1 ryo } 2494 1.1 ryo 2495 1.1 ryo aq_fw_bootloader_mode_t mode = FW_BOOT_MODE_UNKNOWN; 2496 1.43 ryo error = aq1_mac_soft_reset(sc, &mode); 2497 1.1 ryo if (error != 0) { 2498 1.1 ryo aprint_error_dev(sc->sc_dev, "MAC reset failed: %d\n", error); 2499 1.43 ryo return ENXIO; 2500 1.1 ryo } 2501 1.1 ryo 2502 1.1 ryo switch (mode) { 2503 1.1 ryo case FW_BOOT_MODE_FLB: 2504 1.1 ryo aprint_debug_dev(sc->sc_dev, 2505 1.1 ryo "FLB> F/W successfully loaded from flash.\n"); 2506 1.1 ryo sc->sc_flash_present = true; 2507 1.43 ryo break; 2508 1.1 ryo case FW_BOOT_MODE_RBL_FLASH: 2509 1.1 ryo aprint_debug_dev(sc->sc_dev, 2510 1.1 ryo "RBL> F/W loaded from flash. Host Bootload disabled.\n"); 2511 1.1 ryo sc->sc_flash_present = true; 2512 1.43 ryo break; 2513 1.1 ryo case FW_BOOT_MODE_UNKNOWN: 2514 1.1 ryo aprint_error_dev(sc->sc_dev, 2515 1.1 ryo "F/W bootload error: unknown bootloader type\n"); 2516 1.1 ryo return ENOTSUP; 2517 1.1 ryo case FW_BOOT_MODE_RBL_HOST_BOOTLOAD: 2518 1.1 ryo aprint_debug_dev(sc->sc_dev, "RBL> Host Bootload mode\n"); 2519 1.43 ryo aprint_error_dev(sc->sc_dev, 2520 1.43 ryo "RBL> F/W Host Bootload not implemented\n"); 2521 1.43 ryo return ENOTSUP; 2522 1.1 ryo } 2523 1.1 ryo 2524 1.43 ryo error = aq1_fw_read_version(sc); 2525 1.43 ryo if (error != 0) 2526 1.43 ryo return error; 2527 1.43 ryo 2528 1.43 ryo error = aq1_fw_version_init(sc); 2529 1.43 ryo if (error != 0) 2530 1.43 ryo return error; 2531 1.43 ryo 2532 1.43 ryo error = aq1_hw_init_ucp(sc); 2533 1.43 ryo if (error < 0) 2534 1.43 ryo return error; 2535 1.43 ryo 2536 1.43 ryo KASSERT(sc->sc_mbox_addr != 0); 2537 1.43 ryo return 0; 2538 1.1 ryo } 2539 1.1 ryo 2540 1.1 ryo static int 2541 1.1 ryo aq_hw_reset(struct aq_softc *sc) 2542 1.1 ryo { 2543 1.1 ryo int error; 2544 1.1 ryo 2545 1.1 ryo /* disable irq */ 2546 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_RESET_DIS, 0); 2547 1.1 ryo 2548 1.1 ryo /* apply */ 2549 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_RESET_IRQ, 1); 2550 1.1 ryo 2551 1.1 ryo /* wait ack 10 times by 1ms */ 2552 1.1 ryo WAIT_FOR( 2553 1.1 ryo (AQ_READ_REG(sc, AQ_INTR_CTRL_REG) & AQ_INTR_CTRL_RESET_IRQ) == 0, 2554 1.1 ryo 1000, 10, &error); 2555 1.1 ryo if (error != 0) { 2556 1.1 ryo aprint_error_dev(sc->sc_dev, 2557 1.1 ryo "atlantic: IRQ reset failed: %d\n", error); 2558 1.1 ryo return error; 2559 1.1 ryo } 2560 1.1 ryo 2561 1.1 ryo return sc->sc_fw_ops->reset(sc); 2562 1.1 ryo } 2563 1.1 ryo 2564 1.1 ryo static int 2565 1.43 ryo aq1_hw_init_ucp(struct aq_softc *sc) 2566 1.1 ryo { 2567 1.1 ryo int timo; 2568 1.1 ryo 2569 1.1 ryo if (FW_VERSION_MAJOR(sc) == 1) { 2570 1.30 ryo if (AQ_READ_REG(sc, FW1X_MPI_INIT2_REG) == 0) 2571 1.30 ryo AQ_WRITE_REG(sc, FW1X_MPI_INIT2_REG, 0xfefefefe); 2572 1.1 ryo AQ_WRITE_REG(sc, FW1X_MPI_INIT1_REG, 0); 2573 1.1 ryo } 2574 1.1 ryo 2575 1.30 ryo /* Wait a maximum of 10sec. It usually takes about 5sec. */ 2576 1.30 ryo for (timo = 10000; timo > 0; timo--) { 2577 1.1 ryo sc->sc_mbox_addr = AQ_READ_REG(sc, FW_MPI_MBOX_ADDR_REG); 2578 1.1 ryo if (sc->sc_mbox_addr != 0) 2579 1.1 ryo break; 2580 1.1 ryo delay(1000); 2581 1.1 ryo } 2582 1.30 ryo if (sc->sc_mbox_addr == 0) { 2583 1.30 ryo aprint_error_dev(sc->sc_dev, "cannot get mbox addr\n"); 2584 1.30 ryo return ETIMEDOUT; 2585 1.30 ryo } 2586 1.1 ryo 2587 1.1 ryo #define AQ_FW_MIN_VERSION 0x01050006 2588 1.1 ryo #define AQ_FW_MIN_VERSION_STR "1.5.6" 2589 1.1 ryo if (sc->sc_fw_version < AQ_FW_MIN_VERSION) { 2590 1.1 ryo aprint_error_dev(sc->sc_dev, 2591 1.1 ryo "atlantic: wrong FW version: " AQ_FW_MIN_VERSION_STR 2592 1.1 ryo " or later required, this is %d.%d.%d\n", 2593 1.1 ryo FW_VERSION_MAJOR(sc), 2594 1.1 ryo FW_VERSION_MINOR(sc), 2595 1.1 ryo FW_VERSION_BUILD(sc)); 2596 1.1 ryo return ENOTSUP; 2597 1.1 ryo } 2598 1.1 ryo 2599 1.1 ryo return 0; 2600 1.1 ryo } 2601 1.1 ryo 2602 1.1 ryo static int 2603 1.43 ryo aq1_fw_version_init(struct aq_softc *sc) 2604 1.1 ryo { 2605 1.1 ryo int error = 0; 2606 1.1 ryo char fw_vers[sizeof("F/W version xxxxx.xxxxx.xxxxx")]; 2607 1.1 ryo 2608 1.1 ryo if (FW_VERSION_MAJOR(sc) == 1) { 2609 1.1 ryo sc->sc_fw_ops = &aq_fw1x_ops; 2610 1.1 ryo } else if ((FW_VERSION_MAJOR(sc) == 2) || (FW_VERSION_MAJOR(sc) == 3)) { 2611 1.1 ryo sc->sc_fw_ops = &aq_fw2x_ops; 2612 1.1 ryo } else { 2613 1.1 ryo aprint_error_dev(sc->sc_dev, 2614 1.1 ryo "Unsupported F/W version %d.%d.%d\n", 2615 1.1 ryo FW_VERSION_MAJOR(sc), FW_VERSION_MINOR(sc), 2616 1.1 ryo FW_VERSION_BUILD(sc)); 2617 1.1 ryo return ENOTSUP; 2618 1.1 ryo } 2619 1.1 ryo snprintf(fw_vers, sizeof(fw_vers), "F/W version %d.%d.%d", 2620 1.1 ryo FW_VERSION_MAJOR(sc), FW_VERSION_MINOR(sc), FW_VERSION_BUILD(sc)); 2621 1.1 ryo 2622 1.1 ryo /* detect revision */ 2623 1.1 ryo uint32_t hwrev = AQ_READ_REG(sc, AQ_HW_REVISION_REG); 2624 1.1 ryo switch (hwrev & 0x0000000f) { 2625 1.1 ryo case 0x01: 2626 1.1 ryo aprint_normal_dev(sc->sc_dev, "Atlantic revision A0, %s\n", 2627 1.1 ryo fw_vers); 2628 1.43 ryo sc->sc_features |= FEATURES_AQ1_REV_A0 | 2629 1.1 ryo FEATURES_MPI_AQ | FEATURES_MIPS; 2630 1.43 ryo sc->sc_max_mtu = AQ1_JUMBO_MTU_REV_A; 2631 1.1 ryo break; 2632 1.1 ryo case 0x02: 2633 1.1 ryo aprint_normal_dev(sc->sc_dev, "Atlantic revision B0, %s\n", 2634 1.1 ryo fw_vers); 2635 1.43 ryo sc->sc_features |= FEATURES_AQ1_REV_B0 | 2636 1.1 ryo FEATURES_MPI_AQ | FEATURES_MIPS | 2637 1.1 ryo FEATURES_TPO2 | FEATURES_RPF2; 2638 1.43 ryo sc->sc_max_mtu = AQ1_JUMBO_MTU_REV_B; 2639 1.1 ryo break; 2640 1.1 ryo case 0x0A: 2641 1.1 ryo aprint_normal_dev(sc->sc_dev, "Atlantic revision B1, %s\n", 2642 1.1 ryo fw_vers); 2643 1.43 ryo sc->sc_features |= FEATURES_AQ1_REV_B1 | 2644 1.1 ryo FEATURES_MPI_AQ | FEATURES_MIPS | 2645 1.1 ryo FEATURES_TPO2 | FEATURES_RPF2; 2646 1.43 ryo sc->sc_max_mtu = AQ1_JUMBO_MTU_REV_B; 2647 1.1 ryo break; 2648 1.1 ryo default: 2649 1.1 ryo aprint_error_dev(sc->sc_dev, 2650 1.1 ryo "Unknown revision (0x%08x)\n", hwrev); 2651 1.23 ryo sc->sc_features = 0; 2652 1.23 ryo sc->sc_max_mtu = ETHERMTU; 2653 1.1 ryo error = ENOTSUP; 2654 1.1 ryo break; 2655 1.1 ryo } 2656 1.1 ryo return error; 2657 1.1 ryo } 2658 1.1 ryo 2659 1.1 ryo static int 2660 1.1 ryo fw1x_reset(struct aq_softc *sc) 2661 1.1 ryo { 2662 1.1 ryo struct aq_mailbox_header mbox; 2663 1.1 ryo const int retryCount = 1000; 2664 1.1 ryo uint32_t tid0; 2665 1.1 ryo int i; 2666 1.1 ryo 2667 1.1 ryo tid0 = ~0; /*< Initial value of MBOX transactionId. */ 2668 1.1 ryo 2669 1.1 ryo for (i = 0; i < retryCount; ++i) { 2670 1.1 ryo /* 2671 1.1 ryo * Read the beginning of Statistics structure to capture 2672 1.1 ryo * the Transaction ID. 2673 1.1 ryo */ 2674 1.43 ryo aq1_fw_downld_dwords(sc, sc->sc_mbox_addr, 2675 1.1 ryo (uint32_t *)&mbox, sizeof(mbox) / sizeof(uint32_t)); 2676 1.1 ryo 2677 1.1 ryo /* Successfully read the stats. */ 2678 1.1 ryo if (tid0 == ~0U) { 2679 1.1 ryo /* We have read the initial value. */ 2680 1.1 ryo tid0 = mbox.transaction_id; 2681 1.1 ryo continue; 2682 1.1 ryo } else if (mbox.transaction_id != tid0) { 2683 1.1 ryo /* 2684 1.1 ryo * Compare transaction ID to initial value. 2685 1.1 ryo * If it's different means f/w is alive. 2686 1.1 ryo * We're done. 2687 1.1 ryo */ 2688 1.1 ryo return 0; 2689 1.1 ryo } 2690 1.1 ryo 2691 1.1 ryo /* 2692 1.1 ryo * Transaction ID value haven't changed since last time. 2693 1.1 ryo * Try reading the stats again. 2694 1.1 ryo */ 2695 1.1 ryo delay(10); 2696 1.1 ryo } 2697 1.1 ryo aprint_error_dev(sc->sc_dev, "F/W 1.x reset finalize timeout\n"); 2698 1.1 ryo return EBUSY; 2699 1.1 ryo } 2700 1.1 ryo 2701 1.1 ryo static int 2702 1.1 ryo fw1x_set_mode(struct aq_softc *sc, aq_hw_fw_mpi_state_t mode, 2703 1.1 ryo aq_link_speed_t speed, aq_link_fc_t fc, aq_link_eee_t eee) 2704 1.1 ryo { 2705 1.1 ryo uint32_t mpictrl = 0; 2706 1.1 ryo uint32_t mpispeed = 0; 2707 1.1 ryo 2708 1.1 ryo if (speed & AQ_LINK_10G) 2709 1.1 ryo mpispeed |= FW1X_CTRL_10G; 2710 1.1 ryo if (speed & AQ_LINK_5G) 2711 1.1 ryo mpispeed |= (FW1X_CTRL_5G | FW1X_CTRL_5GSR); 2712 1.1 ryo if (speed & AQ_LINK_2G5) 2713 1.1 ryo mpispeed |= FW1X_CTRL_2G5; 2714 1.1 ryo if (speed & AQ_LINK_1G) 2715 1.1 ryo mpispeed |= FW1X_CTRL_1G; 2716 1.1 ryo if (speed & AQ_LINK_100M) 2717 1.1 ryo mpispeed |= FW1X_CTRL_100M; 2718 1.1 ryo 2719 1.1 ryo mpictrl |= __SHIFTIN(mode, FW1X_MPI_STATE_MODE); 2720 1.1 ryo mpictrl |= __SHIFTIN(mpispeed, FW1X_MPI_STATE_SPEED); 2721 1.1 ryo AQ_WRITE_REG(sc, FW1X_MPI_CONTROL_REG, mpictrl); 2722 1.1 ryo return 0; 2723 1.1 ryo } 2724 1.1 ryo 2725 1.1 ryo static int 2726 1.1 ryo fw1x_get_mode(struct aq_softc *sc, aq_hw_fw_mpi_state_t *modep, 2727 1.1 ryo aq_link_speed_t *speedp, aq_link_fc_t *fcp, aq_link_eee_t *eeep) 2728 1.1 ryo { 2729 1.1 ryo uint32_t mpistate, mpi_speed; 2730 1.1 ryo aq_link_speed_t speed = AQ_LINK_NONE; 2731 1.1 ryo 2732 1.1 ryo mpistate = AQ_READ_REG(sc, FW1X_MPI_STATE_REG); 2733 1.1 ryo 2734 1.1 ryo if (modep != NULL) 2735 1.1 ryo *modep = __SHIFTOUT(mpistate, FW1X_MPI_STATE_MODE); 2736 1.1 ryo 2737 1.1 ryo mpi_speed = __SHIFTOUT(mpistate, FW1X_MPI_STATE_SPEED); 2738 1.1 ryo if (mpi_speed & FW1X_CTRL_10G) 2739 1.1 ryo speed = AQ_LINK_10G; 2740 1.1 ryo else if (mpi_speed & (FW1X_CTRL_5G|FW1X_CTRL_5GSR)) 2741 1.1 ryo speed = AQ_LINK_5G; 2742 1.1 ryo else if (mpi_speed & FW1X_CTRL_2G5) 2743 1.1 ryo speed = AQ_LINK_2G5; 2744 1.1 ryo else if (mpi_speed & FW1X_CTRL_1G) 2745 1.1 ryo speed = AQ_LINK_1G; 2746 1.1 ryo else if (mpi_speed & FW1X_CTRL_100M) 2747 1.1 ryo speed = AQ_LINK_100M; 2748 1.1 ryo 2749 1.1 ryo if (speedp != NULL) 2750 1.1 ryo *speedp = speed; 2751 1.1 ryo 2752 1.1 ryo if (fcp != NULL) 2753 1.1 ryo *fcp = AQ_FC_NONE; 2754 1.1 ryo 2755 1.1 ryo if (eeep != NULL) 2756 1.1 ryo *eeep = AQ_EEE_DISABLE; 2757 1.1 ryo 2758 1.1 ryo return 0; 2759 1.1 ryo } 2760 1.1 ryo 2761 1.1 ryo static int 2762 1.1 ryo fw1x_get_stats(struct aq_softc *sc, aq_hw_stats_s_t *stats) 2763 1.1 ryo { 2764 1.1 ryo int error; 2765 1.1 ryo 2766 1.43 ryo error = aq1_fw_downld_dwords(sc, 2767 1.1 ryo sc->sc_mbox_addr + offsetof(fw1x_mailbox_t, msm), (uint32_t *)stats, 2768 1.1 ryo sizeof(aq_hw_stats_s_t) / sizeof(uint32_t)); 2769 1.1 ryo if (error < 0) { 2770 1.1 ryo device_printf(sc->sc_dev, 2771 1.1 ryo "fw1x> download statistics data FAILED, error %d", error); 2772 1.1 ryo return error; 2773 1.1 ryo } 2774 1.1 ryo 2775 1.1 ryo stats->dpc = AQ_READ_REG(sc, RX_DMA_DROP_PKT_CNT_REG); 2776 1.1 ryo stats->cprc = AQ_READ_REG(sc, RX_DMA_COALESCED_PKT_CNT_REG); 2777 1.1 ryo return 0; 2778 1.1 ryo } 2779 1.1 ryo 2780 1.1 ryo static int 2781 1.1 ryo fw2x_reset(struct aq_softc *sc) 2782 1.1 ryo { 2783 1.1 ryo fw2x_capabilities_t caps = { 0 }; 2784 1.1 ryo int error; 2785 1.1 ryo 2786 1.43 ryo error = aq1_fw_downld_dwords(sc, 2787 1.1 ryo sc->sc_mbox_addr + offsetof(fw2x_mailbox_t, caps), 2788 1.1 ryo (uint32_t *)&caps, sizeof caps / sizeof(uint32_t)); 2789 1.1 ryo if (error != 0) { 2790 1.1 ryo aprint_error_dev(sc->sc_dev, 2791 1.1 ryo "fw2x> can't get F/W capabilities mask, error %d\n", 2792 1.1 ryo error); 2793 1.1 ryo return error; 2794 1.1 ryo } 2795 1.1 ryo sc->sc_fw_caps = caps.caps_lo | ((uint64_t)caps.caps_hi << 32); 2796 1.1 ryo 2797 1.1 ryo char buf[256]; 2798 1.1 ryo snprintb(buf, sizeof(buf), FW2X_SNPRINTB, sc->sc_fw_caps); 2799 1.1 ryo aprint_verbose_dev(sc->sc_dev, "fw2x> F/W capabilities=%s\n", buf); 2800 1.1 ryo 2801 1.1 ryo return 0; 2802 1.1 ryo } 2803 1.1 ryo 2804 1.1 ryo static int 2805 1.1 ryo fw2x_set_mode(struct aq_softc *sc, aq_hw_fw_mpi_state_t mode, 2806 1.1 ryo aq_link_speed_t speed, aq_link_fc_t fc, aq_link_eee_t eee) 2807 1.1 ryo { 2808 1.4 ryo uint64_t mpi_ctrl; 2809 1.4 ryo int error = 0; 2810 1.4 ryo 2811 1.4 ryo AQ_MPI_LOCK(sc); 2812 1.4 ryo 2813 1.4 ryo mpi_ctrl = AQ_READ64_REG(sc, FW2X_MPI_CONTROL_REG); 2814 1.1 ryo 2815 1.1 ryo switch (mode) { 2816 1.1 ryo case MPI_INIT: 2817 1.1 ryo mpi_ctrl &= ~FW2X_CTRL_RATE_MASK; 2818 1.1 ryo if (speed & AQ_LINK_10G) 2819 1.1 ryo mpi_ctrl |= FW2X_CTRL_RATE_10G; 2820 1.1 ryo if (speed & AQ_LINK_5G) 2821 1.1 ryo mpi_ctrl |= FW2X_CTRL_RATE_5G; 2822 1.1 ryo if (speed & AQ_LINK_2G5) 2823 1.1 ryo mpi_ctrl |= FW2X_CTRL_RATE_2G5; 2824 1.1 ryo if (speed & AQ_LINK_1G) 2825 1.1 ryo mpi_ctrl |= FW2X_CTRL_RATE_1G; 2826 1.1 ryo if (speed & AQ_LINK_100M) 2827 1.1 ryo mpi_ctrl |= FW2X_CTRL_RATE_100M; 2828 1.1 ryo 2829 1.1 ryo mpi_ctrl &= ~FW2X_CTRL_LINK_DROP; 2830 1.1 ryo 2831 1.1 ryo mpi_ctrl &= ~FW2X_CTRL_EEE_MASK; 2832 1.1 ryo if (eee == AQ_EEE_ENABLE) 2833 1.1 ryo mpi_ctrl |= FW2X_CTRL_EEE_MASK; 2834 1.1 ryo 2835 1.1 ryo mpi_ctrl &= ~(FW2X_CTRL_PAUSE | FW2X_CTRL_ASYMMETRIC_PAUSE); 2836 1.1 ryo if (fc & AQ_FC_RX) 2837 1.1 ryo mpi_ctrl |= FW2X_CTRL_PAUSE; 2838 1.1 ryo if (fc & AQ_FC_TX) 2839 1.1 ryo mpi_ctrl |= FW2X_CTRL_ASYMMETRIC_PAUSE; 2840 1.1 ryo break; 2841 1.1 ryo case MPI_DEINIT: 2842 1.1 ryo mpi_ctrl &= ~(FW2X_CTRL_RATE_MASK | FW2X_CTRL_EEE_MASK); 2843 1.1 ryo mpi_ctrl &= ~(FW2X_CTRL_PAUSE | FW2X_CTRL_ASYMMETRIC_PAUSE); 2844 1.1 ryo break; 2845 1.1 ryo default: 2846 1.1 ryo device_printf(sc->sc_dev, "fw2x> unknown MPI state %d\n", mode); 2847 1.4 ryo error = EINVAL; 2848 1.4 ryo goto failure; 2849 1.1 ryo } 2850 1.4 ryo AQ_WRITE64_REG(sc, FW2X_MPI_CONTROL_REG, mpi_ctrl); 2851 1.1 ryo 2852 1.4 ryo failure: 2853 1.4 ryo AQ_MPI_UNLOCK(sc); 2854 1.4 ryo return error; 2855 1.1 ryo } 2856 1.1 ryo 2857 1.1 ryo static int 2858 1.1 ryo fw2x_get_mode(struct aq_softc *sc, aq_hw_fw_mpi_state_t *modep, 2859 1.1 ryo aq_link_speed_t *speedp, aq_link_fc_t *fcp, aq_link_eee_t *eeep) 2860 1.1 ryo { 2861 1.1 ryo uint64_t mpi_state = AQ_READ64_REG(sc, FW2X_MPI_STATE_REG); 2862 1.1 ryo 2863 1.1 ryo if (modep != NULL) { 2864 1.1 ryo uint64_t mpi_ctrl = AQ_READ64_REG(sc, FW2X_MPI_CONTROL_REG); 2865 1.1 ryo if (mpi_ctrl & FW2X_CTRL_RATE_MASK) 2866 1.1 ryo *modep = MPI_INIT; 2867 1.1 ryo else 2868 1.1 ryo *modep = MPI_DEINIT; 2869 1.1 ryo } 2870 1.1 ryo 2871 1.1 ryo aq_link_speed_t speed = AQ_LINK_NONE; 2872 1.1 ryo if (mpi_state & FW2X_CTRL_RATE_10G) 2873 1.1 ryo speed = AQ_LINK_10G; 2874 1.1 ryo else if (mpi_state & FW2X_CTRL_RATE_5G) 2875 1.1 ryo speed = AQ_LINK_5G; 2876 1.1 ryo else if (mpi_state & FW2X_CTRL_RATE_2G5) 2877 1.1 ryo speed = AQ_LINK_2G5; 2878 1.1 ryo else if (mpi_state & FW2X_CTRL_RATE_1G) 2879 1.1 ryo speed = AQ_LINK_1G; 2880 1.1 ryo else if (mpi_state & FW2X_CTRL_RATE_100M) 2881 1.1 ryo speed = AQ_LINK_100M; 2882 1.1 ryo 2883 1.1 ryo if (speedp != NULL) 2884 1.1 ryo *speedp = speed; 2885 1.1 ryo 2886 1.1 ryo aq_link_fc_t fc = AQ_FC_NONE; 2887 1.1 ryo if (mpi_state & FW2X_CTRL_PAUSE) 2888 1.1 ryo fc |= AQ_FC_RX; 2889 1.1 ryo if (mpi_state & FW2X_CTRL_ASYMMETRIC_PAUSE) 2890 1.1 ryo fc |= AQ_FC_TX; 2891 1.1 ryo if (fcp != NULL) 2892 1.1 ryo *fcp = fc; 2893 1.1 ryo 2894 1.1 ryo /* XXX: TODO: EEE */ 2895 1.1 ryo if (eeep != NULL) 2896 1.1 ryo *eeep = AQ_EEE_DISABLE; 2897 1.1 ryo 2898 1.1 ryo return 0; 2899 1.1 ryo } 2900 1.1 ryo 2901 1.1 ryo static int 2902 1.1 ryo toggle_mpi_ctrl_and_wait(struct aq_softc *sc, uint64_t mask, 2903 1.1 ryo uint32_t timeout_ms, uint32_t try_count) 2904 1.1 ryo { 2905 1.1 ryo uint64_t mpi_ctrl = AQ_READ64_REG(sc, FW2X_MPI_CONTROL_REG); 2906 1.1 ryo uint64_t mpi_state = AQ_READ64_REG(sc, FW2X_MPI_STATE_REG); 2907 1.1 ryo int error; 2908 1.1 ryo 2909 1.1 ryo /* First, check that control and state values are consistent */ 2910 1.1 ryo if ((mpi_ctrl & mask) != (mpi_state & mask)) { 2911 1.1 ryo device_printf(sc->sc_dev, 2912 1.1 ryo "fw2x> MPI control (%#llx) and state (%#llx)" 2913 1.1 ryo " are not consistent for mask %#llx!\n", 2914 1.1 ryo (unsigned long long)mpi_ctrl, (unsigned long long)mpi_state, 2915 1.1 ryo (unsigned long long)mask); 2916 1.1 ryo return EINVAL; 2917 1.1 ryo } 2918 1.1 ryo 2919 1.1 ryo /* Invert bits (toggle) in control register */ 2920 1.1 ryo mpi_ctrl ^= mask; 2921 1.1 ryo AQ_WRITE64_REG(sc, FW2X_MPI_CONTROL_REG, mpi_ctrl); 2922 1.1 ryo 2923 1.1 ryo /* Clear all bits except masked */ 2924 1.1 ryo mpi_ctrl &= mask; 2925 1.1 ryo 2926 1.1 ryo /* Wait for FW reflecting change in state register */ 2927 1.1 ryo WAIT_FOR((AQ_READ64_REG(sc, FW2X_MPI_CONTROL_REG) & mask) == mpi_ctrl, 2928 1.1 ryo 1000 * timeout_ms, try_count, &error); 2929 1.1 ryo if (error != 0) { 2930 1.1 ryo device_printf(sc->sc_dev, 2931 1.1 ryo "f/w2x> timeout while waiting for response" 2932 1.1 ryo " in state register for bit %#llx!", 2933 1.1 ryo (unsigned long long)mask); 2934 1.1 ryo return error; 2935 1.1 ryo } 2936 1.1 ryo return 0; 2937 1.1 ryo } 2938 1.1 ryo 2939 1.1 ryo static int 2940 1.1 ryo fw2x_get_stats(struct aq_softc *sc, aq_hw_stats_s_t *stats) 2941 1.1 ryo { 2942 1.1 ryo int error; 2943 1.1 ryo 2944 1.4 ryo AQ_MPI_LOCK(sc); 2945 1.1 ryo /* Say to F/W to update the statistics */ 2946 1.1 ryo error = toggle_mpi_ctrl_and_wait(sc, FW2X_CTRL_STATISTICS, 1, 25); 2947 1.1 ryo if (error != 0) { 2948 1.1 ryo device_printf(sc->sc_dev, 2949 1.1 ryo "fw2x> statistics update error %d\n", error); 2950 1.4 ryo goto failure; 2951 1.1 ryo } 2952 1.1 ryo 2953 1.1 ryo CTASSERT(sizeof(fw2x_msm_statistics_t) <= sizeof(struct aq_hw_stats_s)); 2954 1.43 ryo error = aq1_fw_downld_dwords(sc, 2955 1.1 ryo sc->sc_mbox_addr + offsetof(fw2x_mailbox_t, msm), (uint32_t *)stats, 2956 1.1 ryo sizeof(fw2x_msm_statistics_t) / sizeof(uint32_t)); 2957 1.1 ryo if (error != 0) { 2958 1.1 ryo device_printf(sc->sc_dev, 2959 1.1 ryo "fw2x> download statistics data FAILED, error %d", error); 2960 1.4 ryo goto failure; 2961 1.1 ryo } 2962 1.1 ryo stats->dpc = AQ_READ_REG(sc, RX_DMA_DROP_PKT_CNT_REG); 2963 1.1 ryo stats->cprc = AQ_READ_REG(sc, RX_DMA_COALESCED_PKT_CNT_REG); 2964 1.1 ryo 2965 1.4 ryo failure: 2966 1.4 ryo AQ_MPI_UNLOCK(sc); 2967 1.4 ryo return error; 2968 1.4 ryo } 2969 1.4 ryo 2970 1.4 ryo #if NSYSMON_ENVSYS > 0 2971 1.4 ryo static int 2972 1.4 ryo fw2x_get_temperature(struct aq_softc *sc, uint32_t *temp) 2973 1.4 ryo { 2974 1.4 ryo int error; 2975 1.4 ryo uint32_t value, celsius; 2976 1.4 ryo 2977 1.4 ryo AQ_MPI_LOCK(sc); 2978 1.4 ryo 2979 1.4 ryo /* Say to F/W to update the temperature */ 2980 1.4 ryo error = toggle_mpi_ctrl_and_wait(sc, FW2X_CTRL_TEMPERATURE, 1, 25); 2981 1.4 ryo if (error != 0) 2982 1.4 ryo goto failure; 2983 1.4 ryo 2984 1.43 ryo error = aq1_fw_downld_dwords(sc, 2985 1.4 ryo sc->sc_mbox_addr + offsetof(fw2x_mailbox_t, phy_info2), 2986 1.4 ryo &value, sizeof(value) / sizeof(uint32_t)); 2987 1.4 ryo if (error != 0) 2988 1.4 ryo goto failure; 2989 1.4 ryo 2990 1.4 ryo /* 1/256 decrees C to microkelvin */ 2991 1.4 ryo celsius = __SHIFTOUT(value, PHYINFO2_TEMPERATURE); 2992 1.4 ryo if (celsius == 0) { 2993 1.4 ryo error = EIO; 2994 1.4 ryo goto failure; 2995 1.4 ryo } 2996 1.4 ryo *temp = celsius * (1000000 / 256) + 273150000; 2997 1.4 ryo 2998 1.4 ryo failure: 2999 1.4 ryo AQ_MPI_UNLOCK(sc); 3000 1.1 ryo return 0; 3001 1.1 ryo } 3002 1.4 ryo #endif 3003 1.1 ryo 3004 1.1 ryo static int 3005 1.43 ryo aq1_fw_downld_dwords(struct aq_softc *sc, uint32_t addr, uint32_t *p, 3006 1.1 ryo uint32_t cnt) 3007 1.1 ryo { 3008 1.1 ryo uint32_t v; 3009 1.1 ryo int error = 0; 3010 1.1 ryo 3011 1.43 ryo WAIT_FOR(AQ_READ_REG(sc, AQ1_FW_SEM_RAM_REG) == 1, 1, 10000, &error); 3012 1.1 ryo if (error != 0) { 3013 1.43 ryo AQ_WRITE_REG(sc, AQ1_FW_SEM_RAM_REG, 1); 3014 1.43 ryo v = AQ_READ_REG(sc, AQ1_FW_SEM_RAM_REG); 3015 1.1 ryo if (v == 0) { 3016 1.1 ryo device_printf(sc->sc_dev, 3017 1.1 ryo "%s:%d: timeout\n", __func__, __LINE__); 3018 1.1 ryo return ETIMEDOUT; 3019 1.1 ryo } 3020 1.1 ryo } 3021 1.1 ryo 3022 1.1 ryo AQ_WRITE_REG(sc, AQ_FW_MBOX_ADDR_REG, addr); 3023 1.1 ryo 3024 1.1 ryo error = 0; 3025 1.1 ryo for (; cnt > 0 && error == 0; cnt--) { 3026 1.1 ryo /* execute mailbox interface */ 3027 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_FW_MBOX_CMD_REG, 3028 1.1 ryo AQ_FW_MBOX_CMD_EXECUTE, 1); 3029 1.43 ryo if (sc->sc_features & FEATURES_AQ1_REV_B1) { 3030 1.1 ryo WAIT_FOR(AQ_READ_REG(sc, AQ_FW_MBOX_ADDR_REG) != addr, 3031 1.1 ryo 1, 1000, &error); 3032 1.1 ryo } else { 3033 1.1 ryo WAIT_FOR((AQ_READ_REG(sc, AQ_FW_MBOX_CMD_REG) & 3034 1.1 ryo AQ_FW_MBOX_CMD_BUSY) == 0, 3035 1.1 ryo 1, 1000, &error); 3036 1.1 ryo } 3037 1.1 ryo *p++ = AQ_READ_REG(sc, AQ_FW_MBOX_VAL_REG); 3038 1.1 ryo addr += sizeof(uint32_t); 3039 1.1 ryo } 3040 1.43 ryo AQ_WRITE_REG(sc, AQ1_FW_SEM_RAM_REG, 1); 3041 1.1 ryo 3042 1.1 ryo if (error != 0) 3043 1.1 ryo device_printf(sc->sc_dev, 3044 1.1 ryo "%s:%d: timeout\n", __func__, __LINE__); 3045 1.1 ryo 3046 1.1 ryo return error; 3047 1.1 ryo } 3048 1.1 ryo 3049 1.1 ryo /* read my mac address */ 3050 1.1 ryo static int 3051 1.43 ryo aq1_get_mac_addr(struct aq_softc *sc) 3052 1.1 ryo { 3053 1.1 ryo uint32_t mac_addr[2]; 3054 1.1 ryo uint32_t efuse_shadow_addr; 3055 1.1 ryo int err; 3056 1.1 ryo 3057 1.1 ryo efuse_shadow_addr = 0; 3058 1.1 ryo if (FW_VERSION_MAJOR(sc) >= 2) 3059 1.1 ryo efuse_shadow_addr = AQ_READ_REG(sc, FW2X_MPI_EFUSEADDR_REG); 3060 1.1 ryo else 3061 1.1 ryo efuse_shadow_addr = AQ_READ_REG(sc, FW1X_MPI_EFUSEADDR_REG); 3062 1.1 ryo 3063 1.1 ryo if (efuse_shadow_addr == 0) { 3064 1.1 ryo aprint_error_dev(sc->sc_dev, "cannot get efuse addr\n"); 3065 1.1 ryo return ENXIO; 3066 1.1 ryo } 3067 1.1 ryo 3068 1.1 ryo memset(mac_addr, 0, sizeof(mac_addr)); 3069 1.43 ryo err = aq1_fw_downld_dwords(sc, efuse_shadow_addr + (40 * 4), 3070 1.1 ryo mac_addr, __arraycount(mac_addr)); 3071 1.1 ryo if (err < 0) 3072 1.1 ryo return err; 3073 1.1 ryo 3074 1.1 ryo if (mac_addr[0] == 0 && mac_addr[1] == 0) { 3075 1.1 ryo aprint_error_dev(sc->sc_dev, "mac address not found\n"); 3076 1.1 ryo return ENXIO; 3077 1.1 ryo } 3078 1.1 ryo 3079 1.18 ryo mac_addr[0] = htobe32(mac_addr[0]); 3080 1.18 ryo mac_addr[1] = htobe32(mac_addr[1]); 3081 1.1 ryo 3082 1.1 ryo memcpy(sc->sc_enaddr.ether_addr_octet, 3083 1.1 ryo (uint8_t *)mac_addr, ETHER_ADDR_LEN); 3084 1.1 ryo aprint_normal_dev(sc->sc_dev, "Etheraddr: %s\n", 3085 1.1 ryo ether_sprintf(sc->sc_enaddr.ether_addr_octet)); 3086 1.1 ryo 3087 1.1 ryo return 0; 3088 1.1 ryo } 3089 1.1 ryo 3090 1.1 ryo /* set multicast filter. index 0 for own address */ 3091 1.1 ryo static int 3092 1.1 ryo aq_set_mac_addr(struct aq_softc *sc, int index, uint8_t *enaddr) 3093 1.1 ryo { 3094 1.1 ryo uint32_t h, l; 3095 1.1 ryo 3096 1.43 ryo if (index >= AQ_HW_MAC_NUM(sc)) 3097 1.1 ryo return EINVAL; 3098 1.1 ryo 3099 1.1 ryo if (enaddr == NULL) { 3100 1.1 ryo /* disable */ 3101 1.1 ryo AQ_WRITE_REG_BIT(sc, 3102 1.1 ryo RPF_L2UC_MSW_REG(index), RPF_L2UC_MSW_EN, 0); 3103 1.1 ryo return 0; 3104 1.1 ryo } 3105 1.1 ryo 3106 1.43 ryo h = (enaddr[0] << 8) | (enaddr[1]); 3107 1.5 msaitoh l = ((uint32_t)enaddr[2] << 24) | (enaddr[3] << 16) | 3108 1.43 ryo (enaddr[4] << 8) | (enaddr[5]); 3109 1.1 ryo 3110 1.1 ryo /* disable, set, and enable */ 3111 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2UC_MSW_REG(index), RPF_L2UC_MSW_EN, 0); 3112 1.1 ryo AQ_WRITE_REG(sc, RPF_L2UC_LSW_REG(index), l); 3113 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2UC_MSW_REG(index), 3114 1.1 ryo RPF_L2UC_MSW_MACADDR_HI, h); 3115 1.43 ryo AQ_WRITE_REG_BIT(sc, RPF_L2UC_MSW_REG(index), 3116 1.43 ryo RPF_L2UC_MSW_ACTION, RPF_ACTION_HOST); 3117 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 3118 1.43 ryo AQ_WRITE_REG_BIT(sc, RPF_L2UC_MSW_REG(index), 3119 1.43 ryo RPF_L2UC_MSW_TAG, __SHIFTIN(1, AQ2_RPF_TAG_UC_MASK)); 3120 1.43 ryo } 3121 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2UC_MSW_REG(index), RPF_L2UC_MSW_EN, 1); 3122 1.1 ryo 3123 1.1 ryo return 0; 3124 1.1 ryo } 3125 1.1 ryo 3126 1.1 ryo static int 3127 1.1 ryo aq_set_capability(struct aq_softc *sc) 3128 1.1 ryo { 3129 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 3130 1.1 ryo int ip4csum_tx = 3131 1.1 ryo ((ifp->if_capenable & IFCAP_CSUM_IPv4_Tx) == 0) ? 0 : 1; 3132 1.1 ryo int ip4csum_rx = 3133 1.1 ryo ((ifp->if_capenable & IFCAP_CSUM_IPv4_Rx) == 0) ? 0 : 1; 3134 1.1 ryo int l4csum_tx = ((ifp->if_capenable & 3135 1.1 ryo (IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_UDPv4_Tx | 3136 1.1 ryo IFCAP_CSUM_TCPv6_Tx | IFCAP_CSUM_UDPv6_Tx)) == 0) ? 0 : 1; 3137 1.1 ryo int l4csum_rx = 3138 1.1 ryo ((ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx | 3139 1.1 ryo IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx)) == 0) ? 0 : 1; 3140 1.1 ryo uint32_t lso = 3141 1.1 ryo ((ifp->if_capenable & (IFCAP_TSOv4 | IFCAP_TSOv6)) == 0) ? 3142 1.1 ryo 0 : 0xffffffff; 3143 1.1 ryo uint32_t lro = ((ifp->if_capenable & IFCAP_LRO) == 0) ? 3144 1.1 ryo 0 : 0xffffffff; 3145 1.1 ryo uint32_t i, v; 3146 1.1 ryo 3147 1.1 ryo /* TX checksums offloads*/ 3148 1.1 ryo AQ_WRITE_REG_BIT(sc, TPO_HWCSUM_REG, TPO_HWCSUM_IP4CSUM_EN, ip4csum_tx); 3149 1.1 ryo AQ_WRITE_REG_BIT(sc, TPO_HWCSUM_REG, TPO_HWCSUM_L4CSUM_EN, l4csum_tx); 3150 1.1 ryo 3151 1.1 ryo /* RX checksums offloads*/ 3152 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_HWCSUM_REG, RPO_HWCSUM_IP4CSUM_EN, ip4csum_rx); 3153 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_HWCSUM_REG, RPO_HWCSUM_L4CSUM_EN, l4csum_rx); 3154 1.1 ryo 3155 1.1 ryo /* LSO offloads*/ 3156 1.1 ryo AQ_WRITE_REG(sc, TDM_LSO_EN_REG, lso); 3157 1.1 ryo 3158 1.1 ryo #define AQ_B0_LRO_RXD_MAX 16 3159 1.1 ryo v = (8 < AQ_B0_LRO_RXD_MAX) ? 3 : 3160 1.1 ryo (4 < AQ_B0_LRO_RXD_MAX) ? 2 : 3161 1.1 ryo (2 < AQ_B0_LRO_RXD_MAX) ? 1 : 0; 3162 1.1 ryo for (i = 0; i < AQ_RINGS_NUM; i++) { 3163 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_LRO_LDES_MAX_REG(i), 3164 1.1 ryo RPO_LRO_LDES_MAX_MASK(i), v); 3165 1.1 ryo } 3166 1.1 ryo 3167 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_LRO_TB_DIV_REG, RPO_LRO_TB_DIV, 0x61a); 3168 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_LRO_INACTIVE_IVAL_REG, 3169 1.1 ryo RPO_LRO_INACTIVE_IVAL, 0); 3170 1.1 ryo /* 3171 1.1 ryo * the LRO timebase divider is 5 uS (0x61a), 3172 1.1 ryo * to get a maximum coalescing interval of 250 uS, 3173 1.1 ryo * we need to multiply by 50(0x32) to get 3174 1.1 ryo * the default value 250 uS 3175 1.1 ryo */ 3176 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_LRO_MAX_COALESCING_IVAL_REG, 3177 1.1 ryo RPO_LRO_MAX_COALESCING_IVAL, 50); 3178 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_LRO_CONF_REG, 3179 1.1 ryo RPO_LRO_CONF_QSESSION_LIMIT, 1); 3180 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_LRO_CONF_REG, 3181 1.1 ryo RPO_LRO_CONF_TOTAL_DESC_LIMIT, 2); 3182 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_LRO_CONF_REG, 3183 1.1 ryo RPO_LRO_CONF_PATCHOPTIMIZATION_EN, 0); 3184 1.1 ryo AQ_WRITE_REG_BIT(sc, RPO_LRO_CONF_REG, 3185 1.1 ryo RPO_LRO_CONF_MIN_PAYLOAD_OF_FIRST_PKT, 10); 3186 1.1 ryo AQ_WRITE_REG(sc, RPO_LRO_RSC_MAX_REG, 1); 3187 1.1 ryo AQ_WRITE_REG(sc, RPO_LRO_ENABLE_REG, lro); 3188 1.1 ryo 3189 1.1 ryo return 0; 3190 1.1 ryo } 3191 1.1 ryo 3192 1.1 ryo static int 3193 1.1 ryo aq_set_filter(struct aq_softc *sc) 3194 1.1 ryo { 3195 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 3196 1.32 skrll struct ethercom * const ec = &sc->sc_ethercom; 3197 1.1 ryo struct ether_multi *enm; 3198 1.1 ryo struct ether_multistep step; 3199 1.1 ryo int idx, error = 0; 3200 1.1 ryo 3201 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 3202 1.43 ryo uint32_t action = (ifp->if_flags & IFF_PROMISC) ? 3203 1.43 ryo AQ2_ART_ACTION_DISABLE : AQ2_ART_ACTION_DROP; 3204 1.43 ryo aq2_filter_art_set(sc, AQ2_RPF_INDEX_L2_PROMISC_OFF, 0, 3205 1.43 ryo AQ2_RPF_TAG_UC_MASK | AQ2_RPF_TAG_ALLMC_MASK, action); 3206 1.43 ryo aq2_filter_art_set(sc, AQ2_RPF_INDEX_VLAN_PROMISC_OFF, 0, 3207 1.43 ryo AQ2_RPF_TAG_VLAN_MASK | AQ2_RPF_TAG_UNTAG_MASK, action); 3208 1.43 ryo } 3209 1.43 ryo 3210 1.1 ryo if (ifp->if_flags & IFF_PROMISC) { 3211 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2BC_REG, RPF_L2BC_PROMISC, 3212 1.1 ryo (ifp->if_flags & IFF_PROMISC) ? 1 : 0); 3213 1.1 ryo ec->ec_flags |= ETHER_F_ALLMULTI; 3214 1.1 ryo goto done; 3215 1.1 ryo } 3216 1.1 ryo 3217 1.1 ryo /* clear all table */ 3218 1.43 ryo for (idx = 0; idx < AQ_HW_MAC_NUM(sc); idx++) { 3219 1.1 ryo if (idx == AQ_HW_MAC_OWN) /* already used for own */ 3220 1.1 ryo continue; 3221 1.1 ryo aq_set_mac_addr(sc, idx, NULL); 3222 1.1 ryo } 3223 1.1 ryo 3224 1.1 ryo /* don't accept all multicast */ 3225 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_MCAST_FILTER_MASK_REG, 3226 1.1 ryo RPF_MCAST_FILTER_MASK_ALLMULTI, 0); 3227 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_MCAST_FILTER_REG(0), 3228 1.1 ryo RPF_MCAST_FILTER_EN, 0); 3229 1.1 ryo 3230 1.1 ryo idx = 0; 3231 1.1 ryo ETHER_LOCK(ec); 3232 1.1 ryo ETHER_FIRST_MULTI(step, ec, enm); 3233 1.1 ryo while (enm != NULL) { 3234 1.1 ryo if (idx == AQ_HW_MAC_OWN) 3235 1.1 ryo idx++; 3236 1.1 ryo 3237 1.43 ryo if ((idx >= AQ_HW_MAC_NUM(sc)) || 3238 1.1 ryo memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 3239 1.1 ryo /* 3240 1.1 ryo * too many filters. 3241 1.1 ryo * fallback to accept all multicast addresses. 3242 1.1 ryo */ 3243 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_MCAST_FILTER_MASK_REG, 3244 1.1 ryo RPF_MCAST_FILTER_MASK_ALLMULTI, 1); 3245 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_MCAST_FILTER_REG(0), 3246 1.1 ryo RPF_MCAST_FILTER_EN, 1); 3247 1.1 ryo ec->ec_flags |= ETHER_F_ALLMULTI; 3248 1.1 ryo ETHER_UNLOCK(ec); 3249 1.1 ryo goto done; 3250 1.1 ryo } 3251 1.1 ryo 3252 1.1 ryo /* add a filter */ 3253 1.1 ryo aq_set_mac_addr(sc, idx++, enm->enm_addrlo); 3254 1.1 ryo 3255 1.1 ryo ETHER_NEXT_MULTI(step, enm); 3256 1.1 ryo } 3257 1.1 ryo ec->ec_flags &= ~ETHER_F_ALLMULTI; 3258 1.1 ryo ETHER_UNLOCK(ec); 3259 1.1 ryo 3260 1.1 ryo done: 3261 1.1 ryo return error; 3262 1.1 ryo } 3263 1.1 ryo 3264 1.1 ryo static int 3265 1.43 ryo aq2_filter_art_set(struct aq_softc *sc, uint32_t idx, 3266 1.43 ryo uint32_t tag, uint32_t mask, uint32_t action) 3267 1.43 ryo { 3268 1.43 ryo int error; 3269 1.43 ryo 3270 1.43 ryo AQ_MPI_LOCK(sc); 3271 1.43 ryo 3272 1.43 ryo WAIT_FOR(AQ_READ_REG(sc, AQ2_ART_SEM_REG) == 1, 10, 10000, &error); 3273 1.43 ryo if (error != 0) { 3274 1.43 ryo device_printf(sc->sc_dev, "%s: timeout\n", __func__); 3275 1.43 ryo goto done; 3276 1.43 ryo } 3277 1.43 ryo 3278 1.43 ryo idx += sc->sc_filter_art_base_index; 3279 1.43 ryo AQ_WRITE_REG(sc, AQ2_RPF_ACT_ART_REQ_TAG_REG(idx), tag); 3280 1.43 ryo AQ_WRITE_REG(sc, AQ2_RPF_ACT_ART_REQ_MASK_REG(idx), mask); 3281 1.43 ryo AQ_WRITE_REG(sc, AQ2_RPF_ACT_ART_REQ_ACTION_REG(idx), action); 3282 1.43 ryo 3283 1.43 ryo AQ_WRITE_REG(sc, AQ2_ART_SEM_REG, 1); 3284 1.43 ryo 3285 1.43 ryo done: 3286 1.43 ryo AQ_MPI_UNLOCK(sc); 3287 1.43 ryo return 0; 3288 1.43 ryo } 3289 1.43 ryo 3290 1.43 ryo static int 3291 1.43 ryo aq2_init_filter(struct aq_softc *sc) 3292 1.43 ryo { 3293 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_RPF_REC_TAB_ENABLE_REG, 3294 1.43 ryo AQ2_RPF_REC_TAB_ENABLE_MASK, 0xffff); 3295 1.43 ryo AQ_WRITE_REG_BIT(sc, RPF_L2UC_MSW_REG(0), 3296 1.43 ryo RPF_L2UC_MSW_TAG, __SHIFTIN(1, AQ2_RPF_TAG_UC_MASK)); 3297 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_RPF_L2BC_TAG_REG, 3298 1.43 ryo AQ2_RPF_L2BC_TAG_MASK, __SHIFTIN(1, AQ2_RPF_TAG_UC_MASK)); 3299 1.43 ryo 3300 1.43 ryo aq2_filter_art_set(sc, AQ2_RPF_INDEX_L2_PROMISC_OFF, 3301 1.43 ryo 0, AQ2_RPF_TAG_UC_MASK | AQ2_RPF_TAG_ALLMC_MASK, 3302 1.43 ryo AQ2_ART_ACTION_DROP); 3303 1.43 ryo aq2_filter_art_set(sc, AQ2_RPF_INDEX_VLAN_PROMISC_OFF, 3304 1.43 ryo 0, AQ2_RPF_TAG_VLAN_MASK | AQ2_RPF_TAG_UNTAG_MASK, 3305 1.43 ryo AQ2_ART_ACTION_DROP); 3306 1.43 ryo 3307 1.43 ryo for (int i = 0; i < 8; i++) { 3308 1.43 ryo aq2_filter_art_set(sc, AQ2_RPF_INDEX_PCP_TO_TC + i, 3309 1.43 ryo __SHIFTIN(i, AQ2_RPF_TAG_PCP_MASK), AQ2_RPF_TAG_PCP_MASK, 3310 1.43 ryo AQ2_ART_ACTION_ASSIGN_TC(i % sc->sc_nqueues)); 3311 1.43 ryo } 3312 1.43 ryo 3313 1.43 ryo return 0; 3314 1.43 ryo } 3315 1.43 ryo 3316 1.43 ryo static int 3317 1.43 ryo aq2_interface_buffer_read(struct aq_softc *sc, uint32_t reg0, uint32_t *data0, 3318 1.43 ryo uint32_t size0) 3319 1.43 ryo { 3320 1.43 ryo uint32_t tid0, tid1, reg, *data, size; 3321 1.43 ryo int timo; 3322 1.43 ryo 3323 1.43 ryo for (timo = 10000; timo > 0; timo--) { 3324 1.43 ryo tid0 = AQ_READ_REG(sc, AQ2_FW_INTERFACE_OUT_TRANSACTION_ID_REG); 3325 1.43 ryo if (__SHIFTOUT(tid0, AQ2_FW_INTERFACE_OUT_TRANSACTION_ID_A) != 3326 1.43 ryo __SHIFTOUT(tid0, AQ2_FW_INTERFACE_OUT_TRANSACTION_ID_B)) { 3327 1.43 ryo delay(10); 3328 1.43 ryo continue; 3329 1.43 ryo } 3330 1.43 ryo 3331 1.43 ryo for (reg = reg0, data = data0, size = size0; 3332 1.43 ryo size >= 4; reg += 4, data++, size -= 4) { 3333 1.43 ryo *data = AQ_READ_REG(sc, reg); 3334 1.43 ryo } 3335 1.43 ryo 3336 1.43 ryo tid1 = AQ_READ_REG(sc, AQ2_FW_INTERFACE_OUT_TRANSACTION_ID_REG); 3337 1.43 ryo if (tid0 == tid1) 3338 1.43 ryo break; 3339 1.43 ryo } 3340 1.43 ryo if (timo == 0) { 3341 1.43 ryo device_printf(sc->sc_dev, "%s: timeout\n", __func__); 3342 1.43 ryo return ETIMEDOUT; 3343 1.43 ryo } 3344 1.43 ryo return 0; 3345 1.43 ryo } 3346 1.43 ryo 3347 1.43 ryo static int 3348 1.43 ryo aq2_fw_reboot(struct aq_softc *sc) 3349 1.43 ryo { 3350 1.43 ryo uint32_t v; 3351 1.43 ryo int timo; 3352 1.43 ryo char buf[32]; 3353 1.43 ryo 3354 1.43 ryo /* It seems that there is still only one type of firmware ABI in aq2 */ 3355 1.43 ryo sc->sc_fw_ops = &aq2_fw_ops; 3356 1.43 ryo sc->sc_features |= FEATURES_AQ2; 3357 1.43 ryo sc->sc_max_mtu = AQ2_JUMBO_MTU; 3358 1.43 ryo 3359 1.43 ryo AQ_WRITE_REG(sc, AQ2_MCP_HOST_REQ_INT_CLR_REG, 1); 3360 1.43 ryo AQ_WRITE_REG(sc, AQ2_MIF_BOOT_REG, 1); /* reboot request */ 3361 1.43 ryo for (timo = 200000; timo > 0; timo--) { 3362 1.43 ryo v = AQ_READ_REG(sc, AQ2_MIF_BOOT_REG); 3363 1.43 ryo if ((v & AQ2_MIF_BOOT_BOOT_STARTED) && v != 0xffffffff) 3364 1.43 ryo break; 3365 1.43 ryo delay(10); 3366 1.43 ryo } 3367 1.43 ryo if (timo <= 0) { 3368 1.43 ryo aprint_error_dev(sc->sc_dev, "FW reboot timeout\n"); 3369 1.43 ryo return ETIMEDOUT; 3370 1.43 ryo } 3371 1.43 ryo 3372 1.43 ryo for (timo = 2000000; timo > 0; timo--) { 3373 1.43 ryo v = AQ_READ_REG(sc, AQ2_MIF_BOOT_REG); 3374 1.43 ryo if ((v & AQ2_MIF_BOOT_FW_INIT_FAILED) || 3375 1.43 ryo (v & AQ2_MIF_BOOT_FW_INIT_COMP_SUCCESS)) 3376 1.43 ryo break; 3377 1.43 ryo v = AQ_READ_REG(sc, AQ2_MCP_HOST_REQ_INT_REG); 3378 1.43 ryo if (v & AQ2_MCP_HOST_REQ_INT_READY) 3379 1.43 ryo break; 3380 1.43 ryo delay(10); 3381 1.43 ryo } 3382 1.43 ryo if (timo <= 0) { 3383 1.43 ryo aprint_error_dev(sc->sc_dev, "FW restart timeout\n"); 3384 1.43 ryo return ETIMEDOUT; 3385 1.43 ryo } 3386 1.43 ryo 3387 1.43 ryo v = AQ_READ_REG(sc, AQ2_MIF_BOOT_REG); 3388 1.43 ryo if (v & AQ2_MIF_BOOT_FW_INIT_FAILED) { 3389 1.43 ryo aprint_error_dev(sc->sc_dev, "FW restart failed\n"); 3390 1.43 ryo return ETIMEDOUT; 3391 1.43 ryo } 3392 1.43 ryo 3393 1.43 ryo v = AQ_READ_REG(sc, AQ2_MCP_HOST_REQ_INT_REG); 3394 1.43 ryo if (v & AQ2_MCP_HOST_REQ_INT_READY) { 3395 1.43 ryo aprint_error_dev(sc->sc_dev, "firmware required\n"); 3396 1.43 ryo return ENXIO; 3397 1.43 ryo } 3398 1.43 ryo 3399 1.43 ryo /* 3400 1.43 ryo * Get aq2 firmware version. 3401 1.43 ryo * Note that the bit layout and its meaning are different from aq1. 3402 1.43 ryo */ 3403 1.43 ryo aq2_interface_buffer_read(sc, AQ2_FW_INTERFACE_OUT_VERSION_BUNDLE_REG, 3404 1.43 ryo (uint32_t *)&v, sizeof(v)); 3405 1.43 ryo sc->sc_fw_version = 3406 1.43 ryo __SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_MAJOR) << 24 | 3407 1.43 ryo __SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_MINOR) << 16 | 3408 1.43 ryo __SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_BUILD); 3409 1.43 ryo 3410 1.43 ryo aq2_interface_buffer_read(sc, AQ2_FW_INTERFACE_OUT_VERSION_IFACE_REG, 3411 1.43 ryo (uint32_t *)&v, sizeof(v)); 3412 1.43 ryo switch (__SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_IFACE_VER)) { 3413 1.43 ryo case AQ2_FW_INTERFACE_OUT_VERSION_IFACE_VER_A0: 3414 1.43 ryo sc->sc_features |= FEATURES_AQ2_IFACE_A0; 3415 1.43 ryo strncpy(buf, "A0", sizeof(buf)); 3416 1.43 ryo break; 3417 1.43 ryo case AQ2_FW_INTERFACE_OUT_VERSION_IFACE_VER_B0: 3418 1.43 ryo sc->sc_features |= FEATURES_AQ2_IFACE_B0; 3419 1.43 ryo strncpy(buf, "B0", sizeof(buf)); 3420 1.43 ryo break; 3421 1.43 ryo default: 3422 1.43 ryo snprintf(buf, sizeof(buf), "(unknown 0x%08x)", v); 3423 1.43 ryo break; 3424 1.43 ryo } 3425 1.43 ryo aprint_normal_dev(sc->sc_dev, 3426 1.43 ryo "Atlantic2 %s, F/W version %d.%d.%d\n", buf, 3427 1.43 ryo FW_VERSION_MAJOR(sc), FW_VERSION_MINOR(sc), FW_VERSION_BUILD(sc)); 3428 1.43 ryo 3429 1.43 ryo aq2_interface_buffer_read(sc, AQ2_FW_INTERFACE_OUT_FILTER_CAPS_REG, 3430 1.43 ryo (uint32_t *)&sc->sc_filter_caps, sizeof(sc->sc_filter_caps)); 3431 1.43 ryo sc->sc_filter_art_base_index = __SHIFTOUT(sc->sc_filter_caps.caps3, 3432 1.43 ryo AQ2_FW_INTERFACE_OUT_FILTER_CAPS3_RESOLVER_BASE_INDEX) * 8; 3433 1.43 ryo 3434 1.43 ryo /* debug info */ 3435 1.43 ryo v = AQ_READ_REG(sc, AQ_HW_REVISION_REG); 3436 1.43 ryo aprint_debug_dev(sc->sc_dev, "HW Rev: 0x%08x\n", v); 3437 1.43 ryo 3438 1.43 ryo aq2_interface_buffer_read(sc, AQ2_FW_INTERFACE_OUT_VERSION_MAC_REG, 3439 1.43 ryo (uint32_t *)&v, sizeof(v)); 3440 1.43 ryo aprint_debug_dev(sc->sc_dev, "MAC Version %d.%d.%d\n", 3441 1.43 ryo (int)__SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_MAJOR), 3442 1.43 ryo (int)__SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_MINOR), 3443 1.43 ryo (int)__SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_BUILD)); 3444 1.43 ryo 3445 1.43 ryo aq2_interface_buffer_read(sc, AQ2_FW_INTERFACE_OUT_VERSION_PHY_REG, 3446 1.43 ryo (uint32_t *)&v, sizeof(v)); 3447 1.43 ryo aprint_debug_dev(sc->sc_dev, "PHY Version %d.%d.%d\n", 3448 1.43 ryo (int)__SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_MAJOR), 3449 1.43 ryo (int)__SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_MINOR), 3450 1.43 ryo (int)__SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_VERSION_BUILD)); 3451 1.43 ryo 3452 1.43 ryo v = AQ_READ_REG(sc, AQ2_HW_FPGA_VERSION_REG); 3453 1.43 ryo aprint_debug_dev(sc->sc_dev, "AQ2 FPGA Version: %d.%d.%d.%d\n", 3454 1.43 ryo (int)__SHIFTOUT(v, __BITS(31, 24)), 3455 1.43 ryo (int)__SHIFTOUT(v, __BITS(23, 16)), 3456 1.43 ryo (int)__SHIFTOUT(v, __BITS(15, 8)), 3457 1.43 ryo (int)__SHIFTOUT(v, __BITS(7, 0))); 3458 1.43 ryo 3459 1.43 ryo aprint_debug_dev(sc->sc_dev, "FILTER CAPS: 0x%08x,0x%08x,0x%08x\n", 3460 1.43 ryo sc->sc_filter_caps.caps1, sc->sc_filter_caps.caps2, 3461 1.43 ryo sc->sc_filter_caps.caps3); 3462 1.43 ryo 3463 1.43 ryo return 0; 3464 1.43 ryo } 3465 1.43 ryo 3466 1.43 ryo static int 3467 1.43 ryo aq2_fw_wait_shared_ack(struct aq_softc *sc) 3468 1.43 ryo { 3469 1.43 ryo int error; 3470 1.43 ryo 3471 1.43 ryo AQ_WRITE_REG(sc, AQ2_MIF_HOST_FINISHED_STATUS_WRITE_REG, 3472 1.43 ryo AQ2_MIF_HOST_FINISHED_STATUS_ACK); 3473 1.43 ryo WAIT_FOR((AQ_READ_REG(sc, AQ2_MIF_HOST_FINISHED_STATUS_READ_REG) & 3474 1.43 ryo AQ2_MIF_HOST_FINISHED_STATUS_ACK) == 0, 100, 100000, &error); 3475 1.43 ryo 3476 1.43 ryo return error; 3477 1.43 ryo } 3478 1.43 ryo 3479 1.43 ryo static int 3480 1.43 ryo aq2_fw_reset(struct aq_softc *sc) 3481 1.43 ryo { 3482 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_FW_INTERFACE_IN_LINK_CONTROL_REG, 3483 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE, 3484 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE_ACTIVE); 3485 1.43 ryo 3486 1.43 ryo AQ_WRITE_REG(sc, AQ2_FW_INTERFACE_IN_MTU_REG, 3487 1.43 ryo AQ2_JUMBO_MTU + sizeof(struct ether_header)); 3488 1.43 ryo 3489 1.43 ryo uint32_t v = AQ_READ_REG(sc, AQ2_FW_INTERFACE_IN_REQUEST_POLICY_REG); 3490 1.43 ryo v |= AQ2_FW_INTERFACE_IN_REQUEST_POLICY_MCAST_QUEUE_OR_TC; 3491 1.43 ryo v &= ~AQ2_FW_INTERFACE_IN_REQUEST_POLICY_MCAST_RX_QUEUE_TC_INDEX; 3492 1.43 ryo v |= AQ2_FW_INTERFACE_IN_REQUEST_POLICY_MCAST_ACCEPT; 3493 1.43 ryo v |= AQ2_FW_INTERFACE_IN_REQUEST_POLICY_BCAST_QUEUE_OR_TC; 3494 1.43 ryo v &= AQ2_FW_INTERFACE_IN_REQUEST_POLICY_BCAST_RX_QUEUE_TC_INDEX; 3495 1.43 ryo v |= AQ2_FW_INTERFACE_IN_REQUEST_POLICY_BCAST_ACCEPT; 3496 1.43 ryo v |= AQ2_FW_INTERFACE_IN_REQUEST_POLICY_PROMISC_QUEUE_OR_TC; 3497 1.43 ryo v &= ~AQ2_FW_INTERFACE_IN_REQUEST_POLICY_PROMISC_RX_QUEUE_TX_INDEX; 3498 1.43 ryo AQ_WRITE_REG(sc, AQ2_FW_INTERFACE_IN_REQUEST_POLICY_REG, v); 3499 1.43 ryo 3500 1.43 ryo return aq2_fw_wait_shared_ack(sc); 3501 1.43 ryo } 3502 1.43 ryo 3503 1.43 ryo static int 3504 1.43 ryo aq2_fw_set_mode(struct aq_softc *sc, aq_hw_fw_mpi_state_t mode, 3505 1.43 ryo aq_link_speed_t speed, aq_link_fc_t fc, aq_link_eee_t eee) 3506 1.43 ryo { 3507 1.43 ryo uint32_t v; 3508 1.43 ryo int error; 3509 1.43 ryo 3510 1.43 ryo AQ_MPI_LOCK(sc); 3511 1.43 ryo 3512 1.43 ryo v = AQ_READ_REG(sc, AQ2_FW_INTERFACE_IN_LINK_OPTIONS_REG); 3513 1.43 ryo v &= ~( 3514 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10G | 3515 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_N5G | 3516 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_5G | 3517 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_N2G5 | 3518 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_2G5 | 3519 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_1G | 3520 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_100M | 3521 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10M | 3522 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_1G_HD | 3523 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_100M_HD | 3524 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10M_HD); 3525 1.43 ryo 3526 1.43 ryo v &= ~AQ2_FW_INTERFACE_IN_LINK_OPTIONS_LINK_UP; 3527 1.43 ryo 3528 1.43 ryo if (speed & AQ_LINK_10G) 3529 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10G; 3530 1.43 ryo if (speed & AQ_LINK_5G) 3531 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_N5G | 3532 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_5G; 3533 1.43 ryo if (speed & AQ_LINK_2G5) 3534 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_N2G5 | 3535 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_2G5; 3536 1.43 ryo if (speed & AQ_LINK_1G) 3537 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_1G | 3538 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_1G_HD; 3539 1.43 ryo if (speed & AQ_LINK_100M) 3540 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_100M | 3541 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_100M_HD; 3542 1.43 ryo if (speed & AQ_LINK_10M) { 3543 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10M | 3544 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_RATE_10M_HD; 3545 1.43 ryo } 3546 1.43 ryo 3547 1.43 ryo /* flow control */ 3548 1.43 ryo v &= ~(AQ2_FW_INTERFACE_IN_LINK_OPTIONS_PAUSE_TX | 3549 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_OPTIONS_PAUSE_RX); 3550 1.43 ryo if (fc & AQ_FC_TX) 3551 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_PAUSE_TX; 3552 1.43 ryo if (fc & AQ_FC_RX) 3553 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_PAUSE_RX; 3554 1.43 ryo 3555 1.43 ryo if (speed == AQ_LINK_NONE) { 3556 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_FW_INTERFACE_IN_LINK_CONTROL_REG, 3557 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE, 3558 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE_SHUTDOWN); 3559 1.43 ryo } else { 3560 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_FW_INTERFACE_IN_LINK_CONTROL_REG, 3561 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE, 3562 1.43 ryo AQ2_FW_INTERFACE_IN_LINK_CONTROL_MODE_ACTIVE); 3563 1.43 ryo v |= AQ2_FW_INTERFACE_IN_LINK_OPTIONS_LINK_UP; 3564 1.43 ryo } 3565 1.43 ryo 3566 1.43 ryo AQ_WRITE_REG(sc, AQ2_FW_INTERFACE_IN_LINK_OPTIONS_REG, v); 3567 1.43 ryo error = aq2_fw_wait_shared_ack(sc); 3568 1.43 ryo 3569 1.43 ryo AQ_MPI_UNLOCK(sc); 3570 1.43 ryo return error; 3571 1.43 ryo } 3572 1.43 ryo 3573 1.43 ryo static int 3574 1.43 ryo aq2_fw_get_mode(struct aq_softc *sc, aq_hw_fw_mpi_state_t *modep, 3575 1.43 ryo aq_link_speed_t *speedp, aq_link_fc_t *fcp, aq_link_eee_t *eeep) 3576 1.43 ryo { 3577 1.43 ryo aq_link_speed_t speed; 3578 1.43 ryo uint32_t v; 3579 1.43 ryo 3580 1.43 ryo v = AQ_READ_REG(sc, AQ2_FW_INTERFACE_OUT_LINK_STATUS_REG); 3581 1.43 ryo switch (__SHIFTOUT(v, AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE)) { 3582 1.43 ryo case AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_10G: 3583 1.43 ryo speed = AQ_LINK_10G; 3584 1.43 ryo break; 3585 1.43 ryo case AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_5G: 3586 1.43 ryo speed = AQ_LINK_5G; 3587 1.43 ryo break; 3588 1.43 ryo case AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_2G5: 3589 1.43 ryo speed = AQ_LINK_2G5; 3590 1.43 ryo break; 3591 1.43 ryo case AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_1G: 3592 1.43 ryo speed = AQ_LINK_1G; 3593 1.43 ryo break; 3594 1.43 ryo case AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_100M: 3595 1.43 ryo speed = AQ_LINK_100M; 3596 1.43 ryo break; 3597 1.43 ryo case AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_10M: 3598 1.43 ryo speed = AQ_LINK_10M; 3599 1.43 ryo break; 3600 1.43 ryo case AQ2_FW_INTERFACE_OUT_LINK_STATUS_RATE_INVALID: 3601 1.43 ryo default: 3602 1.43 ryo speed = AQ_LINK_NONE; 3603 1.43 ryo break; 3604 1.43 ryo } 3605 1.43 ryo if (speedp != NULL) 3606 1.43 ryo *speedp = speed; 3607 1.43 ryo 3608 1.43 ryo aq_link_fc_t fc = 0; 3609 1.43 ryo if (v & AQ2_FW_INTERFACE_OUT_LINK_STATUS_PAUSE_TX) 3610 1.43 ryo fc |= AQ_FC_TX; 3611 1.43 ryo if (v & AQ2_FW_INTERFACE_OUT_LINK_STATUS_PAUSE_RX) 3612 1.43 ryo fc |= AQ_FC_RX; 3613 1.43 ryo if (fcp != NULL) 3614 1.43 ryo *fcp = fc; 3615 1.43 ryo 3616 1.43 ryo aq_link_eee_t eee; 3617 1.43 ryo eee = (v & AQ2_FW_INTERFACE_OUT_LINK_STATUS_EEE) ? 3618 1.43 ryo AQ_EEE_ENABLE : AQ_EEE_DISABLE; 3619 1.43 ryo if (eeep != NULL) 3620 1.43 ryo *eeep = eee; 3621 1.43 ryo 3622 1.43 ryo return -1; 3623 1.43 ryo } 3624 1.43 ryo 3625 1.43 ryo static int 3626 1.43 ryo aq2_fw_get_stats(struct aq_softc *sc, aq_hw_stats_s_t *stats) 3627 1.43 ryo { 3628 1.43 ryo aq2_statistics_t aq2stat; 3629 1.43 ryo int error; 3630 1.43 ryo 3631 1.43 ryo AQ_MPI_LOCK(sc); 3632 1.43 ryo error = aq2_interface_buffer_read(sc, AQ2_FW_INTERFACE_OUT_STATS_REG, 3633 1.43 ryo (uint32_t *)&aq2stat, sizeof(aq2stat)); 3634 1.43 ryo AQ_MPI_UNLOCK(sc); 3635 1.43 ryo if (error != 0) 3636 1.43 ryo return error; 3637 1.43 ryo 3638 1.43 ryo if (sc->sc_features & FEATURES_AQ2_IFACE_A0) { 3639 1.43 ryo /* RX */ 3640 1.43 ryo stats->uprc = aq2stat.a0.rx_unicast_frames; 3641 1.43 ryo stats->mprc = aq2stat.a0.rx_multicast_frames; 3642 1.43 ryo stats->bprc = aq2stat.a0.rx_broadcast_frames; 3643 1.43 ryo stats->erpr = aq2stat.a0.rx_errors; 3644 1.43 ryo stats->ubrc = aq2stat.a0.rx_unicast_octets; 3645 1.43 ryo stats->bbrc = aq2stat.a0.rx_broadcast_octets; 3646 1.43 ryo stats->mbrc = aq2stat.a0.rx_multicast_octets; 3647 1.43 ryo stats->prc = aq2stat.a0.rx_good_frames; 3648 1.43 ryo /* TX */ 3649 1.43 ryo stats->uptc = aq2stat.a0.tx_unicast_frames; 3650 1.43 ryo stats->bptc = aq2stat.a0.tx_broadcast_frames; 3651 1.43 ryo stats->mptc = aq2stat.a0.tx_multicast_frames; 3652 1.43 ryo stats->erpt = aq2stat.a0.tx_errors; 3653 1.43 ryo stats->ubtc = aq2stat.a0.tx_unicast_octets; 3654 1.43 ryo stats->bbtc = aq2stat.a0.tx_broadcast_octets; 3655 1.43 ryo stats->mbtc = aq2stat.a0.tx_multicast_octets; 3656 1.43 ryo stats->ptc = aq2stat.a0.tx_good_frames; 3657 1.43 ryo } else if (sc->sc_features & FEATURES_AQ2_IFACE_B0) { 3658 1.43 ryo /* RX */ 3659 1.43 ryo stats->uprc = aq2stat.b0.rx_unicast_frames; 3660 1.43 ryo stats->mprc = aq2stat.b0.rx_multicast_frames; 3661 1.43 ryo stats->bprc = aq2stat.b0.rx_broadcast_frames; 3662 1.43 ryo stats->erpr = aq2stat.b0.rx_errors; 3663 1.43 ryo stats->ubrc = 0; 3664 1.43 ryo stats->bbrc = 0; 3665 1.43 ryo stats->mbrc = 0; 3666 1.43 ryo stats->prc = aq2stat.b0.rx_good_frames; 3667 1.43 ryo /* TX */ 3668 1.43 ryo stats->uptc = aq2stat.b0.tx_unicast_frames; 3669 1.43 ryo stats->bptc = aq2stat.b0.tx_multicast_frames; 3670 1.43 ryo stats->mptc = aq2stat.b0.tx_broadcast_frames; 3671 1.43 ryo stats->erpt = aq2stat.b0.tx_errors; 3672 1.43 ryo stats->ubtc = 0; 3673 1.43 ryo stats->bbtc = 0; 3674 1.43 ryo stats->mbtc = 0; 3675 1.43 ryo stats->ptc = aq2stat.b0.tx_good_frames; 3676 1.43 ryo } else { 3677 1.43 ryo return ENOTSUP; 3678 1.43 ryo } 3679 1.43 ryo stats->dpc = AQ_READ64_REG(sc, RX_DMA_DROP_PKT_CNT_REG); 3680 1.43 ryo stats->cprc = AQ_READ64_REG(sc, RX_DMA_COALESCED_PKT_CNT_REG); 3681 1.43 ryo 3682 1.43 ryo return error; 3683 1.43 ryo } 3684 1.43 ryo 3685 1.43 ryo #if NSYSMON_ENVSYS > 0 3686 1.43 ryo static int 3687 1.43 ryo aq2_fw_get_temperature(struct aq_softc *sc, uint32_t *temp) 3688 1.43 ryo { 3689 1.43 ryo aq2_health_monitor_t health; 3690 1.43 ryo uint32_t data; 3691 1.43 ryo 3692 1.43 ryo AQ_MPI_LOCK(sc); 3693 1.43 ryo 3694 1.43 ryo aq2_interface_buffer_read(sc, AQ2_FW_INTERFACE_OUT_PHY_HEALTH_MONITOR, 3695 1.43 ryo (uint32_t *)&health, sizeof(health)); 3696 1.43 ryo 3697 1.43 ryo AQ_MPI_UNLOCK(sc); 3698 1.43 ryo 3699 1.43 ryo data = __SHIFTOUT(health.data1, HEALTH_MONITOR_DATA1_TEMPERATURE); 3700 1.43 ryo if (data == 0) 3701 1.43 ryo return EIO; 3702 1.43 ryo 3703 1.43 ryo *temp = data * 1000000 + 273150000; 3704 1.43 ryo return 0; 3705 1.43 ryo } 3706 1.43 ryo #endif 3707 1.43 ryo 3708 1.43 ryo static int 3709 1.43 ryo aq2_get_mac_addr(struct aq_softc *sc) 3710 1.43 ryo { 3711 1.43 ryo uint32_t mac_addr[2]; 3712 1.43 ryo 3713 1.43 ryo memset(mac_addr, 0, sizeof(mac_addr)); 3714 1.43 ryo AQ_READ_REGS(sc, AQ2_FW_INTERFACE_IN_MAC_ADDRESS_REG, 3715 1.43 ryo mac_addr, __arraycount(mac_addr)); 3716 1.43 ryo 3717 1.43 ryo if (mac_addr[0] == 0 && mac_addr[1] == 0) { 3718 1.43 ryo aprint_error_dev(sc->sc_dev, "mac address not found\n"); 3719 1.43 ryo return ENXIO; 3720 1.43 ryo } 3721 1.43 ryo 3722 1.43 ryo HTOLE32(mac_addr[0]); 3723 1.43 ryo HTOLE32(mac_addr[1]); 3724 1.43 ryo 3725 1.43 ryo memcpy(sc->sc_enaddr.ether_addr_octet, 3726 1.43 ryo (uint8_t *)mac_addr, ETHER_ADDR_LEN); 3727 1.43 ryo aprint_normal_dev(sc->sc_dev, "Etheraddr: %s\n", 3728 1.43 ryo ether_sprintf(sc->sc_enaddr.ether_addr_octet)); 3729 1.43 ryo 3730 1.43 ryo return 0; 3731 1.43 ryo } 3732 1.43 ryo 3733 1.43 ryo static int 3734 1.1 ryo aq_ifmedia_change(struct ifnet * const ifp) 3735 1.1 ryo { 3736 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 3737 1.33 skrll 3738 1.1 ryo aq_link_speed_t rate = AQ_LINK_NONE; 3739 1.1 ryo aq_link_fc_t fc = AQ_FC_NONE; 3740 1.1 ryo aq_link_eee_t eee = AQ_EEE_DISABLE; 3741 1.1 ryo 3742 1.1 ryo if (IFM_TYPE(sc->sc_media.ifm_media) != IFM_ETHER) 3743 1.1 ryo return EINVAL; 3744 1.1 ryo 3745 1.1 ryo switch (IFM_SUBTYPE(sc->sc_media.ifm_media)) { 3746 1.1 ryo case IFM_AUTO: 3747 1.1 ryo rate = AQ_LINK_AUTO; 3748 1.1 ryo break; 3749 1.1 ryo case IFM_NONE: 3750 1.1 ryo rate = AQ_LINK_NONE; 3751 1.1 ryo break; 3752 1.43 ryo case IFM_10_T: 3753 1.43 ryo rate = AQ_LINK_10M; 3754 1.43 ryo break; 3755 1.1 ryo case IFM_100_TX: 3756 1.1 ryo rate = AQ_LINK_100M; 3757 1.1 ryo break; 3758 1.1 ryo case IFM_1000_T: 3759 1.1 ryo rate = AQ_LINK_1G; 3760 1.1 ryo break; 3761 1.1 ryo case IFM_2500_T: 3762 1.1 ryo rate = AQ_LINK_2G5; 3763 1.1 ryo break; 3764 1.1 ryo case IFM_5000_T: 3765 1.1 ryo rate = AQ_LINK_5G; 3766 1.1 ryo break; 3767 1.1 ryo case IFM_10G_T: 3768 1.1 ryo rate = AQ_LINK_10G; 3769 1.1 ryo break; 3770 1.1 ryo default: 3771 1.1 ryo device_printf(sc->sc_dev, "unknown media: 0x%X\n", 3772 1.1 ryo IFM_SUBTYPE(sc->sc_media.ifm_media)); 3773 1.1 ryo return ENODEV; 3774 1.1 ryo } 3775 1.1 ryo 3776 1.1 ryo if (sc->sc_media.ifm_media & IFM_FLOW) 3777 1.1 ryo fc = AQ_FC_ALL; 3778 1.1 ryo 3779 1.1 ryo /* XXX: todo EEE */ 3780 1.1 ryo 3781 1.1 ryo /* re-initialize hardware with new parameters */ 3782 1.1 ryo aq_set_linkmode(sc, rate, fc, eee); 3783 1.1 ryo 3784 1.1 ryo return 0; 3785 1.1 ryo } 3786 1.1 ryo 3787 1.1 ryo static void 3788 1.1 ryo aq_ifmedia_status(struct ifnet * const ifp, struct ifmediareq *ifmr) 3789 1.1 ryo { 3790 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 3791 1.1 ryo 3792 1.11 ryo /* update ifm_active */ 3793 1.1 ryo ifmr->ifm_active = IFM_ETHER; 3794 1.11 ryo if (sc->sc_link_fc & AQ_FC_RX) 3795 1.11 ryo ifmr->ifm_active |= IFM_ETH_RXPAUSE; 3796 1.11 ryo if (sc->sc_link_fc & AQ_FC_TX) 3797 1.11 ryo ifmr->ifm_active |= IFM_ETH_TXPAUSE; 3798 1.11 ryo 3799 1.43 ryo /* XXX: need to detect fulldup or halfdup */ 3800 1.11 ryo switch (sc->sc_link_rate) { 3801 1.43 ryo case AQ_LINK_10M: 3802 1.43 ryo ifmr->ifm_active |= IFM_10_T | IFM_FDX; 3803 1.43 ryo break; 3804 1.11 ryo case AQ_LINK_100M: 3805 1.11 ryo ifmr->ifm_active |= IFM_100_TX | IFM_FDX; 3806 1.11 ryo break; 3807 1.11 ryo case AQ_LINK_1G: 3808 1.11 ryo ifmr->ifm_active |= IFM_1000_T | IFM_FDX; 3809 1.11 ryo break; 3810 1.11 ryo case AQ_LINK_2G5: 3811 1.11 ryo ifmr->ifm_active |= IFM_2500_T | IFM_FDX; 3812 1.11 ryo break; 3813 1.11 ryo case AQ_LINK_5G: 3814 1.11 ryo ifmr->ifm_active |= IFM_5000_T | IFM_FDX; 3815 1.11 ryo break; 3816 1.11 ryo case AQ_LINK_10G: 3817 1.11 ryo ifmr->ifm_active |= IFM_10G_T | IFM_FDX; 3818 1.11 ryo break; 3819 1.11 ryo default: 3820 1.11 ryo ifmr->ifm_active |= IFM_NONE; 3821 1.11 ryo break; 3822 1.11 ryo } 3823 1.11 ryo 3824 1.11 ryo /* update ifm_status */ 3825 1.1 ryo ifmr->ifm_status = IFM_AVALID; 3826 1.1 ryo if (sc->sc_link_rate != AQ_LINK_NONE) 3827 1.1 ryo ifmr->ifm_status |= IFM_ACTIVE; 3828 1.1 ryo } 3829 1.1 ryo 3830 1.1 ryo static void 3831 1.1 ryo aq_initmedia(struct aq_softc *sc) 3832 1.1 ryo { 3833 1.1 ryo #define IFMEDIA_ETHER_ADD(sc, media) \ 3834 1.1 ryo ifmedia_add(&(sc)->sc_media, IFM_ETHER | media, 0, NULL); 3835 1.1 ryo 3836 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_NONE); 3837 1.43 ryo 3838 1.43 ryo if (sc->sc_available_rates & AQ_LINK_10M) { 3839 1.43 ryo IFMEDIA_ETHER_ADD(sc, IFM_10_T); 3840 1.43 ryo IFMEDIA_ETHER_ADD(sc, IFM_10_T | IFM_FDX); 3841 1.43 ryo } 3842 1.1 ryo if (sc->sc_available_rates & AQ_LINK_100M) { 3843 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_100_TX); 3844 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_100_TX | IFM_FLOW); 3845 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_100_TX | IFM_FDX | IFM_FLOW); 3846 1.1 ryo } 3847 1.1 ryo if (sc->sc_available_rates & AQ_LINK_1G) { 3848 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_1000_T | IFM_FDX); 3849 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_1000_T | IFM_FDX | IFM_FLOW); 3850 1.1 ryo } 3851 1.1 ryo if (sc->sc_available_rates & AQ_LINK_2G5) { 3852 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_2500_T | IFM_FDX); 3853 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_2500_T | IFM_FDX | IFM_FLOW); 3854 1.1 ryo } 3855 1.1 ryo if (sc->sc_available_rates & AQ_LINK_5G) { 3856 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_5000_T | IFM_FDX); 3857 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_5000_T | IFM_FDX | IFM_FLOW); 3858 1.1 ryo } 3859 1.1 ryo if (sc->sc_available_rates & AQ_LINK_10G) { 3860 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_10G_T | IFM_FDX); 3861 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_10G_T | IFM_FDX | IFM_FLOW); 3862 1.1 ryo } 3863 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_AUTO); 3864 1.1 ryo IFMEDIA_ETHER_ADD(sc, IFM_AUTO | IFM_FLOW); 3865 1.1 ryo 3866 1.1 ryo /* default: auto without flowcontrol */ 3867 1.1 ryo ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO); 3868 1.1 ryo aq_set_linkmode(sc, AQ_LINK_AUTO, AQ_FC_NONE, AQ_EEE_DISABLE); 3869 1.1 ryo } 3870 1.1 ryo 3871 1.1 ryo static int 3872 1.1 ryo aq_set_linkmode(struct aq_softc *sc, aq_link_speed_t speed, aq_link_fc_t fc, 3873 1.1 ryo aq_link_eee_t eee) 3874 1.1 ryo { 3875 1.1 ryo return sc->sc_fw_ops->set_mode(sc, MPI_INIT, speed, fc, eee); 3876 1.1 ryo } 3877 1.1 ryo 3878 1.1 ryo static int 3879 1.1 ryo aq_get_linkmode(struct aq_softc *sc, aq_link_speed_t *speed, aq_link_fc_t *fc, 3880 1.1 ryo aq_link_eee_t *eee) 3881 1.1 ryo { 3882 1.1 ryo aq_hw_fw_mpi_state_t mode; 3883 1.1 ryo int error; 3884 1.1 ryo 3885 1.1 ryo error = sc->sc_fw_ops->get_mode(sc, &mode, speed, fc, eee); 3886 1.1 ryo if (error != 0) 3887 1.1 ryo return error; 3888 1.1 ryo if (mode != MPI_INIT) 3889 1.1 ryo return ENXIO; 3890 1.1 ryo 3891 1.1 ryo return 0; 3892 1.1 ryo } 3893 1.1 ryo 3894 1.1 ryo static void 3895 1.1 ryo aq_hw_init_tx_path(struct aq_softc *sc) 3896 1.1 ryo { 3897 1.1 ryo /* Tx TC/RSS number config */ 3898 1.43 ryo AQ_WRITE_REG_BIT(sc, TPB_TX_BUF_REG, TPB_TX_BUF_TC_MODE, 3899 1.43 ryo (sc->sc_tc_mode == 4) ? 1 : 0); 3900 1.1 ryo 3901 1.1 ryo AQ_WRITE_REG_BIT(sc, THM_LSO_TCP_FLAG1_REG, 3902 1.1 ryo THM_LSO_TCP_FLAG1_FIRST, 0x0ff6); 3903 1.1 ryo AQ_WRITE_REG_BIT(sc, THM_LSO_TCP_FLAG1_REG, 3904 1.1 ryo THM_LSO_TCP_FLAG1_MID, 0x0ff6); 3905 1.1 ryo AQ_WRITE_REG_BIT(sc, THM_LSO_TCP_FLAG2_REG, 3906 1.1 ryo THM_LSO_TCP_FLAG2_LAST, 0x0f7f); 3907 1.1 ryo 3908 1.1 ryo /* misc */ 3909 1.1 ryo AQ_WRITE_REG(sc, TX_TPO2_REG, 3910 1.1 ryo (sc->sc_features & FEATURES_TPO2) ? TX_TPO2_EN : 0); 3911 1.1 ryo AQ_WRITE_REG_BIT(sc, TDM_DCA_REG, TDM_DCA_EN, 0); 3912 1.1 ryo AQ_WRITE_REG_BIT(sc, TDM_DCA_REG, TDM_DCA_MODE, 0); 3913 1.1 ryo 3914 1.1 ryo AQ_WRITE_REG_BIT(sc, TPB_TX_BUF_REG, TPB_TX_BUF_SCP_INS_EN, 1); 3915 1.43 ryo 3916 1.43 ryo if ((sc->sc_features & FEATURES_AQ1_REV_B) || HWTYPE_AQ2_P(sc)) { 3917 1.43 ryo AQ_WRITE_REG_BIT(sc, TPB_TX_BUF_REG, TPB_TX_BUF_CLK_GATE_EN, 0); 3918 1.43 ryo } 3919 1.1 ryo } 3920 1.1 ryo 3921 1.1 ryo static void 3922 1.1 ryo aq_hw_init_rx_path(struct aq_softc *sc) 3923 1.1 ryo { 3924 1.1 ryo int i; 3925 1.1 ryo 3926 1.43 ryo /* Rx TC/RSS number config */ 3927 1.43 ryo AQ_WRITE_REG_BIT(sc, RPB_RPF_RX_REG, RPB_RPF_RX_TC_MODE, 3928 1.43 ryo (sc->sc_tc_mode == 4) ? 1 : 0); 3929 1.43 ryo 3930 1.43 ryo /* Rx flow control */ 3931 1.1 ryo AQ_WRITE_REG_BIT(sc, RPB_RPF_RX_REG, RPB_RPF_RX_FC_MODE, 0); 3932 1.43 ryo 3933 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 3934 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_RPF_REDIR2_REG, 3935 1.43 ryo AQ2_RPF_REDIR2_HASHTYPE, AQ2_RPF_REDIR2_HASHTYPE_ALL); 3936 1.1 ryo } 3937 1.1 ryo 3938 1.1 ryo if (sc->sc_rss_enable) { 3939 1.1 ryo /* RSS Ring selection */ 3940 1.1 ryo switch (sc->sc_nqueues) { 3941 1.1 ryo case 2: 3942 1.1 ryo AQ_WRITE_REG(sc, RX_FLR_RSS_CONTROL1_REG, 3943 1.1 ryo RX_FLR_RSS_CONTROL1_EN | 0x11111111); 3944 1.1 ryo break; 3945 1.1 ryo case 4: 3946 1.1 ryo AQ_WRITE_REG(sc, RX_FLR_RSS_CONTROL1_REG, 3947 1.1 ryo RX_FLR_RSS_CONTROL1_EN | 0x22222222); 3948 1.1 ryo break; 3949 1.1 ryo case 8: 3950 1.1 ryo AQ_WRITE_REG(sc, RX_FLR_RSS_CONTROL1_REG, 3951 1.1 ryo RX_FLR_RSS_CONTROL1_EN | 0x33333333); 3952 1.1 ryo break; 3953 1.1 ryo } 3954 1.43 ryo } else { 3955 1.43 ryo /* disable RSS */ 3956 1.43 ryo AQ_WRITE_REG(sc, RX_FLR_RSS_CONTROL1_REG, 0); 3957 1.43 ryo } 3958 1.43 ryo 3959 1.43 ryo if (HWTYPE_AQ1_P(sc)) { 3960 1.43 ryo /* multicast filter */ 3961 1.43 ryo for (i = 0; i < 32; i++) { 3962 1.43 ryo AQ_WRITE_REG_BIT(sc, RPF_ETHERTYPE_FILTER_REG(i), 3963 1.43 ryo RPF_ETHERTYPE_FILTER_EN, 0); 3964 1.43 ryo } 3965 1.1 ryo } 3966 1.1 ryo 3967 1.1 ryo /* L2 and Multicast filters */ 3968 1.43 ryo for (i = 0; i < AQ_HW_MAC_NUM(sc); i++) { 3969 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2UC_MSW_REG(i), RPF_L2UC_MSW_EN, 0); 3970 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2UC_MSW_REG(i), RPF_L2UC_MSW_ACTION, 3971 1.1 ryo RPF_ACTION_HOST); 3972 1.1 ryo } 3973 1.1 ryo AQ_WRITE_REG(sc, RPF_MCAST_FILTER_MASK_REG, 0); 3974 1.1 ryo AQ_WRITE_REG(sc, RPF_MCAST_FILTER_REG(0), 0x00010fff); 3975 1.1 ryo 3976 1.1 ryo /* Vlan filters */ 3977 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_TPID_REG, RPF_VLAN_TPID_OUTER, 3978 1.1 ryo ETHERTYPE_QINQ); 3979 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_TPID_REG, RPF_VLAN_TPID_INNER, 3980 1.1 ryo ETHERTYPE_VLAN); 3981 1.10 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_MODE_REG, RPF_VLAN_MODE_PROMISC, 0); 3982 1.1 ryo 3983 1.43 ryo if ((sc->sc_features & FEATURES_AQ1_REV_B) || HWTYPE_AQ2_P(sc)) { 3984 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_MODE_REG, 3985 1.1 ryo RPF_VLAN_MODE_ACCEPT_UNTAGGED, 1); 3986 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_MODE_REG, 3987 1.1 ryo RPF_VLAN_MODE_UNTAGGED_ACTION, RPF_ACTION_HOST); 3988 1.1 ryo } 3989 1.1 ryo 3990 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 3991 1.43 ryo aq2_init_filter(sc); 3992 1.43 ryo } 3993 1.43 ryo 3994 1.43 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_INT_DESC_WRWB_EN_REG, 3995 1.43 ryo RX_DMA_INT_DESC_WRWB_EN, 1); 3996 1.1 ryo 3997 1.43 ryo if (HWTYPE_AQ1_P(sc)) { 3998 1.43 ryo if (sc->sc_features & FEATURES_RPF2) { 3999 1.43 ryo AQ_WRITE_REG(sc, RX_TCP_RSS_HASH_REG, 4000 1.43 ryo RX_TCP_RSS_HASH_RPF2); 4001 1.43 ryo } else { 4002 1.43 ryo AQ_WRITE_REG(sc, RX_TCP_RSS_HASH_REG, 0); 4003 1.43 ryo } 4004 1.43 ryo /* 4005 1.43 ryo * XXX: RX_TCP_RSS_HASH_REG: 4006 1.43 ryo * linux set 0x000f0000 4007 1.43 ryo * freebsd set 0x000f001e 4008 1.43 ryo */ 4009 1.43 ryo /* RSS hash type set for IP/TCP */ 4010 1.43 ryo AQ_WRITE_REG_BIT(sc, RX_TCP_RSS_HASH_REG, 4011 1.43 ryo RX_TCP_RSS_HASH_TYPE, 0x001e); 4012 1.43 ryo } 4013 1.1 ryo 4014 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2BC_REG, RPF_L2BC_EN, 1); 4015 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2BC_REG, RPF_L2BC_ACTION, RPF_ACTION_HOST); 4016 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L2BC_REG, RPF_L2BC_THRESHOLD, 0xffff); 4017 1.1 ryo 4018 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DCA_REG, RX_DMA_DCA_EN, 0); 4019 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DCA_REG, RX_DMA_DCA_MODE, 0); 4020 1.1 ryo } 4021 1.1 ryo 4022 1.1 ryo static void 4023 1.1 ryo aq_hw_interrupt_moderation_set(struct aq_softc *sc) 4024 1.1 ryo { 4025 1.43 ryo uint32_t v; 4026 1.1 ryo int i; 4027 1.1 ryo 4028 1.1 ryo if (sc->sc_intr_moderation_enable) { 4029 1.1 ryo unsigned int tx_min, rx_min; /* 0-255 */ 4030 1.1 ryo unsigned int tx_max, rx_max; /* 0-511? */ 4031 1.1 ryo 4032 1.1 ryo switch (sc->sc_link_rate) { 4033 1.43 ryo case AQ_LINK_10M: 4034 1.1 ryo case AQ_LINK_100M: 4035 1.1 ryo tx_min = 0x4f; 4036 1.1 ryo tx_max = 0xff; 4037 1.1 ryo rx_min = 0x04; 4038 1.1 ryo rx_max = 0x50; 4039 1.1 ryo break; 4040 1.1 ryo case AQ_LINK_1G: 4041 1.1 ryo default: 4042 1.1 ryo tx_min = 0x4f; 4043 1.1 ryo tx_max = 0xff; 4044 1.1 ryo rx_min = 0x30; 4045 1.1 ryo rx_max = 0x80; 4046 1.1 ryo break; 4047 1.1 ryo case AQ_LINK_2G5: 4048 1.1 ryo tx_min = 0x4f; 4049 1.1 ryo tx_max = 0xff; 4050 1.1 ryo rx_min = 0x18; 4051 1.1 ryo rx_max = 0xe0; 4052 1.1 ryo break; 4053 1.1 ryo case AQ_LINK_5G: 4054 1.1 ryo tx_min = 0x4f; 4055 1.1 ryo tx_max = 0xff; 4056 1.1 ryo rx_min = 0x0c; 4057 1.1 ryo rx_max = 0x70; 4058 1.1 ryo break; 4059 1.1 ryo case AQ_LINK_10G: 4060 1.1 ryo tx_min = 0x4f; 4061 1.1 ryo tx_max = 0x1ff; 4062 1.1 ryo rx_min = 0x06; /* freebsd use 80 */ 4063 1.1 ryo rx_max = 0x38; /* freebsd use 120 */ 4064 1.1 ryo break; 4065 1.1 ryo } 4066 1.1 ryo 4067 1.1 ryo AQ_WRITE_REG_BIT(sc, TX_DMA_INT_DESC_WRWB_EN_REG, 4068 1.1 ryo TX_DMA_INT_DESC_WRWB_EN, 0); 4069 1.1 ryo AQ_WRITE_REG_BIT(sc, TX_DMA_INT_DESC_WRWB_EN_REG, 4070 1.1 ryo TX_DMA_INT_DESC_MODERATE_EN, 1); 4071 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_INT_DESC_WRWB_EN_REG, 4072 1.1 ryo RX_DMA_INT_DESC_WRWB_EN, 0); 4073 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_INT_DESC_WRWB_EN_REG, 4074 1.1 ryo RX_DMA_INT_DESC_MODERATE_EN, 1); 4075 1.1 ryo 4076 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 4077 1.43 ryo v = __SHIFTIN(tx_min, AQ2_TX_INTR_MODERATION_CTL_MIN) | 4078 1.43 ryo __SHIFTIN(tx_max, AQ2_TX_INTR_MODERATION_CTL_MAX) | 4079 1.43 ryo AQ2_TX_INTR_MODERATION_CTL_EN; 4080 1.43 ryo for (i = 0; i < AQ_RINGS_NUM; i++) { 4081 1.43 ryo AQ_WRITE_REG(sc, 4082 1.43 ryo AQ2_TX_INTR_MODERATION_CTL_REG(i), v); 4083 1.43 ryo } 4084 1.43 ryo } else { 4085 1.43 ryo v = __SHIFTIN(tx_min, TX_INTR_MODERATION_CTL_MIN) | 4086 1.1 ryo __SHIFTIN(tx_max, TX_INTR_MODERATION_CTL_MAX) | 4087 1.43 ryo TX_INTR_MODERATION_CTL_EN; 4088 1.43 ryo for (i = 0; i < AQ_RINGS_NUM; i++) { 4089 1.43 ryo AQ_WRITE_REG(sc, 4090 1.43 ryo TX_INTR_MODERATION_CTL_REG(i), v); 4091 1.43 ryo } 4092 1.1 ryo } 4093 1.43 ryo 4094 1.1 ryo for (i = 0; i < AQ_RINGS_NUM; i++) { 4095 1.1 ryo AQ_WRITE_REG(sc, RX_INTR_MODERATION_CTL_REG(i), 4096 1.1 ryo __SHIFTIN(rx_min, RX_INTR_MODERATION_CTL_MIN) | 4097 1.1 ryo __SHIFTIN(rx_max, RX_INTR_MODERATION_CTL_MAX) | 4098 1.1 ryo RX_INTR_MODERATION_CTL_EN); 4099 1.1 ryo } 4100 1.1 ryo 4101 1.1 ryo } else { 4102 1.1 ryo AQ_WRITE_REG_BIT(sc, TX_DMA_INT_DESC_WRWB_EN_REG, 4103 1.1 ryo TX_DMA_INT_DESC_WRWB_EN, 1); 4104 1.1 ryo AQ_WRITE_REG_BIT(sc, TX_DMA_INT_DESC_WRWB_EN_REG, 4105 1.1 ryo TX_DMA_INT_DESC_MODERATE_EN, 0); 4106 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_INT_DESC_WRWB_EN_REG, 4107 1.1 ryo RX_DMA_INT_DESC_WRWB_EN, 1); 4108 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_INT_DESC_WRWB_EN_REG, 4109 1.1 ryo RX_DMA_INT_DESC_MODERATE_EN, 0); 4110 1.1 ryo 4111 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 4112 1.43 ryo for (i = 0; i < AQ_RINGS_NUM; i++) { 4113 1.43 ryo AQ_WRITE_REG(sc, 4114 1.43 ryo AQ2_TX_INTR_MODERATION_CTL_REG(i), 0); 4115 1.43 ryo } 4116 1.43 ryo } else { 4117 1.43 ryo for (i = 0; i < AQ_RINGS_NUM; i++) { 4118 1.43 ryo AQ_WRITE_REG(sc, 4119 1.43 ryo TX_INTR_MODERATION_CTL_REG(i), 0); 4120 1.43 ryo } 4121 1.1 ryo } 4122 1.43 ryo 4123 1.1 ryo for (i = 0; i < AQ_RINGS_NUM; i++) { 4124 1.1 ryo AQ_WRITE_REG(sc, RX_INTR_MODERATION_CTL_REG(i), 0); 4125 1.1 ryo } 4126 1.1 ryo } 4127 1.1 ryo } 4128 1.1 ryo 4129 1.1 ryo static void 4130 1.1 ryo aq_hw_qos_set(struct aq_softc *sc) 4131 1.1 ryo { 4132 1.43 ryo uint32_t tc, tx_bufsize, rx_bufsize; 4133 1.1 ryo 4134 1.1 ryo /* TPS Descriptor rate init */ 4135 1.1 ryo AQ_WRITE_REG_BIT(sc, TPS_DESC_RATE_REG, TPS_DESC_RATE_TA_RST, 0); 4136 1.1 ryo AQ_WRITE_REG_BIT(sc, TPS_DESC_RATE_REG, TPS_DESC_RATE_LIM, 0xa); 4137 1.1 ryo 4138 1.1 ryo /* TPS VM init */ 4139 1.1 ryo AQ_WRITE_REG_BIT(sc, TPS_DESC_VM_ARB_MODE_REG, TPS_DESC_VM_ARB_MODE, 0); 4140 1.1 ryo 4141 1.1 ryo /* TPS TC credits init */ 4142 1.1 ryo AQ_WRITE_REG_BIT(sc, TPS_DESC_TC_ARB_MODE_REG, TPS_DESC_TC_ARB_MODE, 0); 4143 1.1 ryo AQ_WRITE_REG_BIT(sc, TPS_DATA_TC_ARB_MODE_REG, TPS_DATA_TC_ARB_MODE, 0); 4144 1.1 ryo 4145 1.43 ryo if (HWTYPE_AQ1_P(sc)) { 4146 1.43 ryo tx_bufsize = AQ1_HW_TXBUF_MAX / sc->sc_tcs; 4147 1.43 ryo rx_bufsize = AQ1_HW_RXBUF_MAX / sc->sc_tcs; 4148 1.43 ryo } else { 4149 1.43 ryo tx_bufsize = AQ2_HW_TXBUF_MAX / sc->sc_tcs; 4150 1.43 ryo rx_bufsize = AQ2_HW_RXBUF_MAX / sc->sc_tcs; 4151 1.43 ryo } 4152 1.43 ryo 4153 1.43 ryo for (tc = 0; tc < sc->sc_tcs; tc++) { 4154 1.43 ryo AQ_WRITE_REG_BIT(sc, TPS_DATA_TCT_REG(tc), 4155 1.43 ryo TPS_DATA_TCT_CREDIT_MAX, 0xfff); 4156 1.43 ryo AQ_WRITE_REG_BIT(sc, TPS_DATA_TCT_REG(tc), 4157 1.43 ryo TPS_DATA_TCT_WEIGHT, 0x64); 4158 1.43 ryo AQ_WRITE_REG_BIT(sc, TPS_DESC_TCT_REG(tc), 4159 1.43 ryo TPS_DESC_TCT_CREDIT_MAX, 0x50); 4160 1.43 ryo AQ_WRITE_REG_BIT(sc, TPS_DESC_TCT_REG(tc), 4161 1.43 ryo TPS_DESC_TCT_WEIGHT, 0x1e); 4162 1.43 ryo 4163 1.43 ryo /* Tx buf size */ 4164 1.43 ryo AQ_WRITE_REG_BIT(sc, TPB_TXB_BUFSIZE_REG(tc), TPB_TXB_BUFSIZE, 4165 1.43 ryo tx_bufsize); 4166 1.43 ryo AQ_WRITE_REG_BIT(sc, TPB_TXB_THRESH_REG(tc), TPB_TXB_THRESH_HI, 4167 1.43 ryo (tx_bufsize * (1024 / 32) * 66) / 100); 4168 1.43 ryo AQ_WRITE_REG_BIT(sc, TPB_TXB_THRESH_REG(tc), TPB_TXB_THRESH_LO, 4169 1.43 ryo (tx_bufsize * (1024 / 32) * 50) / 100); 4170 1.43 ryo 4171 1.43 ryo /* QoS Rx buf size per TC */ 4172 1.43 ryo AQ_WRITE_REG_BIT(sc, RPB_RXB_XOFF_REG(tc), RPB_RXB_XOFF_EN, 0); 4173 1.43 ryo AQ_WRITE_REG_BIT(sc, RPB_RXB_BUFSIZE_REG(tc), RPB_RXB_BUFSIZE, 4174 1.43 ryo rx_bufsize); 4175 1.43 ryo AQ_WRITE_REG_BIT(sc, RPB_RXB_XOFF_REG(tc), 4176 1.43 ryo RPB_RXB_XOFF_THRESH_HI, 4177 1.43 ryo (rx_bufsize * (1024 / 32) * 66) / 100); 4178 1.43 ryo AQ_WRITE_REG_BIT(sc, RPB_RXB_XOFF_REG(tc), 4179 1.43 ryo RPB_RXB_XOFF_THRESH_LO, 4180 1.43 ryo (rx_bufsize * (1024 / 32) * 50) / 100); 4181 1.43 ryo } 4182 1.1 ryo 4183 1.1 ryo /* QoS 802.1p priority -> TC mapping */ 4184 1.43 ryo for (int pri = 0; pri < 8; pri++) { 4185 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_RPB_RX_TC_UPT_REG, 4186 1.43 ryo RPF_RPB_RX_TC_UPT_MASK(pri), sc->sc_tcs * pri / 8); 4187 1.43 ryo } 4188 1.43 ryo 4189 1.43 ryo /* ring to TC mapping */ 4190 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 4191 1.43 ryo AQ_WRITE_REG_BIT(sc, TPB_TX_BUF_REG, 4192 1.43 ryo TPB_TX_BUF_TC_Q_RAND_MAP_EN, 1); 4193 1.43 ryo switch (sc->sc_tc_mode) { 4194 1.43 ryo case 4: 4195 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(0), 0x00000000); 4196 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(1), 0x00000000); 4197 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(2), 0x01010101); 4198 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(3), 0x01010101); 4199 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(4), 0x02020202); 4200 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(5), 0x02020202); 4201 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(6), 0x03030303); 4202 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(7), 0x03030303); 4203 1.43 ryo 4204 1.43 ryo AQ_WRITE_REG(sc, AQ2_RX_Q_TC_MAP_REG(0), 0x00000000); 4205 1.43 ryo AQ_WRITE_REG(sc, AQ2_RX_Q_TC_MAP_REG(1), 0x11111111); 4206 1.43 ryo AQ_WRITE_REG(sc, AQ2_RX_Q_TC_MAP_REG(2), 0x22222222); 4207 1.43 ryo AQ_WRITE_REG(sc, AQ2_RX_Q_TC_MAP_REG(3), 0x33333333); 4208 1.43 ryo break; 4209 1.43 ryo case 8: 4210 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(0), 0x00000000); 4211 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(1), 0x01010101); 4212 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(2), 0x02020202); 4213 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(3), 0x03030303); 4214 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(4), 0x04040404); 4215 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(5), 0x05050505); 4216 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(6), 0x06060606); 4217 1.43 ryo AQ_WRITE_REG(sc, AQ2_TX_Q_TC_MAP_REG(7), 0x07070707); 4218 1.43 ryo 4219 1.43 ryo AQ_WRITE_REG(sc, AQ2_RX_Q_TC_MAP_REG(0), 0x11110000); 4220 1.43 ryo AQ_WRITE_REG(sc, AQ2_RX_Q_TC_MAP_REG(1), 0x33332222); 4221 1.43 ryo AQ_WRITE_REG(sc, AQ2_RX_Q_TC_MAP_REG(2), 0x55554444); 4222 1.43 ryo AQ_WRITE_REG(sc, AQ2_RX_Q_TC_MAP_REG(3), 0x77776666); 4223 1.43 ryo break; 4224 1.43 ryo } 4225 1.1 ryo } 4226 1.1 ryo } 4227 1.1 ryo 4228 1.1 ryo static int 4229 1.1 ryo aq_init_rss(struct aq_softc *sc) 4230 1.1 ryo { 4231 1.1 ryo CTASSERT(AQ_RSS_HASHKEY_SIZE == RSS_KEYSIZE); 4232 1.1 ryo uint32_t rss_key[RSS_KEYSIZE / sizeof(uint32_t)]; 4233 1.1 ryo uint8_t rss_table[AQ_RSS_INDIRECTION_TABLE_MAX]; 4234 1.1 ryo unsigned int i; 4235 1.1 ryo int error; 4236 1.1 ryo 4237 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 4238 1.43 ryo uint32_t q_per_tc = (sc->sc_tc_mode == 8) ? 4 : 8; 4239 1.43 ryo uint32_t tc; 4240 1.43 ryo 4241 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_RPF_REDIR2_REG, 4242 1.43 ryo AQ2_RPF_REDIR2_INDEX, (sc->sc_tc_mode == 8) ? 1 : 0); 4243 1.43 ryo for (i = 0; i < AQ_RSS_INDIRECTION_TABLE_MAX; i++) { 4244 1.43 ryo for (tc = 0; tc < sc->sc_tc_mode; tc++) { 4245 1.43 ryo uint32_t q = tc * q_per_tc + (i % sc->sc_nqueues); 4246 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_RPF_RSS_REDIR_REG(tc, i), 4247 1.43 ryo AQ2_RPF_RSS_REDIR_TC_MASK(tc), q); 4248 1.43 ryo } 4249 1.43 ryo } 4250 1.43 ryo } 4251 1.43 ryo 4252 1.1 ryo /* initialize rss key */ 4253 1.1 ryo rss_getkey((uint8_t *)rss_key); 4254 1.1 ryo 4255 1.1 ryo /* hash to ring table */ 4256 1.1 ryo for (i = 0; i < AQ_RSS_INDIRECTION_TABLE_MAX; i++) { 4257 1.1 ryo rss_table[i] = i % sc->sc_nqueues; 4258 1.1 ryo } 4259 1.1 ryo 4260 1.1 ryo /* 4261 1.1 ryo * set rss key 4262 1.1 ryo */ 4263 1.1 ryo for (i = 0; i < __arraycount(rss_key); i++) { 4264 1.1 ryo uint32_t key_data = sc->sc_rss_enable ? ntohl(rss_key[i]) : 0; 4265 1.1 ryo AQ_WRITE_REG(sc, RPF_RSS_KEY_WR_DATA_REG, key_data); 4266 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_RSS_KEY_ADDR_REG, 4267 1.1 ryo RPF_RSS_KEY_ADDR, __arraycount(rss_key) - 1 - i); 4268 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_RSS_KEY_ADDR_REG, 4269 1.1 ryo RPF_RSS_KEY_WR_EN, 1); 4270 1.1 ryo WAIT_FOR(AQ_READ_REG_BIT(sc, RPF_RSS_KEY_ADDR_REG, 4271 1.1 ryo RPF_RSS_KEY_WR_EN) == 0, 1000, 10, &error); 4272 1.1 ryo if (error != 0) { 4273 1.1 ryo device_printf(sc->sc_dev, "%s: rss key write timeout\n", 4274 1.1 ryo __func__); 4275 1.1 ryo goto rss_set_timeout; 4276 1.1 ryo } 4277 1.1 ryo } 4278 1.1 ryo 4279 1.1 ryo /* 4280 1.1 ryo * set rss indirection table 4281 1.1 ryo * 4282 1.1 ryo * AQ's rss redirect table is consist of 3bit*64 (192bit) packed array. 4283 1.1 ryo * we'll make it by __BITMAP(3) macros. 4284 1.1 ryo */ 4285 1.1 ryo __BITMAP_TYPE(, uint16_t, 3 * AQ_RSS_INDIRECTION_TABLE_MAX) bit3x64; 4286 1.1 ryo __BITMAP_ZERO(&bit3x64); 4287 1.1 ryo 4288 1.1 ryo #define AQ_3BIT_PACKED_ARRAY_SET(bitmap, idx, val) \ 4289 1.1 ryo do { \ 4290 1.1 ryo if (val & 1) { \ 4291 1.1 ryo __BITMAP_SET((idx) * 3, (bitmap)); \ 4292 1.1 ryo } else { \ 4293 1.1 ryo __BITMAP_CLR((idx) * 3, (bitmap)); \ 4294 1.1 ryo } \ 4295 1.1 ryo if (val & 2) { \ 4296 1.1 ryo __BITMAP_SET((idx) * 3 + 1, (bitmap)); \ 4297 1.1 ryo } else { \ 4298 1.1 ryo __BITMAP_CLR((idx) * 3 + 1, (bitmap)); \ 4299 1.1 ryo } \ 4300 1.1 ryo if (val & 4) { \ 4301 1.1 ryo __BITMAP_SET((idx) * 3 + 2, (bitmap)); \ 4302 1.1 ryo } else { \ 4303 1.1 ryo __BITMAP_CLR((idx) * 3 + 2, (bitmap)); \ 4304 1.1 ryo } \ 4305 1.1 ryo } while (0 /* CONSTCOND */) 4306 1.1 ryo 4307 1.1 ryo for (i = 0; i < AQ_RSS_INDIRECTION_TABLE_MAX; i++) { 4308 1.1 ryo AQ_3BIT_PACKED_ARRAY_SET(&bit3x64, i, rss_table[i]); 4309 1.1 ryo } 4310 1.1 ryo 4311 1.1 ryo /* write 192bit data in steps of 16bit */ 4312 1.1 ryo for (i = 0; i < (int)__arraycount(bit3x64._b); i++) { 4313 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_RSS_REDIR_WR_DATA_REG, 4314 1.1 ryo RPF_RSS_REDIR_WR_DATA, bit3x64._b[i]); 4315 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_RSS_REDIR_ADDR_REG, 4316 1.1 ryo RPF_RSS_REDIR_ADDR, i); 4317 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_RSS_REDIR_ADDR_REG, 4318 1.1 ryo RPF_RSS_REDIR_WR_EN, 1); 4319 1.1 ryo 4320 1.1 ryo WAIT_FOR(AQ_READ_REG_BIT(sc, RPF_RSS_REDIR_ADDR_REG, 4321 1.1 ryo RPF_RSS_REDIR_WR_EN) == 0, 1000, 10, &error); 4322 1.1 ryo if (error != 0) 4323 1.1 ryo break; 4324 1.1 ryo } 4325 1.1 ryo 4326 1.1 ryo rss_set_timeout: 4327 1.1 ryo return error; 4328 1.1 ryo } 4329 1.1 ryo 4330 1.1 ryo static void 4331 1.43 ryo aq1_hw_l3_filter_set(struct aq_softc *sc) 4332 1.1 ryo { 4333 1.1 ryo int i; 4334 1.1 ryo 4335 1.1 ryo /* clear all filter */ 4336 1.1 ryo for (i = 0; i < 8; i++) { 4337 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_L3_FILTER_REG(i), 4338 1.1 ryo RPF_L3_FILTER_L4_EN, 0); 4339 1.1 ryo } 4340 1.1 ryo } 4341 1.1 ryo 4342 1.1 ryo static void 4343 1.10 ryo aq_set_vlan_filters(struct aq_softc *sc) 4344 1.1 ryo { 4345 1.32 skrll struct ethercom * const ec = &sc->sc_ethercom; 4346 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 4347 1.10 ryo struct vlanid_list *vlanidp; 4348 1.1 ryo int i; 4349 1.1 ryo 4350 1.10 ryo ETHER_LOCK(ec); 4351 1.10 ryo 4352 1.10 ryo /* disable all vlan filters */ 4353 1.43 ryo for (i = 0; i < RPF_VLAN_MAX_FILTERS; i++) { 4354 1.10 ryo AQ_WRITE_REG(sc, RPF_VLAN_FILTER_REG(i), 0); 4355 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 4356 1.43 ryo aq2_filter_art_set(sc, AQ2_RPF_INDEX_VLAN_USER + i, 4357 1.43 ryo 0, 0, AQ2_ART_ACTION_DISABLE); 4358 1.43 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_FILTER_REG(i), 4359 1.43 ryo RPF_VLAN_FILTER_TAG, 1); 4360 1.43 ryo } 4361 1.43 ryo } 4362 1.10 ryo 4363 1.10 ryo /* count VID */ 4364 1.10 ryo i = 0; 4365 1.10 ryo SIMPLEQ_FOREACH(vlanidp, &ec->ec_vids, vid_list) 4366 1.10 ryo i++; 4367 1.10 ryo 4368 1.10 ryo if (((sc->sc_ethercom.ec_capenable & ETHERCAP_VLAN_HWFILTER) == 0) || 4369 1.10 ryo (ifp->if_flags & IFF_PROMISC) || 4370 1.10 ryo (i > RPF_VLAN_MAX_FILTERS)) { 4371 1.10 ryo /* 4372 1.10 ryo * no vlan hwfilter, in promiscuous mode, or too many VID? 4373 1.10 ryo * must receive all VID 4374 1.10 ryo */ 4375 1.10 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_MODE_REG, 4376 1.10 ryo RPF_VLAN_MODE_PROMISC, 1); 4377 1.10 ryo goto done; 4378 1.10 ryo } 4379 1.10 ryo 4380 1.10 ryo /* receive only selected VID */ 4381 1.10 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_MODE_REG, RPF_VLAN_MODE_PROMISC, 0); 4382 1.10 ryo i = 0; 4383 1.10 ryo SIMPLEQ_FOREACH(vlanidp, &ec->ec_vids, vid_list) { 4384 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_FILTER_REG(i), 4385 1.10 ryo RPF_VLAN_FILTER_EN, 1); 4386 1.1 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_FILTER_REG(i), 4387 1.1 ryo RPF_VLAN_FILTER_RXQ_EN, 0); 4388 1.10 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_FILTER_REG(i), 4389 1.10 ryo RPF_VLAN_FILTER_RXQ, 0); 4390 1.10 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_FILTER_REG(i), 4391 1.10 ryo RPF_VLAN_FILTER_ACTION, RPF_ACTION_HOST); 4392 1.10 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_FILTER_REG(i), 4393 1.10 ryo RPF_VLAN_FILTER_ID, vlanidp->vid); 4394 1.43 ryo 4395 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 4396 1.43 ryo /* 4397 1.43 ryo * If you want to fix the ring (CPU) for each VLAN ID, 4398 1.43 ryo * Use AQ2_ART_ACTION_ASSIGN_QUEUE(i % sc->sc_nqueues) 4399 1.43 ryo * instead of AQ2_ART_ACTION_ASSIGN_TC(). 4400 1.43 ryo */ 4401 1.43 ryo uint32_t action = 4402 1.43 ryo AQ2_ART_ACTION_ASSIGN_TC(i % sc->sc_nqueues); 4403 1.43 ryo 4404 1.43 ryo AQ_WRITE_REG_BIT(sc, RPF_VLAN_FILTER_REG(i), 4405 1.43 ryo RPF_VLAN_FILTER_TAG, i + 2); 4406 1.43 ryo aq2_filter_art_set(sc, AQ2_RPF_INDEX_VLAN_USER + i, 4407 1.43 ryo __SHIFTIN(i + 2, AQ2_RPF_TAG_VLAN_MASK), 4408 1.43 ryo AQ2_RPF_TAG_VLAN_MASK, action); 4409 1.43 ryo } 4410 1.10 ryo i++; 4411 1.1 ryo } 4412 1.10 ryo 4413 1.10 ryo done: 4414 1.10 ryo ETHER_UNLOCK(ec); 4415 1.1 ryo } 4416 1.1 ryo 4417 1.1 ryo static int 4418 1.1 ryo aq_hw_init(struct aq_softc *sc) 4419 1.1 ryo { 4420 1.1 ryo uint32_t v; 4421 1.1 ryo 4422 1.43 ryo if (HWTYPE_AQ1_P(sc)) { 4423 1.43 ryo /* Force limit MRRS on RDM/TDM to 2K */ 4424 1.43 ryo v = AQ_READ_REG(sc, AQ_PCI_REG_CONTROL_6_REG); 4425 1.43 ryo AQ_WRITE_REG(sc, AQ_PCI_REG_CONTROL_6_REG, 4426 1.43 ryo (v & ~0x0707) | 0x0404); 4427 1.1 ryo 4428 1.43 ryo /* 4429 1.43 ryo * TX DMA total request limit. B0 hardware is not capable to 4430 1.43 ryo * handle more than (8K-MRRS) incoming DMA data. 4431 1.43 ryo * Value 24 in 256byte units 4432 1.43 ryo */ 4433 1.43 ryo AQ_WRITE_REG(sc, AQ_HW_TX_DMA_TOTAL_REQ_LIMIT_REG, 24); 4434 1.43 ryo } 4435 1.43 ryo 4436 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 4437 1.43 ryo uint32_t fpgaver, speed; 4438 1.43 ryo fpgaver = AQ_READ_REG(sc, AQ2_HW_FPGA_VERSION_REG); 4439 1.43 ryo if (fpgaver < 0x01000000) 4440 1.43 ryo speed = AQ2_LAUNCHTIME_CTRL_RATIO_SPEED_FULL; 4441 1.43 ryo else if (fpgaver >= 0x01008502) 4442 1.43 ryo speed = AQ2_LAUNCHTIME_CTRL_RATIO_SPEED_HALF; 4443 1.43 ryo else 4444 1.43 ryo speed = AQ2_LAUNCHTIME_CTRL_RATIO_SPEED_QUATER; 4445 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_LAUNCHTIME_CTRL_REG, 4446 1.43 ryo AQ2_LAUNCHTIME_CTRL_RATIO, speed); 4447 1.43 ryo } 4448 1.1 ryo 4449 1.1 ryo aq_hw_init_tx_path(sc); 4450 1.1 ryo aq_hw_init_rx_path(sc); 4451 1.1 ryo 4452 1.1 ryo aq_hw_interrupt_moderation_set(sc); 4453 1.1 ryo 4454 1.1 ryo aq_set_mac_addr(sc, AQ_HW_MAC_OWN, sc->sc_enaddr.ether_addr_octet); 4455 1.1 ryo aq_set_linkmode(sc, AQ_LINK_NONE, AQ_FC_NONE, AQ_EEE_DISABLE); 4456 1.1 ryo 4457 1.1 ryo aq_hw_qos_set(sc); 4458 1.1 ryo 4459 1.43 ryo if (HWTYPE_AQ2_P(sc)) { 4460 1.43 ryo AQ_WRITE_REG_BIT(sc, AQ2_RPF_NEW_CTRL_REG, 4461 1.43 ryo AQ2_RPF_NEW_CTRL_ENABLE, 1); 4462 1.43 ryo } 4463 1.43 ryo 4464 1.1 ryo /* Enable interrupt */ 4465 1.1 ryo int irqmode; 4466 1.1 ryo if (sc->sc_msix) 4467 1.1 ryo irqmode = AQ_INTR_CTRL_IRQMODE_MSIX; 4468 1.1 ryo else 4469 1.1 ryo irqmode = AQ_INTR_CTRL_IRQMODE_MSI; 4470 1.1 ryo 4471 1.1 ryo AQ_WRITE_REG(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_RESET_DIS); 4472 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_MULTIVEC, 4473 1.1 ryo sc->sc_msix ? 1 : 0); 4474 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_INTR_CTRL_REG, AQ_INTR_CTRL_IRQMODE, irqmode); 4475 1.1 ryo 4476 1.1 ryo AQ_WRITE_REG(sc, AQ_INTR_AUTOMASK_REG, 0xffffffff); 4477 1.1 ryo 4478 1.1 ryo AQ_WRITE_REG(sc, AQ_GEN_INTR_MAP_REG(0), 4479 1.43 ryo ((AQ_B0_ERR_INT << 24) | (1 << 31)) | 4480 1.1 ryo ((AQ_B0_ERR_INT << 16) | (1 << 23)) 4481 1.1 ryo ); 4482 1.1 ryo 4483 1.1 ryo /* link interrupt */ 4484 1.1 ryo if (!sc->sc_msix) 4485 1.1 ryo sc->sc_linkstat_irq = AQ_LINKSTAT_IRQ; 4486 1.1 ryo AQ_WRITE_REG(sc, AQ_GEN_INTR_MAP_REG(3), 4487 1.1 ryo __BIT(7) | sc->sc_linkstat_irq); 4488 1.1 ryo 4489 1.1 ryo return 0; 4490 1.1 ryo } 4491 1.1 ryo 4492 1.1 ryo static int 4493 1.1 ryo aq_update_link_status(struct aq_softc *sc) 4494 1.1 ryo { 4495 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 4496 1.1 ryo aq_link_speed_t rate = AQ_LINK_NONE; 4497 1.1 ryo aq_link_fc_t fc = AQ_FC_NONE; 4498 1.1 ryo aq_link_eee_t eee = AQ_EEE_DISABLE; 4499 1.1 ryo unsigned int speed; 4500 1.1 ryo int changed = 0; 4501 1.1 ryo 4502 1.1 ryo aq_get_linkmode(sc, &rate, &fc, &eee); 4503 1.1 ryo 4504 1.1 ryo if (sc->sc_link_rate != rate) 4505 1.1 ryo changed = 1; 4506 1.1 ryo if (sc->sc_link_fc != fc) 4507 1.1 ryo changed = 1; 4508 1.1 ryo if (sc->sc_link_eee != eee) 4509 1.1 ryo changed = 1; 4510 1.1 ryo 4511 1.1 ryo if (changed) { 4512 1.1 ryo switch (rate) { 4513 1.43 ryo case AQ_LINK_10M: 4514 1.43 ryo speed = 10; 4515 1.43 ryo break; 4516 1.1 ryo case AQ_LINK_100M: 4517 1.1 ryo speed = 100; 4518 1.1 ryo break; 4519 1.1 ryo case AQ_LINK_1G: 4520 1.1 ryo speed = 1000; 4521 1.1 ryo break; 4522 1.1 ryo case AQ_LINK_2G5: 4523 1.1 ryo speed = 2500; 4524 1.1 ryo break; 4525 1.1 ryo case AQ_LINK_5G: 4526 1.1 ryo speed = 5000; 4527 1.1 ryo break; 4528 1.1 ryo case AQ_LINK_10G: 4529 1.1 ryo speed = 10000; 4530 1.1 ryo break; 4531 1.1 ryo case AQ_LINK_NONE: 4532 1.1 ryo default: 4533 1.1 ryo speed = 0; 4534 1.1 ryo break; 4535 1.1 ryo } 4536 1.1 ryo 4537 1.43 ryo if (sc->sc_link_rate == AQ_LINK_NONE && rate != AQ_LINK_NONE) { 4538 1.1 ryo /* link DOWN -> UP */ 4539 1.1 ryo device_printf(sc->sc_dev, "link is UP: speed=%u\n", 4540 1.1 ryo speed); 4541 1.1 ryo if_link_state_change(ifp, LINK_STATE_UP); 4542 1.1 ryo } else if (rate == AQ_LINK_NONE) { 4543 1.1 ryo /* link UP -> DOWN */ 4544 1.1 ryo device_printf(sc->sc_dev, "link is DOWN\n"); 4545 1.1 ryo if_link_state_change(ifp, LINK_STATE_DOWN); 4546 1.1 ryo } else { 4547 1.1 ryo device_printf(sc->sc_dev, 4548 1.1 ryo "link mode changed: speed=%u, fc=0x%x, eee=%x\n", 4549 1.1 ryo speed, fc, eee); 4550 1.1 ryo } 4551 1.1 ryo 4552 1.1 ryo sc->sc_link_rate = rate; 4553 1.1 ryo sc->sc_link_fc = fc; 4554 1.1 ryo sc->sc_link_eee = eee; 4555 1.1 ryo 4556 1.1 ryo /* update interrupt timing according to new link speed */ 4557 1.1 ryo aq_hw_interrupt_moderation_set(sc); 4558 1.1 ryo } 4559 1.1 ryo 4560 1.1 ryo return changed; 4561 1.1 ryo } 4562 1.1 ryo 4563 1.1 ryo #ifdef AQ_EVENT_COUNTERS 4564 1.1 ryo static void 4565 1.1 ryo aq_update_statistics(struct aq_softc *sc) 4566 1.1 ryo { 4567 1.1 ryo int prev = sc->sc_statistics_idx; 4568 1.1 ryo int cur = prev ^ 1; 4569 1.1 ryo 4570 1.43 ryo if (sc->sc_fw_ops->get_stats(sc, &sc->sc_statistics[cur]) != 0) 4571 1.43 ryo return; 4572 1.1 ryo 4573 1.1 ryo /* 4574 1.43 ryo * some aq's internal statistics counters are 32bit. 4575 1.50 andvar * calculate delta, and add to evcount 4576 1.1 ryo */ 4577 1.1 ryo #define ADD_DELTA(cur, prev, name) \ 4578 1.1 ryo do { \ 4579 1.1 ryo uint32_t n; \ 4580 1.1 ryo n = (uint32_t)(sc->sc_statistics[cur].name - \ 4581 1.1 ryo sc->sc_statistics[prev].name); \ 4582 1.1 ryo if (n != 0) { \ 4583 1.1 ryo AQ_EVCNT_ADD(sc, name, n); \ 4584 1.1 ryo } \ 4585 1.1 ryo } while (/*CONSTCOND*/0); 4586 1.1 ryo 4587 1.1 ryo ADD_DELTA(cur, prev, uprc); 4588 1.1 ryo ADD_DELTA(cur, prev, mprc); 4589 1.1 ryo ADD_DELTA(cur, prev, bprc); 4590 1.1 ryo ADD_DELTA(cur, prev, prc); 4591 1.1 ryo ADD_DELTA(cur, prev, erpr); 4592 1.1 ryo ADD_DELTA(cur, prev, uptc); 4593 1.1 ryo ADD_DELTA(cur, prev, mptc); 4594 1.1 ryo ADD_DELTA(cur, prev, bptc); 4595 1.1 ryo ADD_DELTA(cur, prev, ptc); 4596 1.1 ryo ADD_DELTA(cur, prev, erpt); 4597 1.1 ryo ADD_DELTA(cur, prev, mbtc); 4598 1.1 ryo ADD_DELTA(cur, prev, bbtc); 4599 1.1 ryo ADD_DELTA(cur, prev, mbrc); 4600 1.1 ryo ADD_DELTA(cur, prev, bbrc); 4601 1.1 ryo ADD_DELTA(cur, prev, ubrc); 4602 1.1 ryo ADD_DELTA(cur, prev, ubtc); 4603 1.1 ryo ADD_DELTA(cur, prev, dpc); 4604 1.1 ryo ADD_DELTA(cur, prev, cprc); 4605 1.1 ryo 4606 1.1 ryo sc->sc_statistics_idx = cur; 4607 1.1 ryo } 4608 1.1 ryo #endif /* AQ_EVENT_COUNTERS */ 4609 1.1 ryo 4610 1.1 ryo /* allocate and map one DMA block */ 4611 1.1 ryo static int 4612 1.1 ryo _alloc_dma(struct aq_softc *sc, bus_size_t size, bus_size_t *sizep, 4613 1.1 ryo void **addrp, bus_dmamap_t *mapp, bus_dma_segment_t *seg) 4614 1.1 ryo { 4615 1.1 ryo int nsegs, error; 4616 1.1 ryo 4617 1.1 ryo if ((error = bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0, seg, 4618 1.1 ryo 1, &nsegs, 0)) != 0) { 4619 1.1 ryo aprint_error_dev(sc->sc_dev, 4620 1.1 ryo "unable to allocate DMA buffer, error=%d\n", error); 4621 1.1 ryo goto fail_alloc; 4622 1.1 ryo } 4623 1.1 ryo 4624 1.1 ryo if ((error = bus_dmamem_map(sc->sc_dmat, seg, 1, size, addrp, 4625 1.1 ryo BUS_DMA_COHERENT)) != 0) { 4626 1.1 ryo aprint_error_dev(sc->sc_dev, 4627 1.1 ryo "unable to map DMA buffer, error=%d\n", error); 4628 1.1 ryo goto fail_map; 4629 1.1 ryo } 4630 1.1 ryo 4631 1.1 ryo if ((error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, 4632 1.1 ryo 0, mapp)) != 0) { 4633 1.1 ryo aprint_error_dev(sc->sc_dev, 4634 1.1 ryo "unable to create DMA map, error=%d\n", error); 4635 1.1 ryo goto fail_create; 4636 1.1 ryo } 4637 1.1 ryo 4638 1.1 ryo if ((error = bus_dmamap_load(sc->sc_dmat, *mapp, *addrp, size, NULL, 4639 1.1 ryo 0)) != 0) { 4640 1.1 ryo aprint_error_dev(sc->sc_dev, 4641 1.1 ryo "unable to load DMA map, error=%d\n", error); 4642 1.1 ryo goto fail_load; 4643 1.1 ryo } 4644 1.1 ryo 4645 1.1 ryo *sizep = size; 4646 1.1 ryo return 0; 4647 1.1 ryo 4648 1.1 ryo fail_load: 4649 1.1 ryo bus_dmamap_destroy(sc->sc_dmat, *mapp); 4650 1.1 ryo *mapp = NULL; 4651 1.1 ryo fail_create: 4652 1.1 ryo bus_dmamem_unmap(sc->sc_dmat, *addrp, size); 4653 1.1 ryo *addrp = NULL; 4654 1.1 ryo fail_map: 4655 1.1 ryo bus_dmamem_free(sc->sc_dmat, seg, 1); 4656 1.1 ryo memset(seg, 0, sizeof(*seg)); 4657 1.1 ryo fail_alloc: 4658 1.1 ryo *sizep = 0; 4659 1.1 ryo return error; 4660 1.1 ryo } 4661 1.1 ryo 4662 1.1 ryo static void 4663 1.1 ryo _free_dma(struct aq_softc *sc, bus_size_t *sizep, void **addrp, 4664 1.1 ryo bus_dmamap_t *mapp, bus_dma_segment_t *seg) 4665 1.1 ryo { 4666 1.1 ryo if (*mapp != NULL) { 4667 1.1 ryo bus_dmamap_destroy(sc->sc_dmat, *mapp); 4668 1.1 ryo *mapp = NULL; 4669 1.1 ryo } 4670 1.1 ryo if (*addrp != NULL) { 4671 1.1 ryo bus_dmamem_unmap(sc->sc_dmat, *addrp, *sizep); 4672 1.1 ryo *addrp = NULL; 4673 1.1 ryo } 4674 1.1 ryo if (*sizep != 0) { 4675 1.1 ryo bus_dmamem_free(sc->sc_dmat, seg, 1); 4676 1.1 ryo memset(seg, 0, sizeof(*seg)); 4677 1.1 ryo *sizep = 0; 4678 1.1 ryo } 4679 1.1 ryo } 4680 1.1 ryo 4681 1.1 ryo static int 4682 1.1 ryo aq_txring_alloc(struct aq_softc *sc, struct aq_txring *txring) 4683 1.1 ryo { 4684 1.1 ryo int i, error; 4685 1.1 ryo 4686 1.1 ryo /* allocate tx descriptors */ 4687 1.1 ryo error = _alloc_dma(sc, sizeof(aq_tx_desc_t) * AQ_TXD_NUM, 4688 1.1 ryo &txring->txr_txdesc_size, (void **)&txring->txr_txdesc, 4689 1.1 ryo &txring->txr_txdesc_dmamap, txring->txr_txdesc_seg); 4690 1.1 ryo if (error != 0) 4691 1.1 ryo return error; 4692 1.1 ryo 4693 1.1 ryo memset(txring->txr_txdesc, 0, sizeof(aq_tx_desc_t) * AQ_TXD_NUM); 4694 1.1 ryo 4695 1.1 ryo /* fill tx ring with dmamap */ 4696 1.1 ryo for (i = 0; i < AQ_TXD_NUM; i++) { 4697 1.1 ryo #define AQ_MAXDMASIZE (16 * 1024) 4698 1.1 ryo #define AQ_NTXSEGS 32 4699 1.1 ryo /* XXX: TODO: error check */ 4700 1.1 ryo bus_dmamap_create(sc->sc_dmat, AQ_MAXDMASIZE, AQ_NTXSEGS, 4701 1.1 ryo AQ_MAXDMASIZE, 0, 0, &txring->txr_mbufs[i].dmamap); 4702 1.1 ryo } 4703 1.1 ryo return 0; 4704 1.1 ryo } 4705 1.1 ryo 4706 1.1 ryo static void 4707 1.1 ryo aq_txring_free(struct aq_softc *sc, struct aq_txring *txring) 4708 1.1 ryo { 4709 1.1 ryo int i; 4710 1.1 ryo 4711 1.1 ryo _free_dma(sc, &txring->txr_txdesc_size, (void **)&txring->txr_txdesc, 4712 1.1 ryo &txring->txr_txdesc_dmamap, txring->txr_txdesc_seg); 4713 1.1 ryo 4714 1.1 ryo for (i = 0; i < AQ_TXD_NUM; i++) { 4715 1.1 ryo if (txring->txr_mbufs[i].dmamap != NULL) { 4716 1.1 ryo if (txring->txr_mbufs[i].m != NULL) { 4717 1.1 ryo bus_dmamap_unload(sc->sc_dmat, 4718 1.1 ryo txring->txr_mbufs[i].dmamap); 4719 1.1 ryo m_freem(txring->txr_mbufs[i].m); 4720 1.1 ryo txring->txr_mbufs[i].m = NULL; 4721 1.1 ryo } 4722 1.1 ryo bus_dmamap_destroy(sc->sc_dmat, 4723 1.1 ryo txring->txr_mbufs[i].dmamap); 4724 1.1 ryo txring->txr_mbufs[i].dmamap = NULL; 4725 1.1 ryo } 4726 1.1 ryo } 4727 1.1 ryo } 4728 1.1 ryo 4729 1.1 ryo static int 4730 1.1 ryo aq_rxring_alloc(struct aq_softc *sc, struct aq_rxring *rxring) 4731 1.1 ryo { 4732 1.1 ryo int i, error; 4733 1.1 ryo 4734 1.1 ryo /* allocate rx descriptors */ 4735 1.1 ryo error = _alloc_dma(sc, sizeof(aq_rx_desc_t) * AQ_RXD_NUM, 4736 1.1 ryo &rxring->rxr_rxdesc_size, (void **)&rxring->rxr_rxdesc, 4737 1.1 ryo &rxring->rxr_rxdesc_dmamap, rxring->rxr_rxdesc_seg); 4738 1.1 ryo if (error != 0) 4739 1.1 ryo return error; 4740 1.1 ryo 4741 1.1 ryo memset(rxring->rxr_rxdesc, 0, sizeof(aq_rx_desc_t) * AQ_RXD_NUM); 4742 1.1 ryo 4743 1.1 ryo /* fill rxring with dmamaps */ 4744 1.1 ryo for (i = 0; i < AQ_RXD_NUM; i++) { 4745 1.1 ryo rxring->rxr_mbufs[i].m = NULL; 4746 1.1 ryo /* XXX: TODO: error check */ 4747 1.1 ryo bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES, 0, 0, 4748 1.1 ryo &rxring->rxr_mbufs[i].dmamap); 4749 1.1 ryo } 4750 1.1 ryo return 0; 4751 1.1 ryo } 4752 1.1 ryo 4753 1.1 ryo static void 4754 1.1 ryo aq_rxdrain(struct aq_softc *sc, struct aq_rxring *rxring) 4755 1.1 ryo { 4756 1.1 ryo int i; 4757 1.1 ryo 4758 1.1 ryo /* free all mbufs allocated for RX */ 4759 1.1 ryo for (i = 0; i < AQ_RXD_NUM; i++) { 4760 1.1 ryo if (rxring->rxr_mbufs[i].m != NULL) { 4761 1.1 ryo bus_dmamap_unload(sc->sc_dmat, 4762 1.1 ryo rxring->rxr_mbufs[i].dmamap); 4763 1.1 ryo m_freem(rxring->rxr_mbufs[i].m); 4764 1.1 ryo rxring->rxr_mbufs[i].m = NULL; 4765 1.1 ryo } 4766 1.1 ryo } 4767 1.1 ryo } 4768 1.1 ryo 4769 1.1 ryo static void 4770 1.1 ryo aq_rxring_free(struct aq_softc *sc, struct aq_rxring *rxring) 4771 1.1 ryo { 4772 1.1 ryo int i; 4773 1.1 ryo 4774 1.1 ryo /* free all mbufs and dmamaps */ 4775 1.1 ryo aq_rxdrain(sc, rxring); 4776 1.1 ryo for (i = 0; i < AQ_RXD_NUM; i++) { 4777 1.1 ryo if (rxring->rxr_mbufs[i].dmamap != NULL) { 4778 1.1 ryo bus_dmamap_destroy(sc->sc_dmat, 4779 1.1 ryo rxring->rxr_mbufs[i].dmamap); 4780 1.1 ryo rxring->rxr_mbufs[i].dmamap = NULL; 4781 1.1 ryo } 4782 1.1 ryo } 4783 1.1 ryo 4784 1.1 ryo /* free RX descriptor */ 4785 1.1 ryo _free_dma(sc, &rxring->rxr_rxdesc_size, (void **)&rxring->rxr_rxdesc, 4786 1.1 ryo &rxring->rxr_rxdesc_dmamap, rxring->rxr_rxdesc_seg); 4787 1.1 ryo } 4788 1.1 ryo 4789 1.1 ryo static void 4790 1.1 ryo aq_rxring_setmbuf(struct aq_softc *sc, struct aq_rxring *rxring, int idx, 4791 1.1 ryo struct mbuf *m) 4792 1.1 ryo { 4793 1.1 ryo int error; 4794 1.1 ryo 4795 1.1 ryo /* if mbuf already exists, unload and free */ 4796 1.1 ryo if (rxring->rxr_mbufs[idx].m != NULL) { 4797 1.1 ryo bus_dmamap_unload(sc->sc_dmat, rxring->rxr_mbufs[idx].dmamap); 4798 1.1 ryo m_freem(rxring->rxr_mbufs[idx].m); 4799 1.1 ryo rxring->rxr_mbufs[idx].m = NULL; 4800 1.1 ryo } 4801 1.1 ryo 4802 1.1 ryo rxring->rxr_mbufs[idx].m = m; 4803 1.1 ryo 4804 1.1 ryo m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; 4805 1.1 ryo error = bus_dmamap_load_mbuf(sc->sc_dmat, rxring->rxr_mbufs[idx].dmamap, 4806 1.1 ryo m, BUS_DMA_READ | BUS_DMA_NOWAIT); 4807 1.1 ryo if (error) { 4808 1.1 ryo device_printf(sc->sc_dev, 4809 1.1 ryo "unable to load rx DMA map %d, error = %d\n", idx, error); 4810 1.1 ryo panic("%s: unable to load rx DMA map. error=%d", 4811 1.1 ryo __func__, error); 4812 1.1 ryo } 4813 1.1 ryo bus_dmamap_sync(sc->sc_dmat, rxring->rxr_mbufs[idx].dmamap, 0, 4814 1.1 ryo rxring->rxr_mbufs[idx].dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 4815 1.1 ryo } 4816 1.1 ryo 4817 1.1 ryo static inline void 4818 1.1 ryo aq_rxring_reset_desc(struct aq_softc *sc, struct aq_rxring *rxring, int idx) 4819 1.1 ryo { 4820 1.1 ryo /* refill rxdesc, and sync */ 4821 1.1 ryo rxring->rxr_rxdesc[idx].read.buf_addr = 4822 1.1 ryo htole64(rxring->rxr_mbufs[idx].dmamap->dm_segs[0].ds_addr); 4823 1.1 ryo rxring->rxr_rxdesc[idx].read.hdr_addr = 0; 4824 1.1 ryo bus_dmamap_sync(sc->sc_dmat, rxring->rxr_rxdesc_dmamap, 4825 1.1 ryo sizeof(aq_rx_desc_t) * idx, sizeof(aq_rx_desc_t), 4826 1.1 ryo BUS_DMASYNC_PREWRITE); 4827 1.1 ryo } 4828 1.1 ryo 4829 1.1 ryo static struct mbuf * 4830 1.1 ryo aq_alloc_mbuf(void) 4831 1.1 ryo { 4832 1.1 ryo struct mbuf *m; 4833 1.1 ryo 4834 1.1 ryo MGETHDR(m, M_DONTWAIT, MT_DATA); 4835 1.1 ryo if (m == NULL) 4836 1.1 ryo return NULL; 4837 1.1 ryo 4838 1.1 ryo MCLGET(m, M_DONTWAIT); 4839 1.1 ryo if ((m->m_flags & M_EXT) == 0) { 4840 1.1 ryo m_freem(m); 4841 1.1 ryo return NULL; 4842 1.1 ryo } 4843 1.1 ryo 4844 1.1 ryo return m; 4845 1.1 ryo } 4846 1.1 ryo 4847 1.1 ryo /* allocate mbuf and unload dmamap */ 4848 1.1 ryo static int 4849 1.1 ryo aq_rxring_add(struct aq_softc *sc, struct aq_rxring *rxring, int idx) 4850 1.1 ryo { 4851 1.1 ryo struct mbuf *m; 4852 1.1 ryo 4853 1.1 ryo m = aq_alloc_mbuf(); 4854 1.1 ryo if (m == NULL) 4855 1.1 ryo return ENOBUFS; 4856 1.1 ryo 4857 1.1 ryo aq_rxring_setmbuf(sc, rxring, idx, m); 4858 1.1 ryo return 0; 4859 1.1 ryo } 4860 1.1 ryo 4861 1.1 ryo static int 4862 1.1 ryo aq_txrx_rings_alloc(struct aq_softc *sc) 4863 1.1 ryo { 4864 1.1 ryo int n, error; 4865 1.1 ryo 4866 1.1 ryo for (n = 0; n < sc->sc_nqueues; n++) { 4867 1.1 ryo sc->sc_queue[n].sc = sc; 4868 1.1 ryo sc->sc_queue[n].txring.txr_sc = sc; 4869 1.1 ryo sc->sc_queue[n].txring.txr_index = n; 4870 1.1 ryo mutex_init(&sc->sc_queue[n].txring.txr_mutex, MUTEX_DEFAULT, 4871 1.1 ryo IPL_NET); 4872 1.1 ryo error = aq_txring_alloc(sc, &sc->sc_queue[n].txring); 4873 1.1 ryo if (error != 0) 4874 1.1 ryo goto failure; 4875 1.1 ryo 4876 1.1 ryo error = aq_tx_pcq_alloc(sc, &sc->sc_queue[n].txring); 4877 1.1 ryo if (error != 0) 4878 1.1 ryo goto failure; 4879 1.1 ryo 4880 1.1 ryo sc->sc_queue[n].rxring.rxr_sc = sc; 4881 1.1 ryo sc->sc_queue[n].rxring.rxr_index = n; 4882 1.1 ryo mutex_init(&sc->sc_queue[n].rxring.rxr_mutex, MUTEX_DEFAULT, 4883 1.1 ryo IPL_NET); 4884 1.1 ryo error = aq_rxring_alloc(sc, &sc->sc_queue[n].rxring); 4885 1.1 ryo if (error != 0) 4886 1.1 ryo break; 4887 1.1 ryo } 4888 1.1 ryo 4889 1.1 ryo failure: 4890 1.1 ryo return error; 4891 1.1 ryo } 4892 1.1 ryo 4893 1.1 ryo static void 4894 1.1 ryo aq_txrx_rings_free(struct aq_softc *sc) 4895 1.1 ryo { 4896 1.1 ryo int n; 4897 1.1 ryo 4898 1.1 ryo for (n = 0; n < sc->sc_nqueues; n++) { 4899 1.1 ryo aq_txring_free(sc, &sc->sc_queue[n].txring); 4900 1.1 ryo mutex_destroy(&sc->sc_queue[n].txring.txr_mutex); 4901 1.1 ryo 4902 1.1 ryo aq_tx_pcq_free(sc, &sc->sc_queue[n].txring); 4903 1.1 ryo 4904 1.1 ryo aq_rxring_free(sc, &sc->sc_queue[n].rxring); 4905 1.1 ryo mutex_destroy(&sc->sc_queue[n].rxring.rxr_mutex); 4906 1.1 ryo } 4907 1.1 ryo } 4908 1.1 ryo 4909 1.1 ryo static int 4910 1.1 ryo aq_tx_pcq_alloc(struct aq_softc *sc, struct aq_txring *txring) 4911 1.1 ryo { 4912 1.1 ryo int error = 0; 4913 1.1 ryo txring->txr_softint = NULL; 4914 1.1 ryo 4915 1.1 ryo txring->txr_pcq = pcq_create(AQ_TXD_NUM, KM_NOSLEEP); 4916 1.1 ryo if (txring->txr_pcq == NULL) { 4917 1.1 ryo aprint_error_dev(sc->sc_dev, 4918 1.1 ryo "unable to allocate pcq for TXring[%d]\n", 4919 1.1 ryo txring->txr_index); 4920 1.1 ryo error = ENOMEM; 4921 1.1 ryo goto done; 4922 1.1 ryo } 4923 1.1 ryo 4924 1.1 ryo txring->txr_softint = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE, 4925 1.1 ryo aq_deferred_transmit, txring); 4926 1.1 ryo if (txring->txr_softint == NULL) { 4927 1.1 ryo aprint_error_dev(sc->sc_dev, 4928 1.1 ryo "unable to establish softint for TXring[%d]\n", 4929 1.1 ryo txring->txr_index); 4930 1.1 ryo error = ENOENT; 4931 1.1 ryo } 4932 1.1 ryo 4933 1.1 ryo done: 4934 1.1 ryo return error; 4935 1.1 ryo } 4936 1.1 ryo 4937 1.1 ryo static void 4938 1.1 ryo aq_tx_pcq_free(struct aq_softc *sc, struct aq_txring *txring) 4939 1.1 ryo { 4940 1.1 ryo struct mbuf *m; 4941 1.1 ryo 4942 1.1 ryo if (txring->txr_softint != NULL) { 4943 1.1 ryo softint_disestablish(txring->txr_softint); 4944 1.1 ryo txring->txr_softint = NULL; 4945 1.1 ryo } 4946 1.1 ryo 4947 1.1 ryo if (txring->txr_pcq != NULL) { 4948 1.1 ryo while ((m = pcq_get(txring->txr_pcq)) != NULL) 4949 1.1 ryo m_freem(m); 4950 1.1 ryo pcq_destroy(txring->txr_pcq); 4951 1.1 ryo txring->txr_pcq = NULL; 4952 1.1 ryo } 4953 1.1 ryo } 4954 1.1 ryo 4955 1.4 ryo #if NSYSMON_ENVSYS > 0 4956 1.4 ryo static void 4957 1.4 ryo aq_temp_refresh(struct sysmon_envsys *sme, envsys_data_t *edata) 4958 1.4 ryo { 4959 1.4 ryo struct aq_softc *sc; 4960 1.4 ryo uint32_t temp; 4961 1.4 ryo int error; 4962 1.4 ryo 4963 1.4 ryo sc = sme->sme_cookie; 4964 1.4 ryo 4965 1.4 ryo error = sc->sc_fw_ops->get_temperature(sc, &temp); 4966 1.4 ryo if (error == 0) { 4967 1.4 ryo edata->value_cur = temp; 4968 1.4 ryo edata->state = ENVSYS_SVALID; 4969 1.4 ryo } else { 4970 1.4 ryo edata->state = ENVSYS_SINVALID; 4971 1.4 ryo } 4972 1.4 ryo } 4973 1.4 ryo #endif 4974 1.4 ryo 4975 1.33 skrll 4976 1.33 skrll 4977 1.33 skrll static bool 4978 1.33 skrll aq_watchdog_check(struct aq_softc * const sc) 4979 1.33 skrll { 4980 1.33 skrll 4981 1.33 skrll AQ_LOCKED(sc); 4982 1.33 skrll 4983 1.33 skrll bool ok = true; 4984 1.40 ryo for (int n = 0; n < sc->sc_nqueues; n++) { 4985 1.33 skrll struct aq_txring *txring = &sc->sc_queue[n].txring; 4986 1.33 skrll 4987 1.33 skrll mutex_enter(&txring->txr_mutex); 4988 1.33 skrll if (txring->txr_sending && 4989 1.33 skrll time_uptime - txring->txr_lastsent > aq_watchdog_timeout) 4990 1.33 skrll ok = false; 4991 1.33 skrll 4992 1.33 skrll mutex_exit(&txring->txr_mutex); 4993 1.33 skrll 4994 1.33 skrll if (!ok) 4995 1.33 skrll return false; 4996 1.33 skrll } 4997 1.33 skrll 4998 1.33 skrll if (sc->sc_trigger_reset) { 4999 1.33 skrll /* debug operation, no need for atomicity or reliability */ 5000 1.33 skrll sc->sc_trigger_reset = 0; 5001 1.33 skrll return false; 5002 1.33 skrll } 5003 1.33 skrll 5004 1.33 skrll return true; 5005 1.33 skrll } 5006 1.33 skrll 5007 1.33 skrll 5008 1.33 skrll 5009 1.33 skrll static bool 5010 1.33 skrll aq_watchdog_tick(struct ifnet *ifp) 5011 1.33 skrll { 5012 1.33 skrll struct aq_softc * const sc = ifp->if_softc; 5013 1.33 skrll 5014 1.33 skrll AQ_LOCKED(sc); 5015 1.33 skrll 5016 1.33 skrll if (!sc->sc_trigger_reset && aq_watchdog_check(sc)) 5017 1.33 skrll return true; 5018 1.33 skrll 5019 1.33 skrll if (atomic_swap_uint(&sc->sc_reset_pending, 1) == 0) { 5020 1.33 skrll workqueue_enqueue(sc->sc_reset_wq, &sc->sc_reset_work, NULL); 5021 1.33 skrll } 5022 1.33 skrll 5023 1.33 skrll return false; 5024 1.33 skrll } 5025 1.33 skrll 5026 1.1 ryo static void 5027 1.1 ryo aq_tick(void *arg) 5028 1.1 ryo { 5029 1.33 skrll struct aq_softc * const sc = arg; 5030 1.33 skrll 5031 1.33 skrll AQ_LOCK(sc); 5032 1.33 skrll if (sc->sc_stopping) { 5033 1.33 skrll AQ_UNLOCK(sc); 5034 1.33 skrll return; 5035 1.33 skrll } 5036 1.1 ryo 5037 1.47 mrg aq_update_link_status(sc); 5038 1.1 ryo 5039 1.1 ryo #ifdef AQ_EVENT_COUNTERS 5040 1.1 ryo if (sc->sc_poll_statistics) 5041 1.1 ryo aq_update_statistics(sc); 5042 1.1 ryo #endif 5043 1.1 ryo 5044 1.33 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 5045 1.33 skrll const bool ok = aq_watchdog_tick(ifp); 5046 1.33 skrll if (ok) 5047 1.1 ryo callout_schedule(&sc->sc_tick_ch, hz); 5048 1.33 skrll 5049 1.33 skrll AQ_UNLOCK(sc); 5050 1.1 ryo } 5051 1.1 ryo 5052 1.1 ryo /* interrupt enable/disable */ 5053 1.1 ryo static void 5054 1.1 ryo aq_enable_intr(struct aq_softc *sc, bool link, bool txrx) 5055 1.1 ryo { 5056 1.1 ryo uint32_t imask = 0; 5057 1.1 ryo int i; 5058 1.1 ryo 5059 1.1 ryo if (txrx) { 5060 1.1 ryo for (i = 0; i < sc->sc_nqueues; i++) { 5061 1.1 ryo imask |= __BIT(sc->sc_tx_irq[i]); 5062 1.1 ryo imask |= __BIT(sc->sc_rx_irq[i]); 5063 1.1 ryo } 5064 1.1 ryo } 5065 1.1 ryo 5066 1.1 ryo if (link) 5067 1.1 ryo imask |= __BIT(sc->sc_linkstat_irq); 5068 1.1 ryo 5069 1.1 ryo AQ_WRITE_REG(sc, AQ_INTR_MASK_REG, imask); 5070 1.1 ryo AQ_WRITE_REG(sc, AQ_INTR_STATUS_CLR_REG, 0xffffffff); 5071 1.1 ryo } 5072 1.1 ryo 5073 1.1 ryo static int 5074 1.1 ryo aq_legacy_intr(void *arg) 5075 1.1 ryo { 5076 1.1 ryo struct aq_softc *sc = arg; 5077 1.1 ryo uint32_t status; 5078 1.1 ryo int nintr = 0; 5079 1.1 ryo 5080 1.1 ryo status = AQ_READ_REG(sc, AQ_INTR_STATUS_REG); 5081 1.1 ryo AQ_WRITE_REG(sc, AQ_INTR_STATUS_CLR_REG, 0xffffffff); 5082 1.1 ryo 5083 1.1 ryo if (status & __BIT(sc->sc_linkstat_irq)) { 5084 1.34 riastrad AQ_LOCK(sc); 5085 1.34 riastrad if (!sc->sc_stopping) 5086 1.34 riastrad callout_schedule(&sc->sc_tick_ch, 0); 5087 1.34 riastrad AQ_UNLOCK(sc); 5088 1.1 ryo nintr++; 5089 1.1 ryo } 5090 1.1 ryo 5091 1.1 ryo if (status & __BIT(sc->sc_rx_irq[0])) { 5092 1.1 ryo nintr += aq_rx_intr(&sc->sc_queue[0].rxring); 5093 1.1 ryo } 5094 1.1 ryo 5095 1.1 ryo if (status & __BIT(sc->sc_tx_irq[0])) { 5096 1.1 ryo nintr += aq_tx_intr(&sc->sc_queue[0].txring); 5097 1.1 ryo } 5098 1.1 ryo 5099 1.1 ryo return nintr; 5100 1.1 ryo } 5101 1.1 ryo 5102 1.1 ryo static int 5103 1.1 ryo aq_txrx_intr(void *arg) 5104 1.1 ryo { 5105 1.1 ryo struct aq_queue *queue = arg; 5106 1.1 ryo struct aq_softc *sc = queue->sc; 5107 1.1 ryo struct aq_txring *txring = &queue->txring; 5108 1.1 ryo struct aq_rxring *rxring = &queue->rxring; 5109 1.1 ryo uint32_t status; 5110 1.1 ryo int nintr = 0; 5111 1.1 ryo int txringidx, rxringidx, txirq, rxirq; 5112 1.1 ryo 5113 1.1 ryo txringidx = txring->txr_index; 5114 1.1 ryo rxringidx = rxring->rxr_index; 5115 1.1 ryo txirq = sc->sc_tx_irq[txringidx]; 5116 1.1 ryo rxirq = sc->sc_rx_irq[rxringidx]; 5117 1.1 ryo 5118 1.1 ryo status = AQ_READ_REG(sc, AQ_INTR_STATUS_REG); 5119 1.1 ryo if ((status & (__BIT(txirq) | __BIT(rxirq))) == 0) { 5120 1.1 ryo /* stray interrupt? */ 5121 1.1 ryo return 0; 5122 1.1 ryo } 5123 1.1 ryo 5124 1.1 ryo nintr += aq_rx_intr(rxring); 5125 1.1 ryo nintr += aq_tx_intr(txring); 5126 1.1 ryo 5127 1.1 ryo return nintr; 5128 1.1 ryo } 5129 1.1 ryo 5130 1.1 ryo static int 5131 1.1 ryo aq_link_intr(void *arg) 5132 1.1 ryo { 5133 1.33 skrll struct aq_softc * const sc = arg; 5134 1.1 ryo uint32_t status; 5135 1.1 ryo int nintr = 0; 5136 1.1 ryo 5137 1.1 ryo status = AQ_READ_REG(sc, AQ_INTR_STATUS_REG); 5138 1.1 ryo if (status & __BIT(sc->sc_linkstat_irq)) { 5139 1.34 riastrad AQ_LOCK(sc); 5140 1.34 riastrad if (!sc->sc_stopping) 5141 1.34 riastrad callout_schedule(&sc->sc_tick_ch, 0); 5142 1.34 riastrad AQ_UNLOCK(sc); 5143 1.1 ryo AQ_WRITE_REG(sc, AQ_INTR_STATUS_CLR_REG, 5144 1.1 ryo __BIT(sc->sc_linkstat_irq)); 5145 1.1 ryo nintr++; 5146 1.1 ryo } 5147 1.1 ryo 5148 1.1 ryo return nintr; 5149 1.1 ryo } 5150 1.1 ryo 5151 1.1 ryo static void 5152 1.1 ryo aq_txring_reset(struct aq_softc *sc, struct aq_txring *txring, bool start) 5153 1.1 ryo { 5154 1.1 ryo const int ringidx = txring->txr_index; 5155 1.1 ryo int i; 5156 1.1 ryo 5157 1.1 ryo mutex_enter(&txring->txr_mutex); 5158 1.1 ryo 5159 1.1 ryo txring->txr_prodidx = 0; 5160 1.1 ryo txring->txr_considx = 0; 5161 1.1 ryo txring->txr_nfree = AQ_TXD_NUM; 5162 1.1 ryo txring->txr_active = false; 5163 1.1 ryo 5164 1.1 ryo /* free mbufs untransmitted */ 5165 1.1 ryo for (i = 0; i < AQ_TXD_NUM; i++) { 5166 1.49 rin m_freem(txring->txr_mbufs[i].m); 5167 1.49 rin txring->txr_mbufs[i].m = NULL; 5168 1.1 ryo } 5169 1.1 ryo 5170 1.1 ryo /* disable DMA */ 5171 1.1 ryo AQ_WRITE_REG_BIT(sc, TX_DMA_DESC_REG(ringidx), TX_DMA_DESC_EN, 0); 5172 1.1 ryo 5173 1.1 ryo if (start) { 5174 1.1 ryo /* TX descriptor physical address */ 5175 1.1 ryo paddr_t paddr = txring->txr_txdesc_dmamap->dm_segs[0].ds_addr; 5176 1.1 ryo AQ_WRITE_REG(sc, TX_DMA_DESC_BASE_ADDRLSW_REG(ringidx), paddr); 5177 1.1 ryo AQ_WRITE_REG(sc, TX_DMA_DESC_BASE_ADDRMSW_REG(ringidx), 5178 1.1 ryo (uint32_t)((uint64_t)paddr >> 32)); 5179 1.1 ryo 5180 1.1 ryo /* TX descriptor size */ 5181 1.1 ryo AQ_WRITE_REG_BIT(sc, TX_DMA_DESC_REG(ringidx), TX_DMA_DESC_LEN, 5182 1.1 ryo AQ_TXD_NUM / 8); 5183 1.1 ryo 5184 1.1 ryo /* reload TAIL pointer */ 5185 1.1 ryo txring->txr_prodidx = txring->txr_considx = 5186 1.1 ryo AQ_READ_REG(sc, TX_DMA_DESC_TAIL_PTR_REG(ringidx)); 5187 1.1 ryo AQ_WRITE_REG(sc, TX_DMA_DESC_WRWB_THRESH_REG(ringidx), 0); 5188 1.1 ryo 5189 1.1 ryo /* Mapping interrupt vector */ 5190 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_INTR_IRQ_MAP_TX_REG(ringidx), 5191 1.1 ryo AQ_INTR_IRQ_MAP_TX_IRQMAP(ringidx), sc->sc_tx_irq[ringidx]); 5192 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_INTR_IRQ_MAP_TX_REG(ringidx), 5193 1.1 ryo AQ_INTR_IRQ_MAP_TX_EN(ringidx), true); 5194 1.1 ryo 5195 1.1 ryo /* enable DMA */ 5196 1.1 ryo AQ_WRITE_REG_BIT(sc, TX_DMA_DESC_REG(ringidx), 5197 1.1 ryo TX_DMA_DESC_EN, 1); 5198 1.1 ryo 5199 1.1 ryo const int cpuid = 0; /* XXX? */ 5200 1.1 ryo AQ_WRITE_REG_BIT(sc, TDM_DCAD_REG(ringidx), 5201 1.1 ryo TDM_DCAD_CPUID, cpuid); 5202 1.1 ryo AQ_WRITE_REG_BIT(sc, TDM_DCAD_REG(ringidx), 5203 1.1 ryo TDM_DCAD_CPUID_EN, 0); 5204 1.1 ryo 5205 1.1 ryo txring->txr_active = true; 5206 1.1 ryo } 5207 1.1 ryo 5208 1.1 ryo mutex_exit(&txring->txr_mutex); 5209 1.1 ryo } 5210 1.1 ryo 5211 1.1 ryo static int 5212 1.1 ryo aq_rxring_reset(struct aq_softc *sc, struct aq_rxring *rxring, bool start) 5213 1.1 ryo { 5214 1.1 ryo const int ringidx = rxring->rxr_index; 5215 1.1 ryo int i; 5216 1.1 ryo int error = 0; 5217 1.1 ryo 5218 1.1 ryo mutex_enter(&rxring->rxr_mutex); 5219 1.1 ryo rxring->rxr_active = false; 5220 1.28 ryo rxring->rxr_discarding = false; 5221 1.28 ryo if (rxring->rxr_receiving_m != NULL) { 5222 1.28 ryo m_freem(rxring->rxr_receiving_m); 5223 1.28 ryo rxring->rxr_receiving_m = NULL; 5224 1.28 ryo rxring->rxr_receiving_m_last = NULL; 5225 1.28 ryo } 5226 1.1 ryo 5227 1.1 ryo /* disable DMA */ 5228 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_REG(ringidx), RX_DMA_DESC_EN, 0); 5229 1.1 ryo 5230 1.1 ryo /* free all RX mbufs */ 5231 1.1 ryo aq_rxdrain(sc, rxring); 5232 1.1 ryo 5233 1.1 ryo if (start) { 5234 1.1 ryo for (i = 0; i < AQ_RXD_NUM; i++) { 5235 1.1 ryo error = aq_rxring_add(sc, rxring, i); 5236 1.1 ryo if (error != 0) { 5237 1.1 ryo aq_rxdrain(sc, rxring); 5238 1.1 ryo return error; 5239 1.1 ryo } 5240 1.1 ryo aq_rxring_reset_desc(sc, rxring, i); 5241 1.1 ryo } 5242 1.1 ryo 5243 1.1 ryo /* RX descriptor physical address */ 5244 1.1 ryo paddr_t paddr = rxring->rxr_rxdesc_dmamap->dm_segs[0].ds_addr; 5245 1.1 ryo AQ_WRITE_REG(sc, RX_DMA_DESC_BASE_ADDRLSW_REG(ringidx), paddr); 5246 1.1 ryo AQ_WRITE_REG(sc, RX_DMA_DESC_BASE_ADDRMSW_REG(ringidx), 5247 1.1 ryo (uint32_t)((uint64_t)paddr >> 32)); 5248 1.1 ryo 5249 1.1 ryo /* RX descriptor size */ 5250 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_REG(ringidx), RX_DMA_DESC_LEN, 5251 1.1 ryo AQ_RXD_NUM / 8); 5252 1.1 ryo 5253 1.1 ryo /* maximum receive frame size */ 5254 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_BUFSIZE_REG(ringidx), 5255 1.1 ryo RX_DMA_DESC_BUFSIZE_DATA, MCLBYTES / 1024); 5256 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_BUFSIZE_REG(ringidx), 5257 1.1 ryo RX_DMA_DESC_BUFSIZE_HDR, 0 / 1024); 5258 1.1 ryo 5259 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_REG(ringidx), 5260 1.1 ryo RX_DMA_DESC_HEADER_SPLIT, 0); 5261 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_REG(ringidx), 5262 1.1 ryo RX_DMA_DESC_VLAN_STRIP, 5263 1.1 ryo (sc->sc_ethercom.ec_capenable & ETHERCAP_VLAN_HWTAGGING) ? 5264 1.1 ryo 1 : 0); 5265 1.1 ryo 5266 1.1 ryo /* 5267 1.1 ryo * reload TAIL pointer, and update readidx 5268 1.1 ryo * (HEAD pointer cannot write) 5269 1.1 ryo */ 5270 1.1 ryo rxring->rxr_readidx = AQ_READ_REG_BIT(sc, 5271 1.1 ryo RX_DMA_DESC_HEAD_PTR_REG(ringidx), RX_DMA_DESC_HEAD_PTR); 5272 1.1 ryo AQ_WRITE_REG(sc, RX_DMA_DESC_TAIL_PTR_REG(ringidx), 5273 1.1 ryo (rxring->rxr_readidx + AQ_RXD_NUM - 1) % AQ_RXD_NUM); 5274 1.1 ryo 5275 1.1 ryo /* Rx ring set mode */ 5276 1.1 ryo 5277 1.1 ryo /* Mapping interrupt vector */ 5278 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_INTR_IRQ_MAP_RX_REG(ringidx), 5279 1.1 ryo AQ_INTR_IRQ_MAP_RX_IRQMAP(ringidx), sc->sc_rx_irq[ringidx]); 5280 1.1 ryo AQ_WRITE_REG_BIT(sc, AQ_INTR_IRQ_MAP_RX_REG(ringidx), 5281 1.1 ryo AQ_INTR_IRQ_MAP_RX_EN(ringidx), 1); 5282 1.1 ryo 5283 1.1 ryo const int cpuid = 0; /* XXX? */ 5284 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DCAD_REG(ringidx), 5285 1.1 ryo RX_DMA_DCAD_CPUID, cpuid); 5286 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DCAD_REG(ringidx), 5287 1.1 ryo RX_DMA_DCAD_DESC_EN, 0); 5288 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DCAD_REG(ringidx), 5289 1.1 ryo RX_DMA_DCAD_HEADER_EN, 0); 5290 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DCAD_REG(ringidx), 5291 1.1 ryo RX_DMA_DCAD_PAYLOAD_EN, 0); 5292 1.1 ryo 5293 1.1 ryo /* enable DMA. start receiving */ 5294 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_REG(ringidx), 5295 1.1 ryo RX_DMA_DESC_EN, 1); 5296 1.1 ryo 5297 1.1 ryo rxring->rxr_active = true; 5298 1.1 ryo } 5299 1.1 ryo 5300 1.1 ryo mutex_exit(&rxring->rxr_mutex); 5301 1.1 ryo return error; 5302 1.1 ryo } 5303 1.1 ryo 5304 1.1 ryo #define TXRING_NEXTIDX(idx) \ 5305 1.1 ryo (((idx) >= (AQ_TXD_NUM - 1)) ? 0 : ((idx) + 1)) 5306 1.1 ryo #define RXRING_NEXTIDX(idx) \ 5307 1.1 ryo (((idx) >= (AQ_RXD_NUM - 1)) ? 0 : ((idx) + 1)) 5308 1.1 ryo 5309 1.1 ryo static int 5310 1.44 ryo aq_encap_txring(struct aq_softc *sc, struct aq_txring *txring, struct mbuf *m) 5311 1.1 ryo { 5312 1.1 ryo bus_dmamap_t map; 5313 1.1 ryo uint32_t ctl1, ctl1_ctx, ctl2; 5314 1.1 ryo int idx, i, error; 5315 1.1 ryo 5316 1.1 ryo idx = txring->txr_prodidx; 5317 1.1 ryo map = txring->txr_mbufs[idx].dmamap; 5318 1.1 ryo 5319 1.1 ryo error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m, 5320 1.1 ryo BUS_DMA_WRITE | BUS_DMA_NOWAIT); 5321 1.1 ryo if (error == EFBIG) { 5322 1.1 ryo struct mbuf *n; 5323 1.1 ryo n = m_defrag(m, M_DONTWAIT); 5324 1.1 ryo if (n == NULL) 5325 1.1 ryo return EFBIG; 5326 1.1 ryo /* m_defrag() preserve m */ 5327 1.1 ryo KASSERT(n == m); 5328 1.1 ryo error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m, 5329 1.1 ryo BUS_DMA_WRITE | BUS_DMA_NOWAIT); 5330 1.1 ryo } 5331 1.1 ryo if (error != 0) 5332 1.1 ryo return error; 5333 1.1 ryo 5334 1.1 ryo /* 5335 1.1 ryo * check spaces of free descriptors. 5336 1.1 ryo * +1 is additional descriptor for context (vlan, etc,.) 5337 1.1 ryo */ 5338 1.1 ryo if ((map->dm_nsegs + 1) > txring->txr_nfree) { 5339 1.1 ryo bus_dmamap_unload(sc->sc_dmat, map); 5340 1.44 ryo return EAGAIN; 5341 1.1 ryo } 5342 1.1 ryo 5343 1.1 ryo /* sync dma for mbuf */ 5344 1.1 ryo bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, 5345 1.1 ryo BUS_DMASYNC_PREWRITE); 5346 1.1 ryo 5347 1.1 ryo ctl1_ctx = 0; 5348 1.1 ryo ctl2 = __SHIFTIN(m->m_pkthdr.len, AQ_TXDESC_CTL2_LEN); 5349 1.1 ryo 5350 1.1 ryo if (vlan_has_tag(m)) { 5351 1.1 ryo ctl1 = AQ_TXDESC_CTL1_TYPE_TXC; 5352 1.1 ryo ctl1 |= __SHIFTIN(vlan_get_tag(m), AQ_TXDESC_CTL1_VID); 5353 1.1 ryo 5354 1.1 ryo ctl1_ctx |= AQ_TXDESC_CTL1_CMD_VLAN; 5355 1.1 ryo ctl2 |= AQ_TXDESC_CTL2_CTX_EN; 5356 1.1 ryo 5357 1.1 ryo /* fill context descriptor and forward index */ 5358 1.1 ryo txring->txr_txdesc[idx].buf_addr = 0; 5359 1.1 ryo txring->txr_txdesc[idx].ctl1 = htole32(ctl1); 5360 1.1 ryo txring->txr_txdesc[idx].ctl2 = 0; 5361 1.1 ryo 5362 1.1 ryo idx = TXRING_NEXTIDX(idx); 5363 1.1 ryo txring->txr_nfree--; 5364 1.1 ryo } 5365 1.1 ryo 5366 1.1 ryo if (m->m_pkthdr.csum_flags & M_CSUM_IPv4) 5367 1.1 ryo ctl1_ctx |= AQ_TXDESC_CTL1_CMD_IP4CSUM; 5368 1.1 ryo if (m->m_pkthdr.csum_flags & 5369 1.1 ryo (M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_TCPv6 | M_CSUM_UDPv6)) { 5370 1.1 ryo ctl1_ctx |= AQ_TXDESC_CTL1_CMD_L4CSUM; 5371 1.1 ryo } 5372 1.1 ryo 5373 1.1 ryo /* fill descriptor(s) */ 5374 1.1 ryo for (i = 0; i < map->dm_nsegs; i++) { 5375 1.1 ryo ctl1 = ctl1_ctx | AQ_TXDESC_CTL1_TYPE_TXD | 5376 1.1 ryo __SHIFTIN(map->dm_segs[i].ds_len, AQ_TXDESC_CTL1_BLEN); 5377 1.1 ryo ctl1 |= AQ_TXDESC_CTL1_CMD_FCS; 5378 1.1 ryo 5379 1.1 ryo if (i == 0) { 5380 1.1 ryo /* remember mbuf of these descriptors */ 5381 1.1 ryo txring->txr_mbufs[idx].m = m; 5382 1.1 ryo } else { 5383 1.1 ryo txring->txr_mbufs[idx].m = NULL; 5384 1.1 ryo } 5385 1.1 ryo 5386 1.1 ryo if (i == map->dm_nsegs - 1) { 5387 1.1 ryo /* last segment, mark an EndOfPacket, and cause intr */ 5388 1.1 ryo ctl1 |= AQ_TXDESC_CTL1_EOP | AQ_TXDESC_CTL1_CMD_WB; 5389 1.1 ryo } 5390 1.1 ryo 5391 1.1 ryo txring->txr_txdesc[idx].buf_addr = 5392 1.1 ryo htole64(map->dm_segs[i].ds_addr); 5393 1.1 ryo txring->txr_txdesc[idx].ctl1 = htole32(ctl1); 5394 1.1 ryo txring->txr_txdesc[idx].ctl2 = htole32(ctl2); 5395 1.1 ryo 5396 1.1 ryo bus_dmamap_sync(sc->sc_dmat, txring->txr_txdesc_dmamap, 5397 1.1 ryo sizeof(aq_tx_desc_t) * idx, sizeof(aq_tx_desc_t), 5398 1.1 ryo BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 5399 1.1 ryo 5400 1.1 ryo idx = TXRING_NEXTIDX(idx); 5401 1.1 ryo txring->txr_nfree--; 5402 1.1 ryo } 5403 1.1 ryo 5404 1.1 ryo txring->txr_prodidx = idx; 5405 1.1 ryo 5406 1.1 ryo return 0; 5407 1.1 ryo } 5408 1.1 ryo 5409 1.1 ryo static int 5410 1.1 ryo aq_tx_intr(void *arg) 5411 1.1 ryo { 5412 1.32 skrll struct aq_txring * const txring = arg; 5413 1.32 skrll struct aq_softc * const sc = txring->txr_sc; 5414 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 5415 1.3 ryo struct mbuf *m; 5416 1.1 ryo const int ringidx = txring->txr_index; 5417 1.1 ryo unsigned int idx, hw_head, n = 0; 5418 1.1 ryo 5419 1.1 ryo mutex_enter(&txring->txr_mutex); 5420 1.1 ryo 5421 1.1 ryo if (!txring->txr_active) 5422 1.1 ryo goto tx_intr_done; 5423 1.1 ryo 5424 1.1 ryo hw_head = AQ_READ_REG_BIT(sc, TX_DMA_DESC_HEAD_PTR_REG(ringidx), 5425 1.1 ryo TX_DMA_DESC_HEAD_PTR); 5426 1.1 ryo if (hw_head == txring->txr_considx) { 5427 1.33 skrll txring->txr_sending = false; 5428 1.1 ryo goto tx_intr_done; 5429 1.1 ryo } 5430 1.1 ryo 5431 1.6 thorpej net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 5432 1.6 thorpej 5433 1.1 ryo for (idx = txring->txr_considx; idx != hw_head; 5434 1.1 ryo idx = TXRING_NEXTIDX(idx), n++) { 5435 1.1 ryo 5436 1.3 ryo if ((m = txring->txr_mbufs[idx].m) != NULL) { 5437 1.1 ryo bus_dmamap_unload(sc->sc_dmat, 5438 1.1 ryo txring->txr_mbufs[idx].dmamap); 5439 1.3 ryo 5440 1.48 riastrad if_statinc_ref(ifp, nsr, if_opackets); 5441 1.48 riastrad if_statadd_ref(ifp, nsr, if_obytes, m->m_pkthdr.len); 5442 1.3 ryo if (m->m_flags & M_MCAST) 5443 1.48 riastrad if_statinc_ref(ifp, nsr, if_omcasts); 5444 1.3 ryo 5445 1.3 ryo m_freem(m); 5446 1.1 ryo txring->txr_mbufs[idx].m = NULL; 5447 1.1 ryo } 5448 1.1 ryo 5449 1.1 ryo txring->txr_nfree++; 5450 1.1 ryo } 5451 1.1 ryo txring->txr_considx = idx; 5452 1.1 ryo 5453 1.6 thorpej IF_STAT_PUTREF(ifp); 5454 1.6 thorpej 5455 1.1 ryo /* no more pending TX packet, cancel watchdog */ 5456 1.1 ryo if (txring->txr_nfree >= AQ_TXD_NUM) 5457 1.33 skrll txring->txr_sending = false; 5458 1.1 ryo 5459 1.1 ryo tx_intr_done: 5460 1.1 ryo mutex_exit(&txring->txr_mutex); 5461 1.1 ryo 5462 1.1 ryo AQ_WRITE_REG(sc, AQ_INTR_STATUS_CLR_REG, __BIT(sc->sc_tx_irq[ringidx])); 5463 1.1 ryo return n; 5464 1.1 ryo } 5465 1.1 ryo 5466 1.1 ryo static int 5467 1.1 ryo aq_rx_intr(void *arg) 5468 1.1 ryo { 5469 1.32 skrll struct aq_rxring * const rxring = arg; 5470 1.32 skrll struct aq_softc * const sc = rxring->rxr_sc; 5471 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 5472 1.1 ryo const int ringidx = rxring->rxr_index; 5473 1.1 ryo aq_rx_desc_t *rxd; 5474 1.1 ryo struct mbuf *m, *m0, *mprev, *new_m; 5475 1.1 ryo uint32_t rxd_type, rxd_hash __unused; 5476 1.1 ryo uint16_t rxd_status, rxd_pktlen; 5477 1.1 ryo uint16_t rxd_nextdescptr __unused, rxd_vlan __unused; 5478 1.1 ryo unsigned int idx, n = 0; 5479 1.28 ryo bool discarding; 5480 1.1 ryo 5481 1.1 ryo mutex_enter(&rxring->rxr_mutex); 5482 1.1 ryo 5483 1.1 ryo if (!rxring->rxr_active) 5484 1.1 ryo goto rx_intr_done; 5485 1.1 ryo 5486 1.1 ryo if (rxring->rxr_readidx == AQ_READ_REG_BIT(sc, 5487 1.1 ryo RX_DMA_DESC_HEAD_PTR_REG(ringidx), RX_DMA_DESC_HEAD_PTR)) { 5488 1.1 ryo goto rx_intr_done; 5489 1.1 ryo } 5490 1.1 ryo 5491 1.6 thorpej net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 5492 1.6 thorpej 5493 1.28 ryo /* restore ring context */ 5494 1.28 ryo discarding = rxring->rxr_discarding; 5495 1.28 ryo m0 = rxring->rxr_receiving_m; 5496 1.28 ryo mprev = rxring->rxr_receiving_m_last; 5497 1.28 ryo 5498 1.1 ryo for (idx = rxring->rxr_readidx; 5499 1.1 ryo idx != AQ_READ_REG_BIT(sc, RX_DMA_DESC_HEAD_PTR_REG(ringidx), 5500 1.1 ryo RX_DMA_DESC_HEAD_PTR); idx = RXRING_NEXTIDX(idx), n++) { 5501 1.1 ryo 5502 1.1 ryo bus_dmamap_sync(sc->sc_dmat, rxring->rxr_rxdesc_dmamap, 5503 1.1 ryo sizeof(aq_rx_desc_t) * idx, sizeof(aq_rx_desc_t), 5504 1.1 ryo BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 5505 1.1 ryo 5506 1.1 ryo rxd = &rxring->rxr_rxdesc[idx]; 5507 1.1 ryo rxd_status = le16toh(rxd->wb.status); 5508 1.1 ryo 5509 1.1 ryo if ((rxd_status & RXDESC_STATUS_DD) == 0) 5510 1.1 ryo break; /* not yet done */ 5511 1.1 ryo 5512 1.1 ryo rxd_type = le32toh(rxd->wb.type); 5513 1.1 ryo rxd_pktlen = le16toh(rxd->wb.pkt_len); 5514 1.1 ryo rxd_nextdescptr = le16toh(rxd->wb.next_desc_ptr); 5515 1.1 ryo rxd_hash = le32toh(rxd->wb.rss_hash); 5516 1.1 ryo rxd_vlan = le16toh(rxd->wb.vlan); 5517 1.1 ryo 5518 1.28 ryo /* 5519 1.28 ryo * Some segments are being dropped while receiving jumboframe. 5520 1.28 ryo * Discard until EOP. 5521 1.28 ryo */ 5522 1.28 ryo if (discarding) 5523 1.28 ryo goto rx_next; 5524 1.28 ryo 5525 1.1 ryo if ((rxd_status & RXDESC_STATUS_MACERR) || 5526 1.1 ryo (rxd_type & RXDESC_TYPE_MAC_DMA_ERR)) { 5527 1.48 riastrad if_statinc_ref(ifp, nsr, if_ierrors); 5528 1.28 ryo if (m0 != NULL) { 5529 1.28 ryo m_freem(m0); 5530 1.28 ryo m0 = mprev = NULL; 5531 1.28 ryo } 5532 1.28 ryo discarding = true; 5533 1.1 ryo goto rx_next; 5534 1.1 ryo } 5535 1.1 ryo 5536 1.1 ryo bus_dmamap_sync(sc->sc_dmat, rxring->rxr_mbufs[idx].dmamap, 0, 5537 1.1 ryo rxring->rxr_mbufs[idx].dmamap->dm_mapsize, 5538 1.1 ryo BUS_DMASYNC_POSTREAD); 5539 1.1 ryo m = rxring->rxr_mbufs[idx].m; 5540 1.1 ryo 5541 1.1 ryo new_m = aq_alloc_mbuf(); 5542 1.1 ryo if (new_m == NULL) { 5543 1.1 ryo /* 5544 1.1 ryo * cannot allocate new mbuf. 5545 1.1 ryo * discard this packet, and reuse mbuf for next. 5546 1.1 ryo */ 5547 1.48 riastrad if_statinc_ref(ifp, nsr, if_iqdrops); 5548 1.28 ryo if (m0 != NULL) { 5549 1.28 ryo m_freem(m0); 5550 1.28 ryo m0 = mprev = NULL; 5551 1.28 ryo } 5552 1.28 ryo discarding = true; 5553 1.1 ryo goto rx_next; 5554 1.1 ryo } 5555 1.1 ryo rxring->rxr_mbufs[idx].m = NULL; 5556 1.1 ryo aq_rxring_setmbuf(sc, rxring, idx, new_m); 5557 1.1 ryo 5558 1.1 ryo if (m0 == NULL) { 5559 1.1 ryo m0 = m; 5560 1.1 ryo } else { 5561 1.1 ryo if (m->m_flags & M_PKTHDR) 5562 1.1 ryo m_remove_pkthdr(m); 5563 1.1 ryo mprev->m_next = m; 5564 1.1 ryo } 5565 1.1 ryo mprev = m; 5566 1.1 ryo 5567 1.1 ryo if ((rxd_status & RXDESC_STATUS_EOP) == 0) { 5568 1.28 ryo /* to be continued in the next segment */ 5569 1.1 ryo m->m_len = MCLBYTES; 5570 1.1 ryo } else { 5571 1.28 ryo /* the last segment */ 5572 1.24 ryo int mlen = rxd_pktlen % MCLBYTES; 5573 1.24 ryo if (mlen == 0) 5574 1.24 ryo mlen = MCLBYTES; 5575 1.24 ryo m->m_len = mlen; 5576 1.1 ryo m0->m_pkthdr.len = rxd_pktlen; 5577 1.1 ryo /* VLAN offloading */ 5578 1.1 ryo if ((sc->sc_ethercom.ec_capenable & 5579 1.1 ryo ETHERCAP_VLAN_HWTAGGING) && 5580 1.1 ryo (__SHIFTOUT(rxd_type, RXDESC_TYPE_PKTTYPE_VLAN) || 5581 1.1 ryo __SHIFTOUT(rxd_type, 5582 1.1 ryo RXDESC_TYPE_PKTTYPE_VLAN_DOUBLE))) { 5583 1.1 ryo vlan_set_tag(m0, rxd_vlan); 5584 1.1 ryo } 5585 1.1 ryo 5586 1.1 ryo /* Checksum offloading */ 5587 1.1 ryo unsigned int pkttype_eth = 5588 1.1 ryo __SHIFTOUT(rxd_type, RXDESC_TYPE_PKTTYPE_ETHER); 5589 1.1 ryo if ((ifp->if_capabilities & IFCAP_CSUM_IPv4_Rx) && 5590 1.1 ryo (pkttype_eth == RXDESC_TYPE_PKTTYPE_ETHER_IPV4) && 5591 1.1 ryo __SHIFTOUT(rxd_type, 5592 1.1 ryo RXDESC_TYPE_IPV4_CSUM_CHECKED)) { 5593 1.1 ryo m0->m_pkthdr.csum_flags |= M_CSUM_IPv4; 5594 1.1 ryo if (__SHIFTOUT(rxd_status, 5595 1.1 ryo RXDESC_STATUS_IPV4_CSUM_NG)) 5596 1.1 ryo m0->m_pkthdr.csum_flags |= 5597 1.1 ryo M_CSUM_IPv4_BAD; 5598 1.1 ryo } 5599 1.21 ryo 5600 1.1 ryo /* 5601 1.21 ryo * aq will always mark BAD for fragment packets, 5602 1.21 ryo * but this is not a problem because the IP stack 5603 1.21 ryo * ignores the CSUM flag in fragment packets. 5604 1.1 ryo */ 5605 1.1 ryo if (__SHIFTOUT(rxd_type, 5606 1.1 ryo RXDESC_TYPE_TCPUDP_CSUM_CHECKED)) { 5607 1.1 ryo bool checked = false; 5608 1.1 ryo unsigned int pkttype_proto = 5609 1.1 ryo __SHIFTOUT(rxd_type, 5610 1.1 ryo RXDESC_TYPE_PKTTYPE_PROTO); 5611 1.1 ryo 5612 1.1 ryo if (pkttype_proto == 5613 1.1 ryo RXDESC_TYPE_PKTTYPE_PROTO_TCP) { 5614 1.1 ryo if ((pkttype_eth == 5615 1.1 ryo RXDESC_TYPE_PKTTYPE_ETHER_IPV4) && 5616 1.1 ryo (ifp->if_capabilities & 5617 1.1 ryo IFCAP_CSUM_TCPv4_Rx)) { 5618 1.1 ryo m0->m_pkthdr.csum_flags |= 5619 1.1 ryo M_CSUM_TCPv4; 5620 1.1 ryo checked = true; 5621 1.1 ryo } else if ((pkttype_eth == 5622 1.1 ryo RXDESC_TYPE_PKTTYPE_ETHER_IPV6) && 5623 1.1 ryo (ifp->if_capabilities & 5624 1.1 ryo IFCAP_CSUM_TCPv6_Rx)) { 5625 1.1 ryo m0->m_pkthdr.csum_flags |= 5626 1.1 ryo M_CSUM_TCPv6; 5627 1.1 ryo checked = true; 5628 1.1 ryo } 5629 1.1 ryo } else if (pkttype_proto == 5630 1.1 ryo RXDESC_TYPE_PKTTYPE_PROTO_UDP) { 5631 1.1 ryo if ((pkttype_eth == 5632 1.1 ryo RXDESC_TYPE_PKTTYPE_ETHER_IPV4) && 5633 1.1 ryo (ifp->if_capabilities & 5634 1.1 ryo IFCAP_CSUM_UDPv4_Rx)) { 5635 1.1 ryo m0->m_pkthdr.csum_flags |= 5636 1.1 ryo M_CSUM_UDPv4; 5637 1.1 ryo checked = true; 5638 1.1 ryo } else if ((pkttype_eth == 5639 1.1 ryo RXDESC_TYPE_PKTTYPE_ETHER_IPV6) && 5640 1.1 ryo (ifp->if_capabilities & 5641 1.1 ryo IFCAP_CSUM_UDPv6_Rx)) { 5642 1.1 ryo m0->m_pkthdr.csum_flags |= 5643 1.1 ryo M_CSUM_UDPv6; 5644 1.1 ryo checked = true; 5645 1.1 ryo } 5646 1.1 ryo } 5647 1.1 ryo if (checked && 5648 1.1 ryo (__SHIFTOUT(rxd_status, 5649 1.1 ryo RXDESC_STATUS_TCPUDP_CSUM_ERROR) || 5650 1.1 ryo !__SHIFTOUT(rxd_status, 5651 1.1 ryo RXDESC_STATUS_TCPUDP_CSUM_OK))) { 5652 1.1 ryo m0->m_pkthdr.csum_flags |= 5653 1.1 ryo M_CSUM_TCP_UDP_BAD; 5654 1.1 ryo } 5655 1.1 ryo } 5656 1.21 ryo 5657 1.1 ryo m_set_rcvif(m0, ifp); 5658 1.48 riastrad if_statinc_ref(ifp, nsr, if_ipackets); 5659 1.48 riastrad if_statadd_ref(ifp, nsr, if_ibytes, m0->m_pkthdr.len); 5660 1.1 ryo if_percpuq_enqueue(ifp->if_percpuq, m0); 5661 1.1 ryo m0 = mprev = NULL; 5662 1.1 ryo } 5663 1.1 ryo 5664 1.1 ryo rx_next: 5665 1.28 ryo if (discarding && (rxd_status & RXDESC_STATUS_EOP) != 0) 5666 1.28 ryo discarding = false; 5667 1.28 ryo 5668 1.1 ryo aq_rxring_reset_desc(sc, rxring, idx); 5669 1.1 ryo AQ_WRITE_REG(sc, RX_DMA_DESC_TAIL_PTR_REG(ringidx), idx); 5670 1.1 ryo } 5671 1.28 ryo /* save ring context */ 5672 1.1 ryo rxring->rxr_readidx = idx; 5673 1.28 ryo rxring->rxr_discarding = discarding; 5674 1.28 ryo rxring->rxr_receiving_m = m0; 5675 1.28 ryo rxring->rxr_receiving_m_last = mprev; 5676 1.1 ryo 5677 1.6 thorpej IF_STAT_PUTREF(ifp); 5678 1.6 thorpej 5679 1.1 ryo rx_intr_done: 5680 1.1 ryo mutex_exit(&rxring->rxr_mutex); 5681 1.1 ryo 5682 1.1 ryo AQ_WRITE_REG(sc, AQ_INTR_STATUS_CLR_REG, __BIT(sc->sc_rx_irq[ringidx])); 5683 1.1 ryo return n; 5684 1.1 ryo } 5685 1.1 ryo 5686 1.1 ryo static int 5687 1.10 ryo aq_vlan_cb(struct ethercom *ec, uint16_t vid, bool set) 5688 1.10 ryo { 5689 1.43 ryo struct ifnet * const ifp = &ec->ec_if; 5690 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 5691 1.10 ryo 5692 1.10 ryo aq_set_vlan_filters(sc); 5693 1.10 ryo return 0; 5694 1.10 ryo } 5695 1.10 ryo 5696 1.10 ryo static int 5697 1.1 ryo aq_ifflags_cb(struct ethercom *ec) 5698 1.1 ryo { 5699 1.32 skrll struct ifnet * const ifp = &ec->ec_if; 5700 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 5701 1.1 ryo int i, ecchange, error = 0; 5702 1.1 ryo unsigned short iffchange; 5703 1.1 ryo 5704 1.1 ryo AQ_LOCK(sc); 5705 1.1 ryo 5706 1.1 ryo iffchange = ifp->if_flags ^ sc->sc_if_flags; 5707 1.1 ryo if ((iffchange & IFF_PROMISC) != 0) 5708 1.1 ryo error = aq_set_filter(sc); 5709 1.1 ryo 5710 1.1 ryo ecchange = ec->ec_capenable ^ sc->sc_ec_capenable; 5711 1.1 ryo if (ecchange & ETHERCAP_VLAN_HWTAGGING) { 5712 1.1 ryo for (i = 0; i < AQ_RINGS_NUM; i++) { 5713 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_REG(i), 5714 1.1 ryo RX_DMA_DESC_VLAN_STRIP, 5715 1.1 ryo (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING) ? 5716 1.1 ryo 1 : 0); 5717 1.1 ryo } 5718 1.1 ryo } 5719 1.1 ryo 5720 1.10 ryo /* vlan configuration depends on also interface promiscuous mode */ 5721 1.10 ryo if ((ecchange & ETHERCAP_VLAN_HWFILTER) || (iffchange & IFF_PROMISC)) 5722 1.10 ryo aq_set_vlan_filters(sc); 5723 1.10 ryo 5724 1.1 ryo sc->sc_ec_capenable = ec->ec_capenable; 5725 1.1 ryo sc->sc_if_flags = ifp->if_flags; 5726 1.1 ryo 5727 1.1 ryo AQ_UNLOCK(sc); 5728 1.1 ryo 5729 1.1 ryo return error; 5730 1.1 ryo } 5731 1.1 ryo 5732 1.33 skrll 5733 1.1 ryo static int 5734 1.1 ryo aq_init(struct ifnet *ifp) 5735 1.1 ryo { 5736 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 5737 1.33 skrll 5738 1.33 skrll AQ_LOCK(sc); 5739 1.33 skrll 5740 1.33 skrll int ret = aq_init_locked(ifp); 5741 1.33 skrll 5742 1.33 skrll AQ_UNLOCK(sc); 5743 1.33 skrll 5744 1.33 skrll return ret; 5745 1.33 skrll } 5746 1.33 skrll 5747 1.33 skrll static int 5748 1.33 skrll aq_init_locked(struct ifnet *ifp) 5749 1.33 skrll { 5750 1.33 skrll struct aq_softc * const sc = ifp->if_softc; 5751 1.1 ryo int i, error = 0; 5752 1.1 ryo 5753 1.33 skrll KASSERT(IFNET_LOCKED(ifp)); 5754 1.33 skrll AQ_LOCKED(sc); 5755 1.22 ryo 5756 1.33 skrll aq_stop_locked(ifp, false); 5757 1.1 ryo 5758 1.10 ryo aq_set_vlan_filters(sc); 5759 1.1 ryo aq_set_capability(sc); 5760 1.1 ryo 5761 1.1 ryo for (i = 0; i < sc->sc_nqueues; i++) { 5762 1.1 ryo aq_txring_reset(sc, &sc->sc_queue[i].txring, true); 5763 1.1 ryo } 5764 1.1 ryo 5765 1.1 ryo /* invalidate RX descriptor cache */ 5766 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_CACHE_INIT_REG, RX_DMA_DESC_CACHE_INIT, 5767 1.1 ryo AQ_READ_REG_BIT(sc, 5768 1.1 ryo RX_DMA_DESC_CACHE_INIT_REG, RX_DMA_DESC_CACHE_INIT) ^ 1); 5769 1.1 ryo 5770 1.1 ryo /* start RX */ 5771 1.1 ryo for (i = 0; i < sc->sc_nqueues; i++) { 5772 1.1 ryo error = aq_rxring_reset(sc, &sc->sc_queue[i].rxring, true); 5773 1.1 ryo if (error != 0) { 5774 1.1 ryo device_printf(sc->sc_dev, "%s: cannot allocate rxbuf\n", 5775 1.1 ryo __func__); 5776 1.1 ryo goto aq_init_failure; 5777 1.1 ryo } 5778 1.1 ryo } 5779 1.1 ryo aq_init_rss(sc); 5780 1.43 ryo if (HWTYPE_AQ1_P(sc)) 5781 1.43 ryo aq1_hw_l3_filter_set(sc); 5782 1.1 ryo 5783 1.33 skrll /* ring reset? */ 5784 1.33 skrll aq_unset_stopping_flags(sc); 5785 1.33 skrll 5786 1.33 skrll callout_schedule(&sc->sc_tick_ch, hz); 5787 1.1 ryo 5788 1.1 ryo /* ready */ 5789 1.1 ryo ifp->if_flags |= IFF_RUNNING; 5790 1.1 ryo 5791 1.1 ryo /* start TX and RX */ 5792 1.37 riastrad aq_enable_intr(sc, /*link*/true, /*txrx*/true); 5793 1.1 ryo AQ_WRITE_REG_BIT(sc, TPB_TX_BUF_REG, TPB_TX_BUF_EN, 1); 5794 1.1 ryo AQ_WRITE_REG_BIT(sc, RPB_RPF_RX_REG, RPB_RPF_RX_BUF_EN, 1); 5795 1.1 ryo 5796 1.1 ryo aq_init_failure: 5797 1.1 ryo sc->sc_if_flags = ifp->if_flags; 5798 1.1 ryo 5799 1.1 ryo return error; 5800 1.1 ryo } 5801 1.1 ryo 5802 1.1 ryo static void 5803 1.1 ryo aq_send_common_locked(struct ifnet *ifp, struct aq_softc *sc, 5804 1.1 ryo struct aq_txring *txring, bool is_transmit) 5805 1.1 ryo { 5806 1.44 ryo struct mbuf *m, *n; 5807 1.1 ryo int npkt, error; 5808 1.1 ryo 5809 1.33 skrll if (txring->txr_nfree < AQ_TXD_MIN) 5810 1.1 ryo return; 5811 1.1 ryo 5812 1.1 ryo for (npkt = 0; ; npkt++) { 5813 1.1 ryo if (is_transmit) 5814 1.1 ryo m = pcq_peek(txring->txr_pcq); 5815 1.1 ryo else 5816 1.1 ryo IFQ_POLL(&ifp->if_snd, m); 5817 1.44 ryo if (m == NULL) 5818 1.44 ryo break; 5819 1.1 ryo 5820 1.44 ryo error = aq_encap_txring(sc, txring, m); 5821 1.44 ryo if (error == EAGAIN) { 5822 1.44 ryo /* Not enough descriptors available. try again later */ 5823 1.1 ryo break; 5824 1.44 ryo } 5825 1.1 ryo 5826 1.1 ryo if (is_transmit) 5827 1.1 ryo pcq_get(txring->txr_pcq); 5828 1.1 ryo else 5829 1.44 ryo IFQ_DEQUEUE(&ifp->if_snd, n); 5830 1.1 ryo 5831 1.1 ryo if (error != 0) { 5832 1.44 ryo /* too many mbuf chains? or other errors. */ 5833 1.1 ryo m_freem(m); 5834 1.6 thorpej if_statinc(ifp, if_oerrors); 5835 1.1 ryo break; 5836 1.1 ryo } 5837 1.1 ryo 5838 1.1 ryo /* update tail ptr */ 5839 1.1 ryo AQ_WRITE_REG(sc, TX_DMA_DESC_TAIL_PTR_REG(txring->txr_index), 5840 1.1 ryo txring->txr_prodidx); 5841 1.1 ryo 5842 1.1 ryo /* Pass the packet to any BPF listeners */ 5843 1.1 ryo bpf_mtap(ifp, m, BPF_D_OUT); 5844 1.1 ryo } 5845 1.1 ryo 5846 1.33 skrll if (npkt) { 5847 1.33 skrll /* Set a watchdog timer in case the chip flakes out. */ 5848 1.33 skrll txring->txr_lastsent = time_uptime; 5849 1.33 skrll txring->txr_sending = true; 5850 1.33 skrll } 5851 1.1 ryo } 5852 1.1 ryo 5853 1.1 ryo static void 5854 1.1 ryo aq_start(struct ifnet *ifp) 5855 1.1 ryo { 5856 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 5857 1.32 skrll /* aq_start() always use TX ring[0] */ 5858 1.32 skrll struct aq_txring * const txring = &sc->sc_queue[0].txring; 5859 1.1 ryo 5860 1.1 ryo mutex_enter(&txring->txr_mutex); 5861 1.33 skrll if (txring->txr_active && !txring->txr_stopping) 5862 1.1 ryo aq_send_common_locked(ifp, sc, txring, false); 5863 1.1 ryo mutex_exit(&txring->txr_mutex); 5864 1.1 ryo } 5865 1.1 ryo 5866 1.1 ryo static inline unsigned int 5867 1.1 ryo aq_select_txqueue(struct aq_softc *sc, struct mbuf *m) 5868 1.1 ryo { 5869 1.1 ryo return (cpu_index(curcpu()) % sc->sc_nqueues); 5870 1.1 ryo } 5871 1.1 ryo 5872 1.1 ryo static int 5873 1.1 ryo aq_transmit(struct ifnet *ifp, struct mbuf *m) 5874 1.1 ryo { 5875 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 5876 1.32 skrll const int ringidx = aq_select_txqueue(sc, m); 5877 1.32 skrll struct aq_txring * const txring = &sc->sc_queue[ringidx].txring; 5878 1.1 ryo 5879 1.1 ryo if (__predict_false(!pcq_put(txring->txr_pcq, m))) { 5880 1.1 ryo m_freem(m); 5881 1.1 ryo return ENOBUFS; 5882 1.1 ryo } 5883 1.1 ryo 5884 1.1 ryo if (mutex_tryenter(&txring->txr_mutex)) { 5885 1.1 ryo aq_send_common_locked(ifp, sc, txring, true); 5886 1.1 ryo mutex_exit(&txring->txr_mutex); 5887 1.1 ryo } else { 5888 1.45 rin kpreempt_disable(); 5889 1.1 ryo softint_schedule(txring->txr_softint); 5890 1.45 rin kpreempt_enable(); 5891 1.1 ryo } 5892 1.1 ryo return 0; 5893 1.1 ryo } 5894 1.1 ryo 5895 1.1 ryo static void 5896 1.1 ryo aq_deferred_transmit(void *arg) 5897 1.1 ryo { 5898 1.32 skrll struct aq_txring * const txring = arg; 5899 1.32 skrll struct aq_softc * const sc = txring->txr_sc; 5900 1.32 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 5901 1.1 ryo 5902 1.1 ryo mutex_enter(&txring->txr_mutex); 5903 1.1 ryo if (pcq_peek(txring->txr_pcq) != NULL) 5904 1.1 ryo aq_send_common_locked(ifp, sc, txring, true); 5905 1.1 ryo mutex_exit(&txring->txr_mutex); 5906 1.1 ryo } 5907 1.1 ryo 5908 1.33 skrll 5909 1.33 skrll static void 5910 1.33 skrll aq_unset_stopping_flags(struct aq_softc *sc) 5911 1.33 skrll { 5912 1.33 skrll 5913 1.33 skrll AQ_LOCKED(sc); 5914 1.33 skrll 5915 1.33 skrll /* Must unset stopping flags in ascending order. */ 5916 1.40 ryo for (int i = 0; i < sc->sc_nqueues; i++) { 5917 1.33 skrll struct aq_txring *txr = &sc->sc_queue[i].txring; 5918 1.33 skrll struct aq_rxring *rxr = &sc->sc_queue[i].rxring; 5919 1.33 skrll 5920 1.33 skrll mutex_enter(&txr->txr_mutex); 5921 1.33 skrll txr->txr_stopping = false; 5922 1.33 skrll mutex_exit(&txr->txr_mutex); 5923 1.33 skrll 5924 1.33 skrll mutex_enter(&rxr->rxr_mutex); 5925 1.33 skrll rxr->rxr_stopping = false; 5926 1.33 skrll mutex_exit(&rxr->rxr_mutex); 5927 1.33 skrll } 5928 1.33 skrll 5929 1.33 skrll sc->sc_stopping = false; 5930 1.33 skrll } 5931 1.33 skrll 5932 1.33 skrll static void 5933 1.33 skrll aq_set_stopping_flags(struct aq_softc *sc) 5934 1.33 skrll { 5935 1.33 skrll 5936 1.33 skrll AQ_LOCKED(sc); 5937 1.33 skrll 5938 1.33 skrll /* Must unset stopping flags in ascending order. */ 5939 1.40 ryo for (int i = 0; i < sc->sc_nqueues; i++) { 5940 1.33 skrll struct aq_txring *txr = &sc->sc_queue[i].txring; 5941 1.33 skrll struct aq_rxring *rxr = &sc->sc_queue[i].rxring; 5942 1.33 skrll 5943 1.33 skrll mutex_enter(&txr->txr_mutex); 5944 1.33 skrll txr->txr_stopping = true; 5945 1.33 skrll mutex_exit(&txr->txr_mutex); 5946 1.33 skrll 5947 1.33 skrll mutex_enter(&rxr->rxr_mutex); 5948 1.33 skrll rxr->rxr_stopping = true; 5949 1.33 skrll mutex_exit(&rxr->rxr_mutex); 5950 1.33 skrll } 5951 1.33 skrll 5952 1.33 skrll sc->sc_stopping = true; 5953 1.33 skrll } 5954 1.33 skrll 5955 1.33 skrll 5956 1.1 ryo static void 5957 1.1 ryo aq_stop(struct ifnet *ifp, int disable) 5958 1.1 ryo { 5959 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 5960 1.33 skrll 5961 1.33 skrll ASSERT_SLEEPABLE(); 5962 1.33 skrll KASSERT(IFNET_LOCKED(ifp)); 5963 1.33 skrll 5964 1.33 skrll AQ_LOCK(sc); 5965 1.33 skrll aq_stop_locked(ifp, disable ? true : false); 5966 1.33 skrll AQ_UNLOCK(sc); 5967 1.33 skrll } 5968 1.33 skrll 5969 1.33 skrll 5970 1.33 skrll 5971 1.33 skrll static void 5972 1.33 skrll aq_stop_locked(struct ifnet *ifp, bool disable) 5973 1.33 skrll { 5974 1.33 skrll struct aq_softc * const sc = ifp->if_softc; 5975 1.1 ryo int i; 5976 1.1 ryo 5977 1.33 skrll KASSERT(IFNET_LOCKED(ifp)); 5978 1.33 skrll AQ_LOCKED(sc); 5979 1.1 ryo 5980 1.33 skrll aq_set_stopping_flags(sc); 5981 1.1 ryo 5982 1.22 ryo if ((ifp->if_flags & IFF_RUNNING) == 0) 5983 1.22 ryo goto already_stopped; 5984 1.22 ryo 5985 1.1 ryo /* disable tx/rx interrupts */ 5986 1.37 riastrad aq_enable_intr(sc, /*link*/true, /*txrx*/false); 5987 1.1 ryo 5988 1.1 ryo AQ_WRITE_REG_BIT(sc, TPB_TX_BUF_REG, TPB_TX_BUF_EN, 0); 5989 1.1 ryo for (i = 0; i < sc->sc_nqueues; i++) { 5990 1.1 ryo aq_txring_reset(sc, &sc->sc_queue[i].txring, false); 5991 1.1 ryo } 5992 1.1 ryo 5993 1.1 ryo AQ_WRITE_REG_BIT(sc, RPB_RPF_RX_REG, RPB_RPF_RX_BUF_EN, 0); 5994 1.1 ryo for (i = 0; i < sc->sc_nqueues; i++) { 5995 1.1 ryo aq_rxring_reset(sc, &sc->sc_queue[i].rxring, false); 5996 1.1 ryo } 5997 1.1 ryo 5998 1.1 ryo /* invalidate RX descriptor cache */ 5999 1.1 ryo AQ_WRITE_REG_BIT(sc, RX_DMA_DESC_CACHE_INIT_REG, RX_DMA_DESC_CACHE_INIT, 6000 1.1 ryo AQ_READ_REG_BIT(sc, 6001 1.1 ryo RX_DMA_DESC_CACHE_INIT_REG, RX_DMA_DESC_CACHE_INIT) ^ 1); 6002 1.1 ryo 6003 1.22 ryo already_stopped: 6004 1.37 riastrad aq_enable_intr(sc, /*link*/false, /*txrx*/false); 6005 1.36 riastrad callout_halt(&sc->sc_tick_ch, &sc->sc_mutex); 6006 1.1 ryo 6007 1.33 skrll ifp->if_flags &= ~IFF_RUNNING; 6008 1.33 skrll sc->sc_if_flags = ifp->if_flags; 6009 1.33 skrll } 6010 1.1 ryo 6011 1.1 ryo 6012 1.1 ryo static void 6013 1.33 skrll aq_handle_reset_work(struct work *work, void *arg) 6014 1.1 ryo { 6015 1.33 skrll struct aq_softc * const sc = arg; 6016 1.33 skrll struct ifnet * const ifp = &sc->sc_ethercom.ec_if; 6017 1.33 skrll 6018 1.33 skrll printf("%s: watchdog timeout -- resetting\n", ifp->if_xname); 6019 1.1 ryo 6020 1.1 ryo AQ_LOCK(sc); 6021 1.1 ryo 6022 1.1 ryo device_printf(sc->sc_dev, "%s: INTR_MASK/STATUS = %08x/%08x\n", 6023 1.1 ryo __func__, AQ_READ_REG(sc, AQ_INTR_MASK_REG), 6024 1.1 ryo AQ_READ_REG(sc, AQ_INTR_STATUS_REG)); 6025 1.1 ryo 6026 1.40 ryo for (int n = 0; n < sc->sc_nqueues; n++) { 6027 1.33 skrll struct aq_txring *txring = &sc->sc_queue[n].txring; 6028 1.33 skrll u_int head = AQ_READ_REG_BIT(sc, 6029 1.1 ryo TX_DMA_DESC_HEAD_PTR_REG(txring->txr_index), 6030 1.33 skrll TX_DMA_DESC_HEAD_PTR); 6031 1.33 skrll u_int tail = AQ_READ_REG(sc, 6032 1.1 ryo TX_DMA_DESC_TAIL_PTR_REG(txring->txr_index)); 6033 1.1 ryo 6034 1.33 skrll device_printf(sc->sc_dev, "%s: TXring[%u] HEAD/TAIL=%u/%u\n", 6035 1.1 ryo __func__, txring->txr_index, head, tail); 6036 1.1 ryo 6037 1.1 ryo aq_tx_intr(txring); 6038 1.1 ryo } 6039 1.1 ryo 6040 1.1 ryo AQ_UNLOCK(sc); 6041 1.1 ryo 6042 1.33 skrll /* Don't want ioctl operations to happen */ 6043 1.33 skrll IFNET_LOCK(ifp); 6044 1.33 skrll 6045 1.33 skrll /* reset the interface. */ 6046 1.1 ryo aq_init(ifp); 6047 1.33 skrll 6048 1.33 skrll IFNET_UNLOCK(ifp); 6049 1.33 skrll 6050 1.33 skrll atomic_store_relaxed(&sc->sc_reset_pending, 0); 6051 1.1 ryo } 6052 1.1 ryo 6053 1.1 ryo static int 6054 1.1 ryo aq_ioctl(struct ifnet *ifp, unsigned long cmd, void *data) 6055 1.1 ryo { 6056 1.32 skrll struct aq_softc * const sc = ifp->if_softc; 6057 1.32 skrll struct ifreq * const ifr = data; 6058 1.32 skrll int error = 0; 6059 1.1 ryo 6060 1.33 skrll switch (cmd) { 6061 1.33 skrll case SIOCADDMULTI: 6062 1.33 skrll case SIOCDELMULTI: 6063 1.33 skrll break; 6064 1.33 skrll default: 6065 1.33 skrll KASSERT(IFNET_LOCKED(ifp)); 6066 1.33 skrll } 6067 1.33 skrll 6068 1.32 skrll const int s = splnet(); 6069 1.23 ryo switch (cmd) { 6070 1.23 ryo case SIOCSIFMTU: 6071 1.23 ryo if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > sc->sc_max_mtu) { 6072 1.23 ryo error = EINVAL; 6073 1.23 ryo } else { 6074 1.23 ryo ifp->if_mtu = ifr->ifr_mtu; 6075 1.23 ryo error = 0; /* no need to reset (no ENETRESET) */ 6076 1.23 ryo } 6077 1.23 ryo break; 6078 1.23 ryo default: 6079 1.23 ryo error = ether_ioctl(ifp, cmd, data); 6080 1.23 ryo break; 6081 1.23 ryo } 6082 1.1 ryo splx(s); 6083 1.1 ryo 6084 1.1 ryo if (error != ENETRESET) 6085 1.1 ryo return error; 6086 1.1 ryo 6087 1.1 ryo switch (cmd) { 6088 1.1 ryo case SIOCSIFCAP: 6089 1.1 ryo error = aq_set_capability(sc); 6090 1.1 ryo break; 6091 1.1 ryo case SIOCADDMULTI: 6092 1.1 ryo case SIOCDELMULTI: 6093 1.33 skrll AQ_LOCK(sc); 6094 1.33 skrll if ((sc->sc_if_flags & IFF_RUNNING) != 0) { 6095 1.42 ryo /* 6096 1.42 ryo * Multicast list has changed; set the hardware filter 6097 1.42 ryo * accordingly. 6098 1.42 ryo */ 6099 1.33 skrll error = aq_set_filter(sc); 6100 1.33 skrll } 6101 1.33 skrll AQ_UNLOCK(sc); 6102 1.1 ryo break; 6103 1.1 ryo } 6104 1.1 ryo 6105 1.1 ryo return error; 6106 1.1 ryo } 6107 1.1 ryo 6108 1.1 ryo 6109 1.1 ryo MODULE(MODULE_CLASS_DRIVER, if_aq, "pci"); 6110 1.1 ryo 6111 1.1 ryo #ifdef _MODULE 6112 1.1 ryo #include "ioconf.c" 6113 1.1 ryo #endif 6114 1.1 ryo 6115 1.1 ryo static int 6116 1.1 ryo if_aq_modcmd(modcmd_t cmd, void *opaque) 6117 1.1 ryo { 6118 1.1 ryo int error = 0; 6119 1.1 ryo 6120 1.1 ryo switch (cmd) { 6121 1.1 ryo case MODULE_CMD_INIT: 6122 1.1 ryo #ifdef _MODULE 6123 1.1 ryo error = config_init_component(cfdriver_ioconf_if_aq, 6124 1.1 ryo cfattach_ioconf_if_aq, cfdata_ioconf_if_aq); 6125 1.1 ryo #endif 6126 1.1 ryo return error; 6127 1.1 ryo case MODULE_CMD_FINI: 6128 1.1 ryo #ifdef _MODULE 6129 1.1 ryo error = config_fini_component(cfdriver_ioconf_if_aq, 6130 1.1 ryo cfattach_ioconf_if_aq, cfdata_ioconf_if_aq); 6131 1.1 ryo #endif 6132 1.1 ryo return error; 6133 1.1 ryo default: 6134 1.1 ryo return ENOTTY; 6135 1.1 ryo } 6136 1.1 ryo } 6137