svn commit: r224267 - head/sys/dev/ath/ath_dfs/null

Adrian Chadd adrian at FreeBSD.org
Fri Jul 22 09:39:50 UTC 2011


Author: adrian
Date: Fri Jul 22 09:39:49 2011
New Revision: 224267
URL: http://svn.freebsd.org/changeset/base/224267

Log:
  Implement a basic radar parameter API in the dfs_null module.
  
  Since no actual radar data is ever handled, this won't
  do anything. It's mostly here as a reference for those who
  wish to experiment with radar detection.
  
  Approved by:	re (kib)

Modified:
  head/sys/dev/ath/ath_dfs/null/dfs_null.c

Modified: head/sys/dev/ath/ath_dfs/null/dfs_null.c
==============================================================================
--- head/sys/dev/ath/ath_dfs/null/dfs_null.c	Fri Jul 22 09:34:31 2011	(r224266)
+++ head/sys/dev/ath/ath_dfs/null/dfs_null.c	Fri Jul 22 09:39:49 2011	(r224267)
@@ -61,7 +61,7 @@ __FBSDID("$FreeBSD$");
 #include <net/bpf.h>
 
 #ifdef INET
-#include <netinet/in.h> 
+#include <netinet/in.h>
 #include <netinet/if_ether.h>
 #endif
 
@@ -141,12 +141,80 @@ ath_dfs_tasklet_needed(struct ath_softc 
 }
 
 /*
- * Handle ioctl requests from the diagnostic interface
+ * Handle ioctl requests from the diagnostic interface.
+ *
+ * The initial part of this code resembles ath_ioctl_diag();
+ * it's likely a good idea to reduce duplication between
+ * these two routines.
  */
 int
 ath_ioctl_phyerr(struct ath_softc *sc, struct ath_diag *ad)
 {
-	return 1;
+	unsigned int id = ad->ad_id & ATH_DIAG_ID;
+	void *indata = NULL;
+	void *outdata = NULL;
+	u_int32_t insize = ad->ad_in_size;
+	u_int32_t outsize = ad->ad_out_size;
+	int error = 0;
+	HAL_PHYERR_PARAM peout;
+	HAL_PHYERR_PARAM *pe;
+
+	if (ad->ad_id & ATH_DIAG_IN) {
+		/*
+		 * Copy in data.
+		 */
+		indata = malloc(insize, M_TEMP, M_NOWAIT);
+		if (indata == NULL) {
+			error = ENOMEM;
+			goto bad;
+		}
+		error = copyin(ad->ad_in_data, indata, insize);
+		if (error)
+			goto bad;
+	}
+	if (ad->ad_id & ATH_DIAG_DYN) {
+		/*
+		 * Allocate a buffer for the results (otherwise the HAL
+		 * returns a pointer to a buffer where we can read the
+		 * results).  Note that we depend on the HAL leaving this
+		 * pointer for us to use below in reclaiming the buffer;
+		 * may want to be more defensive.
+		 */
+		outdata = malloc(outsize, M_TEMP, M_NOWAIT);
+		if (outdata == NULL) {
+			error = ENOMEM;
+			goto bad;
+		}
+	}
+	switch (id) {
+		case DFS_SET_THRESH:
+			if (insize < sizeof(HAL_PHYERR_PARAM)) {
+				error = -EINVAL;
+				break;
+			}
+			pe = (HAL_PHYERR_PARAM *) indata;
+			ath_hal_enabledfs(sc->sc_ah, pe);
+			break;
+		case DFS_GET_THRESH:
+			memset(&peout, 0, sizeof(peout));
+			outsize = sizeof(HAL_PHYERR_PARAM);
+			ath_hal_getdfsthresh(sc->sc_ah, &peout);
+			pe = (HAL_PHYERR_PARAM *) outdata;
+			memcpy(pe, &peout, sizeof(*pe));
+			break;
+		default:
+			error = -EINVAL;
+	}
+	if (outsize < ad->ad_out_size)
+		ad->ad_out_size = outsize;
+	if (outdata && copyout(outdata, ad->ad_out_data, ad->ad_out_size))
+		error = -EFAULT;
+bad:
+	if ((ad->ad_id & ATH_DIAG_IN) && indata != NULL)
+		free(indata, M_TEMP);
+	if ((ad->ad_id & ATH_DIAG_DYN) && outdata != NULL)
+		free(outdata, M_TEMP);
+	return error;
 }
 
 /*


More information about the svn-src-head mailing list