ipath_kernel.h

来自「linux 内核源代码」· C头文件 代码 · 共 1,036 行 · 第 1/3 页

H
1,036
字号
#ifndef _IPATH_KERNEL_H#define _IPATH_KERNEL_H/* * Copyright (c) 2006, 2007 QLogic Corporation. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two * licenses.  You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * *     Redistribution and use in source and binary forms, with or *     without modification, are permitted provided that the following *     conditions are met: * *      - Redistributions of source code must retain the above *        copyright notice, this list of conditions and the following *        disclaimer. * *      - Redistributions in binary form must reproduce the above *        copyright notice, this list of conditions and the following *        disclaimer in the documentation and/or other materials *        provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. *//* * This header file is the base header file for infinipath kernel code * ipath_user.h serves a similar purpose for user code. */#include <linux/interrupt.h>#include <linux/pci.h>#include <linux/dma-mapping.h>#include <asm/io.h>#include <rdma/ib_verbs.h>#include "ipath_common.h"#include "ipath_debug.h"#include "ipath_registers.h"/* only s/w major version of InfiniPath we can handle */#define IPATH_CHIP_VERS_MAJ 2U/* don't care about this except printing */#define IPATH_CHIP_VERS_MIN 0U/* temporary, maybe always */extern struct infinipath_stats ipath_stats;#define IPATH_CHIP_SWVERSION IPATH_CHIP_VERS_MAJ/* * First-cut critierion for "device is active" is * two thousand dwords combined Tx, Rx traffic per * 5-second interval. SMA packets are 64 dwords, * and occur "a few per second", presumably each way. */#define IPATH_TRAFFIC_ACTIVE_THRESHOLD (2000)/* * Struct used to indicate which errors are logged in each of the * error-counters that are logged to EEPROM. A counter is incremented * _once_ (saturating at 255) for each event with any bits set in * the error or hwerror register masks below. */#define IPATH_EEP_LOG_CNT (4)struct ipath_eep_log_mask {	u64 errs_to_log;	u64 hwerrs_to_log;};struct ipath_portdata {	void **port_rcvegrbuf;	dma_addr_t *port_rcvegrbuf_phys;	/* rcvhdrq base, needs mmap before useful */	void *port_rcvhdrq;	/* kernel virtual address where hdrqtail is updated */	void *port_rcvhdrtail_kvaddr;	/*	 * temp buffer for expected send setup, allocated at open, instead	 * of each setup call	 */	void *port_tid_pg_list;	/* when waiting for rcv or pioavail */	wait_queue_head_t port_wait;	/*	 * rcvegr bufs base, physical, must fit	 * in 44 bits so 32 bit programs mmap64 44 bit works)	 */	dma_addr_t port_rcvegr_phys;	/* mmap of hdrq, must fit in 44 bits */	dma_addr_t port_rcvhdrq_phys;	dma_addr_t port_rcvhdrqtailaddr_phys;	/*	 * number of opens (including slave subports) on this instance	 * (ignoring forks, dup, etc. for now)	 */	int port_cnt;	/*	 * how much space to leave at start of eager TID entries for	 * protocol use, on each TID	 */	/* instead of calculating it */	unsigned port_port;	/* non-zero if port is being shared. */	u16 port_subport_cnt;	/* non-zero if port is being shared. */	u16 port_subport_id;	/* chip offset of PIO buffers for this port */	u32 port_piobufs;	/* how many alloc_pages() chunks in port_rcvegrbuf_pages */	u32 port_rcvegrbuf_chunks;	/* how many egrbufs per chunk */	u32 port_rcvegrbufs_perchunk;	/* order for port_rcvegrbuf_pages */	size_t port_rcvegrbuf_size;	/* rcvhdrq size (for freeing) */	size_t port_rcvhdrq_size;	/* next expected TID to check when looking for free */	u32 port_tidcursor;	/* next expected TID to check */	unsigned long port_flag;	/* what happened */	unsigned long int_flag;	/* WAIT_RCV that timed out, no interrupt */	u32 port_rcvwait_to;	/* WAIT_PIO that timed out, no interrupt */	u32 port_piowait_to;	/* WAIT_RCV already happened, no wait */	u32 port_rcvnowait;	/* WAIT_PIO already happened, no wait */	u32 port_pionowait;	/* total number of rcvhdrqfull errors */	u32 port_hdrqfull;	/* saved total number of rcvhdrqfull errors for poll edge trigger */	u32 port_hdrqfull_poll;	/* total number of polled urgent packets */	u32 port_urgent;	/* saved total number of polled urgent packets for poll edge trigger */	u32 port_urgent_poll;	/* pid of process using this port */	pid_t port_pid;	/* same size as task_struct .comm[] */	char port_comm[16];	/* pkeys set by this use of this port */	u16 port_pkeys[4];	/* so file ops can get at unit */	struct ipath_devdata *port_dd;	/* A page of memory for rcvhdrhead, rcvegrhead, rcvegrtail * N */	void *subport_uregbase;	/* An array of pages for the eager receive buffers * N */	void *subport_rcvegrbuf;	/* An array of pages for the eager header queue entries * N */	void *subport_rcvhdr_base;	/* The version of the library which opened this port */	u32 userversion;	/* Bitmask of active slaves */	u32 active_slaves;	/* Type of packets or conditions we want to poll for */	u16 poll_type;};struct sk_buff;/* * control information for layered drivers */struct _ipath_layer {	void *l_arg;};struct ipath_skbinfo {	struct sk_buff *skb;	dma_addr_t phys;};struct ipath_devdata {	struct list_head ipath_list;	struct ipath_kregs const *ipath_kregs;	struct ipath_cregs const *ipath_cregs;	/* mem-mapped pointer to base of chip regs */	u64 __iomem *ipath_kregbase;	/* end of mem-mapped chip space; range checking */	u64 __iomem *ipath_kregend;	/* physical address of chip for io_remap, etc. */	unsigned long ipath_physaddr;	/* base of memory alloced for ipath_kregbase, for free */	u64 *ipath_kregalloc;	/*	 * virtual address where port0 rcvhdrqtail updated for this unit.	 * only written to by the chip, not the driver.	 */	volatile __le64 *ipath_hdrqtailptr;	/* ipath_cfgports pointers */	struct ipath_portdata **ipath_pd;	/* sk_buffs used by port 0 eager receive queue */	struct ipath_skbinfo *ipath_port0_skbinfo;	/* kvirt address of 1st 2k pio buffer */	void __iomem *ipath_pio2kbase;	/* kvirt address of 1st 4k pio buffer */	void __iomem *ipath_pio4kbase;	/*	 * points to area where PIOavail registers will be DMA'ed.	 * Has to be on a page of it's own, because the page will be	 * mapped into user program space.  This copy is *ONLY* ever	 * written by DMA, not by the driver!  Need a copy per device	 * when we get to multiple devices	 */	volatile __le64 *ipath_pioavailregs_dma;	/* physical address where updates occur */	dma_addr_t ipath_pioavailregs_phys;	struct _ipath_layer ipath_layer;	/* setup intr */	int (*ipath_f_intrsetup)(struct ipath_devdata *);	/* setup on-chip bus config */	int (*ipath_f_bus)(struct ipath_devdata *, struct pci_dev *);	/* hard reset chip */	int (*ipath_f_reset)(struct ipath_devdata *);	int (*ipath_f_get_boardname)(struct ipath_devdata *, char *,				     size_t);	void (*ipath_f_init_hwerrors)(struct ipath_devdata *);	void (*ipath_f_handle_hwerrors)(struct ipath_devdata *, char *,					size_t);	void (*ipath_f_quiet_serdes)(struct ipath_devdata *);	int (*ipath_f_bringup_serdes)(struct ipath_devdata *);	int (*ipath_f_early_init)(struct ipath_devdata *);	void (*ipath_f_clear_tids)(struct ipath_devdata *, unsigned);	void (*ipath_f_put_tid)(struct ipath_devdata *, u64 __iomem*,				u32, unsigned long);	void (*ipath_f_tidtemplate)(struct ipath_devdata *);	void (*ipath_f_cleanup)(struct ipath_devdata *);	void (*ipath_f_setextled)(struct ipath_devdata *, u64, u64);	/* fill out chip-specific fields */	int (*ipath_f_get_base_info)(struct ipath_portdata *, void *);	/* free irq */	void (*ipath_f_free_irq)(struct ipath_devdata *);	struct ipath_ibdev *verbs_dev;	struct timer_list verbs_timer;	/* total dwords sent (summed from counter) */	u64 ipath_sword;	/* total dwords rcvd (summed from counter) */	u64 ipath_rword;	/* total packets sent (summed from counter) */	u64 ipath_spkts;	/* total packets rcvd (summed from counter) */	u64 ipath_rpkts;	/* ipath_statusp initially points to this. */	u64 _ipath_status;	/* GUID for this interface, in network order */	__be64 ipath_guid;	/*	 * aggregrate of error bits reported since last cleared, for	 * limiting of error reporting	 */	ipath_err_t ipath_lasterror;	/*	 * aggregrate of error bits reported since last cleared, for	 * limiting of hwerror reporting	 */	ipath_err_t ipath_lasthwerror;	/* errors masked because they occur too fast */	ipath_err_t ipath_maskederrs;	/* time in jiffies at which to re-enable maskederrs */	unsigned long ipath_unmasktime;	/* count of egrfull errors, combined for all ports */	u64 ipath_last_tidfull;	/* for ipath_qcheck() */	u64 ipath_lastport0rcv_cnt;	/* template for writing TIDs  */	u64 ipath_tidtemplate;	/* value to write to free TIDs */	u64 ipath_tidinvalid;	/* IBA6120 rcv interrupt setup */	u64 ipath_rhdrhead_intr_off;	/* size of memory at ipath_kregbase */	u32 ipath_kregsize;	/* number of registers used for pioavail */	u32 ipath_pioavregs;	/* IPATH_POLL, etc. */	u32 ipath_flags;	/* ipath_flags driver is waiting for */	u32 ipath_state_wanted;	/* last buffer for user use, first buf for kernel use is this	 * index. */	u32 ipath_lastport_piobuf;	/* is a stats timer active */	u32 ipath_stats_timer_active;	/* number of interrupts for this device -- saturates... */	u32 ipath_int_counter;	/* dwords sent read from counter */	u32 ipath_lastsword;	/* dwords received read from counter */	u32 ipath_lastrword;	/* sent packets read from counter */	u32 ipath_lastspkts;	/* received packets read from counter */	u32 ipath_lastrpkts;	/* pio bufs allocated per port */	u32 ipath_pbufsport;	/*	 * number of ports configured as max; zero is set to number chip	 * supports, less gives more pio bufs/port, etc.	 */	u32 ipath_cfgports;	/* port0 rcvhdrq head offset */	u32 ipath_port0head;	/* count of port 0 hdrqfull errors */	u32 ipath_p0_hdrqfull;	/*	 * (*cfgports) used to suppress multiple instances of same	 * port staying stuck at same point	 */	u32 *ipath_lastrcvhdrqtails;	/*	 * (*cfgports) used to suppress multiple instances of same	 * port staying stuck at same point	 */	u32 *ipath_lastegrheads;	/*	 * index of last piobuffer we used.  Speeds up searching, by	 * starting at this point.  Doesn't matter if multiple cpu's use and	 * update, last updater is only write that matters.  Whenever it	 * wraps, we update shadow copies.  Need a copy per device when we	 * get to multiple devices	 */	u32 ipath_lastpioindex;	/* max length of freezemsg */	u32 ipath_freezelen;	/*	 * consecutive times we wanted a PIO buffer but were unable to	 * get one	 */	u32 ipath_consec_nopiobuf;	/*

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?