]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge 3.12-rc3 into staging-next
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 30 Sep 2013 01:42:21 +0000 (18:42 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 30 Sep 2013 01:42:21 +0000 (18:42 -0700)
We want the staging fixes in here as well.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1  2 
MAINTAINERS
drivers/staging/rtl8188eu/os_dep/ioctl_linux.c
drivers/staging/rtl8188eu/os_dep/usb_intf.c
drivers/staging/rtl8192u/r819xU_cmdpkt.c
drivers/staging/vt6656/iwctl.c
drivers/staging/vt6656/rxtx.c

diff --combined MAINTAINERS
index e8ee569fdce5b77eef43d131bbf468706bee9e61,284969fa28967fc1d0b134f06efb055b6a1cbfd0..c8857a4214202d1d1699c3bf716ca06c25501f31
@@@ -1812,7 -1812,8 +1812,8 @@@ S:      Supporte
  F:    drivers/net/ethernet/broadcom/bnx2x/
  
  BROADCOM BCM281XX/BCM11XXX ARM ARCHITECTURE
- M:    Christian Daudt <csd@broadcom.com>
+ M:    Christian Daudt <bcm@fixthebug.org>
+ L:    bcm-kernel-feedback-list@broadcom.com
  T:    git git://git.github.com/broadcom/bcm11351
  S:    Maintained
  F:    arch/arm/mach-bcm/
@@@ -2639,6 -2640,18 +2640,18 @@@ F:    include/linux/device-mapper.
  F:    include/linux/dm-*.h
  F:    include/uapi/linux/dm-*.h
  
+ DIGI NEO AND CLASSIC PCI PRODUCTS
+ M:    Lidza Louina <lidza.louina@gmail.com>
+ L:    driverdev-devel@linuxdriverproject.org
+ S:    Maintained
+ F:    drivers/staging/dgnc/
+ DIGI EPCA PCI PRODUCTS
+ M:    Lidza Louina <lidza.louina@gmail.com>
+ L:    driverdev-devel@linuxdriverproject.org
+ S:    Maintained
+ F:    drivers/staging/dgap/
  DIOLAN U2C-12 I2C DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
  L:    linux-i2c@vger.kernel.org
@@@ -4195,7 -4208,7 +4208,7 @@@ S:      Maintaine
  F:    drivers/media/rc/iguanair.c
  
  IIO SUBSYSTEM AND DRIVERS
 -M:    Jonathan Cameron <jic23@cam.ac.uk>
 +M:    Jonathan Cameron <jic23@kernel.org>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
  F:    drivers/iio/
@@@ -6595,7 -6608,7 +6608,7 @@@ S:      Obsolet
  F:    drivers/net/wireless/prism54/
  
  PROMISE SATA TX2/TX4 CONTROLLER LIBATA DRIVER
- M:    Mikael Pettersson <mikpe@it.uu.se>
+ M:    Mikael Pettersson <mikpelinux@gmail.com>
  L:    linux-ide@vger.kernel.org
  S:    Maintained
  F:    drivers/ata/sata_promise.*
@@@ -7947,7 -7960,7 +7960,7 @@@ S:      Maintaine
  F:    drivers/staging/media/go7007/
  
  STAGING - INDUSTRIAL IO
 -M:    Jonathan Cameron <jic23@cam.ac.uk>
 +M:    Jonathan Cameron <jic23@kernel.org>
  L:    linux-iio@vger.kernel.org
  S:    Odd Fixes
  F:    drivers/staging/iio/
@@@ -8724,9 -8737,8 +8737,8 @@@ F:      Documentation/hid/hiddev.tx
  F:    drivers/hid/usbhid/
  
  USB/IP DRIVERS
- M:    Matt Mooney <mfm@muteddisk.com>
  L:    linux-usb@vger.kernel.org
- S:    Maintained
+ S:    Orphan
  F:    drivers/staging/usbip/
  
  USB ISP116X DRIVER
index 070bd7570839e0c6622743dfbfa65fcd5221e90b,95953ebc027922e66ffd3168a965dee33f6a30be..ae545877023428b103df7af913ca9e10753ed939
@@@ -938,7 -938,7 +938,7 @@@ static int rtw_wx_set_pmkid(struct net_
        memcpy(strIssueBssid, pPMK->bssid.sa_data, ETH_ALEN);
        if (pPMK->cmd == IW_PMKSA_ADD) {
                DBG_88E("[rtw_wx_set_pmkid] IW_PMKSA_ADD!\n");
 -              if (!memcmp(strIssueBssid, strZeroMacAddress, ETH_ALEN) == true)
 +              if (!memcmp(strIssueBssid, strZeroMacAddress, ETH_ALEN))
                        return ret;
                else
                        ret = true;
@@@ -1039,7 -1039,7 +1039,7 @@@ static int rtw_wx_get_range(struct net_
  
        range->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */
        /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
 -      range->avg_qual.level = 20 + -98;
 +      range->avg_qual.level = 178; /* -78 dBm */
        range->avg_qual.noise = 0;
        range->avg_qual.updated = 7; /* Updated all three */
  
  
  /*  The following code will proivde the security capability to network manager. */
  /*  If the driver doesn't provide this capability to network manager, */
 -/*  the WPA/WPA2 routers can't be choosen in the network manager. */
 +/*  the WPA/WPA2 routers can't be chosen in the network manager. */
  
  /*
  #define IW_SCAN_CAPA_NONE             0x00
@@@ -1373,7 -1373,7 +1373,7 @@@ _func_enter_
                                }
                        }
  
 -                      /* it has still some scan paramater to parse, we only do this now... */
 +                      /* it has still some scan parameter to parse, we only do this now... */
                        _status = rtw_set_802_11_bssid_list_scan(padapter, ssid, RTW_SSID_SCAN_AMOUNT);
                } else {
                        _status = rtw_set_802_11_bssid_list_scan(padapter, NULL, 0);
@@@ -2626,7 -2626,7 +2626,7 @@@ static int rtw_get_ap_info(struct net_d
                        return -EINVAL;
                }
  
 -              if (!memcmp(bssid, pnetwork->network.MacAddress, ETH_ALEN) == true) {
 +              if (!memcmp(bssid, pnetwork->network.MacAddress, ETH_ALEN)) {
                        /* BSSID match, then check if supporting wpa/wpa2 */
                        DBG_88E("BSSID:%pM\n", (bssid));
  
@@@ -2961,7 -2961,7 +2961,7 @@@ static int rtw_p2p_get_status(struct ne
  
  /*    Commented by Albert 20110520 */
  /*    This function will return the config method description */
 -/*    This config method description will show us which config method the remote P2P device is intented to use */
 +/*    This config method description will show us which config method the remote P2P device is intended to use */
  /*    by sending the provisioning discovery request frame. */
  
  static int rtw_p2p_get_req_cm(struct net_device *dev,
@@@ -3413,7 -3413,7 +3413,7 @@@ static int rtw_p2p_get_invitation_proce
        /*  +8 is for the str "InvProc =", we have to clear it at wrqu->data.pointer */
  
        /*      Commented by Ouden 20121226 */
 -      /*      The application wants to know P2P initation procedure is support or not. */
 +      /*      The application wants to know P2P initiation procedure is supported or not. */
        /*      Format: iwpriv wlanx p2p_get2 InvProc = 00:E0:4C:00:00:05 */
  
        DBG_88E("[%s] data = %s\n", __func__, (char *)extra);
@@@ -4040,7 -4040,7 +4040,7 @@@ static int rtw_rereg_nd_name(struct net
        if (0 != ret)
                goto exit;
  
 -      if (!memcmp(rereg_priv->old_ifname, "disable%d", 9) == true) {
 +      if (!memcmp(rereg_priv->old_ifname, "disable%d", 9)) {
                padapter->ledpriv.bRegUseLed = rereg_priv->old_bRegUseLed;
                rtw_hal_sw_led_init(padapter);
                rtw_ips_mode_req(&padapter->pwrctrlpriv, rereg_priv->old_ips_mode);
        strncpy(rereg_priv->old_ifname, new_ifname, IFNAMSIZ);
        rereg_priv->old_ifname[IFNAMSIZ-1] = 0;
  
 -      if (!memcmp(new_ifname, "disable%d", 9) == true) {
 +      if (!memcmp(new_ifname, "disable%d", 9)) {
                DBG_88E("%s disable\n", __func__);
                /*  free network queue for Android's timming issue */
                rtw_free_network_queue(padapter, true);
@@@ -4884,6 -4884,7 +4884,6 @@@ static int set_group_key(struct adapte
        case _TKIP_:
        case _TKIP_WTMIC_:
        case _AES_:
 -              keylen = 16;
        default:
                keylen = 16;
        }
@@@ -6145,7 -6146,7 +6145,7 @@@ static int rtw_mp_efuse_set(struct net_
  
                for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2)
                        setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]);
 -              /* Change to check TYPE_EFUSE_MAP_LEN, beacuse 8188E raw 256, logic map over 256. */
 +              /* Change to check TYPE_EFUSE_MAP_LEN, because 8188E raw 256, logic map over 256. */
                EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&max_available_size, false);
                if ((addr+cnts) > max_available_size) {
                        DBG_88E("%s: addr(0x%X)+cnts(%d) parameter error!\n", __func__, addr, cnts);
  
                for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2)
                        setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);
 -              /* Change to check TYPE_EFUSE_MAP_LEN, beacuse 8188E raw 256, logic map over 256. */
 +              /* Change to check TYPE_EFUSE_MAP_LEN, because 8188E raw 256, logic map over 256. */
                EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&max_available_size, false);
                if ((addr+cnts) > max_available_size) {
                        DBG_88E("%s: addr(0x%X)+cnts(%d) parameter error!\n", __func__, addr, cnts);
@@@ -6972,7 -6973,7 +6972,7 @@@ static int rtw_mp_ctx(struct net_devic
        stop = strncmp(extra, "stop", 4);
        sscanf(extra, "count =%d, pkt", &count);
  
-       _rtw_memset(extra, '\0', sizeof(extra));
+       _rtw_memset(extra, '\0', sizeof(*extra));
  
        if (stop == 0) {
                bStartTest = 0; /*  To set Stop */
index 6e40299adbc2608b232ce561fda44f7839974c6f,9ca3180ebaa0e70fbb188c84748971fd4f34922d..7d14779310d370f7a70b35b56a00ef261bd671af
@@@ -54,6 -54,7 +54,7 @@@ static struct usb_device_id rtw_usb_id_
        /*=== Customer ID ===*/
        /****** 8188EUS ********/
        {USB_DEVICE(0x8179, 0x07B8)}, /* Abocom - Abocom */
+       {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */
        {}      /* Terminating entry */
  };
  
@@@ -736,7 -737,7 +737,7 @@@ static struct adapter *rtw_usb_if1_init
        status = _SUCCESS;
  
  free_hal_data:
 -      if (status != _SUCCESS && padapter->HalData)
 +      if (status != _SUCCESS)
                kfree(padapter->HalData);
  handle_dualmac:
        if (status != _SUCCESS)
index e8b479a5ea21c9f80baebc18886a809db24d9e13,56144014b7c9ba15126f97b073fb6eea4777937a..f40f9c895f566b1e56d72be73bdb3dc83d2cde2e
@@@ -37,6 -37,8 +37,8 @@@ rt_status SendTxCommandPacket(struct ne
        /* Get TCB and local buffer from common pool.
           (It is shared by CmdQ, MgntQ, and USB coalesce DataQ) */
        skb  = dev_alloc_skb(USB_HWDESC_HEADER_LEN + DataLen + 4);
+       if (!skb)
+               return RT_STATUS_FAILURE;
        memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
        tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
        tcb_desc->queue_index = TXCMD_QUEUE;
        return rtStatus;
  }
  
 -/*-----------------------------------------------------------------------------
 - * Function:  cmpk_message_handle_tx()
 - *
 - * Overview:  Driver internal module can call the API to send message to
 - *            firmware side. For example, you can send a debug command packet.
 - *            Or you can send a request for FW to modify RLX4181 LBUS HW bank.
 - *            Otherwise, you can change MAC/PHT/RF register by firmware at
 - *            run time. We do not support message more than one segment now.
 - *
 - * Input:     NONE
 - *
 - * Output:    NONE
 - *
 - * Return:    NONE
 - *
 - * Revised History:
 - *    When            Who             Remark
 - *    05/06/2008      amy             porting from windows code.
 - *
 - *---------------------------------------------------------------------------*/
 -extern rt_status cmpk_message_handle_tx(struct net_device *dev,
 -                                      u8 *codevirtualaddress,
 -                                      u32 packettype, u32 buffer_len)
 -{
 -
 -      bool        rt_status = true;
 -#ifdef RTL8192U
 -      return rt_status;
 -#else
 -      struct r8192_priv   *priv = ieee80211_priv(dev);
 -      u16                 frag_threshold;
 -      u16                 frag_length, frag_offset = 0;
 -
 -      rt_firmware         *pfirmware = priv->pFirmware;
 -      struct sk_buff      *skb;
 -      unsigned char       *seg_ptr;
 -      cb_desc             *tcb_desc;
 -      u8                  bLastIniPkt;
 -
 -      firmware_init_param(dev);
 -      /* Fragmentation might be required */
 -      frag_threshold = pfirmware->cmdpacket_frag_thresold;
 -      do {
 -              if ((buffer_len - frag_offset) > frag_threshold) {
 -                      frag_length = frag_threshold;
 -                      bLastIniPkt = 0;
 -
 -              } else {
 -                      frag_length = buffer_len - frag_offset;
 -                      bLastIniPkt = 1;
 -
 -              }
 -
 -              /* Allocate skb buffer to contain firmware info and tx
 -                 descriptor info add 4 to avoid packet appending overflow. */
 -#ifdef RTL8192U
 -              skb  = dev_alloc_skb(USB_HWDESC_HEADER_LEN + frag_length + 4);
 -#else
 -              skb  = dev_alloc_skb(frag_length + 4);
 -#endif
 -              memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
 -              tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
 -              tcb_desc->queue_index = TXCMD_QUEUE;
 -              tcb_desc->bCmdOrInit = packettype;
 -              tcb_desc->bLastIniPkt = bLastIniPkt;
 -
 -#ifdef RTL8192U
 -              skb_reserve(skb, USB_HWDESC_HEADER_LEN);
 -#endif
 -
 -              seg_ptr = skb_put(skb, buffer_len);
 -              /*
 -               * Transform from little endian to big endian
 -               * and pending zero
 -               */
 -              memcpy(seg_ptr, codevirtualaddress, buffer_len);
 -              tcb_desc->txbuf_size = (u16)buffer_len;
 -
 -
 -              if (!priv->ieee80211->check_nic_enough_desc(dev, tcb_desc->queue_index) ||
 -                  (!skb_queue_empty(&priv->ieee80211->skb_waitQ[tcb_desc->queue_index])) ||
 -                  (priv->ieee80211->queue_stop)) {
 -                      RT_TRACE(COMP_FIRMWARE, "======> tx full!\n");
 -                      skb_queue_tail(&priv->ieee80211->skb_waitQ[tcb_desc->queue_index], skb);
 -              } else {
 -                      priv->ieee80211->softmac_hard_start_xmit(skb, dev);
 -              }
 -
 -              codevirtualaddress += frag_length;
 -              frag_offset += frag_length;
 -
 -      } while (frag_offset < buffer_len);
 -
 -      return rt_status;
 -
 -
 -#endif
 -}
 -
  /*-----------------------------------------------------------------------------
   * Function:    cmpk_counttxstatistic()
   *
index 033cb50f779a50b025d3899f3c943515fa835ea9,8872e0f84f40e825efec5dd7f7614f6c22f43562..59688881a9a08404b58dec3b8ab1995dd4ea7480
@@@ -657,8 -657,8 +657,8 @@@ int iwctl_siwap(struct net_device *dev
                        unsigned uSameBssidNum = 0;
                        for (ii = 0; ii < MAX_BSS_NUM; ii++) {
                                if (pMgmt->sBSSList[ii].bActive &&
 -                                      !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID,
 -                                                      pMgmt->abyDesireBSSID)) {
 +                                      ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID,
 +                                                       pMgmt->abyDesireBSSID)) {
                                        uSameBssidNum++;
                                }
                        }
@@@ -840,8 -840,8 +840,8 @@@ int iwctl_siwessid(struct net_device *d
                                // are two same BSSID exist in list ?
                                for (ii = 0; ii < MAX_BSS_NUM; ii++) {
                                        if (pMgmt->sBSSList[ii].bActive &&
 -                                              !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID,
 -                                                              pCurr->abyBSSID)) {
 +                                              ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID,
 +                                                               pCurr->abyBSSID)) {
                                                uSameBssidNum++;
                                        }
                                }
@@@ -1634,6 -1634,9 +1634,9 @@@ int iwctl_siwencodeext(struct net_devic
        if (pMgmt == NULL)
                return -EFAULT;
  
+       if (!(pDevice->flags & DEVICE_FLAGS_OPENED))
+               return -ENODEV;
        buf = kzalloc(sizeof(struct viawget_wpa_param), GFP_KERNEL);
        if (buf == NULL)
                return -ENOMEM;
index 791144a50b17897739a40826310e84b68927cd0b,14f3e852215da5fb27702b4b91687047b9a290c2..6b12d0cc6ef2c6fee610bcfe3e148b7bf356b32a
@@@ -99,9 -99,9 +99,9 @@@ static void s_vSaveTxPktInfo(struct vnt
  static void *s_vGetFreeContext(struct vnt_private *pDevice);
  
  static void s_vGenerateTxParameter(struct vnt_private *pDevice,
 -      u8 byPktType, u16 wCurrentRate, void *pTxBufHead, void *pvRrvTime,
 -      void *rts_cts, u32 cbFrameSize, int bNeedACK, u32 uDMAIdx,
 -      struct ethhdr *psEthHeader, bool need_rts);
 +      u8 byPktType, u16 wCurrentRate, struct vnt_tx_buffer *tx_buffer,
 +      struct vnt_mic_hdr **mic_hdr, u32 need_mic, u32 cbFrameSize,
 +      int bNeedACK, u32 uDMAIdx, struct ethhdr *psEthHeader, bool need_rts);
  
  static u32 s_uFillDataHead(struct vnt_private *pDevice,
        u8 byPktType, u16 wCurrentRate, void *pTxDataHead, u32 cbFrameLength,
@@@ -148,6 -148,8 +148,8 @@@ static void *s_vGetFreeContext(struct v
      DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n");
  
      for (ii = 0; ii < pDevice->cbTD; ii++) {
+       if (!pDevice->apTD[ii])
+               return NULL;
          pContext = pDevice->apTD[ii];
          if (pContext->bBoolInUse == false) {
              pContext->bBoolInUse = true;
@@@ -840,17 -842,17 +842,17 @@@ static void s_vFillCTSHead(struct vnt_p
  -*/
  
  static void s_vGenerateTxParameter(struct vnt_private *pDevice,
 -      u8 byPktType, u16 wCurrentRate, void *pTxBufHead, void *pvRrvTime,
 -      void *rts_cts, u32 cbFrameSize, int bNeedACK, u32 uDMAIdx,
 -      struct ethhdr *psEthHeader, bool need_rts)
 +      u8 byPktType, u16 wCurrentRate, struct vnt_tx_buffer *tx_buffer,
 +      struct vnt_mic_hdr **mic_hdr, u32 need_mic, u32 cbFrameSize,
 +      int bNeedACK, u32 uDMAIdx, struct ethhdr *psEthHeader, bool need_rts)
  {
 -      union vnt_tx_data_head *head = rts_cts;
 +      struct vnt_tx_fifo_head *pFifoHead = &tx_buffer->fifo_head;
 +      union vnt_tx_data_head *head = NULL;
        u32 cbMACHdLen = WLAN_HDR_ADDR3_LEN; /* 24 */
        u16 wFifoCtl;
        u8 byFBOption = AUTO_FB_NONE;
  
      //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
 -    PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
      pFifoHead->wReserved = wCurrentRate;
      wFifoCtl = pFifoHead->wFIFOCtl;
  
          byFBOption = AUTO_FB_1;
      }
  
 -      if (!pvRrvTime)
 +      if (!pFifoHead)
                return;
  
      if (pDevice->bLongHeader)
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
        if (need_rts) {
              //Fill RsvTime
 -              struct vnt_rrv_time_rts *pBuf =
 -                      (struct vnt_rrv_time_rts *)pvRrvTime;
 +              struct vnt_rrv_time_rts *pBuf = &tx_buffer->tx_head.tx_rts.rts;
 +
                pBuf->wRTSTxRrvTime_aa = s_uGetRTSCTSRsvTime(pDevice, 2,
                                byPktType, cbFrameSize, wCurrentRate);
                pBuf->wRTSTxRrvTime_ba = s_uGetRTSCTSRsvTime(pDevice, 1,
                pBuf->wTxRrvTime_b = vnt_rxtx_rsvtime_le16(pDevice,
                        PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate,
                                bNeedACK);
 +
 +              if (need_mic) {
 +                      *mic_hdr = &tx_buffer->tx_head.tx_rts.tx.mic.hdr;
 +                      head = &tx_buffer->tx_head.tx_rts.tx.mic.head;
 +              } else {
 +                      head = &tx_buffer->tx_head.tx_rts.tx.head;
 +              }
 +
                /* Fill RTS */
                s_vFillRTSHead(pDevice, byPktType, head, cbFrameSize,
                        bNeedACK, psEthHeader, wCurrentRate, byFBOption);
          }
          else {//RTS_needless, PCF mode
              //Fill RsvTime
 -              struct vnt_rrv_time_cts *pBuf =
 -                              (struct vnt_rrv_time_cts *)pvRrvTime;
 +              struct vnt_rrv_time_cts *pBuf = &tx_buffer->tx_head.tx_cts.cts;
 +
                pBuf->wTxRrvTime_a = vnt_rxtx_rsvtime_le16(pDevice, byPktType,
                        cbFrameSize, wCurrentRate, bNeedACK);
                pBuf->wTxRrvTime_b = vnt_rxtx_rsvtime_le16(pDevice,
                        pDevice->byTopCCKBasicRate, bNeedACK);
                pBuf->wCTSTxRrvTime_ba = s_uGetRTSCTSRsvTime(pDevice, 3,
                                byPktType, cbFrameSize, wCurrentRate);
 +
 +              if (need_mic) {
 +                      *mic_hdr = &tx_buffer->tx_head.tx_cts.tx.mic.hdr;
 +                      head = &tx_buffer->tx_head.tx_cts.tx.mic.head;
 +              } else {
 +                      head = &tx_buffer->tx_head.tx_cts.tx.head;
 +              }
 +
                /* Fill CTS */
                s_vFillCTSHead(pDevice, uDMAIdx, byPktType, head,
                        cbFrameSize, bNeedACK, wCurrentRate, byFBOption);
      else if (byPktType == PK_TYPE_11A) {
        if (need_rts) {
              //Fill RsvTime
 -              struct vnt_rrv_time_ab *pBuf =
 -                              (struct vnt_rrv_time_ab *)pvRrvTime;
 +              struct vnt_rrv_time_ab *pBuf = &tx_buffer->tx_head.tx_ab.ab;
 +
                pBuf->wRTSTxRrvTime = s_uGetRTSCTSRsvTime(pDevice, 2,
                                byPktType, cbFrameSize, wCurrentRate);
                pBuf->wTxRrvTime = vnt_rxtx_rsvtime_le16(pDevice, byPktType,
                                cbFrameSize, wCurrentRate, bNeedACK);
 +
 +              if (need_mic) {
 +                      *mic_hdr = &tx_buffer->tx_head.tx_ab.tx.mic.hdr;
 +                      head = &tx_buffer->tx_head.tx_ab.tx.mic.head;
 +              } else {
 +                      head = &tx_buffer->tx_head.tx_ab.tx.head;
 +              }
 +
                /* Fill RTS */
                s_vFillRTSHead(pDevice, byPktType, head, cbFrameSize,
                        bNeedACK, psEthHeader, wCurrentRate, byFBOption);
        } else {
              //Fill RsvTime
 -              struct vnt_rrv_time_ab *pBuf =
 -                              (struct vnt_rrv_time_ab *)pvRrvTime;
 +              struct vnt_rrv_time_ab *pBuf = &tx_buffer->tx_head.tx_ab.ab;
 +
 +              if (need_mic)
 +                      *mic_hdr = &tx_buffer->tx_head.tx_ab.tx.mic.hdr;
 +
                pBuf->wTxRrvTime = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11A,
                        cbFrameSize, wCurrentRate, bNeedACK);
          }
      else if (byPktType == PK_TYPE_11B) {
        if (need_rts) {
              //Fill RsvTime
 -              struct vnt_rrv_time_ab *pBuf =
 -                              (struct vnt_rrv_time_ab *)pvRrvTime;
 +              struct vnt_rrv_time_ab *pBuf = &tx_buffer->tx_head.tx_ab.ab;
 +
                pBuf->wRTSTxRrvTime = s_uGetRTSCTSRsvTime(pDevice, 0,
                                byPktType, cbFrameSize, wCurrentRate);
                pBuf->wTxRrvTime = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B,
                                cbFrameSize, wCurrentRate, bNeedACK);
 +
 +              if (need_mic) {
 +                      *mic_hdr = &tx_buffer->tx_head.tx_ab.tx.mic.hdr;
 +                      head = &tx_buffer->tx_head.tx_ab.tx.mic.head;
 +              } else {
 +                      head = &tx_buffer->tx_head.tx_ab.tx.head;
 +              }
 +
                /* Fill RTS */
                s_vFillRTSHead(pDevice, byPktType, head, cbFrameSize,
                        bNeedACK, psEthHeader, wCurrentRate, byFBOption);
          }
          else { //RTS_needless, non PCF mode
              //Fill RsvTime
 -              struct vnt_rrv_time_ab *pBuf =
 -                              (struct vnt_rrv_time_ab *)pvRrvTime;
 +              struct vnt_rrv_time_ab *pBuf = &tx_buffer->tx_head.tx_ab.ab;
 +
 +              if (need_mic)
 +                      *mic_hdr = &tx_buffer->tx_head.tx_ab.tx.mic.hdr;
 +
                pBuf->wTxRrvTime = vnt_rxtx_rsvtime_le16(pDevice, PK_TYPE_11B,
                        cbFrameSize, wCurrentRate, bNeedACK);
          }
  */
  
  static int s_bPacketToWirelessUsb(struct vnt_private *pDevice, u8 byPktType,
 -      struct vnt_tx_buffer *pTxBufHead, int bNeedEncryption,
 +      struct vnt_tx_buffer *tx_buffer, int bNeedEncryption,
        u32 uSkbPacketLen, u32 uDMAIdx, struct ethhdr *psEthHeader,
        u8 *pPacket, PSKeyItem pTransmitKey, u32 uNodeIndex, u16 wCurrentRate,
        u32 *pcbHeaderLen, u32 *pcbTotalLen)
  {
 +      struct vnt_tx_fifo_head *pTxBufHead = &tx_buffer->fifo_head;
        struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
        u32 cbFrameSize, cbFrameBodySize;
        u32 cb802_1_H_len;
                = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
        u32 uDuration;
        u32 cbHeaderLength = 0, uPadding = 0;
 -      void *pvRrvTime;
        struct vnt_mic_hdr *pMICHDR;
 -      void *rts_cts = NULL;
        void *pvTxDataHd;
        u8 byFBOption = AUTO_FB_NONE, byFragType;
        u16 wTxBufSize;
        u32 *pdwMIC_L, *pdwMIC_R;
        int bSoftWEP = false;
  
 -      pvRrvTime = pMICHDR = pvTxDataHd = NULL;
 +      pMICHDR = pvTxDataHd = NULL;
  
        if (bNeedEncryption && pTransmitKey->pvKeyTable) {
                if (((PSKeyTable)pTransmitKey->pvKeyTable)->bSoftWEP == true)
      }
  
      pbyTxBufferAddr = (u8 *) &(pTxBufHead->adwTxKey[0]);
 -    wTxBufSize = sizeof(STxBufHead);
 +      wTxBufSize = sizeof(struct vnt_tx_fifo_head);
 +
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
          if (byFBOption == AUTO_FB_NONE) {
              if (bRTS == true) {//RTS_need
 -              pvRrvTime = (struct vnt_rrv_time_rts *)
 -                                      (pbyTxBufferAddr + wTxBufSize);
 -              pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize +
 -                                      sizeof(struct vnt_rrv_time_rts));
 -              rts_cts = (struct vnt_rts_g *) (pbyTxBufferAddr + wTxBufSize +
 -                              sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
                pvTxDataHd = (struct vnt_tx_datahead_g *) (pbyTxBufferAddr +
                        wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
                                cbMICHDR + sizeof(struct vnt_rts_g));
                                sizeof(struct vnt_tx_datahead_g);
              }
              else { //RTS_needless
 -              pvRrvTime = (struct vnt_rrv_time_cts *)
 -                              (pbyTxBufferAddr + wTxBufSize);
 -              pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize +
 -                      sizeof(struct vnt_rrv_time_cts));
 -              rts_cts = (struct vnt_cts *) (pbyTxBufferAddr + wTxBufSize +
 -                              sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
                pvTxDataHd = (struct vnt_tx_datahead_g *)(pbyTxBufferAddr +
                        wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
                                cbMICHDR + sizeof(struct vnt_cts));
          } else {
              // Auto Fall Back
              if (bRTS == true) {//RTS_need
 -              pvRrvTime = (struct vnt_rrv_time_rts *)(pbyTxBufferAddr +
 -                                                              wTxBufSize);
 -              pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize +
 -                                      sizeof(struct vnt_rrv_time_rts));
 -              rts_cts = (struct vnt_rts_g_fb *)(pbyTxBufferAddr + wTxBufSize +
 -                              sizeof(struct vnt_rrv_time_rts) + cbMICHDR);
                pvTxDataHd = (struct vnt_tx_datahead_g_fb *) (pbyTxBufferAddr +
                        wTxBufSize + sizeof(struct vnt_rrv_time_rts) +
                                cbMICHDR + sizeof(struct vnt_rts_g_fb));
                                sizeof(struct vnt_tx_datahead_g_fb);
              }
              else if (bRTS == false) { //RTS_needless
 -              pvRrvTime = (struct vnt_rrv_time_cts *)
 -                              (pbyTxBufferAddr + wTxBufSize);
 -              pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize +
 -                              sizeof(struct vnt_rrv_time_cts));
 -              rts_cts = (struct vnt_cts_fb *) (pbyTxBufferAddr + wTxBufSize +
 -                      sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
                pvTxDataHd = (struct vnt_tx_datahead_g_fb *) (pbyTxBufferAddr +
                        wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
                                cbMICHDR + sizeof(struct vnt_cts_fb));
      else {//802.11a/b packet
          if (byFBOption == AUTO_FB_NONE) {
              if (bRTS == true) {//RTS_need
 -              pvRrvTime = (struct vnt_rrv_time_ab *) (pbyTxBufferAddr +
 -                                                              wTxBufSize);
 -              pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize +
 -                                              sizeof(struct vnt_rrv_time_ab));
 -              rts_cts = (struct vnt_rts_ab *) (pbyTxBufferAddr + wTxBufSize +
 -                              sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
                pvTxDataHd = (struct vnt_tx_datahead_ab *)(pbyTxBufferAddr +
                        wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR +
                                                sizeof(struct vnt_rts_ab));
                                sizeof(struct vnt_tx_datahead_ab);
              }
              else if (bRTS == false) { //RTS_needless, no MICHDR
 -              pvRrvTime = (struct vnt_rrv_time_ab *)(pbyTxBufferAddr +
 -                                                              wTxBufSize);
 -              pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize +
 -                                              sizeof(struct vnt_rrv_time_ab));
                pvTxDataHd = (struct vnt_tx_datahead_ab *)(pbyTxBufferAddr +
                        wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
                cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
          } else {
              // Auto Fall Back
              if (bRTS == true) {//RTS_need
 -              pvRrvTime = (struct vnt_rrv_time_ab *)(pbyTxBufferAddr +
 -                                              wTxBufSize);
 -              pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize +
 -                      sizeof(struct vnt_rrv_time_ab));
 -              rts_cts = (struct vnt_rts_a_fb *)(pbyTxBufferAddr + wTxBufSize +
 -                              sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
                pvTxDataHd = (struct vnt_tx_datahead_a_fb *)(pbyTxBufferAddr +
                        wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR +
                                        sizeof(struct vnt_rts_a_fb));
                                        sizeof(struct vnt_tx_datahead_a_fb);
              }
              else if (bRTS == false) { //RTS_needless
 -              pvRrvTime = (struct vnt_rrv_time_ab *)(pbyTxBufferAddr +
 -                                                              wTxBufSize);
 -              pMICHDR = (struct vnt_mic_hdr *)(pbyTxBufferAddr + wTxBufSize +
 -                                              sizeof(struct vnt_rrv_time_ab));
                pvTxDataHd = (struct vnt_tx_datahead_a_fb *)(pbyTxBufferAddr +
                        wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
                cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
  
      //Fill FIFO,RrvTime,RTS,and CTS
      s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate,
 -              (void *)pbyTxBufferAddr, pvRrvTime, rts_cts,
 +              tx_buffer, &pMICHDR, cbMICHDR,
                cbFrameSize, bNeedACK, uDMAIdx, psEthHeader, bRTS);
      //Fill DataHead
      uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
@@@ -1461,13 -1469,13 +1463,13 @@@ CMD_STATUS csMgmt_xmit(struct vnt_priva
  {
        struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
        struct vnt_tx_buffer *pTX_Buffer;
 -      PSTxBufHead pTxBufHead;
        struct vnt_usb_send_context *pContext;
 +      struct vnt_tx_fifo_head *pTxBufHead;
        struct ieee80211_hdr *pMACHeader;
        struct ethhdr sEthHeader;
        u8 byPktType, *pbyTxBufferAddr;
 -      void *rts_cts = NULL;
 -      void *pvTxDataHd, *pvRrvTime, *pMICHDR;
 +      void *pvTxDataHd;
 +      struct vnt_mic_hdr *pMICHDR = NULL;
        u32 uDuration, cbReqCount, cbHeaderSize, cbFrameBodySize, cbFrameSize;
        int bNeedACK, bIsPSPOLL = false;
        u32 cbIVlen = 0, cbICVlen = 0, cbMIClen = 0, cbFCSlen = 4;
      }
  
        pTX_Buffer = (struct vnt_tx_buffer *)&pContext->Data[0];
 -    pbyTxBufferAddr = (u8 *)&(pTX_Buffer->adwTxKey[0]);
      cbFrameBodySize = pPacket->cbPayloadLen;
 -    pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
 -    wTxBufSize = sizeof(STxBufHead);
 +      pTxBufHead = &pTX_Buffer->fifo_head;
 +      pbyTxBufferAddr = (u8 *)&pTxBufHead->adwTxKey[0];
 +      wTxBufSize = sizeof(struct vnt_tx_fifo_head);
  
      if (pDevice->byBBType == BB_TYPE_11A) {
          wCurrentRate = RATE_6M;
  
      //Set RrvTime/RTS/CTS Buffer
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
 -
 -      pvRrvTime = (struct vnt_rrv_time_cts *) (pbyTxBufferAddr + wTxBufSize);
 -        pMICHDR = NULL;
 -      rts_cts = (struct vnt_cts *) (pbyTxBufferAddr + wTxBufSize +
 -                                      sizeof(struct vnt_rrv_time_cts));
        pvTxDataHd = (struct vnt_tx_datahead_g *)(pbyTxBufferAddr + wTxBufSize +
                sizeof(struct vnt_rrv_time_cts) + sizeof(struct vnt_cts));
        cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_cts) +
                sizeof(struct vnt_cts) + sizeof(struct vnt_tx_datahead_g);
      }
      else { // 802.11a/b packet
 -      pvRrvTime = (struct vnt_rrv_time_ab *) (pbyTxBufferAddr + wTxBufSize);
 -        pMICHDR = NULL;
        pvTxDataHd = (struct vnt_tx_datahead_ab *) (pbyTxBufferAddr +
                wTxBufSize + sizeof(struct vnt_rrv_time_ab));
        cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) +
  
        /* Fill FIFO,RrvTime,RTS,and CTS */
        s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate,
 -              pbyTxBufferAddr, pvRrvTime, rts_cts,
 +              pTX_Buffer, &pMICHDR, 0,
                cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, false);
  
      //Fill DataHead
      pContext->uBufLen = (u16)cbReqCount + 4;  //USB header
  
      if (WLAN_GET_FC_TODS(pMACHeader->frame_control) == 0) {
 -        s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->addr1[0]), (u16)cbFrameSize, pTX_Buffer->wFIFOCtl);
 +      s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F),
 +                      &pMACHeader->addr1[0], (u16)cbFrameSize,
 +                      pTxBufHead->wFIFOCtl);
      }
      else {
 -        s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->addr3[0]), (u16)cbFrameSize, pTX_Buffer->wFIFOCtl);
 +      s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F),
 +                      &pMACHeader->addr3[0], (u16)cbFrameSize,
 +                      pTxBufHead->wFIFOCtl);
      }
  
      PIPEnsSendBulkOut(pDevice,pContext);
@@@ -1814,14 -1825,15 +1816,14 @@@ void vDMA0_tx_80211(struct vnt_private 
  {
        struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
        struct vnt_tx_buffer *pTX_Buffer;
 +      struct vnt_tx_fifo_head *pTxBufHead;
        u8 byPktType;
        u8 *pbyTxBufferAddr;
 -      void *rts_cts = NULL;
        void *pvTxDataHd;
        u32 uDuration, cbReqCount;
        struct ieee80211_hdr *pMACHeader;
        u32 cbHeaderSize, cbFrameBodySize;
        int bNeedACK, bIsPSPOLL = false;
 -      PSTxBufHead pTxBufHead;
        u32 cbFrameSize;
        u32 cbIVlen = 0, cbICVlen = 0, cbMIClen = 0, cbFCSlen = 4;
        u32 uPadding = 0;
        u16 wTxBufSize;
        u32 cbMacHdLen;
        struct ethhdr sEthHeader;
 -      void *pvRrvTime, *pMICHDR;
 +      struct vnt_mic_hdr *pMICHDR;
        u32 wCurrentRate = RATE_1M;
        PUWLAN_80211HDR  p80211Header;
        u32 uNodeIndex = 0;
        u32 cbExtSuppRate = 0;
        struct vnt_usb_send_context *pContext;
  
 -      pvRrvTime = pMICHDR = pvTxDataHd = NULL;
 +      pMICHDR = pvTxDataHd = NULL;
  
      if(skb->len <= WLAN_HDR_ADDR3_LEN) {
         cbFrameBodySize = 0;
      }
  
        pTX_Buffer = (struct vnt_tx_buffer *)&pContext->Data[0];
 -    pbyTxBufferAddr = (u8 *)(&pTX_Buffer->adwTxKey[0]);
 -    pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
 -    wTxBufSize = sizeof(STxBufHead);
 +      pTxBufHead = &pTX_Buffer->fifo_head;
 +      pbyTxBufferAddr = (u8 *)&pTxBufHead->adwTxKey[0];
 +      wTxBufSize = sizeof(struct vnt_tx_fifo_head);
  
      if (pDevice->byBBType == BB_TYPE_11A) {
          wCurrentRate = RATE_6M;
      //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
  
      if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
 -      pvRrvTime = (struct vnt_rrv_time_cts *) (pbyTxBufferAddr + wTxBufSize);
 -      pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize +
 -                                      sizeof(struct vnt_rrv_time_cts));
 -      rts_cts = (struct vnt_cts *) (pbyTxBufferAddr + wTxBufSize +
 -                      sizeof(struct vnt_rrv_time_cts) + cbMICHDR);
        pvTxDataHd = (struct vnt_tx_datahead_g *) (pbyTxBufferAddr +
                wTxBufSize + sizeof(struct vnt_rrv_time_cts) + cbMICHDR +
                                        sizeof(struct vnt_cts));
  
      }
      else {//802.11a/b packet
 -
 -      pvRrvTime = (struct vnt_rrv_time_ab *) (pbyTxBufferAddr + wTxBufSize);
 -      pMICHDR = (struct vnt_mic_hdr *) (pbyTxBufferAddr + wTxBufSize +
 -              sizeof(struct vnt_rrv_time_ab));
        pvTxDataHd = (struct vnt_tx_datahead_ab *)(pbyTxBufferAddr +
                wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR);
        cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) + cbMICHDR +
  
        /* Fill FIFO,RrvTime,RTS,and CTS */
        s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate,
 -              pbyTxBufferAddr, pvRrvTime, rts_cts,
 +              pTX_Buffer, &pMICHDR, cbMICHDR,
                cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader, false);
  
      //Fill DataHead
      pContext->uBufLen = (u16)cbReqCount + 4;  //USB header
  
      if (WLAN_GET_FC_TODS(pMACHeader->frame_control) == 0) {
 -        s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->addr1[0]), (u16)cbFrameSize, pTX_Buffer->wFIFOCtl);
 +      s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F),
 +                      &pMACHeader->addr1[0], (u16)cbFrameSize,
 +                      pTxBufHead->wFIFOCtl);
      }
      else {
 -        s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->addr3[0]), (u16)cbFrameSize, pTX_Buffer->wFIFOCtl);
 +      s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F),
 +                      &pMACHeader->addr3[0], (u16)cbFrameSize,
 +                      pTxBufHead->wFIFOCtl);
      }
      PIPEnsSendBulkOut(pDevice,pContext);
      return ;
@@@ -2551,10 -2568,7 +2553,10 @@@ int nsDMA_tx_packet(struct vnt_private 
      pContext->Type = CONTEXT_DATA_PACKET;
      pContext->uBufLen = (u16)BytesToWrite + 4 ; //USB header
  
 -    s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.h_dest[0]), (u16) (BytesToWrite-uHeaderLen), pTX_Buffer->wFIFOCtl);
 +    s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F),
 +                      &pContext->sEthHeader.h_dest[0],
 +                      (u16)(BytesToWrite-uHeaderLen),
 +                      pTX_Buffer->fifo_head.wFIFOCtl);
  
      status = PIPEnsSendBulkOut(pDevice,pContext);
  
@@@ -2705,10 -2719,7 +2707,10 @@@ int bRelayPacketSend(struct vnt_privat
      pContext->Type = CONTEXT_DATA_PACKET;
      pContext->uBufLen = (u16)BytesToWrite + 4 ; //USB header
  
 -    s_vSaveTxPktInfo(pDevice, (u8) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.h_dest[0]), (u16) (BytesToWrite-uHeaderLen), pTX_Buffer->wFIFOCtl);
 +    s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F),
 +              &pContext->sEthHeader.h_dest[0],
 +              (u16)(BytesToWrite - uHeaderLen),
 +              pTX_Buffer->fifo_head.wFIFOCtl);
  
      status = PIPEnsSendBulkOut(pDevice,pContext);