예제 #1
0
/*
 * Convert the hardware provided duration to TSF ticks (usecs)
 * taking the clock (fast or normal) into account.
 *
 * Legacy (pre-11n, Owl, Sowl, Howl) operate 5GHz using a 40MHz
 * clock.  Later 11n chips (Merlin, Osprey, etc) operate 5GHz using
 * a 44MHz clock, so the reported pulse durations are different.
 *
 * Peregrine reports the pulse duration in microseconds regardless
 * of the operating mode. (XXX TODO: verify this, obviously.)
 */
static inline u_int8_t
dfs_process_pulse_dur(struct ath_dfs *dfs, u_int8_t re_dur)
{
    /*
     * Short pulses are sometimes returned as having a duration of 0,
     * so round those up to 1.
     *
     * XXX This holds true for BB TLV chips too, right?
     */
    if (re_dur == 0)
        return 1;

    /*
     * For BB TLV chips, the hardware always returns microsecond
     * pulse durations.
     */
    if (dfs->dfs_caps.ath_chip_is_bb_tlv)
        return re_dur;

    /*
     * This is for 11n and legacy chips, which may or may not
     * use the 5GHz fast clock mode.
     */
    /* Convert 0.8us durations to TSF ticks (usecs) */
    return (u_int8_t)dfs_round((int32_t)((dfs->dur_multiplier)*re_dur));
}
예제 #2
0
static inline u_int8_t
dfs_process_pulse_dur(struct ath_softc *sc, u_int8_t re_dur) 
{
	struct ath_dfs *dfs=sc->sc_dfs;
	if (re_dur == 0) {
		return 1;
	} else {
		/* Convert 0.8us durations to TSF ticks (usecs) */
		return (u_int8_t)dfs_round((int32_t)((dfs->dur_multiplier)*re_dur));
	}
}
예제 #3
0
/* This function Initialize the radar filter tables
 * if the ath dfs domain is uninitalized or
 *    ath dfs domain is different from hal dfs domain
 */
int dfs_init_radar_filters(struct ieee80211com *ic,
  struct ath_dfs_radar_tab_info *radar_info)
{
    u_int32_t T, Tmax;
    int numpulses,p,n, i;
    int numradars = 0, numb5radars = 0;
    struct ath_dfs *dfs = (struct ath_dfs *)ic->ic_dfs;
    struct dfs_filtertype *ft = NULL;
    struct dfs_filter *rf=NULL;
    struct dfs_pulse *dfs_radars;
    struct dfs_bin5pulse *b5pulses=NULL;
    int32_t min_rssithresh=DFS_MAX_RSSI_VALUE;
    u_int32_t max_pulsedur=0;

    if (dfs == NULL) {
        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
                        "%s[%d]: dfs is NULL", __func__, __LINE__);
        return DFS_STATUS_FAIL;
    }
    /* clear up the dfs domain flag first */
#ifndef ATH_DFS_RADAR_DETECTION_ONLY
    dfs->ath_dfs_isdfsregdomain = 0;
#endif

    /*
     * If radar_info is NULL or dfsdomain is NULL, treat
     * the rest of the radar configuration as suspect.
     */
    if (radar_info == NULL || radar_info->dfsdomain == 0) {
        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
                        "%s[%d]: Unknown dfs domain %d ",
                        __func__, __LINE__, dfs->dfsdomain);
        /* Disable radar detection since we don't have a radar domain */
        dfs->dfs_proc_phyerr &= ~DFS_RADAR_EN;
        /* Returning success though we are not completing init. A failure
         * will fail dfs_attach also.
         */
        return DFS_STATUS_SUCCESS;
    }

    VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
                    "%s[%d]:dfsdomain=%d, numradars=%d, numb5radars=%d",
                    __func__, __LINE__, radar_info->dfsdomain,
                    radar_info->numradars, radar_info->numb5radars);
    dfs->dfsdomain = radar_info->dfsdomain;
    dfs_radars = radar_info->dfs_radars;
    numradars = radar_info->numradars;
    b5pulses = radar_info->b5pulses;
    numb5radars = radar_info->numb5radars;

    /* XXX this should be an explicit copy of some sort! */
    dfs->dfs_defaultparams = radar_info->dfs_defaultparams;

#ifndef ATH_DFS_RADAR_DETECTION_ONLY
    dfs->ath_dfs_isdfsregdomain = 1;
#endif

    dfs->dfs_rinfo.rn_numradars = 0;
    /* Clear filter type table */
    for (n = 0; n < 256; n++) {
        for (i=0;i<DFS_MAX_RADAR_OVERLAP; i++)
            (dfs->dfs_radartable[n])[i] = -1;
    }
    /* Now, initialize the radar filters */
    for (p=0; p<numradars; p++) {
    ft = NULL;
    for (n=0; n<dfs->dfs_rinfo.rn_numradars; n++) {
        if ((dfs_radars[p].rp_pulsedur == dfs->dfs_radarf[n]->ft_filterdur) &&
           (dfs_radars[p].rp_numpulses == dfs->dfs_radarf[n]->ft_numpulses) &&
           (dfs_radars[p].rp_mindur == dfs->dfs_radarf[n]->ft_mindur) &&
           (dfs_radars[p].rp_maxdur == dfs->dfs_radarf[n]->ft_maxdur)) {
           ft = dfs->dfs_radarf[n];
           break;
        }
    }
    if (ft == NULL) {
        /* No filter of the appropriate dur was found */
        if ((dfs->dfs_rinfo.rn_numradars+1) >DFS_MAX_RADAR_TYPES) {
         DFS_DPRINTK(dfs, ATH_DEBUG_DFS, "%s: Too many filter types",
         __func__);
         goto bad4;
        }
        ft = dfs->dfs_radarf[dfs->dfs_rinfo.rn_numradars];
        ft->ft_numfilters = 0;
        ft->ft_numpulses = dfs_radars[p].rp_numpulses;
        ft->ft_patterntype = dfs_radars[p].rp_patterntype;
        ft->ft_mindur = dfs_radars[p].rp_mindur;
        ft->ft_maxdur = dfs_radars[p].rp_maxdur;
        ft->ft_filterdur = dfs_radars[p].rp_pulsedur;
        ft->ft_rssithresh = dfs_radars[p].rp_rssithresh;
        ft->ft_rssimargin = dfs_radars[p].rp_rssimargin;
        ft->ft_minpri = 1000000;

        if (ft->ft_rssithresh < min_rssithresh)
        min_rssithresh = ft->ft_rssithresh;
        if (ft->ft_maxdur > max_pulsedur)
        max_pulsedur = ft->ft_maxdur;
        for (i=ft->ft_mindur; i<=ft->ft_maxdur; i++) {
               u_int32_t stop=0,tableindex=0;
               while ((tableindex < DFS_MAX_RADAR_OVERLAP) && (!stop)) {
                   if ((dfs->dfs_radartable[i])[tableindex] == -1)
                  stop = 1;
                   else
                  tableindex++;
               }
               if (stop) {
                   (dfs->dfs_radartable[i])[tableindex] =
                  (int8_t) (dfs->dfs_rinfo.rn_numradars);
               } else {
                   DFS_DPRINTK(dfs, ATH_DEBUG_DFS,
                  "%s: Too many overlapping radar filters",
                  __func__);
                   goto bad4;
               }
        }
        dfs->dfs_rinfo.rn_numradars++;
    }
    rf = &(ft->ft_filters[ft->ft_numfilters++]);
    dfs_reset_delayline(&rf->rf_dl);
    numpulses = dfs_radars[p].rp_numpulses;

    rf->rf_numpulses = numpulses;
    rf->rf_patterntype = dfs_radars[p].rp_patterntype;
    rf->rf_pulseid = dfs_radars[p].rp_pulseid;
    rf->rf_mindur = dfs_radars[p].rp_mindur;
    rf->rf_maxdur = dfs_radars[p].rp_maxdur;
    rf->rf_numpulses = dfs_radars[p].rp_numpulses;
    rf->rf_ignore_pri_window = dfs_radars[p].rp_ignore_pri_window;
    T = (100000000/dfs_radars[p].rp_max_pulsefreq) -
         100*(dfs_radars[p].rp_meanoffset);
            rf->rf_minpri =
            dfs_round((int32_t)T - (100*(dfs_radars[p].rp_pulsevar)));
    Tmax = (100000000/dfs_radars[p].rp_pulsefreq) -
            100*(dfs_radars[p].rp_meanoffset);
      rf->rf_maxpri =
         dfs_round((int32_t)Tmax + (100*(dfs_radars[p].rp_pulsevar)));

        if( rf->rf_minpri < ft->ft_minpri )
        ft->ft_minpri = rf->rf_minpri;

    rf->rf_fixed_pri_radar_pulse = ( dfs_radars[p].rp_max_pulsefreq == dfs_radars[p].rp_pulsefreq ) ? 1 : 0;
    rf->rf_threshold = dfs_radars[p].rp_threshold;
    rf->rf_filterlen = rf->rf_maxpri * rf->rf_numpulses;

    VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s[%d]: minprf = %d maxprf = %d pulsevar = %d thresh=%d",
            __func__,__LINE__,dfs_radars[p].rp_pulsefreq, dfs_radars[p].rp_max_pulsefreq,
            dfs_radars[p].rp_pulsevar, rf->rf_threshold);
    VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s[%d]:minpri = %d maxpri = %d filterlen = %d filterID = %d",__func__,__LINE__,
            rf->rf_minpri, rf->rf_maxpri, rf->rf_filterlen, rf->rf_pulseid);

    }

#ifdef DFS_DEBUG
    dfs_print_filters(ic);
#endif
    dfs->dfs_rinfo.rn_numbin5radars  = numb5radars;
    if (dfs->dfs_b5radars != NULL)
        OS_FREE(dfs->dfs_b5radars);

    dfs->dfs_b5radars = (struct dfs_bin5radars *)OS_MALLOC(NULL,
      numb5radars * sizeof(struct dfs_bin5radars), GFP_KERNEL);
    if (dfs->dfs_b5radars == NULL) {
        DFS_DPRINTK(dfs, ATH_DEBUG_DFS,
        "%s: cannot allocate memory for bin5 radars",
        __func__);
        goto bad4;
    }
    for (n=0; n<numb5radars; n++) {
        dfs->dfs_b5radars[n].br_pulse = b5pulses[n];
        dfs->dfs_b5radars[n].br_pulse.b5_timewindow *= 1000000;
        if (dfs->dfs_b5radars[n].br_pulse.b5_rssithresh < min_rssithresh)
            min_rssithresh = dfs->dfs_b5radars[n].br_pulse.b5_rssithresh;
        if (dfs->dfs_b5radars[n].br_pulse.b5_maxdur > max_pulsedur)
            max_pulsedur = dfs->dfs_b5radars[n].br_pulse.b5_maxdur;
    }
    dfs_reset_alldelaylines(dfs);
    dfs_reset_radarq(dfs);
    dfs->dfs_curchan_radindex = -1;
    dfs->dfs_extchan_radindex = -1;
    dfs->dfs_rinfo.rn_minrssithresh = min_rssithresh;
    /* Convert durations to TSF ticks */
    dfs->dfs_rinfo.rn_maxpulsedur = dfs_round((int32_t)((max_pulsedur*100/80)*100));
    /* relax the max pulse duration a little bit due to inaccuracy caused by chirping. */
    dfs->dfs_rinfo.rn_maxpulsedur = dfs->dfs_rinfo.rn_maxpulsedur +20;
    VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
                    "%s[%d]: DFS min filter rssiThresh = %d",
                    __func__, __LINE__, min_rssithresh);
    VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
                    "%s[%d]:DFS max pulse dur = %d ticks",
                    __func__ ,__LINE__, dfs->dfs_rinfo.rn_maxpulsedur);
    return DFS_STATUS_SUCCESS;

 bad4:
     return DFS_STATUS_FAIL;
}
예제 #4
0
파일: dfs_init.c 프로젝트: KHATEEBNSIT/AP
/* This function Initialize the radar filter tables 
 * if the ath dfs domain is uninitalized or
 *    ath dfs domain is different from hal dfs domain
 */
int dfs_init_radar_filters( struct ath_softc *sc )
{
    u_int32_t T, Tmax, haldfsdomain;
    int numpulses,p,n, i;
    int numradars = 0, numb5radars = 0;
    struct ath_dfs *dfs = sc->sc_dfs;
    struct dfs_filtertype *ft = NULL;
    struct dfs_filter *rf=NULL;
    struct dfs_pulse *dfs_radars;
    struct dfs_bin5pulse *b5pulses=NULL;
    int32_t min_rssithresh=DFS_MAX_RSSI_VALUE;
    u_int32_t max_pulsedur=0;


    if ( dfs == NULL ) {
        DFS_DPRINTK(sc, ATH_DEBUG_DFS, "dfs is NULL %s",__func__);
    	return 1;
    }

    /* clear up the dfs domain flag first */
#ifndef ATH_DFS_RADAR_DETECTION_ONLY
    dfs->sc_dfs_isdfsregdomain = 0;
#endif

    /* clear athsstats/DFS related information */
    sc->sc_stats.ast_dfs_stats.event_count = 0;
    sc->sc_stats.ast_dfs_stats.chirp_count = 0;
    sc->sc_stats.ast_dfs_stats.num_filter = 0;

    if (ath_hal_getcapability(sc->sc_ah, HAL_CAP_PHYDIAG,
				  HAL_CAP_RADAR, NULL) == HAL_OK) {
    /* Init DFS radar filters */
    ath_hal_getcapability(sc->sc_ah, HAL_CAP_DFS_DMN, 0, &haldfsdomain);

    if ( (dfs->dfsdomain == DFS_UNINIT_DOMAIN) ||
	 ( dfs->dfsdomain != haldfsdomain ) )
    {
            /* set the dfs domain from HAL */
            dfs->dfsdomain = haldfsdomain;
	    DFS_DPRINTK(sc, ATH_DEBUG_DFS2, "DFS domain=%d\n",dfs->dfsdomain);
	    if (domainoverride != DFS_UNINIT_DOMAIN) {
		DFS_DPRINTK(sc, ATH_DEBUG_DFS, 
			   "Overriding DFS domain with %d\n",domainoverride); 
		dfs->dfsdomain = domainoverride;
	    }
	    dfs_radars = ath_hal_getdfsradars(sc->sc_ah, dfs->dfsdomain,
			     &numradars, &b5pulses, &numb5radars,
			     &(dfs->dfs_defaultparams));
	    if (dfs_radars == NULL) {
		DFS_DPRINTK(sc, ATH_DEBUG_DFS, "%s: Unknown dfs domain %d\n",
			    __func__, dfs->dfsdomain);
		/* Disable radar detection since we don't have a radar domain */
		dfs->dfs_proc_phyerr &= ~DFS_RADAR_EN;
		return 0;
	    }
#ifndef ATH_DFS_RADAR_DETECTION_ONLY
        dfs->sc_dfs_isdfsregdomain = 1;
#endif

	    dfs->dfs_rinfo.rn_numradars = 0;
	    /* Clear filter type table */
	    for (n=0; n<256; n++) {
		for (i=0;i<DFS_MAX_RADAR_OVERLAP; i++)
		    (dfs->dfs_radartable[n])[i] = -1;
            }
	    /* Now, initialize the radar filters */
	    for (p=0; p<numradars; p++) {
		ft = NULL;
		for (n=0; n<dfs->dfs_rinfo.rn_numradars; n++) {
		    if ((dfs_radars[p].rp_pulsedur == dfs->dfs_radarf[n]->ft_filterdur) &&
		       (dfs_radars[p].rp_numpulses == dfs->dfs_radarf[n]->ft_numpulses) &&
		       (dfs_radars[p].rp_mindur == dfs->dfs_radarf[n]->ft_mindur) &&
		       (dfs_radars[p].rp_maxdur == dfs->dfs_radarf[n]->ft_maxdur)) {
		       ft = dfs->dfs_radarf[n];
		       break;
		    }
		}
		if (ft == NULL) {
		    /* No filter of the appropriate dur was found */
		    if ((dfs->dfs_rinfo.rn_numradars+1) >DFS_MAX_RADAR_TYPES) {
			DFS_DPRINTK(sc, ATH_DEBUG_DFS, "%s: Too many filter types\n",
			__func__);
			goto bad4;
		    }
		    ft = dfs->dfs_radarf[dfs->dfs_rinfo.rn_numradars];
		    ft->ft_numfilters = 0;
		    ft->ft_numpulses = dfs_radars[p].rp_numpulses;
		    ft->ft_patterntype = dfs_radars[p].rp_patterntype;
		    ft->ft_mindur = dfs_radars[p].rp_mindur;
		    ft->ft_maxdur = dfs_radars[p].rp_maxdur;
		    ft->ft_filterdur = dfs_radars[p].rp_pulsedur;
		    ft->ft_rssithresh = dfs_radars[p].rp_rssithresh;
		    ft->ft_rssimargin = dfs_radars[p].rp_rssimargin;
		    ft->ft_minpri = 1000000;

		    if (ft->ft_rssithresh < min_rssithresh)
		    min_rssithresh = ft->ft_rssithresh;
		    if (ft->ft_maxdur > max_pulsedur)
		    max_pulsedur = ft->ft_maxdur;
		    for (i=ft->ft_mindur; i<=ft->ft_maxdur; i++) {
			u_int32_t stop=0,tableindex=0;
			while ((tableindex < DFS_MAX_RADAR_OVERLAP) && (!stop)) {
			    if ((dfs->dfs_radartable[i])[tableindex] == -1)
				stop = 1;
			    else
				tableindex++;
			}
			if (stop) {
			    (dfs->dfs_radartable[i])[tableindex] =
				(int8_t) (dfs->dfs_rinfo.rn_numradars);
			} else {
			    DFS_DPRINTK(sc, ATH_DEBUG_DFS,
				"%s: Too many overlapping radar filters\n",
				__func__);
			    goto bad4;
			}
		    }
		    dfs->dfs_rinfo.rn_numradars++;
		}
		rf = &(ft->ft_filters[ft->ft_numfilters++]);
		dfs_reset_delayline(&rf->rf_dl);
		numpulses = dfs_radars[p].rp_numpulses;

		rf->rf_numpulses = numpulses;
		rf->rf_patterntype = dfs_radars[p].rp_patterntype;
		rf->rf_pulseid = dfs_radars[p].rp_pulseid;
		rf->rf_mindur = dfs_radars[p].rp_mindur;
		rf->rf_maxdur = dfs_radars[p].rp_maxdur;
		rf->rf_numpulses = dfs_radars[p].rp_numpulses;
		rf->rf_ignore_pri_window = dfs_radars[p].rp_ignore_pri_window;
		T = (100000000/dfs_radars[p].rp_max_pulsefreq) -
        		100*(dfs_radars[p].rp_meanoffset);
                rf->rf_minpri =
		        dfs_round((int32_t)T - (100*(dfs_radars[p].rp_pulsevar)));
		Tmax = (100000000/dfs_radars[p].rp_pulsefreq) -
		        100*(dfs_radars[p].rp_meanoffset);
        	rf->rf_maxpri =
	        	dfs_round((int32_t)Tmax + (100*(dfs_radars[p].rp_pulsevar)));

	        if( rf->rf_minpri < ft->ft_minpri )
		    ft->ft_minpri = rf->rf_minpri;

		rf->rf_fixed_pri_radar_pulse = ( dfs_radars[p].rp_max_pulsefreq == dfs_radars[p].rp_pulsefreq ) ? 1 : 0;
		rf->rf_threshold = dfs_radars[p].rp_threshold;
		rf->rf_filterlen = rf->rf_maxpri * rf->rf_numpulses;

		DFS_DPRINTK(sc, ATH_DEBUG_DFS2, "minprf = %d maxprf = %d pulsevar = %d thresh=%d\n",
		dfs_radars[p].rp_pulsefreq, dfs_radars[p].rp_max_pulsefreq, dfs_radars[p].rp_pulsevar, rf->rf_threshold);
		DFS_DPRINTK(sc, ATH_DEBUG_DFS2,
		"minpri = %d maxpri = %d filterlen = %d filterID = %d\n",
		rf->rf_minpri, rf->rf_maxpri, rf->rf_filterlen, rf->rf_pulseid);

                /* initialize athsstats/DFS related information */
                i = sc->sc_stats.ast_dfs_stats.num_filter;
                sc->sc_stats.ast_dfs_stats.fstat[i].max_pri_count = 0;
                sc->sc_stats.ast_dfs_stats.fstat[i].max_used_pri = 0;
                sc->sc_stats.ast_dfs_stats.fstat[i].excess_pri = 0;
                sc->sc_stats.ast_dfs_stats.fstat[i].pri_threshold_reached = 0;
                sc->sc_stats.ast_dfs_stats.fstat[i].dur_threshold_reached = 0;
                sc->sc_stats.ast_dfs_stats.fstat[i].rssi_threshold_reached = 0;
                sc->sc_stats.ast_dfs_stats.fstat[i].filter_id = rf->rf_pulseid;
                sc->sc_stats.ast_dfs_stats.num_filter++;

	    }

#ifdef DFS_DEBUG
	    dfs_print_filters(sc);
#endif
	    dfs->dfs_rinfo.rn_numbin5radars  = numb5radars;
	    if ( dfs->dfs_b5radars == NULL ) {
		dfs->dfs_b5radars = (struct dfs_bin5radars *)OS_MALLOC(sc->sc_osdev, numb5radars * sizeof(struct dfs_bin5radars),
		GFP_KERNEL);
		if (dfs->dfs_b5radars == NULL) {
		    DFS_DPRINTK(sc, ATH_DEBUG_DFS, 
		    "%s: cannot allocate memory for bin5 radars\n",
		    __func__);
		    goto bad4;
		}
	    }
	    for (n=0; n<numb5radars; n++) {
		dfs->dfs_b5radars[n].br_pulse = b5pulses[n];
		dfs->dfs_b5radars[n].br_pulse.b5_timewindow *= 1000000;
		if (dfs->dfs_b5radars[n].br_pulse.b5_rssithresh < min_rssithresh)
		min_rssithresh = dfs->dfs_b5radars[n].br_pulse.b5_rssithresh;
		if (dfs->dfs_b5radars[n].br_pulse.b5_maxdur > max_pulsedur )
		max_pulsedur = dfs->dfs_b5radars[n].br_pulse.b5_maxdur;
	    }
	    dfs_reset_alldelaylines(sc);
	    dfs_reset_radarq(sc);
	    dfs->dfs_curchan_radindex = -1;
	    dfs->dfs_extchan_radindex = -1;
	    dfs->dfs_rinfo.rn_minrssithresh = min_rssithresh;
	    /* Convert durations to TSF ticks */
	    dfs->dfs_rinfo.rn_maxpulsedur = dfs_round((int32_t)((max_pulsedur*100/80)*100));
	    /* relax the max pulse duration a little bit due to inaccuracy caused by chirping. */
	    dfs->dfs_rinfo.rn_maxpulsedur = dfs->dfs_rinfo.rn_maxpulsedur +20;
	    DFS_DPRINTK (sc, ATH_DEBUG_DFS, "DFS min filter rssiThresh = %d\n",min_rssithresh);
	    DFS_DPRINTK (sc, ATH_DEBUG_DFS, "DFS max pulse dur = %d ticks\n", dfs->dfs_rinfo.rn_maxpulsedur);
	    return 0;

	bad4:
	     return 1;
        }
     }
     return 0;
}
예제 #5
0
int dfs_init_radar_filters_host( struct ath_dfs_host *dfs, struct ath_dfs_info *dfs_info)
{
    u_int32_t T, Tmax;
    int numpulses,p,n, i;
    struct dfs_filtertype *ft = NULL;
    struct dfs_filter *rf=NULL;
    struct dfs_pulse *dfs_radars;
    struct dfs_bin5pulse *b5pulses;
    int32_t min_rssithresh=DFS_MAX_RSSI_VALUE;
    u_int32_t max_pulsedur=0;
    u_int32_t numb5radars;
    u_int32_t numradars;

    dfs_radars = dfs_get_radars(dfs_info->dfs_domain, &numradars, &b5pulses, &numb5radars);
    /* If DFS not enabled return immediately.*/
    if (!dfs_radars) {
        return 0;
    }

    dfs->dfs_rinfo.rn_numradars = 0;

    /* Clear filter type table */
    for (n=0; n<256; n++) {
        for (i=0;i<DFS_MAX_RADAR_OVERLAP; i++)
            (dfs->dfs_radartable[n])[i] = -1;
    }

    /* Now, initialize the radar filters */
    for (p=0; p < numradars; p++) {
        ft = NULL;
        for (n=0; n<dfs->dfs_rinfo.rn_numradars; n++) {
            if ((dfs_radars[p].rp_pulsedur == dfs->dfs_radarf[n]->ft_filterdur) &&
                    (dfs_radars[p].rp_numpulses == dfs->dfs_radarf[n]->ft_numpulses) &&
                    (dfs_radars[p].rp_mindur == dfs->dfs_radarf[n]->ft_mindur) &&
                    (dfs_radars[p].rp_maxdur == dfs->dfs_radarf[n]->ft_maxdur)) {
                ft = dfs->dfs_radarf[n];
                break;
            }
        }
        if (ft == NULL) {
            /* No filter of the appropriate dur was found */
            if ((dfs->dfs_rinfo.rn_numradars+1) >DFS_MAX_RADAR_TYPES) {
                DFS_DPRINTK(dfs, ATH_DEBUG_DFS, "%s: Too many filter types\n",
                        __func__);
                goto bad4;
            }

            ft = dfs->dfs_radarf[dfs->dfs_rinfo.rn_numradars];
            ft->ft_numfilters = 0;
            ft->ft_numpulses = dfs_radars[p].rp_numpulses;
            ft->ft_patterntype = dfs_radars[p].rp_patterntype;
            ft->ft_mindur = dfs_radars[p].rp_mindur;
            ft->ft_maxdur = dfs_radars[p].rp_maxdur;
            ft->ft_filterdur = dfs_radars[p].rp_pulsedur;
            ft->ft_rssithresh = dfs_radars[p].rp_rssithresh;
            ft->ft_rssimargin = dfs_radars[p].rp_rssimargin;
            ft->ft_minpri = 1000000;

            if (ft->ft_rssithresh < min_rssithresh)
                min_rssithresh = ft->ft_rssithresh;
            if (ft->ft_maxdur > max_pulsedur)
                max_pulsedur = ft->ft_maxdur;
            for (i=ft->ft_mindur; i<=ft->ft_maxdur; i++) {
                u_int32_t stop=0,tableindex=0;
                while ((tableindex < DFS_MAX_RADAR_OVERLAP) && (!stop)) {
                    if ((dfs->dfs_radartable[i])[tableindex] == -1)
                        stop = 1;
                    else
                        tableindex++;
                }
                if (stop) {
                    (dfs->dfs_radartable[i])[tableindex] =
                        (int8_t) (dfs->dfs_rinfo.rn_numradars);
                } else {
                    DFS_DPRINTK(dfs, ATH_DEBUG_DFS,
                            "%s: Too many overlapping radar filters\n",
                            __func__);
                    goto bad4;
                }
            }
            dfs->dfs_rinfo.rn_numradars++;
        }
        rf = &(ft->ft_filters[ft->ft_numfilters++]);
        dfs_reset_delayline(&rf->rf_dl);
        numpulses = dfs_radars[p].rp_numpulses;

        rf->rf_numpulses = numpulses;
        rf->rf_patterntype = dfs_radars[p].rp_patterntype;
        rf->rf_pulseid = dfs_radars[p].rp_pulseid;
        rf->rf_mindur = dfs_radars[p].rp_mindur;
        rf->rf_maxdur = dfs_radars[p].rp_maxdur;
        rf->rf_numpulses = dfs_radars[p].rp_numpulses;

        T = (100000000/dfs_radars[p].rp_max_pulsefreq) -
            100*(dfs_radars[p].rp_meanoffset);
        rf->rf_minpri =
            dfs_round((int32_t)T - (100*(dfs_radars[p].rp_pulsevar)));
        Tmax = (100000000/dfs_radars[p].rp_pulsefreq) -
            100*(dfs_radars[p].rp_meanoffset);
        rf->rf_maxpri =
            dfs_round((int32_t)Tmax + (100*(dfs_radars[p].rp_pulsevar)));

        if( rf->rf_minpri < ft->ft_minpri )
            ft->ft_minpri = rf->rf_minpri;

        rf->rf_threshold = dfs_radars[p].rp_threshold;
        rf->rf_filterlen = rf->rf_maxpri * rf->rf_numpulses;

        DFS_DPRINTK(dfs, ATH_DEBUG_DFS2, "minprf = %d maxprf = %d pulsevar = %d thresh=%d\n",
                dfs_radars[p].rp_pulsefreq, dfs_radars[p].rp_max_pulsefreq, dfs_radars[p].rp_pulsevar, rf->rf_threshold);
        DFS_DPRINTK(dfs, ATH_DEBUG_DFS2,
                "minpri = %d maxpri = %d filterlen = %d filterID = %d\n",
                rf->rf_minpri, rf->rf_maxpri, rf->rf_filterlen, rf->rf_pulseid);
    }

#ifdef DFS_DEBUG
    dfs_print_filters(dfs);
#endif

    dfs->dfs_rinfo.rn_numbin5radars  = numb5radars;
    if ( dfs->dfs_b5radars == NULL ) {
        dfs->dfs_b5radars = (struct dfs_bin5radars *)DFS_MALLOC(dfs->os_hdl, numb5radars * sizeof(struct dfs_bin5radars));
        if (dfs->dfs_b5radars == NULL) {
            DFS_DPRINTK(dfs, ATH_DEBUG_DFS,
                    "%s: cannot allocate memory for bin5 radars\n",
                    __func__);
            goto bad4;
        }
    }
    for (n=0; n<numb5radars; n++) {
        dfs->dfs_b5radars[n].br_pulse = b5pulses[n];
        dfs->dfs_b5radars[n].br_pulse.b5_timewindow *= 1000000;
        if (dfs->dfs_b5radars[n].br_pulse.b5_rssithresh < min_rssithresh)
            min_rssithresh = dfs->dfs_b5radars[n].br_pulse.b5_rssithresh;
        if (dfs->dfs_b5radars[n].br_pulse.b5_maxdur > max_pulsedur )
            max_pulsedur = dfs->dfs_b5radars[n].br_pulse.b5_maxdur;
    }
    dfs_reset_alldelaylines(dfs);
    dfs_reset_radarq(dfs);

    DFS_SET_MINRSSITHRESH(dfs->dev_hdl, min_rssithresh);
    DFS_SET_MAXPULSEDUR(dfs->dev_hdl, dfs_round((int32_t)((max_pulsedur*100/80)*100)));


    return 0;

bad4:
    for (n=0; n<ft->ft_numfilters; n++) {
        rf = &(ft->ft_filters[n]);
    }
    return 1;
}