📄 ah_os.c.svn-base
字号:
(v & AR5K_AR5212_PIMR_RXDESC ? " RXDESC" : ""), (v & AR5K_AR5212_PIMR_RXERR ? " RXERR" : ""), (v & AR5K_AR5212_PIMR_RXNOFRM ? " RXNOFRM" : ""), (v & AR5K_AR5212_PIMR_RXEOL ? " RXEOL" : ""), (v & AR5K_AR5212_PIMR_RXORN ? " RXORN" : ""), (v & AR5K_AR5212_PIMR_TXOK ? " TXOK" : ""), (v & AR5K_AR5212_PIMR_TXDESC ? " TXDESC" : ""), (v & AR5K_AR5212_PIMR_TXERR ? " TXERR" : ""), (v & AR5K_AR5212_PIMR_TXNOFRM ? " TXNOFRM" : ""), (v & AR5K_AR5212_PIMR_TXEOL ? " TXEOL" : ""), (v & AR5K_AR5212_PIMR_TXURN ? " TXURN" : ""), (v & AR5K_AR5212_PIMR_MIB ? " MIB" : ""), (v & AR5K_AR5212_PIMR_SWI ? " SWI" : ""), (v & AR5K_AR5212_PIMR_RXPHY ? " RXPHY" : ""), (v & AR5K_AR5212_PIMR_RXKCM ? " RXKCM" : ""), (v & AR5K_AR5212_PIMR_SWBA ? " SWBA" : ""), (v & AR5K_AR5212_PIMR_BRSSI ? " BRSSI" : ""), (v & AR5K_AR5212_PIMR_BMISS ? " BMISS" : ""), (v & AR5K_AR5212_PIMR_HIUERR ? " HIUERR" : ""), (v & AR5K_AR5212_PIMR_BNR ? " BNR" : ""), (v & AR5K_AR5212_PIMR_RXCHIRP ? " RXCHIRP" : ""), (v & AR5K_AR5212_PIMR_TIM ? " TIM" : ""), (v & AR5K_AR5212_PIMR_BCNMISC ? " BCNMISC" : ""), (v & AR5K_AR5212_PIMR_GPIO ? " GPIO" : ""), (v & AR5K_AR5212_PIMR_QCBRORN ? " QCBRORN" : ""), (v & AR5K_AR5212_PIMR_QCBRURN ? " QCBRURN" : ""), (v & AR5K_AR5212_PIMR_QTRIG ? " QTRIG" : ""), (ath_hal_func ?: "unknown") ); }#undef AR5K_AR5212_PHY_ERR_FIL#undef AR5K_AR5212_PHY_ERR_FIL_RADAR#undef AR5K_AR5212_PHY_ERR_FIL_OFDM#undef AR5K_AR5212_PHY_ERR_FIL_CCK#undef AR5K_AR5212_PIMR#undef AR5K_AR5212_PISR#undef AR5K_AR5212_PIMR_RXOK#undef AR5K_AR5212_PIMR_RXDESC#undef AR5K_AR5212_PIMR_RXERR#undef AR5K_AR5212_PIMR_RXNOFRM#undef AR5K_AR5212_PIMR_RXEOL#undef AR5K_AR5212_PIMR_RXORN#undef AR5K_AR5212_PIMR_TXOK#undef AR5K_AR5212_PIMR_TXDESC#undef AR5K_AR5212_PIMR_TXERR#undef AR5K_AR5212_PIMR_TXNOFRM#undef AR5K_AR5212_PIMR_TXEOL#undef AR5K_AR5212_PIMR_TXURN#undef AR5K_AR5212_PIMR_MIB#undef AR5K_AR5212_PIMR_SWI#undef AR5K_AR5212_PIMR_RXPHY#undef AR5K_AR5212_PIMR_RXKCM#undef AR5K_AR5212_PIMR_SWBA#undef AR5K_AR5212_PIMR_BRSSI#undef AR5K_AR5212_PIMR_BMISS#undef AR5K_AR5212_PIMR_HIUERR#undef AR5K_AR5212_PIMR_BNR#undef AR5K_AR5212_PIMR_RXCHIRP#undef AR5K_AR5212_PIMR_TIM#undef AR5K_AR5212_PIMR_BCNMISC#undef AR5K_AR5212_PIMR_GPIO#undef AR5K_AR5212_PIMR_QCBRORN#undef AR5K_AR5212_PIMR_QCBRURN#undef AR5K_AR5212_PIMR_QTRIG}/* Print out a single register name/address/value in hex and binary */static inline void_print_decoded_register(struct ath_hal *ah, const char *device_name, HAL_BOOL prefer_alq, int regop, u_int32_t address, u_int32_t oldval, u_int32_t newval, HAL_BOOL verbose){ _print_decoded_register_delta(ah, device_name, prefer_alq, regop, address, oldval, newval, verbose); _print_decoded_register_bitfields(ah, device_name, prefer_alq, regop, address, oldval, newval, verbose);}/* Print out a single register name/address/value in hex and binary */static inline void_print_undecoded_register(struct ath_hal *ah, const char *device_name, HAL_BOOL prefer_alq, int regop, u_int32_t address, u_int32_t newval){ ath_hal_printf(ah, prefer_alq, "%s%s%s0x%05x = 0x%08x - %s\n", device_name ? device_name : "", device_name ? ":" : "", (regop == REGOP_READ ? "R:" : (regop == REGOP_WRITE ? "W:" : "")), address, newval, (ath_hal_func ?: "unknown") );}/* Print out a single register name/address/value in hex and binary */voidath_hal_print_decoded_register(struct ath_hal *ah, const char *device_name, u_int32_t address, u_int32_t oldval, u_int32_t newval, HAL_BOOL bitfields){ _print_decoded_register(ah, device_name, AH_FALSE /* don't use alq */, REGOP_NONE, address, oldval, newval, bitfields);}EXPORT_SYMBOL(ath_hal_print_decoded_register);/* Print out a single register in simple undecoded form */voidath_hal_print_register(struct ath_hal *ah, const char *device_name, u_int32_t address, u_int32_t newval){ _print_undecoded_register(ah, device_name, AH_FALSE /* don't use alq */, REGOP_NONE, address, newval);}EXPORT_SYMBOL(ath_hal_print_register);static inline void _trace_regop(struct ath_hal *ah, int regop, u_int address, u_int32_t value){#ifdef AH_DEBUG switch (ath_hal_debug) { case HAL_DEBUG_OFF: break; case HAL_DEBUG_REGOPS: /* XXX: Identify wifiX */ _print_undecoded_register(ah, ath_hal_device, AH_TRUE /* prefer alq */, regop, address, value); break; default: /* XXX: Identify wifiX */ _print_decoded_register(ah, ath_hal_device, AH_TRUE /* prefer alq */, regop, address, ((regop == REGOP_WRITE && ath_hal_debug >= HAL_DEBUG_REGOPS_DELTAS) ? _OS_REG_READ(ah, address) : value), value, (ath_hal_debug >= HAL_DEBUG_REGOPS_BITFIELDS)); break; }#endif /* AH_DEBUG */}#if defined(AH_DEBUG) || defined(AH_REGOPS_FUNC) || defined(AH_DEBUG_ALQ)/* * Memory-mapped device register read/write. These are here * as routines when debugging support is enabled and/or when * explicitly configured to use function calls. The latter is * for architectures that might need to do something before * referencing memory (e.g. remap an i/o window). * * This should only be called while holding the lock, sc->sc_hal_lock. * * NB: see the comments in ah_osdep.h about byte-swapping register * reads and writes to understand what's going on below. */void __ahdeclath_hal_reg_write(struct ath_hal *ah, u_int address, u_int32_t value){ _trace_regop(ah, REGOP_WRITE, address, value); _OS_REG_WRITE(ah, address, value);}EXPORT_SYMBOL(ath_hal_reg_write);/* This should only be called while holding the lock, sc->sc_hal_lock. */u_int32_t __ahdeclath_hal_reg_read(struct ath_hal *ah, u_int address){ u_int32_t val = _OS_REG_READ(ah, address); _trace_regop(ah, REGOP_READ, address, val); return val;}EXPORT_SYMBOL(ath_hal_reg_read);#endif/* * Delay n microseconds. */void __ahdeclath_hal_delay(int n){ udelay(n);}/* * Allocate/free memory. */void * __ahdeclath_hal_malloc(size_t size){ return kzalloc(size, GFP_KERNEL);}void __ahdeclath_hal_free(void *p){ kfree(p);}void __ahdeclath_hal_memzero(void *dst, size_t n){ memset(dst, 0, n);}EXPORT_SYMBOL(ath_hal_memzero);void * __ahdeclath_hal_memcpy(void *dst, const void *src, size_t n){ return memcpy(dst, src, n);}EXPORT_SYMBOL(ath_hal_memcpy);int __ahdeclath_hal_memcmp(const void *a, const void *b, size_t n){ return memcmp(a, b, n);}EXPORT_SYMBOL(ath_hal_memcmp);static ctl_table ath_hal_sysctls[] = {#ifdef AH_DEBUG { .ctl_name = CTL_AUTO, .procname = "debug", .mode = 0644, .data = &ath_hal_debug, .maxlen = sizeof(ath_hal_debug), .proc_handler = proc_dointvec },#endif /* AH_DEBUG */ { .ctl_name = CTL_AUTO, .procname = "dma_beacon_response_time", .data = &ath_hal_dma_beacon_response_time, .maxlen = sizeof(ath_hal_dma_beacon_response_time), .mode = 0644, .proc_handler = proc_dointvec }, { .ctl_name = CTL_AUTO, .procname = "sw_beacon_response_time", .mode = 0644, .data = &ath_hal_sw_beacon_response_time, .maxlen = sizeof(ath_hal_sw_beacon_response_time), .proc_handler = proc_dointvec }, { .ctl_name = CTL_AUTO, .procname = "swba_backoff", .mode = 0644, .data = &ath_hal_additional_swba_backoff, .maxlen = sizeof(ath_hal_additional_swba_backoff), .proc_handler = proc_dointvec },#ifdef AH_DEBUG_ALQ { .ctl_name = CTL_AUTO, .procname = "alq", .mode = 0644, .proc_handler = sysctl_hw_ath_hal_log }, { .ctl_name = CTL_AUTO, .procname = "alq_size", .mode = 0644, .data = &ath_hal_alq_qsize, .maxlen = sizeof(ath_hal_alq_qsize), .proc_handler = proc_dointvec }, { .ctl_name = CTL_AUTO, .procname = "alq_lost", .mode = 0644, .data = &ath_hal_alq_lost, .maxlen = sizeof(ath_hal_alq_lost), .proc_handler = proc_dointvec },#endif /* AH_DEBUG_ALQ */ { 0 }};static ctl_table ath_hal_table[] = { { .ctl_name = CTL_AUTO, .procname = "hal", .mode = 0555, .child = ath_hal_sysctls }, { 0 }};static ctl_table ath_ath_table[] = { { .ctl_name = DEV_ATH, .procname = "ath", .mode = 0555, .child = ath_hal_table }, { 0 }};static ctl_table ath_root_table[] = { { .ctl_name = CTL_DEV, .procname = "dev", .mode = 0555, .child = ath_ath_table }, { 0 }};static struct ctl_table_header *ath_hal_sysctl_header;static voidath_hal_sysctl_register(void){ static int initialized = 0; if (!initialized) { ath_hal_sysctl_header = ATH_REGISTER_SYSCTL_TABLE(ath_root_table); initialized = 1; }}static voidath_hal_sysctl_unregister(void){ if (ath_hal_sysctl_header) unregister_sysctl_table(ath_hal_sysctl_header);}/* * Module glue. */#if 0static char *dev_info = "ath_hal";#endifMODULE_AUTHOR("Errno Consulting, Sam Leffler");MODULE_DESCRIPTION("Atheros Hardware Access Layer (HAL)");MODULE_SUPPORTED_DEVICE("Atheros WLAN devices");#ifdef MODULE_LICENSEMODULE_LICENSE("Dual BSD/GPL");#endifEXPORT_SYMBOL(ath_hal_probe);EXPORT_SYMBOL(_ath_hal_attach);EXPORT_SYMBOL(_ath_hal_detach);EXPORT_SYMBOL(ath_hal_init_channels);EXPORT_SYMBOL(ath_hal_getwirelessmodes);EXPORT_SYMBOL(ath_hal_computetxtime);EXPORT_SYMBOL(ath_hal_mhz2ieee);EXPORT_SYMBOL(ath_hal_process_noisefloor);#ifdef MMIOTRACEextern void (*kmmio_logmsg)(struct ath_hal *ah, u8 write, u_int address, u_int32_t val);void _trace_regop(struct ath_hal *ah, int regop, u_int address, u_int32_t newval);static void _kmmio_logmsg(struct ath_hal *ah, u8 write, u_int address, u_int32_t val) { _trace_regop(ah, write ? REGOP_WRITE : REGOP_READ, address, val);}#endif /* MMIOTRACE */static int __initinit_ath_hal(void){#ifdef MMIOTRACE kmmio_logmsg = _kmmio_logmsg;#endif ath_hal_sysctl_register(); return (0);}module_init(init_ath_hal);static void __exitexit_ath_hal(void){#ifdef MMIOTRACE kmmio_logmsg = NULL;#endif ath_hal_sysctl_unregister();}module_exit(exit_ath_hal);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -