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 drv_iface_ver:4; 243 u32 rsvd:28; 244 }; 245 246 struct link_status_s { 247 u8 link_state:4; 248 u8 link_rate:4; 249 250 u8 pause_tx:1; 251 u8 pause_rx:1; 252 u8 eee:1; 253 u8 duplex:1; 254 u8 rsvd:4; 255 256 u16 rsvd2; 257 }; 258 259 struct wol_status_s { 260 u8 wake_count; 261 u8 wake_reason; 262 263 u16 wake_up_packet_length :12; 264 u16 wake_up_pattern_number :3; 265 u16 rsvd:1; 266 267 u32 wake_up_packet[379]; 268 }; 269 270 struct mac_health_monitor_s { 271 u8 mac_ready:1; 272 u8 mac_fault:1; 273 u8 mac_flashless_finished:1; 274 u8 rsvd:5; 275 276 u8 mac_temperature; 277 u16 mac_heart_beat; 278 u16 mac_fault_code; 279 u16 rsvd2; 280 }; 281 282 struct phy_health_monitor_s { 283 u8 phy_ready:1; 284 u8 phy_fault:1; 285 u8 phy_hot_warning:1; 286 u8 rsvd:5; 287 288 u8 phy_temperature; 289 u16 phy_heart_beat; 290 u16 phy_fault_code; 291 u16 rsvd2; 292 }; 293 294 struct device_link_caps_s { 295 u8 rsvd:3; 296 u8 internal_loopback:1; 297 u8 external_loopback:1; 298 u8 rate_10M_hd:1; 299 u8 rate_100M_hd:1; 300 u8 rate_1G_hd:1; 301 302 u8 rate_10M:1; 303 u8 rate_100M:1; 304 u8 rate_1G:1; 305 u8 rate_2P5G:1; 306 u8 rate_N2P5G:1; 307 u8 rate_5G:1; 308 u8 rate_N5G:1; 309 u8 rate_10G:1; 310 311 u8 rsvd3:1; 312 u8 eee_100M:1; 313 u8 eee_1G:1; 314 u8 eee_2P5G:1; 315 u8 rsvd4:1; 316 u8 eee_5G:1; 317 u8 rsvd5:1; 318 u8 eee_10G:1; 319 320 u8 pause_rx:1; 321 u8 pause_tx:1; 322 u8 pfc:1; 323 u8 downshift:1; 324 u8 downshift_retry:4; 325 }; 326 327 struct sleep_proxy_caps_s { 328 u8 ipv4_offload:1; 329 u8 ipv6_offload:1; 330 u8 tcp_port_offload:1; 331 u8 udp_port_offload:1; 332 u8 ka4_offload:1; 333 u8 ka6_offload:1; 334 u8 mdns_offload:1; 335 u8 wake_on_ping:1; 336 337 u8 wake_on_magic_packet:1; 338 u8 wake_on_pattern:1; 339 u8 wake_on_timer:1; 340 u8 wake_on_link:1; 341 u8 wake_patterns_count:4; 342 343 u8 ipv4_count; 344 u8 ipv6_count; 345 346 u8 tcp_port_offload_count; 347 u8 udp_port_offload_count; 348 349 u8 tcp4_ka_count; 350 u8 tcp6_ka_count; 351 352 u8 igmp_offload:1; 353 u8 mld_offload:1; 354 u8 rsvd:6; 355 356 u8 rsvd2; 357 u16 rsvd3; 358 }; 359 360 struct lkp_link_caps_s { 361 u8 rsvd:5; 362 u8 rate_10M_hd:1; 363 u8 rate_100M_hd:1; 364 u8 rate_1G_hd:1; 365 366 u8 rate_10M:1; 367 u8 rate_100M:1; 368 u8 rate_1G:1; 369 u8 rate_2P5G:1; 370 u8 rate_N2P5G:1; 371 u8 rate_5G:1; 372 u8 rate_N5G:1; 373 u8 rate_10G:1; 374 375 u8 rsvd2:1; 376 u8 eee_100M:1; 377 u8 eee_1G:1; 378 u8 eee_2P5G:1; 379 u8 rsvd3:1; 380 u8 eee_5G:1; 381 u8 rsvd4:1; 382 u8 eee_10G:1; 383 384 u8 pause_rx:1; 385 u8 pause_tx:1; 386 u8 rsvd5:6; 387 }; 388 389 struct core_dump_s { 390 u32 reg0; 391 u32 reg1; 392 u32 reg2; 393 394 u32 hi; 395 u32 lo; 396 397 u32 regs[32]; 398 }; 399 400 struct trace_s { 401 u32 sync_counter; 402 u32 mem_buffer[0x1ff]; 403 }; 404 405 struct cable_diag_control_s { 406 u8 toggle :1; 407 u8 rsvd:7; 408 409 u8 wait_timeout_sec; 410 u16 rsvd2; 411 }; 412 413 struct cable_diag_lane_data_s { 414 u8 result_code; 415 u8 dist; 416 u8 far_dist; 417 u8 rsvd; 418 }; 419 420 struct cable_diag_status_s { 421 struct cable_diag_lane_data_s lane_data[4]; 422 u8 transact_id; 423 u8 status:4; 424 u8 rsvd:4; 425 u16 rsvd2; 426 }; 427 428 struct statistics_a0_s { 429 struct { 430 u32 link_up; 431 u32 link_down; 432 } link; 433 434 struct { 435 u64 tx_unicast_octets; 436 u64 tx_multicast_octets; 437 u64 tx_broadcast_octets; 438 u64 rx_unicast_octets; 439 u64 rx_multicast_octets; 440 u64 rx_broadcast_octets; 441 442 u32 tx_unicast_frames; 443 u32 tx_multicast_frames; 444 u32 tx_broadcast_frames; 445 u32 tx_errors; 446 447 u32 rx_unicast_frames; 448 u32 rx_multicast_frames; 449 u32 rx_broadcast_frames; 450 u32 rx_dropped_frames; 451 u32 rx_error_frames; 452 453 u32 tx_good_frames; 454 u32 rx_good_frames; 455 u32 reserve_fw_gap; 456 } msm; 457 u32 main_loop_cycles; 458 u32 reserve_fw_gap; 459 }; 460 461 struct __packed statistics_b0_s { 462 u64 rx_good_octets; 463 u64 rx_pause_frames; 464 u64 rx_good_frames; 465 u64 rx_errors; 466 u64 rx_unicast_frames; 467 u64 rx_multicast_frames; 468 u64 rx_broadcast_frames; 469 470 u64 tx_good_octets; 471 u64 tx_pause_frames; 472 u64 tx_good_frames; 473 u64 tx_errors; 474 u64 tx_unicast_frames; 475 u64 tx_multicast_frames; 476 u64 tx_broadcast_frames; 477 478 u32 main_loop_cycles; 479 }; 480 481 struct __packed statistics_s { 482 union __packed { 483 struct statistics_a0_s a0; 484 struct statistics_b0_s b0; 485 }; 486 }; 487 488 struct filter_caps_s { 489 u8 l2_filters_base_index:6; 490 u8 flexible_filter_mask:2; 491 u8 l2_filter_count; 492 u8 ethertype_filter_base_index; 493 u8 ethertype_filter_count; 494 495 u8 vlan_filter_base_index; 496 u8 vlan_filter_count; 497 u8 l3_ip4_filter_base_index:4; 498 u8 l3_ip4_filter_count:4; 499 u8 l3_ip6_filter_base_index:4; 500 u8 l3_ip6_filter_count:4; 501 502 u8 l4_filter_base_index:4; 503 u8 l4_filter_count:4; 504 u8 l4_flex_filter_base_index:4; 505 u8 l4_flex_filter_count:4; 506 u8 rslv_tbl_base_index; 507 u8 rslv_tbl_count; 508 }; 509 510 struct request_policy_s { 511 struct { 512 u8 all:1; 513 u8 mcast:1; 514 u8 rx_queue_tc_index:5; 515 u8 queue_or_tc:1; 516 } promisc; 517 518 struct { 519 u8 accept:1; 520 u8 rsvd:1; 521 u8 rx_queue_tc_index:5; 522 u8 queue_or_tc:1; 523 } bcast; 524 525 struct { 526 u8 accept:1; 527 u8 rsvd:1; 528 u8 rx_queue_tc_index:5; 529 u8 queue_or_tc:1; 530 } mcast; 531 532 u8 rsvd:8; 533 }; 534 535 struct fw_interface_in { 536 u32 mtu; 537 u32 rsvd1; 538 struct mac_address_aligned_s mac_address; 539 struct link_control_s link_control; 540 u32 rsvd2; 541 struct link_options_s link_options; 542 u32 rsvd3; 543 struct thermal_shutdown_s thermal_shutdown; 544 u32 rsvd4; 545 struct sleep_proxy_s sleep_proxy; 546 u32 rsvd5; 547 struct pause_quanta_s pause_quanta[8]; 548 struct cable_diag_control_s cable_diag_control; 549 u32 rsvd6; 550 struct data_buffer_status_s data_buffer_status; 551 u32 rsvd7; 552 struct request_policy_s request_policy; 553 }; 554 555 struct transaction_counter_s { 556 u16 transaction_cnt_a; 557 u16 transaction_cnt_b; 558 }; 559 560 struct management_status_s { 561 struct mac_address_s mac_address; 562 u16 vlan; 563 564 struct{ 565 u32 enable : 1; 566 u32 rsvd:31; 567 } flags; 568 569 u32 rsvd1; 570 u32 rsvd2; 571 u32 rsvd3; 572 u32 rsvd4; 573 u32 rsvd5; 574 }; 575 576 struct __packed fw_interface_out { 577 struct transaction_counter_s transaction_id; 578 struct version_s version; 579 struct link_status_s link_status; 580 struct wol_status_s wol_status; 581 u32 rsvd; 582 u32 rsvd2; 583 struct mac_health_monitor_s mac_health_monitor; 584 u32 rsvd3; 585 u32 rsvd4; 586 struct phy_health_monitor_s phy_health_monitor; 587 u32 rsvd5; 588 u32 rsvd6; 589 struct cable_diag_status_s cable_diag_status; 590 u32 rsvd7; 591 struct device_link_caps_s device_link_caps; 592 u32 rsvd8; 593 struct sleep_proxy_caps_s sleep_proxy_caps; 594 u32 rsvd9; 595 struct lkp_link_caps_s lkp_link_caps; 596 u32 rsvd10; 597 struct core_dump_s core_dump; 598 u32 rsvd11; 599 struct statistics_s stats; 600 struct filter_caps_s filter_caps; 601 struct device_caps_s device_caps; 602 u32 rsvd13; 603 struct management_status_s management_status; 604 u32 reserve[21]; 605 struct trace_s trace; 606 }; 607 608 #define AQ_A2_FW_LINK_RATE_INVALID 0 609 #define AQ_A2_FW_LINK_RATE_10M 1 610 #define AQ_A2_FW_LINK_RATE_100M 2 611 #define AQ_A2_FW_LINK_RATE_1G 3 612 #define AQ_A2_FW_LINK_RATE_2G5 4 613 #define AQ_A2_FW_LINK_RATE_5G 5 614 #define AQ_A2_FW_LINK_RATE_10G 6 615 616 #define AQ_HOST_MODE_INVALID 0U 617 #define AQ_HOST_MODE_ACTIVE 1U 618 #define AQ_HOST_MODE_SLEEP_PROXY 2U 619 #define AQ_HOST_MODE_LOW_POWER 3U 620 #define AQ_HOST_MODE_SHUTDOWN 4U 621 622 #define AQ_A2_FW_INTERFACE_A0 0 623 #define AQ_A2_FW_INTERFACE_B0 1 624 625 int hw_atl2_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops); 626 627 int hw_atl2_utils_soft_reset(struct aq_hw_s *self); 628 629 u32 hw_atl2_utils_get_fw_version(struct aq_hw_s *self); 630 631 int hw_atl2_utils_get_action_resolve_table_caps(struct aq_hw_s *self, 632 u8 *base_index, u8 *count); 633 634 extern const struct aq_fw_ops aq_a2_fw_ops; 635 636 #endif /* HW_ATL2_UTILS_H */ 637