1*493d26c5SEd Maste /* 2*493d26c5SEd Maste * aQuantia Corporation Network Driver 3*493d26c5SEd Maste * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved 4*493d26c5SEd Maste * 5*493d26c5SEd Maste * Redistribution and use in source and binary forms, with or without 6*493d26c5SEd Maste * modification, are permitted provided that the following conditions 7*493d26c5SEd Maste * are met: 8*493d26c5SEd Maste * 9*493d26c5SEd Maste * (1) Redistributions of source code must retain the above 10*493d26c5SEd Maste * copyright notice, this list of conditions and the following 11*493d26c5SEd Maste * disclaimer. 12*493d26c5SEd Maste * 13*493d26c5SEd Maste * (2) Redistributions in binary form must reproduce the above 14*493d26c5SEd Maste * copyright notice, this list of conditions and the following 15*493d26c5SEd Maste * disclaimer in the documentation and/or other materials provided 16*493d26c5SEd Maste * with the distribution. 17*493d26c5SEd Maste * 18*493d26c5SEd Maste * (3)The name of the author may not be used to endorse or promote 19*493d26c5SEd Maste * products derived from this software without specific prior 20*493d26c5SEd Maste * written permission. 21*493d26c5SEd Maste * 22*493d26c5SEd Maste * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 23*493d26c5SEd Maste * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 24*493d26c5SEd Maste * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25*493d26c5SEd Maste * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 26*493d26c5SEd Maste * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27*493d26c5SEd Maste * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 28*493d26c5SEd Maste * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29*493d26c5SEd Maste * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 30*493d26c5SEd Maste * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 31*493d26c5SEd Maste * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32*493d26c5SEd Maste * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33*493d26c5SEd Maste */ 34*493d26c5SEd Maste 35*493d26c5SEd Maste #ifndef _AQ_HW_H_ 36*493d26c5SEd Maste #define _AQ_HW_H_ 37*493d26c5SEd Maste 38*493d26c5SEd Maste #include <stdbool.h> 39*493d26c5SEd Maste #include <sys/types.h> 40*493d26c5SEd Maste #include <sys/cdefs.h> 41*493d26c5SEd Maste #include <machine/cpufunc.h> 42*493d26c5SEd Maste #include <sys/endian.h> 43*493d26c5SEd Maste #include "aq_common.h" 44*493d26c5SEd Maste 45*493d26c5SEd Maste #define AQ_WRITE_REG(hw, reg, value) writel(((hw)->hw_addr + (reg)), htole32(value)) 46*493d26c5SEd Maste 47*493d26c5SEd Maste #define AQ_READ_REG(hw, reg) le32toh(readl((hw)->hw_addr + reg)) 48*493d26c5SEd Maste 49*493d26c5SEd Maste 50*493d26c5SEd Maste #define AQ_WRITE_REG_BIT(hw, reg, msk, shift, value) do { \ 51*493d26c5SEd Maste if (msk ^ ~0) { \ 52*493d26c5SEd Maste u32 reg_old, reg_new = 0U; \ 53*493d26c5SEd Maste reg_old = AQ_READ_REG(hw, reg); \ 54*493d26c5SEd Maste reg_new = (reg_old & (~msk)) | (value << shift); \ 55*493d26c5SEd Maste if (reg_old != reg_new) \ 56*493d26c5SEd Maste AQ_WRITE_REG(hw, reg, reg_new); \ 57*493d26c5SEd Maste } else { \ 58*493d26c5SEd Maste AQ_WRITE_REG(hw, reg, value); \ 59*493d26c5SEd Maste } } while(0) 60*493d26c5SEd Maste 61*493d26c5SEd Maste 62*493d26c5SEd Maste #define AQ_READ_REG_BIT(a, reg, msk, shift) ( \ 63*493d26c5SEd Maste ((AQ_READ_REG(a, reg) & msk) >> shift)) 64*493d26c5SEd Maste 65*493d26c5SEd Maste #define AQ_HW_FLUSH() { (void)AQ_READ_REG(hw, 0x10); } 66*493d26c5SEd Maste 67*493d26c5SEd Maste #define aq_hw_write_reg_bit AQ_WRITE_REG_BIT 68*493d26c5SEd Maste 69*493d26c5SEd Maste #define aq_hw_write_reg AQ_WRITE_REG 70*493d26c5SEd Maste 71*493d26c5SEd Maste /* Statistics */ 72*493d26c5SEd Maste struct aq_hw_stats { 73*493d26c5SEd Maste u64 crcerrs; 74*493d26c5SEd Maste }; 75*493d26c5SEd Maste 76*493d26c5SEd Maste struct aq_hw_stats_s { 77*493d26c5SEd Maste u32 uprc; 78*493d26c5SEd Maste u32 mprc; 79*493d26c5SEd Maste u32 bprc; 80*493d26c5SEd Maste u32 erpt; 81*493d26c5SEd Maste u32 uptc; 82*493d26c5SEd Maste u32 mptc; 83*493d26c5SEd Maste u32 bptc; 84*493d26c5SEd Maste u32 erpr; 85*493d26c5SEd Maste u32 mbtc; 86*493d26c5SEd Maste u32 bbtc; 87*493d26c5SEd Maste u32 mbrc; 88*493d26c5SEd Maste u32 bbrc; 89*493d26c5SEd Maste u32 ubrc; 90*493d26c5SEd Maste u32 ubtc; 91*493d26c5SEd Maste u32 ptc; 92*493d26c5SEd Maste u32 prc; 93*493d26c5SEd Maste u32 dpc; 94*493d26c5SEd Maste u32 cprc; 95*493d26c5SEd Maste } __attribute__((__packed__)); 96*493d26c5SEd Maste 97*493d26c5SEd Maste union ip_addr { 98*493d26c5SEd Maste struct { 99*493d26c5SEd Maste u8 addr[16]; 100*493d26c5SEd Maste } v6; 101*493d26c5SEd Maste struct { 102*493d26c5SEd Maste u8 padding[12]; 103*493d26c5SEd Maste u8 addr[4]; 104*493d26c5SEd Maste } v4; 105*493d26c5SEd Maste } __attribute__((__packed__)); 106*493d26c5SEd Maste 107*493d26c5SEd Maste struct aq_hw_fw_mbox { 108*493d26c5SEd Maste u32 version; 109*493d26c5SEd Maste u32 transaction_id; 110*493d26c5SEd Maste int error; 111*493d26c5SEd Maste struct aq_hw_stats_s stats; 112*493d26c5SEd Maste } __attribute__((__packed__)); 113*493d26c5SEd Maste 114*493d26c5SEd Maste typedef struct aq_hw_fw_version { 115*493d26c5SEd Maste union { 116*493d26c5SEd Maste struct { 117*493d26c5SEd Maste u16 build_number; 118*493d26c5SEd Maste u8 minor_version; 119*493d26c5SEd Maste u8 major_version; 120*493d26c5SEd Maste }; 121*493d26c5SEd Maste u32 raw; 122*493d26c5SEd Maste }; 123*493d26c5SEd Maste } aq_hw_fw_version; 124*493d26c5SEd Maste 125*493d26c5SEd Maste enum aq_hw_irq_type { 126*493d26c5SEd Maste aq_irq_invalid = 0, 127*493d26c5SEd Maste aq_irq_legacy = 1, 128*493d26c5SEd Maste aq_irq_msi = 2, 129*493d26c5SEd Maste aq_irq_msix = 3, 130*493d26c5SEd Maste }; 131*493d26c5SEd Maste 132*493d26c5SEd Maste struct aq_hw_fc_info { 133*493d26c5SEd Maste bool fc_rx; 134*493d26c5SEd Maste bool fc_tx; 135*493d26c5SEd Maste }; 136*493d26c5SEd Maste 137*493d26c5SEd Maste struct aq_hw { 138*493d26c5SEd Maste void *aq_dev; 139*493d26c5SEd Maste u8 *hw_addr; 140*493d26c5SEd Maste u32 regs_size; 141*493d26c5SEd Maste 142*493d26c5SEd Maste u8 mac_addr[ETH_MAC_LEN]; 143*493d26c5SEd Maste 144*493d26c5SEd Maste enum aq_hw_irq_type irq_type; 145*493d26c5SEd Maste 146*493d26c5SEd Maste struct aq_hw_fc_info fc; 147*493d26c5SEd Maste u16 link_rate; 148*493d26c5SEd Maste 149*493d26c5SEd Maste u16 device_id; 150*493d26c5SEd Maste u16 subsystem_vendor_id; 151*493d26c5SEd Maste u16 subsystem_device_id; 152*493d26c5SEd Maste u16 vendor_id; 153*493d26c5SEd Maste u8 revision_id; 154*493d26c5SEd Maste 155*493d26c5SEd Maste /* Interrupt Moderation value. */ 156*493d26c5SEd Maste int itr; 157*493d26c5SEd Maste 158*493d26c5SEd Maste /* Firmware-related stuff. */ 159*493d26c5SEd Maste aq_hw_fw_version fw_version; 160*493d26c5SEd Maste const struct aq_firmware_ops* fw_ops; 161*493d26c5SEd Maste bool rbl_enabled; 162*493d26c5SEd Maste bool fast_start_enabled; 163*493d26c5SEd Maste bool flash_present; 164*493d26c5SEd Maste u32 chip_features; 165*493d26c5SEd Maste u64 fw_caps; 166*493d26c5SEd Maste 167*493d26c5SEd Maste bool lro_enabled; 168*493d26c5SEd Maste 169*493d26c5SEd Maste u32 mbox_addr; 170*493d26c5SEd Maste struct aq_hw_fw_mbox mbox; 171*493d26c5SEd Maste }; 172*493d26c5SEd Maste 173*493d26c5SEd Maste #define aq_hw_s aq_hw 174*493d26c5SEd Maste 175*493d26c5SEd Maste #define AQ_HW_MAC 0U 176*493d26c5SEd Maste #define AQ_HW_MAC_MIN 1U 177*493d26c5SEd Maste #define AQ_HW_MAC_MAX 33U 178*493d26c5SEd Maste 179*493d26c5SEd Maste #define HW_ATL_B0_MIN_RXD 32U 180*493d26c5SEd Maste #define HW_ATL_B0_MIN_TXD 32U 181*493d26c5SEd Maste #define HW_ATL_B0_MAX_RXD 4096U /* in fact up to 8184, but closest to power of 2 */ 182*493d26c5SEd Maste #define HW_ATL_B0_MAX_TXD 4096U /* in fact up to 8184, but closest to power of 2 */ 183*493d26c5SEd Maste 184*493d26c5SEd Maste #define HW_ATL_B0_MTU_JUMBO 16352U 185*493d26c5SEd Maste #define HW_ATL_B0_TSO_SIZE (160*1024) 186*493d26c5SEd Maste #define HW_ATL_B0_RINGS_MAX 32U 187*493d26c5SEd Maste #define HW_ATL_B0_LRO_RXD_MAX 16U 188*493d26c5SEd Maste 189*493d26c5SEd Maste #define AQ_HW_FW_SM_RAM 0x2U 190*493d26c5SEd Maste 191*493d26c5SEd Maste #define AQ_HW_MPI_STATE_MSK 0x00FFU 192*493d26c5SEd Maste #define AQ_HW_MPI_STATE_SHIFT 0U 193*493d26c5SEd Maste 194*493d26c5SEd Maste #define AQ_HW_MPI_CONTROL_ADR 0x0368U 195*493d26c5SEd Maste #define AQ_HW_MPI_STATE_ADR 0x036CU 196*493d26c5SEd Maste 197*493d26c5SEd Maste #define HW_ATL_RSS_INDIRECTION_TABLE_MAX 64U 198*493d26c5SEd Maste #define HW_ATL_RSS_HASHKEY_SIZE 40U 199*493d26c5SEd Maste 200*493d26c5SEd Maste /* PCI core control register */ 201*493d26c5SEd Maste #define AQ_HW_PCI_REG_CONTROL_6_ADR 0x1014U 202*493d26c5SEd Maste /* tx dma total request limit */ 203*493d26c5SEd Maste #define AQ_HW_TX_DMA_TOTAL_REQ_LIMIT_ADR 0x00007b20U 204*493d26c5SEd Maste 205*493d26c5SEd Maste #define AQ_HW_TXBUF_MAX 160U 206*493d26c5SEd Maste #define AQ_HW_RXBUF_MAX 320U 207*493d26c5SEd Maste 208*493d26c5SEd Maste #define L2_FILTER_ACTION_DISCARD (0x0) 209*493d26c5SEd Maste #define L2_FILTER_ACTION_HOST (0x1) 210*493d26c5SEd Maste 211*493d26c5SEd Maste #define AQ_HW_UCP_0X370_REG (0x370) 212*493d26c5SEd Maste #define AQ_HW_CHIP_MIPS 0x00000001U 213*493d26c5SEd Maste #define AQ_HW_CHIP_TPO2 0x00000002U 214*493d26c5SEd Maste #define AQ_HW_CHIP_RPF2 0x00000004U 215*493d26c5SEd Maste #define AQ_HW_CHIP_MPI_AQ 0x00000010U 216*493d26c5SEd Maste #define AQ_HW_CHIP_REVISION_A0 0x01000000U 217*493d26c5SEd Maste #define AQ_HW_CHIP_REVISION_B0 0x02000000U 218*493d26c5SEd Maste #define AQ_HW_CHIP_REVISION_B1 0x04000000U 219*493d26c5SEd Maste #define IS_CHIP_FEATURE(HW, _F_) (AQ_HW_CHIP_##_F_ & \ 220*493d26c5SEd Maste (HW)->chip_features) 221*493d26c5SEd Maste 222*493d26c5SEd Maste #define AQ_HW_FW_VER_EXPECTED 0x01050006U 223*493d26c5SEd Maste 224*493d26c5SEd Maste #define AQ_RX_RSS_TYPE_NONE 0x0 225*493d26c5SEd Maste #define AQ_RX_RSS_TYPE_IPV4 0x2 226*493d26c5SEd Maste #define AQ_RX_RSS_TYPE_IPV6 0x3 227*493d26c5SEd Maste #define AQ_RX_RSS_TYPE_IPV4_TCP 0x4 228*493d26c5SEd Maste #define AQ_RX_RSS_TYPE_IPV6_TCP 0x5 229*493d26c5SEd Maste #define AQ_RX_RSS_TYPE_IPV4_UDP 0x6 230*493d26c5SEd Maste #define AQ_RX_RSS_TYPE_IPV6_UDP 0x7 231*493d26c5SEd Maste 232*493d26c5SEd Maste enum hw_atl_rx_action_with_traffic { 233*493d26c5SEd Maste HW_ATL_RX_DISCARD, 234*493d26c5SEd Maste HW_ATL_RX_HOST, 235*493d26c5SEd Maste HW_ATL_RX_MNGMNT, 236*493d26c5SEd Maste HW_ATL_RX_HOST_AND_MNGMNT, 237*493d26c5SEd Maste HW_ATL_RX_WOL 238*493d26c5SEd Maste }; 239*493d26c5SEd Maste 240*493d26c5SEd Maste struct aq_rx_filter_vlan { 241*493d26c5SEd Maste u8 enable; 242*493d26c5SEd Maste u8 location; 243*493d26c5SEd Maste u16 vlan_id; 244*493d26c5SEd Maste u8 queue; 245*493d26c5SEd Maste }; 246*493d26c5SEd Maste 247*493d26c5SEd Maste #define AQ_HW_VLAN_MAX_FILTERS 16U 248*493d26c5SEd Maste #define AQ_HW_ETYPE_MAX_FILTERS 16U 249*493d26c5SEd Maste 250*493d26c5SEd Maste struct aq_rx_filter_l2 { 251*493d26c5SEd Maste u8 enable; 252*493d26c5SEd Maste s8 queue; 253*493d26c5SEd Maste u8 location; 254*493d26c5SEd Maste u8 user_priority_en; 255*493d26c5SEd Maste u8 user_priority; 256*493d26c5SEd Maste u16 ethertype; 257*493d26c5SEd Maste }; 258*493d26c5SEd Maste 259*493d26c5SEd Maste enum hw_atl_rx_ctrl_registers_l2 { 260*493d26c5SEd Maste HW_ATL_RX_ENABLE_UNICAST_MNGNT_QUEUE_L2 = BIT(19), 261*493d26c5SEd Maste HW_ATL_RX_ENABLE_UNICAST_FLTR_L2 = BIT(31) 262*493d26c5SEd Maste }; 263*493d26c5SEd Maste 264*493d26c5SEd Maste struct aq_rx_filter_l3l4 { 265*493d26c5SEd Maste u32 cmd; 266*493d26c5SEd Maste u8 location; 267*493d26c5SEd Maste u32 ip_dst[4]; 268*493d26c5SEd Maste u32 ip_src[4]; 269*493d26c5SEd Maste u16 p_dst; 270*493d26c5SEd Maste u16 p_src; 271*493d26c5SEd Maste bool is_ipv6; 272*493d26c5SEd Maste }; 273*493d26c5SEd Maste 274*493d26c5SEd Maste enum hw_atl_rx_protocol_value_l3l4 { 275*493d26c5SEd Maste HW_ATL_RX_TCP, 276*493d26c5SEd Maste HW_ATL_RX_UDP, 277*493d26c5SEd Maste HW_ATL_RX_SCTP, 278*493d26c5SEd Maste HW_ATL_RX_ICMP 279*493d26c5SEd Maste }; 280*493d26c5SEd Maste 281*493d26c5SEd Maste enum hw_atl_rx_ctrl_registers_l3l4 { 282*493d26c5SEd Maste HW_ATL_RX_ENABLE_MNGMNT_QUEUE_L3L4 = BIT(22), 283*493d26c5SEd Maste HW_ATL_RX_ENABLE_QUEUE_L3L4 = BIT(23), 284*493d26c5SEd Maste HW_ATL_RX_ENABLE_ARP_FLTR_L3 = BIT(24), 285*493d26c5SEd Maste HW_ATL_RX_ENABLE_CMP_PROT_L4 = BIT(25), 286*493d26c5SEd Maste HW_ATL_RX_ENABLE_CMP_DEST_PORT_L4 = BIT(26), 287*493d26c5SEd Maste HW_ATL_RX_ENABLE_CMP_SRC_PORT_L4 = BIT(27), 288*493d26c5SEd Maste HW_ATL_RX_ENABLE_CMP_DEST_ADDR_L3 = BIT(28), 289*493d26c5SEd Maste HW_ATL_RX_ENABLE_CMP_SRC_ADDR_L3 = BIT(29), 290*493d26c5SEd Maste HW_ATL_RX_ENABLE_L3_IPv6 = BIT(30), 291*493d26c5SEd Maste HW_ATL_RX_ENABLE_FLTR_L3L4 = BIT(31) 292*493d26c5SEd Maste }; 293*493d26c5SEd Maste 294*493d26c5SEd Maste #define HW_ATL_RX_BOFFSET_PROT_FL3L4 0U 295*493d26c5SEd Maste #define HW_ATL_RX_BOFFSET_QUEUE_FL3L4 8U 296*493d26c5SEd Maste #define HW_ATL_RX_BOFFSET_ACTION_FL3F4 16U 297*493d26c5SEd Maste 298*493d26c5SEd Maste #define HW_ATL_RX_CNT_REG_ADDR_IPV6 4U 299*493d26c5SEd Maste 300*493d26c5SEd Maste #define HW_ATL_GET_REG_LOCATION_FL3L4(location) \ 301*493d26c5SEd Maste ((location) - AQ_RX_FIRST_LOC_FL3L4) 302*493d26c5SEd Maste 303*493d26c5SEd Maste enum aq_hw_fw_mpi_state_e { 304*493d26c5SEd Maste MPI_DEINIT = 0, 305*493d26c5SEd Maste MPI_RESET = 1, 306*493d26c5SEd Maste MPI_INIT = 2, 307*493d26c5SEd Maste MPI_POWER = 4, 308*493d26c5SEd Maste }; 309*493d26c5SEd Maste 310*493d26c5SEd Maste int aq_hw_get_mac_permanent(struct aq_hw *hw, u8 *mac); 311*493d26c5SEd Maste 312*493d26c5SEd Maste int aq_hw_mac_addr_set(struct aq_hw *hw, u8 *mac_addr, u8 index); 313*493d26c5SEd Maste 314*493d26c5SEd Maste /* link speed in mbps. "0" - no link detected */ 315*493d26c5SEd Maste int aq_hw_get_link_state(struct aq_hw *hw, u32 *link_speed, struct aq_hw_fc_info *fc_neg); 316*493d26c5SEd Maste 317*493d26c5SEd Maste int aq_hw_set_link_speed(struct aq_hw *hw, u32 speed); 318*493d26c5SEd Maste 319*493d26c5SEd Maste int aq_hw_fw_downld_dwords(struct aq_hw *hw, u32 a, u32 *p, u32 cnt); 320*493d26c5SEd Maste 321*493d26c5SEd Maste int aq_hw_reset(struct aq_hw *hw); 322*493d26c5SEd Maste 323*493d26c5SEd Maste int aq_hw_mpi_create(struct aq_hw *hw); 324*493d26c5SEd Maste 325*493d26c5SEd Maste int aq_hw_mpi_read_stats(struct aq_hw *hw, struct aq_hw_fw_mbox *pmbox); 326*493d26c5SEd Maste 327*493d26c5SEd Maste int aq_hw_init(struct aq_hw *hw, u8 *mac_addr, u8 adm_irq, bool msix); 328*493d26c5SEd Maste 329*493d26c5SEd Maste int aq_hw_start(struct aq_hw *hw); 330*493d26c5SEd Maste 331*493d26c5SEd Maste int aq_hw_interrupt_moderation_set(struct aq_hw *hw); 332*493d26c5SEd Maste 333*493d26c5SEd Maste int aq_hw_get_fw_version(struct aq_hw *hw, u32 *fw_version); 334*493d26c5SEd Maste 335*493d26c5SEd Maste int aq_hw_deinit(struct aq_hw *hw); 336*493d26c5SEd Maste 337*493d26c5SEd Maste int aq_hw_ver_match(const aq_hw_fw_version* ver_expected, const aq_hw_fw_version* ver_actual); 338*493d26c5SEd Maste 339*493d26c5SEd Maste void aq_hw_set_promisc(struct aq_hw_s *self, bool l2_promisc, bool vlan_promisc, bool mc_promisc); 340*493d26c5SEd Maste 341*493d26c5SEd Maste int aq_hw_set_power(struct aq_hw *hw, unsigned int power_state); 342*493d26c5SEd Maste 343*493d26c5SEd Maste int aq_hw_err_from_flags(struct aq_hw *hw); 344*493d26c5SEd Maste 345*493d26c5SEd Maste int hw_atl_b0_hw_vlan_promisc_set(struct aq_hw_s *self, bool promisc); 346*493d26c5SEd Maste 347*493d26c5SEd Maste int hw_atl_b0_hw_vlan_set(struct aq_hw_s *self, 348*493d26c5SEd Maste struct aq_rx_filter_vlan *aq_vlans); 349*493d26c5SEd Maste 350*493d26c5SEd Maste int aq_hw_rss_hash_set(struct aq_hw_s *self, u8 rss_key[HW_ATL_RSS_HASHKEY_SIZE]); 351*493d26c5SEd Maste int aq_hw_rss_hash_get(struct aq_hw_s *self, u8 rss_key[HW_ATL_RSS_HASHKEY_SIZE]); 352*493d26c5SEd Maste int aq_hw_rss_set(struct aq_hw_s *self, u8 rss_table[HW_ATL_RSS_INDIRECTION_TABLE_MAX]); 353*493d26c5SEd Maste int aq_hw_udp_rss_enable(struct aq_hw_s *self, bool enable); 354*493d26c5SEd Maste 355*493d26c5SEd Maste #endif //_AQ_HW_H_ 356*493d26c5SEd Maste 357