📄 ul_hdep.h
字号:
#define uld_kwt_confirm(udrv) \ uld_atomic_clear_dfl(udrv,ASK_ISR) #define uld_kwt_test_and_set_prepared(udrv) \ uld_test_and_set_dfl(udrv,KWTRUN) #define uld_kwt_kill(udrv) \ do { uld_atomic_set_dfl(udrv,KWTKILL); \ uld_atomic_set_dfl(udrv,ASK_ISR); wake_up(&(udrv)->kwt_wq); } while(0) #define uld_kwt_set_stopped(udrv) \ do { uld_atomic_clear_dfl(udrv,KWTRUN); wake_up(&(udrv)->kwt_wq); } while(0) #define uld_kwt_wait_stopped(udrv) \ wait_event(udrv->kwt_wq, !uld_test_dfl(udrv,KWTRUN)) #define uld_kwt_is_running(udrv) \ uld_test_dfl(udrv,KWTRUN) #elif defined(_WIN32) /* must be used only at IRQL >= DISPATCH_LEVEL */ #define SCHEDULE_BH(udrv) \ do{ \ (udrv)->flag_ASK_BOTTOM=1; \ KeInsertQueueDpc(&(udrv)->bottom_dpc,NULL,NULL); \ }while(0) #define INIT_UDRV_BH(udrv) /* not used search Dpc */ #define KILL_UDRV_BH(udrv) #define DECLARE_UDRV_BH /* not used search for Dpc */ PIRP xch_pending_irp(PIRP *irp_ptr, PIRP new_irp); /* for user app waitting */ void wake_and_xch_pending_irp(PIRP *irp_ptr, PIRP new_irp, NTSTATUS status); #define uld_test_dfl(udrv,_DFL_flag) \ ((udrv)->flag_##_DFL_flag) #define uld_set_dfl(udrv,_DFL_flag) \ ((udrv)->flag_##_DFL_flag=1) #define uld_clear_dfl(udrv,_DFL_flag) \ ((udrv)->flag_##_DFL_flag=0) #define uld_test_and_set_dfl(udrv,_DFL_flag) \ (InterlockedExchange(&(udrv)->flag_##_DFL_flag,1)) #define uld_atomic_test_dfl(udrv,_DFL_flag) \ ((udrv)->flag_##_DFL_flag) #define uld_atomic_clear_dfl(udrv,_DFL_flag) \ (InterlockedExchange(&(udrv)->flag_##_DFL_flag,0)) #define uld_atomic_set_dfl(udrv,_DFL_flag) \ (InterlockedExchange(&(udrv)->flag_##_DFL_flag,1)) #define uld_kwt_wq_init(udrv) \ do { \ KeInitializeEvent( &(udrv)->kwt_wake, NotificationEvent, FALSE); \ KeInitializeEvent( &(udrv)->kwt_stopped, NotificationEvent, TRUE); \ uld_atomic_clear_dfl(udrv,KWTKILL); \ } while(0) #define uld_kwt_wake(udrv) \ KeSetEvent( &(udrv)->kwt_wake, 1, FALSE) #define uld_kwt_wait(udrv) \ KeWaitForSingleObject( &(udrv)->kwt_wake, Executive, KernelMode, FALSE, NULL) #define uld_kwt_confirm(udrv) \ KeClearEvent(&(udrv)->kwt_wake) #define uld_kwt_test_and_set_prepared(udrv) \ (!KeResetEvent(&(udrv)->kwt_stopped)) #define uld_kwt_kill(udrv) \ do { uld_atomic_set_dfl(udrv,KWTKILL); \ KeSetEvent( &(udrv)->kwt_wake, 1, FALSE); } while(0) #define uld_kwt_set_stopped(udrv) \ do { uld_atomic_clear_dfl(udrv,KWTKILL); \ KeSetEvent( &(udrv)->kwt_stopped, 1, FALSE) ; } while(0) #define uld_kwt_wait_stopped(udrv) \ KeWaitForSingleObject( &(udrv)->kwt_stopped, Executive, KernelMode, FALSE, NULL) /* KeReadStateEvent cannot be used on Win98 */ //#define uld_kwt_is_running(udrv) (!KeReadStateEvent(&(udrv)->kwt_stopped)) #define uld_kwt_is_running(udrv) \ (STATUS_SUCCESS != KeWaitForSingleObject( &(udrv)->kwt_stopped, Executive, KernelMode, FALSE, &ULD_LARGE_INTEGER_0)) // This variable has to be initialized by RtlConvertLongToLargeInteger(0) in DriverEntry extern LARGE_INTEGER ULD_LARGE_INTEGER_0;#else typedef void * ulan_do_bh_data_type; #define SCHEDULE_BH(udrv) \ do{set_bit(UL_DFLB_ASK_BOTTOM,&(udrv->flags));}while(0) #define INIT_UDRV_BH(udrv) #define KILL_UDRV_BH(udrv) #define DECLARE_UDRV_BH #define uld_test_dfl(udrv,_DFL_flag) \ test_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags) #define uld_set_dfl(udrv,_DFL_flag) \ set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags) #define uld_clear_dfl(udrv,_DFL_flag) \ clear_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags) #define uld_test_and_set_dfl(udrv,_DFL_flag) \ test_and_set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags) #define uld_atomic_test_dfl(udrv,_DFL_flag) \ test_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags) #define uld_atomic_clear_dfl(udrv,_DFL_flag) \ clear_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags) #define uld_atomic_set_dfl(udrv,_DFL_flag) \ set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)#endif/* link watchdog timer definitions */#ifdef FOR_LINUX_KERNEL void ulan_do_wd_timer(unsigned long data); #define SCHEDULE_UDRV_WDTIM(udrv,expires) \ mod_timer(&(udrv)->wd_timer,expires); #define INIT_UDRV_WDTIM(udrv) \ do{ \ init_timer(&(udrv)->wd_timer); \ (udrv)->wd_timer.function=ulan_do_wd_timer; \ (udrv)->wd_timer.data=(unsigned long)udrv; \ }while(0) #define DONE_UDRV_WDTIM(udrv) \ del_timer(&(udrv)->wd_timer) #define DECLARE_UDRV_WDTIM struct timer_list wd_timer#elif defined(_WIN32) #define SCHEDULE_UDRV_WDTIM(udrv,expires) #define INIT_UDRV_WDTIM(udrv) #define DONE_UDRV_WDTIM(udrv) #define DECLARE_UDRV_WDTIM#else #define SCHEDULE_UDRV_WDTIM(udrv,expires) \ (udrv->wd_timer_expires=expires,\ set_bit(UL_DFLB_WDSCHED,&(udrv->flags))) #define INIT_UDRV_WDTIM(udrv) \ (clear_bit(UL_DFLB_WDSCHED,&(udrv->flags))) #define DONE_UDRV_WDTIM(udrv) \ (clear_bit(UL_DFLB_WDSCHED,&(udrv->flags))) #define DECLARE_UDRV_WDTIM#endif/* compatible generic io-ports access */#ifdef _WIN32 #define ul_inb(port) READ_PORT_UCHAR((PVOID)(port)) #define ul_outb(port,val) WRITE_PORT_UCHAR((PVOID)(port),val)#elif defined(__DJGPP__) #include <pc.h> #define ul_inb(port) inportb(port) #define ul_outb(port,val) outportb(port,val)#elif defined(CONFIG_OC_UL_DRV_SYSLESS) #define ul_inb(port) inb(port) #define ul_outb(port,val) outb(port,val)#else #define ul_inb(port) inb(port) #define ul_outb(port,val) outb(val,port)#endif/*******************************************************************//* PCI support types */#if !defined(FOR_LINUX_KERNEL) && defined(UL_WITH_PCI)#ifndef PCI_ANY_ID#define PCI_ANY_ID 0xfffftypedef struct pci_device_id { USHORT vendor; USHORT device; USHORT subvendor; USHORT subdevice; USHORT class_val,clask_mask; ULONG driver_data;} pci_device_id_t;#endif /*PCI_ANY_ID*/typedef struct usb_device_id { USHORT idVendor; USHORT idProduct; ULONG driver_info;} usb_device_id_t; #endif /*!FOR_LINUX_KERNEL && UL_WITH_PCI*//*******************************************************************//* ulan file access structure */#define ULOP_MAGIC 0x754c2233struct ul_opchain;/* uLan driver operator/user structure pointed by file private/extension */typedef struct ul_opdata { int magic; /* magic number */ ul_drv *udrv; /* uLan driver pointer */ struct ul_opdata *opnext, *opprew; /* per udrv clients bll */ #ifdef FOR_LINUX_KERNEL struct file *file; /* back ptr to file */ #elif defined(_WIN32) PFILE_OBJECT file; PIRP wait_irp; /* IRP waitting for nonempty recchain */ #endif /* _WIN32 */ ul_mem_blk *message; /* first block of prepared message */ ul_data_it data; /* ul_mem_blk data iterator */ #ifdef FOR_LINUX_KERNEL wait_queue_head_t wqrec; /* wait queue for received packet */ #endif struct ul_opchain *recchain; /* received messages */ struct ul_opchain *filtchain; /* filter for incoming messages */} ul_opdata;/* list of filtered mesage types also used for per operator receive queue */typedef struct ul_opchain { struct ul_opchain *next; /* Cyklic BLL of received mesages */ struct ul_opchain *prev; /* or input filters */ ul_mem_blk *message; /* first block of waiting message */ unsigned stamp; /* unigue message number */ uchar cmd; /* command or service */ uchar dadr; /* destination address */ uchar sadr; /* source address */ uchar state; /* state of filtering */} ul_opchain;#define UL_OPST_FREE 0 /* free ul_opchain block */#define UL_OPST_ONCE 1 /* wait for message only once */#define UL_OPST_FILT 2 /* filter incomming messages */#define UL_OPST_MES 3 /* message on recchain list */#define UL_OPST_FILTNEW 4 /* new filter check for repeat */typedef int ul_chip_init_fnc(ul_drv *udrv, int port, int irq, int baud, long baudbase, int options);typedef struct ul_chip_type_ent { char *chip_name; ul_chip_init_fnc *chip_init; int chip_flags; int chip_chans; int chip_options;}ul_chip_type_ent;#define UL_CHIPT_RQPORT 1 /* port number requested */#define UL_CHIPT_RQIRQ 2 /* irq umber requested */#define UL_CHIPT_PCI 4 /* pci type */#define UL_CHIPT_NOPROBE 8 /* do not probe if type undefined *//*******************************************************************//* user space visible structures */typedef struct ul_msginfo { int dadr; /* destignation address */ int sadr; /* source address */ int cmd; /* command/socket number */ int flg; /* message flags */ int len; /* length of frame */ unsigned stamp; /* unigue message number */} ul_msginfo;/*******************************************************************//* ioctl definitions */#ifdef _WIN32/* 32768-65535 are reserved for use by customers.*/#define FILE_DEVICE_ULAN 0x0000A000/* function codes 2048-4095 are reserved for customers. */#define UL_IOCTL_INDEX 0xA00#define UL_IO(function) \ CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)#define UL_IOR(function,size) \ CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)#define UL_IOW(function,size) \ CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)#else /* _WIN32 */#define UL_IOCTL 0x75#define UL_IO(function) _IO(UL_IOCTL,function)#define UL_IOR(function,size) _IOR(UL_IOCTL,function,size)#define UL_IOW(function,size) _IOW(UL_IOCTL,function,size)#endif /* _WIN32 */#define UL_DRV_VER UL_IO(0x10)#define UL_NEWMSG UL_IOW(0x11,ul_msginfo)#define UL_TAILMSG UL_IOW(0x12,ul_msginfo)#define UL_FREEMSG UL_IO(0x13)#define UL_ACCEPTMSG UL_IOR(0x14,ul_msginfo)#define UL_ACTAILMSG UL_IOR(0x15,ul_msginfo)#define UL_ADDFILT UL_IOW(0x16,ul_msginfo)#define UL_ABORTMSG UL_IO(0x17)#define UL_REWMSG UL_IO(0x18)#define UL_INEPOLL UL_IO(0x19)#define UL_WAITREC UL_IO(0x1A)#define UL_SETMYADR UL_IO(0x1B) /* arg = new station address */#define UL_SETIDSTR UL_IO(0x1C) /* arg = "C" string */#define UL_KLOGBLL UL_IO(0x41)#define UL_STROKE UL_IO(0x42)#define UL_DEBFLG UL_IO(0x43) /* arg = new debug mask */#define UL_HWTEST UL_IO(0x44) /* arg = test subcommand *//*******************************************************************//* define unix error codes */#ifdef _WIN32#define ENOMEM (-STATUS_NO_MEMORY)#define EPERM (-STATUS_PRIVILEGE_NOT_HELD)#define ENOMSG (-STATUS_END_OF_FILE)#define EINVAL (-STATUS_INVALID_PARAMETER)#define ENODEV (-STATUS_INVALID_PARAMETER)#endif /* _WIN32 */#ifdef __DJGPP__#define ENOMSG ENOENT#endif /* _WIN32 *//*******************************************************************//* debug support *//* initial value for uld_debug_flg */#ifndef ULD_DEBUG_DEFAULT #ifndef UL_DRV_IN_LIB #define ULD_DEBUG_DEFAULT (0x01|0x10|0x40) #else #define ULD_DEBUG_DEFAULT (0x01|0x40) #endif#endif /* ULD_DEBUG_DEFAULT */#ifdef FOR_LINUX_KERNEL #define UL_PRINTF printk#elif defined(_WIN32) #define UL_PRINTF DbgPrint#elif defined(UL_DRV_IN_LIB) #ifdef UL_LOG_ENABLE int uld_printk(const char *format, ...) __attribute__((format(printf,1,2))); void uld_printk_flush(void); #define UL_PRINTF uld_printk #else #define uld_printk_flush(x) #define UL_PRINTF(x,args...) #endif#else #define UL_PRINTF printf#endif#ifdef UL_LOG_ENABLE #define LOG_FATAL if(uld_debug_flg&0x01) UL_PRINTF #define LOG_CHIO if(uld_debug_flg&0x02) UL_PRINTF #define LOG_IRQ if(uld_debug_flg&0x04) UL_PRINTF #define LOG_MESSAGES if(uld_debug_flg&0x08) UL_PRINTF #define LOG_FAILS if(uld_debug_flg&0x10) UL_PRINTF #define LOG_SEQNUM if(uld_debug_flg&0x20) UL_PRINTF #define LOG_PORTS if(uld_debug_flg&0x40) UL_PRINTF #define LOG_FILEIO if(uld_debug_flg&0x80) UL_PRINTF #define LOG_FILTS if(uld_debug_flg&0x100) UL_PRINTF #define LOG_IAC if(uld_debug_flg&0x200) UL_PRINTF #define LOG_MSK_DISABLE 0x10000 /* for use with UL_DRV_IN_LIB */#else #define LOG_FATAL(x,args...) #define LOG_CHIO(x,args...) #define LOG_IRQ(x,args...) #define LOG_MESSAGES(x,args...) #define LOG_FAILS(x,args...) #define LOG_SEQNUM(x,args...) #define LOG_PORTS(x,args...) #define LOG_FILEIO(x,args...) #define LOG_FILTS(x,args...) #define LOG_IAC(x,args...)#endif#ifndef KERN_CRIT #define KERN_CRIT#endif#ifndef KERN_ERR #define KERN_ERR#endif#ifndef KERN_WARNING #define KERN_WARNING#endif#ifndef KERN_INFO #define KERN_INFO#endif#if (defined(CPU)&&(CPU>=586)||\ defined(CONFIG_X86_TSC))&&!defined(_WIN32) #define RDTSC \ ({unsigned long l,h;\ asm volatile ("rdtsc" : "=a" (l), "=d" (h));\ l;\ })#else #define RDTSC 0#endif#endif /* _LINUX_UL_HDEP_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -