120 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * This is part of the Sequans SQN1130 driver.
 | |
|  * Copyright 2008 SEQUANS Communications
 | |
|  * Written by Andy Shevchenko <andy@smile.org.ua>,
 | |
|  *            Dmitriy Chumak <chumakd@gmail.com>
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation; either version 2 of the License, or (at
 | |
|  * your option) any later version.
 | |
|  */
 | |
| 
 | |
| #ifndef _SQN_MSG_H
 | |
| #define _SQN_MSG_H
 | |
| 
 | |
| #include <linux/kernel.h>
 | |
| #include <linux/sched.h>
 | |
| #include <linux/string.h>
 | |
| 
 | |
| #include "version.h"
 | |
| 
 | |
| 
 | |
| #define sqn_pr(level, fmt, arg...)			\
 | |
| do {							\
 | |
| 	char kthread_name[TASK_COMM_LEN] = { 0 };	\
 | |
| 	/* task_lock(current); */			\
 | |
| 	strncpy(kthread_name, current->comm		\
 | |
| 		, sizeof(current->comm));		\
 | |
| 	/* task_unlock(current); */			\
 | |
| 	printk(level "%s: %s: %s: " fmt			\
 | |
| 	       , SQN_MODULE_NAME, kthread_name		\
 | |
| 	       , __func__				\
 | |
| 	       , ##arg);				\
 | |
| } while (0)
 | |
| 
 | |
| 
 | |
| #if defined(DEBUG)
 | |
| 
 | |
| #ifdef	SQN_DEBUG_LEVEL_INFO
 | |
| #define DEBUG_LEVEL	KERN_INFO
 | |
| #else
 | |
| #define DEBUG_LEVEL	KERN_DEBUG
 | |
| #endif
 | |
| 
 | |
| #define sqn_pr_dbg(fmt, arg...)  sqn_pr(DEBUG_LEVEL, fmt, ##arg)
 | |
| 
 | |
| #ifdef SQN_DEBUG_DUMP
 | |
| 
 | |
| #define sqn_pr_dbg_dump(prefix, data, len)			\
 | |
| do {								\
 | |
| 	unsigned int i = 0;					\
 | |
| 	unsigned int width = 16;				\
 | |
| 	unsigned int len_ = (unsigned int)(len);		\
 | |
| 	while (i < len_) {					\
 | |
| 		if (i % width == 0)				\
 | |
| 			printk(DEBUG_LEVEL "%s: %s: %04x ",	\
 | |
| 			       SQN_MODULE_NAME, (prefix), i);	\
 | |
| 		printk("%02x ", ((unsigned char *)(data))[i++]);\
 | |
| 		if ((i % width == 0) || (i == len_))		\
 | |
| 			printk("\n");				\
 | |
| 	}							\
 | |
| } while (0)
 | |
| 
 | |
| #else /* !SQN_DEBUG_DUMP */
 | |
| 
 | |
| #define sqn_pr_dbg_dump(prefix, data, len)	do {} while (0)
 | |
| 
 | |
| #endif /* SQN_DEBUG_DUMP */
 | |
| 
 | |
| #ifdef SQN_DEBUG_TRACE
 | |
| 
 | |
| #define sqn_pr_enter()	sqn_pr_dbg("%s\n", "enter")
 | |
| #define sqn_pr_leave()	sqn_pr_dbg("%s\n", "leave")
 | |
| 
 | |
| #else /* !SQN_DEBUG_TRACE */
 | |
| 
 | |
| #define sqn_pr_enter()	do {} while (0)
 | |
| #define sqn_pr_leave()	do {} while (0)
 | |
| 
 | |
| #endif /* SQN_DEBUG_TRACE */
 | |
| 
 | |
| #else /* !DEBUG */
 | |
| 
 | |
| #define sqn_pr_dbg(fmt, arg...)			do {} while (0)
 | |
| #define sqn_pr_dbg_dump(prefix, data, len)	do {} while (0)
 | |
| 
 | |
| #define sqn_pr_enter()	do {} while (0)
 | |
| #define sqn_pr_leave()	do {} while (0)
 | |
| 
 | |
| #endif /* DEBUG */
 | |
| 
 | |
| 
 | |
| #define sqn_pr_info(fmt, arg...)				\
 | |
| 	pr_info("%s: " fmt, SQN_MODULE_NAME, ##arg)
 | |
| 
 | |
| #define sqn_pr_warn(fmt, arg...)				\
 | |
| 	pr_warning("%s: " fmt, SQN_MODULE_NAME, ##arg)
 | |
| 
 | |
| #define sqn_pr_err(fmt, arg...)					\
 | |
| 	pr_err("%s: " fmt, SQN_MODULE_NAME, ##arg)
 | |
| 
 | |
| 
 | |
| #define sqn_pr_info_dump(prefix, data, len)			\
 | |
| do {								\
 | |
| 	unsigned int i = 0;					\
 | |
| 	unsigned int width = 16;				\
 | |
| 	unsigned int len_ = (unsigned int)(len);		\
 | |
| 	while (i < len_) {					\
 | |
| 		if (i % width == 0)				\
 | |
| 			printk(KERN_INFO "%s: %s: %04x ",	\
 | |
| 			       SQN_MODULE_NAME, (prefix), i);	\
 | |
| 		printk("%02x ", ((unsigned char *)(data))[i++]);\
 | |
| 		if ((i % width == 0) || (i == len_))		\
 | |
| 			printk("\n");				\
 | |
| 	}							\
 | |
| } while (0)
 | |
| 
 | |
| 
 | |
| #endif /* _SQN_MSG_H */
 |