1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 21edb9ca6SSiva Reddy /* 10G controller driver for Samsung SoCs 31edb9ca6SSiva Reddy * 41edb9ca6SSiva Reddy * Copyright (C) 2013 Samsung Electronics Co., Ltd. 51edb9ca6SSiva Reddy * http://www.samsung.com 61edb9ca6SSiva Reddy * 71edb9ca6SSiva Reddy * Author: Siva Reddy Kallam <siva.kallam@samsung.com> 81edb9ca6SSiva Reddy */ 91edb9ca6SSiva Reddy #ifndef __SXGBE_DESC_H__ 101edb9ca6SSiva Reddy #define __SXGBE_DESC_H__ 111edb9ca6SSiva Reddy 121edb9ca6SSiva Reddy #define SXGBE_DESC_SIZE_BYTES 16 131edb9ca6SSiva Reddy 141edb9ca6SSiva Reddy /* forward declaration */ 151edb9ca6SSiva Reddy struct sxgbe_extra_stats; 161edb9ca6SSiva Reddy 171edb9ca6SSiva Reddy /* Transmit checksum insertion control */ 181edb9ca6SSiva Reddy enum tdes_csum_insertion { 191edb9ca6SSiva Reddy cic_disabled = 0, /* Checksum Insertion Control */ 201edb9ca6SSiva Reddy cic_only_ip = 1, /* Only IP header */ 211edb9ca6SSiva Reddy /* IP header but pseudoheader is not calculated */ 221edb9ca6SSiva Reddy cic_no_pseudoheader = 2, 231edb9ca6SSiva Reddy cic_full = 3, /* IP header and pseudoheader */ 241edb9ca6SSiva Reddy }; 251edb9ca6SSiva Reddy 261edb9ca6SSiva Reddy struct sxgbe_tx_norm_desc { 271edb9ca6SSiva Reddy u64 tdes01; /* buf1 address */ 281edb9ca6SSiva Reddy union { 291edb9ca6SSiva Reddy /* TX Read-Format Desc 2,3 */ 301edb9ca6SSiva Reddy struct { 311edb9ca6SSiva Reddy /* TDES2 */ 321edb9ca6SSiva Reddy u32 buf1_size:14; 331edb9ca6SSiva Reddy u32 vlan_tag_ctl:2; 341edb9ca6SSiva Reddy u32 buf2_size:14; 351edb9ca6SSiva Reddy u32 timestmp_enable:1; 361edb9ca6SSiva Reddy u32 int_on_com:1; 371edb9ca6SSiva Reddy /* TDES3 */ 381edb9ca6SSiva Reddy union { 393ee2b7c4SByungho An u16 tcp_payload_len; 401edb9ca6SSiva Reddy struct { 411edb9ca6SSiva Reddy u32 total_pkt_len:15; 421edb9ca6SSiva Reddy u32 reserved1:1; 433ee2b7c4SByungho An } pkt_len; 441edb9ca6SSiva Reddy } tx_pkt_len; 451edb9ca6SSiva Reddy 463ee2b7c4SByungho An u16 cksum_ctl:2; 473ee2b7c4SByungho An u16 tse_bit:1; 483ee2b7c4SByungho An u16 tcp_hdr_len:4; 493ee2b7c4SByungho An u16 sa_insert_ctl:3; 503ee2b7c4SByungho An u16 crc_pad_ctl:2; 513ee2b7c4SByungho An u16 last_desc:1; 523ee2b7c4SByungho An u16 first_desc:1; 533ee2b7c4SByungho An u16 ctxt_bit:1; 543ee2b7c4SByungho An u16 own_bit:1; 551edb9ca6SSiva Reddy } tx_rd_des23; 561edb9ca6SSiva Reddy 571edb9ca6SSiva Reddy /* tx write back Desc 2,3 */ 581edb9ca6SSiva Reddy struct { 591edb9ca6SSiva Reddy /* WB TES2 */ 601edb9ca6SSiva Reddy u32 reserved1; 611edb9ca6SSiva Reddy /* WB TES3 */ 621edb9ca6SSiva Reddy u32 reserved2:31; 631edb9ca6SSiva Reddy u32 own_bit:1; 641edb9ca6SSiva Reddy } tx_wb_des23; 651edb9ca6SSiva Reddy } tdes23; 661edb9ca6SSiva Reddy }; 671edb9ca6SSiva Reddy 681edb9ca6SSiva Reddy struct sxgbe_rx_norm_desc { 691edb9ca6SSiva Reddy union { 703ee2b7c4SByungho An u64 rdes01; /* buf1 address */ 713ee2b7c4SByungho An union { 721edb9ca6SSiva Reddy u32 out_vlan_tag:16; 731edb9ca6SSiva Reddy u32 in_vlan_tag:16; 743ee2b7c4SByungho An u32 rss_hash; 753ee2b7c4SByungho An } rx_wb_des01; 763ee2b7c4SByungho An } rdes01; 771edb9ca6SSiva Reddy 781edb9ca6SSiva Reddy union { 791edb9ca6SSiva Reddy /* RX Read format Desc 2,3 */ 801edb9ca6SSiva Reddy struct{ 811edb9ca6SSiva Reddy /* RDES2 */ 823ee2b7c4SByungho An u64 buf2_addr:62; 831edb9ca6SSiva Reddy /* RDES3 */ 841edb9ca6SSiva Reddy u32 int_on_com:1; 851edb9ca6SSiva Reddy u32 own_bit:1; 861edb9ca6SSiva Reddy } rx_rd_des23; 871edb9ca6SSiva Reddy 881edb9ca6SSiva Reddy /* RX write back */ 891edb9ca6SSiva Reddy struct{ 901edb9ca6SSiva Reddy /* WB RDES2 */ 911edb9ca6SSiva Reddy u32 hdr_len:10; 921edb9ca6SSiva Reddy u32 rdes2_reserved:2; 931edb9ca6SSiva Reddy u32 elrd_val:1; 941edb9ca6SSiva Reddy u32 iovt_sel:1; 951edb9ca6SSiva Reddy u32 res_pkt:1; 961edb9ca6SSiva Reddy u32 vlan_filter_match:1; 971edb9ca6SSiva Reddy u32 sa_filter_fail:1; 981edb9ca6SSiva Reddy u32 da_filter_fail:1; 991edb9ca6SSiva Reddy u32 hash_filter_pass:1; 1001edb9ca6SSiva Reddy u32 macaddr_filter_match:8; 1011edb9ca6SSiva Reddy u32 l3_filter_match:1; 1021edb9ca6SSiva Reddy u32 l4_filter_match:1; 1031edb9ca6SSiva Reddy u32 l34_filter_num:3; 1041edb9ca6SSiva Reddy 1051edb9ca6SSiva Reddy /* WB RDES3 */ 1061edb9ca6SSiva Reddy u32 pkt_len:14; 1071edb9ca6SSiva Reddy u32 rdes3_reserved:1; 1088f7807aeSVipul Pandya u32 err_summary:1; 1091edb9ca6SSiva Reddy u32 err_l2_type:4; 1101edb9ca6SSiva Reddy u32 layer34_pkt_type:4; 1111edb9ca6SSiva Reddy u32 no_coagulation_pkt:1; 1121edb9ca6SSiva Reddy u32 in_seq_pkt:1; 1131edb9ca6SSiva Reddy u32 rss_valid:1; 1141edb9ca6SSiva Reddy u32 context_des_avail:1; 1151edb9ca6SSiva Reddy u32 last_desc:1; 1161edb9ca6SSiva Reddy u32 first_desc:1; 1171edb9ca6SSiva Reddy u32 recv_context_desc:1; 1181edb9ca6SSiva Reddy u32 own_bit:1; 1191edb9ca6SSiva Reddy } rx_wb_des23; 1201edb9ca6SSiva Reddy } rdes23; 1211edb9ca6SSiva Reddy }; 1221edb9ca6SSiva Reddy 1231edb9ca6SSiva Reddy /* Context descriptor structure */ 1241edb9ca6SSiva Reddy struct sxgbe_tx_ctxt_desc { 1251edb9ca6SSiva Reddy u32 tstamp_lo; 1261edb9ca6SSiva Reddy u32 tstamp_hi; 1271edb9ca6SSiva Reddy u32 maxseg_size:15; 1281edb9ca6SSiva Reddy u32 reserved1:1; 1291edb9ca6SSiva Reddy u32 ivlan_tag:16; 1301edb9ca6SSiva Reddy u32 vlan_tag:16; 1311edb9ca6SSiva Reddy u32 vltag_valid:1; 1321edb9ca6SSiva Reddy u32 ivlan_tag_valid:1; 1331edb9ca6SSiva Reddy u32 ivlan_tag_ctl:2; 1341edb9ca6SSiva Reddy u32 reserved2:3; 1351edb9ca6SSiva Reddy u32 ctxt_desc_err:1; 1361edb9ca6SSiva Reddy u32 reserved3:2; 1371edb9ca6SSiva Reddy u32 ostc:1; 1381edb9ca6SSiva Reddy u32 tcmssv:1; 1391edb9ca6SSiva Reddy u32 reserved4:2; 1401edb9ca6SSiva Reddy u32 ctxt_bit:1; 1411edb9ca6SSiva Reddy u32 own_bit:1; 1421edb9ca6SSiva Reddy }; 1431edb9ca6SSiva Reddy 1441edb9ca6SSiva Reddy struct sxgbe_rx_ctxt_desc { 1451edb9ca6SSiva Reddy u32 tstamp_lo; 1461edb9ca6SSiva Reddy u32 tstamp_hi; 1471edb9ca6SSiva Reddy u32 reserved1; 1481edb9ca6SSiva Reddy u32 ptp_msgtype:4; 1491edb9ca6SSiva Reddy u32 tstamp_available:1; 1501edb9ca6SSiva Reddy u32 ptp_rsp_err:1; 1511edb9ca6SSiva Reddy u32 tstamp_dropped:1; 1521edb9ca6SSiva Reddy u32 reserved2:23; 1531edb9ca6SSiva Reddy u32 rx_ctxt_desc:1; 1541edb9ca6SSiva Reddy u32 own_bit:1; 1551edb9ca6SSiva Reddy }; 1561edb9ca6SSiva Reddy 1571edb9ca6SSiva Reddy struct sxgbe_desc_ops { 1581edb9ca6SSiva Reddy /* DMA TX descriptor ring initialization */ 1591edb9ca6SSiva Reddy void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p); 1601edb9ca6SSiva Reddy 1611edb9ca6SSiva Reddy /* Invoked by the xmit function to prepare the tx descriptor */ 1621edb9ca6SSiva Reddy void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse, 1631051125dSVipul Pandya u32 total_hdr_len, u32 tcp_hdr_len, 1641edb9ca6SSiva Reddy u32 tcp_payload_len); 1651edb9ca6SSiva Reddy 1661edb9ca6SSiva Reddy /* Assign buffer lengths for descriptor */ 1671edb9ca6SSiva Reddy void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8 is_fd, 1681edb9ca6SSiva Reddy int buf1_len, int pkt_len, int cksum); 1691edb9ca6SSiva Reddy 1701edb9ca6SSiva Reddy /* Set VLAN control information */ 1711edb9ca6SSiva Reddy void (*tx_vlanctl_desc)(struct sxgbe_tx_norm_desc *p, int vlan_ctl); 1721edb9ca6SSiva Reddy 1731edb9ca6SSiva Reddy /* Set the owner of the descriptor */ 1741edb9ca6SSiva Reddy void (*set_tx_owner)(struct sxgbe_tx_norm_desc *p); 1751edb9ca6SSiva Reddy 1761edb9ca6SSiva Reddy /* Get the owner of the descriptor */ 1771edb9ca6SSiva Reddy int (*get_tx_owner)(struct sxgbe_tx_norm_desc *p); 1781edb9ca6SSiva Reddy 1791edb9ca6SSiva Reddy /* Invoked by the xmit function to close the tx descriptor */ 1801edb9ca6SSiva Reddy void (*close_tx_desc)(struct sxgbe_tx_norm_desc *p); 1811edb9ca6SSiva Reddy 1821edb9ca6SSiva Reddy /* Clean the tx descriptor as soon as the tx irq is received */ 1831edb9ca6SSiva Reddy void (*release_tx_desc)(struct sxgbe_tx_norm_desc *p); 1841edb9ca6SSiva Reddy 1851edb9ca6SSiva Reddy /* Clear interrupt on tx frame completion. When this bit is 1861edb9ca6SSiva Reddy * set an interrupt happens as soon as the frame is transmitted 1871edb9ca6SSiva Reddy */ 1881edb9ca6SSiva Reddy void (*clear_tx_ic)(struct sxgbe_tx_norm_desc *p); 1891edb9ca6SSiva Reddy 1901edb9ca6SSiva Reddy /* Last tx segment reports the transmit status */ 1911edb9ca6SSiva Reddy int (*get_tx_ls)(struct sxgbe_tx_norm_desc *p); 1921edb9ca6SSiva Reddy 1931edb9ca6SSiva Reddy /* Get the buffer size from the descriptor */ 1941edb9ca6SSiva Reddy int (*get_tx_len)(struct sxgbe_tx_norm_desc *p); 1951edb9ca6SSiva Reddy 1961edb9ca6SSiva Reddy /* Set tx timestamp enable bit */ 1971edb9ca6SSiva Reddy void (*tx_enable_tstamp)(struct sxgbe_tx_norm_desc *p); 1981edb9ca6SSiva Reddy 1991edb9ca6SSiva Reddy /* get tx timestamp status */ 2001edb9ca6SSiva Reddy int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p); 2011edb9ca6SSiva Reddy 2021edb9ca6SSiva Reddy /* TX Context Descripto Specific */ 2031edb9ca6SSiva Reddy void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p); 2041edb9ca6SSiva Reddy 2051edb9ca6SSiva Reddy /* Set the owner of the TX context descriptor */ 2061edb9ca6SSiva Reddy void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p); 2071edb9ca6SSiva Reddy 2081edb9ca6SSiva Reddy /* Get the owner of the TX context descriptor */ 2091edb9ca6SSiva Reddy int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p); 2101edb9ca6SSiva Reddy 2111edb9ca6SSiva Reddy /* Set TX mss */ 2121051125dSVipul Pandya void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss); 2131edb9ca6SSiva Reddy 2141edb9ca6SSiva Reddy /* Set TX mss */ 2151edb9ca6SSiva Reddy int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p); 2161edb9ca6SSiva Reddy 2171edb9ca6SSiva Reddy /* Set TX tcmssv */ 2181edb9ca6SSiva Reddy void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p); 2191edb9ca6SSiva Reddy 2201edb9ca6SSiva Reddy /* Reset TX ostc */ 2211edb9ca6SSiva Reddy void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p); 2221edb9ca6SSiva Reddy 2231edb9ca6SSiva Reddy /* Set IVLAN information */ 2241edb9ca6SSiva Reddy void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p, 2251edb9ca6SSiva Reddy int is_ivlanvalid, int ivlan_tag, 2261edb9ca6SSiva Reddy int ivlan_ctl); 2271edb9ca6SSiva Reddy 2281edb9ca6SSiva Reddy /* Return IVLAN Tag */ 2291edb9ca6SSiva Reddy int (*tx_ctxt_desc_get_ivlantag)(struct sxgbe_tx_ctxt_desc *p); 2301edb9ca6SSiva Reddy 2311edb9ca6SSiva Reddy /* Set VLAN Tag */ 2321edb9ca6SSiva Reddy void (*tx_ctxt_desc_set_vlantag)(struct sxgbe_tx_ctxt_desc *p, 2331edb9ca6SSiva Reddy int is_vlanvalid, int vlan_tag); 2341edb9ca6SSiva Reddy 2351edb9ca6SSiva Reddy /* Return VLAN Tag */ 2361edb9ca6SSiva Reddy int (*tx_ctxt_desc_get_vlantag)(struct sxgbe_tx_ctxt_desc *p); 2371edb9ca6SSiva Reddy 2381edb9ca6SSiva Reddy /* Set Time stamp */ 2391edb9ca6SSiva Reddy void (*tx_ctxt_set_tstamp)(struct sxgbe_tx_ctxt_desc *p, 2401edb9ca6SSiva Reddy u8 ostc_enable, u64 tstamp); 2411edb9ca6SSiva Reddy 2421edb9ca6SSiva Reddy /* Close TX context descriptor */ 2431edb9ca6SSiva Reddy void (*close_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p); 2441edb9ca6SSiva Reddy 2451edb9ca6SSiva Reddy /* WB status of context descriptor */ 2461edb9ca6SSiva Reddy int (*get_tx_ctxt_cde)(struct sxgbe_tx_ctxt_desc *p); 2471edb9ca6SSiva Reddy 2481edb9ca6SSiva Reddy /* DMA RX descriptor ring initialization */ 2491edb9ca6SSiva Reddy void (*init_rx_desc)(struct sxgbe_rx_norm_desc *p, int disable_rx_ic, 2501edb9ca6SSiva Reddy int mode, int end); 2511edb9ca6SSiva Reddy 2521edb9ca6SSiva Reddy /* Get own bit */ 2531edb9ca6SSiva Reddy int (*get_rx_owner)(struct sxgbe_rx_norm_desc *p); 2541edb9ca6SSiva Reddy 2551edb9ca6SSiva Reddy /* Set own bit */ 2561edb9ca6SSiva Reddy void (*set_rx_owner)(struct sxgbe_rx_norm_desc *p); 2571edb9ca6SSiva Reddy 2583dc638d1SByungho An /* Set Interrupt on completion bit */ 2593dc638d1SByungho An void (*set_rx_int_on_com)(struct sxgbe_rx_norm_desc *p); 2603dc638d1SByungho An 2611edb9ca6SSiva Reddy /* Get the receive frame size */ 2621edb9ca6SSiva Reddy int (*get_rx_frame_len)(struct sxgbe_rx_norm_desc *p); 2631edb9ca6SSiva Reddy 2641edb9ca6SSiva Reddy /* Return first Descriptor status */ 2651edb9ca6SSiva Reddy int (*get_rx_fd_status)(struct sxgbe_rx_norm_desc *p); 2661edb9ca6SSiva Reddy 2671edb9ca6SSiva Reddy /* Return first Descriptor status */ 2681edb9ca6SSiva Reddy int (*get_rx_ld_status)(struct sxgbe_rx_norm_desc *p); 2691edb9ca6SSiva Reddy 2701edb9ca6SSiva Reddy /* Return the reception status looking at the RDES1 */ 2711edb9ca6SSiva Reddy int (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p, 2721edb9ca6SSiva Reddy struct sxgbe_extra_stats *x, int *checksum); 2731edb9ca6SSiva Reddy 2741edb9ca6SSiva Reddy /* Get own bit */ 2751edb9ca6SSiva Reddy int (*get_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p); 2761edb9ca6SSiva Reddy 2771edb9ca6SSiva Reddy /* Set own bit */ 2781edb9ca6SSiva Reddy void (*set_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p); 2791edb9ca6SSiva Reddy 2801edb9ca6SSiva Reddy /* Return the reception status looking at Context control information */ 2811edb9ca6SSiva Reddy void (*rx_ctxt_wbstatus)(struct sxgbe_rx_ctxt_desc *p, 2821edb9ca6SSiva Reddy struct sxgbe_extra_stats *x); 2831edb9ca6SSiva Reddy 2841edb9ca6SSiva Reddy /* Get rx timestamp status */ 2851edb9ca6SSiva Reddy int (*get_rx_ctxt_tstamp_status)(struct sxgbe_rx_ctxt_desc *p); 2861edb9ca6SSiva Reddy 2871edb9ca6SSiva Reddy /* Get timestamp value for rx, need to check this */ 2881edb9ca6SSiva Reddy u64 (*get_timestamp)(struct sxgbe_rx_ctxt_desc *p); 2891edb9ca6SSiva Reddy }; 2901edb9ca6SSiva Reddy 2911edb9ca6SSiva Reddy const struct sxgbe_desc_ops *sxgbe_get_desc_ops(void); 2921edb9ca6SSiva Reddy 2931edb9ca6SSiva Reddy #endif /* __SXGBE_DESC_H__ */ 294