mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-18 22:14:16 +00:00 
			
		
		
		
	wil6210: Tx mgmt frame from debugfs
Provide 2 files on the debugfs: - "rxon": write channel (1..4) to open Rx on it, 0 to rxoff - "tx_mgmt": write binary frame, starting from MAC header one need to care about turning receiver on/off before/after tx_mgmt Correct sequence is: echo $channel > rxon cat mfmt_frame > tx_mgmt echo 0 > rxon Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
		
							parent
							
								
									e8c58e7a5a
								
							
						
					
					
						commit
						0b39aaf2f2
					
				
					 3 changed files with 86 additions and 4 deletions
				
			
		|  | @ -443,10 +443,9 @@ static int wil_cfg80211_disconnect(struct wiphy *wiphy, | |||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| static int wil_cfg80211_mgmt_tx(struct wiphy *wiphy, | ||||
| 				struct wireless_dev *wdev, | ||||
| 				struct cfg80211_mgmt_tx_params *params, | ||||
| 				u64 *cookie) | ||||
| int wil_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, | ||||
| 			 struct cfg80211_mgmt_tx_params *params, | ||||
| 			 u64 *cookie) | ||||
| { | ||||
| 	const u8 *buf = params->buf; | ||||
| 	size_t len = params->len; | ||||
|  |  | |||
|  | @ -397,6 +397,84 @@ static const struct file_operations fops_reset = { | |||
| 	.write = wil_write_file_reset, | ||||
| 	.open  = simple_open, | ||||
| }; | ||||
| /*---write channel 1..4 to rxon for it, 0 to rxoff---*/ | ||||
| static ssize_t wil_write_file_rxon(struct file *file, const char __user *buf, | ||||
| 				   size_t len, loff_t *ppos) | ||||
| { | ||||
| 	struct wil6210_priv *wil = file->private_data; | ||||
| 	int rc; | ||||
| 	long channel; | ||||
| 	bool on; | ||||
| 
 | ||||
| 	char *kbuf = kmalloc(len + 1, GFP_KERNEL); | ||||
| 	if (!kbuf) | ||||
| 		return -ENOMEM; | ||||
| 	if (copy_from_user(kbuf, buf, len)) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	kbuf[len] = '\0'; | ||||
| 	rc = kstrtol(kbuf, 0, &channel); | ||||
| 	kfree(kbuf); | ||||
| 	if (rc) | ||||
| 		return rc; | ||||
| 
 | ||||
| 	if ((channel < 0) || (channel > 4)) { | ||||
| 		wil_err(wil, "Invalid channel %ld\n", channel); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	on = !!channel; | ||||
| 
 | ||||
| 	if (on) { | ||||
| 		rc = wmi_set_channel(wil, (int)channel); | ||||
| 		if (rc) | ||||
| 			return rc; | ||||
| 	} | ||||
| 
 | ||||
| 	rc = wmi_rxon(wil, on); | ||||
| 	if (rc) | ||||
| 		return rc; | ||||
| 
 | ||||
| 	return len; | ||||
| } | ||||
| 
 | ||||
| static const struct file_operations fops_rxon = { | ||||
| 	.write = wil_write_file_rxon, | ||||
| 	.open  = simple_open, | ||||
| }; | ||||
| /*---tx_mgmt---*/ | ||||
| /* Write mgmt frame to this file to send it */ | ||||
| static ssize_t wil_write_file_txmgmt(struct file *file, const char __user *buf, | ||||
| 				     size_t len, loff_t *ppos) | ||||
| { | ||||
| 	struct wil6210_priv *wil = file->private_data; | ||||
| 	struct wiphy *wiphy = wil_to_wiphy(wil); | ||||
| 	struct wireless_dev *wdev = wil_to_wdev(wil); | ||||
| 	struct cfg80211_mgmt_tx_params params; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	void *frame = kmalloc(len, GFP_KERNEL); | ||||
| 	if (!frame) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	if (copy_from_user(frame, buf, len)) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	params.buf = frame; | ||||
| 	params.len = len; | ||||
| 	params.chan = wdev->preset_chandef.chan; | ||||
| 
 | ||||
| 	rc = wil_cfg80211_mgmt_tx(wiphy, wdev, ¶ms, NULL); | ||||
| 
 | ||||
| 	kfree(frame); | ||||
| 	wil_info(wil, "%s() -> %d\n", __func__, rc); | ||||
| 
 | ||||
| 	return len; | ||||
| } | ||||
| 
 | ||||
| static const struct file_operations fops_txmgmt = { | ||||
| 	.write = wil_write_file_txmgmt, | ||||
| 	.open  = simple_open, | ||||
| }; | ||||
| 
 | ||||
| static void wil_seq_hexdump(struct seq_file *s, void *p, int len, | ||||
| 			    const char *prefix) | ||||
|  | @ -719,6 +797,8 @@ int wil6210_debugfs_init(struct wil6210_priv *wil) | |||
| 	debugfs_create_file("mem_val", S_IRUGO, dbg, wil, &fops_memread); | ||||
| 
 | ||||
| 	debugfs_create_file("reset", S_IWUSR, dbg, wil, &fops_reset); | ||||
| 	debugfs_create_file("rxon", S_IWUSR, dbg, wil, &fops_rxon); | ||||
| 	debugfs_create_file("tx_mgmt", S_IWUSR, dbg, wil, &fops_txmgmt); | ||||
| 	debugfs_create_file("temp", S_IRUGO, dbg, wil, &fops_temp); | ||||
| 
 | ||||
| 	wil->rgf_blob.data = (void * __force)wil->csr + 0; | ||||
|  |  | |||
|  | @ -504,6 +504,9 @@ int wil6210_init_irq(struct wil6210_priv *wil, int irq); | |||
| void wil6210_fini_irq(struct wil6210_priv *wil, int irq); | ||||
| void wil6210_disable_irq(struct wil6210_priv *wil); | ||||
| void wil6210_enable_irq(struct wil6210_priv *wil); | ||||
| int wil_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, | ||||
| 			 struct cfg80211_mgmt_tx_params *params, | ||||
| 			 u64 *cookie); | ||||
| 
 | ||||
| int wil6210_debugfs_init(struct wil6210_priv *wil); | ||||
| void wil6210_debugfs_remove(struct wil6210_priv *wil); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Vladimir Kondratiev
						Vladimir Kondratiev