Home | History | Annotate | Line # | Download | only in ic
rtwphyio.c revision 1.16
      1  1.16   tsutsui /* $NetBSD: rtwphyio.c,v 1.16 2008/03/03 12:30:57 tsutsui Exp $ */
      2   1.1    dyoung /*-
      3   1.1    dyoung  * Copyright (c) 2004, 2005 David Young.  All rights reserved.
      4   1.1    dyoung  *
      5   1.1    dyoung  * Programmed for NetBSD by David Young.
      6   1.1    dyoung  *
      7   1.1    dyoung  * Redistribution and use in source and binary forms, with or without
      8   1.1    dyoung  * modification, are permitted provided that the following conditions
      9   1.1    dyoung  * are met:
     10   1.1    dyoung  * 1. Redistributions of source code must retain the above copyright
     11   1.1    dyoung  *    notice, this list of conditions and the following disclaimer.
     12   1.1    dyoung  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1    dyoung  *    notice, this list of conditions and the following disclaimer in the
     14   1.1    dyoung  *    documentation and/or other materials provided with the distribution.
     15   1.1    dyoung  * 3. The name of David Young may not be used to endorse or promote
     16   1.1    dyoung  *    products derived from this software without specific prior
     17   1.1    dyoung  *    written permission.
     18   1.1    dyoung  *
     19   1.1    dyoung  * THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY
     20   1.1    dyoung  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     21   1.1    dyoung  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
     22   1.1    dyoung  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL David
     23   1.1    dyoung  * Young BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     24   1.1    dyoung  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
     25   1.1    dyoung  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26   1.1    dyoung  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     27   1.1    dyoung  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     28   1.1    dyoung  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     29   1.1    dyoung  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
     30   1.1    dyoung  * OF SUCH DAMAGE.
     31   1.1    dyoung  */
     32   1.1    dyoung /*
     33   1.1    dyoung  * Control input/output with the Philips SA2400 RF front-end and
     34   1.1    dyoung  * the baseband processor built into the Realtek RTL8180.
     35   1.1    dyoung  */
     36   1.1    dyoung 
     37   1.1    dyoung #include <sys/cdefs.h>
     38  1.16   tsutsui __KERNEL_RCSID(0, "$NetBSD: rtwphyio.c,v 1.16 2008/03/03 12:30:57 tsutsui Exp $");
     39   1.1    dyoung 
     40   1.1    dyoung #include <sys/param.h>
     41   1.1    dyoung #include <sys/systm.h>
     42   1.1    dyoung #include <sys/types.h>
     43  1.16   tsutsui #include <sys/device.h>
     44   1.1    dyoung 
     45  1.15        ad #include <sys/bus.h>
     46   1.1    dyoung 
     47   1.1    dyoung #include <net/if.h>
     48   1.1    dyoung #include <net/if_media.h>
     49   1.1    dyoung #include <net/if_ether.h>
     50   1.1    dyoung 
     51   1.7    dyoung #include <net80211/ieee80211_netbsd.h>
     52   1.7    dyoung #include <net80211/ieee80211_radiotap.h>
     53   1.1    dyoung #include <net80211/ieee80211_var.h>
     54   1.1    dyoung 
     55   1.1    dyoung #include <dev/ic/rtwreg.h>
     56   1.1    dyoung #include <dev/ic/max2820reg.h>
     57   1.1    dyoung #include <dev/ic/sa2400reg.h>
     58   1.1    dyoung #include <dev/ic/si4136reg.h>
     59   1.1    dyoung #include <dev/ic/rtwvar.h>
     60   1.1    dyoung #include <dev/ic/rtwphyio.h>
     61   1.1    dyoung #include <dev/ic/rtwphy.h>
     62   1.1    dyoung 
     63   1.1    dyoung static int rtw_macbangbits_timeout = 100;
     64   1.1    dyoung 
     65   1.6    dyoung uint8_t
     66   1.1    dyoung rtw_bbp_read(struct rtw_regs *regs, u_int addr)
     67   1.1    dyoung {
     68  1.12    dyoung 	KASSERT((addr & ~__SHIFTOUT_MASK(RTW_BB_ADDR_MASK)) == 0);
     69   1.1    dyoung 	RTW_WRITE(regs, RTW_BB,
     70  1.12    dyoung 	    __SHIFTIN(addr, RTW_BB_ADDR_MASK) | RTW_BB_RD_MASK | RTW_BB_WR_MASK);
     71   1.1    dyoung 	delay(10);	/* XXX */
     72   1.1    dyoung 	RTW_WBR(regs, RTW_BB, RTW_BB);
     73  1.12    dyoung 	return __SHIFTOUT(RTW_READ(regs, RTW_BB), RTW_BB_RD_MASK);
     74   1.1    dyoung }
     75   1.1    dyoung 
     76   1.1    dyoung int
     77   1.1    dyoung rtw_bbp_write(struct rtw_regs *regs, u_int addr, u_int val)
     78   1.1    dyoung {
     79   1.1    dyoung #define	BBP_WRITE_ITERS	50
     80   1.1    dyoung #define	BBP_WRITE_DELAY	1
     81   1.1    dyoung 	int i;
     82   1.1    dyoung 	uint32_t wrbbp, rdbbp;
     83   1.1    dyoung 
     84   1.4    dyoung 	RTW_DPRINTF(RTW_DEBUG_PHYIO,
     85   1.4    dyoung 	    ("%s: bbp[%u] <- %u\n", __func__, addr, val));
     86   1.1    dyoung 
     87  1.12    dyoung 	KASSERT((addr & ~__SHIFTOUT_MASK(RTW_BB_ADDR_MASK)) == 0);
     88  1.12    dyoung 	KASSERT((val & ~__SHIFTOUT_MASK(RTW_BB_WR_MASK)) == 0);
     89   1.1    dyoung 
     90  1.12    dyoung 	wrbbp = __SHIFTIN(addr, RTW_BB_ADDR_MASK) | RTW_BB_WREN |
     91  1.12    dyoung 	    __SHIFTIN(val, RTW_BB_WR_MASK) | RTW_BB_RD_MASK,
     92   1.1    dyoung 
     93  1.12    dyoung 	rdbbp = __SHIFTIN(addr, RTW_BB_ADDR_MASK) |
     94   1.1    dyoung 	    RTW_BB_WR_MASK | RTW_BB_RD_MASK;
     95   1.1    dyoung 
     96   1.4    dyoung 	RTW_DPRINTF(RTW_DEBUG_PHYIO,
     97   1.4    dyoung 	    ("%s: rdbbp = %#08x, wrbbp = %#08x\n", __func__, rdbbp, wrbbp));
     98   1.1    dyoung 
     99   1.1    dyoung 	for (i = BBP_WRITE_ITERS; --i >= 0; ) {
    100   1.1    dyoung 		RTW_RBW(regs, RTW_BB, RTW_BB);
    101   1.1    dyoung 		RTW_WRITE(regs, RTW_BB, wrbbp);
    102   1.1    dyoung 		RTW_SYNC(regs, RTW_BB, RTW_BB);
    103   1.1    dyoung 		RTW_WRITE(regs, RTW_BB, rdbbp);
    104   1.1    dyoung 		RTW_SYNC(regs, RTW_BB, RTW_BB);
    105   1.1    dyoung 		delay(BBP_WRITE_DELAY);	/* 1 microsecond */
    106  1.12    dyoung 		if (__SHIFTOUT(RTW_READ(regs, RTW_BB),
    107   1.1    dyoung 		                    RTW_BB_RD_MASK) == val) {
    108   1.4    dyoung 			RTW_DPRINTF(RTW_DEBUG_PHYIO,
    109   1.4    dyoung 			    ("%s: finished in %dus\n", __func__,
    110   1.1    dyoung 			    BBP_WRITE_DELAY * (BBP_WRITE_ITERS - i)));
    111   1.1    dyoung 			return 0;
    112   1.1    dyoung 		}
    113   1.1    dyoung 		delay(BBP_WRITE_DELAY);	/* again */
    114   1.1    dyoung 	}
    115   1.1    dyoung 	printf("%s: timeout\n", __func__);
    116   1.1    dyoung 	return -1;
    117   1.1    dyoung }
    118   1.1    dyoung 
    119   1.1    dyoung /* Help rtw_rf_hostwrite bang bits to RF over 3-wire interface. */
    120   1.9     perry static inline void
    121   1.6    dyoung rtw_rf_hostbangbits(struct rtw_regs *regs, uint32_t bits, int lo_to_hi,
    122   1.1    dyoung     u_int nbits)
    123   1.1    dyoung {
    124   1.1    dyoung 	int i;
    125   1.6    dyoung 	uint32_t mask, reg;
    126   1.1    dyoung 
    127   1.1    dyoung 	KASSERT(nbits <= 32);
    128   1.1    dyoung 
    129   1.4    dyoung 	RTW_DPRINTF(RTW_DEBUG_PHYIO,
    130   1.4    dyoung 	    ("%s: %u bits, %#08x, %s\n", __func__, nbits, bits,
    131   1.1    dyoung 	    (lo_to_hi) ? "lo to hi" : "hi to lo"));
    132   1.1    dyoung 
    133   1.1    dyoung 	reg = RTW_PHYCFG_HST;
    134   1.1    dyoung 	RTW_WRITE(regs, RTW_PHYCFG, reg);
    135   1.1    dyoung 	RTW_SYNC(regs, RTW_PHYCFG, RTW_PHYCFG);
    136   1.1    dyoung 
    137   1.1    dyoung 	if (lo_to_hi)
    138   1.1    dyoung 		mask = 0x1;
    139   1.1    dyoung 	else
    140   1.1    dyoung 		mask = 1 << (nbits - 1);
    141   1.1    dyoung 
    142   1.1    dyoung 	for (i = 0; i < nbits; i++) {
    143   1.4    dyoung 		RTW_DPRINTF(RTW_DEBUG_PHYBITIO,
    144   1.4    dyoung 		    ("%s: bits %#08x mask %#08x -> bit %#08x\n",
    145   1.1    dyoung 		    __func__, bits, mask, bits & mask));
    146   1.1    dyoung 
    147   1.1    dyoung 		if ((bits & mask) != 0)
    148   1.1    dyoung 			reg |= RTW_PHYCFG_HST_DATA;
    149   1.1    dyoung 		else
    150   1.1    dyoung 			reg &= ~RTW_PHYCFG_HST_DATA;
    151   1.1    dyoung 
    152   1.1    dyoung 		reg |= RTW_PHYCFG_HST_CLK;
    153   1.1    dyoung 		RTW_WRITE(regs, RTW_PHYCFG, reg);
    154   1.1    dyoung 		RTW_SYNC(regs, RTW_PHYCFG, RTW_PHYCFG);
    155   1.1    dyoung 
    156   1.1    dyoung 		DELAY(2);	/* arbitrary delay */
    157   1.1    dyoung 
    158   1.1    dyoung 		reg &= ~RTW_PHYCFG_HST_CLK;
    159   1.1    dyoung 		RTW_WRITE(regs, RTW_PHYCFG, reg);
    160   1.1    dyoung 		RTW_SYNC(regs, RTW_PHYCFG, RTW_PHYCFG);
    161   1.1    dyoung 
    162   1.1    dyoung 		if (lo_to_hi)
    163   1.1    dyoung 			mask <<= 1;
    164   1.1    dyoung 		else
    165   1.1    dyoung 			mask >>= 1;
    166   1.1    dyoung 	}
    167   1.1    dyoung 
    168   1.1    dyoung 	reg |= RTW_PHYCFG_HST_EN;
    169   1.1    dyoung 	KASSERT((reg & RTW_PHYCFG_HST_CLK) == 0);
    170   1.1    dyoung 	RTW_WRITE(regs, RTW_PHYCFG, reg);
    171   1.1    dyoung 	RTW_SYNC(regs, RTW_PHYCFG, RTW_PHYCFG);
    172   1.1    dyoung }
    173   1.1    dyoung 
    174   1.1    dyoung /* Help rtw_rf_macwrite: tell MAC to bang bits to RF over the 3-wire
    175   1.1    dyoung  * interface.
    176   1.1    dyoung  */
    177   1.9     perry static inline int
    178   1.6    dyoung rtw_rf_macbangbits(struct rtw_regs *regs, uint32_t reg)
    179   1.1    dyoung {
    180   1.1    dyoung 	int i;
    181   1.1    dyoung 
    182   1.4    dyoung 	RTW_DPRINTF(RTW_DEBUG_PHY, ("%s: %#08x\n", __func__, reg));
    183   1.1    dyoung 
    184   1.1    dyoung 	RTW_WRITE(regs, RTW_PHYCFG, RTW_PHYCFG_MAC_POLL | reg);
    185   1.1    dyoung 
    186   1.1    dyoung 	RTW_WBR(regs, RTW_PHYCFG, RTW_PHYCFG);
    187   1.2    dyoung 
    188   1.1    dyoung 	for (i = rtw_macbangbits_timeout; --i >= 0; delay(1)) {
    189   1.1    dyoung 		if ((RTW_READ(regs, RTW_PHYCFG) & RTW_PHYCFG_MAC_POLL) == 0) {
    190   1.4    dyoung 			RTW_DPRINTF(RTW_DEBUG_PHY,
    191   1.4    dyoung 			    ("%s: finished in %dus\n", __func__,
    192   1.1    dyoung 			    rtw_macbangbits_timeout - i));
    193   1.1    dyoung 			return 0;
    194   1.1    dyoung 		}
    195   1.1    dyoung 		RTW_RBR(regs, RTW_PHYCFG, RTW_PHYCFG);	/* XXX paranoia? */
    196   1.1    dyoung 	}
    197   1.1    dyoung 
    198   1.1    dyoung 	printf("%s: RTW_PHYCFG_MAC_POLL still set.\n", __func__);
    199   1.1    dyoung 	return -1;
    200   1.1    dyoung }
    201   1.1    dyoung 
    202   1.6    dyoung static uint32_t
    203  1.14  christos rtw_grf5101_host_crypt(u_int addr, uint32_t val)
    204   1.1    dyoung {
    205   1.1    dyoung 	/* TBD */
    206   1.1    dyoung 	return 0;
    207   1.1    dyoung }
    208   1.1    dyoung 
    209   1.6    dyoung static uint32_t
    210   1.6    dyoung rtw_grf5101_mac_crypt(u_int addr, uint32_t val)
    211   1.1    dyoung {
    212   1.6    dyoung 	uint32_t data_and_addr;
    213   1.1    dyoung #define EXTRACT_NIBBLE(d, which) (((d) >> (4 * (which))) & 0xf)
    214   1.6    dyoung 	static uint8_t caesar[16] = {0x0, 0x8, 0x4, 0xc,
    215   1.1    dyoung 	                              0x2, 0xa, 0x6, 0xe,
    216   1.1    dyoung 				      0x1, 0x9, 0x5, 0xd,
    217   1.1    dyoung 				      0x3, 0xb, 0x7, 0xf};
    218   1.1    dyoung 
    219   1.1    dyoung 	data_and_addr =  caesar[EXTRACT_NIBBLE(val, 2)] |
    220   1.1    dyoung 	                (caesar[EXTRACT_NIBBLE(val, 1)] <<  4) |
    221   1.1    dyoung 	                (caesar[EXTRACT_NIBBLE(val, 0)] <<  8) |
    222   1.1    dyoung 	                (caesar[(addr >> 1) & 0xf]      << 12) |
    223   1.1    dyoung 	                ((addr & 0x1)                   << 16) |
    224   1.1    dyoung 	                (caesar[EXTRACT_NIBBLE(val, 3)] << 24);
    225  1.12    dyoung 	return __SHIFTIN(data_and_addr,
    226   1.1    dyoung 	    RTW_PHYCFG_MAC_PHILIPS_ADDR_MASK|RTW_PHYCFG_MAC_PHILIPS_DATA_MASK);
    227   1.1    dyoung #undef EXTRACT_NIBBLE
    228   1.1    dyoung }
    229   1.1    dyoung 
    230   1.9     perry static inline const char *
    231   1.1    dyoung rtw_rfchipid_string(enum rtw_rfchipid rfchipid)
    232   1.1    dyoung {
    233   1.1    dyoung 	switch (rfchipid) {
    234   1.1    dyoung 	case RTW_RFCHIPID_MAXIM:
    235   1.1    dyoung 		return "Maxim";
    236   1.1    dyoung 	case RTW_RFCHIPID_PHILIPS:
    237   1.1    dyoung 		return "Philips";
    238   1.1    dyoung 	case RTW_RFCHIPID_GCT:
    239   1.1    dyoung 		return "GCT";
    240   1.1    dyoung 	case RTW_RFCHIPID_RFMD:
    241   1.1    dyoung 		return "RFMD";
    242   1.1    dyoung 	case RTW_RFCHIPID_INTERSIL:
    243   1.1    dyoung 		return "Intersil";
    244   1.1    dyoung 	default:
    245   1.1    dyoung 		return "unknown";
    246   1.1    dyoung 	}
    247   1.1    dyoung }
    248   1.1    dyoung 
    249   1.1    dyoung /* Bang bits over the 3-wire interface. */
    250   1.1    dyoung int
    251   1.1    dyoung rtw_rf_hostwrite(struct rtw_regs *regs, enum rtw_rfchipid rfchipid,
    252   1.6    dyoung     u_int addr, uint32_t val)
    253   1.1    dyoung {
    254   1.1    dyoung 	u_int nbits;
    255   1.1    dyoung 	int lo_to_hi;
    256   1.6    dyoung 	uint32_t bits;
    257   1.1    dyoung 
    258   1.4    dyoung 	RTW_DPRINTF(RTW_DEBUG_PHYIO, ("%s: %s[%u] <- %#08x\n", __func__,
    259   1.1    dyoung 	    rtw_rfchipid_string(rfchipid), addr, val));
    260   1.1    dyoung 
    261   1.1    dyoung 	switch (rfchipid) {
    262   1.1    dyoung 	case RTW_RFCHIPID_MAXIM:
    263   1.1    dyoung 		nbits = 16;
    264   1.1    dyoung 		lo_to_hi = 0;
    265  1.12    dyoung 		bits = __SHIFTIN(val, MAX2820_TWI_DATA_MASK) |
    266  1.12    dyoung 		       __SHIFTIN(addr, MAX2820_TWI_ADDR_MASK);
    267   1.1    dyoung 		break;
    268   1.1    dyoung 	case RTW_RFCHIPID_PHILIPS:
    269  1.12    dyoung 		KASSERT((addr & ~__SHIFTOUT_MASK(SA2400_TWI_ADDR_MASK)) == 0);
    270  1.12    dyoung 		KASSERT((val & ~__SHIFTOUT_MASK(SA2400_TWI_DATA_MASK)) == 0);
    271  1.12    dyoung 		bits = __SHIFTIN(val, SA2400_TWI_DATA_MASK) |
    272  1.12    dyoung 		       __SHIFTIN(addr, SA2400_TWI_ADDR_MASK) | SA2400_TWI_WREN;
    273   1.1    dyoung 		nbits = 32;
    274   1.1    dyoung 		lo_to_hi = 1;
    275   1.1    dyoung 		break;
    276   1.1    dyoung 	case RTW_RFCHIPID_GCT:
    277  1.12    dyoung 		KASSERT((addr & ~__SHIFTOUT_MASK(SI4126_TWI_ADDR_MASK)) == 0);
    278  1.12    dyoung 		KASSERT((val & ~__SHIFTOUT_MASK(SI4126_TWI_DATA_MASK)) == 0);
    279  1.10    dyoung 		bits = rtw_grf5101_host_crypt(addr, val);
    280  1.10    dyoung 		nbits = 21;
    281  1.10    dyoung 		lo_to_hi = 1;
    282  1.10    dyoung 		break;
    283   1.1    dyoung 	case RTW_RFCHIPID_RFMD:
    284  1.12    dyoung 		KASSERT((addr & ~__SHIFTOUT_MASK(SI4126_TWI_ADDR_MASK)) == 0);
    285  1.12    dyoung 		KASSERT((val & ~__SHIFTOUT_MASK(SI4126_TWI_DATA_MASK)) == 0);
    286  1.12    dyoung 		bits = __SHIFTIN(val, SI4126_TWI_DATA_MASK) |
    287  1.12    dyoung 		       __SHIFTIN(addr, SI4126_TWI_ADDR_MASK);
    288   1.1    dyoung 		nbits = 22;
    289   1.1    dyoung 		lo_to_hi = 0;
    290   1.1    dyoung 		break;
    291   1.1    dyoung 	case RTW_RFCHIPID_INTERSIL:
    292   1.1    dyoung 	default:
    293   1.1    dyoung 		printf("%s: unknown rfchipid %d\n", __func__, rfchipid);
    294   1.1    dyoung 		return -1;
    295   1.1    dyoung 	}
    296   1.1    dyoung 
    297   1.1    dyoung 	rtw_rf_hostbangbits(regs, bits, lo_to_hi, nbits);
    298   1.1    dyoung 
    299   1.1    dyoung 	return 0;
    300   1.1    dyoung }
    301   1.1    dyoung 
    302   1.1    dyoung static uint32_t
    303   1.1    dyoung rtw_maxim_swizzle(u_int addr, uint32_t val)
    304   1.1    dyoung {
    305   1.1    dyoung 	uint32_t hidata, lodata;
    306   1.1    dyoung 
    307   1.1    dyoung 	KASSERT((val & ~(RTW_MAXIM_LODATA_MASK|RTW_MAXIM_HIDATA_MASK)) == 0);
    308  1.12    dyoung 	lodata = __SHIFTOUT(val, RTW_MAXIM_LODATA_MASK);
    309  1.12    dyoung 	hidata = __SHIFTOUT(val, RTW_MAXIM_HIDATA_MASK);
    310  1.12    dyoung 	return __SHIFTIN(lodata, RTW_PHYCFG_MAC_MAXIM_LODATA_MASK) |
    311  1.12    dyoung 	    __SHIFTIN(hidata, RTW_PHYCFG_MAC_MAXIM_HIDATA_MASK) |
    312  1.12    dyoung 	    __SHIFTIN(addr, RTW_PHYCFG_MAC_MAXIM_ADDR_MASK);
    313   1.1    dyoung }
    314   1.1    dyoung 
    315   1.1    dyoung /* Tell the MAC what to bang over the 3-wire interface. */
    316   1.1    dyoung int
    317   1.1    dyoung rtw_rf_macwrite(struct rtw_regs *regs, enum rtw_rfchipid rfchipid,
    318   1.6    dyoung     u_int addr, uint32_t val)
    319   1.1    dyoung {
    320   1.1    dyoung 	uint32_t reg;
    321   1.1    dyoung 
    322   1.4    dyoung 	RTW_DPRINTF(RTW_DEBUG_PHYIO, ("%s: %s[%u] <- %#08x\n", __func__,
    323   1.1    dyoung 	    rtw_rfchipid_string(rfchipid), addr, val));
    324   1.1    dyoung 
    325   1.1    dyoung 	switch (rfchipid) {
    326   1.1    dyoung 	case RTW_RFCHIPID_GCT:
    327   1.1    dyoung 		reg = rtw_grf5101_mac_crypt(addr, val);
    328   1.1    dyoung 		break;
    329   1.1    dyoung 	case RTW_RFCHIPID_MAXIM:
    330   1.1    dyoung 		reg = rtw_maxim_swizzle(addr, val);
    331   1.1    dyoung 		break;
    332   1.1    dyoung 	default:		/* XXX */
    333   1.1    dyoung 	case RTW_RFCHIPID_PHILIPS:
    334   1.1    dyoung 		KASSERT(
    335  1.12    dyoung 		    (addr & ~__SHIFTOUT_MASK(RTW_PHYCFG_MAC_PHILIPS_ADDR_MASK)) == 0);
    336   1.1    dyoung 		KASSERT(
    337  1.12    dyoung 		    (val & ~__SHIFTOUT_MASK(RTW_PHYCFG_MAC_PHILIPS_DATA_MASK)) == 0);
    338   1.1    dyoung 
    339  1.12    dyoung 		reg = __SHIFTIN(addr, RTW_PHYCFG_MAC_PHILIPS_ADDR_MASK) |
    340  1.12    dyoung 		      __SHIFTIN(val, RTW_PHYCFG_MAC_PHILIPS_DATA_MASK);
    341   1.1    dyoung 	}
    342   1.1    dyoung 
    343   1.1    dyoung 	switch (rfchipid) {
    344   1.1    dyoung 	case RTW_RFCHIPID_GCT:
    345   1.1    dyoung 	case RTW_RFCHIPID_MAXIM:
    346   1.1    dyoung 	case RTW_RFCHIPID_RFMD:
    347   1.1    dyoung 		reg |= RTW_PHYCFG_MAC_RFTYPE_RFMD;
    348   1.1    dyoung 		break;
    349   1.1    dyoung 	case RTW_RFCHIPID_INTERSIL:
    350   1.1    dyoung 		reg |= RTW_PHYCFG_MAC_RFTYPE_INTERSIL;
    351   1.1    dyoung 		break;
    352   1.1    dyoung 	case RTW_RFCHIPID_PHILIPS:
    353   1.1    dyoung 		reg |= RTW_PHYCFG_MAC_RFTYPE_PHILIPS;
    354   1.1    dyoung 		break;
    355   1.1    dyoung 	default:
    356   1.1    dyoung 		printf("%s: unknown rfchipid %d\n", __func__, rfchipid);
    357   1.1    dyoung 		return -1;
    358   1.1    dyoung 	}
    359   1.1    dyoung 
    360   1.1    dyoung 	return rtw_rf_macbangbits(regs, reg);
    361   1.1    dyoung }
    362