cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rxtx.c (48049B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
      4 * All rights reserved.
      5 *
      6 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
      7 *
      8 * Author: Lyndon Chen
      9 *
     10 * Date: May 20, 2003
     11 *
     12 * Functions:
     13 *      s_vGenerateTxParameter - Generate tx dma required parameter.
     14 *      vGenerateMACHeader - Translate 802.3 to 802.11 header
     15 *      cbGetFragCount - Calculate fragment number count
     16 *      csBeacon_xmit - beacon tx function
     17 *      csMgmt_xmit - management tx function
     18 *      s_cbFillTxBufHead - fulfill tx dma buffer header
     19 *      s_uGetDataDuration - get tx data required duration
     20 *      s_uFillDataHead- fulfill tx data duration header
     21 *      s_uGetRTSCTSDuration- get rtx/cts required duration
     22 *      get_rtscts_time- get rts/cts reserved time
     23 *      s_uGetTxRsvTime- get frame reserved time
     24 *      s_vFillCTSHead- fulfill CTS ctl header
     25 *      s_vFillFragParameter- Set fragment ctl parameter.
     26 *      s_vFillRTSHead- fulfill RTS ctl header
     27 *      s_vFillTxKey- fulfill tx encrypt key
     28 *      s_vSWencryption- Software encrypt header
     29 *      vDMA0_tx_80211- tx 802.11 frame via dma0
     30 *      vGenerateFIFOHeader- Generate tx FIFO ctl header
     31 *
     32 * Revision History:
     33 *
     34 */
     35
     36#include "device.h"
     37#include "rxtx.h"
     38#include "card.h"
     39#include "mac.h"
     40#include "baseband.h"
     41#include "rf.h"
     42
     43/*---------------------  Static Definitions -------------------------*/
     44
     45/*---------------------  Static Classes  ----------------------------*/
     46
     47/*---------------------  Static Variables  --------------------------*/
     48
     49/*---------------------  Static Functions  --------------------------*/
     50
     51/*---------------------  Static Definitions -------------------------*/
     52/* if packet size < 256 -> in-direct send
     53 * vpacket size >= 256 -> direct send
     54 */
     55#define CRITICAL_PACKET_LEN      256
     56
     57static const unsigned short wTimeStampOff[2][MAX_RATE] = {
     58	{384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, /* Long Preamble */
     59	{384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, /* Short Preamble */
     60};
     61
     62static const unsigned short wFB_Opt0[2][5] = {
     63	{RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, /* fallback_rate0 */
     64	{RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, /* fallback_rate1 */
     65};
     66
     67static const unsigned short wFB_Opt1[2][5] = {
     68	{RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, /* fallback_rate0 */
     69	{RATE_6M,  RATE_6M,  RATE_12M, RATE_12M, RATE_18M}, /* fallback_rate1 */
     70};
     71
     72#define RTSDUR_BB       0
     73#define RTSDUR_BA       1
     74#define RTSDUR_AA       2
     75#define CTSDUR_BA       3
     76#define RTSDUR_BA_F0    4
     77#define RTSDUR_AA_F0    5
     78#define RTSDUR_BA_F1    6
     79#define RTSDUR_AA_F1    7
     80#define CTSDUR_BA_F0    8
     81#define CTSDUR_BA_F1    9
     82#define DATADUR_B       10
     83#define DATADUR_A       11
     84#define DATADUR_A_F0    12
     85#define DATADUR_A_F1    13
     86
     87/*---------------------  Static Functions  --------------------------*/
     88static
     89void
     90s_vFillRTSHead(
     91	struct vnt_private *pDevice,
     92	unsigned char byPktType,
     93	void *pvRTS,
     94	unsigned int	cbFrameLength,
     95	bool bNeedAck,
     96	bool bDisCRC,
     97	struct ieee80211_hdr *hdr,
     98	unsigned short wCurrentRate,
     99	unsigned char byFBOption
    100);
    101
    102static
    103void
    104s_vGenerateTxParameter(
    105	struct vnt_private *pDevice,
    106	unsigned char byPktType,
    107	struct vnt_tx_fifo_head *,
    108	void *pvRrvTime,
    109	void *pvRTS,
    110	void *pvCTS,
    111	unsigned int	cbFrameSize,
    112	bool bNeedACK,
    113	unsigned int	uDMAIdx,
    114	void *psEthHeader,
    115	unsigned short wCurrentRate
    116);
    117
    118static unsigned int
    119s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
    120		  unsigned char *pbyTxBufferAddr,
    121		  unsigned int uDMAIdx, struct vnt_tx_desc *pHeadTD,
    122		  unsigned int uNodeIndex);
    123
    124static
    125__le16
    126s_uFillDataHead(
    127	struct vnt_private *pDevice,
    128	unsigned char byPktType,
    129	void *pTxDataHead,
    130	unsigned int cbFrameLength,
    131	unsigned int uDMAIdx,
    132	bool bNeedAck,
    133	unsigned int uFragIdx,
    134	unsigned int cbLastFragmentSize,
    135	unsigned int uMACfragNum,
    136	unsigned char byFBOption,
    137	unsigned short wCurrentRate,
    138	bool is_pspoll
    139);
    140
    141/*---------------------  Export Variables  --------------------------*/
    142
    143static __le16 vnt_time_stamp_off(struct vnt_private *priv, u16 rate)
    144{
    145	return cpu_to_le16(wTimeStampOff[priv->preamble_type % 2]
    146							[rate % MAX_RATE]);
    147}
    148
    149/* byPktType : PK_TYPE_11A     0
    150 * PK_TYPE_11B     1
    151 * PK_TYPE_11GB    2
    152 * PK_TYPE_11GA    3
    153 */
    154static
    155unsigned int
    156s_uGetTxRsvTime(
    157	struct vnt_private *pDevice,
    158	unsigned char byPktType,
    159	unsigned int cbFrameLength,
    160	unsigned short wRate,
    161	bool bNeedAck
    162)
    163{
    164	unsigned int uDataTime, uAckTime;
    165
    166	uDataTime = bb_get_frame_time(pDevice->preamble_type, byPktType, cbFrameLength, wRate);
    167
    168	if (!bNeedAck)
    169		return uDataTime;
    170
    171	/*
    172	 * CCK mode  - 11b
    173	 * OFDM mode - 11g 2.4G & 11a 5G
    174	 */
    175	uAckTime = bb_get_frame_time(pDevice->preamble_type, byPktType, 14,
    176				     byPktType == PK_TYPE_11B ?
    177				     pDevice->byTopCCKBasicRate :
    178				     pDevice->byTopOFDMBasicRate);
    179
    180	return uDataTime + pDevice->uSIFS + uAckTime;
    181}
    182
    183static __le16 vnt_rxtx_rsvtime_le16(struct vnt_private *priv, u8 pkt_type,
    184				    u32 frame_length, u16 rate, bool need_ack)
    185{
    186	return cpu_to_le16((u16)s_uGetTxRsvTime(priv, pkt_type,
    187						frame_length, rate, need_ack));
    188}
    189
    190/* byFreqType: 0=>5GHZ 1=>2.4GHZ */
    191static __le16 get_rtscts_time(struct vnt_private *priv,
    192			      unsigned char rts_rsvtype,
    193			      unsigned char pkt_type,
    194			      unsigned int frame_length,
    195			      unsigned short current_rate)
    196{
    197	unsigned int rrv_time = 0;
    198	unsigned int rts_time = 0;
    199	unsigned int cts_time = 0;
    200	unsigned int ack_time = 0;
    201	unsigned int data_time = 0;
    202
    203	data_time = bb_get_frame_time(priv->preamble_type, pkt_type, frame_length, current_rate);
    204	if (rts_rsvtype == 0) { /* RTSTxRrvTime_bb */
    205		rts_time = bb_get_frame_time(priv->preamble_type, pkt_type, 20, priv->byTopCCKBasicRate);
    206		ack_time = bb_get_frame_time(priv->preamble_type, pkt_type, 14, priv->byTopCCKBasicRate);
    207		cts_time = ack_time;
    208	} else if (rts_rsvtype == 1) { /* RTSTxRrvTime_ba, only in 2.4GHZ */
    209		rts_time = bb_get_frame_time(priv->preamble_type, pkt_type, 20, priv->byTopCCKBasicRate);
    210		cts_time = bb_get_frame_time(priv->preamble_type, pkt_type, 14, priv->byTopCCKBasicRate);
    211		ack_time = bb_get_frame_time(priv->preamble_type, pkt_type, 14, priv->byTopOFDMBasicRate);
    212	} else if (rts_rsvtype == 2) { /* RTSTxRrvTime_aa */
    213		rts_time = bb_get_frame_time(priv->preamble_type, pkt_type, 20, priv->byTopOFDMBasicRate);
    214		ack_time = bb_get_frame_time(priv->preamble_type, pkt_type, 14, priv->byTopOFDMBasicRate);
    215		cts_time = ack_time;
    216	} else if (rts_rsvtype == 3) { /* CTSTxRrvTime_ba, only in 2.4GHZ */
    217		cts_time = bb_get_frame_time(priv->preamble_type, pkt_type, 14, priv->byTopCCKBasicRate);
    218		ack_time = bb_get_frame_time(priv->preamble_type, pkt_type, 14, priv->byTopOFDMBasicRate);
    219		rrv_time = cts_time + ack_time + data_time + 2 * priv->uSIFS;
    220		return cpu_to_le16((u16)rrv_time);
    221	}
    222
    223	/* RTSRrvTime */
    224	rrv_time = rts_time + cts_time + ack_time + data_time + 3 * priv->uSIFS;
    225	return cpu_to_le16((u16)rrv_time);
    226}
    227
    228/* byFreqType 0: 5GHz, 1:2.4Ghz */
    229static
    230unsigned int
    231s_uGetDataDuration(
    232	struct vnt_private *pDevice,
    233	unsigned char byDurType,
    234	unsigned int cbFrameLength,
    235	unsigned char byPktType,
    236	unsigned short wRate,
    237	bool bNeedAck,
    238	unsigned int uFragIdx,
    239	unsigned int cbLastFragmentSize,
    240	unsigned int uMACfragNum,
    241	unsigned char byFBOption
    242)
    243{
    244	bool bLastFrag = false;
    245	unsigned int uAckTime = 0, uNextPktTime = 0, len;
    246
    247	if (uFragIdx == (uMACfragNum - 1))
    248		bLastFrag = true;
    249
    250	if (uFragIdx == (uMACfragNum - 2))
    251		len = cbLastFragmentSize;
    252	else
    253		len = cbFrameLength;
    254
    255	switch (byDurType) {
    256	case DATADUR_B:    /* DATADUR_B */
    257		if (bNeedAck) {
    258			uAckTime = bb_get_frame_time(pDevice->preamble_type,
    259						     byPktType, 14,
    260						     pDevice->byTopCCKBasicRate);
    261		}
    262		/* Non Frag or Last Frag */
    263		if ((uMACfragNum == 1) || bLastFrag) {
    264			if (!bNeedAck)
    265				return 0;
    266		} else {
    267			/* First Frag or Mid Frag */
    268			uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType,
    269						       len, wRate, bNeedAck);
    270		}
    271
    272		return pDevice->uSIFS + uAckTime + uNextPktTime;
    273
    274	case DATADUR_A:    /* DATADUR_A */
    275		if (bNeedAck) {
    276			uAckTime = bb_get_frame_time(pDevice->preamble_type,
    277						     byPktType, 14,
    278						     pDevice->byTopOFDMBasicRate);
    279		}
    280		/* Non Frag or Last Frag */
    281		if ((uMACfragNum == 1) || bLastFrag) {
    282			if (!bNeedAck)
    283				return 0;
    284		} else {
    285			/* First Frag or Mid Frag */
    286			uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType,
    287						       len, wRate, bNeedAck);
    288		}
    289
    290		return pDevice->uSIFS + uAckTime + uNextPktTime;
    291
    292	case DATADUR_A_F0:    /* DATADUR_A_F0 */
    293	case DATADUR_A_F1:    /* DATADUR_A_F1 */
    294		if (bNeedAck) {
    295			uAckTime = bb_get_frame_time(pDevice->preamble_type,
    296						     byPktType, 14,
    297						     pDevice->byTopOFDMBasicRate);
    298		}
    299		/* Non Frag or Last Frag */
    300		if ((uMACfragNum == 1) || bLastFrag) {
    301			if (!bNeedAck)
    302				return 0;
    303		} else {
    304			/* First Frag or Mid Frag */
    305			if (wRate < RATE_18M)
    306				wRate = RATE_18M;
    307			else if (wRate > RATE_54M)
    308				wRate = RATE_54M;
    309
    310			wRate -= RATE_18M;
    311
    312			if (byFBOption == AUTO_FB_0)
    313				wRate = wFB_Opt0[FB_RATE0][wRate];
    314			else
    315				wRate = wFB_Opt1[FB_RATE0][wRate];
    316
    317			uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType,
    318						       len, wRate, bNeedAck);
    319		}
    320
    321		return pDevice->uSIFS + uAckTime + uNextPktTime;
    322
    323	default:
    324		break;
    325	}
    326
    327	return 0;
    328}
    329
    330/* byFreqType: 0=>5GHZ 1=>2.4GHZ */
    331static
    332__le16
    333s_uGetRTSCTSDuration(
    334	struct vnt_private *pDevice,
    335	unsigned char byDurType,
    336	unsigned int cbFrameLength,
    337	unsigned char byPktType,
    338	unsigned short wRate,
    339	bool bNeedAck,
    340	unsigned char byFBOption
    341)
    342{
    343	unsigned int uCTSTime = 0, uDurTime = 0;
    344
    345	switch (byDurType) {
    346	case RTSDUR_BB:    /* RTSDuration_bb */
    347		uCTSTime = bb_get_frame_time(pDevice->preamble_type, byPktType, 14, pDevice->byTopCCKBasicRate);
    348		uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
    349		break;
    350
    351	case RTSDUR_BA:    /* RTSDuration_ba */
    352		uCTSTime = bb_get_frame_time(pDevice->preamble_type, byPktType, 14, pDevice->byTopCCKBasicRate);
    353		uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
    354		break;
    355
    356	case RTSDUR_AA:    /* RTSDuration_aa */
    357		uCTSTime = bb_get_frame_time(pDevice->preamble_type, byPktType, 14, pDevice->byTopOFDMBasicRate);
    358		uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
    359		break;
    360
    361	case CTSDUR_BA:    /* CTSDuration_ba */
    362		uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
    363		break;
    364
    365	case RTSDUR_BA_F0: /* RTSDuration_ba_f0 */
    366		uCTSTime = bb_get_frame_time(pDevice->preamble_type, byPktType, 14, pDevice->byTopCCKBasicRate);
    367		if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    368			uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate - RATE_18M], bNeedAck);
    369		else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    370			uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate - RATE_18M], bNeedAck);
    371
    372		break;
    373
    374	case RTSDUR_AA_F0: /* RTSDuration_aa_f0 */
    375		uCTSTime = bb_get_frame_time(pDevice->preamble_type, byPktType, 14, pDevice->byTopOFDMBasicRate);
    376		if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    377			uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate - RATE_18M], bNeedAck);
    378		else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    379			uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate - RATE_18M], bNeedAck);
    380
    381		break;
    382
    383	case RTSDUR_BA_F1: /* RTSDuration_ba_f1 */
    384		uCTSTime = bb_get_frame_time(pDevice->preamble_type, byPktType, 14, pDevice->byTopCCKBasicRate);
    385		if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    386			uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate - RATE_18M], bNeedAck);
    387		else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    388			uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate - RATE_18M], bNeedAck);
    389
    390		break;
    391
    392	case RTSDUR_AA_F1: /* RTSDuration_aa_f1 */
    393		uCTSTime = bb_get_frame_time(pDevice->preamble_type, byPktType, 14, pDevice->byTopOFDMBasicRate);
    394		if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    395			uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate - RATE_18M], bNeedAck);
    396		else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    397			uDurTime = uCTSTime + 2 * pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate - RATE_18M], bNeedAck);
    398
    399		break;
    400
    401	case CTSDUR_BA_F0: /* CTSDuration_ba_f0 */
    402		if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    403			uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate - RATE_18M], bNeedAck);
    404		else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    405			uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate - RATE_18M], bNeedAck);
    406
    407		break;
    408
    409	case CTSDUR_BA_F1: /* CTSDuration_ba_f1 */
    410		if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    411			uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate - RATE_18M], bNeedAck);
    412		else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <= RATE_54M))
    413			uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate - RATE_18M], bNeedAck);
    414
    415		break;
    416
    417	default:
    418		break;
    419	}
    420
    421	return cpu_to_le16((u16)uDurTime);
    422}
    423
    424static
    425__le16
    426s_uFillDataHead(
    427	struct vnt_private *pDevice,
    428	unsigned char byPktType,
    429	void *pTxDataHead,
    430	unsigned int cbFrameLength,
    431	unsigned int uDMAIdx,
    432	bool bNeedAck,
    433	unsigned int uFragIdx,
    434	unsigned int cbLastFragmentSize,
    435	unsigned int uMACfragNum,
    436	unsigned char byFBOption,
    437	unsigned short wCurrentRate,
    438	bool is_pspoll
    439)
    440{
    441	struct vnt_tx_datahead_ab *buf = pTxDataHead;
    442
    443	if (!pTxDataHead)
    444		return 0;
    445
    446	if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
    447		/* Auto Fallback */
    448		struct vnt_tx_datahead_g_fb *buf = pTxDataHead;
    449
    450		if (byFBOption == AUTO_FB_NONE) {
    451			struct vnt_tx_datahead_g *buf = pTxDataHead;
    452			/* Get SignalField, ServiceField & Length */
    453			vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
    454					  byPktType, &buf->a);
    455
    456			vnt_get_phy_field(pDevice, cbFrameLength,
    457					  pDevice->byTopCCKBasicRate,
    458					  PK_TYPE_11B, &buf->b);
    459
    460			if (is_pspoll) {
    461				__le16 dur = cpu_to_le16(pDevice->current_aid | BIT(14) | BIT(15));
    462
    463				buf->duration_a = dur;
    464				buf->duration_b = dur;
    465			} else {
    466				/* Get Duration and TimeStamp */
    467				buf->duration_a =
    468					cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
    469									    byPktType, wCurrentRate, bNeedAck, uFragIdx,
    470									    cbLastFragmentSize, uMACfragNum,
    471									    byFBOption));
    472				buf->duration_b =
    473					cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
    474									    PK_TYPE_11B, pDevice->byTopCCKBasicRate,
    475									    bNeedAck, uFragIdx, cbLastFragmentSize,
    476									    uMACfragNum, byFBOption));
    477			}
    478
    479			buf->time_stamp_off_a = vnt_time_stamp_off(pDevice, wCurrentRate);
    480			buf->time_stamp_off_b = vnt_time_stamp_off(pDevice, pDevice->byTopCCKBasicRate);
    481
    482			return buf->duration_a;
    483		}
    484
    485		/* Get SignalField, ServiceField & Length */
    486		vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
    487				  byPktType, &buf->a);
    488
    489		vnt_get_phy_field(pDevice, cbFrameLength,
    490				  pDevice->byTopCCKBasicRate,
    491				  PK_TYPE_11B, &buf->b);
    492		/* Get Duration and TimeStamp */
    493		buf->duration_a = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
    494								      wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
    495		buf->duration_b = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
    496								       pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
    497		buf->duration_a_f0 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
    498									  wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
    499		buf->duration_a_f1 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
    500									 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
    501
    502		buf->time_stamp_off_a = vnt_time_stamp_off(pDevice, wCurrentRate);
    503		buf->time_stamp_off_b = vnt_time_stamp_off(pDevice, pDevice->byTopCCKBasicRate);
    504
    505		return buf->duration_a;
    506		  /* if (byFBOption == AUTO_FB_NONE) */
    507	} else if (byPktType == PK_TYPE_11A) {
    508		struct vnt_tx_datahead_ab *buf = pTxDataHead;
    509
    510		if (byFBOption != AUTO_FB_NONE) {
    511			/* Auto Fallback */
    512			struct vnt_tx_datahead_a_fb *buf = pTxDataHead;
    513			/* Get SignalField, ServiceField & Length */
    514			vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
    515					  byPktType, &buf->a);
    516
    517			/* Get Duration and TimeStampOff */
    518			buf->duration = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
    519									    wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
    520			buf->duration_f0 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
    521									       wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
    522			buf->duration_f1 = cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
    523										wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption));
    524			buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
    525			return buf->duration;
    526		}
    527
    528		/* Get SignalField, ServiceField & Length */
    529		vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
    530				  byPktType, &buf->ab);
    531
    532		if (is_pspoll) {
    533			__le16 dur = cpu_to_le16(pDevice->current_aid | BIT(14) | BIT(15));
    534
    535			buf->duration = dur;
    536		} else {
    537			/* Get Duration and TimeStampOff */
    538			buf->duration =
    539				cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
    540								    wCurrentRate, bNeedAck, uFragIdx,
    541								    cbLastFragmentSize, uMACfragNum,
    542								    byFBOption));
    543		}
    544
    545		buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
    546		return buf->duration;
    547	}
    548
    549	/* Get SignalField, ServiceField & Length */
    550	vnt_get_phy_field(pDevice, cbFrameLength, wCurrentRate,
    551			  byPktType, &buf->ab);
    552
    553	if (is_pspoll) {
    554		__le16 dur = cpu_to_le16(pDevice->current_aid | BIT(14) | BIT(15));
    555
    556		buf->duration = dur;
    557	} else {
    558		/* Get Duration and TimeStampOff */
    559		buf->duration =
    560			cpu_to_le16((u16)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
    561							    wCurrentRate, bNeedAck, uFragIdx,
    562							    cbLastFragmentSize, uMACfragNum,
    563							    byFBOption));
    564	}
    565
    566	buf->time_stamp_off = vnt_time_stamp_off(pDevice, wCurrentRate);
    567	return buf->duration;
    568}
    569
    570static
    571void
    572s_vFillRTSHead(
    573	struct vnt_private *pDevice,
    574	unsigned char byPktType,
    575	void *pvRTS,
    576	unsigned int cbFrameLength,
    577	bool bNeedAck,
    578	bool bDisCRC,
    579	struct ieee80211_hdr *hdr,
    580	unsigned short wCurrentRate,
    581	unsigned char byFBOption
    582)
    583{
    584	unsigned int uRTSFrameLen = 20;
    585
    586	if (!pvRTS)
    587		return;
    588
    589	if (bDisCRC) {
    590		/* When CRCDIS bit is on, H/W forgot to generate FCS for
    591		 * RTS frame, in this case we need to decrease its length by 4.
    592		 */
    593		uRTSFrameLen -= 4;
    594	}
    595
    596	/* Note: So far RTSHead doesn't appear in ATIM & Beacom DMA,
    597	 * so we don't need to take them into account.
    598	 * Otherwise, we need to modify codes for them.
    599	 */
    600	if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
    601		if (byFBOption == AUTO_FB_NONE) {
    602			struct vnt_rts_g *buf = pvRTS;
    603			/* Get SignalField, ServiceField & Length */
    604			vnt_get_phy_field(pDevice, uRTSFrameLen,
    605					  pDevice->byTopCCKBasicRate,
    606					  PK_TYPE_11B, &buf->b);
    607
    608			vnt_get_phy_field(pDevice, uRTSFrameLen,
    609					  pDevice->byTopOFDMBasicRate,
    610					  byPktType, &buf->a);
    611			/* Get Duration */
    612			buf->duration_bb =
    613				s_uGetRTSCTSDuration(pDevice, RTSDUR_BB,
    614						     cbFrameLength, PK_TYPE_11B,
    615						     pDevice->byTopCCKBasicRate,
    616						     bNeedAck, byFBOption);
    617			buf->duration_aa =
    618				s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
    619						     cbFrameLength, byPktType,
    620						     wCurrentRate, bNeedAck,
    621						     byFBOption);
    622			buf->duration_ba =
    623				s_uGetRTSCTSDuration(pDevice, RTSDUR_BA,
    624						     cbFrameLength, byPktType,
    625						     wCurrentRate, bNeedAck,
    626						     byFBOption);
    627
    628			buf->data.duration = buf->duration_aa;
    629			/* Get RTS Frame body */
    630			buf->data.frame_control =
    631					cpu_to_le16(IEEE80211_FTYPE_CTL |
    632						    IEEE80211_STYPE_RTS);
    633
    634			ether_addr_copy(buf->data.ra, hdr->addr1);
    635			ether_addr_copy(buf->data.ta, hdr->addr2);
    636		} else {
    637			struct vnt_rts_g_fb *buf = pvRTS;
    638			/* Get SignalField, ServiceField & Length */
    639			vnt_get_phy_field(pDevice, uRTSFrameLen,
    640					  pDevice->byTopCCKBasicRate,
    641					  PK_TYPE_11B, &buf->b);
    642
    643			vnt_get_phy_field(pDevice, uRTSFrameLen,
    644					  pDevice->byTopOFDMBasicRate,
    645					  byPktType, &buf->a);
    646			/* Get Duration */
    647			buf->duration_bb =
    648				s_uGetRTSCTSDuration(pDevice, RTSDUR_BB,
    649						     cbFrameLength, PK_TYPE_11B,
    650						     pDevice->byTopCCKBasicRate,
    651						     bNeedAck, byFBOption);
    652			buf->duration_aa =
    653				s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
    654						     cbFrameLength, byPktType,
    655						     wCurrentRate, bNeedAck,
    656						     byFBOption);
    657			buf->duration_ba =
    658				s_uGetRTSCTSDuration(pDevice, RTSDUR_BA,
    659						     cbFrameLength, byPktType,
    660						     wCurrentRate, bNeedAck,
    661						     byFBOption);
    662			buf->rts_duration_ba_f0 =
    663				s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0,
    664						     cbFrameLength, byPktType,
    665						     wCurrentRate, bNeedAck,
    666						     byFBOption);
    667			buf->rts_duration_aa_f0 =
    668				s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0,
    669						     cbFrameLength, byPktType,
    670						     wCurrentRate, bNeedAck,
    671						     byFBOption);
    672			buf->rts_duration_ba_f1 =
    673				s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1,
    674						     cbFrameLength, byPktType,
    675						     wCurrentRate, bNeedAck,
    676						     byFBOption);
    677			buf->rts_duration_aa_f1 =
    678				s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1,
    679						     cbFrameLength, byPktType,
    680						     wCurrentRate, bNeedAck,
    681						     byFBOption);
    682			buf->data.duration = buf->duration_aa;
    683			/* Get RTS Frame body */
    684			buf->data.frame_control =
    685					cpu_to_le16(IEEE80211_FTYPE_CTL |
    686						    IEEE80211_STYPE_RTS);
    687
    688			ether_addr_copy(buf->data.ra, hdr->addr1);
    689			ether_addr_copy(buf->data.ta, hdr->addr2);
    690		} /* if (byFBOption == AUTO_FB_NONE) */
    691	} else if (byPktType == PK_TYPE_11A) {
    692		if (byFBOption == AUTO_FB_NONE) {
    693			struct vnt_rts_ab *buf = pvRTS;
    694			/* Get SignalField, ServiceField & Length */
    695			vnt_get_phy_field(pDevice, uRTSFrameLen,
    696					  pDevice->byTopOFDMBasicRate,
    697					  byPktType, &buf->ab);
    698			/* Get Duration */
    699			buf->duration =
    700				s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
    701						     cbFrameLength, byPktType,
    702						     wCurrentRate, bNeedAck,
    703						     byFBOption);
    704			buf->data.duration = buf->duration;
    705			/* Get RTS Frame body */
    706			buf->data.frame_control =
    707					cpu_to_le16(IEEE80211_FTYPE_CTL |
    708						    IEEE80211_STYPE_RTS);
    709
    710			ether_addr_copy(buf->data.ra, hdr->addr1);
    711			ether_addr_copy(buf->data.ta, hdr->addr2);
    712		} else {
    713			struct vnt_rts_a_fb *buf = pvRTS;
    714			/* Get SignalField, ServiceField & Length */
    715			vnt_get_phy_field(pDevice, uRTSFrameLen,
    716					  pDevice->byTopOFDMBasicRate,
    717					  byPktType, &buf->a);
    718			/* Get Duration */
    719			buf->duration =
    720				s_uGetRTSCTSDuration(pDevice, RTSDUR_AA,
    721						     cbFrameLength, byPktType,
    722						     wCurrentRate, bNeedAck,
    723						     byFBOption);
    724			buf->rts_duration_f0 =
    725				s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0,
    726						     cbFrameLength, byPktType,
    727						     wCurrentRate, bNeedAck,
    728						     byFBOption);
    729			buf->rts_duration_f1 =
    730				s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1,
    731						     cbFrameLength, byPktType,
    732						     wCurrentRate, bNeedAck,
    733						     byFBOption);
    734			buf->data.duration = buf->duration;
    735			/* Get RTS Frame body */
    736			buf->data.frame_control =
    737					cpu_to_le16(IEEE80211_FTYPE_CTL |
    738						    IEEE80211_STYPE_RTS);
    739
    740			ether_addr_copy(buf->data.ra, hdr->addr1);
    741			ether_addr_copy(buf->data.ta, hdr->addr2);
    742		}
    743	} else if (byPktType == PK_TYPE_11B) {
    744		struct vnt_rts_ab *buf = pvRTS;
    745		/* Get SignalField, ServiceField & Length */
    746		vnt_get_phy_field(pDevice, uRTSFrameLen,
    747				  pDevice->byTopCCKBasicRate,
    748				  PK_TYPE_11B, &buf->ab);
    749		/* Get Duration */
    750		buf->duration =
    751			s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength,
    752					     byPktType, wCurrentRate, bNeedAck,
    753					     byFBOption);
    754
    755		buf->data.duration = buf->duration;
    756		/* Get RTS Frame body */
    757		buf->data.frame_control =
    758			cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
    759
    760		ether_addr_copy(buf->data.ra, hdr->addr1);
    761		ether_addr_copy(buf->data.ta, hdr->addr2);
    762	}
    763}
    764
    765static
    766void
    767s_vFillCTSHead(
    768	struct vnt_private *pDevice,
    769	unsigned int uDMAIdx,
    770	unsigned char byPktType,
    771	void *pvCTS,
    772	unsigned int cbFrameLength,
    773	bool bNeedAck,
    774	bool bDisCRC,
    775	unsigned short wCurrentRate,
    776	unsigned char byFBOption
    777)
    778{
    779	unsigned int uCTSFrameLen = 14;
    780
    781	if (!pvCTS)
    782		return;
    783
    784	if (bDisCRC) {
    785		/* When CRCDIS bit is on, H/W forgot to generate FCS for
    786		 * CTS frame, in this case we need to decrease its length by 4.
    787		 */
    788		uCTSFrameLen -= 4;
    789	}
    790
    791	if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
    792		if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
    793			/* Auto Fall back */
    794			struct vnt_cts_fb *buf = pvCTS;
    795			/* Get SignalField, ServiceField & Length */
    796			vnt_get_phy_field(pDevice, uCTSFrameLen,
    797					  pDevice->byTopCCKBasicRate,
    798					  PK_TYPE_11B, &buf->b);
    799
    800			buf->duration_ba =
    801				s_uGetRTSCTSDuration(pDevice, CTSDUR_BA,
    802						     cbFrameLength, byPktType,
    803						     wCurrentRate, bNeedAck,
    804						     byFBOption);
    805
    806			/* Get CTSDuration_ba_f0 */
    807			buf->cts_duration_ba_f0 =
    808				s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0,
    809						     cbFrameLength, byPktType,
    810						     wCurrentRate, bNeedAck,
    811						     byFBOption);
    812
    813			/* Get CTSDuration_ba_f1 */
    814			buf->cts_duration_ba_f1 =
    815				s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1,
    816						     cbFrameLength, byPktType,
    817						     wCurrentRate, bNeedAck,
    818						     byFBOption);
    819
    820			/* Get CTS Frame body */
    821			buf->data.duration = buf->duration_ba;
    822
    823			buf->data.frame_control =
    824				cpu_to_le16(IEEE80211_FTYPE_CTL |
    825					    IEEE80211_STYPE_CTS);
    826
    827			buf->reserved2 = 0x0;
    828
    829			ether_addr_copy(buf->data.ra,
    830					pDevice->abyCurrentNetAddr);
    831		} else { /* if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) */
    832			struct vnt_cts *buf = pvCTS;
    833			/* Get SignalField, ServiceField & Length */
    834			vnt_get_phy_field(pDevice, uCTSFrameLen,
    835					  pDevice->byTopCCKBasicRate,
    836					  PK_TYPE_11B, &buf->b);
    837
    838			/* Get CTSDuration_ba */
    839			buf->duration_ba =
    840				s_uGetRTSCTSDuration(pDevice, CTSDUR_BA,
    841						     cbFrameLength, byPktType,
    842						     wCurrentRate, bNeedAck,
    843						     byFBOption);
    844
    845			/* Get CTS Frame body */
    846			buf->data.duration = buf->duration_ba;
    847
    848			buf->data.frame_control =
    849				cpu_to_le16(IEEE80211_FTYPE_CTL |
    850					    IEEE80211_STYPE_CTS);
    851
    852			buf->reserved2 = 0x0;
    853			ether_addr_copy(buf->data.ra,
    854					pDevice->abyCurrentNetAddr);
    855		}
    856	}
    857}
    858
    859/*
    860 *
    861 * Description:
    862 *      Generate FIFO control for MAC & Baseband controller
    863 *
    864 * Parameters:
    865 *  In:
    866 *      pDevice         - Pointer to adapter
    867 *      pTxDataHead     - Transmit Data Buffer
    868 *      pTxBufHead      - pTxBufHead
    869 *      pvRrvTime        - pvRrvTime
    870 *      pvRTS            - RTS Buffer
    871 *      pCTS            - CTS Buffer
    872 *      cbFrameSize     - Transmit Data Length (Hdr+Payload+FCS)
    873 *      bNeedACK        - If need ACK
    874 *      uDescIdx        - Desc Index
    875 *  Out:
    876 *      none
    877 *
    878 * Return Value: none
    879 *
    880 -
    881 * unsigned int cbFrameSize, Hdr+Payload+FCS
    882 */
    883static
    884void
    885s_vGenerateTxParameter(
    886	struct vnt_private *pDevice,
    887	unsigned char byPktType,
    888	struct vnt_tx_fifo_head *tx_buffer_head,
    889	void *pvRrvTime,
    890	void *pvRTS,
    891	void *pvCTS,
    892	unsigned int cbFrameSize,
    893	bool bNeedACK,
    894	unsigned int uDMAIdx,
    895	void *psEthHeader,
    896	unsigned short wCurrentRate
    897)
    898{
    899	u16 fifo_ctl = le16_to_cpu(tx_buffer_head->fifo_ctl);
    900	bool bDisCRC = false;
    901	unsigned char byFBOption = AUTO_FB_NONE;
    902
    903	tx_buffer_head->current_rate = cpu_to_le16(wCurrentRate);
    904
    905	if (fifo_ctl & FIFOCTL_CRCDIS)
    906		bDisCRC = true;
    907
    908	if (fifo_ctl & FIFOCTL_AUTO_FB_0)
    909		byFBOption = AUTO_FB_0;
    910	else if (fifo_ctl & FIFOCTL_AUTO_FB_1)
    911		byFBOption = AUTO_FB_1;
    912
    913	if (!pvRrvTime)
    914		return;
    915
    916	if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
    917		if (pvRTS) { /* RTS_need */
    918			/* Fill RsvTime */
    919			struct vnt_rrv_time_rts *buf = pvRrvTime;
    920
    921			buf->rts_rrv_time_aa = get_rtscts_time(pDevice, 2, byPktType, cbFrameSize, wCurrentRate);
    922			buf->rts_rrv_time_ba = get_rtscts_time(pDevice, 1, byPktType, cbFrameSize, wCurrentRate);
    923			buf->rts_rrv_time_bb = get_rtscts_time(pDevice, 0, byPktType, cbFrameSize, wCurrentRate);
    924			buf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
    925			buf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK);
    926
    927			s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
    928		} else {/* RTS_needless, PCF mode */
    929			struct vnt_rrv_time_cts *buf = pvRrvTime;
    930
    931			buf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
    932			buf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK);
    933			buf->cts_rrv_time_ba = get_rtscts_time(pDevice, 3, byPktType, cbFrameSize, wCurrentRate);
    934
    935			/* Fill CTS */
    936			s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
    937		}
    938	} else if (byPktType == PK_TYPE_11A) {
    939		if (pvRTS) {/* RTS_need, non PCF mode */
    940			struct vnt_rrv_time_ab *buf = pvRrvTime;
    941
    942			buf->rts_rrv_time = get_rtscts_time(pDevice, 2, byPktType, cbFrameSize, wCurrentRate);
    943			buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK);
    944
    945			/* Fill RTS */
    946			s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
    947		} else if (!pvRTS) {/* RTS_needless, non PCF mode */
    948			struct vnt_rrv_time_ab *buf = pvRrvTime;
    949
    950			buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK);
    951		}
    952	} else if (byPktType == PK_TYPE_11B) {
    953		if (pvRTS) {/* RTS_need, non PCF mode */
    954			struct vnt_rrv_time_ab *buf = pvRrvTime;
    955
    956			buf->rts_rrv_time = get_rtscts_time(pDevice, 0, byPktType, cbFrameSize, wCurrentRate);
    957			buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK);
    958
    959			/* Fill RTS */
    960			s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
    961		} else { /* RTS_needless, non PCF mode */
    962			struct vnt_rrv_time_ab *buf = pvRrvTime;
    963
    964			buf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK);
    965		}
    966	}
    967}
    968
    969static unsigned int
    970s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType,
    971		  unsigned char *pbyTxBufferAddr,
    972		  unsigned int uDMAIdx, struct vnt_tx_desc *pHeadTD,
    973		  unsigned int is_pspoll)
    974{
    975	struct vnt_td_info *td_info = pHeadTD->td_info;
    976	struct sk_buff *skb = td_info->skb;
    977	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
    978	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
    979	struct vnt_tx_fifo_head *tx_buffer_head =
    980			(struct vnt_tx_fifo_head *)td_info->buf;
    981	u16 fifo_ctl = le16_to_cpu(tx_buffer_head->fifo_ctl);
    982	unsigned int cbFrameSize;
    983	__le16 uDuration;
    984	unsigned char *pbyBuffer;
    985	unsigned int uLength = 0;
    986	unsigned int cbMICHDR = 0;
    987	unsigned int uMACfragNum = 1;
    988	unsigned int uPadding = 0;
    989	unsigned int cbReqCount = 0;
    990	bool bNeedACK = (bool)(fifo_ctl & FIFOCTL_NEEDACK);
    991	bool bRTS = (bool)(fifo_ctl & FIFOCTL_RTS);
    992	struct vnt_tx_desc *ptdCurr;
    993	unsigned int cbHeaderLength = 0;
    994	void *pvRrvTime = NULL;
    995	struct vnt_mic_hdr *pMICHDR = NULL;
    996	void *pvRTS = NULL;
    997	void *pvCTS = NULL;
    998	void *pvTxDataHd = NULL;
    999	unsigned short wTxBufSize;   /* FFinfo size */
   1000	unsigned char byFBOption = AUTO_FB_NONE;
   1001
   1002	cbFrameSize = skb->len + 4;
   1003
   1004	if (info->control.hw_key) {
   1005		switch (info->control.hw_key->cipher) {
   1006		case WLAN_CIPHER_SUITE_CCMP:
   1007			cbMICHDR = sizeof(struct vnt_mic_hdr);
   1008			break;
   1009		default:
   1010			break;
   1011		}
   1012
   1013		cbFrameSize += info->control.hw_key->icv_len;
   1014
   1015		if (pDevice->local_id > REV_ID_VT3253_A1) {
   1016			/* MAC Header should be padding 0 to DW alignment. */
   1017			uPadding = 4 - (ieee80211_get_hdrlen_from_skb(skb) % 4);
   1018			uPadding %= 4;
   1019		}
   1020	}
   1021
   1022	/*
   1023	 * Use for AUTO FALL BACK
   1024	 */
   1025	if (fifo_ctl & FIFOCTL_AUTO_FB_0)
   1026		byFBOption = AUTO_FB_0;
   1027	else if (fifo_ctl & FIFOCTL_AUTO_FB_1)
   1028		byFBOption = AUTO_FB_1;
   1029
   1030	/* Set RrvTime/RTS/CTS Buffer */
   1031	wTxBufSize = sizeof(struct vnt_tx_fifo_head);
   1032	if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {/* 802.11g packet */
   1033
   1034		if (byFBOption == AUTO_FB_NONE) {
   1035			if (bRTS) {/* RTS_need */
   1036				pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
   1037				pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts));
   1038				pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
   1039				pvCTS = NULL;
   1040				pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
   1041							cbMICHDR + sizeof(struct vnt_rts_g));
   1042				cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
   1043							cbMICHDR + sizeof(struct vnt_rts_g) +
   1044							sizeof(struct vnt_tx_datahead_g);
   1045			} else { /* RTS_needless */
   1046				pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
   1047				pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts));
   1048				pvRTS = NULL;
   1049				pvCTS = (void *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
   1050				pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
   1051						sizeof(struct vnt_rrv_time_cts) + cbMICHDR + sizeof(struct vnt_cts));
   1052				cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
   1053							cbMICHDR + sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
   1054			}
   1055		} else {
   1056			/* Auto Fall Back */
   1057			if (bRTS) {/* RTS_need */
   1058				pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
   1059				pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts));
   1060				pvRTS = (void *) (pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
   1061				pvCTS = NULL;
   1062				pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
   1063					cbMICHDR + sizeof(struct vnt_rts_g_fb));
   1064				cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
   1065					cbMICHDR + sizeof(struct vnt_rts_g_fb) + sizeof(struct vnt_tx_datahead_g_fb);
   1066			} else { /* RTS_needless */
   1067				pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
   1068				pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts));
   1069				pvRTS = NULL;
   1070				pvCTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
   1071				pvTxDataHd = (void  *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
   1072					cbMICHDR + sizeof(struct vnt_cts_fb));
   1073				cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
   1074					cbMICHDR + sizeof(struct vnt_cts_fb) + sizeof(struct vnt_tx_datahead_g_fb);
   1075			}
   1076		} /* Auto Fall Back */
   1077	} else {/* 802.11a/b packet */
   1078
   1079		if (byFBOption == AUTO_FB_NONE) {
   1080			if (bRTS) {
   1081				pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
   1082				pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
   1083				pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
   1084				pvCTS = NULL;
   1085				pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
   1086					sizeof(struct vnt_rrv_time_ab) + cbMICHDR + sizeof(struct vnt_rts_ab));
   1087				cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
   1088					cbMICHDR + sizeof(struct vnt_rts_ab) + sizeof(struct vnt_tx_datahead_ab);
   1089			} else { /* RTS_needless, need MICHDR */
   1090				pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
   1091				pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
   1092				pvRTS = NULL;
   1093				pvCTS = NULL;
   1094				pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
   1095				cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
   1096					cbMICHDR + sizeof(struct vnt_tx_datahead_ab);
   1097			}
   1098		} else {
   1099			/* Auto Fall Back */
   1100			if (bRTS) { /* RTS_need */
   1101				pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
   1102				pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
   1103				pvRTS = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
   1104				pvCTS = NULL;
   1105				pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize +
   1106					sizeof(struct vnt_rrv_time_ab) + cbMICHDR + sizeof(struct vnt_rts_a_fb));
   1107				cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
   1108					cbMICHDR + sizeof(struct vnt_rts_a_fb) + sizeof(struct vnt_tx_datahead_a_fb);
   1109			} else { /* RTS_needless */
   1110				pvRrvTime = (void *)(pbyTxBufferAddr + wTxBufSize);
   1111				pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab));
   1112				pvRTS = NULL;
   1113				pvCTS = NULL;
   1114				pvTxDataHd = (void *)(pbyTxBufferAddr + wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
   1115				cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
   1116					cbMICHDR + sizeof(struct vnt_tx_datahead_a_fb);
   1117			}
   1118		} /* Auto Fall Back */
   1119	}
   1120
   1121	td_info->mic_hdr = pMICHDR;
   1122
   1123	memset((void *)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderLength - wTxBufSize));
   1124
   1125	/* Fill FIFO,RrvTime,RTS,and CTS */
   1126	s_vGenerateTxParameter(pDevice, byPktType, tx_buffer_head, pvRrvTime, pvRTS, pvCTS,
   1127			       cbFrameSize, bNeedACK, uDMAIdx, hdr, pDevice->wCurrentRate);
   1128	/* Fill DataHead */
   1129	uDuration = s_uFillDataHead(pDevice, byPktType, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
   1130				    0, 0, uMACfragNum, byFBOption, pDevice->wCurrentRate, is_pspoll);
   1131
   1132	hdr->duration_id = uDuration;
   1133
   1134	cbReqCount = cbHeaderLength + uPadding + skb->len;
   1135	pbyBuffer = (unsigned char *)pHeadTD->td_info->buf;
   1136	uLength = cbHeaderLength + uPadding;
   1137
   1138	/* Copy the Packet into a tx Buffer */
   1139	memcpy((pbyBuffer + uLength), skb->data, skb->len);
   1140
   1141	ptdCurr = pHeadTD;
   1142
   1143	ptdCurr->td_info->req_count = (u16)cbReqCount;
   1144
   1145	return cbHeaderLength;
   1146}
   1147
   1148static void vnt_fill_txkey(struct ieee80211_hdr *hdr, u8 *key_buffer,
   1149			   struct ieee80211_key_conf *tx_key,
   1150			   struct sk_buff *skb,	u16 payload_len,
   1151			   struct vnt_mic_hdr *mic_hdr)
   1152{
   1153	u64 pn64;
   1154	u8 *iv = ((u8 *)hdr + ieee80211_get_hdrlen_from_skb(skb));
   1155
   1156	/* strip header and icv len from payload */
   1157	payload_len -= ieee80211_get_hdrlen_from_skb(skb);
   1158	payload_len -= tx_key->icv_len;
   1159
   1160	switch (tx_key->cipher) {
   1161	case WLAN_CIPHER_SUITE_WEP40:
   1162	case WLAN_CIPHER_SUITE_WEP104:
   1163		memcpy(key_buffer, iv, 3);
   1164		memcpy(key_buffer + 3, tx_key->key, tx_key->keylen);
   1165
   1166		if (tx_key->keylen == WLAN_KEY_LEN_WEP40) {
   1167			memcpy(key_buffer + 8, iv, 3);
   1168			memcpy(key_buffer + 11,
   1169			       tx_key->key, WLAN_KEY_LEN_WEP40);
   1170		}
   1171
   1172		break;
   1173	case WLAN_CIPHER_SUITE_TKIP:
   1174		ieee80211_get_tkip_p2k(tx_key, skb, key_buffer);
   1175
   1176		break;
   1177	case WLAN_CIPHER_SUITE_CCMP:
   1178
   1179		if (!mic_hdr)
   1180			return;
   1181
   1182		mic_hdr->id = 0x59;
   1183		mic_hdr->payload_len = cpu_to_be16(payload_len);
   1184		ether_addr_copy(mic_hdr->mic_addr2, hdr->addr2);
   1185
   1186		pn64 = atomic64_read(&tx_key->tx_pn);
   1187		mic_hdr->ccmp_pn[5] = pn64;
   1188		mic_hdr->ccmp_pn[4] = pn64 >> 8;
   1189		mic_hdr->ccmp_pn[3] = pn64 >> 16;
   1190		mic_hdr->ccmp_pn[2] = pn64 >> 24;
   1191		mic_hdr->ccmp_pn[1] = pn64 >> 32;
   1192		mic_hdr->ccmp_pn[0] = pn64 >> 40;
   1193
   1194		if (ieee80211_has_a4(hdr->frame_control))
   1195			mic_hdr->hlen = cpu_to_be16(28);
   1196		else
   1197			mic_hdr->hlen = cpu_to_be16(22);
   1198
   1199		ether_addr_copy(mic_hdr->addr1, hdr->addr1);
   1200		ether_addr_copy(mic_hdr->addr2, hdr->addr2);
   1201		ether_addr_copy(mic_hdr->addr3, hdr->addr3);
   1202
   1203		mic_hdr->frame_control = cpu_to_le16(
   1204			le16_to_cpu(hdr->frame_control) & 0xc78f);
   1205		mic_hdr->seq_ctrl = cpu_to_le16(
   1206				le16_to_cpu(hdr->seq_ctrl) & 0xf);
   1207
   1208		if (ieee80211_has_a4(hdr->frame_control))
   1209			ether_addr_copy(mic_hdr->addr4, hdr->addr4);
   1210
   1211		memcpy(key_buffer, tx_key->key, WLAN_KEY_LEN_CCMP);
   1212
   1213		break;
   1214	default:
   1215		break;
   1216	}
   1217}
   1218
   1219int vnt_generate_fifo_header(struct vnt_private *priv, u32 dma_idx,
   1220			     struct vnt_tx_desc *head_td, struct sk_buff *skb)
   1221{
   1222	struct vnt_td_info *td_info = head_td->td_info;
   1223	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
   1224	struct ieee80211_tx_rate *tx_rate = &info->control.rates[0];
   1225	struct ieee80211_rate *rate;
   1226	struct ieee80211_key_conf *tx_key;
   1227	struct ieee80211_hdr *hdr;
   1228	struct vnt_tx_fifo_head *tx_buffer_head =
   1229			(struct vnt_tx_fifo_head *)td_info->buf;
   1230	u16 tx_body_size = skb->len, current_rate;
   1231	u8 pkt_type;
   1232	bool is_pspoll = false;
   1233
   1234	memset(tx_buffer_head, 0, sizeof(*tx_buffer_head));
   1235
   1236	hdr = (struct ieee80211_hdr *)(skb->data);
   1237
   1238	rate = ieee80211_get_tx_rate(priv->hw, info);
   1239
   1240	current_rate = rate->hw_value;
   1241	if (priv->wCurrentRate != current_rate &&
   1242	    !(priv->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) {
   1243		priv->wCurrentRate = current_rate;
   1244
   1245		RFbSetPower(priv, priv->wCurrentRate,
   1246			    priv->hw->conf.chandef.chan->hw_value);
   1247	}
   1248
   1249	if (current_rate > RATE_11M) {
   1250		if (info->band == NL80211_BAND_5GHZ) {
   1251			pkt_type = PK_TYPE_11A;
   1252		} else {
   1253			if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
   1254				pkt_type = PK_TYPE_11GB;
   1255			else
   1256				pkt_type = PK_TYPE_11GA;
   1257		}
   1258	} else {
   1259		pkt_type = PK_TYPE_11B;
   1260	}
   1261
   1262	/*Set fifo controls */
   1263	if (pkt_type == PK_TYPE_11A)
   1264		tx_buffer_head->fifo_ctl = 0;
   1265	else if (pkt_type == PK_TYPE_11B)
   1266		tx_buffer_head->fifo_ctl = cpu_to_le16(FIFOCTL_11B);
   1267	else if (pkt_type == PK_TYPE_11GB)
   1268		tx_buffer_head->fifo_ctl = cpu_to_le16(FIFOCTL_11GB);
   1269	else if (pkt_type == PK_TYPE_11GA)
   1270		tx_buffer_head->fifo_ctl = cpu_to_le16(FIFOCTL_11GA);
   1271
   1272	/* generate interrupt */
   1273	tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_GENINT);
   1274
   1275	if (!ieee80211_is_data(hdr->frame_control)) {
   1276		tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_TMOEN);
   1277		tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_ISDMA0);
   1278		tx_buffer_head->time_stamp =
   1279			cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
   1280	} else {
   1281		tx_buffer_head->time_stamp =
   1282			cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
   1283	}
   1284
   1285	if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
   1286		tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_NEEDACK);
   1287
   1288	if (ieee80211_has_retry(hdr->frame_control))
   1289		tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_LRETRY);
   1290
   1291	if (tx_rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
   1292		priv->preamble_type = PREAMBLE_SHORT;
   1293	else
   1294		priv->preamble_type = PREAMBLE_LONG;
   1295
   1296	if (tx_rate->flags & IEEE80211_TX_RC_USE_RTS_CTS)
   1297		tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_RTS);
   1298
   1299	if (ieee80211_has_a4(hdr->frame_control)) {
   1300		tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_LHEAD);
   1301		priv->bLongHeader = true;
   1302	}
   1303
   1304	if (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER)
   1305		is_pspoll = true;
   1306
   1307	tx_buffer_head->frag_ctl =
   1308			cpu_to_le16(ieee80211_get_hdrlen_from_skb(skb) << 10);
   1309
   1310	if (info->control.hw_key) {
   1311		switch (info->control.hw_key->cipher) {
   1312		case WLAN_CIPHER_SUITE_WEP40:
   1313		case WLAN_CIPHER_SUITE_WEP104:
   1314			tx_buffer_head->frag_ctl |= cpu_to_le16(FRAGCTL_LEGACY);
   1315			break;
   1316		case WLAN_CIPHER_SUITE_TKIP:
   1317			tx_buffer_head->frag_ctl |= cpu_to_le16(FRAGCTL_TKIP);
   1318			break;
   1319		case WLAN_CIPHER_SUITE_CCMP:
   1320			tx_buffer_head->frag_ctl |= cpu_to_le16(FRAGCTL_AES);
   1321			break;
   1322		default:
   1323			break;
   1324		}
   1325	}
   1326
   1327	tx_buffer_head->current_rate = cpu_to_le16(current_rate);
   1328
   1329	/* legacy rates TODO use ieee80211_tx_rate */
   1330	if (current_rate >= RATE_18M && ieee80211_is_data(hdr->frame_control)) {
   1331		if (priv->byAutoFBCtrl == AUTO_FB_0)
   1332			tx_buffer_head->fifo_ctl |=
   1333						cpu_to_le16(FIFOCTL_AUTO_FB_0);
   1334		else if (priv->byAutoFBCtrl == AUTO_FB_1)
   1335			tx_buffer_head->fifo_ctl |=
   1336						cpu_to_le16(FIFOCTL_AUTO_FB_1);
   1337	}
   1338
   1339	tx_buffer_head->frag_ctl |= cpu_to_le16(FRAGCTL_NONFRAG);
   1340
   1341	s_cbFillTxBufHead(priv, pkt_type, (u8 *)tx_buffer_head,
   1342			  dma_idx, head_td, is_pspoll);
   1343
   1344	if (info->control.hw_key) {
   1345		tx_key = info->control.hw_key;
   1346		if (tx_key->keylen > 0)
   1347			vnt_fill_txkey(hdr, tx_buffer_head->tx_key,
   1348				       tx_key, skb, tx_body_size,
   1349				       td_info->mic_hdr);
   1350	}
   1351
   1352	return 0;
   1353}
   1354
   1355static int vnt_beacon_xmit(struct vnt_private *priv,
   1356			   struct sk_buff *skb)
   1357{
   1358	struct vnt_tx_short_buf_head *short_head =
   1359		(struct vnt_tx_short_buf_head *)priv->tx_beacon_bufs;
   1360	struct ieee80211_mgmt *mgmt_hdr = (struct ieee80211_mgmt *)
   1361				(priv->tx_beacon_bufs + sizeof(*short_head));
   1362	struct ieee80211_tx_info *info;
   1363	u32 frame_size = skb->len + 4;
   1364	u16 current_rate;
   1365
   1366	memset(priv->tx_beacon_bufs, 0, sizeof(*short_head));
   1367
   1368	if (priv->byBBType == BB_TYPE_11A) {
   1369		current_rate = RATE_6M;
   1370
   1371		/* Get SignalField,ServiceField,Length */
   1372		vnt_get_phy_field(priv, frame_size, current_rate,
   1373				  PK_TYPE_11A, &short_head->ab);
   1374
   1375		/* Get Duration and TimeStampOff */
   1376		short_head->duration =
   1377			cpu_to_le16((u16)s_uGetDataDuration(priv, DATADUR_B,
   1378				    frame_size, PK_TYPE_11A, current_rate,
   1379				    false, 0, 0, 1, AUTO_FB_NONE));
   1380
   1381		short_head->time_stamp_off =
   1382				vnt_time_stamp_off(priv, current_rate);
   1383	} else {
   1384		current_rate = RATE_1M;
   1385		short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_11B);
   1386
   1387		/* Get SignalField,ServiceField,Length */
   1388		vnt_get_phy_field(priv, frame_size, current_rate,
   1389				  PK_TYPE_11B, &short_head->ab);
   1390
   1391		/* Get Duration and TimeStampOff */
   1392		short_head->duration =
   1393			cpu_to_le16((u16)s_uGetDataDuration(priv, DATADUR_B,
   1394				    frame_size, PK_TYPE_11B, current_rate,
   1395				    false, 0, 0, 1, AUTO_FB_NONE));
   1396
   1397		short_head->time_stamp_off =
   1398			vnt_time_stamp_off(priv, current_rate);
   1399	}
   1400
   1401	short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_GENINT);
   1402
   1403	/* Copy Beacon */
   1404	memcpy(mgmt_hdr, skb->data, skb->len);
   1405
   1406	/* time stamp always 0 */
   1407	mgmt_hdr->u.beacon.timestamp = 0;
   1408
   1409	info = IEEE80211_SKB_CB(skb);
   1410	if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
   1411		struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)mgmt_hdr;
   1412
   1413		hdr->duration_id = 0;
   1414		hdr->seq_ctrl = cpu_to_le16(priv->wSeqCounter << 4);
   1415	}
   1416
   1417	priv->wSeqCounter++;
   1418	if (priv->wSeqCounter > 0x0fff)
   1419		priv->wSeqCounter = 0;
   1420
   1421	priv->wBCNBufLen = sizeof(*short_head) + skb->len;
   1422
   1423	MACvSetCurrBCNTxDescAddr(priv->port_offset, priv->tx_beacon_dma);
   1424
   1425	MACvSetCurrBCNLength(priv->port_offset, priv->wBCNBufLen);
   1426	/* Set auto Transmit on */
   1427	MACvRegBitsOn(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX);
   1428	/* Poll Transmit the adapter */
   1429	iowrite8(BEACON_READY, priv->port_offset + MAC_REG_BCNDMACTL);
   1430
   1431	return 0;
   1432}
   1433
   1434int vnt_beacon_make(struct vnt_private *priv, struct ieee80211_vif *vif)
   1435{
   1436	struct sk_buff *beacon;
   1437
   1438	beacon = ieee80211_beacon_get(priv->hw, vif);
   1439	if (!beacon)
   1440		return -ENOMEM;
   1441
   1442	if (vnt_beacon_xmit(priv, beacon)) {
   1443		ieee80211_free_txskb(priv->hw, beacon);
   1444		return -ENODEV;
   1445	}
   1446
   1447	return 0;
   1448}
   1449
   1450int vnt_beacon_enable(struct vnt_private *priv, struct ieee80211_vif *vif,
   1451		      struct ieee80211_bss_conf *conf)
   1452{
   1453	iowrite8(TFTCTL_TSFCNTRST, priv->port_offset + MAC_REG_TFTCTL);
   1454
   1455	iowrite8(TFTCTL_TSFCNTREN, priv->port_offset + MAC_REG_TFTCTL);
   1456
   1457	CARDvSetFirstNextTBTT(priv, conf->beacon_int);
   1458
   1459	CARDbSetBeaconPeriod(priv, conf->beacon_int);
   1460
   1461	return vnt_beacon_make(priv, vif);
   1462}