xref: /freebsd/sys/dev/ath/ath_hal/ar5312/ar5312_attach.c (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1*6e778a7eSPedro F. Giffuni /*-
2*6e778a7eSPedro F. Giffuni  * SPDX-License-Identifier: ISC
3*6e778a7eSPedro F. Giffuni  *
414779705SSam Leffler  * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
514779705SSam Leffler  * Copyright (c) 2002-2008 Atheros Communications, Inc.
614779705SSam Leffler  *
714779705SSam Leffler  * Permission to use, copy, modify, and/or distribute this software for any
814779705SSam Leffler  * purpose with or without fee is hereby granted, provided that the above
914779705SSam Leffler  * copyright notice and this permission notice appear in all copies.
1014779705SSam Leffler  *
1114779705SSam Leffler  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1214779705SSam Leffler  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1314779705SSam Leffler  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1414779705SSam Leffler  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1514779705SSam Leffler  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1614779705SSam Leffler  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1714779705SSam Leffler  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1814779705SSam Leffler  */
1914779705SSam Leffler #include "opt_ah.h"
2014779705SSam Leffler 
2114779705SSam Leffler #include "ah.h"
2214779705SSam Leffler #include "ah_internal.h"
2314779705SSam Leffler #include "ah_devid.h"
2414779705SSam Leffler 
2514779705SSam Leffler #include "ar5312/ar5312.h"
2614779705SSam Leffler #include "ar5312/ar5312reg.h"
2714779705SSam Leffler #include "ar5312/ar5312phy.h"
2814779705SSam Leffler 
2914779705SSam Leffler /* Add static register initialization vectors */
3014779705SSam Leffler #define AH_5212_COMMON
3114779705SSam Leffler #include "ar5212/ar5212.ini"
3214779705SSam Leffler 
3314779705SSam Leffler static  HAL_BOOL ar5312GetMacAddr(struct ath_hal *ah);
3414779705SSam Leffler 
3514779705SSam Leffler static void
ar5312AniSetup(struct ath_hal * ah)3614779705SSam Leffler ar5312AniSetup(struct ath_hal *ah)
3714779705SSam Leffler {
3814779705SSam Leffler 	static const struct ar5212AniParams aniparams = {
3914779705SSam Leffler 		.maxNoiseImmunityLevel	= 4,	/* levels 0..4 */
4014779705SSam Leffler 		.totalSizeDesired	= { -41, -41, -48, -48, -48 },
4114779705SSam Leffler 		.coarseHigh		= { -18, -18, -16, -14, -12 },
4214779705SSam Leffler 		.coarseLow		= { -56, -56, -60, -60, -60 },
4314779705SSam Leffler 		.firpwr			= { -72, -72, -75, -78, -80 },
4414779705SSam Leffler 		.maxSpurImmunityLevel	= 2,
4514779705SSam Leffler 		.cycPwrThr1		= { 2, 4, 6 },
4614779705SSam Leffler 		.maxFirstepLevel	= 2,	/* levels 0..2 */
4714779705SSam Leffler 		.firstep		= { 0, 4, 8 },
4814779705SSam Leffler 		.ofdmTrigHigh		= 500,
4914779705SSam Leffler 		.ofdmTrigLow		= 200,
5014779705SSam Leffler 		.cckTrigHigh		= 200,
5114779705SSam Leffler 		.cckTrigLow		= 100,
5214779705SSam Leffler 		.rssiThrHigh		= 40,
5314779705SSam Leffler 		.rssiThrLow		= 7,
5414779705SSam Leffler 		.period			= 100,
5514779705SSam Leffler 	};
5614779705SSam Leffler 	ar5212AniAttach(ah, &aniparams, &aniparams, AH_TRUE);
5714779705SSam Leffler }
5814779705SSam Leffler 
5914779705SSam Leffler /*
6014779705SSam Leffler  * Attach for an AR5312 part.
6114779705SSam Leffler  */
6214779705SSam Leffler static struct ath_hal *
ar5312Attach(uint16_t devid,HAL_SOFTC sc,HAL_BUS_TAG st,HAL_BUS_HANDLE sh,uint16_t * eepromdata,HAL_OPS_CONFIG * ah_config,HAL_STATUS * status)6314779705SSam Leffler ar5312Attach(uint16_t devid, HAL_SOFTC sc,
6488117a53SAdrian Chadd 	HAL_BUS_TAG st, HAL_BUS_HANDLE sh, uint16_t *eepromdata,
659389d5a9SAdrian Chadd 	HAL_OPS_CONFIG *ah_config, HAL_STATUS *status)
6614779705SSam Leffler {
6714779705SSam Leffler 	struct ath_hal_5212 *ahp = AH_NULL;
6814779705SSam Leffler 	struct ath_hal *ah;
6914779705SSam Leffler 	struct ath_hal_rf *rf;
7014779705SSam Leffler 	uint32_t val;
7114779705SSam Leffler 	uint16_t eeval;
7214779705SSam Leffler 	HAL_STATUS ecode;
7314779705SSam Leffler 
740e56140aSAdrian Chadd 	HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
7514779705SSam Leffler 		 __func__, sc, st, (void*) sh);
7614779705SSam Leffler 
7714779705SSam Leffler 	/* NB: memory is returned zero'd */
7814779705SSam Leffler 	ahp = ath_hal_malloc(sizeof (struct ath_hal_5212));
7914779705SSam Leffler 	if (ahp == AH_NULL) {
800e56140aSAdrian Chadd 		HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
8114779705SSam Leffler 		    "%s: cannot allocate memory for state block\n", __func__);
8214779705SSam Leffler 		*status = HAL_ENOMEM;
8314779705SSam Leffler 		return AH_NULL;
8414779705SSam Leffler 	}
8514779705SSam Leffler 	ar5212InitState(ahp, devid, sc, st, sh, status);
8614779705SSam Leffler 	ah = &ahp->ah_priv.h;
8714779705SSam Leffler 
8814779705SSam Leffler 	/* override 5212 methods for our needs */
8914779705SSam Leffler 	ah->ah_reset			= ar5312Reset;
9014779705SSam Leffler 	ah->ah_phyDisable		= ar5312PhyDisable;
9114779705SSam Leffler 	ah->ah_setLedState		= ar5312SetLedState;
9214779705SSam Leffler 	ah->ah_detectCardPresent	= ar5312DetectCardPresent;
9314779705SSam Leffler 	ah->ah_setPowerMode		= ar5312SetPowerMode;
9414779705SSam Leffler 	ah->ah_getPowerMode		= ar5312GetPowerMode;
9514779705SSam Leffler 	ah->ah_isInterruptPending	= ar5312IsInterruptPending;
9614779705SSam Leffler 
9714779705SSam Leffler 	ahp->ah_priv.ah_eepromRead	= ar5312EepromRead;
9814779705SSam Leffler #ifdef AH_SUPPORT_WRITE_EEPROM
9914779705SSam Leffler 	ahp->ah_priv.ah_eepromWrite	= ar5312EepromWrite;
10014779705SSam Leffler #endif
10114779705SSam Leffler #if ( AH_SUPPORT_2316 || AH_SUPPORT_2317)
10214779705SSam Leffler 	if (IS_5315(ah)) {
10314779705SSam Leffler 		ahp->ah_priv.ah_gpioCfgOutput	= ar5315GpioCfgOutput;
10414779705SSam Leffler 		ahp->ah_priv.ah_gpioCfgInput	= ar5315GpioCfgInput;
10514779705SSam Leffler 		ahp->ah_priv.ah_gpioGet		= ar5315GpioGet;
10614779705SSam Leffler 		ahp->ah_priv.ah_gpioSet		= ar5315GpioSet;
10714779705SSam Leffler 		ahp->ah_priv.ah_gpioSetIntr	= ar5315GpioSetIntr;
10814779705SSam Leffler 	} else
10914779705SSam Leffler #endif
11014779705SSam Leffler 	{
11114779705SSam Leffler 		ahp->ah_priv.ah_gpioCfgOutput	= ar5312GpioCfgOutput;
11214779705SSam Leffler 		ahp->ah_priv.ah_gpioCfgInput	= ar5312GpioCfgInput;
11314779705SSam Leffler 		ahp->ah_priv.ah_gpioGet		= ar5312GpioGet;
11414779705SSam Leffler 		ahp->ah_priv.ah_gpioSet		= ar5312GpioSet;
11514779705SSam Leffler 		ahp->ah_priv.ah_gpioSetIntr	= ar5312GpioSetIntr;
11614779705SSam Leffler 	}
11714779705SSam Leffler 
11814779705SSam Leffler 	ah->ah_gpioCfgInput		= ahp->ah_priv.ah_gpioCfgInput;
11914779705SSam Leffler 	ah->ah_gpioCfgOutput		= ahp->ah_priv.ah_gpioCfgOutput;
12014779705SSam Leffler 	ah->ah_gpioGet			= ahp->ah_priv.ah_gpioGet;
12114779705SSam Leffler 	ah->ah_gpioSet			= ahp->ah_priv.ah_gpioSet;
12214779705SSam Leffler 	ah->ah_gpioSetIntr		= ahp->ah_priv.ah_gpioSetIntr;
12314779705SSam Leffler 
12414779705SSam Leffler 	/* setup common ini data; rf backends handle remainder */
12514779705SSam Leffler 	HAL_INI_INIT(&ahp->ah_ini_modes, ar5212Modes, 6);
1260f1a6e34SSam Leffler 	HAL_INI_INIT(&ahp->ah_ini_common, ar5212Common, 2);
12714779705SSam Leffler 
12814779705SSam Leffler 	if (!ar5312ChipReset(ah, AH_NULL)) {	/* reset chip */
12914779705SSam Leffler 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: chip reset failed\n", __func__);
13014779705SSam Leffler 		ecode = HAL_EIO;
13114779705SSam Leffler 		goto bad;
13214779705SSam Leffler 	}
13314779705SSam Leffler 
13414779705SSam Leffler #if ( AH_SUPPORT_2316 || AH_SUPPORT_2317)
13514779705SSam Leffler 	if ((devid == AR5212_AR2315_REV6) ||
13614779705SSam Leffler 	    (devid == AR5212_AR2315_REV7) ||
13714779705SSam Leffler 	    (devid == AR5212_AR2317_REV1) ||
13814779705SSam Leffler 	    (devid == AR5212_AR2317_REV2) ) {
13914779705SSam Leffler 		val = ((OS_REG_READ(ah, (AR5315_RSTIMER_BASE -((uint32_t) sh)) + AR5315_WREV)) >> AR5315_WREV_S)
14014779705SSam Leffler 			& AR5315_WREV_ID;
14114779705SSam Leffler 		AH_PRIVATE(ah)->ah_macVersion = val >> AR5315_WREV_ID_S;
14214779705SSam Leffler 		AH_PRIVATE(ah)->ah_macRev = val & AR5315_WREV_REVISION;
14314779705SSam Leffler 		HALDEBUG(ah, HAL_DEBUG_ATTACH,
14414779705SSam Leffler 		    "%s: Mac Chip Rev 0x%02x.%x\n" , __func__,
14514779705SSam Leffler 		    AH_PRIVATE(ah)->ah_macVersion, AH_PRIVATE(ah)->ah_macRev);
14614779705SSam Leffler 	} else
14714779705SSam Leffler #endif
14814779705SSam Leffler 	{
14914779705SSam Leffler 		val = OS_REG_READ(ah, (AR5312_RSTIMER_BASE - ((uint32_t) sh)) + 0x0020);
15014779705SSam Leffler 		val = OS_REG_READ(ah, (AR5312_RSTIMER_BASE - ((uint32_t) sh)) + 0x0080);
15114779705SSam Leffler 		/* Read Revisions from Chips */
15214779705SSam Leffler 		val = ((OS_REG_READ(ah, (AR5312_RSTIMER_BASE - ((uint32_t) sh)) + AR5312_WREV)) >> AR5312_WREV_S) & AR5312_WREV_ID;
15314779705SSam Leffler 		AH_PRIVATE(ah)->ah_macVersion = val >> AR5312_WREV_ID_S;
15414779705SSam Leffler 		AH_PRIVATE(ah)->ah_macRev = val & AR5312_WREV_REVISION;
15514779705SSam Leffler 	}
15614779705SSam Leffler 	/* XXX - THIS IS WRONG. NEEDS TO BE FIXED */
15714779705SSam Leffler 	if (((AH_PRIVATE(ah)->ah_macVersion != AR_SREV_VERSION_VENICE &&
15814779705SSam Leffler               AH_PRIVATE(ah)->ah_macVersion != AR_SREV_VERSION_VENICE) ||
15914779705SSam Leffler              AH_PRIVATE(ah)->ah_macRev < AR_SREV_D2PLUS) &&
16014779705SSam Leffler               AH_PRIVATE(ah)->ah_macVersion != AR_SREV_VERSION_COBRA) {
16114779705SSam Leffler #ifdef AH_DEBUG
16214779705SSam Leffler 		ath_hal_printf(ah, "%s: Mac Chip Rev 0x%02x.%x is not supported by "
16314779705SSam Leffler                          "this driver\n", __func__,
16414779705SSam Leffler                          AH_PRIVATE(ah)->ah_macVersion,
16514779705SSam Leffler                          AH_PRIVATE(ah)->ah_macRev);
16614779705SSam Leffler #endif
16714779705SSam Leffler 		ecode = HAL_ENOTSUPP;
16814779705SSam Leffler 		goto bad;
16914779705SSam Leffler 	}
17014779705SSam Leffler 
17114779705SSam Leffler 	AH_PRIVATE(ah)->ah_phyRev = OS_REG_READ(ah, AR_PHY_CHIP_ID);
17214779705SSam Leffler 
17314779705SSam Leffler 	if (!ar5212ChipTest(ah)) {
17414779705SSam Leffler 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: hardware self-test failed\n",
17514779705SSam Leffler 		    __func__);
17614779705SSam Leffler 		ecode = HAL_ESELFTEST;
17714779705SSam Leffler 		goto bad;
17814779705SSam Leffler 	}
17914779705SSam Leffler 
18014779705SSam Leffler 	/*
18114779705SSam Leffler 	 * Set correct Baseband to analog shift
18214779705SSam Leffler 	 * setting to access analog chips.
18314779705SSam Leffler 	 */
18414779705SSam Leffler 	OS_REG_WRITE(ah, AR_PHY(0), 0x00000007);
18514779705SSam Leffler 
18614779705SSam Leffler 	/* Read Radio Chip Rev Extract */
18714779705SSam Leffler 	AH_PRIVATE(ah)->ah_analog5GhzRev = ar5212GetRadioRev(ah);
18814779705SSam Leffler 
18914779705SSam Leffler 	rf = ath_hal_rfprobe(ah, &ecode);
19014779705SSam Leffler 	if (rf == AH_NULL)
19114779705SSam Leffler 		goto bad;
19214779705SSam Leffler 	if (IS_RAD5112(ah) && !IS_RADX112_REV2(ah)) {
19314779705SSam Leffler #ifdef AH_DEBUG
19414779705SSam Leffler 		ath_hal_printf(ah, "%s: 5112 Rev 1 is not supported by this "
19514779705SSam Leffler                          "driver (analog5GhzRev 0x%x)\n", __func__,
19614779705SSam Leffler                          AH_PRIVATE(ah)->ah_analog5GhzRev);
19714779705SSam Leffler #endif
19814779705SSam Leffler 		ecode = HAL_ENOTSUPP;
19914779705SSam Leffler 		goto bad;
20014779705SSam Leffler 	}
20114779705SSam Leffler 
20214779705SSam Leffler 	ecode = ath_hal_legacyEepromAttach(ah);
20314779705SSam Leffler 	if (ecode != HAL_OK) {
20414779705SSam Leffler 		goto bad;
20514779705SSam Leffler 	}
20614779705SSam Leffler 
20714779705SSam Leffler 	/*
20814779705SSam Leffler 	 * If Bmode and AR5212, verify 2.4 analog exists
20914779705SSam Leffler 	 */
21014779705SSam Leffler 	if (ath_hal_eepromGetFlag(ah, AR_EEP_BMODE) &&
21114779705SSam Leffler 	    (AH_PRIVATE(ah)->ah_analog5GhzRev & 0xF0) == AR_RAD5111_SREV_MAJOR) {
21214779705SSam Leffler 		/*
21314779705SSam Leffler 		 * Set correct Baseband to analog shift
21414779705SSam Leffler 		 * setting to access analog chips.
21514779705SSam Leffler 		 */
21614779705SSam Leffler 		OS_REG_WRITE(ah, AR_PHY(0), 0x00004007);
21714779705SSam Leffler 		OS_DELAY(2000);
21814779705SSam Leffler 		AH_PRIVATE(ah)->ah_analog2GhzRev = ar5212GetRadioRev(ah);
21914779705SSam Leffler 
22014779705SSam Leffler 		/* Set baseband for 5GHz chip */
22114779705SSam Leffler 		OS_REG_WRITE(ah, AR_PHY(0), 0x00000007);
22214779705SSam Leffler 		OS_DELAY(2000);
22314779705SSam Leffler 		if ((AH_PRIVATE(ah)->ah_analog2GhzRev & 0xF0) != AR_RAD2111_SREV_MAJOR) {
22414779705SSam Leffler #ifdef AH_DEBUG
22514779705SSam Leffler 			ath_hal_printf(ah, "%s: 2G Radio Chip Rev 0x%02X is not "
22614779705SSam Leffler 				"supported by this driver\n", __func__,
22714779705SSam Leffler 				AH_PRIVATE(ah)->ah_analog2GhzRev);
22814779705SSam Leffler #endif
22914779705SSam Leffler 			ecode = HAL_ENOTSUPP;
23014779705SSam Leffler 			goto bad;
23114779705SSam Leffler 		}
23214779705SSam Leffler 	}
23314779705SSam Leffler 
23414779705SSam Leffler 	ecode = ath_hal_eepromGet(ah, AR_EEP_REGDMN_0, &eeval);
23514779705SSam Leffler 	if (ecode != HAL_OK) {
23614779705SSam Leffler 		HALDEBUG(ah, HAL_DEBUG_ANY,
23714779705SSam Leffler 		    "%s: cannot read regulatory domain from EEPROM\n",
23814779705SSam Leffler 		    __func__);
23914779705SSam Leffler 		goto bad;
24014779705SSam Leffler         }
24114779705SSam Leffler 	AH_PRIVATE(ah)->ah_currentRD = eeval;
24214779705SSam Leffler 	/* XXX record serial number */
24314779705SSam Leffler 
24414779705SSam Leffler 	/* XXX other capabilities */
24514779705SSam Leffler 	/*
24614779705SSam Leffler 	 * Got everything we need now to setup the capabilities.
24714779705SSam Leffler 	 */
24814779705SSam Leffler 	if (!ar5212FillCapabilityInfo(ah)) {
24914779705SSam Leffler 		HALDEBUG(ah, HAL_DEBUG_ANY,
25014779705SSam Leffler 		    "%s: failed ar5212FillCapabilityInfo\n", __func__);
25114779705SSam Leffler 		ecode = HAL_EEREAD;
25214779705SSam Leffler 		goto bad;
25314779705SSam Leffler 	}
25414779705SSam Leffler 
25514779705SSam Leffler 	if (!rf->attach(ah, &ecode)) {
25614779705SSam Leffler 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: RF setup failed, status %u\n",
25714779705SSam Leffler 		    __func__, ecode);
25814779705SSam Leffler 		goto bad;
25914779705SSam Leffler 	}
26014779705SSam Leffler 	/* arrange a direct call instead of thunking */
26114779705SSam Leffler 	AH_PRIVATE(ah)->ah_getNfAdjust = ahp->ah_rfHal->getNfAdjust;
26214779705SSam Leffler 
26314779705SSam Leffler 	/* Initialize gain ladder thermal calibration structure */
26414779705SSam Leffler 	ar5212InitializeGainValues(ah);
26514779705SSam Leffler 
26614779705SSam Leffler         /* BSP specific call for MAC address of this WMAC device */
26714779705SSam Leffler         if (!ar5312GetMacAddr(ah)) {
26814779705SSam Leffler                 ecode = HAL_EEBADMAC;
26914779705SSam Leffler                 goto bad;
27014779705SSam Leffler         }
27114779705SSam Leffler 
27214779705SSam Leffler 	ar5312AniSetup(ah);
27314779705SSam Leffler 	ar5212InitNfCalHistBuffer(ah);
27414779705SSam Leffler 
27514779705SSam Leffler 	/* XXX EAR stuff goes here */
27614779705SSam Leffler 	return ah;
27714779705SSam Leffler 
27814779705SSam Leffler bad:
27914779705SSam Leffler 	if (ahp)
28014779705SSam Leffler 		ar5212Detach((struct ath_hal *) ahp);
28114779705SSam Leffler 	if (status)
28214779705SSam Leffler 		*status = ecode;
28314779705SSam Leffler 	return AH_NULL;
28414779705SSam Leffler }
28514779705SSam Leffler 
28614779705SSam Leffler static HAL_BOOL
ar5312GetMacAddr(struct ath_hal * ah)28714779705SSam Leffler ar5312GetMacAddr(struct ath_hal *ah)
28814779705SSam Leffler {
28914779705SSam Leffler 	const struct ar531x_boarddata *board = AR5312_BOARDCONFIG(ah);
29014779705SSam Leffler         int wlanNum = AR5312_UNIT(ah);
29114779705SSam Leffler         const uint8_t *macAddr;
29214779705SSam Leffler 
29314779705SSam Leffler 	switch (wlanNum) {
29414779705SSam Leffler 	case 0:
29514779705SSam Leffler 		macAddr = board->wlan0Mac;
29614779705SSam Leffler 		break;
29714779705SSam Leffler 	case 1:
29814779705SSam Leffler 		macAddr = board->wlan1Mac;
29914779705SSam Leffler 		break;
30014779705SSam Leffler 	default:
30114779705SSam Leffler #ifdef AH_DEBUG
30214779705SSam Leffler 		ath_hal_printf(ah, "Invalid WLAN wmac index (%d)\n",
30314779705SSam Leffler 			       wlanNum);
30414779705SSam Leffler #endif
30514779705SSam Leffler 		return AH_FALSE;
30614779705SSam Leffler 	}
30714779705SSam Leffler 	OS_MEMCPY(AH5212(ah)->ah_macaddr, macAddr, 6);
30814779705SSam Leffler 	return AH_TRUE;
30914779705SSam Leffler }
31014779705SSam Leffler 
31114779705SSam Leffler static const char*
ar5312Probe(uint16_t vendorid,uint16_t devid)31214779705SSam Leffler ar5312Probe(uint16_t vendorid, uint16_t devid)
31314779705SSam Leffler {
31414779705SSam Leffler 	if (vendorid == ATHEROS_VENDOR_ID) {
31514779705SSam Leffler 		switch (devid) {
31614779705SSam Leffler 		case AR5212_AR5312_REV2:
31714779705SSam Leffler 		case AR5212_AR5312_REV7:
31814779705SSam Leffler 			return "Atheros 5312 WiSoC";
31914779705SSam Leffler 		case AR5212_AR2313_REV8:
32014779705SSam Leffler 			return "Atheros 2313 WiSoC";
32114779705SSam Leffler 		case AR5212_AR2315_REV6:
32214779705SSam Leffler 		case AR5212_AR2315_REV7:
32314779705SSam Leffler 			return "Atheros 2315 WiSoC";
32414779705SSam Leffler 		case AR5212_AR2317_REV1:
325a4f7ec09SSam Leffler 		case AR5212_AR2317_REV2:
32614779705SSam Leffler 			return "Atheros 2317 WiSoC";
32714779705SSam Leffler 		case AR5212_AR2413:
32814779705SSam Leffler 			return "Atheros 2413";
32914779705SSam Leffler 		case AR5212_AR2417:
33014779705SSam Leffler 			return "Atheros 2417";
33114779705SSam Leffler 		}
33214779705SSam Leffler 	}
33314779705SSam Leffler 	return AH_NULL;
33414779705SSam Leffler }
33514779705SSam Leffler AH_CHIP(AR5312, ar5312Probe, ar5312Attach);
336