qdio.h
来自「LINUX 2.6.17.4的源码」· C头文件 代码 · 共 687 行 · 第 1/2 页
H
687 行
#ifndef _CIO_QDIO_H#define _CIO_QDIO_H#include <asm/page.h>#include "schid.h"#ifdef CONFIG_QDIO_DEBUG#define QDIO_VERBOSE_LEVEL 9#else /* CONFIG_QDIO_DEBUG */#define QDIO_VERBOSE_LEVEL 5#endif /* CONFIG_QDIO_DEBUG */#define QDIO_USE_PROCESSING_STATE#ifdef CONFIG_QDIO_PERF_STATS#define QDIO_PERFORMANCE_STATS#endif /* CONFIG_QDIO_PERF_STATS */#define QDIO_MINIMAL_BH_RELIEF_TIME 16#define QDIO_TIMER_POLL_VALUE 1#define IQDIO_TIMER_POLL_VALUE 1/* * unfortunately this can't be (QDIO_MAX_BUFFERS_PER_Q*4/3) or so -- as * we never know, whether we'll get initiative again, e.g. to give the * transmit skb's back to the stack, however the stack may be waiting for * them... therefore we define 4 as threshold to start polling (which * will stop as soon as the asynchronous queue catches up) * btw, this only applies to the asynchronous HiperSockets queue */#define IQDIO_FILL_LEVEL_TO_POLL 4#define TIQDIO_THININT_ISC 3#define TIQDIO_DELAY_TARGET 0#define QDIO_BUSY_BIT_PATIENCE 100 /* in microsecs */#define QDIO_BUSY_BIT_GIVE_UP 10000000 /* 10 seconds */#define IQDIO_GLOBAL_LAPS 2 /* GLOBAL_LAPS are not used as we */#define IQDIO_GLOBAL_LAPS_INT 1 /* don't global summary */#define IQDIO_LOCAL_LAPS 4#define IQDIO_LOCAL_LAPS_INT 1#define IQDIO_GLOBAL_SUMMARY_CC_MASK 2/*#define IQDIO_IQDC_INT_PARM 0x1234*/#define QDIO_Q_LAPS 5#define QDIO_STORAGE_KEY PAGE_DEFAULT_KEY#define L2_CACHELINE_SIZE 256#define INDICATORS_PER_CACHELINE (L2_CACHELINE_SIZE/sizeof(__u32))#define QDIO_PERF "qdio_perf"/* must be a power of 2 *//*#define QDIO_STATS_NUMBER 4#define QDIO_STATS_CLASSES 2#define QDIO_STATS_COUNT_NEEDED 2*/#define QDIO_NO_USE_COUNT_TIMEOUT (1*HZ) /* wait for 1 sec on each q before exiting without having use_count of the queue to 0 */#define QDIO_ESTABLISH_TIMEOUT (1*HZ)#define QDIO_ACTIVATE_TIMEOUT ((5*HZ)>>10)#define QDIO_CLEANUP_CLEAR_TIMEOUT (20*HZ)#define QDIO_CLEANUP_HALT_TIMEOUT (10*HZ)enum qdio_irq_states { QDIO_IRQ_STATE_INACTIVE, QDIO_IRQ_STATE_ESTABLISHED, QDIO_IRQ_STATE_ACTIVE, QDIO_IRQ_STATE_STOPPED, QDIO_IRQ_STATE_CLEANUP, QDIO_IRQ_STATE_ERR, NR_QDIO_IRQ_STATES,};/* used as intparm in do_IO: */#define QDIO_DOING_SENSEID 0#define QDIO_DOING_ESTABLISH 1#define QDIO_DOING_ACTIVATE 2#define QDIO_DOING_CLEANUP 3/************************* DEBUG FACILITY STUFF *********************/#define QDIO_DBF_HEX(ex,name,level,addr,len) \ do { \ if (ex) \ debug_exception(qdio_dbf_##name,level,(void*)(addr),len); \ else \ debug_event(qdio_dbf_##name,level,(void*)(addr),len); \ } while (0)#define QDIO_DBF_TEXT(ex,name,level,text) \ do { \ if (ex) \ debug_text_exception(qdio_dbf_##name,level,text); \ else \ debug_text_event(qdio_dbf_##name,level,text); \ } while (0)#define QDIO_DBF_HEX0(ex,name,addr,len) QDIO_DBF_HEX(ex,name,0,addr,len)#define QDIO_DBF_HEX1(ex,name,addr,len) QDIO_DBF_HEX(ex,name,1,addr,len)#define QDIO_DBF_HEX2(ex,name,addr,len) QDIO_DBF_HEX(ex,name,2,addr,len)#ifdef CONFIG_QDIO_DEBUG#define QDIO_DBF_HEX3(ex,name,addr,len) QDIO_DBF_HEX(ex,name,3,addr,len)#define QDIO_DBF_HEX4(ex,name,addr,len) QDIO_DBF_HEX(ex,name,4,addr,len)#define QDIO_DBF_HEX5(ex,name,addr,len) QDIO_DBF_HEX(ex,name,5,addr,len)#define QDIO_DBF_HEX6(ex,name,addr,len) QDIO_DBF_HEX(ex,name,6,addr,len)#else /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_HEX3(ex,name,addr,len) do {} while (0)#define QDIO_DBF_HEX4(ex,name,addr,len) do {} while (0)#define QDIO_DBF_HEX5(ex,name,addr,len) do {} while (0)#define QDIO_DBF_HEX6(ex,name,addr,len) do {} while (0)#endif /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_TEXT0(ex,name,text) QDIO_DBF_TEXT(ex,name,0,text)#define QDIO_DBF_TEXT1(ex,name,text) QDIO_DBF_TEXT(ex,name,1,text)#define QDIO_DBF_TEXT2(ex,name,text) QDIO_DBF_TEXT(ex,name,2,text)#ifdef CONFIG_QDIO_DEBUG#define QDIO_DBF_TEXT3(ex,name,text) QDIO_DBF_TEXT(ex,name,3,text)#define QDIO_DBF_TEXT4(ex,name,text) QDIO_DBF_TEXT(ex,name,4,text)#define QDIO_DBF_TEXT5(ex,name,text) QDIO_DBF_TEXT(ex,name,5,text)#define QDIO_DBF_TEXT6(ex,name,text) QDIO_DBF_TEXT(ex,name,6,text)#else /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_TEXT3(ex,name,text) do {} while (0)#define QDIO_DBF_TEXT4(ex,name,text) do {} while (0)#define QDIO_DBF_TEXT5(ex,name,text) do {} while (0)#define QDIO_DBF_TEXT6(ex,name,text) do {} while (0)#endif /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_SETUP_NAME "qdio_setup"#define QDIO_DBF_SETUP_LEN 8#define QDIO_DBF_SETUP_PAGES 4#define QDIO_DBF_SETUP_NR_AREAS 1#ifdef CONFIG_QDIO_DEBUG#define QDIO_DBF_SETUP_LEVEL 6#else /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_SETUP_LEVEL 2#endif /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_SBAL_NAME "qdio_labs" /* sbal */#define QDIO_DBF_SBAL_LEN 256#define QDIO_DBF_SBAL_PAGES 4#define QDIO_DBF_SBAL_NR_AREAS 2#ifdef CONFIG_QDIO_DEBUG#define QDIO_DBF_SBAL_LEVEL 6#else /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_SBAL_LEVEL 2#endif /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_TRACE_NAME "qdio_trace"#define QDIO_DBF_TRACE_LEN 8#define QDIO_DBF_TRACE_NR_AREAS 2#ifdef CONFIG_QDIO_DEBUG#define QDIO_DBF_TRACE_PAGES 16#define QDIO_DBF_TRACE_LEVEL 4 /* -------- could be even more verbose here */#else /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_TRACE_PAGES 4#define QDIO_DBF_TRACE_LEVEL 2#endif /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_SENSE_NAME "qdio_sense"#define QDIO_DBF_SENSE_LEN 64#define QDIO_DBF_SENSE_PAGES 2#define QDIO_DBF_SENSE_NR_AREAS 1#ifdef CONFIG_QDIO_DEBUG#define QDIO_DBF_SENSE_LEVEL 6#else /* CONFIG_QDIO_DEBUG */#define QDIO_DBF_SENSE_LEVEL 2#endif /* CONFIG_QDIO_DEBUG */#ifdef CONFIG_QDIO_DEBUG#define QDIO_TRACE_QTYPE QDIO_ZFCP_QFMT#define QDIO_DBF_SLSB_OUT_NAME "qdio_slsb_out"#define QDIO_DBF_SLSB_OUT_LEN QDIO_MAX_BUFFERS_PER_Q#define QDIO_DBF_SLSB_OUT_PAGES 256#define QDIO_DBF_SLSB_OUT_NR_AREAS 1#define QDIO_DBF_SLSB_OUT_LEVEL 6#define QDIO_DBF_SLSB_IN_NAME "qdio_slsb_in"#define QDIO_DBF_SLSB_IN_LEN QDIO_MAX_BUFFERS_PER_Q#define QDIO_DBF_SLSB_IN_PAGES 256#define QDIO_DBF_SLSB_IN_NR_AREAS 1#define QDIO_DBF_SLSB_IN_LEVEL 6#endif /* CONFIG_QDIO_DEBUG */#define QDIO_PRINTK_HEADER QDIO_NAME ": "#if QDIO_VERBOSE_LEVEL>8#define QDIO_PRINT_STUPID(x...) printk( KERN_DEBUG QDIO_PRINTK_HEADER x)#else#define QDIO_PRINT_STUPID(x...)#endif#if QDIO_VERBOSE_LEVEL>7#define QDIO_PRINT_ALL(x...) printk( QDIO_PRINTK_HEADER x)#else#define QDIO_PRINT_ALL(x...)#endif#if QDIO_VERBOSE_LEVEL>6#define QDIO_PRINT_INFO(x...) printk( QDIO_PRINTK_HEADER x)#else#define QDIO_PRINT_INFO(x...)#endif#if QDIO_VERBOSE_LEVEL>5#define QDIO_PRINT_WARN(x...) printk( QDIO_PRINTK_HEADER x)#else#define QDIO_PRINT_WARN(x...)#endif#if QDIO_VERBOSE_LEVEL>4#define QDIO_PRINT_ERR(x...) printk( QDIO_PRINTK_HEADER x)#else#define QDIO_PRINT_ERR(x...)#endif#if QDIO_VERBOSE_LEVEL>3#define QDIO_PRINT_CRIT(x...) printk( QDIO_PRINTK_HEADER x)#else#define QDIO_PRINT_CRIT(x...)#endif#if QDIO_VERBOSE_LEVEL>2#define QDIO_PRINT_ALERT(x...) printk( QDIO_PRINTK_HEADER x)#else#define QDIO_PRINT_ALERT(x...)#endif#if QDIO_VERBOSE_LEVEL>1#define QDIO_PRINT_EMERG(x...) printk( QDIO_PRINTK_HEADER x)#else#define QDIO_PRINT_EMERG(x...)#endif#define HEXDUMP16(importance,header,ptr) \QDIO_PRINT_##importance(header "%02x %02x %02x %02x " \ "%02x %02x %02x %02x %02x %02x %02x %02x " \ "%02x %02x %02x %02x\n",*(((char*)ptr)), \ *(((char*)ptr)+1),*(((char*)ptr)+2), \ *(((char*)ptr)+3),*(((char*)ptr)+4), \ *(((char*)ptr)+5),*(((char*)ptr)+6), \ *(((char*)ptr)+7),*(((char*)ptr)+8), \ *(((char*)ptr)+9),*(((char*)ptr)+10), \ *(((char*)ptr)+11),*(((char*)ptr)+12), \ *(((char*)ptr)+13),*(((char*)ptr)+14), \ *(((char*)ptr)+15)); \QDIO_PRINT_##importance(header "%02x %02x %02x %02x %02x %02x %02x %02x " \ "%02x %02x %02x %02x %02x %02x %02x %02x\n", \ *(((char*)ptr)+16),*(((char*)ptr)+17), \ *(((char*)ptr)+18),*(((char*)ptr)+19), \ *(((char*)ptr)+20),*(((char*)ptr)+21), \ *(((char*)ptr)+22),*(((char*)ptr)+23), \ *(((char*)ptr)+24),*(((char*)ptr)+25), \ *(((char*)ptr)+26),*(((char*)ptr)+27), \ *(((char*)ptr)+28),*(((char*)ptr)+29), \ *(((char*)ptr)+30),*(((char*)ptr)+31));/****************** END OF DEBUG FACILITY STUFF *********************//* * Some instructions as assembly */static inline intdo_sqbs(unsigned long sch, unsigned char state, int queue, unsigned int *start, unsigned int *count){#ifdef CONFIG_64BIT register unsigned long _ccq asm ("0") = *count; register unsigned long _sch asm ("1") = sch; unsigned long _queuestart = ((unsigned long)queue << 32) | *start; asm volatile ( " .insn rsy,0xeb000000008A,%1,0,0(%2)\n\t" : "+d" (_ccq), "+d" (_queuestart) : "d" ((unsigned long)state), "d" (_sch) : "memory", "cc" ); *count = _ccq & 0xff; *start = _queuestart & 0xff; return (_ccq >> 32) & 0xff;#else return 0;#endif}static inline intdo_eqbs(unsigned long sch, unsigned char *state, int queue, unsigned int *start, unsigned int *count){#ifdef CONFIG_64BIT register unsigned long _ccq asm ("0") = *count; register unsigned long _sch asm ("1") = sch; unsigned long _queuestart = ((unsigned long)queue << 32) | *start; unsigned long _state = 0; asm volatile ( " .insn rrf,0xB99c0000,%1,%2,0,0 \n\t" : "+d" (_ccq), "+d" (_queuestart), "+d" (_state) : "d" (_sch) : "memory", "cc" ); *count = _ccq & 0xff; *start = _queuestart & 0xff; *state = _state & 0xff; return (_ccq >> 32) & 0xff;#else return 0;#endif}static inline intdo_siga_sync(struct subchannel_id schid, unsigned int mask1, unsigned int mask2){ int cc;#ifndef CONFIG_64BIT asm volatile ( "lhi 0,2 \n\t" "lr 1,%1 \n\t" "lr 2,%2 \n\t" "lr 3,%3 \n\t" "siga 0 \n\t" "ipm %0 \n\t" "srl %0,28 \n\t" : "=d" (cc) : "d" (schid), "d" (mask1), "d" (mask2) : "cc", "0", "1", "2", "3" );#else /* CONFIG_64BIT */ asm volatile ( "lghi 0,2 \n\t" "llgfr 1,%1 \n\t" "llgfr 2,%2 \n\t" "llgfr 3,%3 \n\t" "siga 0 \n\t" "ipm %0 \n\t"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?