1de6cc651SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 29aa32835SJeff Kirsher /* 33396c782SPaul Gortmaker * linux/drivers/net/ethernet/ibm/ehea/ehea.h 49aa32835SJeff Kirsher * 59aa32835SJeff Kirsher * eHEA ethernet device driver for IBM eServer System p 69aa32835SJeff Kirsher * 79aa32835SJeff Kirsher * (C) Copyright IBM Corp. 2006 89aa32835SJeff Kirsher * 99aa32835SJeff Kirsher * Authors: 109aa32835SJeff Kirsher * Christoph Raisch <raisch@de.ibm.com> 119aa32835SJeff Kirsher * Jan-Bernd Themann <themann@de.ibm.com> 129aa32835SJeff Kirsher * Thomas Klein <tklein@de.ibm.com> 139aa32835SJeff Kirsher */ 149aa32835SJeff Kirsher 159aa32835SJeff Kirsher #ifndef __EHEA_H__ 169aa32835SJeff Kirsher #define __EHEA_H__ 179aa32835SJeff Kirsher 189aa32835SJeff Kirsher #include <linux/module.h> 199aa32835SJeff Kirsher #include <linux/ethtool.h> 209aa32835SJeff Kirsher #include <linux/vmalloc.h> 219aa32835SJeff Kirsher #include <linux/if_vlan.h> 22*6bff3ffcSChristophe Leroy #include <linux/platform_device.h> 239aa32835SJeff Kirsher 249aa32835SJeff Kirsher #include <asm/ibmebus.h> 259aa32835SJeff Kirsher #include <asm/io.h> 269aa32835SJeff Kirsher 279aa32835SJeff Kirsher #define DRV_NAME "ehea" 289aa32835SJeff Kirsher #define DRV_VERSION "EHEA_0107" 299aa32835SJeff Kirsher 309aa32835SJeff Kirsher /* eHEA capability flags */ 319aa32835SJeff Kirsher #define DLPAR_PORT_ADD_REM 1 329aa32835SJeff Kirsher #define DLPAR_MEM_ADD 2 339aa32835SJeff Kirsher #define DLPAR_MEM_REM 4 349aa32835SJeff Kirsher #define EHEA_CAPABILITIES (DLPAR_PORT_ADD_REM | DLPAR_MEM_ADD | DLPAR_MEM_REM) 359aa32835SJeff Kirsher 369aa32835SJeff Kirsher #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ 379aa32835SJeff Kirsher | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) 389aa32835SJeff Kirsher 399aa32835SJeff Kirsher #define EHEA_MAX_ENTRIES_RQ1 32767 409aa32835SJeff Kirsher #define EHEA_MAX_ENTRIES_RQ2 16383 419aa32835SJeff Kirsher #define EHEA_MAX_ENTRIES_RQ3 16383 429aa32835SJeff Kirsher #define EHEA_MAX_ENTRIES_SQ 32767 439aa32835SJeff Kirsher #define EHEA_MIN_ENTRIES_QP 127 449aa32835SJeff Kirsher 459aa32835SJeff Kirsher #define EHEA_SMALL_QUEUES 469aa32835SJeff Kirsher 479aa32835SJeff Kirsher #ifdef EHEA_SMALL_QUEUES 489aa32835SJeff Kirsher #define EHEA_MAX_CQE_COUNT 1023 499aa32835SJeff Kirsher #define EHEA_DEF_ENTRIES_SQ 1023 50aa9084a0SAnton Blanchard #define EHEA_DEF_ENTRIES_RQ1 1023 519aa32835SJeff Kirsher #define EHEA_DEF_ENTRIES_RQ2 1023 52aa9084a0SAnton Blanchard #define EHEA_DEF_ENTRIES_RQ3 511 539aa32835SJeff Kirsher #else 549aa32835SJeff Kirsher #define EHEA_MAX_CQE_COUNT 4080 559aa32835SJeff Kirsher #define EHEA_DEF_ENTRIES_SQ 4080 569aa32835SJeff Kirsher #define EHEA_DEF_ENTRIES_RQ1 8160 579aa32835SJeff Kirsher #define EHEA_DEF_ENTRIES_RQ2 2040 589aa32835SJeff Kirsher #define EHEA_DEF_ENTRIES_RQ3 2040 599aa32835SJeff Kirsher #endif 609aa32835SJeff Kirsher 619aa32835SJeff Kirsher #define EHEA_MAX_ENTRIES_EQ 20 629aa32835SJeff Kirsher 639aa32835SJeff Kirsher #define EHEA_SG_SQ 2 649aa32835SJeff Kirsher #define EHEA_SG_RQ1 1 659aa32835SJeff Kirsher #define EHEA_SG_RQ2 0 669aa32835SJeff Kirsher #define EHEA_SG_RQ3 0 679aa32835SJeff Kirsher 689aa32835SJeff Kirsher #define EHEA_MAX_PACKET_SIZE 9022 /* for jumbo frames */ 69945db2d4SAnton Blanchard #define EHEA_RQ2_PKT_SIZE 2048 709aa32835SJeff Kirsher #define EHEA_L_PKT_SIZE 256 /* low latency */ 719aa32835SJeff Kirsher 729aa32835SJeff Kirsher /* Send completion signaling */ 739aa32835SJeff Kirsher 749aa32835SJeff Kirsher /* Protection Domain Identifier */ 759aa32835SJeff Kirsher #define EHEA_PD_ID 0xaabcdeff 769aa32835SJeff Kirsher 779aa32835SJeff Kirsher #define EHEA_RQ2_THRESHOLD 1 78945db2d4SAnton Blanchard #define EHEA_RQ3_THRESHOLD 4 /* use RQ3 threshold of 2048 bytes */ 799aa32835SJeff Kirsher 809aa32835SJeff Kirsher #define EHEA_SPEED_10G 10000 819aa32835SJeff Kirsher #define EHEA_SPEED_1G 1000 829aa32835SJeff Kirsher #define EHEA_SPEED_100M 100 839aa32835SJeff Kirsher #define EHEA_SPEED_10M 10 849aa32835SJeff Kirsher #define EHEA_SPEED_AUTONEG 0 859aa32835SJeff Kirsher 869aa32835SJeff Kirsher /* Broadcast/Multicast registration types */ 879aa32835SJeff Kirsher #define EHEA_BCMC_SCOPE_ALL 0x08 889aa32835SJeff Kirsher #define EHEA_BCMC_SCOPE_SINGLE 0x00 899aa32835SJeff Kirsher #define EHEA_BCMC_MULTICAST 0x04 909aa32835SJeff Kirsher #define EHEA_BCMC_BROADCAST 0x00 919aa32835SJeff Kirsher #define EHEA_BCMC_UNTAGGED 0x02 929aa32835SJeff Kirsher #define EHEA_BCMC_TAGGED 0x00 939aa32835SJeff Kirsher #define EHEA_BCMC_VLANID_ALL 0x01 949aa32835SJeff Kirsher #define EHEA_BCMC_VLANID_SINGLE 0x00 959aa32835SJeff Kirsher 969aa32835SJeff Kirsher #define EHEA_CACHE_LINE 128 979aa32835SJeff Kirsher 989aa32835SJeff Kirsher /* Memory Regions */ 999aa32835SJeff Kirsher #define EHEA_MR_ACC_CTRL 0x00800000 1009aa32835SJeff Kirsher 1019aa32835SJeff Kirsher #define EHEA_BUSMAP_START 0x8000000000000000ULL 1029aa32835SJeff Kirsher #define EHEA_INVAL_ADDR 0xFFFFFFFFFFFFFFFFULL 1039aa32835SJeff Kirsher #define EHEA_DIR_INDEX_SHIFT 13 /* 8k Entries in 64k block */ 1049aa32835SJeff Kirsher #define EHEA_TOP_INDEX_SHIFT (EHEA_DIR_INDEX_SHIFT * 2) 1059aa32835SJeff Kirsher #define EHEA_MAP_ENTRIES (1 << EHEA_DIR_INDEX_SHIFT) 1069aa32835SJeff Kirsher #define EHEA_MAP_SIZE (0x10000) /* currently fixed map size */ 1079aa32835SJeff Kirsher #define EHEA_INDEX_MASK (EHEA_MAP_ENTRIES - 1) 1089aa32835SJeff Kirsher 1099aa32835SJeff Kirsher 1109aa32835SJeff Kirsher #define EHEA_WATCH_DOG_TIMEOUT 10*HZ 1119aa32835SJeff Kirsher 1129aa32835SJeff Kirsher /* utility functions */ 1139aa32835SJeff Kirsher 1149aa32835SJeff Kirsher void ehea_dump(void *adr, int len, char *msg); 1159aa32835SJeff Kirsher 1169aa32835SJeff Kirsher #define EHEA_BMASK(pos, length) (((pos) << 16) + (length)) 1179aa32835SJeff Kirsher 1189aa32835SJeff Kirsher #define EHEA_BMASK_IBM(from, to) (((63 - to) << 16) + ((to) - (from) + 1)) 1199aa32835SJeff Kirsher 1209aa32835SJeff Kirsher #define EHEA_BMASK_SHIFTPOS(mask) (((mask) >> 16) & 0xffff) 1219aa32835SJeff Kirsher 1229aa32835SJeff Kirsher #define EHEA_BMASK_MASK(mask) \ 1239aa32835SJeff Kirsher (0xffffffffffffffffULL >> ((64 - (mask)) & 0xffff)) 1249aa32835SJeff Kirsher 1259aa32835SJeff Kirsher #define EHEA_BMASK_SET(mask, value) \ 1269aa32835SJeff Kirsher ((EHEA_BMASK_MASK(mask) & ((u64)(value))) << EHEA_BMASK_SHIFTPOS(mask)) 1279aa32835SJeff Kirsher 1289aa32835SJeff Kirsher #define EHEA_BMASK_GET(mask, value) \ 1299aa32835SJeff Kirsher (EHEA_BMASK_MASK(mask) & (((u64)(value)) >> EHEA_BMASK_SHIFTPOS(mask))) 1309aa32835SJeff Kirsher 1319aa32835SJeff Kirsher /* 1329aa32835SJeff Kirsher * Generic ehea page 1339aa32835SJeff Kirsher */ 1349aa32835SJeff Kirsher struct ehea_page { 1359aa32835SJeff Kirsher u8 entries[PAGE_SIZE]; 1369aa32835SJeff Kirsher }; 1379aa32835SJeff Kirsher 1389aa32835SJeff Kirsher /* 1399aa32835SJeff Kirsher * Generic queue in linux kernel virtual memory 1409aa32835SJeff Kirsher */ 1419aa32835SJeff Kirsher struct hw_queue { 1429aa32835SJeff Kirsher u64 current_q_offset; /* current queue entry */ 1439aa32835SJeff Kirsher struct ehea_page **queue_pages; /* array of pages belonging to queue */ 1449aa32835SJeff Kirsher u32 qe_size; /* queue entry size */ 1459aa32835SJeff Kirsher u32 queue_length; /* queue length allocated in bytes */ 1469aa32835SJeff Kirsher u32 pagesize; 1479aa32835SJeff Kirsher u32 toggle_state; /* toggle flag - per page */ 1489aa32835SJeff Kirsher u32 reserved; /* 64 bit alignment */ 1499aa32835SJeff Kirsher }; 1509aa32835SJeff Kirsher 1519aa32835SJeff Kirsher /* 1529aa32835SJeff Kirsher * For pSeries this is a 64bit memory address where 1539aa32835SJeff Kirsher * I/O memory is mapped into CPU address space 1549aa32835SJeff Kirsher */ 1559aa32835SJeff Kirsher struct h_epa { 1569aa32835SJeff Kirsher void __iomem *addr; 1579aa32835SJeff Kirsher }; 1589aa32835SJeff Kirsher 1599aa32835SJeff Kirsher struct h_epa_user { 1609aa32835SJeff Kirsher u64 addr; 1619aa32835SJeff Kirsher }; 1629aa32835SJeff Kirsher 1639aa32835SJeff Kirsher struct h_epas { 1649aa32835SJeff Kirsher struct h_epa kernel; /* kernel space accessible resource, 1659aa32835SJeff Kirsher set to 0 if unused */ 1669aa32835SJeff Kirsher struct h_epa_user user; /* user space accessible resource 1679aa32835SJeff Kirsher set to 0 if unused */ 1689aa32835SJeff Kirsher }; 1699aa32835SJeff Kirsher 1709aa32835SJeff Kirsher /* 1719aa32835SJeff Kirsher * Memory map data structures 1729aa32835SJeff Kirsher */ 1739aa32835SJeff Kirsher struct ehea_dir_bmap 1749aa32835SJeff Kirsher { 1759aa32835SJeff Kirsher u64 ent[EHEA_MAP_ENTRIES]; 1769aa32835SJeff Kirsher }; 1779aa32835SJeff Kirsher struct ehea_top_bmap 1789aa32835SJeff Kirsher { 1799aa32835SJeff Kirsher struct ehea_dir_bmap *dir[EHEA_MAP_ENTRIES]; 1809aa32835SJeff Kirsher }; 1819aa32835SJeff Kirsher struct ehea_bmap 1829aa32835SJeff Kirsher { 1839aa32835SJeff Kirsher struct ehea_top_bmap *top[EHEA_MAP_ENTRIES]; 1849aa32835SJeff Kirsher }; 1859aa32835SJeff Kirsher 1869aa32835SJeff Kirsher struct ehea_qp; 1879aa32835SJeff Kirsher struct ehea_cq; 1889aa32835SJeff Kirsher struct ehea_eq; 1899aa32835SJeff Kirsher struct ehea_port; 1909aa32835SJeff Kirsher struct ehea_av; 1919aa32835SJeff Kirsher 1929aa32835SJeff Kirsher /* 1939aa32835SJeff Kirsher * Queue attributes passed to ehea_create_qp() 1949aa32835SJeff Kirsher */ 1959aa32835SJeff Kirsher struct ehea_qp_init_attr { 1969aa32835SJeff Kirsher /* input parameter */ 1979aa32835SJeff Kirsher u32 qp_token; /* queue token */ 1989aa32835SJeff Kirsher u8 low_lat_rq1; 1999aa32835SJeff Kirsher u8 signalingtype; /* cqe generation flag */ 2009aa32835SJeff Kirsher u8 rq_count; /* num of receive queues */ 2019aa32835SJeff Kirsher u8 eqe_gen; /* eqe generation flag */ 2029aa32835SJeff Kirsher u16 max_nr_send_wqes; /* max number of send wqes */ 2039aa32835SJeff Kirsher u16 max_nr_rwqes_rq1; /* max number of receive wqes */ 2049aa32835SJeff Kirsher u16 max_nr_rwqes_rq2; 2059aa32835SJeff Kirsher u16 max_nr_rwqes_rq3; 2069aa32835SJeff Kirsher u8 wqe_size_enc_sq; 2079aa32835SJeff Kirsher u8 wqe_size_enc_rq1; 2089aa32835SJeff Kirsher u8 wqe_size_enc_rq2; 2099aa32835SJeff Kirsher u8 wqe_size_enc_rq3; 2109aa32835SJeff Kirsher u8 swqe_imm_data_len; /* immediate data length for swqes */ 2119aa32835SJeff Kirsher u16 port_nr; 2129aa32835SJeff Kirsher u16 rq2_threshold; 2139aa32835SJeff Kirsher u16 rq3_threshold; 2149aa32835SJeff Kirsher u64 send_cq_handle; 2159aa32835SJeff Kirsher u64 recv_cq_handle; 2169aa32835SJeff Kirsher u64 aff_eq_handle; 2179aa32835SJeff Kirsher 2189aa32835SJeff Kirsher /* output parameter */ 2199aa32835SJeff Kirsher u32 qp_nr; 2209aa32835SJeff Kirsher u16 act_nr_send_wqes; 2219aa32835SJeff Kirsher u16 act_nr_rwqes_rq1; 2229aa32835SJeff Kirsher u16 act_nr_rwqes_rq2; 2239aa32835SJeff Kirsher u16 act_nr_rwqes_rq3; 2249aa32835SJeff Kirsher u8 act_wqe_size_enc_sq; 2259aa32835SJeff Kirsher u8 act_wqe_size_enc_rq1; 2269aa32835SJeff Kirsher u8 act_wqe_size_enc_rq2; 2279aa32835SJeff Kirsher u8 act_wqe_size_enc_rq3; 2289aa32835SJeff Kirsher u32 nr_sq_pages; 2299aa32835SJeff Kirsher u32 nr_rq1_pages; 2309aa32835SJeff Kirsher u32 nr_rq2_pages; 2319aa32835SJeff Kirsher u32 nr_rq3_pages; 2329aa32835SJeff Kirsher u32 liobn_sq; 2339aa32835SJeff Kirsher u32 liobn_rq1; 2349aa32835SJeff Kirsher u32 liobn_rq2; 2359aa32835SJeff Kirsher u32 liobn_rq3; 2369aa32835SJeff Kirsher }; 2379aa32835SJeff Kirsher 2389aa32835SJeff Kirsher /* 2399aa32835SJeff Kirsher * Event Queue attributes, passed as parameter 2409aa32835SJeff Kirsher */ 2419aa32835SJeff Kirsher struct ehea_eq_attr { 2429aa32835SJeff Kirsher u32 type; 2439aa32835SJeff Kirsher u32 max_nr_of_eqes; 2449aa32835SJeff Kirsher u8 eqe_gen; /* generate eqe flag */ 2459aa32835SJeff Kirsher u64 eq_handle; 2469aa32835SJeff Kirsher u32 act_nr_of_eqes; 2479aa32835SJeff Kirsher u32 nr_pages; 2489aa32835SJeff Kirsher u32 ist1; /* Interrupt service token */ 2499aa32835SJeff Kirsher u32 ist2; 2509aa32835SJeff Kirsher u32 ist3; 2519aa32835SJeff Kirsher u32 ist4; 2529aa32835SJeff Kirsher }; 2539aa32835SJeff Kirsher 2549aa32835SJeff Kirsher 2559aa32835SJeff Kirsher /* 2569aa32835SJeff Kirsher * Event Queue 2579aa32835SJeff Kirsher */ 2589aa32835SJeff Kirsher struct ehea_eq { 2599aa32835SJeff Kirsher struct ehea_adapter *adapter; 2609aa32835SJeff Kirsher struct hw_queue hw_queue; 2619aa32835SJeff Kirsher u64 fw_handle; 2629aa32835SJeff Kirsher struct h_epas epas; 2639aa32835SJeff Kirsher spinlock_t spinlock; 2649aa32835SJeff Kirsher struct ehea_eq_attr attr; 2659aa32835SJeff Kirsher }; 2669aa32835SJeff Kirsher 2679aa32835SJeff Kirsher /* 2689aa32835SJeff Kirsher * HEA Queues 2699aa32835SJeff Kirsher */ 2709aa32835SJeff Kirsher struct ehea_qp { 2719aa32835SJeff Kirsher struct ehea_adapter *adapter; 2729aa32835SJeff Kirsher u64 fw_handle; /* QP handle for firmware calls */ 2739aa32835SJeff Kirsher struct hw_queue hw_squeue; 2749aa32835SJeff Kirsher struct hw_queue hw_rqueue1; 2759aa32835SJeff Kirsher struct hw_queue hw_rqueue2; 2769aa32835SJeff Kirsher struct hw_queue hw_rqueue3; 2779aa32835SJeff Kirsher struct h_epas epas; 2789aa32835SJeff Kirsher struct ehea_qp_init_attr init_attr; 2799aa32835SJeff Kirsher }; 2809aa32835SJeff Kirsher 2819aa32835SJeff Kirsher /* 2829aa32835SJeff Kirsher * Completion Queue attributes 2839aa32835SJeff Kirsher */ 2849aa32835SJeff Kirsher struct ehea_cq_attr { 2859aa32835SJeff Kirsher /* input parameter */ 2869aa32835SJeff Kirsher u32 max_nr_of_cqes; 2879aa32835SJeff Kirsher u32 cq_token; 2889aa32835SJeff Kirsher u64 eq_handle; 2899aa32835SJeff Kirsher 2909aa32835SJeff Kirsher /* output parameter */ 2919aa32835SJeff Kirsher u32 act_nr_of_cqes; 2929aa32835SJeff Kirsher u32 nr_pages; 2939aa32835SJeff Kirsher }; 2949aa32835SJeff Kirsher 2959aa32835SJeff Kirsher /* 2969aa32835SJeff Kirsher * Completion Queue 2979aa32835SJeff Kirsher */ 2989aa32835SJeff Kirsher struct ehea_cq { 2999aa32835SJeff Kirsher struct ehea_adapter *adapter; 3009aa32835SJeff Kirsher u64 fw_handle; 3019aa32835SJeff Kirsher struct hw_queue hw_queue; 3029aa32835SJeff Kirsher struct h_epas epas; 3039aa32835SJeff Kirsher struct ehea_cq_attr attr; 3049aa32835SJeff Kirsher }; 3059aa32835SJeff Kirsher 3069aa32835SJeff Kirsher /* 3079aa32835SJeff Kirsher * Memory Region 3089aa32835SJeff Kirsher */ 3099aa32835SJeff Kirsher struct ehea_mr { 3109aa32835SJeff Kirsher struct ehea_adapter *adapter; 3119aa32835SJeff Kirsher u64 handle; 3129aa32835SJeff Kirsher u64 vaddr; 3139aa32835SJeff Kirsher u32 lkey; 3149aa32835SJeff Kirsher }; 3159aa32835SJeff Kirsher 3169aa32835SJeff Kirsher /* 3179aa32835SJeff Kirsher * Port state information 3189aa32835SJeff Kirsher */ 3199aa32835SJeff Kirsher struct port_stats { 3209aa32835SJeff Kirsher int poll_receive_errors; 3219aa32835SJeff Kirsher int queue_stopped; 3229aa32835SJeff Kirsher int err_tcp_cksum; 3239aa32835SJeff Kirsher int err_ip_cksum; 3249aa32835SJeff Kirsher int err_frame_crc; 3259aa32835SJeff Kirsher }; 3269aa32835SJeff Kirsher 3279aa32835SJeff Kirsher #define EHEA_IRQ_NAME_SIZE 20 3289aa32835SJeff Kirsher 3299aa32835SJeff Kirsher /* 3309aa32835SJeff Kirsher * Queue SKB Array 3319aa32835SJeff Kirsher */ 3329aa32835SJeff Kirsher struct ehea_q_skb_arr { 3339aa32835SJeff Kirsher struct sk_buff **arr; /* skb array for queue */ 3349aa32835SJeff Kirsher int len; /* array length */ 3359aa32835SJeff Kirsher int index; /* array index */ 3369aa32835SJeff Kirsher int os_skbs; /* rq2/rq3 only: outstanding skbs */ 3379aa32835SJeff Kirsher }; 3389aa32835SJeff Kirsher 3399aa32835SJeff Kirsher /* 3409aa32835SJeff Kirsher * Port resources 3419aa32835SJeff Kirsher */ 3429aa32835SJeff Kirsher struct ehea_port_res { 3439aa32835SJeff Kirsher struct napi_struct napi; 3449aa32835SJeff Kirsher struct port_stats p_stats; 3459aa32835SJeff Kirsher struct ehea_mr send_mr; /* send memory region */ 3469aa32835SJeff Kirsher struct ehea_mr recv_mr; /* receive memory region */ 3479aa32835SJeff Kirsher struct ehea_port *port; 3489aa32835SJeff Kirsher char int_recv_name[EHEA_IRQ_NAME_SIZE]; 3499aa32835SJeff Kirsher char int_send_name[EHEA_IRQ_NAME_SIZE]; 3509aa32835SJeff Kirsher struct ehea_qp *qp; 3519aa32835SJeff Kirsher struct ehea_cq *send_cq; 3529aa32835SJeff Kirsher struct ehea_cq *recv_cq; 3539aa32835SJeff Kirsher struct ehea_eq *eq; 3549aa32835SJeff Kirsher struct ehea_q_skb_arr rq1_skba; 3559aa32835SJeff Kirsher struct ehea_q_skb_arr rq2_skba; 3569aa32835SJeff Kirsher struct ehea_q_skb_arr rq3_skba; 3579aa32835SJeff Kirsher struct ehea_q_skb_arr sq_skba; 3589aa32835SJeff Kirsher int sq_skba_size; 3599aa32835SJeff Kirsher int swqe_refill_th; 3609aa32835SJeff Kirsher atomic_t swqe_avail; 3619aa32835SJeff Kirsher int swqe_ll_count; 3629aa32835SJeff Kirsher u32 swqe_id_counter; 3639aa32835SJeff Kirsher u64 tx_packets; 3649aa32835SJeff Kirsher u64 tx_bytes; 3659aa32835SJeff Kirsher u64 rx_packets; 3669aa32835SJeff Kirsher u64 rx_bytes; 3679aa32835SJeff Kirsher int sq_restart_flag; 3689aa32835SJeff Kirsher }; 3699aa32835SJeff Kirsher 3709aa32835SJeff Kirsher 3719aa32835SJeff Kirsher #define EHEA_MAX_PORTS 16 3729aa32835SJeff Kirsher 3739aa32835SJeff Kirsher #define EHEA_NUM_PORTRES_FW_HANDLES 6 /* QP handle, SendCQ handle, 3749aa32835SJeff Kirsher RecvCQ handle, EQ handle, 3759aa32835SJeff Kirsher SendMR handle, RecvMR handle */ 3769aa32835SJeff Kirsher #define EHEA_NUM_PORT_FW_HANDLES 1 /* EQ handle */ 3779aa32835SJeff Kirsher #define EHEA_NUM_ADAPTER_FW_HANDLES 2 /* MR handle, NEQ handle */ 3789aa32835SJeff Kirsher 3799aa32835SJeff Kirsher struct ehea_adapter { 3809aa32835SJeff Kirsher u64 handle; 3819aa32835SJeff Kirsher struct platform_device *ofdev; 3829aa32835SJeff Kirsher struct ehea_port *port[EHEA_MAX_PORTS]; 3839aa32835SJeff Kirsher struct ehea_eq *neq; /* notification event queue */ 3849aa32835SJeff Kirsher struct tasklet_struct neq_tasklet; 3859aa32835SJeff Kirsher struct ehea_mr mr; 3869aa32835SJeff Kirsher u32 pd; /* protection domain */ 3879aa32835SJeff Kirsher u64 max_mc_mac; /* max number of multicast mac addresses */ 3889aa32835SJeff Kirsher int active_ports; 3899aa32835SJeff Kirsher struct list_head list; 3909aa32835SJeff Kirsher }; 3919aa32835SJeff Kirsher 3929aa32835SJeff Kirsher 3939aa32835SJeff Kirsher struct ehea_mc_list { 3949aa32835SJeff Kirsher struct list_head list; 3959aa32835SJeff Kirsher u64 macaddr; 3969aa32835SJeff Kirsher }; 3979aa32835SJeff Kirsher 3989aa32835SJeff Kirsher /* kdump support */ 3999aa32835SJeff Kirsher struct ehea_fw_handle_entry { 4009aa32835SJeff Kirsher u64 adh; /* Adapter Handle */ 4019aa32835SJeff Kirsher u64 fwh; /* Firmware Handle */ 4029aa32835SJeff Kirsher }; 4039aa32835SJeff Kirsher 4049aa32835SJeff Kirsher struct ehea_fw_handle_array { 4059aa32835SJeff Kirsher struct ehea_fw_handle_entry *arr; 4069aa32835SJeff Kirsher int num_entries; 4079aa32835SJeff Kirsher struct mutex lock; 4089aa32835SJeff Kirsher }; 4099aa32835SJeff Kirsher 4109aa32835SJeff Kirsher struct ehea_bcmc_reg_entry { 4119aa32835SJeff Kirsher u64 adh; /* Adapter Handle */ 4129aa32835SJeff Kirsher u32 port_id; /* Logical Port Id */ 4139aa32835SJeff Kirsher u8 reg_type; /* Registration Type */ 4149aa32835SJeff Kirsher u64 macaddr; 4159aa32835SJeff Kirsher }; 4169aa32835SJeff Kirsher 4179aa32835SJeff Kirsher struct ehea_bcmc_reg_array { 4189aa32835SJeff Kirsher struct ehea_bcmc_reg_entry *arr; 4199aa32835SJeff Kirsher int num_entries; 4209aa32835SJeff Kirsher spinlock_t lock; 4219aa32835SJeff Kirsher }; 4229aa32835SJeff Kirsher 4239aa32835SJeff Kirsher #define EHEA_PORT_UP 1 4249aa32835SJeff Kirsher #define EHEA_PORT_DOWN 0 4259aa32835SJeff Kirsher #define EHEA_PHY_LINK_UP 1 4269aa32835SJeff Kirsher #define EHEA_PHY_LINK_DOWN 0 4279aa32835SJeff Kirsher #define EHEA_MAX_PORT_RES 16 4289aa32835SJeff Kirsher struct ehea_port { 4299aa32835SJeff Kirsher struct ehea_adapter *adapter; /* adapter that owns this port */ 4309aa32835SJeff Kirsher struct net_device *netdev; 431239c562cSAnton Blanchard struct rtnl_link_stats64 stats; 4329aa32835SJeff Kirsher struct ehea_port_res port_res[EHEA_MAX_PORT_RES]; 4339aa32835SJeff Kirsher struct platform_device ofdev; /* Open Firmware Device */ 4349aa32835SJeff Kirsher struct ehea_mc_list *mc_list; /* Multicast MAC addresses */ 4359aa32835SJeff Kirsher struct ehea_eq *qp_eq; 4369aa32835SJeff Kirsher struct work_struct reset_task; 4372aefcad8Sbrenohl@br.ibm.com struct delayed_work stats_work; 4389aa32835SJeff Kirsher struct mutex port_lock; 4399aa32835SJeff Kirsher char int_aff_name[EHEA_IRQ_NAME_SIZE]; 4409aa32835SJeff Kirsher int allmulti; /* Indicates IFF_ALLMULTI state */ 4419aa32835SJeff Kirsher int promisc; /* Indicates IFF_PROMISC state */ 4429aa32835SJeff Kirsher int num_mcs; 4439aa32835SJeff Kirsher int resets; 4449aa32835SJeff Kirsher unsigned long flags; 4459aa32835SJeff Kirsher u64 mac_addr; 4469aa32835SJeff Kirsher u32 logical_port_id; 4479aa32835SJeff Kirsher u32 port_speed; 4489aa32835SJeff Kirsher u32 msg_enable; 4499aa32835SJeff Kirsher u32 sig_comp_iv; 4509aa32835SJeff Kirsher u32 state; 4519aa32835SJeff Kirsher u8 phy_link; 4529aa32835SJeff Kirsher u8 full_duplex; 4539aa32835SJeff Kirsher u8 autoneg; 4549aa32835SJeff Kirsher u8 num_def_qps; 4559aa32835SJeff Kirsher wait_queue_head_t swqe_avail_wq; 4569aa32835SJeff Kirsher wait_queue_head_t restart_wq; 4579aa32835SJeff Kirsher }; 4589aa32835SJeff Kirsher 4599aa32835SJeff Kirsher struct port_res_cfg { 4609aa32835SJeff Kirsher int max_entries_rcq; 4619aa32835SJeff Kirsher int max_entries_scq; 4629aa32835SJeff Kirsher int max_entries_sq; 4639aa32835SJeff Kirsher int max_entries_rq1; 4649aa32835SJeff Kirsher int max_entries_rq2; 4659aa32835SJeff Kirsher int max_entries_rq3; 4669aa32835SJeff Kirsher }; 4679aa32835SJeff Kirsher 4689aa32835SJeff Kirsher enum ehea_flag_bits { 4699aa32835SJeff Kirsher __EHEA_STOP_XFER, 4709aa32835SJeff Kirsher __EHEA_DISABLE_PORT_RESET 4719aa32835SJeff Kirsher }; 4729aa32835SJeff Kirsher 4739aa32835SJeff Kirsher void ehea_set_ethtool_ops(struct net_device *netdev); 4749aa32835SJeff Kirsher int ehea_sense_port_attr(struct ehea_port *port); 4759aa32835SJeff Kirsher int ehea_set_portspeed(struct ehea_port *port, u32 port_speed); 4769aa32835SJeff Kirsher 4779aa32835SJeff Kirsher #endif /* __EHEA_H__ */ 478