1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* Atlantic Network Driver 3 * Copyright (C) 2020 Marvell International Ltd. 4 */ 5 6 #ifndef HW_ATL2_UTILS_H 7 #define HW_ATL2_UTILS_H 8 9 #include "aq_hw.h" 10 11 /* F W A P I */ 12 13 struct link_options_s { 14 u8 link_up:1; 15 u8 link_renegotiate:1; 16 u8 minimal_link_speed:1; 17 u8 internal_loopback:1; 18 u8 external_loopback:1; 19 u8 rate_10M_hd:1; 20 u8 rate_100M_hd:1; 21 u8 rate_1G_hd:1; 22 23 u8 rate_10M:1; 24 u8 rate_100M:1; 25 u8 rate_1G:1; 26 u8 rate_2P5G:1; 27 u8 rate_N2P5G:1; 28 u8 rate_5G:1; 29 u8 rate_N5G:1; 30 u8 rate_10G:1; 31 32 u8 eee_100M:1; 33 u8 eee_1G:1; 34 u8 eee_2P5G:1; 35 u8 eee_5G:1; 36 u8 eee_10G:1; 37 u8 rsvd3:3; 38 39 u8 pause_rx:1; 40 u8 pause_tx:1; 41 u8 rsvd4:1; 42 u8 downshift:1; 43 u8 downshift_retry:4; 44 }; 45 46 struct link_control_s { 47 u8 mode:4; 48 u8 disable_crc_corruption:1; 49 u8 discard_short_frames:1; 50 u8 flow_control_mode:1; 51 u8 disable_length_check:1; 52 53 u8 discard_errored_frames:1; 54 u8 control_frame_enable:1; 55 u8 enable_tx_padding:1; 56 u8 enable_crc_forwarding:1; 57 u8 enable_frame_padding_removal_rx: 1; 58 u8 promiscuous_mode: 1; 59 u8 rsvd:2; 60 61 u16 rsvd2; 62 }; 63 64 struct thermal_shutdown_s { 65 u8 enable:1; 66 u8 warning_enable:1; 67 u8 rsvd:6; 68 69 u8 shutdown_temperature; 70 u8 cold_temperature; 71 u8 warning_temperature; 72 }; 73 74 struct mac_address_s { 75 u8 mac_address[6]; 76 }; 77 78 struct mac_address_aligned_s { 79 struct mac_address_s aligned; 80 u16 rsvd; 81 }; 82 83 struct sleep_proxy_s { 84 struct wake_on_lan_s { 85 u8 wake_on_magic_packet:1; 86 u8 wake_on_pattern:1; 87 u8 wake_on_link_up:1; 88 u8 wake_on_link_down:1; 89 u8 wake_on_ping:1; 90 u8 wake_on_timer:1; 91 u8 rsvd:2; 92 93 u8 rsvd2; 94 u16 rsvd3; 95 96 u32 link_up_timeout; 97 u32 link_down_timeout; 98 u32 timer; 99 } wake_on_lan; 100 101 struct { 102 u32 mask[4]; 103 u32 crc32; 104 } wake_up_pattern[8]; 105 106 struct __packed { 107 u8 arp_responder:1; 108 u8 echo_responder:1; 109 u8 igmp_client:1; 110 u8 echo_truncate:1; 111 u8 address_guard:1; 112 u8 ignore_fragmented:1; 113 u8 rsvd:2; 114 115 u16 echo_max_len; 116 u8 rsvd2; 117 } ipv4_offload; 118 119 u32 ipv4_offload_addr[8]; 120 u32 reserved[8]; 121 122 struct __packed { 123 u8 ns_responder:1; 124 u8 echo_responder:1; 125 u8 mld_client:1; 126 u8 echo_truncate:1; 127 u8 address_guard:1; 128 u8 rsvd:3; 129 130 u16 echo_max_len; 131 u8 rsvd2; 132 } ipv6_offload; 133 134 u32 ipv6_offload_addr[16][4]; 135 136 struct { 137 u16 port[16]; 138 } tcp_port_offload; 139 140 struct { 141 u16 port[16]; 142 } udp_port_offload; 143 144 struct { 145 u32 retry_count; 146 u32 retry_interval; 147 } ka4_offload; 148 149 struct { 150 u32 timeout; 151 u16 local_port; 152 u16 remote_port; 153 u8 remote_mac_addr[6]; 154 u16 rsvd; 155 u32 rsvd2; 156 u32 rsvd3; 157 u16 rsvd4; 158 u16 win_size; 159 u32 seq_num; 160 u32 ack_num; 161 u32 local_ip; 162 u32 remote_ip; 163 } ka4_connection[16]; 164 165 struct { 166 u32 retry_count; 167 u32 retry_interval; 168 } ka6_offload; 169 170 struct { 171 u32 timeout; 172 u16 local_port; 173 u16 remote_port; 174 u8 remote_mac_addr[6]; 175 u16 rsvd; 176 u32 rsvd2; 177 u32 rsvd3; 178 u16 rsvd4; 179 u16 win_size; 180 u32 seq_num; 181 u32 ack_num; 182 u32 local_ip[4]; 183 u32 remote_ip[4]; 184 } ka6_connection[16]; 185 186 struct { 187 u32 rr_count; 188 u32 rr_buf_len; 189 u32 idx_offset; 190 u32 rr__offset; 191 } mdns_offload; 192 }; 193 194 struct pause_quanta_s { 195 u16 quanta_10M; 196 u16 threshold_10M; 197 u16 quanta_100M; 198 u16 threshold_100M; 199 u16 quanta_1G; 200 u16 threshold_1G; 201 u16 quanta_2P5G; 202 u16 threshold_2P5G; 203 u16 quanta_5G; 204 u16 threshold_5G; 205 u16 quanta_10G; 206 u16 threshold_10G; 207 }; 208 209 struct data_buffer_status_s { 210 u32 data_offset; 211 u32 data_length; 212 }; 213 214 struct device_caps_s { 215 u8 finite_flashless:1; 216 u8 cable_diag:1; 217 u8 ncsi:1; 218 u8 avb:1; 219 u8 rsvd:4; 220 221 u8 rsvd2; 222 u16 rsvd3; 223 u32 rsvd4; 224 }; 225 226 struct version_s { 227 struct bundle_version_t { 228 u8 major; 229 u8 minor; 230 u16 build; 231 } bundle; 232 struct mac_version_t { 233 u8 major; 234 u8 minor; 235 u16 build; 236 } mac; 237 struct phy_version_t { 238 u8 major; 239 u8 minor; 240 u16 build; 241 } phy; 242 u32 rsvd; 243 }; 244 245 struct link_status_s { 246 u8 link_state:4; 247 u8 link_rate:4; 248 249 u8 pause_tx:1; 250 u8 pause_rx:1; 251 u8 eee:1; 252 u8 duplex:1; 253 u8 rsvd:4; 254 255 u16 rsvd2; 256 }; 257 258 struct wol_status_s { 259 u8 wake_count; 260 u8 wake_reason; 261 262 u16 wake_up_packet_length :12; 263 u16 wake_up_pattern_number :3; 264 u16 rsvd:1; 265 266 u32 wake_up_packet[379]; 267 }; 268 269 struct mac_health_monitor_s { 270 u8 mac_ready:1; 271 u8 mac_fault:1; 272 u8 mac_flashless_finished:1; 273 u8 rsvd:5; 274 275 u8 mac_temperature; 276 u16 mac_heart_beat; 277 u16 mac_fault_code; 278 u16 rsvd2; 279 }; 280 281 struct phy_health_monitor_s { 282 u8 phy_ready:1; 283 u8 phy_fault:1; 284 u8 phy_hot_warning:1; 285 u8 rsvd:5; 286 287 u8 phy_temperature; 288 u16 phy_heart_beat; 289 u16 phy_fault_code; 290 u16 rsvd2; 291 }; 292 293 struct device_link_caps_s { 294 u8 rsvd:3; 295 u8 internal_loopback:1; 296 u8 external_loopback:1; 297 u8 rate_10M_hd:1; 298 u8 rate_100M_hd:1; 299 u8 rate_1G_hd:1; 300 301 u8 rate_10M:1; 302 u8 rate_100M:1; 303 u8 rate_1G:1; 304 u8 rate_2P5G:1; 305 u8 rate_N2P5G:1; 306 u8 rate_5G:1; 307 u8 rate_N5G:1; 308 u8 rate_10G:1; 309 310 u8 rsvd3:1; 311 u8 eee_100M:1; 312 u8 eee_1G:1; 313 u8 eee_2P5G:1; 314 u8 rsvd4:1; 315 u8 eee_5G:1; 316 u8 rsvd5:1; 317 u8 eee_10G:1; 318 319 u8 pause_rx:1; 320 u8 pause_tx:1; 321 u8 pfc:1; 322 u8 downshift:1; 323 u8 downshift_retry:4; 324 }; 325 326 struct sleep_proxy_caps_s { 327 u8 ipv4_offload:1; 328 u8 ipv6_offload:1; 329 u8 tcp_port_offload:1; 330 u8 udp_port_offload:1; 331 u8 ka4_offload:1; 332 u8 ka6_offload:1; 333 u8 mdns_offload:1; 334 u8 wake_on_ping:1; 335 336 u8 wake_on_magic_packet:1; 337 u8 wake_on_pattern:1; 338 u8 wake_on_timer:1; 339 u8 wake_on_link:1; 340 u8 wake_patterns_count:4; 341 342 u8 ipv4_count; 343 u8 ipv6_count; 344 345 u8 tcp_port_offload_count; 346 u8 udp_port_offload_count; 347 348 u8 tcp4_ka_count; 349 u8 tcp6_ka_count; 350 351 u8 igmp_offload:1; 352 u8 mld_offload:1; 353 u8 rsvd:6; 354 355 u8 rsvd2; 356 u16 rsvd3; 357 }; 358 359 struct lkp_link_caps_s { 360 u8 rsvd:5; 361 u8 rate_10M_hd:1; 362 u8 rate_100M_hd:1; 363 u8 rate_1G_hd:1; 364 365 u8 rate_10M:1; 366 u8 rate_100M:1; 367 u8 rate_1G:1; 368 u8 rate_2P5G:1; 369 u8 rate_N2P5G:1; 370 u8 rate_5G:1; 371 u8 rate_N5G:1; 372 u8 rate_10G:1; 373 374 u8 rsvd2:1; 375 u8 eee_100M:1; 376 u8 eee_1G:1; 377 u8 eee_2P5G:1; 378 u8 rsvd3:1; 379 u8 eee_5G:1; 380 u8 rsvd4:1; 381 u8 eee_10G:1; 382 383 u8 pause_rx:1; 384 u8 pause_tx:1; 385 u8 rsvd5:6; 386 }; 387 388 struct core_dump_s { 389 u32 reg0; 390 u32 reg1; 391 u32 reg2; 392 393 u32 hi; 394 u32 lo; 395 396 u32 regs[32]; 397 }; 398 399 struct trace_s { 400 u32 sync_counter; 401 u32 mem_buffer[0x1ff]; 402 }; 403 404 struct cable_diag_control_s { 405 u8 toggle :1; 406 u8 rsvd:7; 407 408 u8 wait_timeout_sec; 409 u16 rsvd2; 410 }; 411 412 struct cable_diag_lane_data_s { 413 u8 result_code; 414 u8 dist; 415 u8 far_dist; 416 u8 rsvd; 417 }; 418 419 struct cable_diag_status_s { 420 struct cable_diag_lane_data_s lane_data[4]; 421 u8 transact_id; 422 u8 status:4; 423 u8 rsvd:4; 424 u16 rsvd2; 425 }; 426 427 struct statistics_s { 428 struct { 429 u32 link_up; 430 u32 link_down; 431 } link; 432 433 struct { 434 u64 tx_unicast_octets; 435 u64 tx_multicast_octets; 436 u64 tx_broadcast_octets; 437 u64 rx_unicast_octets; 438 u64 rx_multicast_octets; 439 u64 rx_broadcast_octets; 440 441 u32 tx_unicast_frames; 442 u32 tx_multicast_frames; 443 u32 tx_broadcast_frames; 444 u32 tx_errors; 445 446 u32 rx_unicast_frames; 447 u32 rx_multicast_frames; 448 u32 rx_broadcast_frames; 449 u32 rx_dropped_frames; 450 u32 rx_error_frames; 451 452 u32 tx_good_frames; 453 u32 rx_good_frames; 454 u32 reserve_fw_gap; 455 } msm; 456 u32 main_loop_cycles; 457 u32 reserve_fw_gap; 458 }; 459 460 struct filter_caps_s { 461 u8 l2_filters_base_index:6; 462 u8 flexible_filter_mask:2; 463 u8 l2_filter_count; 464 u8 ethertype_filter_base_index; 465 u8 ethertype_filter_count; 466 467 u8 vlan_filter_base_index; 468 u8 vlan_filter_count; 469 u8 l3_ip4_filter_base_index:4; 470 u8 l3_ip4_filter_count:4; 471 u8 l3_ip6_filter_base_index:4; 472 u8 l3_ip6_filter_count:4; 473 474 u8 l4_filter_base_index:4; 475 u8 l4_filter_count:4; 476 u8 l4_flex_filter_base_index:4; 477 u8 l4_flex_filter_count:4; 478 u8 rslv_tbl_base_index; 479 u8 rslv_tbl_count; 480 }; 481 482 struct request_policy_s { 483 struct { 484 u8 all:1; 485 u8 mcast:1; 486 u8 rx_queue_tc_index:5; 487 u8 queue_or_tc:1; 488 } promisc; 489 490 struct { 491 u8 accept:1; 492 u8 rsvd:1; 493 u8 rx_queue_tc_index:5; 494 u8 queue_or_tc:1; 495 } bcast; 496 497 struct { 498 u8 accept:1; 499 u8 rsvd:1; 500 u8 rx_queue_tc_index:5; 501 u8 queue_or_tc:1; 502 } mcast; 503 504 u8 rsvd:8; 505 }; 506 507 struct fw_interface_in { 508 u32 mtu; 509 u32 rsvd1; 510 struct mac_address_aligned_s mac_address; 511 struct link_control_s link_control; 512 u32 rsvd2; 513 struct link_options_s link_options; 514 u32 rsvd3; 515 struct thermal_shutdown_s thermal_shutdown; 516 u32 rsvd4; 517 struct sleep_proxy_s sleep_proxy; 518 u32 rsvd5; 519 struct pause_quanta_s pause_quanta[8]; 520 struct cable_diag_control_s cable_diag_control; 521 u32 rsvd6; 522 struct data_buffer_status_s data_buffer_status; 523 u32 rsvd7; 524 struct request_policy_s request_policy; 525 }; 526 527 struct transaction_counter_s { 528 u16 transaction_cnt_a; 529 u16 transaction_cnt_b; 530 }; 531 532 struct management_status_s { 533 struct mac_address_s mac_address; 534 u16 vlan; 535 536 struct{ 537 u32 enable : 1; 538 u32 rsvd:31; 539 } flags; 540 541 u32 rsvd1; 542 u32 rsvd2; 543 u32 rsvd3; 544 u32 rsvd4; 545 u32 rsvd5; 546 }; 547 548 struct fw_interface_out { 549 struct transaction_counter_s transaction_id; 550 struct version_s version; 551 struct link_status_s link_status; 552 struct wol_status_s wol_status; 553 u32 rsvd; 554 u32 rsvd2; 555 struct mac_health_monitor_s mac_health_monitor; 556 u32 rsvd3; 557 u32 rsvd4; 558 struct phy_health_monitor_s phy_health_monitor; 559 u32 rsvd5; 560 u32 rsvd6; 561 struct cable_diag_status_s cable_diag_status; 562 u32 rsvd7; 563 struct device_link_caps_s device_link_caps; 564 u32 rsvd8; 565 struct sleep_proxy_caps_s sleep_proxy_caps; 566 u32 rsvd9; 567 struct lkp_link_caps_s lkp_link_caps; 568 u32 rsvd10; 569 struct core_dump_s core_dump; 570 u32 rsvd11; 571 struct statistics_s stats; 572 u32 rsvd12; 573 struct filter_caps_s filter_caps; 574 struct device_caps_s device_caps; 575 u32 rsvd13; 576 struct management_status_s management_status; 577 u32 reserve[21]; 578 struct trace_s trace; 579 }; 580 581 #define AQ_A2_FW_LINK_RATE_INVALID 0 582 #define AQ_A2_FW_LINK_RATE_10M 1 583 #define AQ_A2_FW_LINK_RATE_100M 2 584 #define AQ_A2_FW_LINK_RATE_1G 3 585 #define AQ_A2_FW_LINK_RATE_2G5 4 586 #define AQ_A2_FW_LINK_RATE_5G 5 587 #define AQ_A2_FW_LINK_RATE_10G 6 588 589 #define AQ_HOST_MODE_INVALID 0U 590 #define AQ_HOST_MODE_ACTIVE 1U 591 #define AQ_HOST_MODE_SLEEP_PROXY 2U 592 #define AQ_HOST_MODE_LOW_POWER 3U 593 #define AQ_HOST_MODE_SHUTDOWN 4U 594 595 int hw_atl2_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops); 596 597 int hw_atl2_utils_soft_reset(struct aq_hw_s *self); 598 599 u32 hw_atl2_utils_get_fw_version(struct aq_hw_s *self); 600 601 int hw_atl2_utils_get_action_resolve_table_caps(struct aq_hw_s *self, 602 u8 *base_index, u8 *count); 603 604 extern const struct aq_fw_ops aq_a2_fw_ops; 605 606 #endif /* HW_ATL2_UTILS_H */ 607