2 * aQuantia Corporation Network Driver
3 * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
10 /* File hw_atl_utils.h: Declaration of common functions for Atlantic hardware
14 #ifndef HW_ATL_UTILS_H
15 #define HW_ATL_UTILS_H
17 #define HW_ATL_FLUSH() { (void)aq_hw_read_reg(self, 0x10); }
19 /* Hardware tx descriptor */
20 struct __packed hw_atl_txd_s {
23 u32 ctl2; /* 63..46 - payload length, 45 - ctx enable, 44 - ctx index */
26 /* Hardware tx context descriptor */
27 struct __packed hw_atl_txc_s {
34 /* Hardware rx descriptor */
35 struct __packed hw_atl_rxd_s {
40 /* Hardware rx descriptor writeback */
41 struct __packed hw_atl_rxd_wb_s {
50 struct __packed hw_atl_stats_s {
68 union __packed ip_addr {
78 struct __packed hw_atl_utils_fw_rpc {
105 u32 next_wol_pattern_offset;
110 u8 ipv4_source_address[4];
111 u8 ipv4_dest_address[4];
112 u16 tcp_source_port_number;
113 u16 tcp_dest_port_number;
114 } ipv4_tcp_syn_parameters;
118 u8 ipv6_source_address[16];
119 u8 ipv6_dest_address[16];
120 u16 tcp_source_port_number;
121 u16 tcp_dest_port_number;
122 } ipv6_tcp_syn_parameters;
126 } eapol_request_id_message_parameters;
134 } wol_bit_map_pattern;
137 u8 mac_addr[ETH_ALEN];
138 } wol_magic_packet_patter;
147 u32 reason_arp_v4_pkt : 1;
148 u32 reason_ipv4_ping_pkt : 1;
149 u32 reason_ipv6_ns_pkt : 1;
150 u32 reason_ipv6_ping_pkt : 1;
151 u32 reason_link_up : 1;
152 u32 reason_link_down : 1;
153 u32 reason_maximum : 1;
168 struct __packed hw_atl_utils_mbox_header {
174 struct __packed hw_aq_info {
180 u32 cable_diag_data[4];
186 struct __packed hw_atl_utils_mbox {
187 struct hw_atl_utils_mbox_header header;
188 struct hw_atl_stats_s stats;
189 struct hw_aq_info info;
193 typedef u32 fw_offset_t;
195 struct __packed offload_ip_info {
196 u8 v4_local_addr_count;
198 u8 v6_local_addr_count;
201 fw_offset_t v4_prefix;
203 fw_offset_t v6_prefix;
206 struct __packed offload_port_info {
209 fw_offset_t udp_port;
210 fw_offset_t tcp_port;
213 struct __packed offload_ka_info {
222 struct __packed offload_rr_info {
229 struct __packed offload_info {
232 u8 mac_addr[ETH_ALEN];
236 struct offload_ip_info ips;
237 struct offload_port_info ports;
238 struct offload_ka_info kas;
239 struct offload_rr_info rrs;
243 enum hw_atl_rx_action_with_traffic {
248 struct aq_rx_filter_vlan {
255 struct aq_rx_filter_l2 {
263 struct aq_rx_filter_l3l4 {
273 enum hw_atl_rx_protocol_value_l3l4 {
280 enum hw_atl_rx_ctrl_registers_l3l4 {
281 HW_ATL_RX_ENABLE_MNGMNT_QUEUE_L3L4 = BIT(22),
282 HW_ATL_RX_ENABLE_QUEUE_L3L4 = BIT(23),
283 HW_ATL_RX_ENABLE_ARP_FLTR_L3 = BIT(24),
284 HW_ATL_RX_ENABLE_CMP_PROT_L4 = BIT(25),
285 HW_ATL_RX_ENABLE_CMP_DEST_PORT_L4 = BIT(26),
286 HW_ATL_RX_ENABLE_CMP_SRC_PORT_L4 = BIT(27),
287 HW_ATL_RX_ENABLE_CMP_DEST_ADDR_L3 = BIT(28),
288 HW_ATL_RX_ENABLE_CMP_SRC_ADDR_L3 = BIT(29),
289 HW_ATL_RX_ENABLE_L3_IPV6 = BIT(30),
290 HW_ATL_RX_ENABLE_FLTR_L3L4 = BIT(31)
293 #define HW_ATL_RX_QUEUE_FL3L4_SHIFT 8U
294 #define HW_ATL_RX_ACTION_FL3F4_SHIFT 16U
296 #define HW_ATL_RX_CNT_REG_ADDR_IPV6 4U
298 #define HW_ATL_GET_REG_LOCATION_FL3L4(location) \
299 ((location) - AQ_RX_FIRST_LOC_FL3L4)
301 #define HAL_ATLANTIC_UTILS_CHIP_MIPS 0x00000001U
302 #define HAL_ATLANTIC_UTILS_CHIP_TPO2 0x00000002U
303 #define HAL_ATLANTIC_UTILS_CHIP_RPF2 0x00000004U
304 #define HAL_ATLANTIC_UTILS_CHIP_MPI_AQ 0x00000010U
305 #define HAL_ATLANTIC_UTILS_CHIP_REVISION_A0 0x01000000U
306 #define HAL_ATLANTIC_UTILS_CHIP_REVISION_B0 0x02000000U
307 #define HAL_ATLANTIC_UTILS_CHIP_REVISION_B1 0x04000000U
309 #define IS_CHIP_FEATURE(_F_) (HAL_ATLANTIC_UTILS_CHIP_##_F_ & \
312 enum hal_atl_utils_fw_state_e {
319 #define HAL_ATLANTIC_RATE_10G BIT(0)
320 #define HAL_ATLANTIC_RATE_5G BIT(1)
321 #define HAL_ATLANTIC_RATE_5GSR BIT(2)
322 #define HAL_ATLANTIC_RATE_2GS BIT(3)
323 #define HAL_ATLANTIC_RATE_1G BIT(4)
324 #define HAL_ATLANTIC_RATE_100M BIT(5)
325 #define HAL_ATLANTIC_RATE_INVALID BIT(6)
327 #define HAL_ATLANTIC_UTILS_FW_MSG_PING 0x1U
328 #define HAL_ATLANTIC_UTILS_FW_MSG_ARP 0x2U
329 #define HAL_ATLANTIC_UTILS_FW_MSG_INJECT 0x3U
330 #define HAL_ATLANTIC_UTILS_FW_MSG_WOL_ADD 0x4U
331 #define HAL_ATLANTIC_UTILS_FW_MSG_WOL_PRIOR 0x10000000U
332 #define HAL_ATLANTIC_UTILS_FW_MSG_WOL_PATTERN 0x1U
333 #define HAL_ATLANTIC_UTILS_FW_MSG_WOL_MAG_PKT 0x2U
334 #define HAL_ATLANTIC_UTILS_FW_MSG_WOL_DEL 0x5U
335 #define HAL_ATLANTIC_UTILS_FW_MSG_ENABLE_WAKEUP 0x6U
336 #define HAL_ATLANTIC_UTILS_FW_MSG_MSM_PFC 0x7U
337 #define HAL_ATLANTIC_UTILS_FW_MSG_PROVISIONING 0x8U
338 #define HAL_ATLANTIC_UTILS_FW_MSG_OFFLOAD_ADD 0x9U
339 #define HAL_ATLANTIC_UTILS_FW_MSG_OFFLOAD_DEL 0xAU
340 #define HAL_ATLANTIC_UTILS_FW_MSG_CABLE_DIAG 0xDU
342 enum hw_atl_fw2x_rate {
343 FW2X_RATE_100M = 0x20,
344 FW2X_RATE_1G = 0x100,
345 FW2X_RATE_2G5 = 0x200,
346 FW2X_RATE_5G = 0x400,
347 FW2X_RATE_10G = 0x800,
350 enum hw_atl_fw2x_caps_lo {
351 CAPS_LO_10BASET_HD = 0x00,
353 CAPS_LO_100BASETX_HD,
354 CAPS_LO_100BASET4_HD,
355 CAPS_LO_100BASET2_HD,
356 CAPS_LO_100BASETX_FD,
357 CAPS_LO_100BASET2_FD,
358 CAPS_LO_1000BASET_HD,
359 CAPS_LO_1000BASET_FD,
360 CAPS_LO_2P5GBASET_FD,
365 enum hw_atl_fw2x_caps_hi {
366 CAPS_HI_RESERVED1 = 0x00,
370 CAPS_HI_ASYMMETRIC_PAUSE,
371 CAPS_HI_100BASETX_EEE,
374 CAPS_HI_1000BASET_FD_EEE,
375 CAPS_HI_2P5GBASET_FD_EEE,
376 CAPS_HI_5GBASET_FD_EEE,
377 CAPS_HI_10GBASET_FD_EEE,
387 CAPS_HI_MEDIA_DETECT,
392 CAPS_HI_EXT_LOOPBACK,
393 CAPS_HI_INT_LOOPBACK,
397 CAPS_HI_TRANSACTION_ID,
400 enum hw_atl_fw2x_ctrl {
401 CTRL_RESERVED1 = 0x00,
405 CTRL_ASYMMETRIC_PAUSE,
410 CTRL_2P5GBASET_FD_EEE,
412 CTRL_10GBASET_FD_EEE,
413 CTRL_THERMAL_SHUTDOWN,
415 CTRL_EEE_AUTO_DISABLE,
432 CTRL_FORCE_RECONNECT,
438 struct aq_hw_link_status_s;
440 int hw_atl_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops);
442 int hw_atl_utils_soft_reset(struct aq_hw_s *self);
444 void hw_atl_utils_hw_chip_features_init(struct aq_hw_s *self, u32 *p);
446 int hw_atl_utils_mpi_read_mbox(struct aq_hw_s *self,
447 struct hw_atl_utils_mbox_header *pmbox);
449 void hw_atl_utils_mpi_read_stats(struct aq_hw_s *self,
450 struct hw_atl_utils_mbox *pmbox);
452 void hw_atl_utils_mpi_set(struct aq_hw_s *self,
453 enum hal_atl_utils_fw_state_e state,
456 int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self);
458 int hw_atl_utils_get_mac_permanent(struct aq_hw_s *self,
461 unsigned int hw_atl_utils_mbps_2_speed_index(unsigned int mbps);
463 int hw_atl_utils_hw_get_regs(struct aq_hw_s *self,
464 const struct aq_hw_caps_s *aq_hw_caps,
467 int hw_atl_utils_hw_set_power(struct aq_hw_s *self,
468 unsigned int power_state);
470 int hw_atl_utils_hw_deinit(struct aq_hw_s *self);
472 int hw_atl_utils_get_fw_version(struct aq_hw_s *self, u32 *fw_version);
474 int hw_atl_utils_update_stats(struct aq_hw_s *self);
476 struct aq_stats_s *hw_atl_utils_get_hw_stats(struct aq_hw_s *self);
478 int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a,
481 int hw_atl_utils_fw_set_wol(struct aq_hw_s *self, bool wol_enabled, u8 *mac);
483 int hw_atl_utils_fw_rpc_call(struct aq_hw_s *self, unsigned int rpc_size);
485 int hw_atl_utils_fw_rpc_wait(struct aq_hw_s *self,
486 struct hw_atl_utils_fw_rpc **rpc);
488 extern const struct aq_fw_ops aq_fw_1x_ops;
489 extern const struct aq_fw_ops aq_fw_2x_ops;
491 #endif /* HW_ATL_UTILS_H */