diff options
Diffstat (limited to 'drivers/staging/vt6656/mac.c')
| -rw-r--r-- | drivers/staging/vt6656/mac.c | 439 |
1 files changed, 107 insertions, 332 deletions
diff --git a/drivers/staging/vt6656/mac.c b/drivers/staging/vt6656/mac.c index 26c19d1408c..cadf7cd280c 100644 --- a/drivers/staging/vt6656/mac.c +++ b/drivers/staging/vt6656/mac.c @@ -35,66 +35,7 @@ #include "desc.h" #include "mac.h" #include "80211hdr.h" -#include "rndis.h" -#include "control.h" - -/*--------------------- Static Definitions -------------------------*/ -//static int msglevel =MSG_LEVEL_DEBUG; -static int msglevel =MSG_LEVEL_INFO; -/*--------------------- Static Classes ----------------------------*/ - -/*--------------------- Static Variables --------------------------*/ - -/*--------------------- Static Functions --------------------------*/ - -/*--------------------- Export Variables --------------------------*/ - -/*--------------------- Export Functions --------------------------*/ - - - - - -/* - * Description: - * Set this hash index into multicast address register bit - * - * Parameters: - * In: - * byHashIdx - Hash index to set - * Out: - * none - * - * Return Value: none - * - */ -void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx) -{ - unsigned int uByteIdx; - BYTE byBitMask; - BYTE pbyData[2]; - - - // calculate byte position - uByteIdx = byHashIdx / 8; - - // calculate bit position - byBitMask = 1; - byBitMask <<= (byHashIdx % 8); - // turn on the bit - - pbyData[0] = byBitMask; - pbyData[1] = byBitMask; - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MASK, - (WORD) (MAC_REG_MAR0 + uByteIdx), - MESSAGE_REQUEST_MACREG, - 2, - pbyData); -} - - +#include "usbpipe.h" /* * Description: @@ -102,27 +43,20 @@ void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx) * * Parameters: * In: - * uByteidx - Index of Mask - * byData - Mask Value to write + * mc_filter (mac filter) * Out: * none * * Return Value: none * */ -void MACvWriteMultiAddr(PSDevice pDevice, unsigned int uByteIdx, BYTE byData) +void MACvWriteMultiAddr(struct vnt_private *priv, u64 mc_filter) { - BYTE byData1; - - byData1 = byData; - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE, - (WORD) (MAC_REG_MAR0 + uByteIdx), - MESSAGE_REQUEST_MACREG, - 1, - &byData1); -} + __le64 le_mc = cpu_to_le64(mc_filter); + vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_MAR0, + MESSAGE_REQUEST_MACREG, sizeof(le_mc), (u8 *)&le_mc); +} /* * Description: @@ -133,56 +67,22 @@ void MACvWriteMultiAddr(PSDevice pDevice, unsigned int uByteIdx, BYTE byData) * Out: * none * - * Return Value: TRUE if success; otherwise FALSE * */ -BOOL MACbShutdown (PSDevice pDevice) +void MACbShutdown(struct vnt_private *priv) { - CONTROLnsRequestOutAsyn(pDevice, - MESSAGE_TYPE_MACSHUTDOWN, - 0, - 0, - 0, - NULL - ); - return TRUE; + vnt_control_out(priv, MESSAGE_TYPE_MACSHUTDOWN, 0, 0, 0, NULL); } -void MACvSetBBType(PSDevice pDevice,BYTE byType) +void MACvSetBBType(struct vnt_private *priv, u8 type) { -BYTE pbyData[2]; + u8 data[2]; + data[0] = type; + data[1] = EnCFG_BBType_MASK; - pbyData[0] = byType; - pbyData[1] = EnCFG_BBType_MASK; - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MASK, - MAC_REG_ENCFG0, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); -} - -void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData) -{ -BYTE pbyData[4]; - - if (wOffset > 273) - return; - pbyData[0] = (BYTE)dwData; - pbyData[1] = (BYTE)(dwData>>8); - pbyData[2] = (BYTE)(dwData>>16); - pbyData[3] = (BYTE)(dwData>>24); - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MISCFF, - wOffset, - 0, - 4, - pbyData - ); + vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_ENCFG0, + MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } /* @@ -199,32 +99,12 @@ BYTE pbyData[4]; * Return Value: none * */ -void MACvDisableKeyEntry(PSDevice pDevice, unsigned int uEntryIdx) +void MACvDisableKeyEntry(struct vnt_private *priv, u8 entry_idx) { -WORD wOffset; -BYTE byData; - - - byData = (BYTE) uEntryIdx; - - wOffset = MISCFIFO_KEYETRY0; - wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE); - - //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); - //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0); - //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE); - - //issue write misc fifo command to device - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_CLRKEYENTRY, - 0, - 0, - 1, - &byData - ); + vnt_control_out(priv, MESSAGE_TYPE_CLRKEYENTRY, 0, 0, + sizeof(entry_idx), &entry_idx); } - /* * Description: * Set the Key by MISCFIFO @@ -239,242 +119,137 @@ BYTE byData; * Return Value: none * */ -void MACvSetKeyEntry(PSDevice pDevice, WORD wKeyCtl, - unsigned int uEntryIdx, unsigned int uKeyIdx, - PBYTE pbyAddr, PDWORD pdwKey) +void MACvSetKeyEntry(struct vnt_private *priv, u16 key_ctl, u32 entry_idx, + u32 key_idx, u8 *addr, u8 *key) { -PBYTE pbyKey; -WORD wOffset; -DWORD dwData1,dwData2; -int ii; -BYTE pbyData[24]; - - if ( pDevice->byLocalID <= MAC_REVISION_A1 ) { - if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP ) - return; - } - - wOffset = MISCFIFO_KEYETRY0; - wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE); - - dwData1 = 0; - dwData1 |= wKeyCtl; - dwData1 <<= 16; - dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5)); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl); - - //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); - //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData); - //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE); - - //wOffset++; - - dwData2 = 0; - dwData2 |= *(pbyAddr+3); - dwData2 <<= 8; - dwData2 |= *(pbyAddr+2); - dwData2 <<= 8; - dwData2 |= *(pbyAddr+1); - dwData2 <<= 8; - dwData2 |= *(pbyAddr+0); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2); - - //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); - //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData); - //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE); - - //wOffset++; - - //wOffset += (uKeyIdx * 4); -/* for (ii=0;ii<4;ii++) { - // alway push 128 bits - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey); - VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii); - VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++); - VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE); - } -*/ - pbyKey = (PBYTE)pdwKey; - - pbyData[0] = (BYTE)dwData1; - pbyData[1] = (BYTE)(dwData1>>8); - pbyData[2] = (BYTE)(dwData1>>16); - pbyData[3] = (BYTE)(dwData1>>24); - pbyData[4] = (BYTE)dwData2; - pbyData[5] = (BYTE)(dwData2>>8); - pbyData[6] = (BYTE)(dwData2>>16); - pbyData[7] = (BYTE)(dwData2>>24); - for (ii = 8; ii < 24; ii++) - pbyData[ii] = *pbyKey++; - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_SETKEY, - wOffset, - (WORD)uKeyIdx, - 24, - pbyData - ); + struct vnt_mac_set_key set_key; + u16 offset; + if (priv->byLocalID <= MAC_REVISION_A1) + if (priv->vnt_mgmt.byCSSPK == KEY_CTL_CCMP) + return; -} + offset = MISCFIFO_KEYETRY0; + offset += (entry_idx * MISCFIFO_KEYENTRYSIZE); + set_key.u.write.key_ctl = cpu_to_le16(key_ctl); + memcpy(set_key.u.write.addr, addr, ETH_ALEN); -void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits) -{ -BYTE pbyData[2]; - - pbyData[0] = 0; - pbyData[1] = byBits; - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MASK, - byRegOfs, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); -} + /* swap over swap[0] and swap[1] to get correct write order */ + swap(set_key.u.swap[0], set_key.u.swap[1]); + memcpy(set_key.key, key, WLAN_KEY_LEN_CCMP); -void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits) -{ -BYTE pbyData[2]; + dev_dbg(&priv->usb->dev, "offset %d key ctl %d set key %24ph\n", + offset, key_ctl, (u8 *)&set_key); + vnt_control_out(priv, MESSAGE_TYPE_SETKEY, offset, + (u16)key_idx, sizeof(struct vnt_mac_set_key), (u8 *)&set_key); +} - pbyData[0] = byBits; - pbyData[1] = byBits; +void MACvRegBitsOff(struct vnt_private *priv, u8 reg_ofs, u8 bits) +{ + u8 data[2]; - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MASK, - byRegOfs, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); + data[0] = 0; + data[1] = bits; + + vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, + reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData) +void MACvRegBitsOn(struct vnt_private *priv, u8 reg_ofs, u8 bits) { -BYTE pbyData[2]; + u8 data[2]; + + data[0] = bits; + data[1] = bits; + vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, + reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); +} - pbyData[0] = (BYTE)(wData & 0xff); - pbyData[1] = (BYTE)(wData >> 8); +void MACvWriteWord(struct vnt_private *priv, u8 reg_ofs, u16 word) +{ + u8 data[2]; - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE, - byRegOfs, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); + data[0] = (u8)(word & 0xff); + data[1] = (u8)(word >> 8); + vnt_control_out(priv, MESSAGE_TYPE_WRITE, + reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr) +void MACvWriteBSSIDAddress(struct vnt_private *priv, u8 *addr) { -BYTE pbyData[6]; - - - pbyData[0] = *((PBYTE)pbyEtherAddr); - pbyData[1] = *((PBYTE)pbyEtherAddr+1); - pbyData[2] = *((PBYTE)pbyEtherAddr+2); - pbyData[3] = *((PBYTE)pbyEtherAddr+3); - pbyData[4] = *((PBYTE)pbyEtherAddr+4); - pbyData[5] = *((PBYTE)pbyEtherAddr+5); - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE, - MAC_REG_BSSID0, - MESSAGE_REQUEST_MACREG, - 6, - pbyData - ); + vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_BSSID0, + MESSAGE_REQUEST_MACREG, ETH_ALEN, addr); } -void MACvEnableProtectMD(PSDevice pDevice) +void MACvEnableProtectMD(struct vnt_private *priv) { -BYTE pbyData[2]; + u8 data[2]; + data[0] = EnCFG_ProtectMd; + data[1] = EnCFG_ProtectMd; - pbyData[0] = EnCFG_ProtectMd; - pbyData[1] = EnCFG_ProtectMd; - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MASK, - MAC_REG_ENCFG0, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); + vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, + MAC_REG_ENCFG0, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvDisableProtectMD(PSDevice pDevice) +void MACvDisableProtectMD(struct vnt_private *priv) { -BYTE pbyData[2]; - + u8 data[2]; - pbyData[0] = 0; - pbyData[1] = EnCFG_ProtectMd; + data[0] = 0; + data[1] = EnCFG_ProtectMd; - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MASK, - MAC_REG_ENCFG0, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); + vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, + MAC_REG_ENCFG0, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvEnableBarkerPreambleMd(PSDevice pDevice) +void MACvEnableBarkerPreambleMd(struct vnt_private *priv) { -BYTE pbyData[2]; + u8 data[2]; + data[0] = EnCFG_BarkerPream; + data[1] = EnCFG_BarkerPream; - pbyData[0] = EnCFG_BarkerPream; - pbyData[1] = EnCFG_BarkerPream; - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MASK, - MAC_REG_ENCFG2, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); + vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, + MAC_REG_ENCFG2, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvDisableBarkerPreambleMd(PSDevice pDevice) +void MACvDisableBarkerPreambleMd(struct vnt_private *priv) { -BYTE pbyData[2]; - + u8 data[2]; - pbyData[0] = 0; - pbyData[1] = EnCFG_BarkerPream; + data[0] = 0; + data[1] = EnCFG_BarkerPream; - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE_MASK, - MAC_REG_ENCFG2, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); + vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, + MAC_REG_ENCFG2, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } +void MACvWriteBeaconInterval(struct vnt_private *priv, u16 interval) +{ + u8 data[2]; + + data[0] = (u8)(interval & 0xff); + data[1] = (u8)(interval >> 8); + + vnt_control_out(priv, MESSAGE_TYPE_WRITE, + MAC_REG_BI, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); +} -void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval) +void vnt_mac_set_led(struct vnt_private *priv, u8 state, u8 led) { -BYTE pbyData[2]; - - pbyData[0] = (BYTE) (wInterval & 0xff); - pbyData[1] = (BYTE) (wInterval >> 8); - - CONTROLnsRequestOut(pDevice, - MESSAGE_TYPE_WRITE, - MAC_REG_BI, - MESSAGE_REQUEST_MACREG, - 2, - pbyData - ); + u8 data[2]; + + data[0] = led; + data[1] = state; + + vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_PAPEDELAY, + MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); + + return; } |
