diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00debug.c')
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00debug.c | 144 | 
1 files changed, 95 insertions, 49 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00debug.c b/drivers/net/wireless/rt2x00/rt2x00debug.c index 64dfb1f6823..90fdb02b55e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00debug.c +++ b/drivers/net/wireless/rt2x00/rt2x00debug.c @@ -13,9 +13,7 @@  	GNU General Public License for more details.  	You should have received a copy of the GNU General Public License -	along with this program; if not, write to the -	Free Software Foundation, Inc., -	59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +	along with this program; if not, see <http://www.gnu.org/licenses/>.   */  /* @@ -63,12 +61,14 @@ struct rt2x00debug_intf {  	 * - driver folder  	 *   - driver file  	 *   - chipset file -	 *   - device flags file +	 *   - device state flags file +	 *   - device capability flags file  	 *   - register folder  	 *     - csr offset/value files  	 *     - eeprom offset/value files  	 *     - bbp offset/value files  	 *     - rf offset/value files +	 *     - rfcsr offset/value files  	 *   - queue folder  	 *     - frame dump file  	 *     - queue stats file @@ -78,6 +78,7 @@ struct rt2x00debug_intf {  	struct dentry *driver_entry;  	struct dentry *chipset_entry;  	struct dentry *dev_flags; +	struct dentry *cap_flags;  	struct dentry *register_folder;  	struct dentry *csr_off_entry;  	struct dentry *csr_val_entry; @@ -87,6 +88,8 @@ struct rt2x00debug_intf {  	struct dentry *bbp_val_entry;  	struct dentry *rf_off_entry;  	struct dentry *rf_val_entry; +	struct dentry *rfcsr_off_entry; +	struct dentry *rfcsr_val_entry;  	struct dentry *queue_folder;  	struct dentry *queue_frame_dump_entry;  	struct dentry *queue_stats_entry; @@ -129,6 +132,7 @@ struct rt2x00debug_intf {  	unsigned int offset_eeprom;  	unsigned int offset_bbp;  	unsigned int offset_rf; +	unsigned int offset_rfcsr;  };  void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev, @@ -168,7 +172,7 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,  	do_gettimeofday(×tamp);  	if (skb_queue_len(&intf->frame_dump_skbqueue) > 20) { -		DEBUG(rt2x00dev, "txrx dump queue length exceeded.\n"); +		rt2x00_dbg(rt2x00dev, "txrx dump queue length exceeded\n");  		return;  	} @@ -179,7 +183,7 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,  	skbcopy = alloc_skb(sizeof(*dump_hdr) + skbdesc->desc_len + data_len,  			    GFP_ATOMIC);  	if (!skbcopy) { -		DEBUG(rt2x00dev, "Failed to copy skb for dump.\n"); +		rt2x00_dbg(rt2x00dev, "Failed to copy skb for dump\n");  		return;  	} @@ -282,7 +286,7 @@ static ssize_t rt2x00debug_read_queue_dump(struct file *file,  	if (retval)  		return retval; -	status = min((size_t)skb->len, length); +	status = min_t(size_t, skb->len, length);  	if (copy_to_user(buf, skb->data, status)) {  		status = -EFAULT;  		goto exit; @@ -339,12 +343,13 @@ static ssize_t rt2x00debug_read_queue_stats(struct file *file,  		return -ENOMEM;  	temp = data + -	    sprintf(data, "qid\tcount\tlimit\tlength\tindex\tdma done\tdone\n"); +	    sprintf(data, "qid\tflags\t\tcount\tlimit\tlength\tindex\tdma done\tdone\n");  	queue_for_each(intf->rt2x00dev, queue) {  		spin_lock_irqsave(&queue->index_lock, irqflags); -		temp += sprintf(temp, "%d\t%d\t%d\t%d\t%d\t%d\t%d\n", queue->qid, +		temp += sprintf(temp, "%d\t0x%.8x\t%d\t%d\t%d\t%d\t%d\t\t%d\n", +				queue->qid, (unsigned int)queue->flags,  				queue->count, queue->limit, queue->length,  				queue->index[Q_INDEX],  				queue->index[Q_INDEX_DMA_DONE], @@ -522,6 +527,7 @@ RT2X00DEBUGFS_OPS(csr, "0x%.8x\n", u32);  RT2X00DEBUGFS_OPS(eeprom, "0x%.4x\n", u16);  RT2X00DEBUGFS_OPS(bbp, "0x%.2x\n", u8);  RT2X00DEBUGFS_OPS(rf, "0x%.8x\n", u32); +RT2X00DEBUGFS_OPS(rfcsr, "0x%.2x\n", u8);  static ssize_t rt2x00debug_read_dev_flags(struct file *file,  					  char __user *buf, @@ -552,6 +558,35 @@ static const struct file_operations rt2x00debug_fop_dev_flags = {  	.llseek		= default_llseek,  }; +static ssize_t rt2x00debug_read_cap_flags(struct file *file, +					  char __user *buf, +					  size_t length, +					  loff_t *offset) +{ +	struct rt2x00debug_intf *intf =	file->private_data; +	char line[16]; +	size_t size; + +	if (*offset) +		return 0; + +	size = sprintf(line, "0x%.8x\n", (unsigned int)intf->rt2x00dev->cap_flags); + +	if (copy_to_user(buf, line, size)) +		return -EFAULT; + +	*offset += size; +	return size; +} + +static const struct file_operations rt2x00debug_fop_cap_flags = { +	.owner		= THIS_MODULE, +	.read		= rt2x00debug_read_cap_flags, +	.open		= rt2x00debug_file_open, +	.release	= rt2x00debug_file_release, +	.llseek		= default_llseek, +}; +  static struct dentry *rt2x00debug_create_file_driver(const char *name,  						     struct rt2x00debug_intf  						     *intf, @@ -567,7 +602,6 @@ static struct dentry *rt2x00debug_create_file_driver(const char *name,  	blob->data = data;  	data += sprintf(data, "driver:\t%s\n", intf->rt2x00dev->ops->name);  	data += sprintf(data, "version:\t%s\n", DRV_VERSION); -	data += sprintf(data, "compiled:\t%s %s\n", __DATE__, __TIME__);  	blob->size = strlen(blob->data);  	return debugfs_create_blob(name, S_IRUSR, intf->driver_folder, blob); @@ -583,7 +617,7 @@ static struct dentry *rt2x00debug_create_file_chipset(const char *name,  	const struct rt2x00debug *debug = intf->debug;  	char *data; -	data = kzalloc(8 * MAX_LINE_LENGTH, GFP_KERNEL); +	data = kzalloc(9 * MAX_LINE_LENGTH, GFP_KERNEL);  	if (!data)  		return NULL; @@ -593,22 +627,22 @@ static struct dentry *rt2x00debug_create_file_chipset(const char *name,  	data += sprintf(data, "revision:\t%04x\n", intf->rt2x00dev->chip.rev);  	data += sprintf(data, "\n");  	data += sprintf(data, "register\tbase\twords\twordsize\n"); -	data += sprintf(data, "csr\t%d\t%d\t%d\n", -			debug->csr.word_base, -			debug->csr.word_count, -			debug->csr.word_size); -	data += sprintf(data, "eeprom\t%d\t%d\t%d\n", -			debug->eeprom.word_base, -			debug->eeprom.word_count, -			debug->eeprom.word_size); -	data += sprintf(data, "bbp\t%d\t%d\t%d\n", -			debug->bbp.word_base, -			debug->bbp.word_count, -			debug->bbp.word_size); -	data += sprintf(data, "rf\t%d\t%d\t%d\n", -			debug->rf.word_base, -			debug->rf.word_count, -			debug->rf.word_size); +#define RT2X00DEBUGFS_SPRINTF_REGISTER(__name)			\ +{								\ +	if(debug->__name.read)					\ +		data += sprintf(data, __stringify(__name)	\ +				"\t%d\t%d\t%d\n",		\ +				debug->__name.word_base,	\ +				debug->__name.word_count,	\ +				debug->__name.word_size);	\ +} +	RT2X00DEBUGFS_SPRINTF_REGISTER(csr); +	RT2X00DEBUGFS_SPRINTF_REGISTER(eeprom); +	RT2X00DEBUGFS_SPRINTF_REGISTER(bbp); +	RT2X00DEBUGFS_SPRINTF_REGISTER(rf); +	RT2X00DEBUGFS_SPRINTF_REGISTER(rfcsr); +#undef RT2X00DEBUGFS_SPRINTF_REGISTER +  	blob->size = strlen(blob->data);  	return debugfs_create_blob(name, S_IRUSR, intf->driver_folder, blob); @@ -621,7 +655,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)  	intf = kzalloc(sizeof(struct rt2x00debug_intf), GFP_KERNEL);  	if (!intf) { -		ERROR(rt2x00dev, "Failed to allocate debug handler.\n"); +		rt2x00_err(rt2x00dev, "Failed to allocate debug handler\n");  		return;  	} @@ -652,36 +686,45 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)  	if (IS_ERR(intf->dev_flags) || !intf->dev_flags)  		goto exit; +	intf->cap_flags = debugfs_create_file("cap_flags", S_IRUSR, +					      intf->driver_folder, intf, +					      &rt2x00debug_fop_cap_flags); +	if (IS_ERR(intf->cap_flags) || !intf->cap_flags) +		goto exit; +  	intf->register_folder =  	    debugfs_create_dir("register", intf->driver_folder);  	if (IS_ERR(intf->register_folder) || !intf->register_folder)  		goto exit; -#define RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(__intf, __name)	\ -({								\ -	(__intf)->__name##_off_entry =				\ -	    debugfs_create_u32(__stringify(__name) "_offset",	\ -			       S_IRUSR | S_IWUSR,		\ -			       (__intf)->register_folder,	\ -			       &(__intf)->offset_##__name);	\ -	if (IS_ERR((__intf)->__name##_off_entry)		\ -			|| !(__intf)->__name##_off_entry)	\ -		goto exit;					\ -								\ -	(__intf)->__name##_val_entry =				\ -	    debugfs_create_file(__stringify(__name) "_value",	\ -				S_IRUSR | S_IWUSR,		\ -				(__intf)->register_folder,	\ -				(__intf), &rt2x00debug_fop_##__name);\ -	if (IS_ERR((__intf)->__name##_val_entry)		\ -			|| !(__intf)->__name##_val_entry)	\ -		goto exit;					\ +#define RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(__intf, __name)			\ +({										\ +	if(debug->__name.read) {						\ +		(__intf)->__name##_off_entry =					\ +		debugfs_create_u32(__stringify(__name) "_offset",		\ +				       S_IRUSR | S_IWUSR,			\ +				       (__intf)->register_folder,		\ +				       &(__intf)->offset_##__name);		\ +		if (IS_ERR((__intf)->__name##_off_entry)			\ +				|| !(__intf)->__name##_off_entry)		\ +			goto exit;						\ +										\ +		(__intf)->__name##_val_entry =					\ +		debugfs_create_file(__stringify(__name) "_value",		\ +					S_IRUSR | S_IWUSR,			\ +					(__intf)->register_folder,		\ +					(__intf), &rt2x00debug_fop_##__name);	\ +		if (IS_ERR((__intf)->__name##_val_entry)			\ +				|| !(__intf)->__name##_val_entry)		\ +			goto exit;						\ +	}									\  })  	RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(intf, csr);  	RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(intf, eeprom);  	RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(intf, bbp);  	RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(intf, rf); +	RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(intf, rfcsr);  #undef RT2X00DEBUGFS_CREATE_REGISTER_ENTRY @@ -705,7 +748,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)  				intf, &rt2x00debug_fop_queue_stats);  #ifdef CONFIG_RT2X00_LIB_CRYPTO -	if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags)) +	if (rt2x00_has_cap_hw_crypto(rt2x00dev))  		intf->crypto_stats_entry =  		    debugfs_create_file("crypto", S_IRUGO, intf->queue_folder,  					intf, &rt2x00debug_fop_crypto_stats); @@ -715,7 +758,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)  exit:  	rt2x00debug_deregister(rt2x00dev); -	ERROR(rt2x00dev, "Failed to register debug handler.\n"); +	rt2x00_err(rt2x00dev, "Failed to register debug handler\n");  }  void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev) @@ -733,6 +776,8 @@ void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev)  	debugfs_remove(intf->queue_stats_entry);  	debugfs_remove(intf->queue_frame_dump_entry);  	debugfs_remove(intf->queue_folder); +	debugfs_remove(intf->rfcsr_val_entry); +	debugfs_remove(intf->rfcsr_off_entry);  	debugfs_remove(intf->rf_val_entry);  	debugfs_remove(intf->rf_off_entry);  	debugfs_remove(intf->bbp_val_entry); @@ -743,6 +788,7 @@ void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev)  	debugfs_remove(intf->csr_off_entry);  	debugfs_remove(intf->register_folder);  	debugfs_remove(intf->dev_flags); +	debugfs_remove(intf->cap_flags);  	debugfs_remove(intf->chipset_entry);  	debugfs_remove(intf->driver_entry);  	debugfs_remove(intf->driver_folder);  | 
