📄 qdio.h
字号:
#ifndef _CIO_QDIO_H#define _CIO_QDIO_H#include <asm/page.h>#define VERSION_CIO_QDIO_H "$Revision: 1.33 $"#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_siga_sync(unsigned int irq, unsigned int mask1, unsigned int mask2){ int cc;#ifndef CONFIG_ARCH_S390X 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" (0x10000|irq), "d" (mask1), "d" (mask2) : "cc", "0", "1", "2", "3" );#else /* CONFIG_ARCH_S390X */ 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" "srl %0,28 \n\t" : "=d" (cc) : "d" (0x10000|irq), "d" (mask1), "d" (mask2) : "cc", "0", "1", "2", "3" );#endif /* CONFIG_ARCH_S390X */ return cc;}static inline intdo_siga_input(unsigned int irq, unsigned int mask){ int cc;#ifndef CONFIG_ARCH_S390X asm volatile ( "lhi 0,1 \n\t" "lr 1,%1 \n\t" "lr 2,%2 \n\t" "siga 0 \n\t" "ipm %0 \n\t" "srl %0,28 \n\t" : "=d" (cc) : "d" (0x10000|irq), "d" (mask) : "cc", "0", "1", "2", "memory" );#else /* CONFIG_ARCH_S390X */ asm volatile ( "lghi 0,1 \n\t" "llgfr 1,%1 \n\t" "llgfr 2,%2 \n\t" "siga 0 \n\t" "ipm %0 \n\t"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -