ehea: main header files
Subsystems (2)
PATCH 4/6 ehea: main header files
Signed-off-by Jan-Bernd Themann <[email protected]>
drivers/net/ehea/ehea.h | 434 +++++++++++++++++++++++++++++++++++++++++++++ drivers/net/ehea/ehea_hw.h | 319 +++++++++++++++++++++++++++++++++ 2 files changed, 753 insertions(+)
drivers/net/ehea/ehea.h +434 -0
@@ -0,0 +1,434 @@ +/* +* linux/drivers/net/ehea/ehea.h +* +* eHEA ethernet device driver for IBM eServer System p +* +* (C) Copyright IBM Corp. 2006 +* +* Authors: +* Christoph Raisch <[email protected]> +* Jan-Bernd Themann <[email protected]> +* Heiko-Joerg Schick <[email protected]> +* Thomas Klein <[email protected]> +* +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __EHEA_H__ +#define __EHEA_H__ + +#include <linux/version.h> +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/kernel.h> +#include <linux/vmalloc.h> +#include <linux/mm.h> +#include <linux/slab.h> +#include <linux/sched.h> +#include <linux/err.h> +#include <linux/list.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> +#include <linux/kthread.h> +#include <linux/ethtool.h> +#include <linux/if_vlan.h> +#include <asm/ibmebus.h> +#include <asm/of_device.h> +#include <asm/abs_addr.h> +#include <asm/semaphore.h> +#include <asm/current.h> +#include <asm/io.h> + + +#define EHEA_DRIVER_NAME "IBM eHEA" +#define EHEA_DRIVER_VERSION "EHEA_0007" + +/* #define EHEA_CQE_TIMER */ +#define EHEA_ADDITIONAL_STATISTICS + +#ifdef EHEA_SMALL_QUEUES +#define EHEA_MAX_CQE_COUNT 1020 +#define EHEA_MAX_ENTRIES_SQ 1020 +#define EHEA_MAX_ENTRIES_RQ1 4080 +#define EHEA_MAX_ENTRIES_RQ2 1020 +#define EHEA_MAX_ENTRIES_RQ3 1020 +#define EHEA_SWQE_REFILL_TH 100 +#else +#define EHEA_MAX_CQE_COUNT 32000 +#define EHEA_MAX_ENTRIES_SQ 16000 +#define EHEA_MAX_ENTRIES_RQ1 32080 +#define EHEA_MAX_ENTRIES_RQ2 4020 +#define EHEA_MAX_ENTRIES_RQ3 4020 +#define EHEA_SWQE_REFILL_TH 1000 +#endif + +#define EHEA_MAX_ENTRIES_EQ 20 + +#define EHEA_SG_SQ 2 +#define EHEA_SG_RQ1 1 +#define EHEA_SG_RQ2 0 +#define EHEA_SG_RQ3 0 + +#define EHEA_MAX_PACKET_SIZE 9022/* for jumbo frame */ +#define EHEA_LL_PKT_SIZE 256 + +/* Send completion signaling */ +#define EHEA_SIG_IV 1000 +#define EHEA_SIG_IV_LONG 4 +#define EHEA_SQ_HL_TRIGGER 5000 + +/* Protection Domain Identifier */ +#define EHEA_PD_ID 0xaabcdeff + +#define EHEA_RQ2_THRESHOLD 1 +#define EHEA_RQ3_THRESHOLD 5 + +#define EHEA_SPEED_10G 10000 +#define EHEA_SPEED_1G 1000 +#define EHEA_SPEED_100M 100 +#define EHEA_SPEED_10M 10 + +/* Broadcast/Multicast registration types */ +#define EHEA_BCMC_SCOPE_ALL 0x08 +#define EHEA_BCMC_SCOPE_SINGLE 0x00 +#define EHEA_BCMC_MULTICAST 0x04 +#define EHEA_BCMC_BROADCAST 0x00 +#define EHEA_BCMC_UNTAGGED 0x02 +#define EHEA_BCMC_TAGGED 0x00 +#define EHEA_BCMC_VLANID_ALL 0x01 +#define EHEA_BCMC_VLANID_SINGLE 0x00 + +/* Use this define to kmallocate PHYP control blocks */ +#define H_CB_ALIGNMENT 4096 + +#define EHEA_PAGESHIFT 12 +#define EHEA_PAGESIZE 4096UL +#define EHEA_PT_ENTRIES 512UL +#define EHEA_CACHE_LINE 128 + +#define EHEA_ENABLE 1 +#define EHEA_DISABLE 0 + +void ehea_set_ethtool_ops (struct net_device *netdev); + +#ifndef KEEP_EDEBS_BELOW +#define KEEP_EDEBS_BELOW 8 +#endif + +extern int ehea_trace_level; +extern struct ehea_adapter *adapter_global; + +#ifdef EHEA_NO_EDEB +#define EDEB_P_GENERIC(level, idstring, format, args...) \ + while (0 == 1) { \ + if(unlikely (level <= ehea_trace_level)) { \ + printk("%s " idstring " "format "\n", \ + __func__, ##args); \ + } \ + } \ + +#else + +#define EDEB_P_GENERIC(level,idstring,format,args...) \ +if (level < KEEP_EDEBS_BELOW) { \ + do { \ + if(unlikely (level <= ehea_trace_level)) { \ + printk("%s " idstring " "format "\n", \ + __func__, ##args); \ + } \ + } while (1 == 0); \ +} +#endif + +#define EDEB(level, format, args...) \ + EDEB_P_GENERIC(level, "", format, ##args) + +#define EDEB_ERR(level, format, args...) \ + EDEB_P_GENERIC(level, "EHEA_ERROR", format, ##args) + +#define EDEB_EN(level, format, args...) \ + EDEB_P_GENERIC(level, ">>>", format, ##args) + +#define EDEB_EX(level, format, args...) \ + EDEB_P_GENERIC(level, "<<<", format, ##args) + +#define EHEA_BMASK (pos, length) (((pos) << 16) + (length)) +#define EHEA_BMASK_IBM (from, to) (((63 - to) << 16) + ((to) - (from) + 1)) +#define EHEA_BMASK_SHIFTPOS (mask) (((mask) >> 16) & 0xffff) +#define EHEA_BMASK_MASK (mask) (0xffffffffffffffffULL >> ((64 - (mask)) & 0xffff)) +#define EHEA_BMASK_SET (mask, value) \ + ((EHEA_BMASK_MASK(mask) & ((u64)(value))) << EHEA_BMASK_SHIFTPOS(mask)) +#define EHEA_BMASK_GET (mask, value) \ + (EHEA_BMASK_MASK(mask) & (((u64)(value)) >> EHEA_BMASK_SHIFTPOS(mask))) + +extern void exit (int ); + +#define EDEB_DMP(level, adr, len, format, args...) \ +if (level < KEEP_EDEBS_BELOW) { \ + if(unlikely (level <= ehea_trace_level)) { \ + do { \ + unsigned int x; \ + unsigned int l = (unsigned int)(len); \ + unsigned char *deb = (unsigned char*)(adr); \ + for (x = 0; x < l; x += 16) { \ + EDEB(level, format " adr=%p ofs=%04x %016lx %016lx", \ + ##args, deb, x, *((u64 *)&deb[0]), \ + *((u64 *)&deb[8])); \ + deb += 16; \ + } \ + } while (0); \ + } \ +} + + +/* +* struct generic ehea page +*/ +struct ipz_page { +u8 entries[PAGE_SIZE ]; +}; + +/* +* struct generic queue in linux kernel virtual memory +*/ +struct ipz_queue { +u64 current_q_offset;/* current queue entry */ +struct ipz_page **queue_pages;/* array of pages belonging to queue */ +u32 qe_size;/* queue entry size */ +u32 act_nr_of_sg; +u32 queue_length;/* queue length allocated in bytes */ +u32 pagesize; +u32 toggle_state;/* toggle flag - per page */ +u32 reserved;/* 64 bit alignment */ +}; + + +/* +* h_galpa: +* for pSeries this is a 64bit memory address where +* I/O memory is mapped into CPU address space +*/ + +struct h_galpa { +u64 fw_handle; +}; + +struct h_galpas { +struct h_galpa kernel;/* kernel space accessible resource, +set to 0 if unused */ +struct h_galpa user;/* user space accessible resource +set to 0 if unused */ +u32 pid;/* PID of userspace galpa checking */ +}; + +struct ehea_qp ; +struct ehea_cq ; +struct ehea_eq ; +struct ehea_port ; +struct ehea_av ; + +struct ehea_qp_init_attr { +/* input parameter */ +u32 qp_token; +u8 low_lat_rq1; +u8 signalingtype; +u8 rq_count; +u8 eqe_gen; +u16 max_nr_send_wqes; +u16 max_nr_rwqes_rq1; +u16 max_nr_rwqes_rq2; +u16 max_nr_rwqes_rq3; +u8 wqe_size_enc_sq; +u8 wqe_size_enc_rq1; +u8 wqe_size_enc_rq2; +u8 wqe_size_enc_rq3; +u8 swqe_imm_data_len; +u16 port_nr; +u16 rq2_threshold; +u16 rq3_threshold; +u64 send_cq_handle; +u64 recv_cq_handle; +u64 aff_eq_handle; + +/* output parameter */ +u32 qp_nr; +u16 act_nr_send_wqes; +u16 act_nr_rwqes_rq1; +u16 act_nr_rwqes_rq2; +u16 act_nr_rwqes_rq3; +u8 act_wqe_size_enc_sq; +u8 act_wqe_size_enc_rq1; +u8 act_wqe_size_enc_rq2; +u8 act_wqe_size_enc_rq3; +u32 nr_sq_pages; +u32 nr_rq1_pages; +u32 nr_rq2_pages; +u32 nr_rq3_pages; +u32 liobn_sq; +u32 liobn_rq1; +u32 liobn_rq2; +u32 liobn_rq3; +}; + +struct ehea_eq_attr { +u32 type; +u32 max_nr_of_eqes; +u8 eqe_gen; +u64 eq_handle; +u32 act_nr_of_eqes; +u32 nr_pages; +u32 ist1; +u32 ist2; +u32 ist3; +u32 ist4; +}; + +struct ehea_eq { +struct ipz_queue ipz_queue; +u64 ipz_eq_handle; +struct h_galpas galpas; +spinlock_t spinlock; +struct ehea_eq_attr attr; +}; + +struct ehea_qp { +struct ehea_adapter *adapter; +u64 ipz_qp_handle;/* QP handle for h-calls */ +struct ipz_queue ipz_squeue; +struct ipz_queue ipz_rqueue1; +struct ipz_queue ipz_rqueue2; +struct ipz_queue ipz_rqueue3; +struct h_galpas galpas; +struct ehea_qp_init_attr init_attr; +}; + +struct ehea_cq_attr { +/* input parameter */ +u32 max_nr_of_cqes; +u32 cq_token; +u64 eq_handle; + +/* output parameter */ +u32 act_nr_of_cqes; +u32 nr_pages; +}; + +struct ehea_cq { +struct ehea_adapter *adapter; +u64 ipz_cq_handle; +struct ipz_queue ipz_queue; +struct h_galpas galpas; +struct ehea_cq_attr attr; +}; + +struct ehea_port_res { +spinlock_t xmit_lock; +struct ehea_port *port; +struct ehea_qp *qp; +struct ehea_cq *send_cq; +struct ehea_cq *recv_cq; +struct ehea_eq *send_eq; +struct ehea_eq *recv_eq; +struct ehea_eq *qp_eq; +spinlock_t send_lock; +struct sk_buff **skb_arr_rq1; +struct sk_buff **skb_arr_rq2; +struct sk_buff **skb_arr_rq3; +struct sk_buff **skb_arr_sq; +int skb_arr_rq1_len; +int skb_arr_rq2_len; +int skb_arr_rq3_len; +int skb_arr_sq_len; +int skb_rq2_index; +int skb_rq3_index; +int skb_sq_index; +spinlock_t netif_queue; +atomic_t swqe_avail; +int swqe_ll_count; +int swqe_count; +struct tasklet_struct send_comp_task; +spinlock_t recv_lock; +u32 swqe_id_counter; +struct timer_list timer;/* polling mode, no interrupts */ +struct timer_list skb_timer;/* skb cleanup timer */ +}; + + +struct ehea_adapter { + +u64 handle; +u8 num_ports; +struct ehea_port *port[16 ]; +struct ehea_eq *neq; +struct tasklet_struct neq_tasklet; +u32 lkey; +u32 pd; +u64 mr_handle; +u64 max_mc_mac; + +}; + +inline static u32 ehea_get_lkey (struct ehea_adapter *adapter,void *addr) +{ +EDEB (8 ,"ehea_adapter=%p, addr=%p" , adapter, addr); +EDEB (8 ,"Lkey returned: %X" , adapter->lkey); +return adapter->lkey; +} + +struct ehea_mc_list { +struct list_head list; +u64 macaddr; +}; + +struct port_state { +int poll_max_processed; +int poll_receive_errors; +int ehea_poll; +int queue_stopped; +int min_swqe_avail; +u64 sqc_stop_sum; +int pkt_send; +int pkt_xmit; +int send_tasklet; +int nwqe; +}; + +struct ehea_port { +struct ehea_adapter *adapter;/* adapter that owns this port */ +struct net_device *netdev; +struct net_device_stats stats; +struct port_state p_state; +struct ehea_port_res port_res[1 ]; +struct device_node *of_dev_node;/* Open Firmware Device Node */ +struct ehea_mc_list *mc_list;/* Multicast MAC addresses */ +struct vlan_group * vgrp; +int allmulti;/* Indicates IFF_ALLMULTI state */ +int promisc;/* Indicates IFF_PROMISC state */ + +char int_recv_name[20 ]; +char int_send_name[20 ]; +char int_aff_name[20 ]; + +int kernel_l_key; +u64 mac_addr; +u32 logical_port_id; +u32 port_speed; +u8 full_duplex; +u8 num_def_qps; +}; + + +#endif /* __EHEA_H__ */
drivers/net/ehea/ehea_hw.h +319 -0
319 lines not on this page · raw message