/* * 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)); }
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)); } }
/* 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; }
/* 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; }
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; }