Merge 3.15-rc2 into staging-next
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 22 Apr 2014 17:08:40 +0000 (10:08 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 22 Apr 2014 17:08:40 +0000 (10:08 -0700)
This resolves a bunch of merge errors with other fixes that are already
in Linus's tree.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
143 files changed:
drivers/staging/Kconfig
drivers/staging/Makefile
drivers/staging/android/binder.c
drivers/staging/android/uapi/ion.h
drivers/staging/bcm/CmHost.c
drivers/staging/bcm/InterfaceMisc.h
drivers/staging/bcm/Qos.c
drivers/staging/bcm/hostmibs.c
drivers/staging/comedi/comedi_fops.c
drivers/staging/comedi/drivers.c
drivers/staging/comedi/drivers/addi_apci_1032.c
drivers/staging/comedi/drivers/addi_apci_1500.c
drivers/staging/comedi/drivers/addi_apci_1564.c
drivers/staging/comedi/drivers/addi_apci_2032.c
drivers/staging/comedi/drivers/addi_apci_3120.c
drivers/staging/comedi/drivers/adl_pci9118.c
drivers/staging/comedi/drivers/das6402.c
drivers/staging/comedi/drivers/pcl812.c
drivers/staging/comedi/drivers/s626.c
drivers/staging/crystalhd/crystalhd_lnx.c
drivers/staging/cxt1e1/hwprobe.c
drivers/staging/cxt1e1/linux.c
drivers/staging/cxt1e1/musycc.c
drivers/staging/cxt1e1/pmc93x6_eeprom.c
drivers/staging/cxt1e1/pmcc4_drv.c
drivers/staging/cxt1e1/pmcc4_private.h
drivers/staging/cxt1e1/sbecom_inline_linux.h
drivers/staging/cxt1e1/sbecrc.c
drivers/staging/cxt1e1/sbeproc.c
drivers/staging/dgap/dgap.c
drivers/staging/dgap/dgap.h
drivers/staging/goldfish/README
drivers/staging/goldfish/goldfish_audio.c
drivers/staging/goldfish/goldfish_nand.c
drivers/staging/iio/light/tsl2583.c
drivers/staging/iio/trigger/iio-trig-periodic-rtc.c
drivers/staging/line6/driver.c
drivers/staging/line6/pcm.c
drivers/staging/line6/playback.c
drivers/staging/line6/toneport.c
drivers/staging/lustre/include/linux/libcfs/libcfs_cpu.h
drivers/staging/lustre/include/linux/libcfs/libcfs_crypto.h
drivers/staging/lustre/include/linux/libcfs/libcfs_debug.h
drivers/staging/lustre/include/linux/libcfs/libcfs_hash.h
drivers/staging/lustre/include/linux/lnet/lib-lnet.h
drivers/staging/lustre/include/linux/lnet/lib-types.h
drivers/staging/lustre/include/linux/lnet/lnetst.h
drivers/staging/lustre/include/linux/lnet/ptllnd.h
drivers/staging/lustre/include/linux/lnet/ptllnd_wire.h
drivers/staging/lustre/include/linux/lnet/types.h
drivers/staging/lustre/lustre/include/linux/obd.h
drivers/staging/lustre/lustre/include/lu_ref.h
drivers/staging/lustre/lustre/include/lustre_dlm.h
drivers/staging/lustre/lustre/libcfs/workitem.c
drivers/staging/lustre/lustre/lmv/lproc_lmv.c
drivers/staging/lustre/lustre/obdclass/cl_lock.c
drivers/staging/lustre/lustre/obdclass/genops.c
drivers/staging/lustre/lustre/obdclass/linux/linux-module.c
drivers/staging/lustre/lustre/obdclass/obd_mount.c
drivers/staging/lustre/lustre/ptlrpc/lproc_ptlrpc.c
drivers/staging/lustre/lustre/ptlrpc/sec.c
drivers/staging/panel/panel.c
drivers/staging/rtl8188eu/include/xmit_osdep.h
drivers/staging/rtl8188eu/os_dep/os_intfs.c
drivers/staging/rtl8188eu/os_dep/usb_intf.c
drivers/staging/rtl8723au/Kconfig
drivers/staging/rtl8723au/Makefile
drivers/staging/rtl8723au/core/rtw_ap.c
drivers/staging/rtl8723au/core/rtw_cmd.c
drivers/staging/rtl8723au/core/rtw_ieee80211.c
drivers/staging/rtl8723au/core/rtw_ioctl_set.c
drivers/staging/rtl8723au/core/rtw_mlme.c
drivers/staging/rtl8723au/core/rtw_mlme_ext.c
drivers/staging/rtl8723au/core/rtw_p2p.c [deleted file]
drivers/staging/rtl8723au/core/rtw_pwrctrl.c
drivers/staging/rtl8723au/core/rtw_recv.c
drivers/staging/rtl8723au/core/rtw_sreset.c
drivers/staging/rtl8723au/core/rtw_wlan_util.c
drivers/staging/rtl8723au/core/rtw_xmit.c
drivers/staging/rtl8723au/hal/hal_com.c
drivers/staging/rtl8723au/hal/hal_intf.c
drivers/staging/rtl8723au/hal/rtl8723a_bt-coexist.c
drivers/staging/rtl8723au/hal/rtl8723a_cmd.c
drivers/staging/rtl8723au/hal/rtl8723a_dm.c
drivers/staging/rtl8723au/hal/rtl8723a_hal_init.c
drivers/staging/rtl8723au/hal/rtl8723au_recv.c
drivers/staging/rtl8723au/hal/usb_halinit.c
drivers/staging/rtl8723au/include/drv_types.h
drivers/staging/rtl8723au/include/ethernet.h [deleted file]
drivers/staging/rtl8723au/include/hal_com.h
drivers/staging/rtl8723au/include/hal_intf.h
drivers/staging/rtl8723au/include/ieee80211.h
drivers/staging/rtl8723au/include/mlme_osdep.h
drivers/staging/rtl8723au/include/osdep_service.h
drivers/staging/rtl8723au/include/recv_osdep.h
drivers/staging/rtl8723au/include/rtl8723a_cmd.h
drivers/staging/rtl8723au/include/rtl8723a_hal.h
drivers/staging/rtl8723au/include/rtw_ap.h
drivers/staging/rtl8723au/include/rtw_cmd.h
drivers/staging/rtl8723au/include/rtw_mlme.h
drivers/staging/rtl8723au/include/rtw_mlme_ext.h
drivers/staging/rtl8723au/include/rtw_p2p.h [deleted file]
drivers/staging/rtl8723au/include/rtw_security.h
drivers/staging/rtl8723au/include/wifi.h
drivers/staging/rtl8723au/include/xmit_osdep.h
drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c
drivers/staging/rtl8723au/os_dep/mlme_linux.c
drivers/staging/rtl8723au/os_dep/os_intfs.c
drivers/staging/rtl8723au/os_dep/osdep_service.c
drivers/staging/rtl8723au/os_dep/recv_linux.c
drivers/staging/rtl8723au/os_dep/usb_intf.c
drivers/staging/rtl8723au/os_dep/xmit_linux.c
drivers/staging/rtl8821ae/rtl8821ae/hw.h
drivers/staging/sbe-2t3e3/cpld.c
drivers/staging/skein/Kconfig [new file with mode: 0644]
drivers/staging/skein/Makefile [new file with mode: 0644]
drivers/staging/skein/TODO [new file with mode: 0644]
drivers/staging/skein/include/skein.h [new file with mode: 0644]
drivers/staging/skein/include/skeinApi.h [new file with mode: 0644]
drivers/staging/skein/include/skein_block.h [new file with mode: 0644]
drivers/staging/skein/include/skein_iv.h [new file with mode: 0644]
drivers/staging/skein/include/threefishApi.h [new file with mode: 0644]
drivers/staging/skein/skein.c [new file with mode: 0644]
drivers/staging/skein/skeinApi.c [new file with mode: 0644]
drivers/staging/skein/skeinBlockNo3F.c [new file with mode: 0644]
drivers/staging/skein/skein_block.c [new file with mode: 0644]
drivers/staging/skein/threefish1024Block.c [new file with mode: 0644]
drivers/staging/skein/threefish256Block.c [new file with mode: 0644]
drivers/staging/skein/threefish512Block.c [new file with mode: 0644]
drivers/staging/skein/threefishApi.c [new file with mode: 0644]
drivers/staging/speakup/kobjects.c
drivers/staging/vme/devices/vme_user.c
drivers/staging/vt6655/card.c
drivers/staging/vt6655/datarate.c
drivers/staging/vt6655/device.h
drivers/staging/vt6655/ioctl.c
drivers/staging/vt6655/iwctl.c
drivers/staging/vt6655/wpactl.c
drivers/staging/vt6656/aes_ccmp.c
drivers/staging/vt6656/firmware.c
drivers/staging/vt6656/rxtx.c
drivers/staging/vt6656/rxtx.h
drivers/staging/vt6656/tether.h

index 22365f140bec3d2d009b60d345369bd38aedf41a..e62be2b0b16df7cec9f09d901682d7b6f90fedb8 100644 (file)
@@ -144,6 +144,8 @@ source "drivers/staging/gs_fpgaboot/Kconfig"
 
 source "drivers/staging/nokia_h4p/Kconfig"
 
+source "drivers/staging/skein/Kconfig"
+
 source "drivers/staging/unisys/Kconfig"
 
 endif # STAGING
index fbe84ed2d048e4b953af51e2b9724945c7021db9..35edbe293631445d77a988e665f97d0788cf9bca 100644 (file)
@@ -64,4 +64,5 @@ obj-$(CONFIG_DGAP)                    += dgap/
 obj-$(CONFIG_MTD_SPINAND_MT29F)        += mt29f_spinand/
 obj-$(CONFIG_GS_FPGABOOT)      += gs_fpgaboot/
 obj-$(CONFIG_BT_NOKIA_H4P)     += nokia_h4p/
+obj-$(CONFIG_CRYPTO_SKEIN)     += skein/
 obj-$(CONFIG_UNISYSSPAR)       += unisys/
index cfe4bc8f05cb82ec83b4e127ba53f8e72968a85c..1f5e2499ac1b2255caf7e598018f1cd52148767b 100644 (file)
@@ -2683,16 +2683,20 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
                binder_free_thread(proc, thread);
                thread = NULL;
                break;
-       case BINDER_VERSION:
+       case BINDER_VERSION: {
+               struct binder_version __user *ver = ubuf;
+
                if (size != sizeof(struct binder_version)) {
                        ret = -EINVAL;
                        goto err;
                }
-               if (put_user(BINDER_CURRENT_PROTOCOL_VERSION, &((struct binder_version *)ubuf)->protocol_version)) {
+               if (put_user(BINDER_CURRENT_PROTOCOL_VERSION,
+                            &ver->protocol_version)) {
                        ret = -EINVAL;
                        goto err;
                }
                break;
+       }
        default:
                ret = -EINVAL;
                goto err;
index f09e7c154d691ec4d1e0e5c73901129fbc397d6e..6aa4956733708b025c981197424517ed0d29f6fa 100644 (file)
@@ -27,12 +27,12 @@ typedef int ion_user_handle_t;
  * @ION_HEAP_TYPE_SYSTEM:       memory allocated via vmalloc
  * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc
  * @ION_HEAP_TYPE_CARVEOUT:     memory allocated from a prereserved
- *                              carveout heap, allocations are physically
- *                              contiguous
+ *                              carveout heap, allocations are physically
+ *                              contiguous
  * @ION_HEAP_TYPE_DMA:          memory allocated via DMA API
  * @ION_NUM_HEAPS:              helper for iterating over heaps, a bit mask
- *                              is used to identify the heaps, so only 32
- *                              total heap types are supported
+ *                              is used to identify the heaps, so only 32
+ *                              total heap types are supported
  */
 enum ion_heap_type {
        ION_HEAP_TYPE_SYSTEM,
@@ -50,7 +50,7 @@ enum ion_heap_type {
 #define ION_HEAP_CARVEOUT_MASK         (1 << ION_HEAP_TYPE_CARVEOUT)
 #define ION_HEAP_TYPE_DMA_MASK         (1 << ION_HEAP_TYPE_DMA)
 
-#define ION_NUM_HEAP_IDS               sizeof(unsigned int) * 8
+#define ION_NUM_HEAP_IDS               (sizeof(unsigned int) * 8)
 
 /**
  * allocation flags - the lower 16 bits are used by core ion, the upper 16
@@ -78,7 +78,7 @@ enum ion_heap_type {
  * @align:             required alignment of the allocation
  * @heap_id_mask:      mask of heap ids to allocate from
  * @flags:             flags passed to heap
- * @handle:            pointer that will be populated with a cookie to use to 
+ * @handle:            pointer that will be populated with a cookie to use to
  *                     refer to this allocation
  *
  * Provided by userspace as an argument to the ioctl
index 632f81a7c63fb80ff2e77e94618b946cb48fca99..4564c63f908c953e19321dd5699be157bd08b3c0 100644 (file)
@@ -460,42 +460,30 @@ static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "CopyToAdapter : u8CSSpecification : %X\n", psfLocalSet->u8CSSpecification);
        switch (psfLocalSet->u8CSSpecification) {
        case eCSPacketIPV4:
-       {
                Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
                break;
-       }
        case eCSPacketIPV6:
-       {
                Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS;
                break;
-       }
        case eCS802_3PacketEthernet:
        case eCS802_1QPacketVLAN:
-       {
                Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
                break;
-       }
        case eCSPacketIPV4Over802_1QVLAN:
        case eCSPacketIPV4Over802_3Ethernet:
-       {
                Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
                Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
                break;
-       }
        case eCSPacketIPV6Over802_1QVLAN:
        case eCSPacketIPV6Over802_3Ethernet:
-       {
                Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS;
                Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
                break;
-       }
        default:
-       {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error in value of CS Classification.. setting default to IP CS\n");
                Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
                break;
        }
-       }
 
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "CopyToAdapter : Queue No : %X ETH CS Support :  %X  , IP CS Support : %X\n",
                        uiSearchRuleIndex,
@@ -542,32 +530,23 @@ static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer
                } else if (ucDsxType == DSC_ACK) {
                        switch (psfCSType->u8ClassfierDSCAction) {
                        case 0: /* DSC Add Classifier */
-                       {
                                eClassifierAction = eAddClassifier;
-                       }
-                       break;
+                               break;
                        case 1: /* DSC Replace Classifier */
-                       {
                                eClassifierAction = eReplaceClassifier;
-                       }
-                       break;
+                               break;
                        case 2: /* DSC Delete Classifier */
-                       {
                                eClassifierAction = eDeleteClassifier;
-                       }
-                       break;
+                               break;
                        default:
-                       {
                                eClassifierAction = eInvalidClassifierAction;
                        }
-                       }
                }
 
                u16PacketClassificationRuleIndex = ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
 
                switch (eClassifierAction) {
                case eAddClassifier:
-               {
                        /* Get a Free Classifier Index From Classifier table for this SF to add the Classifier */
                        /* Contained in this message */
                        nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
@@ -587,10 +566,8 @@ static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer
                                                "CopyToAdapter: Error The Specified Classifier Already Exists and attempted To Add Classifier with Same PCRI : 0x%x\n",
                                                u16PacketClassificationRuleIndex);
                        }
-               }
-               break;
+                       break;
                case eReplaceClassifier:
-               {
                        /* Get the Classifier Index From Classifier table for this SF and replace existing  Classifier */
                        /* with the new classifier Contained in this message */
                        nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
@@ -601,10 +578,8 @@ static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer
                        }
                        /* Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. */
                        CopyClassifierRuleToSF(Adapter, psfCSType, uiSearchRuleIndex, nClassifierIndex);
-               }
-               break;
+                       break;
                case eDeleteClassifier:
-               {
                        /* Get the Classifier Index From Classifier table for this SF and replace existing  Classifier */
                        /* with the new classifier Contained in this message */
                        nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
@@ -616,14 +591,11 @@ static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer
 
                        /* Delete This classifier */
                        DeleteClassifierRuleFromSF(Adapter, uiSearchRuleIndex, nClassifierIndex);
-               }
-               break;
+                       break;
                default:
-               {
                        /* Invalid Action for classifier */
                        break;
                }
-               }
        }
 
        /* Repeat parsing Classification Entries to process PHS Rules */
@@ -633,35 +605,28 @@ static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer
 
                switch (psfCSType->u8PhsDSCAction) {
                case eDeleteAllPHSRules:
-               {
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Deleting All PHS Rules For VCID: 0x%X\n", uVCID);
 
                        /* Delete All the PHS rules for this Service flow */
                        PhsDeleteSFRules(&Adapter->stBCMPhsContext, uVCID);
                        break;
-               }
                case eDeletePHSRule:
-               {
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "PHS DSC Action = Delete PHS Rule\n");
 
                        if (psfCSType->cPhsRule.u8PHSI)
                                PhsDeletePHSRule(&Adapter->stBCMPhsContext, uVCID, psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
 
                        break;
-               }
                default:
-               {
                        if (ucDsxType == DSC_ACK) {
                                /* BCM_DEBUG_PRINT(CONN_MSG,("Invalid PHS DSC Action For DSC\n",psfCSType->cPhsRule.u8PHSI)); */
                                break; /* FOr DSC ACK Case PHS DSC Action must be in valid set */
                        }
-               }
                /* Proceed To Add PHS rule for DSA_ACK case even if PHS DSC action is unspecified */
                /* No Break Here . Intentionally! */
 
                case eAddPHSRule:
                case eSetPHSRule:
-               {
                        if (psfCSType->cPhsRule.u8PHSI) {
                                /* Apply This PHS Rule to all classifiers whose Associated PHSI Match */
                                unsigned int uiClassifierIndex = 0;
@@ -738,8 +703,7 @@ static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer
                                                sPhsRule.u8PHSI);
                                }
                        }
-               }
-               break;
+                       break;
                }
        }
 
index bce6869a747809ae0724f31f538764cf4551d4bc..efb6860461535d571c5162665bf55346f383535d 100644 (file)
@@ -14,13 +14,13 @@ InterfaceWRM(struct bcm_interface_adapter *psIntfAdapter,
                        INT len);
 
 
-int InterfaceFileDownload( PVOID psIntfAdapter,
-                        struct file *flp,
-                        unsigned int on_chip_loc);
+int InterfaceFileDownload(PVOID psIntfAdapter,
+                       struct file *flp,
+                       unsigned int on_chip_loc);
 
-int InterfaceFileReadbackFromChip( PVOID psIntfAdapter,
-                        struct file *flp,
-                        unsigned int on_chip_loc);
+int InterfaceFileReadbackFromChip(PVOID psIntfAdapter,
+                       struct file *flp,
+                       unsigned int on_chip_loc);
 
 
 int BcmRDM(PVOID arg,
index 4f315835ddfcfd0348d6f70c203f0fb0d3b93cb1..64ae92b13160e76a7ee2ce372d67ab80fd2c0fe9 100644 (file)
@@ -4,11 +4,18 @@ This file contains the routines related to Quality of Service.
 */
 #include "headers.h"
 
-static void EThCSGetPktInfo(struct bcm_mini_adapter *Adapter, PVOID pvEthPayload, struct bcm_eth_packet_info *pstEthCsPktInfo);
-static bool EThCSClassifyPkt(struct bcm_mini_adapter *Adapter, struct sk_buff* skb, struct bcm_eth_packet_info *pstEthCsPktInfo, struct bcm_classifier_rule *pstClassifierRule, B_UINT8 EthCSCupport);
+static void EThCSGetPktInfo(struct bcm_mini_adapter *Adapter,
+                           PVOID pvEthPayload,
+                           struct bcm_eth_packet_info *pstEthCsPktInfo);
 
-static USHORT  IpVersion4(struct bcm_mini_adapter *Adapter, struct iphdr *iphd,
-                          struct bcm_classifier_rule *pstClassifierRule);
+static bool EThCSClassifyPkt(struct bcm_mini_adapter *Adapter,
+                            struct sk_buff *skb,
+                            struct bcm_eth_packet_info *pstEthCsPktInfo,
+                            struct bcm_classifier_rule *pstClassifierRule,
+                            B_UINT8 EthCSCupport);
+
+static USHORT IpVersion4(struct bcm_mini_adapter *Adapter, struct iphdr *iphd,
+                        struct bcm_classifier_rule *pstClassifierRule);
 
 static VOID PruneQueue(struct bcm_mini_adapter *Adapter, INT iIndex);
 
@@ -33,14 +40,11 @@ static bool MatchSrcIpAddress(struct bcm_classifier_rule *pstClassifierRule, ULO
        ulSrcIP = ntohl(ulSrcIP);
        if (0 == pstClassifierRule->ucIPSourceAddressLength)
                return TRUE;
-       for (ucLoopIndex = 0; ucLoopIndex < (pstClassifierRule->ucIPSourceAddressLength); ucLoopIndex++)
-       {
+       for (ucLoopIndex = 0; ucLoopIndex < (pstClassifierRule->ucIPSourceAddressLength); ucLoopIndex++) {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Src Ip Address Mask:0x%x PacketIp:0x%x and Classification:0x%x", (UINT)pstClassifierRule->stSrcIpAddress.ulIpv4Mask[ucLoopIndex], (UINT)ulSrcIP, (UINT)pstClassifierRule->stSrcIpAddress.ulIpv6Addr[ucLoopIndex]);
                if ((pstClassifierRule->stSrcIpAddress.ulIpv4Mask[ucLoopIndex] & ulSrcIP) ==
                                (pstClassifierRule->stSrcIpAddress.ulIpv4Addr[ucLoopIndex] & pstClassifierRule->stSrcIpAddress.ulIpv4Mask[ucLoopIndex]))
-               {
                        return TRUE;
-               }
        }
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Src Ip Address Not Matched");
        return false;
@@ -68,13 +72,10 @@ static bool MatchDestIpAddress(struct bcm_classifier_rule *pstClassifierRule, UL
                return TRUE;
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Destination Ip Address 0x%x 0x%x 0x%x  ", (UINT)ulDestIP, (UINT)pstClassifierRule->stDestIpAddress.ulIpv4Mask[ucLoopIndex], (UINT)pstClassifierRule->stDestIpAddress.ulIpv4Addr[ucLoopIndex]);
 
-       for (ucLoopIndex = 0; ucLoopIndex < (pstClassifierRule->ucIPDestinationAddressLength); ucLoopIndex++)
-       {
+       for (ucLoopIndex = 0; ucLoopIndex < (pstClassifierRule->ucIPDestinationAddressLength); ucLoopIndex++) {
                if ((pstClassifierRule->stDestIpAddress.ulIpv4Mask[ucLoopIndex] & ulDestIP) ==
                                (pstClassifierRule->stDestIpAddress.ulIpv4Addr[ucLoopIndex] & pstClassifierRule->stDestIpAddress.ulIpv4Mask[ucLoopIndex]))
-               {
                        return TRUE;
-               }
        }
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Destination Ip Address Not Matched");
        return false;
@@ -99,9 +100,8 @@ static bool MatchTos(struct bcm_classifier_rule *pstClassifierRule, UCHAR ucType
                return TRUE;
 
        if (((pstClassifierRule->ucTosMask & ucTypeOfService) <= pstClassifierRule->ucTosHigh) && ((pstClassifierRule->ucTosMask & ucTypeOfService) >= pstClassifierRule->ucTosLow))
-       {
                return TRUE;
-       }
+
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Type Of Service Not Matched");
        return false;
 }
@@ -123,13 +123,10 @@ bool MatchProtocol(struct bcm_classifier_rule *pstClassifierRule, UCHAR ucProtoc
        struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
        if (0 == pstClassifierRule->ucProtocolLength)
                return TRUE;
-       for (ucLoopIndex = 0; ucLoopIndex < pstClassifierRule->ucProtocolLength; ucLoopIndex++)
-       {
+       for (ucLoopIndex = 0; ucLoopIndex < pstClassifierRule->ucProtocolLength; ucLoopIndex++) {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Protocol:0x%X Classification Protocol:0x%X", ucProtocol, pstClassifierRule->ucProtocol[ucLoopIndex]);
                if (pstClassifierRule->ucProtocol[ucLoopIndex] == ucProtocol)
-               {
                        return TRUE;
-               }
        }
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Protocol Not Matched");
        return false;
@@ -155,13 +152,10 @@ bool MatchSrcPort(struct bcm_classifier_rule *pstClassifierRule, USHORT ushSrcPo
 
        if (0 == pstClassifierRule->ucSrcPortRangeLength)
                return TRUE;
-       for (ucLoopIndex = 0; ucLoopIndex < pstClassifierRule->ucSrcPortRangeLength; ucLoopIndex++)
-       {
+       for (ucLoopIndex = 0; ucLoopIndex < pstClassifierRule->ucSrcPortRangeLength; ucLoopIndex++) {
                if (ushSrcPort <= pstClassifierRule->usSrcPortRangeHi[ucLoopIndex] &&
                        ushSrcPort >= pstClassifierRule->usSrcPortRangeLo[ucLoopIndex])
-               {
                        return TRUE;
-               }
        }
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Src Port: %x Not Matched ", ushSrcPort);
        return false;
@@ -186,15 +180,12 @@ bool MatchDestPort(struct bcm_classifier_rule *pstClassifierRule, USHORT ushDest
        if (0 == pstClassifierRule->ucDestPortRangeLength)
                return TRUE;
 
-       for (ucLoopIndex = 0; ucLoopIndex < pstClassifierRule->ucDestPortRangeLength; ucLoopIndex++)
-       {
+       for (ucLoopIndex = 0; ucLoopIndex < pstClassifierRule->ucDestPortRangeLength; ucLoopIndex++) {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Matching Port:0x%X   0x%X  0x%X", ushDestPort, pstClassifierRule->usDestPortRangeLo[ucLoopIndex], pstClassifierRule->usDestPortRangeHi[ucLoopIndex]);
 
                if (ushDestPort <= pstClassifierRule->usDestPortRangeHi[ucLoopIndex] &&
                        ushDestPort >= pstClassifierRule->usDestPortRangeLo[ucLoopIndex])
-               {
                        return TRUE;
-               }
        }
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "Dest Port: %x Not Matched", ushDestPort);
        return false;
@@ -273,21 +264,13 @@ static USHORT     IpVersion4(struct bcm_mini_adapter *Adapter,
                bClassificationSucceed = TRUE;
        } while (0);
 
-       if (TRUE == bClassificationSucceed)
-       {
+       if (TRUE == bClassificationSucceed) {
                INT iMatchedSFQueueIndex = 0;
                iMatchedSFQueueIndex = SearchSfid(Adapter, pstClassifierRule->ulSFID);
                if (iMatchedSFQueueIndex >= NO_OF_QUEUES)
-               {
                        bClassificationSucceed = false;
-               }
-               else
-               {
-                       if (false == Adapter->PackInfo[iMatchedSFQueueIndex].bActive)
-                       {
-                               bClassificationSucceed = false;
-                       }
-               }
+               else if (false == Adapter->PackInfo[iMatchedSFQueueIndex].bActive)
+                       bClassificationSucceed = false;
        }
 
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "IpVersion4 <==========");
@@ -299,8 +282,7 @@ VOID PruneQueueAllSF(struct bcm_mini_adapter *Adapter)
 {
        UINT iIndex = 0;
 
-       for (iIndex = 0; iIndex < HiPriority; iIndex++)
-       {
+       for (iIndex = 0; iIndex < HiPriority; iIndex++) {
                if (!Adapter->PackInfo[iIndex].bValid)
                        continue;
 
@@ -334,10 +316,10 @@ static VOID PruneQueue(struct bcm_mini_adapter *Adapter, INT iIndex)
 
        spin_lock_bh(&Adapter->PackInfo[iIndex].SFQueueLock);
 
-       while (1)
+       while (1) {
 //     while((UINT)Adapter->PackInfo[iIndex].uiCurrentPacketsOnHost >
-//             SF_MAX_ALLOWED_PACKETS_TO_BACKUP)
-       {
+//             SF_MAX_ALLOWED_PACKETS_TO_BACKUP) {
+
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, PRUNE_QUEUE, DBG_LVL_ALL, "uiCurrentBytesOnHost:%x uiMaxBucketSize :%x",
                Adapter->PackInfo[iIndex].uiCurrentBytesOnHost,
                Adapter->PackInfo[iIndex].uiMaxBucketSize);
@@ -350,8 +332,7 @@ static VOID PruneQueue(struct bcm_mini_adapter *Adapter, INT iIndex)
                        ((1000*(jiffies - *((B_UINT32 *)(PacketToDrop->cb)+SKB_CB_LATENCY_OFFSET))/HZ) <= Adapter->PackInfo[iIndex].uiMaxLatency))
                        break;
 
-               if (PacketToDrop)
-               {
+               if (PacketToDrop) {
                        if (netif_msg_tx_err(Adapter))
                                pr_info(PFX "%s: tx queue %d overlimit\n",
                                        Adapter->dev->name, iIndex);
@@ -394,20 +375,16 @@ VOID flush_all_queues(struct bcm_mini_adapter *Adapter)
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_INFO, DBG_LVL_ALL, "=====>");
 
 //     down(&Adapter->data_packet_queue_lock);
-       for (iQIndex = LowPriority; iQIndex < HiPriority; iQIndex++)
-       {
+       for (iQIndex = LowPriority; iQIndex < HiPriority; iQIndex++) {
                struct net_device_stats *netstats = &Adapter->dev->stats;
 
                spin_lock_bh(&Adapter->PackInfo[iQIndex].SFQueueLock);
-               while (Adapter->PackInfo[iQIndex].FirstTxQueue)
-               {
+               while (Adapter->PackInfo[iQIndex].FirstTxQueue) {
                        PacketToDrop = Adapter->PackInfo[iQIndex].FirstTxQueue;
-                       if (PacketToDrop)
-                       {
+                       if (PacketToDrop) {
                                uiTotalPacketLength = PacketToDrop->len;
                                netstats->tx_dropped++;
-                       }
-                       else
+                       } else
                                uiTotalPacketLength = 0;
 
                        DEQUEUEPACKET(Adapter->PackInfo[iQIndex].FirstTxQueue,
@@ -455,58 +432,42 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter, struct sk_buff* skb)
        *((UINT32*) (skb->cb) +SKB_CB_TCPACK_OFFSET) = 0;
        EThCSGetPktInfo(Adapter, pvEThPayload, &stEthCsPktInfo);
 
-       switch (stEthCsPktInfo.eNwpktEthFrameType)
-       {
+       switch (stEthCsPktInfo.eNwpktEthFrameType) {
                case eEth802LLCFrame:
-               {
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "ClassifyPacket : 802LLCFrame\n");
                        pIpHeader = pvEThPayload + sizeof(struct bcm_eth_llc_frame);
                        break;
-               }
-
                case eEth802LLCSNAPFrame:
-               {
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "ClassifyPacket : 802LLC SNAP Frame\n");
                        pIpHeader = pvEThPayload + sizeof(struct bcm_eth_llc_snap_frame);
                        break;
-               }
                case eEth802QVLANFrame:
-               {
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "ClassifyPacket : 802.1Q VLANFrame\n");
                        pIpHeader = pvEThPayload + sizeof(struct bcm_eth_q_frame);
                        break;
-               }
                case eEthOtherFrame:
-               {
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "ClassifyPacket : ETH Other Frame\n");
                        pIpHeader = pvEThPayload + sizeof(struct bcm_ethernet2_frame);
                        break;
-               }
                default:
-               {
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "ClassifyPacket : Unrecognized ETH Frame\n");
                        pIpHeader = pvEThPayload + sizeof(struct bcm_ethernet2_frame);
                        break;
-               }
        }
 
-       if (stEthCsPktInfo.eNwpktIPFrameType == eIPv4Packet)
-       {
+       if (stEthCsPktInfo.eNwpktIPFrameType == eIPv4Packet) {
                usCurrFragment = (ntohs(pIpHeader->frag_off) & IP_OFFSET);
                if ((ntohs(pIpHeader->frag_off) & IP_MF) || usCurrFragment)
                        bFragmentedPkt = TRUE;
 
-               if (bFragmentedPkt)
-               {
+               if (bFragmentedPkt) {
                                //Fragmented  Packet. Get Frag Classifier Entry.
                        pstClassifierRule = GetFragIPClsEntry(Adapter, pIpHeader->id, pIpHeader->saddr);
-                       if (pstClassifierRule)
-                       {
+                       if (pstClassifierRule) {
                                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "It is next Fragmented pkt");
                                        bClassificationSucceed = TRUE;
                        }
-                       if (!(ntohs(pIpHeader->frag_off) & IP_MF))
-                       {
+                       if (!(ntohs(pIpHeader->frag_off) & IP_MF)) {
                                //Fragmented Last packet . Remove Frag Classifier Entry
                                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "This is the last fragmented Pkt");
                                DelFragIPClsEntry(Adapter, pIpHeader->id, pIpHeader->saddr);
@@ -514,23 +475,19 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter, struct sk_buff* skb)
                }
        }
 
-       for (uiLoopIndex = MAX_CLASSIFIERS - 1; uiLoopIndex >= 0; uiLoopIndex--)
-       {
+       for (uiLoopIndex = MAX_CLASSIFIERS - 1; uiLoopIndex >= 0; uiLoopIndex--) {
                if (bClassificationSucceed)
                        break;
                //Iterate through all classifiers which are already in order of priority
                //to classify the packet until match found
-               do
-               {
-                       if (false == Adapter->astClassifierTable[uiLoopIndex].bUsed)
-                       {
+               do {
+                       if (false == Adapter->astClassifierTable[uiLoopIndex].bUsed) {
                                bClassificationSucceed = false;
                                break;
                        }
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "Adapter->PackInfo[%d].bvalid=True\n", uiLoopIndex);
 
-                       if (0 == Adapter->astClassifierTable[uiLoopIndex].ucDirection)
-                       {
+                       if (0 == Adapter->astClassifierTable[uiLoopIndex].ucDirection) {
                                bClassificationSucceed = false;//cannot be processed for classification.
                                break;                                          // it is a down link connection
                        }
@@ -543,11 +500,9 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter, struct sk_buff* skb)
                                break;
                        }
 
-                       if (Adapter->PackInfo[uiSfIndex].bEthCSSupport)
-                       {
+                       if (Adapter->PackInfo[uiSfIndex].bEthCSSupport) {
 
-                               if (eEthUnsupportedFrame == stEthCsPktInfo.eNwpktEthFrameType)
-                               {
+                               if (eEthUnsupportedFrame == stEthCsPktInfo.eNwpktEthFrameType) {
                                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, " ClassifyPacket : Packet Not a Valid Supported Ethernet Frame\n");
                                        bClassificationSucceed = false;
                                        break;
@@ -558,17 +513,12 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter, struct sk_buff* skb)
                                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "Performing ETH CS Classification on Classifier Rule ID : %x Service Flow ID : %lx\n", pstClassifierRule->uiClassifierRuleIndex, Adapter->PackInfo[uiSfIndex].ulSFID);
                                bClassificationSucceed = EThCSClassifyPkt(Adapter, skb, &stEthCsPktInfo, pstClassifierRule, Adapter->PackInfo[uiSfIndex].bEthCSSupport);
 
-                               if (!bClassificationSucceed)
-                               {
+                               if (!bClassificationSucceed) {
                                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "ClassifyPacket : Ethernet CS Classification Failed\n");
                                        break;
                                }
-                       }
-
-                       else // No ETH Supported on this SF
-                       {
-                               if (eEthOtherFrame != stEthCsPktInfo.eNwpktEthFrameType)
-                               {
+                       } else {        // No ETH Supported on this SF
+                               if (eEthOtherFrame != stEthCsPktInfo.eNwpktEthFrameType) {
                                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, " ClassifyPacket : Packet Not a 802.3 Ethernet Frame... hence not allowed over non-ETH CS SF\n");
                                        bClassificationSucceed = false;
                                        break;
@@ -577,11 +527,9 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter, struct sk_buff* skb)
 
                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "Proceeding to IP CS Clasification");
 
-                       if (Adapter->PackInfo[uiSfIndex].bIPCSSupport)
-                       {
+                       if (Adapter->PackInfo[uiSfIndex].bIPCSSupport) {
 
-                               if (stEthCsPktInfo.eNwpktIPFrameType == eNonIPPacket)
-                               {
+                               if (stEthCsPktInfo.eNwpktIPFrameType == eNonIPPacket) {
                                        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, " ClassifyPacket : Packet is Not an IP Packet\n");
                                        bClassificationSucceed = false;
                                        break;
@@ -598,31 +546,26 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter, struct sk_buff* skb)
                } while (0);
        }
 
-       if (bClassificationSucceed == TRUE)
-       {
+       if (bClassificationSucceed == TRUE) {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "CF id : %d, SF ID is =%lu", pstClassifierRule->uiClassifierRuleIndex, pstClassifierRule->ulSFID);
 
                //Store The matched Classifier in SKB
                *((UINT32*)(skb->cb)+SKB_CB_CLASSIFICATION_OFFSET) = pstClassifierRule->uiClassifierRuleIndex;
-               if ((TCP == pIpHeader->protocol) && !bFragmentedPkt && (ETH_AND_IP_HEADER_LEN + TCP_HEADER_LEN <= skb->len))
-               {
+               if ((TCP == pIpHeader->protocol) && !bFragmentedPkt && (ETH_AND_IP_HEADER_LEN + TCP_HEADER_LEN <= skb->len)) {
                         IpHeaderLength   = pIpHeader->ihl;
                         pTcpHeader = (struct bcm_tcp_header *)(((PUCHAR)pIpHeader)+(IpHeaderLength*4));
                         TcpHeaderLength  = GET_TCP_HEADER_LEN(pTcpHeader->HeaderLength);
 
                        if ((pTcpHeader->ucFlags & TCP_ACK) &&
                           (ntohs(pIpHeader->tot_len) == (IpHeaderLength*4)+(TcpHeaderLength*4)))
-                       {
                                *((UINT32*) (skb->cb) + SKB_CB_TCPACK_OFFSET) = TCP_ACK;
-                       }
                }
 
                usIndex = SearchSfid(Adapter, pstClassifierRule->ulSFID);
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "index is  =%d", usIndex);
 
                //If this is the first fragment of a Fragmented pkt, add this CF. Only This CF should be used for all other fragment of this Pkt.
-               if (bFragmentedPkt && (usCurrFragment == 0))
-               {
+               if (bFragmentedPkt && (usCurrFragment == 0)) {
                        //First Fragment of Fragmented Packet. Create Frag CLS Entry
                        struct bcm_fragmented_packet_info stFragPktInfo;
                        stFragPktInfo.bUsed = TRUE;
@@ -649,8 +592,7 @@ static bool EthCSMatchSrcMACAddress(struct bcm_classifier_rule *pstClassifierRul
        if (pstClassifierRule->ucEthCSSrcMACLen == 0)
                return TRUE;
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "%s\n", __FUNCTION__);
-       for (i = 0; i < MAC_ADDRESS_SIZE; i++)
-       {
+       for (i = 0; i < MAC_ADDRESS_SIZE; i++) {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "SRC MAC[%x] = %x ClassifierRuleSrcMAC = %x Mask : %x\n", i, Mac[i], pstClassifierRule->au8EThCSSrcMAC[i], pstClassifierRule->au8EThCSSrcMACMask[i]);
                if ((pstClassifierRule->au8EThCSSrcMAC[i] & pstClassifierRule->au8EThCSSrcMACMask[i]) !=
                        (Mac[i] & pstClassifierRule->au8EThCSSrcMACMask[i]))
@@ -666,8 +608,7 @@ static bool EthCSMatchDestMACAddress(struct bcm_classifier_rule *pstClassifierRu
        if (pstClassifierRule->ucEthCSDestMACLen == 0)
                return TRUE;
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "%s\n", __FUNCTION__);
-       for (i = 0; i < MAC_ADDRESS_SIZE; i++)
-       {
+       for (i = 0; i < MAC_ADDRESS_SIZE; i++) {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "SRC MAC[%x] = %x ClassifierRuleSrcMAC = %x Mask : %x\n", i, Mac[i], pstClassifierRule->au8EThCSDestMAC[i], pstClassifierRule->au8EThCSDestMACMask[i]);
                if ((pstClassifierRule->au8EThCSDestMAC[i] & pstClassifierRule->au8EThCSDestMACMask[i]) !=
                        (Mac[i] & pstClassifierRule->au8EThCSDestMACMask[i]))
@@ -684,8 +625,7 @@ static bool EthCSMatchEThTypeSAP(struct bcm_classifier_rule *pstClassifierRule,
                return TRUE;
 
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "%s SrcEtherType:%x CLS EtherType[0]:%x\n", __FUNCTION__, pstEthCsPktInfo->usEtherType, pstClassifierRule->au8EthCSEtherType[0]);
-       if (pstClassifierRule->au8EthCSEtherType[0] == 1)
-       {
+       if (pstClassifierRule->au8EthCSEtherType[0] == 1) {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "%s  CLS EtherType[1]:%x EtherType[2]:%x\n", __FUNCTION__, pstClassifierRule->au8EthCSEtherType[1], pstClassifierRule->au8EthCSEtherType[2]);
 
                if (memcmp(&pstEthCsPktInfo->usEtherType, &pstClassifierRule->au8EthCSEtherType[1], 2) == 0)
@@ -694,8 +634,7 @@ static bool EthCSMatchEThTypeSAP(struct bcm_classifier_rule *pstClassifierRule,
                        return false;
        }
 
-       if (pstClassifierRule->au8EthCSEtherType[0] == 2)
-       {
+       if (pstClassifierRule->au8EthCSEtherType[0] == 2) {
                if (eEth802LLCFrame != pstEthCsPktInfo->eNwpktEthFrameType)
                        return false;
 
@@ -721,8 +660,7 @@ static bool EthCSMatchVLANRules(struct bcm_classifier_rule *pstClassifierRule, s
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "%s  CLS UserPrio:%x CLS VLANID:%x\n", __FUNCTION__, ntohs(*((USHORT *)pstClassifierRule->usUserPriority)), pstClassifierRule->usVLANID);
 
        /* In case FW didn't receive the TLV, the priority field should be ignored */
-       if (pstClassifierRule->usValidityBitMap & (1<<PKT_CLASSIFICATION_USER_PRIORITY_VALID))
-       {
+       if (pstClassifierRule->usValidityBitMap & (1<<PKT_CLASSIFICATION_USER_PRIORITY_VALID)) {
                if (pstEthCsPktInfo->eNwpktEthFrameType != eEth802QVLANFrame)
                                return false;
 
@@ -739,8 +677,7 @@ static bool EthCSMatchVLANRules(struct bcm_classifier_rule *pstClassifierRule, s
 
        bClassificationSucceed = false;
 
-       if (pstClassifierRule->usValidityBitMap & (1<<PKT_CLASSIFICATION_VLANID_VALID))
-       {
+       if (pstClassifierRule->usValidityBitMap & (1<<PKT_CLASSIFICATION_VLANID_VALID)) {
                if (pstEthCsPktInfo->eNwpktEthFrameType != eEth802QVLANFrame)
                                return false;
 
@@ -800,32 +737,24 @@ static void EThCSGetPktInfo(struct bcm_mini_adapter *Adapter, PVOID pvEthPayload
        USHORT u16Etype = ntohs(((struct bcm_eth_header *)pvEthPayload)->u16Etype);
 
        BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,  "EthCSGetPktInfo : Eth Hdr Type : %X\n", u16Etype);
-       if (u16Etype > 0x5dc)
-       {
+       if (u16Etype > 0x5dc) {
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "EthCSGetPktInfo : ETH2 Frame\n");
                //ETH2 Frame
-               if (u16Etype == ETHERNET_FRAMETYPE_802QVLAN)
-               {
+               if (u16Etype == ETHERNET_FRAMETYPE_802QVLAN) {
                        //802.1Q VLAN Header
                        pstEthCsPktInfo->eNwpktEthFrameType = eEth802QVLANFrame;
                        u16Etype = ((struct bcm_eth_q_frame *)pvEthPayload)->EthType;
                        //((ETH_CS_802_Q_FRAME*)pvEthPayload)->UserPriority
-               }
-               else
-               {
+               } else {
                        pstEthCsPktInfo->eNwpktEthFrameType = eEthOtherFrame;
                        u16Etype = ntohs(u16Etype);
                }
-
-       }
-       else
-       {
+       } else {
                //802.2 LLC
                BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL, "802.2 LLC Frame\n");
                pstEthCsPktInfo->eNwpktEthFrameType = eEth802LLCFrame;
                pstEthCsPktInfo->ucDSAP = ((struct bcm_eth_llc_frame *)pvEthPayload)->DSAP;
-               if (pstEthCsPktInfo->ucDSAP == 0xAA && ((struct bcm_eth_llc_frame *)pvEthPayload)->SSAP == 0xAA)
-               {
+               if (pstEthCsPktInfo->ucDSAP == 0xAA && ((struct bcm_eth_llc_frame *)pvEthPayload)->SSAP == 0xAA) {
                        //SNAP Frame
                        pstEthCsPktInfo->eNwpktEthFrameType = eEth802LLCSNAPFrame;
                        u16Etype = ((struct bcm_eth_llc_snap_frame *)pvEthPayload)->usEtherType;
index 39ace5510c4360c42cf8a1b59828ed27e9735460..42d9004e357d53a0ce5d33000cfb9df578f18d10 100644 (file)
@@ -9,37 +9,40 @@
 
 #include "headers.h"
 
-INT ProcessGetHostMibs(struct bcm_mini_adapter *Adapter, struct bcm_host_stats_mibs *pstHostMibs)
+INT ProcessGetHostMibs(struct bcm_mini_adapter *Adapter,
+                      struct bcm_host_stats_mibs *pstHostMibs)
 {
        struct bcm_phs_entry *pstServiceFlowEntry = NULL;
        struct bcm_phs_rule *pstPhsRule = NULL;
        struct bcm_phs_classifier_table *pstClassifierTable = NULL;
        struct bcm_phs_classifier_entry *pstClassifierRule = NULL;
-       struct bcm_phs_extension *pDeviceExtension = (struct bcm_phs_extension *) &Adapter->stBCMPhsContext;
-
-       UINT nClassifierIndex = 0, nPhsTableIndex = 0, nSfIndex = 0, uiIndex = 0;
+       struct bcm_phs_extension *pDeviceExtension = &Adapter->stBCMPhsContext;
+       UINT nClassifierIndex = 0;
+       UINT nPhsTableIndex = 0;
+       UINT nSfIndex = 0;
+       UINT uiIndex = 0;
 
        if (pDeviceExtension == NULL) {
-               BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, HOST_MIBS, DBG_LVL_ALL, "Invalid Device Extension\n");
+               BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, HOST_MIBS,
+                               DBG_LVL_ALL, "Invalid Device Extension\n");
                return STATUS_FAILURE;
        }
 
        /* Copy the classifier Table */
-       for (nClassifierIndex = 0; nClassifierIndex < MAX_CLASSIFIERS; nClassifierIndex++) {
+       for (nClassifierIndex = 0; nClassifierIndex < MAX_CLASSIFIERS;
+                                                       nClassifierIndex++) {
                if (Adapter->astClassifierTable[nClassifierIndex].bUsed == TRUE)
-                       memcpy((PVOID) &pstHostMibs->
-                              astClassifierTable[nClassifierIndex],
-                              (PVOID) &Adapter->
-                              astClassifierTable[nClassifierIndex],
+                       memcpy(&pstHostMibs->astClassifierTable[nClassifierIndex],
+                              &Adapter->astClassifierTable[nClassifierIndex],
                               sizeof(struct bcm_mibs_classifier_rule));
        }
 
        /* Copy the SF Table */
        for (nSfIndex = 0; nSfIndex < NO_OF_QUEUES; nSfIndex++) {
                if (Adapter->PackInfo[nSfIndex].bValid) {
-                       memcpy((PVOID) &pstHostMibs->astSFtable[nSfIndex],
-                              (PVOID) &Adapter->PackInfo[nSfIndex],
-                               sizeof(struct bcm_mibs_table));
+                       memcpy(&pstHostMibs->astSFtable[nSfIndex],
+                              &Adapter->PackInfo[nSfIndex],
+                              sizeof(struct bcm_mibs_table));
                } else {
                        /* If index in not valid,
                         * don't process this for the PHS table.
@@ -68,9 +71,9 @@ INT ProcessGetHostMibs(struct bcm_mini_adapter *Adapter, struct bcm_host_stats_m
                                pstHostMibs->astPhsRulesTable[nPhsTableIndex].
                                    ulSFID = Adapter->PackInfo[nSfIndex].ulSFID;
 
-                               memcpy(&pstHostMibs->
-                                      astPhsRulesTable[nPhsTableIndex].u8PHSI,
-                                      &pstPhsRule->u8PHSI, sizeof(struct bcm_phs_rule));
+                               memcpy(&pstHostMibs->astPhsRulesTable[nPhsTableIndex].u8PHSI,
+                                      &pstPhsRule->u8PHSI,
+                                      sizeof(struct bcm_phs_rule));
                                nPhsTableIndex++;
 
                        }
@@ -82,26 +85,32 @@ INT ProcessGetHostMibs(struct bcm_mini_adapter *Adapter, struct bcm_host_stats_m
        /* Copy other Host Statistics parameters */
        pstHostMibs->stHostInfo.GoodTransmits = Adapter->dev->stats.tx_packets;
        pstHostMibs->stHostInfo.GoodReceives = Adapter->dev->stats.rx_packets;
-       pstHostMibs->stHostInfo.CurrNumFreeDesc = atomic_read(&Adapter->CurrNumFreeTxDesc);
+       pstHostMibs->stHostInfo.CurrNumFreeDesc =
+                               atomic_read(&Adapter->CurrNumFreeTxDesc);
        pstHostMibs->stHostInfo.BEBucketSize = Adapter->BEBucketSize;
        pstHostMibs->stHostInfo.rtPSBucketSize = Adapter->rtPSBucketSize;
        pstHostMibs->stHostInfo.TimerActive = Adapter->TimerActive;
        pstHostMibs->stHostInfo.u32TotalDSD = Adapter->u32TotalDSD;
 
-       memcpy(pstHostMibs->stHostInfo.aTxPktSizeHist, Adapter->aTxPktSizeHist, sizeof(UINT32) * MIBS_MAX_HIST_ENTRIES);
-       memcpy(pstHostMibs->stHostInfo.aRxPktSizeHist, Adapter->aRxPktSizeHist, sizeof(UINT32) * MIBS_MAX_HIST_ENTRIES);
+       memcpy(pstHostMibs->stHostInfo.aTxPktSizeHist, Adapter->aTxPktSizeHist,
+              sizeof(UINT32) * MIBS_MAX_HIST_ENTRIES);
+       memcpy(pstHostMibs->stHostInfo.aRxPktSizeHist, Adapter->aRxPktSizeHist,
+              sizeof(UINT32) * MIBS_MAX_HIST_ENTRIES);
 
        return STATUS_SUCCESS;
 }
 
-VOID GetDroppedAppCntrlPktMibs(struct bcm_host_stats_mibs *pstHostMibs, struct bcm_tarang_data *pTarang)
+VOID GetDroppedAppCntrlPktMibs(struct bcm_host_stats_mibs *pstHostMibs,
+                              struct bcm_tarang_data *pTarang)
 {
        memcpy(&(pstHostMibs->stDroppedAppCntrlMsgs),
               &(pTarang->stDroppedAppCntrlMsgs),
               sizeof(struct bcm_mibs_dropped_cntrl_msg));
 }
 
-VOID CopyMIBSExtendedSFParameters(struct bcm_mini_adapter *Adapter, struct bcm_connect_mgr_params *psfLocalSet, UINT uiSearchRuleIndex)
+VOID CopyMIBSExtendedSFParameters(struct bcm_mini_adapter *Adapter,
+                                 struct bcm_connect_mgr_params *psfLocalSet,
+                                 UINT uiSearchRuleIndex)
 {
        struct bcm_mibs_parameters *t = &Adapter->PackInfo[uiSearchRuleIndex].stMibsExtServiceFlowTable;
 
index acc80197e35ed86f0c89eee412f6bba9d0d640b5..70545e670dd0b8ccb3b8aeb54c7f85bc4711db76 100644 (file)
@@ -1435,13 +1435,15 @@ static int __comedi_get_user_cmd(struct comedi_device *dev,
        s = &dev->subdevices[cmd->subdev];
 
        if (s->type == COMEDI_SUBD_UNUSED) {
-               dev_dbg(dev->class_dev, "%d not valid subdevice\n", cmd->subdev);
+               dev_dbg(dev->class_dev, "%d not valid subdevice\n",
+                       cmd->subdev);
                return -EIO;
        }
 
        if (!s->do_cmd || !s->do_cmdtest || !s->async) {
                dev_dbg(dev->class_dev,
-                       "subdevice %d does not support commands\n", cmd->subdev);
+                       "subdevice %d does not support commands\n",
+                       cmd->subdev);
                return -EIO;
        }
 
@@ -1597,7 +1599,6 @@ static int do_cmdtest_ioctl(struct comedi_device *dev,
 {
        struct comedi_cmd cmd;
        struct comedi_subdevice *s;
-       unsigned int *chanlist = NULL;
        unsigned int __user *user_chanlist;
        int ret;
 
@@ -1626,8 +1627,6 @@ static int do_cmdtest_ioctl(struct comedi_device *dev,
                ret = -EFAULT;
        }
 
-       kfree(chanlist);
-
        return ret;
 }
 
index ab0e8ed472910e93fd2268d7b5694ef9b388e291..cb5d21411a0c804ee585778bb68afb77a91ae646 100644 (file)
@@ -258,6 +258,7 @@ static int insn_rw_emulate_bits(struct comedi_device *dev,
        const unsigned base_bitfield_channel =
            (chan < channels_per_bitfield) ? 0 : chan;
        unsigned int new_data[2];
+
        memset(new_data, 0, sizeof(new_data));
        memset(&new_insn, 0, sizeof(new_insn));
        new_insn.insn = INSN_BITS;
index 0daa0ea63b5ef1fa11decb610a2e24662e8c80be..d6a5424654fca732d655f9c2f134470fc370777b 100644 (file)
@@ -379,5 +379,5 @@ static struct pci_driver apci1032_pci_driver = {
 module_comedi_pci_driver(apci1032_driver, apci1032_pci_driver);
 
 MODULE_AUTHOR("Comedi http://www.comedi.org");
-MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_DESCRIPTION("ADDI-DATA APCI-1032, 32 channel DI boards");
 MODULE_LICENSE("GPL");
index bd8e08ca14c02fe92381f3a3f4c5a24116938f16..eab75eb26478164d718d54817b375ee7883aac6a 100644 (file)
@@ -72,5 +72,5 @@ static struct pci_driver apci1500_pci_driver = {
 module_comedi_pci_driver(apci1500_driver, apci1500_pci_driver);
 
 MODULE_AUTHOR("Comedi http://www.comedi.org");
-MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_DESCRIPTION("ADDI-DATA APCI-1500, 16 channel DI / 16 channel DO boards");
 MODULE_LICENSE("GPL");
index 27aa9ae1bdd9e3a9f53413df969ff005aede3a71..11aa0bd5d7b1bdd5648d52f9b9646eafb19ccdac 100644 (file)
@@ -70,5 +70,5 @@ static struct pci_driver apci1564_pci_driver = {
 module_comedi_pci_driver(apci1564_driver, apci1564_pci_driver);
 
 MODULE_AUTHOR("Comedi http://www.comedi.org");
-MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_DESCRIPTION("ADDI-DATA APCI-1564, 32 channel DI / 32 channel DO boards");
 MODULE_LICENSE("GPL");
index c9b933cb5987c069fad52c98f64a8894e94f4f0c..feefc7a5ca9a7fe6b2df196d77e404fee2039d81 100644 (file)
@@ -374,5 +374,5 @@ static struct pci_driver apci2032_pci_driver = {
 module_comedi_pci_driver(apci2032_driver, apci2032_pci_driver);
 
 MODULE_AUTHOR("Comedi http://www.comedi.org");
-MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_DESCRIPTION("ADDI-DATA APCI-2032, 32 channel DO boards");
 MODULE_LICENSE("GPL");
index 57ee6e5c76355a8d63ef34e8335e1e3d1ed331f2..0cfb12fa1cbc8d0131cfb8838456f3dc1ba570c1 100644 (file)
@@ -246,5 +246,5 @@ static struct pci_driver apci3120_pci_driver = {
 module_comedi_pci_driver(apci3120_driver, apci3120_pci_driver);
 
 MODULE_AUTHOR("Comedi http://www.comedi.org");
-MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_DESCRIPTION("ADDI-DATA APCI-3120, Analog input board");
 MODULE_LICENSE("GPL");
index 3cfa1756fa6aa2cf9d4091042de8aff01506805d..b6abef6ceab776e9aa4a1ce698b0ac10591f6cb0 100644 (file)
@@ -96,7 +96,7 @@ Configuration options:
                                 * correct channel number on every 12 bit sample
                                 */
 
-#define IORANGE_9118   64      /* I hope */
+#define IORANGE_9118   64      /* I hope */
 #define PCI9118_CHANLEN        255     /*
                                 * len of chanlist, some source say 256,
                                 * but reality looks like 255 :-(
@@ -383,7 +383,7 @@ struct pci9118_private {
                                                 * users(0-AI, 1-AO, 2-DI, 3-DO)
                                                 */
        unsigned int cnt0_divisor;              /* actual CNT0 divisor */
-       void (*int_ai_func) (struct comedi_device *, struct comedi_subdevice *,
+       void (*int_ai_func)(struct comedi_device *, struct comedi_subdevice *,
                unsigned short,
                unsigned int,
                unsigned short);        /*
@@ -1045,7 +1045,7 @@ static void interrupt_pci9118_ai_dma(struct comedi_device *dev,
                move_block_from_dma(dev, s,
                                    devpriv->dmabuf_virt[devpriv->dma_actbuf],
                                    samplesinbuf);
-               m = m - sampls;         /* m= how many samples was transferred */
+               m = m - sampls;         /* m=how many samples was transferred */
        }
 
        if (!devpriv->ai_neverending) {
index e0cfb6cb547b9027db5ae7af3cd83601bce79d24..d18eea6c01aa69a0cf10eb90494b6f617321e628 100644 (file)
@@ -125,7 +125,7 @@ struct das6402_boardinfo {
        unsigned int maxdata;
 };
 
-struct das6402_boardinfo das6402_boards[] = {
+static struct das6402_boardinfo das6402_boards[] = {
        {
                .name           = "das6402-12",
                .maxdata        = 0x0fff,
index 160eac8083db16fb6a5b6f8bb5eaeacfa7686a12..5cc01fe45cf2367f914009f411dd6a53be74680b 100644 (file)
@@ -811,8 +811,9 @@ static int pcl812_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
                                devpriv->ai_dma = 0;
                                break;
                        }
-       } else
+       } else {
                devpriv->ai_dma = 0;
+       }
 
        devpriv->ai_act_scan = 0;
        devpriv->ai_poll_ptr = 0;
index 95fadf343f27333fa38abe65ed6361c5b9c6c901..6da43de51eb30d8bd4fc9e31ee2e2f793a97d63e 100644 (file)
@@ -295,10 +295,24 @@ static void s626_debi_replace(struct comedi_device *dev, unsigned int addr,
 
 /* **************  EEPROM ACCESS FUNCTIONS  ************** */
 
-static uint32_t s626_i2c_handshake(struct comedi_device *dev, uint32_t val)
+static int s626_i2c_handshake_eoc(struct comedi_device *dev,
+                                struct comedi_subdevice *s,
+                                struct comedi_insn *insn,
+                                unsigned long context)
+{
+       bool status;
+
+       status = s626_mc_test(dev, S626_MC2_UPLD_IIC, S626_P_MC2);
+       if (status)
+               return 0;
+       return -EBUSY;
+}
+
+static int s626_i2c_handshake(struct comedi_device *dev, uint32_t val)
 {
        struct s626_private *devpriv = dev->private;
        unsigned int ctrl;
+       int ret;
 
        /* Write I2C command to I2C Transfer Control shadow register */
        writel(val, devpriv->mmio + S626_P_I2CCTRL);
@@ -308,8 +322,9 @@ static uint32_t s626_i2c_handshake(struct comedi_device *dev, uint32_t val)
         * wait for upload confirmation.
         */
        s626_mc_enable(dev, S626_MC2_UPLD_IIC, S626_P_MC2);
-       while (!s626_mc_test(dev, S626_MC2_UPLD_IIC, S626_P_MC2))
-               ;
+       ret = comedi_timeout(dev, NULL, NULL, s626_i2c_handshake_eoc, 0);
+       if (ret)
+               return ret;
 
        /* Wait until I2C bus transfer is finished or an error occurs */
        do {
@@ -2029,8 +2044,9 @@ static int s626_ai_insn_read(struct comedi_device *dev,
        /* Wait for the data to arrive in FB BUFFER 1 register. */
 
        /* Wait for ADC done */
-       while (!(readl(devpriv->mmio + S626_P_PSR) & S626_PSR_GPIO2))
-               ;
+       ret = comedi_timeout(dev, s, insn, s626_ai_eoc, 0);
+       if (ret)
+               return ret;
 
        /* Fetch ADC data from audio interface's input shift register. */
 
@@ -2681,8 +2697,9 @@ static int s626_initialize(struct comedi_device *dev)
        writel(S626_I2C_CLKSEL | S626_I2C_ABORT,
               devpriv->mmio + S626_P_I2CSTAT);
        s626_mc_enable(dev, S626_MC2_UPLD_IIC, S626_P_MC2);
-       while (!(readl(devpriv->mmio + S626_P_MC2) & S626_MC2_UPLD_IIC))
-               ;
+       ret = comedi_timeout(dev, NULL, NULL, s626_i2c_handshake_eoc, 0);
+       if (ret)
+               return ret;
 
        /*
         * Per SAA7146 data sheet, write to STATUS
@@ -2691,8 +2708,9 @@ static int s626_initialize(struct comedi_device *dev)
        for (i = 0; i < 2; i++) {
                writel(S626_I2C_CLKSEL, devpriv->mmio + S626_P_I2CSTAT);
                s626_mc_enable(dev, S626_MC2_UPLD_IIC, S626_P_MC2);
-               while (!s626_mc_test(dev, S626_MC2_UPLD_IIC, S626_P_MC2))
-                       ;
+               ret = comedi_timeout(dev, NULL, NULL, s626_i2c_handshake_eoc, 0);
+               if (ret)
+                       return ret;
        }
 
        /*
index 20be9571990a30410816f8847e48ea59e273ae2e..e6fb331c6735492e1a1fcf26012c2f429c6833b7 100644 (file)
@@ -28,7 +28,7 @@ static struct crystalhd_adp *g_adp_info;
 
 static irqreturn_t chd_dec_isr(int irq, void *arg)
 {
-       struct crystalhd_adp *adp = (struct crystalhd_adp *) arg;
+       struct crystalhd_adp *adp = arg;
        int rc = 0;
        if (adp)
                rc = crystalhd_cmd_interrupt(&adp->cmds);
@@ -112,7 +112,7 @@ static void chd_dec_free_iodata(struct crystalhd_adp *adp,
 }
 
 static inline int crystalhd_user_data(void __user *ud, void *dr,
-                        int size, int set)
+                                     int size, int set)
 {
        int rc;
 
@@ -135,7 +135,8 @@ static inline int crystalhd_user_data(void __user *ud, void *dr,
 }
 
 static int chd_dec_fetch_cdata(struct crystalhd_adp *adp,
-        struct crystalhd_ioctl_data *io, uint32_t m_sz, unsigned long ua)
+                              struct crystalhd_ioctl_data *io, uint32_t m_sz,
+                              unsigned long ua)
 {
        unsigned long ua_off;
        int rc = 0;
@@ -154,7 +155,7 @@ static int chd_dec_fetch_cdata(struct crystalhd_adp *adp,
        io->add_cdata_sz = m_sz;
        ua_off = ua + sizeof(io->udata);
        rc = crystalhd_user_data((void __user *)ua_off, io->add_cdata,
-                       io->add_cdata_sz, 0);
+                                io->add_cdata_sz, 0);
        if (rc) {
                BCMLOG_ERR("failed to pull add_cdata sz:%x ua_off:%x\n",
                           io->add_cdata_sz, (unsigned int)ua_off);
@@ -167,7 +168,8 @@ static int chd_dec_fetch_cdata(struct crystalhd_adp *adp,
 }
 
 static int chd_dec_release_cdata(struct crystalhd_adp *adp,
-                        struct crystalhd_ioctl_data *io, unsigned long ua)
+                                struct crystalhd_ioctl_data *io,
+                                unsigned long ua)
 {
        unsigned long ua_off;
        int rc;
@@ -180,7 +182,7 @@ static int chd_dec_release_cdata(struct crystalhd_adp *adp,
        if (io->cmd != BCM_IOC_FW_DOWNLOAD) {
                ua_off = ua + sizeof(io->udata);
                rc = crystalhd_user_data((void __user *)ua_off, io->add_cdata,
-                                       io->add_cdata_sz, 1);
+                                        io->add_cdata_sz, 1);
                if (rc) {
                        BCMLOG_ERR(
                                "failed to push add_cdata sz:%x ua_off:%x\n",
@@ -210,7 +212,7 @@ static int chd_dec_proc_user_data(struct crystalhd_adp *adp,
        }
 
        rc = crystalhd_user_data((void __user *)ua, &io->udata,
-                       sizeof(io->udata), set);
+                                sizeof(io->udata), set);
        if (rc) {
                BCMLOG_ERR("failed to %s iodata\n", (set ? "set" : "get"));
                return rc;
@@ -382,7 +384,7 @@ static int chd_dec_init_chdev(struct crystalhd_adp *adp)
        }
 
        dev = device_create(crystalhd_class, NULL,
-                        MKDEV(adp->chd_dec_major, 0), NULL, "crystalhd");
+                           MKDEV(adp->chd_dec_major, 0), NULL, "crystalhd");
        if (IS_ERR(dev)) {
                rc = PTR_ERR(dev);
                BCMLOG_ERR("failed to create device\n");
@@ -397,8 +399,7 @@ static int chd_dec_init_chdev(struct crystalhd_adp *adp)
 
        /* Allocate general purpose ioctl pool. */
        for (i = 0; i < CHD_IODATA_POOL_SZ; i++) {
-               temp = kzalloc(sizeof(struct crystalhd_ioctl_data),
-                                        GFP_KERNEL);
+               temp = kzalloc(sizeof(*temp), GFP_KERNEL);
                if (!temp) {
                        BCMLOG_ERR("ioctl data pool kzalloc failed\n");
                        rc = -ENOMEM;
@@ -549,11 +550,11 @@ static int chd_dec_pci_probe(struct pci_dev *pdev,
        enum BC_STATUS sts = BC_STS_SUCCESS;
 
        BCMLOG(BCMLOG_DBG,
-               "PCI_INFO: Vendor:0x%04x Device:0x%04x s_vendor:0x%04x s_device: 0x%04x\n",
-               pdev->vendor, pdev->device, pdev->subsystem_vendor,
-               pdev->subsystem_device);
+              "PCI_INFO: Vendor:0x%04x Device:0x%04x s_vendor:0x%04x s_device: 0x%04x\n",
+              pdev->vendor, pdev->device, pdev->subsystem_vendor,
+              pdev->subsystem_device);
 
-       pinfo = kzalloc(sizeof(struct crystalhd_adp), GFP_KERNEL);
+       pinfo = kzalloc(sizeof(*pinfo), GFP_KERNEL);
        if (!pinfo) {
                BCMLOG_ERR("Failed to allocate memory\n");
                return -ENOMEM;
index 9b4198b1e634e01982b3b3b8720aa9267a9aef2a..cc2151e0acd7ca3297fc3f16039404db7bad6444 100644 (file)
@@ -174,12 +174,12 @@ cleanup_ioremap(void)
                if (hi->pci_slot == 0xff)
                        break;
                if (hi->addr_mapped[0]) {
-                       iounmap((void *)(hi->addr_mapped[0]));
+                       iounmap(hi->addr_mapped[0]);
                        release_mem_region((long) hi->addr[0], hi->len[0]);
                        hi->addr_mapped[0] = 0;
                }
                if (hi->addr_mapped[1]) {
-                       iounmap((void *)(hi->addr_mapped[1]));
+                       iounmap(hi->addr_mapped[1]);
                        release_mem_region((long) hi->addr[1], hi->len[1]);
                        hi->addr_mapped[1] = 0;
                }
@@ -205,7 +205,7 @@ cleanup_devs(void)
 #ifdef CONFIG_SBE_PMCC4_NCOMM
                free_irq(hi->pdev[1]->irq, hi->ndev);
 #endif
-               OS_kfree(hi->ndev);
+               kfree(hi->ndev);
        }
 }
 
@@ -329,7 +329,7 @@ c4hw_attach_all(void)
                                return -ENOMEM;
                        }
 
-                       hi->addr_mapped[j] = (unsigned long)ioremap(hi->addr[j], hi->len[j]);
+                       hi->addr_mapped[j] = ioremap(hi->addr[j], hi->len[j]);
                        if (!hi->addr_mapped[j]) {
                                pr_warning("%s: ioremap fails, addr=0x%lx, len=0x%lx ?\n",
                                           hi->devname, hi->addr[j], hi->len[j]);
index b02f5ade6661b0840c5a6918cf45da58a292f89d..4b4609db9f89c2ce9cf02ad6e0b1649af13c01bf 100644 (file)
@@ -60,7 +60,6 @@ status_t    c4_chan_work_init(mpi_t *, mch_t *);
 void        musycc_wq_chan_restart(void *);
 status_t __init c4_init(ci_t *, u_char *, u_char *);
 status_t __init c4_init2(ci_t *);
-ci_t       *__init c4_new(void *);
 int __init  c4hw_attach_all(void);
 void __init hdw_sn_get(hdw_info_t *, int);
 
@@ -418,7 +417,7 @@ create_chan(struct net_device *ndev, ci_t *ci,
                struct c4_priv *priv;
 
                /* allocate then fill in private data structure */
-               priv = OS_kmalloc(sizeof(struct c4_priv));
+               priv = kzalloc(sizeof(struct c4_priv), GFP_KERNEL);
                if (!priv) {
                        pr_warning("%s: no memory for net_device !\n",
                                   ci->devname);
@@ -428,7 +427,7 @@ create_chan(struct net_device *ndev, ci_t *ci,
                if (!dev) {
                        pr_warning("%s: no memory for hdlc_device !\n",
                                   ci->devname);
-                       OS_kfree(priv);
+                       kfree(priv);
                        return NULL;
                }
                priv->ci = ci;
@@ -972,8 +971,8 @@ c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
 
        if (register_netdev(ndev) ||
                (c4_init(ci, (u_char *) f0, (u_char *) f1) != SBE_DRVR_SUCCESS)) {
-               OS_kfree(netdev_priv(ndev));
-               OS_kfree(ndev);
+               kfree(netdev_priv(ndev));
+               kfree(ndev);
                error_flag = -ENODEV;
                return NULL;
        }
@@ -998,8 +997,8 @@ c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
                pr_warning("%s: MUSYCC could not get irq: %d\n",
                           ndev->name, irq0);
                unregister_netdev(ndev);
-               OS_kfree(netdev_priv(ndev));
-               OS_kfree(ndev);
+               kfree(netdev_priv(ndev));
+               kfree(ndev);
                error_flag = -EIO;
                return NULL;
        }
@@ -1008,8 +1007,8 @@ c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
                pr_warning("%s: EBUS could not get irq: %d\n", hi->devname, irq1);
                unregister_netdev(ndev);
                free_irq(irq0, ndev);
-               OS_kfree(netdev_priv(ndev));
-               OS_kfree(ndev);
+               kfree(netdev_priv(ndev));
+               kfree(ndev);
                error_flag = -EIO;
                return NULL;
        }
@@ -1068,8 +1067,8 @@ c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
                unregister_netdev(ndev);
                free_irq(irq1, ndev);
                free_irq(irq0, ndev);
-               OS_kfree(netdev_priv(ndev));
-               OS_kfree(ndev);
+               kfree(netdev_priv(ndev));
+               kfree(ndev);
                /* failure, error_flag is set */
                return NULL;
        }
index 7b4f6f2108e3b9015a9c8b2de81c5998c06a6216..872cdae02704302fa157d428f59d510aa651b31f 100644 (file)
@@ -744,7 +744,8 @@ musycc_init(ci_t *ci)
 
 #define INT_QUEUE_BOUNDARY  4
 
-    regaddr = OS_kmalloc((INT_QUEUE_SIZE + 1) * sizeof(u_int32_t));
+       regaddr = kzalloc((INT_QUEUE_SIZE + 1) * sizeof(u_int32_t),
+                         GFP_KERNEL | GFP_DMA);
     if (!regaddr)
        return -ENOMEM;
     ci->iqd_p_saved = regaddr;      /* save orig value for free's usage */
@@ -765,11 +766,12 @@ musycc_init(ci_t *ci)
 
 #define GROUP_BOUNDARY   0x800
 
-       regaddr = OS_kmalloc(sizeof(struct musycc_groupr) + GROUP_BOUNDARY);
+       regaddr = kzalloc(sizeof(struct musycc_groupr) + GROUP_BOUNDARY,
+                         GFP_KERNEL | GFP_DMA);
        if (!regaddr) {
            for (gchan = 0; gchan < i; gchan++) {
                pi = &ci->port[gchan];
-               OS_kfree(pi->reg);
+               kfree(pi->reg);
                pi->reg = NULL;
            }
            return -ENOMEM;
@@ -1576,10 +1578,10 @@ musycc_chan_down(ci_t *dummy, int channum)
        if (ch->mdr[i].mem_token)
            OS_mem_token_free(ch->mdr[i].mem_token);
 
-    OS_kfree(ch->mdr);
+    kfree(ch->mdr);
     ch->mdr = NULL;
     ch->rxd_num = 0;
-    OS_kfree(ch->mdt);
+    kfree(ch->mdt);
     ch->mdt = NULL;
     ch->txd_num = 0;
 
index 78cc1709ebdb62549bb9658a580905ce6659e67e..ba588f1b211062f996fefe564efa295f9088faa1 100644 (file)
@@ -28,6 +28,7 @@
 #include "sbecom_inline_linux.h"
 #include "pmcc4.h"
 #include "sbe_promformat.h"
+#include "pmc93x6_eeprom.h"
 
 #ifndef TRUE
 #define TRUE   1
  *      using.
  */
 
-#define EE_MFG      (long)0     /* Index to manufacturing record */
-#define EE_FIRST    0x28        /* Index to start testing at */
-#define EE_LIMIT    128         /* Index to end testing at */
-
+#define EE_MFG      (long)0    /* Index to manufacturing record */
+#define EE_FIRST    0x28       /* Index to start testing at */
+#define EE_LIMIT    128                /* Index to end testing at */
 
 /*  Bit Ordering for Instructions
-**
-**  A0, A1, A2, A3, A4, A5, A6, OP0, OP1, SB   (lsb, or 1st bit out)
-**
-*/
-
-#define EPROM_EWEN      0x0019  /* Erase/Write enable (reversed) */
-#define EPROM_EWDS      0x0001  /* Erase/Write disable (reversed) */
-#define EPROM_READ      0x0003  /* Read (reversed) */
-#define EPROM_WRITE     0x0005  /* Write (reversed) */
-#define EPROM_ERASE     0x0007  /* Erase (reversed) */
-#define EPROM_ERAL      0x0009  /* Erase All (reversed) */
-#define EPROM_WRAL      0x0011  /* Write All (reversed) */
-
-#define EPROM_ADR_SZ    7       /* Number of bits in offset address */
-#define EPROM_OP_SZ     3       /* Number of bits in command */
-#define SIZE_ADDR_OP    (EPROM_ADR_SZ + EPROM_OP_SZ)
-#define LC46A_MAX_OPS   10      /* Number of bits in Instruction */
-#define NUM_OF_BITS     8       /* Number of bits in data */
+ *
+ *  A0, A1, A2, A3, A4, A5, A6, OP0, OP1, SB   (lsb, or 1st bit out)
+ *
+ */
 
+#define EPROM_EWEN      0x0019 /* Erase/Write enable (reversed) */
+#define EPROM_EWDS      0x0001 /* Erase/Write disable (reversed) */
+#define EPROM_READ      0x0003 /* Read (reversed) */
+#define EPROM_WRITE     0x0005 /* Write (reversed) */
+#define EPROM_ERASE     0x0007 /* Erase (reversed) */
+#define EPROM_ERAL      0x0009 /* Erase All (reversed) */
+#define EPROM_WRAL      0x0011 /* Write All (reversed) */
 
-/* EEPROM signal bits */
-#define EPROM_ACTIVE_OUT_BIT    0x0001  /* Out data bit */
-#define EPROM_ACTIVE_IN_BIT     0x0002  /* In data bit */
-#define ACTIVE_IN_BIT_SHIFT     0x0001  /* Shift In data bit to LSB */
-#define EPROM_ENCS              0x0004  /* Set EEPROM CS during operation */
+#define EPROM_ADR_SZ    7      /* Number of bits in offset address */
+#define EPROM_OP_SZ     3      /* Number of bits in command */
+#define SIZE_ADDR_OP    (EPROM_ADR_SZ + EPROM_OP_SZ)
+#define LC46A_MAX_OPS   10     /* Number of bits in Instruction */
+#define NUM_OF_BITS     8      /* Number of bits in data */
 
+/* EEPROM signal bits */
+#define EPROM_ACTIVE_OUT_BIT    0x0001 /* Out data bit */
+#define EPROM_ACTIVE_IN_BIT     0x0002 /* In data bit */
+#define ACTIVE_IN_BIT_SHIFT     0x0001 /* Shift In data bit to LSB */
+#define EPROM_ENCS              0x0004 /* Set EEPROM CS during operation */
 
 /*------------------------------------------------------------------------
  *      The ByteReverse table is used to reverses the 8 bits within a byte
  */
 
 static unsigned char ByteReverse[256];
-static int  ByteReverseBuilt = FALSE;
-
+static int ByteReverseBuilt = FALSE;
 
 /*------------------------------------------------------------------------
  *      mfg_template - initial serial EEPROM data structure
  *------------------------------------------------------------------------
  */
 
-static u8 mfg_template[sizeof(FLD_TYPE2)] =
-{
-    PROM_FORMAT_TYPE2,          /* type; */
-    0x00, 0x1A,                 /* length[2]; */
-    0x00, 0x00, 0x00, 0x00,     /* Crc32[4]; */
-    0x11, 0x76,                 /* Id[2]; */
-    0x07, 0x05,                 /* SubId[2] E1; */
-    0x00, 0xA0, 0xD6, 0x00, 0x00, 0x00, /* Serial[6]; */
-    0x00, 0x00, 0x00, 0x00,     /* CreateTime[4]; */
-    0x00, 0x00, 0x00, 0x00,     /* HeatRunTime[4]; */
-    0x00, 0x00, 0x00, 0x00,     /* HeatRunIterations[4]; */
-    0x00, 0x00, 0x00, 0x00,     /* HeatRunErrors[4]; */
+static u8 mfg_template[sizeof(FLD_TYPE2)] = {
+       PROM_FORMAT_TYPE2,      /* type; */
+       0x00, 0x1A,             /* length[2]; */
+       0x00, 0x00, 0x00, 0x00, /* Crc32[4]; */
+       0x11, 0x76,             /* Id[2]; */
+       0x07, 0x05,             /* SubId[2] E1; */
+       0x00, 0xA0, 0xD6, 0x00, 0x00, 0x00,     /* Serial[6]; */
+       0x00, 0x00, 0x00, 0x00, /* CreateTime[4]; */
+       0x00, 0x00, 0x00, 0x00, /* HeatRunTime[4]; */
+       0x00, 0x00, 0x00, 0x00, /* HeatRunIterations[4]; */
+       0x00, 0x00, 0x00, 0x00, /* HeatRunErrors[4]; */
 };
 
-
 /*------------------------------------------------------------------------
  *      BuildByteReverse - build the 8-bit reverse table
  *------------------------------------------------------------------------
@@ -113,39 +108,35 @@ static u8 mfg_template[sizeof(FLD_TYPE2)] =
  *      (the MSB becomes the LSB etc.).
  */
 
-static void
-BuildByteReverse (void)
+static void BuildByteReverse(void)
 {
-    long        half;           /* Used to build by powers to 2 */
-    int         i;
+       /* Used to build by powers to 2 */
+       long half;
+       int i;
 
-    ByteReverse[0] = 0;
+       ByteReverse[0] = 0;
 
-    for (half = 1; half < sizeof (ByteReverse); half <<= 1)
-        for (i = 0; i < half; i++)
-            ByteReverse[half + i] = (char) (ByteReverse[i] | (0x80 / half));
+       for (half = 1; half < sizeof(ByteReverse); half <<= 1)
+               for (i = 0; i < half; i++)
+                       ByteReverse[half + i] =
+                           (char)(ByteReverse[i] | (0x80 / half));
 
-    ByteReverseBuilt = TRUE;
+       ByteReverseBuilt = TRUE;
 }
 
-
 /*------------------------------------------------------------------------
  *      eeprom_delay - small delay for EEPROM timing
  *------------------------------------------------------------------------
  */
 
-static void
-eeprom_delay (void)
+static void eeprom_delay(void)
 {
-    int         timeout;
+       int timeout;
 
-    for (timeout = 20; timeout; --timeout)
-    {
-        OS_uwait_dummy ();
-    }
+       for (timeout = 20; timeout; --timeout)
+               OS_uwait_dummy();
 }
 
-
 /*------------------------------------------------------------------------
  *      eeprom_put_byte - Send a byte to the EEPROM serially
  *------------------------------------------------------------------------
@@ -154,23 +145,23 @@ eeprom_delay (void)
  *      the data to the EEPROM.
  */
 
-void
-eeprom_put_byte (long addr, long data, int count)
+static void eeprom_put_byte(long addr, long data, int count)
 {
-    u_int32_t output;
-
-    while (--count >= 0)
-    {
-        output = (data & EPROM_ACTIVE_OUT_BIT) ? 1 : 0; /* Get next data bit */
-        output |= EPROM_ENCS;       /* Add Chip Select */
-        data >>= 1;
-
-        eeprom_delay ();
-        pci_write_32 ((u_int32_t *) addr, output);      /* Output it */
-    }
+       u_int32_t output;
+
+       while (--count >= 0) {
+               /* Get next data bit */
+               output = (data & EPROM_ACTIVE_OUT_BIT) ? 1 : 0;
+               /* Add Chip Select */
+               output |= EPROM_ENCS;
+               data >>= 1;
+
+               eeprom_delay();
+               /* Output it */
+               pci_write_32((u_int32_t *) addr, output);
+       }
 }
 
-
 /*------------------------------------------------------------------------
  *      eeprom_get_byte - Receive a byte from the EEPROM serially
  *------------------------------------------------------------------------
@@ -179,37 +170,35 @@ eeprom_put_byte (long addr, long data, int count)
  *      from the  EEPROM.
  */
 
-u_int32_t
-eeprom_get_byte (long addr)
+static u_int32_t eeprom_get_byte(long addr)
 {
-    u_int32_t   input;
-    u_int32_t   data;
-    int         count;
+       u_int32_t input;
+       u_int32_t data;
+       int count;
 
 /*  Start the Reading of DATA
-**
-**  The first read is a dummy as the data is latched in the
-**  EPLD and read on the next read access to the EEPROM.
-*/
+ *
+ *  The first read is a dummy as the data is latched in the
+ *  EPLD and read on the next read access to the EEPROM.
+ */
 
-    input = pci_read_32 ((u_int32_t *) addr);
+       input = pci_read_32((u_int32_t *) addr);
 
-    data = 0;
-    count = NUM_OF_BITS;
-    while (--count >= 0)
-    {
-        eeprom_delay ();
-        input = pci_read_32 ((u_int32_t *) addr);
+       data = 0;
+       count = NUM_OF_BITS;
+       while (--count >= 0) {
+               eeprom_delay();
+               input = pci_read_32((u_int32_t *) addr);
 
-        data <<= 1;                 /* Shift data over */
-        data |= (input & EPROM_ACTIVE_IN_BIT) ? 1 : 0;
+               /* Shift data over */
+               data <<= 1;
+               data |= (input & EPROM_ACTIVE_IN_BIT) ? 1 : 0;
 
-    }
+       }
 
-    return data;
+       return data;
 }
 
-
 /*------------------------------------------------------------------------
  *      disable_pmc_eeprom - Disable writes to the EEPROM
  *------------------------------------------------------------------------
@@ -217,16 +206,14 @@ eeprom_get_byte (long addr)
  *      Issue the EEPROM command to disable writes.
  */
 
-static void
-disable_pmc_eeprom (long addr)
+static void disable_pmc_eeprom(long addr)
 {
-    eeprom_put_byte (addr, EPROM_EWDS, SIZE_ADDR_OP);
+       eeprom_put_byte(addr, EPROM_EWDS, SIZE_ADDR_OP);
 
-    pci_write_32 ((u_int32_t *) addr, 0);       /* this removes Chip Select
-                                                 * from EEPROM */
+       /* this removes Chip Select from EEPROM */
+       pci_write_32((u_int32_t *) addr, 0);
 }
 
-
 /*------------------------------------------------------------------------
  *      enable_pmc_eeprom - Enable writes to the EEPROM
  *------------------------------------------------------------------------
@@ -234,16 +221,14 @@ disable_pmc_eeprom (long addr)
  *      Issue the EEPROM command to enable writes.
  */
 
-static void
-enable_pmc_eeprom (long addr)
+static void enable_pmc_eeprom(long addr)
 {
-    eeprom_put_byte (addr, EPROM_EWEN, SIZE_ADDR_OP);
+       eeprom_put_byte(addr, EPROM_EWEN, SIZE_ADDR_OP);
 
-    pci_write_32 ((u_int32_t *) addr, 0);       /* this removes Chip Select
-                                                 * from EEPROM */
+       /* this removes Chip Select from EEPROM */
+       pci_write_32((u_int32_t *) addr, 0);
 }
 
-
 /*------------------------------------------------------------------------
  *      pmc_eeprom_read - EEPROM location read
  *------------------------------------------------------------------------
@@ -252,34 +237,40 @@ enable_pmc_eeprom (long addr)
  *      the contents of the specified location to the calling routine.
  */
 
-u_int32_t
-pmc_eeprom_read (long addr, long mem_offset)
+static u_int32_t pmc_eeprom_read(long addr, long mem_offset)
 {
-    u_int32_t   data;           /* Data from chip */
+       /* Data from chip */
+       u_int32_t data;
 
-    if (!ByteReverseBuilt)
-        BuildByteReverse ();
+       if (!ByteReverseBuilt)
+               BuildByteReverse();
 
-    mem_offset = ByteReverse[0x7F & mem_offset];        /* Reverse address */
-    /*
-     * NOTE: The max offset address is 128 or half the reversal table. So the
-     * LSB is always zero and counts as a built in shift of one bit.  So even
-     * though we need to shift 3 bits to make room for the command, we only
-     * need to shift twice more because of the built in shift.
-     */
-    mem_offset <<= 2;               /* Shift for command */
-    mem_offset |= EPROM_READ;       /* Add command */
+       /* Reverse address */
+       mem_offset = ByteReverse[0x7F & mem_offset];
 
-    eeprom_put_byte (addr, mem_offset, SIZE_ADDR_OP);   /* Output chip address */
+       /*
+        * NOTE: The max offset address is 128 or half the reversal table. So
+        * the LSB is always zero and counts as a built in shift of one bit.
+        * So even though we need to shift 3 bits to make room for the command,
+        * we only need to shift twice more because of the built in shift.
+        */
 
-    data = eeprom_get_byte (addr);  /* Read chip data */
+       /* Shift for command */
+       mem_offset <<= 2;
+       /* Add command */
+       mem_offset |= EPROM_READ;
 
-    pci_write_32 ((u_int32_t *) addr, 0);       /* Remove Chip Select from
-                                                 * EEPROM */
+       /* Output chip address */
+       eeprom_put_byte(addr, mem_offset, SIZE_ADDR_OP);
 
-    return (data & 0x000000FF);
-}
+       /* Read chip data */
+       data = eeprom_get_byte(addr);
+
+       /* Remove Chip Select from EEPROM */
+       pci_write_32((u_int32_t *) addr, 0);
 
+       return (data & 0x000000FF);
+}
 
 /*------------------------------------------------------------------------
  *      pmc_eeprom_write - EEPROM location write
@@ -292,189 +283,181 @@ pmc_eeprom_read (long addr, long mem_offset)
  *      operation succeeded.
  */
 
-int
-pmc_eeprom_write (long addr, long mem_offset, u_int32_t data)
+static int pmc_eeprom_write(long addr, long mem_offset, u_int32_t data)
 {
-    volatile u_int32_t temp;
-    int         count;
+       u_int32_t temp;
+       int count;
+
+       if (!ByteReverseBuilt)
+               BuildByteReverse();
+
+       /* Reverse address */
+       mem_offset = ByteReverse[0x7F & mem_offset];
 
-    if (!ByteReverseBuilt)
-        BuildByteReverse ();
+       /*
+        * NOTE: The max offset address is 128 or half the reversal table. So
+        * the LSB is always zero and counts as a built in shift of one bit.
+        * So even though we need to shift 3 bits to make room for the command,
+        * we only need to shift twice more because of the built in shift.
+        */
 
-    mem_offset = ByteReverse[0x7F & mem_offset];        /* Reverse address */
-    /*
-     * NOTE: The max offset address is 128 or half the reversal table. So the
-     * LSB is always zero and counts as a built in shift of one bit.  So even
-     * though we need to shift 3 bits to make room for the command, we only
-     * need to shift twice more because of the built in shift.
-     */
-    mem_offset <<= 2;               /* Shift for command */
-    mem_offset |= EPROM_WRITE;      /* Add command */
+       /* Shift for command */
+       mem_offset <<= 2;
+       /* Add command */
+       mem_offset |= EPROM_WRITE;
 
-    eeprom_put_byte (addr, mem_offset, SIZE_ADDR_OP);   /* Output chip address */
+       /* Output chip address */
+       eeprom_put_byte(addr, mem_offset, SIZE_ADDR_OP);
 
-    data = ByteReverse[0xFF & data];/* Reverse data */
-    eeprom_put_byte (addr, data, NUM_OF_BITS);  /* Output chip data */
+       /* Reverse data */
+       data = ByteReverse[0xFF & data];
+       /* Output chip data */
+       eeprom_put_byte(addr, data, NUM_OF_BITS);
 
-    pci_write_32 ((u_int32_t *) addr, 0);       /* Remove Chip Select from
-                                                 * EEPROM */
+       /* Remove Chip Select from EEPROM */
+       pci_write_32((u_int32_t *) addr, 0);
 
 /*
-**  Must see Data In at a low state before completing this transaction.
-**
-**  Afterwards, the data bit will return to a high state, ~6 ms, terminating
-**  the operation.
-*/
-    pci_write_32 ((u_int32_t *) addr, EPROM_ENCS);      /* Re-enable Chip Select */
-    temp = pci_read_32 ((u_int32_t *) addr);    /* discard first read */
-    temp = pci_read_32 ((u_int32_t *) addr);
-    if (temp & EPROM_ACTIVE_IN_BIT)
-    {
-        temp = pci_read_32 ((u_int32_t *) addr);
-        if (temp & EPROM_ACTIVE_IN_BIT)
-        {
-            pci_write_32 ((u_int32_t *) addr, 0);       /* Remove Chip Select
-                                                         * from EEPROM */
-            return (1);
-        }
-    }
-    count = 1000;
-    while (count--)
-    {
-        for (temp = 0; temp < 0x10; temp++)
-            OS_uwait_dummy ();
-
-        if (pci_read_32 ((u_int32_t *) addr) & EPROM_ACTIVE_IN_BIT)
-            break;
-    }
-
-    if (count == -1)
-        return (2);
-
-    return (0);
+ *  Must see Data In at a low state before completing this transaction.
+ *
+ *  Afterwards, the data bit will return to a high state, ~6 ms, terminating
+ *  the operation.
+ */
+       /* Re-enable Chip Select */
+       pci_write_32((u_int32_t *) addr, EPROM_ENCS);
+       /* discard first read */
+       temp = pci_read_32((u_int32_t *) addr);
+       temp = pci_read_32((u_int32_t *) addr);
+       if (temp & EPROM_ACTIVE_IN_BIT) {
+               temp = pci_read_32((u_int32_t *) addr);
+               if (temp & EPROM_ACTIVE_IN_BIT) {
+                       /* Remove Chip Select from EEPROM */
+                       pci_write_32((u_int32_t *) addr, 0);
+                       return 1;
+               }
+       }
+       count = 1000;
+       while (count--) {
+               for (temp = 0; temp < 0x10; temp++)
+                       OS_uwait_dummy();
+
+               if (pci_read_32((u_int32_t *) addr) & EPROM_ACTIVE_IN_BIT)
+                       break;
+       }
+
+       if (count == -1)
+               return 2;
+
+       return 0;
 }
 
-
 /*------------------------------------------------------------------------
  *      pmcGetBuffValue - read the specified value from buffer
  *------------------------------------------------------------------------
  */
 
-long
-pmcGetBuffValue (char *ptr, int size)
+static long pmcGetBuffValue(char *ptr, int size)
 {
-    long        value = 0;
-    int         index;
+       long value = 0;
+       int index;
 
-    for (index = 0; index < size; ++index)
-    {
-        value <<= 8;
-        value |= ptr[index] & 0xFF;
-    }
+       for (index = 0; index < size; ++index) {
+               value <<= 8;
+               value |= ptr[index] & 0xFF;
+       }
 
-    return value;
+       return value;
 }
 
-
 /*------------------------------------------------------------------------
  *      pmcSetBuffValue - save the specified value to buffer
  *------------------------------------------------------------------------
  */
 
-void
-pmcSetBuffValue (char *ptr, long value, int size)
+static void pmcSetBuffValue(char *ptr, long value, int size)
 {
-    int         index = size;
+       int index = size;
 
-    while (--index >= 0)
-    {
-        ptr[index] = (char) (value & 0xFF);
-        value >>= 8;
-    }
+       while (--index >= 0) {
+               ptr[index] = (char)(value & 0xFF);
+               value >>= 8;
+       }
 }
 
-
 /*------------------------------------------------------------------------
  *      pmc_eeprom_read_buffer - read EEPROM data into specified buffer
  *------------------------------------------------------------------------
  */
 
 void
-pmc_eeprom_read_buffer (long addr, long mem_offset, char *dest_ptr, int size)
+pmc_eeprom_read_buffer(long addr, long mem_offset, char *dest_ptr, int size)
 {
-    while (--size >= 0)
-        *dest_ptr++ = (char) pmc_eeprom_read (addr, mem_offset++);
+       while (--size >= 0)
+               *dest_ptr++ = (char)pmc_eeprom_read(addr, mem_offset++);
 }
 
-
 /*------------------------------------------------------------------------
  *      pmc_eeprom_write_buffer - write EEPROM data from specified buffer
  *------------------------------------------------------------------------
  */
 
 void
-pmc_eeprom_write_buffer (long addr, long mem_offset, char *dest_ptr, int size)
+pmc_eeprom_write_buffer(long addr, long mem_offset, char *dest_ptr, int size)
 {
-    enable_pmc_eeprom (addr);
+       enable_pmc_eeprom(addr);
 
-    while (--size >= 0)
-        pmc_eeprom_write (addr, mem_offset++, *dest_ptr++);
+       while (--size >= 0)
+               pmc_eeprom_write(addr, mem_offset++, *dest_ptr++);
 
-    disable_pmc_eeprom (addr);
+       disable_pmc_eeprom(addr);
 }
 
-
 /*------------------------------------------------------------------------
  *      pmcCalcCrc - calculate the CRC for the serial EEPROM structure
  *------------------------------------------------------------------------
  */
 
-u_int32_t
-pmcCalcCrc_T01 (void *bufp)
+static u_int32_t pmcCalcCrc_T01(void *bufp)
 {
-    FLD_TYPE2  *buf = bufp;
-    u_int32_t   crc;            /* CRC of the structure */
+       FLD_TYPE2 *buf = bufp;
+       /* CRC of the structure */
+       u_int32_t crc;
 
-    /* Calc CRC for type and length fields */
-    sbeCrc (
-            (u_int8_t *) &buf->type,
-            (u_int32_t) STRUCT_OFFSET (FLD_TYPE1, Crc32),
-            (u_int32_t) 0,
-            (u_int32_t *) &crc);
+       /* Calc CRC for type and length fields */
+       sbeCrc((u_int8_t *) &buf->type,
+              (u_int32_t) STRUCT_OFFSET(FLD_TYPE1, Crc32),
+              (u_int32_t) 0, (u_int32_t *) &crc);
 
 #ifdef EEPROM_TYPE_DEBUG
-    pr_info("sbeCrc: crc 1 calculated as %08x\n", crc); /* RLD DEBUG */
+       /* RLD DEBUG */
+       pr_info("sbeCrc: crc 1 calculated as %08x\n", crc);
 #endif
-    return ~crc;
+       return ~crc;
 }
 
-u_int32_t
-pmcCalcCrc_T02 (void *bufp)
+static u_int32_t pmcCalcCrc_T02(void *bufp)
 {
-    FLD_TYPE2  *buf = bufp;
-    u_int32_t   crc;            /* CRC of the structure */
-
-    /* Calc CRC for type and length fields */
-    sbeCrc (
-            (u_int8_t *) &buf->type,
-            (u_int32_t) STRUCT_OFFSET (FLD_TYPE2, Crc32),
-            (u_int32_t) 0,
-            (u_int32_t *) &crc);
-
-    /* Calc CRC for remaining fields */
-    sbeCrc (
-            (u_int8_t *) &buf->Id[0],
-            (u_int32_t) (sizeof (FLD_TYPE2) - STRUCT_OFFSET (FLD_TYPE2, Id)),
-            (u_int32_t) crc,
-            (u_int32_t *) &crc);
+       FLD_TYPE2 *buf = bufp;
+       /* CRC of the structure */
+       u_int32_t crc;
+
+       /* Calc CRC for type and length fields */
+       sbeCrc((u_int8_t *) &buf->type,
+              (u_int32_t) STRUCT_OFFSET(FLD_TYPE2, Crc32),
+              (u_int32_t) 0, (u_int32_t *) &crc);
+
+       /* Calc CRC for remaining fields */
+       sbeCrc((u_int8_t *) &buf->Id[0],
+              (u_int32_t) (sizeof(FLD_TYPE2) - STRUCT_OFFSET(FLD_TYPE2, Id)),
+              (u_int32_t) crc, (u_int32_t *) &crc);
 
 #ifdef EEPROM_TYPE_DEBUG
-    pr_info("sbeCrc: crc 2 calculated as %08x\n", crc); /* RLD DEBUG */
+       /* RLD DEBUG */
+       pr_info("sbeCrc: crc 2 calculated as %08x\n", crc);
 #endif
-    return crc;
+       return crc;
 }
 
-
 /*------------------------------------------------------------------------
  *      pmc_init_seeprom - initialize the serial EEPROM structure
  *------------------------------------------------------------------------
@@ -485,64 +468,65 @@ pmcCalcCrc_T02 (void *bufp)
  *      serial number field.
  */
 
-void
-pmc_init_seeprom (u_int32_t addr, u_int32_t serialNum)
+void pmc_init_seeprom(u_int32_t addr, u_int32_t serialNum)
 {
-    PROMFORMAT  buffer;         /* Memory image of structure */
-    u_int32_t   crc;            /* CRC of structure */
-    time_t      createTime;
+       /* Memory image of structure */
+       PROMFORMAT buffer;
+       /* CRC of structure */
+       u_int32_t crc;
+       time_t createTime;
 
-    createTime = get_seconds ();
+       createTime = get_seconds();
 
-    /* use template data */
-    memcpy(&buffer.fldType2, mfg_template, sizeof(buffer.fldType2));
+       /* use template data */
+       memcpy(&buffer.fldType2, mfg_template, sizeof(buffer.fldType2));
 
-    /* Update serial number field in buffer */
-    pmcSetBuffValue (&buffer.fldType2.Serial[3], serialNum, 3);
+       /* Update serial number field in buffer */
+       pmcSetBuffValue(&buffer.fldType2.Serial[3], serialNum, 3);
 
-    /* Update create time field in buffer */
-    pmcSetBuffValue (&buffer.fldType2.CreateTime[0], createTime, 4);
+       /* Update create time field in buffer */
+       pmcSetBuffValue(&buffer.fldType2.CreateTime[0], createTime, 4);
 
-    /* Update CRC field in buffer */
-    crc = pmcCalcCrc_T02 (&buffer);
-    pmcSetBuffValue (&buffer.fldType2.Crc32[0], crc, 4);
+       /* Update CRC field in buffer */
+       crc = pmcCalcCrc_T02(&buffer);
+       pmcSetBuffValue(&buffer.fldType2.Crc32[0], crc, 4);
 
 #ifdef DEBUG
-    for (i = 0; i < sizeof (FLD_TYPE2); ++i)
-        pr_info("[%02X] = %02X\n", i, buffer.bytes[i] & 0xFF);
+       for (i = 0; i < sizeof(FLD_TYPE2); ++i)
+               pr_info("[%02X] = %02X\n", i, buffer.bytes[i] & 0xFF);
 #endif
 
-    /* Write structure to serial EEPROM */
-    pmc_eeprom_write_buffer (addr, EE_MFG, (char *) &buffer, sizeof (FLD_TYPE2));
+       /* Write structure to serial EEPROM */
+       pmc_eeprom_write_buffer(addr, EE_MFG, (char *)&buffer,
+                               sizeof(FLD_TYPE2));
 }
 
-
-char
-pmc_verify_cksum (void *bufp)
+char pmc_verify_cksum(void *bufp)
 {
-    FLD_TYPE1  *buf1 = bufp;
-    FLD_TYPE2  *buf2 = bufp;
-    u_int32_t   crc1, crc2;     /* CRC read from EEPROM */
+       FLD_TYPE1 *buf1 = bufp;
+       FLD_TYPE2 *buf2 = bufp;
+       /* CRC read from EEPROM */
+       u_int32_t crc1, crc2;
 
-    /* Retrieve contents of CRC field */
-    crc1 = pmcGetBuffValue (&buf1->Crc32[0], sizeof (buf1->Crc32));
+       /* Retrieve contents of CRC field */
+       crc1 = pmcGetBuffValue(&buf1->Crc32[0], sizeof(buf1->Crc32));
 #ifdef EEPROM_TYPE_DEBUG
-    pr_info("EEPROM: chksum 1 reads   as %08x\n", crc1);        /* RLD DEBUG */
+       /* RLD DEBUG */
+       pr_info("EEPROM: chksum 1 reads   as %08x\n", crc1);
 #endif
-    if ((buf1->type == PROM_FORMAT_TYPE1) &&
-        (pmcCalcCrc_T01 ((void *) buf1) == crc1))
-        return PROM_FORMAT_TYPE1;   /* checksum type 1 verified */
+       if ((buf1->type == PROM_FORMAT_TYPE1) &&
+           (pmcCalcCrc_T01((void *)buf1) == crc1))
+               return PROM_FORMAT_TYPE1;       /* checksum type 1 verified */
 
-    crc2 = pmcGetBuffValue (&buf2->Crc32[0], sizeof (buf2->Crc32));
+       crc2 = pmcGetBuffValue(&buf2->Crc32[0], sizeof(buf2->Crc32));
 #ifdef EEPROM_TYPE_DEBUG
-    pr_info("EEPROM: chksum 2 reads   as %08x\n", crc2);        /* RLD DEBUG */
+       /* RLD DEBUG */
+       pr_info("EEPROM: chksum 2 reads   as %08x\n", crc2);
 #endif
-    if ((buf2->type == PROM_FORMAT_TYPE2) &&
-        (pmcCalcCrc_T02 ((void *) buf2) == crc2))
-        return PROM_FORMAT_TYPE2;   /* checksum type 2 verified */
+       if ((buf2->type == PROM_FORMAT_TYPE2) &&
+           (pmcCalcCrc_T02((void *)buf2) == crc2))
+               return PROM_FORMAT_TYPE2;       /* checksum type 2 verified */
 
-    return PROM_FORMAT_Unk;         /* failed to validate */
+       /* failed to validate */
+       return PROM_FORMAT_Unk;
 }
-
-
-/*** End-of-File ***/
index 621a72926475677d5a9158bcba8fa44a29628cde..76bebdd18b3aa9bd717a88cb81b60671c846c5ac 100644 (file)
@@ -122,35 +122,6 @@ c4_find_chan (int channum)
     return NULL;
 }
 
-
-ci_t       *__init
-c4_new (void *hi)
-{
-    ci_t       *ci;
-
-#ifdef SBE_MAP_DEBUG
-    pr_warning("c4_new() entered, ci needs %u.\n",
-               (unsigned int) sizeof (ci_t));
-#endif
-
-    ci = (ci_t *) OS_kmalloc (sizeof (ci_t));
-    if (ci)
-    {
-        ci->hdw_info = hi;
-        ci->state = C_INIT;         /* mark as hardware not available */
-        ci->next = c4_list;
-        c4_list = ci;
-        ci->brdno = ci->next ? ci->next->brdno + 1 : 0;
-    } else
-        pr_warning("failed CI malloc, size %u.\n",
-                   (unsigned int) sizeof (ci_t));
-
-    if (!CI)
-        CI = ci;                    /* DEBUG, only board 0 usage */
-    return ci;
-}
-
-
 /***
  * Check port state and set LED states using watchdog or ioctl...
  * also check for in-band SF loopback commands (& cause results if they are there)
@@ -485,12 +456,12 @@ c4_cleanup (void)
             for (j = 0; j < MUSYCC_NCHANS; j++)
             {
                 if (pi->chan[j])
-                    OS_kfree (pi->chan[j]);     /* free mch_t struct */
+                    kfree(pi->chan[j]);     /* free mch_t struct */
             }
-            OS_kfree (pi->regram_saved);
+            kfree(pi->regram_saved);
         }
-        OS_kfree (ci->iqd_p_saved);
-        OS_kfree (ci);
+        kfree(ci->iqd_p_saved);
+        kfree(ci);
         ci = next;                  /* cleanup next board, if any */
     }
 }
@@ -619,7 +590,7 @@ c4_init (ci_t *ci, u_char *func0, u_char *func1)
         /* allocate channel structures for this port */
         for (j = 0; j < MUSYCC_NCHANS; j++)
         {
-            ch = OS_kmalloc (sizeof (mch_t));
+               ch = kzalloc(sizeof(mch_t), GFP_KERNEL | GFP_DMA);
             if (ch)
             {
                 pi->chan[j] = ch;
@@ -1368,8 +1339,8 @@ c4_chan_up (ci_t *ci, int channum)
     ch->txd_num = txnum;
     ch->rxix_irq_srv = 0;
 
-    ch->mdr = OS_kmalloc (sizeof (struct mdesc) * rxnum);
-    ch->mdt = OS_kmalloc (sizeof (struct mdesc) * txnum);
+       ch->mdr = kzalloc(sizeof(struct mdesc) * rxnum, GFP_KERNEL | GFP_DMA);
+       ch->mdt = kzalloc(sizeof(struct mdesc) * txnum, GFP_KERNEL | GFP_DMA);
     if (ch->p.chan_mode == CFG_CH_PROTO_TRANS)
                tmp = __constant_cpu_to_le32 (cxt1e1_max_mru | EOBIRQ_ENABLE);
     else
@@ -1462,10 +1433,10 @@ errfree:
         i--;
         OS_mem_token_free (ch->mdr[i].mem_token);
     }
-    OS_kfree (ch->mdt);
+    kfree(ch->mdt);
     ch->mdt = NULL;
     ch->txd_num = 0;
-    OS_kfree (ch->mdr);
+    kfree(ch->mdr);
     ch->mdr = NULL;
     ch->rxd_num = 0;
     ch->state = DOWN;
index eb28f095ff8c29c840d149165687b5e5037c0872..451f12f5b04c828d51e95680e95732366af0d1b3 100644 (file)
@@ -262,7 +262,7 @@ struct s_hdw_info
     struct pci_dev *pdev[2];
 
     unsigned long addr[2];
-    unsigned long addr_mapped[2];
+    void __iomem *addr_mapped[2];
     unsigned long len[2];
 
     union
index ba3ff3efe0634356cb7488aa61f168ac798a0223..f5835c29ef324783dc3e16a72f283d9d0239ff84 100644 (file)
@@ -39,27 +39,6 @@ void        pci_write_32 (u_int32_t *p, u_int32_t v);
  * system dependent callbacks
  */
 
-/**********/
-/* malloc */
-/**********/
-
-static inline void *
-OS_kmalloc (size_t size)
-{
-    char       *ptr = kmalloc (size, GFP_KERNEL | GFP_DMA);
-
-    if (ptr)
-        memset (ptr, 0, size);
-    return ptr;
-}
-
-static inline void
-OS_kfree (void *x)
-{
-    kfree (x);
-}
-
-
 /****************/
 /* memory token */
 /****************/
@@ -197,7 +176,7 @@ static inline int
 OS_free_watchdog (struct watchdog *wd)
 {
     OS_stop_watchdog (wd);
-    OS_kfree (wd);
+    kfree(wd);
     return 0;
 }
 
index 81fa8a3a462cc6e216b052b455791dcc7b544207..a51780f60484608569ebe6b7e2a53b7a8765a6a9 100644 (file)
@@ -101,7 +101,8 @@ sbeCrc(u_int8_t *buffer,          /* data buffer to crc */
                tbl = &CRCTable;
                genCrcTable(tbl);
 #else
-               tbl = (u_int32_t *) OS_kmalloc(CRC_TABLE_ENTRIES * sizeof(u_int32_t));
+               tbl = kzalloc(CRC_TABLE_ENTRIES * sizeof(u_int32_t),
+                             GFP_KERNEL);
                if (!tbl) {
                        *result = 0;   /* dummy up return value due to malloc
                                        * failure */
@@ -125,7 +126,7 @@ sbeCrc(u_int8_t *buffer,          /* data buffer to crc */
 
 #ifndef STATIC_CRC_TABLE
        crcTableInit = 0;
-       OS_kfree(tbl);
+       kfree(tbl);
 #endif
 }
 
index 840c647fbf410798588724b6e10ebeb612fa901d..1c2e52e8b5fe401b88505fb5acb43c48d05a3010 100644 (file)
@@ -72,7 +72,7 @@ static int sbecom_proc_get_sbe_info(struct seq_file *m, void *v)
        char       *spd;
        struct sbe_brd_info *bip;
 
-       bip = OS_kmalloc(sizeof(struct sbe_brd_info));
+       bip = kzalloc(sizeof(struct sbe_brd_info), GFP_KERNEL | GFP_DMA);
        if (!bip)
                return -ENOMEM;
 
index a5fc3c75ed4e11343102ab99b6629ae0a2521979..3c9278a224e2b86fa5d398d44248e6f94135f72c 100644 (file)
  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  * PURPOSE.  See the GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- *     NOTE TO LINUX KERNEL HACKERS:  DO NOT REFORMAT THIS CODE!
- *
- *     This is shared code between Digi's CVS archive and the
- *     Linux Kernel sources.
- *     Changing the source just for reformatting needlessly breaks
- *     our CVS diff history.
- *
- *     Send any bug fixes/changes to:  Eng.Linux at digi dot com.
- *     Thank you.
- *
  */
 
 /*
 
 #include "dgap.h"
 
-#define init_MUTEX(sem)         sema_init(sem, 1)
-#define DECLARE_MUTEX(name)     \
-       struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)
-
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Digi International, http://www.digi.com");
 MODULE_DESCRIPTION("Driver for the Digi International EPCA PCI based product line");
 MODULE_SUPPORTED_DEVICE("dgap");
 
-/**************************************************************************
- *
- * protos for this file
- *
- */
-
 static int dgap_start(void);
 static void dgap_init_globals(void);
 static int dgap_found_board(struct pci_dev *pdev, int id);
@@ -105,7 +80,6 @@ static int dgap_probe1(struct pci_dev *pdev, int card_type);
 static int dgap_do_remap(struct board_t *brd);
 static irqreturn_t dgap_intr(int irq, void *voidbrd);
 
-/* Our function prototypes */
 static int dgap_tty_open(struct tty_struct *tty, struct file *file);
 static void dgap_tty_close(struct tty_struct *tty, struct file *file);
 static int dgap_block_til_ready(struct tty_struct *tty, struct file *file,
@@ -161,9 +135,9 @@ static void dgap_cmdw_ext(struct channel_t *ch, u16 cmd, u16 word, uint ncmds);
 static int dgap_event(struct board_t *bd);
 
 static void dgap_poll_tasklet(unsigned long data);
-static void dgap_cmdb(struct channel_t *ch, uchar cmd, uchar byte1,
-                       uchar byte2, uint ncmds);
-static void dgap_cmdw(struct channel_t *ch, uchar cmd, u16 word, uint ncmds);
+static void dgap_cmdb(struct channel_t *ch, u8 cmd, u8 byte1,
+                       u8 byte2, uint ncmds);
+static void dgap_cmdw(struct channel_t *ch, u8 cmd, u16 word, uint ncmds);
 static void dgap_wmove(struct channel_t *ch, char *buf, uint cnt);
 static int dgap_param(struct tty_struct *tty);
 static void dgap_parity_scan(struct channel_t *ch, unsigned char *cbuf,
@@ -210,22 +184,21 @@ static uint dgap_config_get_useintr(struct board_t *bd);
 static uint dgap_config_get_altpin(struct board_t *bd);
 
 static int dgap_ms_sleep(ulong ms);
-static void dgap_do_bios_load(struct board_t *brd, const uchar *ubios, int len);
-static void dgap_do_fep_load(struct board_t *brd, const uchar *ufep, int len);
+static void dgap_do_bios_load(struct board_t *brd, const u8 *ubios, int len);
+static void dgap_do_fep_load(struct board_t *brd, const u8 *ufep, int len);
 #ifdef DIGI_CONCENTRATORS_SUPPORTED
-static void dgap_do_conc_load(struct board_t *brd, uchar *uaddr, int len);
+static void dgap_do_conc_load(struct board_t *brd, u8 *uaddr, int len);
 #endif
 static int dgap_after_config_loaded(int board);
 static int dgap_finalize_board_init(struct board_t *brd);
 
 static void dgap_get_vpd(struct board_t *brd);
 static void dgap_do_reset_board(struct board_t *brd);
-static int dgap_do_wait_for_bios(struct board_t *brd);
-static int dgap_do_wait_for_fep(struct board_t *brd);
+static int dgap_test_bios(struct board_t *brd);
+static int dgap_test_fep(struct board_t *brd);
 static int dgap_tty_register_ports(struct board_t *brd);
 static int dgap_firmware_load(struct pci_dev *pdev, int card_type);
 
-/* Driver unload function */
 static void dgap_cleanup_module(void);
 
 module_exit(dgap_cleanup_module);
@@ -237,22 +210,14 @@ static const struct file_operations DgapBoardFops = {
        .owner  = THIS_MODULE,
 };
 
-/*
- * Globals
- */
 static uint dgap_NumBoards;
 static struct board_t *dgap_Board[MAXBOARDS];
 static ulong dgap_poll_counter;
 static char *dgap_config_buf;
 static int dgap_driver_state = DRIVER_INITIALIZED;
-DEFINE_SPINLOCK(dgap_dl_lock);
 static wait_queue_head_t dgap_dl_wait;
-static int dgap_dl_action;
 static int dgap_poll_tick = 20;        /* Poll interval - 20 ms */
 
-/*
- * Static vars.
- */
 static struct class *dgap_class;
 
 static struct board_t *dgap_BoardsByMajor[256];
@@ -310,7 +275,7 @@ MODULE_DEVICE_TABLE(pci, dgap_pci_tbl);
  */
 struct board_id {
        uint config_type;
-       uchar *name;
+       u8 *name;
        uint maxports;
        uint dpatype;
 };
@@ -342,10 +307,10 @@ static struct pci_driver dgap_driver = {
 };
 
 struct firmware_info {
-       uchar *conf_name;       /* dgap.conf */
-       uchar *bios_name;       /* BIOS filename */
-       uchar *fep_name;        /* FEP  filename */
-       uchar *con_name;        /* Concentrator filename  FIXME*/
+       u8 *conf_name;       /* dgap.conf */
+       u8 *bios_name;  /* BIOS filename */
+       u8 *fep_name;   /* FEP  filename */
+       u8 *con_name;   /* Concentrator filename  FIXME*/
        int num;                /* sequence number */
 };
 
@@ -655,8 +620,6 @@ static void dgap_cleanup_module(void)
        class_destroy(dgap_class);
        unregister_chrdev(DIGI_DGAP_MAJOR, "dgap");
 
-       kfree(dgap_config_buf);
-
        for (i = 0; i < dgap_NumBoards; ++i) {
                dgap_remove_ports_sysfiles(dgap_Board[i]);
                dgap_tty_uninit(dgap_Board[i]);
@@ -819,9 +782,8 @@ static int dgap_found_board(struct pci_dev *pdev, int id)
        if (i)
                brd->state = BOARD_FAILED;
 
-       pr_info("dgap: board %d: %s (rev %d), irq %ld, %s\n",
-               dgap_NumBoards, brd->name, brd->rev, brd->irq,
-               brd->state ? "NOT READY\0" : "READY\0");
+       pr_info("dgap: board %d: %s (rev %d), irq %ld\n",
+               dgap_NumBoards, brd->name, brd->rev, brd->irq);
 
        return 0;
 }
@@ -863,7 +825,7 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
        dgap_get_vpd(brd);
        dgap_do_reset_board(brd);
 
-       if (fw_info[card_type].conf_name) {
+       if ((fw_info[card_type].conf_name) && !dgap_config_buf) {
                ret = request_firmware(&fw, fw_info[card_type].conf_name,
                                         &pdev->dev);
                if (ret) {
@@ -871,20 +833,22 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
                                fw_info[card_type].conf_name);
                        return ret;
                }
+
+               dgap_config_buf = kmalloc(fw->size + 1, GFP_KERNEL);
                if (!dgap_config_buf) {
-                       dgap_config_buf = kmalloc(fw->size + 1, GFP_ATOMIC);
-                       if (!dgap_config_buf) {
-                               release_firmware(fw);
-                               return -ENOMEM;
-                       }
+                       release_firmware(fw);
+                       return -ENOMEM;
                }
 
                memcpy(dgap_config_buf, fw->data, fw->size);
                release_firmware(fw);
                dgap_config_buf[fw->size + 1] = '\0';
 
-               if (dgap_parsefile(&dgap_config_buf, TRUE) != 0)
+               if (dgap_parsefile(&dgap_config_buf, TRUE) != 0) {
+                       kfree(dgap_config_buf);
                        return -EINVAL;
+               }
+               kfree(dgap_config_buf);
        }
 
        ret = dgap_after_config_loaded(brd->boardnum);
@@ -926,8 +890,9 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
                release_firmware(fw);
 
                /* Wait for BIOS to test board... */
-               if (!dgap_do_wait_for_bios(brd))
-                       return -ENXIO;
+               ret = dgap_test_bios(brd);
+               if (ret)
+                       return ret;
        }
 
        if (fw_info[card_type].fep_name) {
@@ -942,8 +907,9 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
                release_firmware(fw);
 
                /* Wait for FEP to load on board... */
-               if (!dgap_do_wait_for_fep(brd))
-                       return -ENXIO;
+               ret = dgap_test_fep(brd);
+               if (ret)
+                       return ret;
        }
 
 #ifdef DIGI_CONCENTRATORS_SUPPORTED
@@ -1197,7 +1163,6 @@ static void dgap_init_globals(void)
        init_timer(&dgap_poll_timer);
 
        init_waitqueue_head(&dgap_dl_wait);
-       dgap_dl_action = 0;
 }
 
 /************************************************************************
@@ -1328,8 +1293,8 @@ static int dgap_tty_init(struct board_t *brd)
        int i;
        int tlw;
        uint true_count = 0;
-       uchar *vaddr;
-       uchar modem = 0;
+       u8 *vaddr;
+       u8 modem = 0;
        struct channel_t *ch;
        struct bs_t *bs;
        struct cm_t *cm;
@@ -1540,8 +1505,8 @@ static void dgap_tty_uninit(struct board_t *brd)
  * dgap_sniff - Dump data out to the "sniff" buffer if the
  * proc sniff file is opened...
  */
-static void dgap_sniff_nowait_nolock(struct channel_t *ch, uchar *text,
-                                    uchar *buf, int len)
+static void dgap_sniff_nowait_nolock(struct channel_t *ch, u8 *text,
+                                    u8 *buf, int len)
 {
        struct timeval tv;
        int n;
@@ -1675,8 +1640,8 @@ static void dgap_input(struct channel_t *ch)
        int flip_len;
        int len = 0;
        int n = 0;
-       uchar *buf;
-       uchar tmpchar;
+       u8 *buf;
+       u8 tmpchar;
        int s = 0;
 
        if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
@@ -2445,7 +2410,7 @@ static int dgap_tty_chars_in_buffer(struct tty_struct *tty)
        struct channel_t *ch = NULL;
        struct un_t *un = NULL;
        struct bs_t *bs = NULL;
-       uchar tbusy;
+       u8 tbusy;
        uint chars = 0;
        u16 thead, ttail, tmask, chead, ctail;
        ulong   lock_flags = 0;
@@ -2878,8 +2843,8 @@ static int dgap_tty_write(struct tty_struct *tty, const unsigned char *buf,
                n -= remain;
                vaddr = ch->ch_taddr + head;
 
-               memcpy_toio(vaddr, (uchar *) buf, remain);
-               dgap_sniff_nowait_nolock(ch, "USER WRITE", (uchar *) buf,
+               memcpy_toio(vaddr, (u8 *) buf, remain);
+               dgap_sniff_nowait_nolock(ch, "USER WRITE", (u8 *) buf,
                                        remain);
 
                head = ch->ch_tstart;
@@ -2894,8 +2859,8 @@ static int dgap_tty_write(struct tty_struct *tty, const unsigned char *buf,
                vaddr = ch->ch_taddr + head;
                remain = n;
 
-               memcpy_toio(vaddr, (uchar *) buf, remain);
-               dgap_sniff_nowait_nolock(ch, "USER WRITE", (uchar *)buf,
+               memcpy_toio(vaddr, (u8 *) buf, remain);
+               dgap_sniff_nowait_nolock(ch, "USER WRITE", (u8 *)buf,
                                        remain);
 
                head += remain;
@@ -2950,7 +2915,7 @@ static int dgap_tty_tiocmget(struct tty_struct *tty)
        struct channel_t *ch;
        struct un_t *un;
        int result = -EIO;
-       uchar mstat = 0;
+       u8 mstat = 0;
        ulong lock_flags;
 
        if (!tty || tty->magic != TTY_MAGIC)
@@ -3176,7 +3141,7 @@ static void dgap_tty_send_xchar(struct tty_struct *tty, char c)
 static int dgap_get_modem_info(struct channel_t *ch, unsigned int __user *value)
 {
        int result = 0;
-       uchar mstat = 0;
+       u8 mstat = 0;
        ulong lock_flags;
        int rc = 0;
 
@@ -4336,9 +4301,9 @@ static int dgap_tty_register_ports(struct board_t *brd)
  * Copies the BIOS code from the user to the board,
  * and starts the BIOS running.
  */
-static void dgap_do_bios_load(struct board_t *brd, const uchar *ubios, int len)
+static void dgap_do_bios_load(struct board_t *brd, const u8 *ubios, int len)
 {
-       uchar *addr;
+       u8 *addr;
        uint offset;
        int i;
 
@@ -4369,16 +4334,15 @@ static void dgap_do_bios_load(struct board_t *brd, const uchar *ubios, int len)
 /*
  * Checks to see if the BIOS completed running on the card.
  */
-static int dgap_do_wait_for_bios(struct board_t *brd)
+static int dgap_test_bios(struct board_t *brd)
 {
-       uchar *addr;
+       u8 *addr;
        u16 word;
        u16 err1;
        u16 err2;
-       int ret = 0;
 
        if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase)
-               return ret;
+               return -EINVAL;
 
        addr = brd->re_map_membase;
        word = readw(addr + POSTAREA);
@@ -4392,7 +4356,7 @@ static int dgap_do_wait_for_bios(struct board_t *brd)
        while (brd->wait_for_bios < 1000) {
                /* Check to see if BIOS thinks board is good. (GD). */
                if (word == *(u16 *) "GD")
-                       return 1;
+                       return 0;
                msleep_interruptible(10);
                brd->wait_for_bios++;
                word = readw(addr + POSTAREA);
@@ -4406,16 +4370,16 @@ static int dgap_do_wait_for_bios(struct board_t *brd)
        brd->state = BOARD_FAILED;
        brd->dpastatus = BD_NOBIOS;
 
-       return ret;
+       return -EIO;
 }
 
 /*
  * Copies the FEP code from the user to the board,
  * and starts the FEP running.
  */
-static void dgap_do_fep_load(struct board_t *brd, const uchar *ufep, int len)
+static void dgap_do_fep_load(struct board_t *brd, const u8 *ufep, int len)
 {
-       uchar *addr;
+       u8 *addr;
        uint offset;
 
        if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase)
@@ -4434,8 +4398,8 @@ static void dgap_do_fep_load(struct board_t *brd, const uchar *ufep, int len)
         * it its config string describing how the concentrators look.
         */
        if ((brd->type == PCX) || (brd->type == PEPC)) {
-               uchar string[100];
-               uchar *config, *xconfig;
+               u8 string[100];
+               u8 *config, *xconfig;
                int i = 0;
 
                xconfig = dgap_create_config_string(brd, string);
@@ -4457,16 +4421,15 @@ static void dgap_do_fep_load(struct board_t *brd, const uchar *ufep, int len)
 /*
  * Waits for the FEP to report thats its ready for us to use.
  */
-static int dgap_do_wait_for_fep(struct board_t *brd)
+static int dgap_test_fep(struct board_t *brd)
 {
-       uchar *addr;
+       u8 *addr;
        u16 word;
        u16 err1;
        u16 err2;
-       int ret = 0;
 
        if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase)
-               return ret;
+               return -EINVAL;
 
        addr = brd->re_map_membase;
        word = readw(addr + FEPSTAT);
@@ -4486,7 +4449,7 @@ static int dgap_do_wait_for_fep(struct board_t *brd)
                        if (word == *(u16 *) "5A")
                                brd->bd_flags |= BD_FEP5PLUS;
 
-                       return 1;
+                       return 0;
                }
                msleep_interruptible(10);
                brd->wait_for_fep++;
@@ -4501,7 +4464,7 @@ static int dgap_do_wait_for_fep(struct board_t *brd)
        brd->state = BOARD_FAILED;
        brd->dpastatus = BD_NOFEP;
 
-       return ret;
+       return -EIO;
 }
 
 /*
@@ -4509,7 +4472,7 @@ static int dgap_do_wait_for_fep(struct board_t *brd)
  */
 static void dgap_do_reset_board(struct board_t *brd)
 {
-       uchar check;
+       u8 check;
        u32 check1;
        u32 check2;
        int i = 0;
@@ -4557,7 +4520,7 @@ static void dgap_do_reset_board(struct board_t *brd)
 /*
  * Sends a concentrator image into the FEP5 board.
  */
-static void dgap_do_conc_load(struct board_t *brd, uchar *uaddr, int len)
+static void dgap_do_conc_load(struct board_t *brd, u8 *uaddr, int len)
 {
        char *vaddr;
        u16 offset = 0;
@@ -4590,8 +4553,8 @@ static void dgap_get_vpd(struct board_t *brd)
        u16 vpd_offset;
        u16 image_length;
        u16 i;
-       uchar byte1;
-       uchar byte2;
+       u8 byte1;
+       u8 byte2;
 
        /*
         * Poke the magic number at the PCI Rom Address location.
@@ -4770,8 +4733,8 @@ out:
  *                        in the cmd buffer before returning.
  *
  *=======================================================================*/
-static void dgap_cmdb(struct channel_t *ch, uchar cmd, uchar byte1,
-                       uchar byte2, uint ncmds)
+static void dgap_cmdb(struct channel_t *ch, u8 cmd, u8 byte1,
+                       u8 byte2, uint ncmds)
 {
        char            *vaddr = NULL;
        struct cm_t     *cm_addr = NULL;
@@ -4813,7 +4776,7 @@ static void dgap_cmdb(struct channel_t *ch, uchar cmd, uchar byte1,
         * Put the data in the circular command buffer.
         */
        writeb(cmd, (char *) (vaddr + head + CMDSTART + 0));
-       writeb((uchar) ch->ch_portnum, (char *) (vaddr + head + CMDSTART + 1));
+       writeb((u8) ch->ch_portnum, (char *) (vaddr + head + CMDSTART + 1));
        writeb(byte1, (char *) (vaddr + head + CMDSTART + 2));
        writeb(byte2, (char *) (vaddr + head + CMDSTART + 3));
 
@@ -4856,7 +4819,7 @@ static void dgap_cmdb(struct channel_t *ch, uchar cmd, uchar byte1,
  *                        in the cmd buffer before returning.
  *
  *=======================================================================*/
-static void dgap_cmdw(struct channel_t *ch, uchar cmd, u16 word, uint ncmds)
+static void dgap_cmdw(struct channel_t *ch, u8 cmd, u16 word, uint ncmds)
 {
        char            *vaddr = NULL;
        struct cm_t     *cm_addr = NULL;
@@ -4897,7 +4860,7 @@ static void dgap_cmdw(struct channel_t *ch, uchar cmd, u16 word, uint ncmds)
         * Put the data in the circular command buffer.
         */
        writeb(cmd, (char *) (vaddr + head + CMDSTART + 0));
-       writeb((uchar) ch->ch_portnum, (char *) (vaddr + head + CMDSTART + 1));
+       writeb((u8) ch->ch_portnum, (char *) (vaddr + head + CMDSTART + 1));
        writew((u16) word, (char *) (vaddr + head + CMDSTART + 2));
 
        head = (head + 4) & (CMDMAX - CMDSTART - 4);
@@ -4981,9 +4944,9 @@ static void dgap_cmdw_ext(struct channel_t *ch, u16 cmd, u16 word, uint ncmds)
         */
 
        /* Write an FF to tell the FEP that we want an extended command */
-       writeb((uchar) 0xff, (char *) (vaddr + head + CMDSTART + 0));
+       writeb((u8) 0xff, (char *) (vaddr + head + CMDSTART + 0));
 
-       writeb((uchar) ch->ch_portnum, (uchar *) (vaddr + head + CMDSTART + 1));
+       writeb((u8) ch->ch_portnum, (u8 *) (vaddr + head + CMDSTART + 1));
        writew((u16) cmd, (char *) (vaddr + head + CMDSTART + 2));
 
        /*
@@ -5088,7 +5051,7 @@ static void dgap_wmove(struct channel_t *ch, char *buf, uint cnt)
  */
 static uint dgap_get_custom_baud(struct channel_t *ch)
 {
-       uchar *vaddr;
+       u8 *vaddr;
        ulong offset = 0;
        uint value = 0;
 
@@ -5160,8 +5123,8 @@ static int dgap_param(struct tty_struct *tty)
        u16     head;
        u16     cflag;
        u16     iflag;
-       uchar   mval;
-       uchar   hflow;
+       u8      mval;
+       u8      hflow;
 
        if (!tty || tty->magic != TTY_MAGIC)
                return -ENXIO;
@@ -5427,7 +5390,7 @@ static int dgap_param(struct tty_struct *tty)
                ch->ch_hflow = hflow;
 
                /* Okay to have channel and board locks held calling this */
-               dgap_cmdb(ch, SHFLOW, (uchar) hflow, 0xff, 0);
+               dgap_cmdb(ch, SHFLOW, (u8) hflow, 0xff, 0);
        }
 
 
@@ -5455,7 +5418,7 @@ static int dgap_param(struct tty_struct *tty)
                ch->ch_mostat = mval;
 
                /* Okay to have channel and board locks held calling this */
-               dgap_cmdb(ch, SMODEM, (uchar) mval, D_RTS(ch)|D_DTR(ch), 0);
+               dgap_cmdb(ch, SMODEM, (u8) mval, D_RTS(ch)|D_DTR(ch), 0);
        }
 
        /*
@@ -5609,8 +5572,8 @@ static int dgap_event(struct board_t *bd)
        ulong           lock_flags;
        ulong           lock_flags2;
        struct bs_t     *bs;
-       uchar           *event;
-       uchar           *vaddr = NULL;
+       u8              *event;
+       u8              *vaddr = NULL;
        struct ev_t     *eaddr = NULL;
        uint            head;
        uint            tail;
index 6b8f5f8583272f09ac950ff2a5f7cc07d87711d6..b23570bd183dbcabc56fedc3a01e69554b7e95d4 100644 (file)
@@ -39,9 +39,6 @@
 # define FALSE 0
 #endif
 
-/* Required for our shared headers! */
-typedef unsigned char          uchar;
-
 #if !defined(TTY_FLIPBUF_SIZE)
 # define TTY_FLIPBUF_SIZE 512
 #endif
@@ -61,7 +58,7 @@ typedef unsigned char         uchar;
 
 /*
  * defines from dgap_pci.h
- */ 
+ */
 #define PCIMAX 32                      /* maximum number of PCI boards */
 
 #define DIGI_VID               0x114F
@@ -186,7 +183,7 @@ typedef unsigned char               uchar;
                        ECHOCTL | ECHOKE | IEXTEN)
 
 #ifndef _POSIX_VDISABLE
-#define   _POSIX_VDISABLE '\0'
+#define _POSIX_VDISABLE ('\0')
 #endif
 
 #define SNIFF_MAX      65536           /* Sniff buffer size (2^n) */
@@ -207,9 +204,11 @@ typedef unsigned char              uchar;
 #define EVSTART         0x0800L         /* Start of event buffer        */
 #define EVMAX           0x0c00L         /* End of event buffer          */
 #define FEP5_PLUS       0x0E40          /* ASCII '5' and ASCII 'A' is here  */
-#define ECS_SEG         0x0E44          /* Segment of the extended channel structure */
-#define LINE_SPEED      0x10            /* Offset into ECS_SEG for line speed   */
-                                        /* if the fep has extended capabilities */
+#define ECS_SEG         0x0E44          /* Segment of the extended      */
+                                       /* channel structure            */
+#define LINE_SPEED      0x10            /* Offset into ECS_SEG for line */
+                                       /* speed if the fep has extended */
+                                       /* capabilities                 */
 
 /* BIOS MAGIC SPOTS */
 #define ERROR           0x0C14L                /* BIOS error code              */
@@ -247,12 +246,12 @@ typedef unsigned char             uchar;
 
 #define FEPTIMEOUT 200000
 
-#define ENABLE_INTR            0x0e04          /* Enable interrupts flag */
-#define FEPPOLL_MIN            1               /* minimum of 1 millisecond */
-#define FEPPOLL_MAX            20              /* maximum of 20 milliseconds */
-#define FEPPOLL                        0x0c26          /* Fep event poll interval */
+#define ENABLE_INTR    0x0e04          /* Enable interrupts flag */
+#define FEPPOLL_MIN    1               /* minimum of 1 millisecond */
+#define FEPPOLL_MAX    20              /* maximum of 20 milliseconds */
+#define FEPPOLL                0x0c26          /* Fep event poll interval */
 
-#define        IALTPIN                 0x0080          /* Input flag to swap DSR <-> DCD */
+#define        IALTPIN         0x0080          /* Input flag to swap DSR <-> DCD */
 
 /************************************************************************
  * FEP supported functions
@@ -280,14 +279,12 @@ typedef unsigned char             uchar;
 #define SPINTFC                0xfc            /* Reserved                     */
 #define SCOMMODE       0xfd            /* Set RS232/422 mode           */
 
-
 /************************************************************************
  *     Modes for SCOMMODE
  ************************************************************************/
 #define MODE_232       0x00
 #define MODE_422       0x01
 
-
 /************************************************************************
  *      Event flags.
  ************************************************************************/
@@ -362,13 +359,13 @@ typedef unsigned char             uchar;
 #define MC8E8K  36
 
 #define AVANFS 42      /* start of Avanstar family definitions */
-#define A8P    42
+#define A8P    42
 #define A16P   43
 #define AVANFE 43      /* end of Avanstar family definitions */
 
-#define DA2000FS       44      /* start of AccelePort 2000 family definitions */
-#define DA22           44 /* AccelePort 2002 */
-#define DA24           45 /* AccelePort 2004 */
+#define DA2000FS       44 /* start of AccelePort 2000 family definitions */
+#define DA22           44 /* AccelePort 2002 */
+#define DA24           45 /* AccelePort 2004 */
 #define DA28           46 /* AccelePort 2008 */
 #define DA216          47 /* AccelePort 2016 */
 #define DAR4           48 /* AccelePort RAS 4 port */
@@ -492,8 +489,6 @@ enum {
        REQUESTED_CONCENTRATOR
 };
 
-
-
 /*
  * Modem line constants are defined as macros because DSR and
  * DCD are swapable using the ditty altpin option.
@@ -505,14 +500,12 @@ enum {
 #define D_RI(ch)        DM_RI           /* Ring indicator       */
 #define D_DTR(ch)       DM_DTR          /* Data terminal ready  */
 
-
 /*************************************************************************
  *
  * Structures and closely related defines.
  *
  *************************************************************************/
 
-
 /*
  * A structure to hold a statistics counter.  We also
  * compute moving averages for this counter.
@@ -524,7 +517,6 @@ struct macounter {
        ulong           ema;    /* Exponential moving average */
 };
 
-
 /************************************************************************
  * Device flag definitions for bd_flags.
  ************************************************************************/
@@ -546,11 +538,11 @@ struct board_t {
        u16             device;         /* PCI device ID */
        u16             subvendor;      /* PCI subsystem vendor ID */
        u16             subdevice;      /* PCI subsystem device ID */
-       uchar           rev;            /* PCI revision ID */
+       u8              rev;            /* PCI revision ID */
        uint            pci_bus;        /* PCI bus value */
        uint            pci_slot;       /* PCI slot value */
        u16             maxports;       /* MAX ports this board can handle */
-       uchar           vpd[VPDSIZE];   /* VPD of board, if found */
+       u8              vpd[VPDSIZE];   /* VPD of board, if found */
        u32             bd_flags;       /* Board flags */
 
        spinlock_t      bd_lock;        /* Used to protect board */
@@ -571,20 +563,22 @@ struct board_t {
        ulong           irq;            /* Interrupt request number */
        ulong           intr_count;     /* Count of interrupts */
        u32             intr_used;      /* Non-zero if using interrupts */
-       u32             intr_running;   /* Non-zero if FEP knows its doing interrupts */
+       u32             intr_running;   /* Non-zero if FEP knows its doing */
+                                       /* interrupts */
 
        ulong           port;           /* Start of base io port of the card */
        ulong           port_end;       /* End of base io port of the card */
        ulong           membase;        /* Start of base memory of the card */
        ulong           membase_end;    /* End of base memory of the card */
 
-       uchar           *re_map_port;   /* Remapped io port of the card */
-       uchar           *re_map_membase;/* Remapped memory of the card */
+       u8              *re_map_port;   /* Remapped io port of the card */
+       u8              *re_map_membase;/* Remapped memory of the card */
 
-       uchar           runwait;        /* # Processes waiting for FEP  */
-       uchar           inhibit_poller; /* Tells  the poller to leave us alone */
+       u8              runwait;        /* # Processes waiting for FEP  */
+       u8              inhibit_poller; /* Tells the poller to leave us alone */
 
-       struct channel_t *channels[MAXPORTS]; /* array of pointers to our channels. */
+       struct channel_t *channels[MAXPORTS]; /* array of pointers to our */
+                                             /* channels.                */
 
        struct tty_driver       *SerialDriver;
        struct tty_port *SerialPorts;
@@ -599,20 +593,23 @@ struct board_t {
        u32             dgap_Serial_Major;
        u32             dgap_TransparentPrint_Major;
 
-       struct bs_t     *bd_bs;                 /* Base structure pointer       */
+       struct bs_t     *bd_bs;         /* Base structure pointer         */
 
-       char    *flipbuf;               /* Our flip buffer, alloced if board is found */
-       char    *flipflagbuf;           /* Our flip flag buffer, alloced if board is found */
+       char    *flipbuf;               /* Our flip buffer, alloced if    */
+                                       /* board is found                 */
+       char    *flipflagbuf;           /* Our flip flag buffer, alloced  */
+                                       /* if board is found              */
 
-       u16             dpatype;        /* The board "type", as defined by DPA */
-       u16             dpastatus;      /* The board "status", as defined by DPA */
-       wait_queue_head_t kme_wait;     /* Needed for DPA support */
+       u16             dpatype;        /* The board "type", as defined   */
+                                       /* by DPA                         */
+       u16             dpastatus;      /* The board "status", as defined */
+                                       /* by DPA                         */
+       wait_queue_head_t kme_wait;     /* Needed for DPA support         */
 
-       u32             conc_dl_status; /* Status of any pending conc download */
+       u32             conc_dl_status; /* Status of any pending conc     */
+                                       /* download                       */
 };
 
-
-
 /************************************************************************
  * Unit flag definitions for un_flags.
  ************************************************************************/
@@ -650,7 +647,6 @@ struct un_t {
        struct device *un_sysfs;
 };
 
-
 /************************************************************************
  * Device flag definitions for ch_flags.
  ************************************************************************/
@@ -677,7 +673,6 @@ struct un_t {
 #define SNIFF_WAIT_DATA        0x2
 #define SNIFF_WAIT_SPACE 0x4
 
-
 /************************************************************************
  ***   Definitions for Digi ditty(1) command.
  ************************************************************************/
@@ -689,8 +684,8 @@ struct un_t {
 
 #if !defined(TIOCMODG)
 
-#define        TIOCMODG        (('d'<<8) | 250)                /* get modem ctrl state */
-#define        TIOCMODS        (('d'<<8) | 251)                /* set modem ctrl state */
+#define        TIOCMODG        (('d'<<8) | 250)        /* get modem ctrl state */
+#define        TIOCMODS        (('d'<<8) | 251)        /* set modem ctrl state */
 
 #ifndef TIOCM_LE
 #define                TIOCM_LE        0x01            /* line enable          */
@@ -709,16 +704,15 @@ struct un_t {
 #endif
 
 #if !defined(TIOCMSET)
-#define        TIOCMSET        (('d'<<8) | 252)                /* set modem ctrl state */
-#define        TIOCMGET        (('d'<<8) | 253)                /* set modem ctrl state */
+#define        TIOCMSET        (('d'<<8) | 252)        /* set modem ctrl state */
+#define        TIOCMGET        (('d'<<8) | 253)        /* set modem ctrl state */
 #endif
 
 #if !defined(TIOCMBIC)
-#define        TIOCMBIC        (('d'<<8) | 254)                /* set modem ctrl state */
-#define        TIOCMBIS        (('d'<<8) | 255)                /* set modem ctrl state */
+#define        TIOCMBIC        (('d'<<8) | 254)        /* set modem ctrl state */
+#define        TIOCMBIS        (('d'<<8) | 255)        /* set modem ctrl state */
 #endif
 
-
 #if !defined(TIOCSDTR)
 #define        TIOCSDTR        (('e'<<8) | 0)          /* set DTR              */
 #define        TIOCCDTR        (('e'<<8) | 1)          /* clear DTR            */
@@ -737,26 +731,25 @@ struct un_t {
                                                /* Adapter Memory       */
 
 #define        DIGI_GETFLOW    (('e'<<8) | 99)         /* Get startc/stopc flow */
-                                               /* control characters    */
-#define        DIGI_SETFLOW    (('e'<<8) | 100)                /* Set startc/stopc flow */
+                                               /* control characters    */
+#define        DIGI_SETFLOW    (('e'<<8) | 100)        /* Set startc/stopc flow */
                                                /* control characters    */
-#define        DIGI_GETAFLOW   (('e'<<8) | 101)                /* Get Aux. startc/stopc */
-                                               /* flow control chars    */
-#define        DIGI_SETAFLOW   (('e'<<8) | 102)                /* Set Aux. startc/stopc */
+#define        DIGI_GETAFLOW   (('e'<<8) | 101)        /* Get Aux. startc/stopc */
+                                               /* flow control chars    */
+#define        DIGI_SETAFLOW   (('e'<<8) | 102)        /* Set Aux. startc/stopc */
                                                /* flow control chars    */
 
-#define DIGI_GEDELAY   (('d'<<8) | 246)                /* Get edelay */
-#define DIGI_SEDELAY   (('d'<<8) | 247)                /* Set edelay */
+#define DIGI_GEDELAY   (('d'<<8) | 246)        /* Get edelay */
+#define DIGI_SEDELAY   (('d'<<8) | 247)        /* Set edelay */
 
 struct digiflow_t {
-       unsigned char   startc;                         /* flow cntl start char */
-       unsigned char   stopc;                          /* flow cntl stop char  */
+       unsigned char   startc;                 /* flow cntl start char */
+       unsigned char   stopc;                  /* flow cntl stop char  */
 };
 
-
 #ifdef FLOW_2200
-#define        F2200_GETA      (('e'<<8) | 104)                /* Get 2x36 flow cntl flags */
-#define        F2200_SETAW     (('e'<<8) | 105)                /* Set 2x36 flow cntl flags */
+#define        F2200_GETA      (('e'<<8) | 104)        /* Get 2x36 flow cntl flags */
+#define        F2200_SETAW     (('e'<<8) | 105)        /* Set 2x36 flow cntl flags */
 #define                F2200_MASK      0x03            /* 2200 flow cntl bit mask  */
 #define                FCNTL_2200      0x01            /* 2x36 terminal flow cntl  */
 #define                PCNTL_2200      0x02            /* 2x36 printer flow cntl   */
@@ -830,59 +823,6 @@ struct rw_t {
        unsigned char   rw_data[128];   /* Data to read/write           */
 };
 
-/***********************************************************************
- * Shrink Buffer and Board Information definitions and structures.
-
- ************************************************************************/
-                       /* Board type return codes */
-#define        PCXI_TYPE 1     /* Board type at the designated port is a PC/Xi */
-#define PCXM_TYPE 2     /* Board type at the designated port is a PC/Xm */
-#define        PCXE_TYPE 3     /* Board type at the designated port is a PC/Xe */
-#define        MCXI_TYPE 4     /* Board type at the designated port is a MC/Xi */
-#define COMXI_TYPE 5     /* Board type at the designated port is a COM/Xi */
-
-                        /* Non-Zero Result codes. */
-#define RESULT_NOBDFND 1 /* A Digi product at that port is not config installed */
-#define RESULT_NODESCT 2 /* A memory descriptor was not obtainable */
-#define RESULT_NOOSSIG 3 /* FEP/OS signature was not detected on the board */
-#define RESULT_TOOSML  4 /* Too small an area to shrink.  */
-#define RESULT_NOCHAN  5 /* Channel structure for the board was not found */
-
-struct shrink_buf_struct {
-       unsigned long   shrink_buf_vaddr;       /* Virtual address of board */
-       unsigned long   shrink_buf_phys;        /* Physical address of board */
-       unsigned long   shrink_buf_bseg;        /* Amount of board memory */
-       unsigned long   shrink_buf_hseg;        /* '186 Beginning of Dual-Port */
-
-       unsigned long   shrink_buf_lseg;        /* '186 Beginning of freed memory                                               */
-       unsigned long   shrink_buf_mseg;        /* Linear address from start of
-                                                  dual-port were freed memory
-                                                  begins, host viewpoint. */
-
-       unsigned long   shrink_buf_bdparam;     /* Parameter for xxmemon and
-                                                  xxmemoff */
-
-       unsigned long   shrink_buf_reserva;     /* Reserved */
-       unsigned long   shrink_buf_reservb;     /* Reserved */
-       unsigned long   shrink_buf_reservc;     /* Reserved */
-       unsigned long   shrink_buf_reservd;     /* Reserved */
-
-       unsigned char   shrink_buf_result;      /* Reason for call failing
-                                                  Zero is Good return */
-       unsigned char   shrink_buf_init;        /* Non-Zero if it caused an
-                                                  xxinit call. */
-
-       unsigned char   shrink_buf_anports;     /* Number of async ports  */
-       unsigned char   shrink_buf_snports;     /* Number of sync  ports */
-       unsigned char   shrink_buf_type;        /* Board type 1 = PC/Xi,
-                                                             2 = PC/Xm,
-                                                             3 = PC/Xe
-                                                             4 = MC/Xi
-                                                             5 = COMX/i */
-       unsigned char   shrink_buf_card;        /* Card number */
-
-};
-
 /************************************************************************
  * Structure to get driver status information
  ************************************************************************/
@@ -892,7 +832,7 @@ struct digi_dinfo {
        char            dinfo_version[16];      /* driver version       */
 };
 
-#define        DIGI_GETDD      (('d'<<8) | 248)                /* get driver info      */
+#define        DIGI_GETDD      (('d'<<8) | 248)        /* get driver info      */
 
 /************************************************************************
  * Structure used with ioctl commands for per-board information
@@ -912,7 +852,7 @@ struct digi_info {
        char            info_reserved[7];       /* for future expansion    */
 };
 
-#define        DIGI_GETBD      (('d'<<8) | 249)                /* get board info          */
+#define        DIGI_GETBD      (('d'<<8) | 249)        /* get board info          */
 
 struct digi_stat {
        unsigned int    info_chan;              /* Channel number (0 based)  */
@@ -927,7 +867,7 @@ struct digi_stat {
        unsigned long   info_reserved[8];       /* for future expansion    */
 };
 
-#define        DIGI_GETSTAT    (('d'<<8) | 244)                /* get board info          */
+#define        DIGI_GETSTAT    (('d'<<8) | 244)        /* get board info          */
 /************************************************************************
  *
  * Structure used with ioctl commands for per-channel information
@@ -936,9 +876,9 @@ struct digi_stat {
 struct digi_ch {
        unsigned long   info_bdnum;             /* Board number (0 based)  */
        unsigned long   info_channel;           /* Channel index number    */
-       unsigned long   info_ch_cflag;          /* Channel cflag           */
-       unsigned long   info_ch_iflag;          /* Channel iflag           */
-       unsigned long   info_ch_oflag;          /* Channel oflag           */
+       unsigned long   info_ch_cflag;          /* Channel cflag           */
+       unsigned long   info_ch_iflag;          /* Channel iflag           */
+       unsigned long   info_ch_oflag;          /* Channel oflag           */
        unsigned long   info_chsize;            /* Channel structure size  */
        unsigned long   info_sleep_stat;        /* sleep status            */
        dev_t           info_dev;               /* device number           */
@@ -970,7 +910,7 @@ struct digi_cmd {
 #define INFO_CH_WLOW   0x0020
 #define INFO_XXBUF_BUSY 0x0040
 
-#define        DIGI_GETCH      (('d'<<8) | 245)                /* get board info          */
+#define        DIGI_GETCH      (('d'<<8) | 245)        /* get board info          */
 
 /* Board type definitions */
 
@@ -1015,12 +955,13 @@ struct digi_cmd {
 #define BD_TRIBOOT     0x8
 #define        BD_BADKME       0x80
 
-#define DIGI_LOOPBACK        (('d'<<8) | 252)          /* Enable/disable UART internal loopback */
-#define DIGI_SPOLL            (('d'<<8) | 254)         /* change poller rate   */
+#define DIGI_LOOPBACK  (('d'<<8) | 252)        /* Enable/disable UART  */
+                                               /* internal loopback    */
+#define DIGI_SPOLL     (('d'<<8) | 254)        /* change poller rate   */
 
-#define DIGI_SETCUSTOMBAUD     _IOW('e', 106, int)     /* Set integer baud rate */
-#define DIGI_GETCUSTOMBAUD     _IOR('e', 107, int)     /* Get integer baud rate */
-#define DIGI_RESET_PORT                (('e'<<8) | 93)         /* Reset port           */
+#define DIGI_SETCUSTOMBAUD _IOW('e', 106, int) /* Set integer baud rate */
+#define DIGI_GETCUSTOMBAUD _IOR('e', 107, int) /* Get integer baud rate */
+#define DIGI_RESET_PORT           (('e'<<8) | 93)      /* Reset port            */
 
 /************************************************************************
  * Channel information structure.
@@ -1041,14 +982,14 @@ struct channel_t {
        wait_queue_head_t ch_flags_wait;
 
        u32     pscan_state;
-       uchar   pscan_savechar;
+       u8      pscan_savechar;
 
        u32 ch_portnum;                 /* Port number, 0 offset.       */
        u32 ch_open_count;              /* open count                   */
        u32     ch_flags;               /* Channel flags                */
 
-
-       u32     ch_close_delay;         /* How long we should drop RTS/DTR for */
+       u32     ch_close_delay;         /* How long we should drop      */
+                                       /* RTS/DTR for                  */
 
        u32     ch_cpstime;             /* Time for CPS calculations    */
 
@@ -1057,7 +998,7 @@ struct channel_t {
        tcflag_t ch_c_oflag;            /* channel oflags               */
        tcflag_t ch_c_lflag;            /* channel lflags               */
 
-       u16  ch_fepiflag;            /* FEP tty iflags               */
+       u16  ch_fepiflag;               /* FEP tty iflags               */
        u16  ch_fepcflag;               /* FEP tty cflags               */
        u16  ch_fepoflag;               /* FEP tty oflags               */
        u16  ch_wopen;                  /* Waiting for open process cnt */
@@ -1071,33 +1012,33 @@ struct channel_t {
 
        u16  ch_cook;                   /* Output character mask        */
 
-       uchar   ch_card;                /* Card channel is on           */
-       uchar   ch_stopc;               /* Stop character               */
-       uchar   ch_startc;              /* Start character              */
-
-       uchar   ch_mostat;              /* FEP output modem status      */
-       uchar   ch_mistat;              /* FEP input modem status       */
-       uchar   ch_mforce;              /* Modem values to be forced    */
-       uchar   ch_mval;                /* Force values                 */
-       uchar   ch_fepstopc;            /* FEP stop character           */
-       uchar   ch_fepstartc;           /* FEP start character          */
-
-       uchar   ch_astopc;              /* Auxiliary Stop character     */
-       uchar   ch_astartc;             /* Auxiliary Start character    */
-       uchar   ch_fepastopc;           /* Auxiliary FEP stop char      */
-       uchar   ch_fepastartc;          /* Auxiliary FEP start char     */
-
-       uchar   ch_hflow;               /* FEP hardware handshake       */
-       uchar   ch_dsr;                 /* stores real dsr value        */
-       uchar   ch_cd;                  /* stores real cd value         */
-       uchar   ch_tx_win;              /* channel tx buffer window     */
-       uchar   ch_rx_win;              /* channel rx buffer window     */
+       u8   ch_card;                   /* Card channel is on           */
+       u8   ch_stopc;                  /* Stop character               */
+       u8   ch_startc;                 /* Start character              */
+
+       u8   ch_mostat;                 /* FEP output modem status      */
+       u8   ch_mistat;                 /* FEP input modem status       */
+       u8   ch_mforce;                 /* Modem values to be forced    */
+       u8   ch_mval;                   /* Force values                 */
+       u8   ch_fepstopc;               /* FEP stop character           */
+       u8   ch_fepstartc;              /* FEP start character          */
+
+       u8   ch_astopc;                 /* Auxiliary Stop character     */
+       u8   ch_astartc;                /* Auxiliary Start character    */
+       u8   ch_fepastopc;              /* Auxiliary FEP stop char      */
+       u8   ch_fepastartc;             /* Auxiliary FEP start char     */
+
+       u8   ch_hflow;                  /* FEP hardware handshake       */
+       u8   ch_dsr;                    /* stores real dsr value        */
+       u8   ch_cd;                     /* stores real cd value         */
+       u8   ch_tx_win;                 /* channel tx buffer window     */
+       u8   ch_rx_win;                 /* channel rx buffer window     */
        uint    ch_custom_speed;        /* Custom baud, if set          */
-       uint    ch_baud_info;           /* Current baud info for /proc output   */
-       ulong   ch_rxcount;             /* total of data received so far        */
-       ulong   ch_txcount;             /* total of data transmitted so far     */
-       ulong   ch_err_parity;          /* Count of parity errors on channel    */
-       ulong   ch_err_frame;           /* Count of framing errors on channel   */
+       uint    ch_baud_info;           /* Current baud info for /proc output */
+       ulong   ch_rxcount;             /* total of data received so far      */
+       ulong   ch_txcount;             /* total of data transmitted so far   */
+       ulong   ch_err_parity;          /* Count of parity errors on channel  */
+       ulong   ch_err_frame;           /* Count of framing errors on channel */
        ulong   ch_err_break;           /* Count of breaks on channel   */
        ulong   ch_err_overrun;         /* Count of overruns on channel */
 
@@ -1112,34 +1053,34 @@ struct channel_t {
  * Command structure definition.
  ************************************************************************/
 struct cm_t {
-       volatile unsigned short cm_head;        /* Command buffer head offset   */
-       volatile unsigned short cm_tail;        /* Command buffer tail offset   */
-       volatile unsigned short cm_start;       /* start offset of buffer       */
-       volatile unsigned short cm_max;         /* last offset of buffer        */
+       unsigned short cm_head;         /* Command buffer head offset */
+       unsigned short cm_tail;         /* Command buffer tail offset */
+       unsigned short cm_start;        /* start offset of buffer     */
+       unsigned short cm_max;          /* last offset of buffer      */
 };
 
 /************************************************************************
  * Event structure definition.
  ************************************************************************/
 struct ev_t {
-       volatile unsigned short ev_head;        /* Command buffer head offset   */
-       volatile unsigned short ev_tail;        /* Command buffer tail offset   */
-       volatile unsigned short ev_start;       /* start offset of buffer       */
-       volatile unsigned short ev_max;         /* last offset of buffer        */
+       unsigned short ev_head;         /* Command buffer head offset */
+       unsigned short ev_tail;         /* Command buffer tail offset */
+       unsigned short ev_start;        /* start offset of buffer     */
+       unsigned short ev_max;          /* last offset of buffer      */
 };
 
 /************************************************************************
  * Download buffer structure.
  ************************************************************************/
 struct downld_t {
-       uchar   dl_type;                /* Header                       */
-       uchar   dl_seq;                 /* Download sequence            */
+       u8      dl_type;                /* Header                       */
+       u8      dl_seq;                 /* Download sequence            */
        ushort  dl_srev;                /* Software revision number     */
        ushort  dl_lrev;                /* Low revision number          */
        ushort  dl_hrev;                /* High revision number         */
        ushort  dl_seg;                 /* Start segment address        */
        ushort  dl_size;                /* Number of bytes to download  */
-       uchar   dl_data[1024];          /* Download data                */
+       u8      dl_data[1024];          /* Download data                */
 };
 
 /************************************************************************
@@ -1152,70 +1093,74 @@ struct downld_t {
  *        U = unknown (may be changed w/o notice)                       *
  ************************************************************************/
 struct bs_t {
-       volatile unsigned short  tp_jmp;        /* Transmit poll jump            */
-       volatile unsigned short  tc_jmp;        /* Cooked procedure jump         */
-       volatile unsigned short  ri_jmp;        /* Not currently used            */
-       volatile unsigned short  rp_jmp;        /* Receive poll jump             */
-
-       volatile unsigned short  tx_seg;        /* W  Tx segment         */
-       volatile unsigned short  tx_head;       /* W  Tx buffer head offset     */
-       volatile unsigned short  tx_tail;       /* R  Tx buffer tail offset     */
-       volatile unsigned short  tx_max;        /* W  Tx buffer size - 1         */
-
-       volatile unsigned short  rx_seg;        /* W  Rx segment                */
-       volatile unsigned short  rx_head;       /* W  Rx buffer head offset     */
-       volatile unsigned short  rx_tail;       /* R  Rx buffer tail offset     */
-       volatile unsigned short  rx_max;        /* W  Rx buffer size - 1         */
-
-       volatile unsigned short  tx_lw;         /* W  Tx buffer low water mark  */
-       volatile unsigned short  rx_lw;         /* W  Rx buffer low water mark  */
-       volatile unsigned short  rx_hw;         /* W  Rx buffer high water mark */
-       volatile unsigned short  incr;          /* W  Increment to next channel */
-
-       volatile unsigned short  fepdev;        /* U  SCC device base address    */
-       volatile unsigned short  edelay;        /* W  Exception delay            */
-       volatile unsigned short  blen;          /* W  Break length              */
-       volatile unsigned short  btime;         /* U  Break complete time       */
-
-       volatile unsigned short  iflag;         /* C  UNIX input flags          */
-       volatile unsigned short  oflag;         /* C  UNIX output flags         */
-       volatile unsigned short  cflag;         /* C  UNIX control flags        */
-       volatile unsigned short  wfill[13];     /* U  Reserved for expansion    */
-
-       volatile unsigned char   num;           /* U  Channel number            */
-       volatile unsigned char   ract;          /* U  Receiver active counter   */
-       volatile unsigned char   bstat;         /* U  Break status bits         */
-       volatile unsigned char   tbusy;         /* W  Transmit busy             */
-       volatile unsigned char   iempty;        /* W  Transmit empty event enable */
-       volatile unsigned char   ilow;          /* W  Transmit low-water event enable */
-       volatile unsigned char   idata;         /* W  Receive data interrupt enable */
-       volatile unsigned char   eflag;         /* U  Host event flags          */
-
-       volatile unsigned char   tflag;         /* U  Transmit flags            */
-       volatile unsigned char   rflag;         /* U  Receive flags             */
-       volatile unsigned char   xmask;         /* U  Transmit ready flags      */
-       volatile unsigned char   xval;          /* U  Transmit ready value      */
-       volatile unsigned char   m_stat;        /* RC Modem status bits          */
-       volatile unsigned char   m_change;      /* U  Modem bits which changed  */
-       volatile unsigned char   m_int;         /* W  Modem interrupt enable bits */
-       volatile unsigned char   m_last;        /* U  Last modem status         */
-
-       volatile unsigned char   mtran;         /* C   Unreported modem trans   */
-       volatile unsigned char   orun;          /* C   Buffer overrun occurred  */
-       volatile unsigned char   astartc;       /* W   Auxiliary Xon char       */
-       volatile unsigned char   astopc;        /* W   Auxiliary Xoff char      */
-       volatile unsigned char   startc;        /* W   Xon character             */
-       volatile unsigned char   stopc;         /* W   Xoff character           */
-       volatile unsigned char   vnextc;        /* W   Vnext character           */
-       volatile unsigned char   hflow;         /* C   Software flow control    */
-       
-       volatile unsigned char   fillc;         /* U   Delay Fill character     */
-       volatile unsigned char   ochar;         /* U   Saved output character   */
-       volatile unsigned char   omask;         /* U   Output character mask    */
-
-       volatile unsigned char   bfill[13];     /* U   Reserved for expansion   */
-
-       volatile unsigned char   scc[16];       /* U   SCC registers            */
+       unsigned short  tp_jmp;         /* Transmit poll jump    */
+       unsigned short  tc_jmp;         /* Cooked procedure jump */
+       unsigned short  ri_jmp;         /* Not currently used    */
+       unsigned short  rp_jmp;         /* Receive poll jump     */
+
+       unsigned short  tx_seg;         /* W Tx segment  */
+       unsigned short  tx_head;        /* W Tx buffer head offset */
+       unsigned short  tx_tail;        /* R Tx buffer tail offset */
+       unsigned short  tx_max;         /* W Tx buffer size - 1    */
+
+       unsigned short  rx_seg;         /* W Rx segment     */
+       unsigned short  rx_head;        /* W Rx buffer head offset */
+       unsigned short  rx_tail;        /* R Rx buffer tail offset */
+       unsigned short  rx_max;         /* W Rx buffer size - 1    */
+
+       unsigned short  tx_lw;          /* W Tx buffer low water mark */
+       unsigned short  rx_lw;          /* W Rx buffer low water mark */
+       unsigned short  rx_hw;          /* W Rx buffer high water mark*/
+       unsigned short  incr;           /* W Increment to next channel*/
+
+       unsigned short  fepdev;         /* U SCC device base address  */
+       unsigned short  edelay;         /* W Exception delay          */
+       unsigned short  blen;           /* W Break length             */
+       unsigned short  btime;          /* U Break complete time      */
+
+       unsigned short  iflag;          /* C UNIX input flags         */
+       unsigned short  oflag;          /* C UNIX output flags        */
+       unsigned short  cflag;          /* C UNIX control flags       */
+       unsigned short  wfill[13];      /* U Reserved for expansion   */
+
+       unsigned char   num;            /* U Channel number           */
+       unsigned char   ract;           /* U Receiver active counter  */
+       unsigned char   bstat;          /* U Break status bits        */
+       unsigned char   tbusy;          /* W Transmit busy            */
+       unsigned char   iempty;         /* W Transmit empty event     */
+                                       /* enable                     */
+       unsigned char   ilow;           /* W Transmit low-water event */
+                                       /* enable                     */
+       unsigned char   idata;          /* W Receive data interrupt   */
+                                       /* enable                     */
+       unsigned char   eflag;          /* U Host event flags         */
+
+       unsigned char   tflag;          /* U Transmit flags           */
+       unsigned char   rflag;          /* U Receive flags            */
+       unsigned char   xmask;          /* U Transmit ready flags     */
+       unsigned char   xval;           /* U Transmit ready value     */
+       unsigned char   m_stat;         /* RC Modem status bits       */
+       unsigned char   m_change;       /* U Modem bits which changed */
+       unsigned char   m_int;          /* W Modem interrupt enable   */
+                                       /* bits                       */
+       unsigned char   m_last;         /* U Last modem status        */
+
+       unsigned char   mtran;          /* C Unreported modem trans   */
+       unsigned char   orun;           /* C Buffer overrun occurred  */
+       unsigned char   astartc;        /* W Auxiliary Xon char       */
+       unsigned char   astopc;         /* W Auxiliary Xoff char      */
+       unsigned char   startc;         /* W Xon character            */
+       unsigned char   stopc;          /* W Xoff character           */
+       unsigned char   vnextc;         /* W Vnext character          */
+       unsigned char   hflow;          /* C Software flow control    */
+
+       unsigned char   fillc;          /* U Delay Fill character     */
+       unsigned char   ochar;          /* U Saved output character   */
+       unsigned char   omask;          /* U Output character mask    */
+
+       unsigned char   bfill[13];      /* U Reserved for expansion   */
+
+       unsigned char   scc[16];        /* U SCC registers            */
 };
 
 struct cnode {
@@ -1225,7 +1170,7 @@ struct cnode {
 
        union {
                struct {
-                       char  type;     /* Board Type           */
+                       char  type;     /* Board Type           */
                        long  port;     /* I/O Address          */
                        char  *portstr; /* I/O Address in string */
                        long  addr;     /* Memory Address       */
@@ -1294,29 +1239,17 @@ struct cnode {
                } module;
 
                char *ttyname;
-
                char *cuname;
-
                char *printname;
-
                long majornumber;
-
                long altpin;
-
                long ttysize;
-
                long chsize;
-
                long bssize;
-
                long unsize;
-
                long f2size;
-
                long vpixsize;
-
                long useintr;
        } u;
 };
-
 #endif
index 93d65b0f0f83d6180a7d3cfb960e05619b081135..183af00532341919406768b0a361b45a2918d9c5 100644 (file)
@@ -5,7 +5,6 @@ Audio
 
 NAND
 ----
-- Switch from spinlock to mutex
 - Remove excess checking of parameters in calls
 - Use dma coherent memory not kmalloc/__pa for the memory (this is just
   a cleanliness issue not a correctness one)
index 7ac2602242f1f4e6527025b0b2566b52e01687f3..9243845418d64f61656f14716c5e79fd13ea3bff 100644 (file)
@@ -147,6 +147,7 @@ static ssize_t goldfish_audio_write(struct file *fp, const char __user *buf,
 
        while (count > 0) {
                ssize_t copy = count;
+
                if (copy > WRITE_BUFFER_SIZE)
                        copy = WRITE_BUFFER_SIZE;
                wait_event_interruptible(data->wait, (data->buffer_status &
index eca0873098cd5fccede95f5034d6a8015ce319cd..2a292df71e7c5d83bf8fdd1a3d86c590c00c73ae 100644 (file)
 #include <linux/vmalloc.h>
 #include <linux/mtd/mtd.h>
 #include <linux/platform_device.h>
+#include <linux/mutex.h>
 
 #include <asm/div64.h>
 
 #include "goldfish_nand_reg.h"
 
 struct goldfish_nand {
-       spinlock_t              lock;
+       struct mutex            lock;
        unsigned char __iomem  *base;
        struct cmd_params       *cmd_params;
        size_t                  mtd_count;
@@ -77,10 +78,9 @@ static u32 goldfish_nand_cmd(struct mtd_info *mtd, enum nand_cmd cmd,
 {
        struct goldfish_nand *nand = mtd->priv;
        u32 rv;
-       unsigned long irq_flags;
        unsigned char __iomem  *base = nand->base;
 
-       spin_lock_irqsave(&nand->lock, irq_flags);
+       mutex_lock(&nand->lock);
        if (goldfish_nand_cmd_with_params(mtd, cmd, addr, len, ptr, &rv)) {
                writel(mtd - nand->mtd, base + NAND_DEV);
                writel((u32)(addr >> 32), base + NAND_ADDR_HIGH);
@@ -90,7 +90,7 @@ static u32 goldfish_nand_cmd(struct mtd_info *mtd, enum nand_cmd cmd,
                writel(cmd, base + NAND_COMMAND);
                rv = readl(base + NAND_RESULT);
        }
-       spin_unlock_irqrestore(&nand->lock, irq_flags);
+       mutex_unlock(&nand->lock);
        return rv;
 }
 
@@ -307,12 +307,11 @@ static int goldfish_nand_init_device(struct platform_device *pdev,
        u32 name_len;
        u32 result;
        u32 flags;
-       unsigned long irq_flags;
        unsigned char __iomem  *base = nand->base;
        struct mtd_info *mtd = &nand->mtd[id];
        char *name;
 
-       spin_lock_irqsave(&nand->lock, irq_flags);
+       mutex_lock(&nand->lock);
        writel(id, base + NAND_DEV);
        flags = readl(base + NAND_DEV_FLAGS);
        name_len = readl(base + NAND_DEV_NAME_LEN);
@@ -329,7 +328,7 @@ static int goldfish_nand_init_device(struct platform_device *pdev,
                "goldfish nand dev%d: size %llx, page %d, extra %d, erase %d\n",
                       id, mtd->size, mtd->writesize,
                       mtd->oobsize, mtd->erasesize);
-       spin_unlock_irqrestore(&nand->lock, irq_flags);
+       mutex_unlock(&nand->lock);
 
        mtd->priv = nand;
 
@@ -405,7 +404,7 @@ static int goldfish_nand_probe(struct platform_device *pdev)
        if (nand == NULL)
                return -ENOMEM;
 
-       spin_lock_init(&nand->lock);
+       mutex_init(&nand->lock);
        nand->base = base;
        nand->mtd_count = num_dev;
        platform_set_drvdata(pdev, nand);
@@ -425,6 +424,7 @@ static int goldfish_nand_remove(struct platform_device *pdev)
 {
        struct goldfish_nand *nand = platform_get_drvdata(pdev);
        int i;
+
        for (i = 0; i < nand->mtd_count; i++) {
                if (nand->mtd[i].name)
                        mtd_device_unregister(&nand->mtd[i]);
index 0a60def92735e16566185d7d6eee8c30f4b7395d..fa9649879662f11464bc294adf9e2e7a82abe3db 100644 (file)
@@ -165,8 +165,9 @@ taos_i2c_read(struct i2c_client *client, u8 reg, u8 *val, unsigned int len)
                /* select register to write */
                ret = i2c_smbus_write_byte(client, (TSL258X_CMD_REG | reg));
                if (ret < 0) {
-                       dev_err(&client->dev, "taos_i2c_read failed to write"
-                               " register %x\n", reg);
+                       dev_err(&client->dev,
+                               "taos_i2c_read failed to write register %x\n",
+                               reg);
                        return ret;
                }
                /* read the data */
@@ -211,7 +212,7 @@ static int taos_get_lux(struct iio_dev *indio_dev)
        if (chip->taos_chip_status != TSL258X_CHIP_WORKING) {
                /* device is not enabled */
                dev_err(&chip->client->dev, "taos_get_lux device is not enabled\n");
-               ret = -EBUSY ;
+               ret = -EBUSY;
                goto out_unlock;
        }
 
@@ -231,8 +232,9 @@ static int taos_get_lux(struct iio_dev *indio_dev)
                int reg = TSL258X_CMD_REG | (TSL258X_ALS_CHAN0LO + i);
                ret = taos_i2c_read(chip->client, reg, &buf[i], 1);
                if (ret < 0) {
-                       dev_err(&chip->client->dev, "taos_get_lux failed to read"
-                               " register %x\n", reg);
+                       dev_err(&chip->client->dev,
+                               "taos_get_lux failed to read register %x\n",
+                               reg);
                        goto out_unlock;
                }
        }
@@ -449,7 +451,7 @@ static int taos_chip_on(struct iio_dev *indio_dev)
                }
        }
 
-       msleep(3);
+       usleep_range(3000, 3500);
        /* NOW enable the ADC
         * initialize the desired mode of operation */
        utmp = TSL258X_CNTL_PWR_ON | TSL258X_CNTL_ADC_ENBL;
@@ -809,9 +811,7 @@ static int taos_probe(struct i2c_client *clientp,
 
        if (!i2c_check_functionality(clientp->adapter,
                I2C_FUNC_SMBUS_BYTE_DATA)) {
-               dev_err(&clientp->dev,
-                       "taos_probe() - i2c smbus byte data "
-                       "functions unsupported\n");
+               dev_err(&clientp->dev, "taos_probe() - i2c smbus byte data func unsupported\n");
                return -EOPNOTSUPP;
        }
 
@@ -830,30 +830,32 @@ static int taos_probe(struct i2c_client *clientp,
                ret = i2c_smbus_write_byte(clientp,
                                (TSL258X_CMD_REG | (TSL258X_CNTRL + i)));
                if (ret < 0) {
-                       dev_err(&clientp->dev, "i2c_smbus_write_bytes() to cmd "
-                               "reg failed in taos_probe(), err = %d\n", ret);
+                       dev_err(&clientp->dev,
+                               "i2c_smbus_write_byte to cmd reg failed in taos_probe(), err = %d\n",
+                               ret);
                        return ret;
                }
                ret = i2c_smbus_read_byte(clientp);
                if (ret < 0) {
-                       dev_err(&clientp->dev, "i2c_smbus_read_byte from "
-                               "reg failed in taos_probe(), err = %d\n", ret);
-
+                       dev_err(&clientp->dev,
+                               "i2c_smbus_read_byte from reg failed in taos_probe(), err = %d\n",
+                               ret);
                        return ret;
                }
                buf[i] = ret;
        }
 
        if (!taos_tsl258x_device(buf)) {
-               dev_info(&clientp->dev, "i2c device found but does not match "
-                       "expected id in taos_probe()\n");
+               dev_info(&clientp->dev,
+                       "i2c device found but does not match expected id in taos_probe()\n");
                return -EINVAL;
        }
 
        ret = i2c_smbus_write_byte(clientp, (TSL258X_CMD_REG | TSL258X_CNTRL));
        if (ret < 0) {
-               dev_err(&clientp->dev, "i2c_smbus_write_byte() to cmd reg "
-                       "failed in taos_probe(), err = %d\n", ret);
+               dev_err(&clientp->dev,
+                       "i2c_smbus_write_byte() to cmd reg failed in taos_probe(), err = %d\n",
+                       ret);
                return ret;
        }
 
index 48a6afa8408805ff3a8f2ab25689ebccc3e419cf..38ecb4bb6e4c0ee167e5b9cb09822730cda6c741 100644 (file)
@@ -33,7 +33,8 @@ static int iio_trig_periodic_rtc_set_state(struct iio_trigger *trig, bool state)
        struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig);
        if (trig_info->frequency == 0)
                return -EINVAL;
-       printk(KERN_INFO "trigger frequency is %d\n", trig_info->frequency);
+       dev_info(&trig_info->rtc->dev, "trigger frequency is %d\n",
+                       trig_info->frequency);
        return rtc_irq_set_state(trig_info->rtc, &trig_info->task, state);
 }
 
index 77f1b421e957f158c9de7503d6c3309a74a89642..ef511c76a6e36eac338098f6209fd7af39856d44 100644 (file)
@@ -124,6 +124,7 @@ static int line6_send_raw_message_async_part(struct message *msg,
 static int line6_start_listen(struct usb_line6 *line6)
 {
        int err;
+
        usb_fill_int_urb(line6->urb_listen, line6->usbdev,
                         usb_rcvintpipe(line6->usbdev, line6->ep_control_read),
                         line6->buffer_listen, LINE6_BUFSIZE_LISTEN,
index 661080b3c39df8c2f8e1c43ed9473d4eb603cc25..a3136b189ee5bc7f670f96379e81e0f58c253871 100644 (file)
@@ -475,7 +475,7 @@ int line6_init_pcm(struct usb_line6 *line6,
                MISSING_CASE;
        }
 
-       line6pcm = kzalloc(sizeof(struct snd_line6_pcm), GFP_KERNEL);
+       line6pcm = kzalloc(sizeof(*line6pcm), GFP_KERNEL);
 
        if (line6pcm == NULL)
                return -ENOMEM;
index 41869caf19a70d2b250aaffba94cf6df9f0f67c9..0f72db5665fef43479d6477136ae0ae0970f7643 100644 (file)
@@ -34,6 +34,7 @@ static void change_volume(struct urb *urb_out, int volume[],
 
        if (bytes_per_frame == 4) {
                short *p, *buf_end;
+
                p = (short *)urb_out->transfer_buffer;
                buf_end = p + urb_out->transfer_buffer_length / sizeof(*p);
 
@@ -48,6 +49,7 @@ static void change_volume(struct urb *urb_out, int volume[],
 
                for (; p < buf_end; p += 3) {
                        int val;
+
                        val = p[0] + (p[1] << 8) + ((signed char)p[2] << 16);
                        val = (val * volume[chn & 1]) >> 8;
                        p[0] = val;
@@ -116,6 +118,7 @@ static void add_monitor_signal(struct urb *urb_out, unsigned char *signal,
 
        if (bytes_per_frame == 4) {
                short *pi, *po, *buf_end;
+
                pi = (short *)signal;
                po = (short *)urb_out->transfer_buffer;
                buf_end = po + urb_out->transfer_buffer_length / sizeof(*po);
@@ -171,6 +174,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
 
                if (fsize == 0) {
                        int n;
+
                        line6pcm->count_out += frame_increment;
                        n = line6pcm->count_out / frame_factor;
                        line6pcm->count_out -= n * frame_factor;
@@ -207,6 +211,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
                           copy the data to the temp buffer.
                         */
                        int len;
+
                        len = runtime->buffer_size - line6pcm->pos_out;
 
                        if (len > 0) {
index af2e7e50c135079cb7fa97154fdd72000458d39e..dcab6478a3b3fe16d8dd17daadd7ddf28a9deb86 100644 (file)
@@ -213,6 +213,7 @@ static int snd_toneport_source_info(struct snd_kcontrol *kcontrol,
                                    struct snd_ctl_elem_info *uinfo)
 {
        const int size = ARRAY_SIZE(toneport_source_info);
+
        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
        uinfo->count = 1;
        uinfo->value.enumerated.items = size;
index c87efb49ebc28f49c6d119a95a6d95f2fd91372f..d116fdfc5c417238d85abf0e9155399288998744 100644 (file)
@@ -128,7 +128,7 @@ struct cfs_cpt_table *cfs_cpt_table_alloc(unsigned int ncpt);
 int
 cfs_cpt_number(struct cfs_cpt_table *cptab);
 /**
- * return number of HW cores or hypter-threadings in a CPU partition \a cpt
+ * return number of HW cores or hyper-threadings in a CPU partition \a cpt
  */
 int cfs_cpt_weight(struct cfs_cpt_table *cptab, int cpt);
 /**
@@ -152,7 +152,7 @@ int cfs_cpt_of_cpu(struct cfs_cpt_table *cptab, int cpu);
  */
 int cfs_cpt_bind(struct cfs_cpt_table *cptab, int cpt);
 /**
- * add \a cpu to CPU partion @cpt of \a cptab, return 1 for success,
+ * add \a cpu to CPU partition @cpt of \a cptab, return 1 for success,
  * otherwise 0 is returned
  */
 int cfs_cpt_set_cpu(struct cfs_cpt_table *cptab, int cpt, int cpu);
index 776e9c0e48c13742170523c4934d5056d6886080..9e610a9ce51f97bfa7ee6a4c2a2ea750f734be48 100644 (file)
@@ -31,7 +31,7 @@
 struct cfs_crypto_hash_type {
        char            *cht_name;      /**< hash algorithm name, equal to
                                         * format name for crypto api */
-       unsigned int    cht_key;        /**< init key by default (vaild for
+       unsigned int    cht_key;        /**< init key by default (valid for
                                         * 4 bytes context like crc32, adler */
        unsigned int    cht_size;       /**< hash digest size */
 };
index 2bd4885ce06cb669dee19c1403d6941f4b33cc28..b270d84def98a823bbf30a5f9ce86aeb8b5763b5 100644 (file)
@@ -183,7 +183,7 @@ struct libcfs_debug_msg_data {
 do {                                                           \
        (data)->msg_subsys = DEBUG_SUBSYSTEM;                   \
        (data)->msg_file   = __FILE__;                          \
-       (data)->msg_fn     = __FUNCTION__;                      \
+       (data)->msg_fn     = __func__;                          \
        (data)->msg_line   = __LINE__;                          \
        (data)->msg_cdls   = (cdls);                            \
        (data)->msg_mask   = (mask);                            \
@@ -193,7 +193,7 @@ do {                                                                \
        static struct libcfs_debug_msg_data dataname = {        \
               .msg_subsys = DEBUG_SUBSYSTEM,                   \
               .msg_file   = __FILE__,                          \
-              .msg_fn     = __FUNCTION__,                      \
+              .msg_fn     = __func__,                          \
               .msg_line   = __LINE__,                          \
               .msg_cdls   = (cdls)      };                     \
        dataname.msg_mask   = (mask);
index e5d5db2556225a7e8f612decadc2736da3e00040..954164361ca405231d42a85366d4086e9c158d48 100644 (file)
@@ -59,8 +59,8 @@
 /*
  * Ideally we would use HAVE_HASH_LONG for this, but on linux we configure
  * the linux kernel and user space at the same time, so we need to differentiate
- * between them explicitely. If this is not needed on other architectures, then
- * we'll need to move the functions to archi specific headers.
+ * between them explicitly. If this is not needed on other architectures, then
+ * we'll need to move the functions to architecture specific headers.
  */
 
 #include <linux/hash.h>
@@ -86,7 +86,7 @@ union cfs_hash_lock {
 
 /**
  * cfs_hash_bucket is a container of:
- * - lock, couter ...
+ * - lock, counter ...
  * - array of hash-head starting from hsb_head[0], hash-head can be one of
  *   . cfs_hash_head_t
  *   . cfs_hash_head_dep_t
@@ -136,7 +136,7 @@ enum cfs_hash_tag {
        CFS_HASH_NO_BKTLOCK     = 1 << 1,
        /** rwlock to protect bucket */
        CFS_HASH_RW_BKTLOCK     = 1 << 2,
-       /** spinlcok to protect bucket */
+       /** spinlock to protect bucket */
        CFS_HASH_SPIN_BKTLOCK   = 1 << 3,
        /** always add new item to tail */
        CFS_HASH_ADD_TAIL       = 1 << 4,
index 856fcfaafafa702f7140c435e86967230ffc8f95..06ff463e4af635e4a9afacb3fe7956cf5eb127b9 100644 (file)
@@ -181,7 +181,7 @@ lnet_net_lock_current(void)
 #define MAX_PORTALS     64
 
 /* these are only used by code with LNET_USE_LIB_FREELIST, but we still
- * exported them to !LNET_USE_LIB_FREELIST for easy implemetation */
+ * exported them to !LNET_USE_LIB_FREELIST for easy implementation */
 #define LNET_FL_MAX_MES                2048
 #define LNET_FL_MAX_MDS                2048
 #define LNET_FL_MAX_EQS                512
index 1c13ef7df80e0e0b26a2cb0e4c396c10177cb001..a63654b660de4523636085c0240a8172d85ef52e 100644 (file)
@@ -204,7 +204,7 @@ typedef struct lnet_msg {
        unsigned int      msg_receiving:1;    /* being received */
        unsigned int      msg_txcredit:1;     /* taken an NI send credit */
        unsigned int      msg_peertxcredit:1; /* taken a peer send credit */
-       unsigned int      msg_rtrcredit:1;    /* taken a globel router credit */
+       unsigned int      msg_rtrcredit:1;    /* taken a global router credit */
        unsigned int      msg_peerrtrcredit:1; /* taken a peer router credit */
        unsigned int      msg_onactivelist:1; /* on the activelist */
 
@@ -342,7 +342,7 @@ typedef struct lnet_lnd {
 
        /* Start receiving 'mlen' bytes of payload data, skipping the following
         * 'rlen' - 'mlen' bytes. 'private' is the 'private' passed to
-        * lnet_parse().  Return non-zero for immedaite failure, otherwise
+        * lnet_parse().  Return non-zero for immediate failure, otherwise
         * complete later with lnet_finalize().  This also gives back a receive
         * credit if the LND does flow control. */
        int (*lnd_recv)(struct lnet_ni *ni, void *private, lnet_msg_t *msg,
@@ -594,7 +594,7 @@ struct lnet_match_table {
        unsigned int            mt_cpt;
        unsigned int            mt_portal;      /* portal index */
        /* match table is set as "enabled" if there's non-exhausted MD
-        * attached on mt_mhash, it's only valide for wildcard portal */
+        * attached on mt_mhash, it's only valid for wildcard portal */
        unsigned int            mt_enabled;
        /* bitmap to flag whether MEs on mt_hash are exhausted or not */
        __u64                   mt_exhausted[LNET_MT_EXHAUSTED_BMAP];
index e060599314d587c09ef6cae2708bf43e31ea2d32..87fe9ac76a6ca8e7b75c0084dd2df17ae509d608 100644 (file)
@@ -402,7 +402,7 @@ typedef struct {
 /* add stat in session */
 typedef struct {
        int                  lstio_sta_key;       /* IN: session key */
-       int                  lstio_sta_timeout;      /* IN: timeout for stat requst */
+       int                  lstio_sta_timeout;      /* IN: timeout for stat request */
        int                  lstio_sta_nmlen;   /* IN: group name length */
        char               *lstio_sta_namep;    /* IN: group name */
        int                  lstio_sta_count;   /* IN: # of pid */
index 564f5d3a9b4d0d41ba972bb2d3921e621f5e3c19..313442a7ed3e0f1f20a17726f58b56a86f6115fd 100644 (file)
@@ -66,7 +66,7 @@
 /*#define PTL_MD_LUSTRE_COMPLETION_SEMANTICS */
 
 /* Can compare handles directly on Cray Portals */
-#define PtlHandleIsEqual(a,b) ((a) == (b))
+#define PtlHandleIsEqual(a, b) ((a) == (b))
 
 /* Different error types on Cray Portals*/
 #define ptl_err_t ptl_ni_fail_t
index 7d12b3a23a964cf2637b5a0fd27302616633770c..0d3ec5be0a00a202303a217f4c158432e9c1147d 100644 (file)
                                         * above is for bulk data transfer */
 #define LNET_MSG_MATCHBITS       0      /* the value for the message channel */
 
-typedef struct
-{
+typedef struct {
        lnet_hdr_t      kptlim_hdr;          /* portals header */
        char          kptlim_payload[0];      /* piggy-backed payload */
 } WIRE_ATTR kptl_immediate_msg_t;
 
-typedef struct
-{
+typedef struct {
        lnet_hdr_t      kptlrm_hdr;          /* portals header */
        __u64        kptlrm_matchbits;       /* matchbits */
 } WIRE_ATTR kptl_rdma_msg_t;
 
-typedef struct
-{
+typedef struct {
        __u64        kptlhm_matchbits;       /* matchbits */
        __u32        kptlhm_max_msg_size;    /* max message size */
 } WIRE_ATTR kptl_hello_msg_t;
 
-typedef struct
-{
+typedef struct {
        /* First 2 fields fixed FOR ALL TIME */
        __u32      ptlm_magic;     /* I'm a Portals LND message */
        __u16      ptlm_version;   /* this is my version number */
@@ -107,7 +103,7 @@ typedef struct
 } kptl_msg_t;
 
 /* kptl_msg_t::ptlm_credits is only a __u8 */
-#define PTLLND_MSG_MAX_CREDITS ((typeof(((kptl_msg_t*) 0)->ptlm_credits)) -1)
+#define PTLLND_MSG_MAX_CREDITS ((typeof(((kptl_msg_t*) 0)->ptlm_credits)) - 1)
 
 #define PTLLND_MSG_MAGIC               LNET_PROTO_PTL_MAGIC
 #define PTLLND_MSG_VERSION           0x04
index c833ce8544d3cb3a92df25e3040954c1cce07ce1..2add7976b3b225f1b305739c0286279e36864a4c 100644 (file)
@@ -112,7 +112,7 @@ static inline void LNetInvalidateHandle(lnet_handle_any_t *h)
  */
 static inline int LNetHandleIsEqual (lnet_handle_any_t h1, lnet_handle_any_t h2)
 {
-       return (h1.cookie == h2.cookie);
+       return h1.cookie == h2.cookie;
 }
 
 /**
@@ -122,7 +122,7 @@ static inline int LNetHandleIsEqual (lnet_handle_any_t h1, lnet_handle_any_t h2)
  */
 static inline int LNetHandleIsInvalid(lnet_handle_any_t h)
 {
-       return (LNET_WIRE_HANDLE_COOKIE_NONE == h.cookie);
+       return LNET_WIRE_HANDLE_COOKIE_NONE == h.cookie;
 }
 
 /**
@@ -181,7 +181,7 @@ typedef struct {
         * address of an array of lnet_kiov_t and the length field specifies
         * the number of entries in the array. The length can't be bigger
         * than LNET_MAX_IOV. The lnet_kiov_t is used to describe page-based
-        * fragments that are not necessarily mapped in virtal memory.
+        * fragments that are not necessarily mapped in virtual memory.
         * - LNET_MD_IOVEC bit set: The start field points to the starting
         * address of an array of struct iovec and the length field specifies
         * the number of entries in the array. The length can't be bigger
@@ -381,7 +381,7 @@ typedef enum {
 
 #define LNET_SEQ_BASETYPE       long
 typedef unsigned LNET_SEQ_BASETYPE lnet_seq_t;
-#define LNET_SEQ_GT(a,b)       (((signed LNET_SEQ_BASETYPE)((a) - (b))) > 0)
+#define LNET_SEQ_GT(a, b)      (((signed LNET_SEQ_BASETYPE)((a) - (b))) > 0)
 
 /**
  * Information about an event on a MD.
index dc36f75eb6353fce182dab039ecdad6155f13ed4..fea7e6cd44c303fe001ba53b702cbde6b4f0b717 100644 (file)
@@ -104,7 +104,7 @@ static inline void __client_obd_list_lock(client_obd_lock_t *lock,
 }
 
 #define client_obd_list_lock(lock) \
-       __client_obd_list_lock(lock, __FUNCTION__, __LINE__)
+       __client_obd_list_lock(lock, __func__, __LINE__)
 
 static inline void client_obd_list_unlock(client_obd_lock_t *lock)
 {
index 50a2a7f786dc5d4fbbcad62da76f63d605e14114..b451a888ca3a54c68d8c4ba60bf837a5435d1745 100644 (file)
  *
  *     // current thread acquired a temporary reference to foo.
  *     foo_get(foo);
- *     lu_ref_add(&foo->reference, __FUNCTION__, current);
+ *     lu_ref_add(&foo->reference, __func__, current);
  *
  *     ...
  *
  *     // temporary reference is released.
- *     lu_ref_del(&foo->reference, __FUNCTION__, current);
+ *     lu_ref_del(&foo->reference, __func__, current);
  *     foo_put(foo);
  * \endcode
  *
index 3e25f001c07d6889188891f3289d45acb31d7074..ed103133165e1c7d01e6b4482817e031e0fa1973 100644 (file)
@@ -1312,11 +1312,11 @@ int ldlm_lock_change_resource(struct ldlm_namespace *, struct ldlm_lock *,
                              const struct ldlm_res_id *);
 
 #define LDLM_RESOURCE_ADDREF(res) do {                           \
-       lu_ref_add_atomic(&(res)->lr_reference, __FUNCTION__, current);  \
+       lu_ref_add_atomic(&(res)->lr_reference, __func__, current);  \
 } while (0)
 
 #define LDLM_RESOURCE_DELREF(res) do {                           \
-       lu_ref_del(&(res)->lr_reference, __FUNCTION__, current);  \
+       lu_ref_del(&(res)->lr_reference, __func__, current);      \
 } while (0)
 
 /* ldlm_request.c */
index ba16fd5db704d775cd84deb3f53c38c34a59c5f5..0a03bf7ba3eb2e907425f980d7c8208ce46697cc 100644 (file)
@@ -75,7 +75,7 @@ typedef struct cfs_wi_sched {
        char                    ws_name[CFS_WS_NAME_LEN];
 } cfs_wi_sched_t;
 
-struct cfs_workitem_data {
+static struct cfs_workitem_data {
        /** serialize */
        spinlock_t              wi_glock;
        /** list of all schedulers */
index 5d5c3081c4670d3ce965651f34ff00a12bc424ad..ae73c82ce499ffc585d4afc81d5c36637bbb44e9 100644 (file)
@@ -200,19 +200,19 @@ static int lmv_target_seq_open(struct inode *inode, struct file *file)
 LPROC_SEQ_FOPS_RO_TYPE(lmv, uuid);
 
 struct lprocfs_vars lprocfs_lmv_obd_vars[] = {
-       { "numobd",       &lmv_numobd_fops,       0, 0 },
-       { "placement",    &lmv_placement_fops,    0, 0 },
-       { "activeobd",    &lmv_activeobd_fops,    0, 0 },
-       { "uuid",         &lmv_uuid_fops,         0, 0 },
-       { "desc_uuid",    &lmv_desc_uuid_fops,    0, 0 },
-       { 0 }
+       { "numobd",       &lmv_numobd_fops,       NULL, 0 },
+       { "placement",    &lmv_placement_fops,    NULL, 0 },
+       { "activeobd",    &lmv_activeobd_fops,    NULL, 0 },
+       { "uuid",         &lmv_uuid_fops,         NULL, 0 },
+       { "desc_uuid",    &lmv_desc_uuid_fops,    NULL, 0 },
+       { NULL }
 };
 
 LPROC_SEQ_FOPS_RO_TYPE(lmv, numrefs);
 
 static struct lprocfs_vars lprocfs_lmv_module_vars[] = {
-       { "num_refs",      &lmv_numrefs_fops, 0, 0 },
-       { 0 }
+       { "num_refs",      &lmv_numrefs_fops, NULL, 0 },
+       { NULL }
 };
 
 struct file_operations lmv_proc_target_fops = {
index d795cef3f16452658eb6408644f1952b0010149b..8eb1785645ba0807ccc4ac94c72e763fcdcbe6ae 100644 (file)
@@ -139,7 +139,7 @@ static void cl_lock_trace0(int level, const struct lu_env *env,
               func, line);
 }
 #define cl_lock_trace(level, env, prefix, lock)                         \
-       cl_lock_trace0(level, env, prefix, lock, __FUNCTION__, __LINE__)
+       cl_lock_trace0(level, env, prefix, lock, __func__, __LINE__)
 
 #define RETIP ((unsigned long)__builtin_return_address(0))
 
index f2bdea33041da230bd5430834b055fc6bc04a4e1..350b6f079d927926dba46e3853865fa3639a992c 100644 (file)
@@ -615,13 +615,13 @@ int class_notify_sptlrpc_conf(const char *fsname, int namelen)
                if (strncmp(obd->obd_name, fsname, namelen))
                        continue;
 
-               class_incref(obd, __FUNCTION__, obd);
+               class_incref(obd, __func__, obd);
                read_unlock(&obd_dev_lock);
                rc2 = obd_set_info_async(NULL, obd->obd_self_export,
                                         sizeof(KEY_SPTLRPC_CONF),
                                         KEY_SPTLRPC_CONF, 0, NULL, NULL);
                rc = rc ? rc : rc2;
-               class_decref(obd, __FUNCTION__, obd);
+               class_decref(obd, __func__, obd);
                read_lock(&obd_dev_lock);
        }
        read_unlock(&obd_dev_lock);
index ba20776ebfa142ec36ee358ba67287d782ecdf57..e4e94cc1713d2508bb7bc87587832d783f9d9508 100644 (file)
@@ -244,7 +244,7 @@ static int obd_proc_health_seq_show(struct seq_file *m, void *v)
                if (obd->obd_stopping)
                        continue;
 
-               class_incref(obd, __FUNCTION__, current);
+               class_incref(obd, __func__, current);
                read_unlock(&obd_dev_lock);
 
                if (obd_health_check(NULL, obd)) {
@@ -252,7 +252,7 @@ static int obd_proc_health_seq_show(struct seq_file *m, void *v)
                                      obd->obd_name);
                        rc++;
                }
-               class_decref(obd, __FUNCTION__, current);
+               class_decref(obd, __func__, current);
                read_lock(&obd_dev_lock);
        }
        read_unlock(&obd_dev_lock);
index 6f8ba54e9667a3558690cdfabbf17b1861c018eb..419a32361359d16f0f0c437fc4bf069d34ec1c00 100644 (file)
@@ -187,7 +187,7 @@ int lustre_start_simple(char *obdname, char *type, char *uuid,
        int rc;
        CDEBUG(D_MOUNT, "Starting obd %s (typ=%s)\n", obdname, type);
 
-       rc = do_lcfg(obdname, 0, LCFG_ATTACH, type, uuid, 0, 0);
+       rc = do_lcfg(obdname, 0, LCFG_ATTACH, type, uuid, NULL, NULL);
        if (rc) {
                CERROR("%s attach error %d\n", obdname, rc);
                return rc;
@@ -195,7 +195,7 @@ int lustre_start_simple(char *obdname, char *type, char *uuid,
        rc = do_lcfg(obdname, 0, LCFG_SETUP, s1, s2, s3, s4);
        if (rc) {
                CERROR("%s setup error %d\n", obdname, rc);
-               do_lcfg(obdname, 0, LCFG_DETACH, 0, 0, 0, 0);
+               do_lcfg(obdname, 0, LCFG_DETACH, NULL, NULL, NULL, NULL);
        }
        return rc;
 }
@@ -337,7 +337,8 @@ int lustre_start_mgc(struct super_block *sb)
                        lnet_process_id_t id;
                        while ((rc = LNetGetId(i++, &id)) != -ENOENT) {
                                rc = do_lcfg(mgcname, id.nid,
-                                            LCFG_ADD_UUID, niduuid, 0,0,0);
+                                            LCFG_ADD_UUID, niduuid,
+                                            NULL, NULL, NULL);
                        }
                } else {
                        /* Use mgsnode= nids */
@@ -351,7 +352,8 @@ int lustre_start_mgc(struct super_block *sb)
                        }
                        while (class_parse_nid(ptr, &nid, &ptr) == 0) {
                                rc = do_lcfg(mgcname, nid,
-                                            LCFG_ADD_UUID, niduuid, 0,0,0);
+                                            LCFG_ADD_UUID, niduuid,
+                                            NULL, NULL, NULL);
                                i++;
                        }
                }
@@ -360,7 +362,7 @@ int lustre_start_mgc(struct super_block *sb)
                ptr = lsi->lsi_lmd->lmd_dev;
                while (class_parse_nid(ptr, &nid, &ptr) == 0) {
                        rc = do_lcfg(mgcname, nid,
-                                    LCFG_ADD_UUID, niduuid, 0,0,0);
+                                    LCFG_ADD_UUID, niduuid, NULL, NULL, NULL);
                        i++;
                        /* Stop at the first failover nid */
                        if (*ptr == ':')
@@ -396,13 +398,13 @@ int lustre_start_mgc(struct super_block *sb)
                while (class_parse_nid_quiet(ptr, &nid, &ptr) == 0) {
                        j++;
                        rc = do_lcfg(mgcname, nid,
-                                    LCFG_ADD_UUID, niduuid, 0,0,0);
+                                    LCFG_ADD_UUID, niduuid, NULL, NULL, NULL);
                        if (*ptr == ':')
                                break;
                }
                if (j > 0) {
                        rc = do_lcfg(mgcname, 0, LCFG_ADD_CONN,
-                                    niduuid, 0, 0, 0);
+                                    niduuid, NULL, NULL, NULL);
                        i++;
                } else {
                        /* at ":/fsname" */
@@ -532,7 +534,7 @@ static int lustre_stop_mgc(struct super_block *sb)
        for (i = 0; i < lsi->lsi_lmd->lmd_mgs_failnodes; i++) {
                sprintf(ptr, "_%x", i);
                rc = do_lcfg(LUSTRE_MGC_OBDNAME, 0, LCFG_DEL_UUID,
-                            niduuid, 0, 0, 0);
+                            niduuid, NULL, NULL, NULL);
                if (rc)
                        CERROR("del MDC UUID %s failed: rc = %d\n",
                               niduuid, rc);
index 58f1c8bf25b0b41a207dccb86186a0e7169c9dda..7a422ff759bfbd0a55263aba5ae58d57dc76f38f 100644 (file)
@@ -1190,7 +1190,7 @@ int lprocfs_wr_evict_client(struct file *file, const char *buffer,
         * the proc entries under the being destroyed export{}, so I have
         * to drop the lock at first here.
         * - jay, jxiong@clusterfs.com */
-       class_incref(obd, __FUNCTION__, current);
+       class_incref(obd, __func__, current);
 
        if (strncmp(tmpbuf, "nid:", 4) == 0)
                obd_export_evict_by_nid(obd, tmpbuf + 4);
@@ -1199,7 +1199,7 @@ int lprocfs_wr_evict_client(struct file *file, const char *buffer,
        else
                obd_export_evict_by_uuid(obd, tmpbuf);
 
-       class_decref(obd, __FUNCTION__, current);
+       class_decref(obd, __func__, current);
 
 out:
        OBD_FREE(kbuf, BUFLEN);
index d80418057f296f7167b3355f56c689e051cd4c01..b0a1c5a0d5cc803e45526033c0689d8a5f236d1f 100644 (file)
@@ -354,7 +354,7 @@ static int import_sec_check_expire(struct obd_import *imp)
                return 0;
 
        CDEBUG(D_SEC, "found delayed sec adapt expired, do it now\n");
-       return sptlrpc_import_sec_adapt(imp, NULL, 0);
+       return sptlrpc_import_sec_adapt(imp, NULL, NULL);
 }
 
 static int import_sec_validate_get(struct obd_import *imp,
index 08f9a4896116a3c4368a616d134a2d5a065f9371..136671a50d6e54ce08007422d0c4335d0ad4fd5d 100644 (file)
@@ -867,6 +867,7 @@ static void lcd_print(char c)
 static void lcd_clear_fast_s(void)
 {
        int pos;
+
        lcd_addr_x = lcd_addr_y = 0;
        lcd_gotoxy();
 
@@ -887,6 +888,7 @@ static void lcd_clear_fast_s(void)
 static void lcd_clear_fast_p8(void)
 {
        int pos;
+
        lcd_addr_x = lcd_addr_y = 0;
        lcd_gotoxy();
 
@@ -922,6 +924,7 @@ static void lcd_clear_fast_p8(void)
 static void lcd_clear_fast_tilcd(void)
 {
        int pos;
+
        lcd_addr_x = lcd_addr_y = 0;
        lcd_gotoxy();
 
@@ -1092,6 +1095,7 @@ static inline int handle_lcd_special_code(void)
                break;
        case 'k': {     /* kill end of line */
                int x;
+
                for (x = lcd_addr_x; x < lcd_bwidth; x++)
                        lcd_write_data(' ');
 
@@ -1217,111 +1221,113 @@ static inline int handle_lcd_special_code(void)
        return processed;
 }
 
+static void lcd_write_char(char c)
+{
+       /* first, we'll test if we're in escape mode */
+       if ((c != '\n') && lcd_escape_len >= 0) {
+               /* yes, let's add this char to the buffer */
+               lcd_escape[lcd_escape_len++] = c;
+               lcd_escape[lcd_escape_len] = 0;
+       } else {
+               /* aborts any previous escape sequence */
+               lcd_escape_len = -1;
+
+               switch (c) {
+               case LCD_ESCAPE_CHAR:
+                       /* start of an escape sequence */
+                       lcd_escape_len = 0;
+                       lcd_escape[lcd_escape_len] = 0;
+                       break;
+               case '\b':
+                       /* go back one char and clear it */
+                       if (lcd_addr_x > 0) {
+                               /* check if we're not at the
+                                  end of the line */
+                               if (lcd_addr_x < lcd_bwidth)
+                                       /* back one char */
+                                       lcd_write_cmd(0x10);
+                               lcd_addr_x--;
+                       }
+                       /* replace with a space */
+                       lcd_write_data(' ');
+                       /* back one char again */
+                       lcd_write_cmd(0x10);
+                       break;
+               case '\014':
+                       /* quickly clear the display */
+                       lcd_clear_fast();
+                       break;
+               case '\n':
+                       /* flush the remainder of the current line and
+                          go to the beginning of the next line */
+                       for (; lcd_addr_x < lcd_bwidth; lcd_addr_x++)
+                               lcd_write_data(' ');
+                       lcd_addr_x = 0;
+                       lcd_addr_y = (lcd_addr_y + 1) % lcd_height;
+                       lcd_gotoxy();
+                       break;
+               case '\r':
+                       /* go to the beginning of the same line */
+                       lcd_addr_x = 0;
+                       lcd_gotoxy();
+                       break;
+               case '\t':
+                       /* print a space instead of the tab */
+                       lcd_print(' ');
+                       break;
+               default:
+                       /* simply print this char */
+                       lcd_print(c);
+                       break;
+               }
+       }
+
+       /* now we'll see if we're in an escape mode and if the current
+          escape sequence can be understood. */
+       if (lcd_escape_len >= 2) {
+               int processed = 0;
+
+               if (!strcmp(lcd_escape, "[2J")) {
+                       /* clear the display */
+                       lcd_clear_fast();
+                       processed = 1;
+               } else if (!strcmp(lcd_escape, "[H")) {
+                       /* cursor to home */
+                       lcd_addr_x = lcd_addr_y = 0;
+                       lcd_gotoxy();
+                       processed = 1;
+               }
+               /* codes starting with ^[[L */
+               else if ((lcd_escape_len >= 3) &&
+                        (lcd_escape[0] == '[') &&
+                        (lcd_escape[1] == 'L')) {
+                       processed = handle_lcd_special_code();
+               }
+
+               /* LCD special escape codes */
+               /* flush the escape sequence if it's been processed
+                  or if it is getting too long. */
+               if (processed || (lcd_escape_len >= LCD_ESCAPE_LEN))
+                       lcd_escape_len = -1;
+       } /* escape codes */
+}
+
 static ssize_t lcd_write(struct file *file,
-                        const char *buf, size_t count, loff_t *ppos)
+       const char __user *buf, size_t count, loff_t *ppos)
 {
-       const char *tmp = buf;
+       const char __user *tmp = buf;
        char c;
 
-       for (; count-- > 0; (ppos ? (*ppos)++ : 0), ++tmp) {
+       for (; count-- > 0; (*ppos)++, tmp++) {
                if (!in_interrupt() && (((count + 1) & 0x1f) == 0))
                        /* let's be a little nice with other processes
                           that need some CPU */
                        schedule();
 
-               if (ppos == NULL && file == NULL)
-                       /* let's not use get_user() from the kernel ! */
-                       c = *tmp;
-               else if (get_user(c, tmp))
+               if (get_user(c, buf))
                        return -EFAULT;
 
-               /* first, we'll test if we're in escape mode */
-               if ((c != '\n') && lcd_escape_len >= 0) {
-                       /* yes, let's add this char to the buffer */
-                       lcd_escape[lcd_escape_len++] = c;
-                       lcd_escape[lcd_escape_len] = 0;
-               } else {
-                       /* aborts any previous escape sequence */
-                       lcd_escape_len = -1;
-
-                       switch (c) {
-                       case LCD_ESCAPE_CHAR:
-                               /* start of an escape sequence */
-                               lcd_escape_len = 0;
-                               lcd_escape[lcd_escape_len] = 0;
-                               break;
-                       case '\b':
-                               /* go back one char and clear it */
-                               if (lcd_addr_x > 0) {
-                                       /* check if we're not at the
-                                          end of the line */
-                                       if (lcd_addr_x < lcd_bwidth)
-                                               /* back one char */
-                                               lcd_write_cmd(0x10);
-                                       lcd_addr_x--;
-                               }
-                               /* replace with a space */
-                               lcd_write_data(' ');
-                               /* back one char again */
-                               lcd_write_cmd(0x10);
-                               break;
-                       case '\014':
-                               /* quickly clear the display */
-                               lcd_clear_fast();
-                               break;
-                       case '\n':
-                               /* flush the remainder of the current line and
-                                  go to the beginning of the next line */
-                               for (; lcd_addr_x < lcd_bwidth; lcd_addr_x++)
-                                       lcd_write_data(' ');
-                               lcd_addr_x = 0;
-                               lcd_addr_y = (lcd_addr_y + 1) % lcd_height;
-                               lcd_gotoxy();
-                               break;
-                       case '\r':
-                               /* go to the beginning of the same line */
-                               lcd_addr_x = 0;
-                               lcd_gotoxy();
-                               break;
-                       case '\t':
-                               /* print a space instead of the tab */
-                               lcd_print(' ');
-                               break;
-                       default:
-                               /* simply print this char */
-                               lcd_print(c);
-                               break;
-                       }
-               }
-
-               /* now we'll see if we're in an escape mode and if the current
-                  escape sequence can be understood. */
-               if (lcd_escape_len >= 2) {
-                       int processed = 0;
-
-                       if (!strcmp(lcd_escape, "[2J")) {
-                               /* clear the display */
-                               lcd_clear_fast();
-                               processed = 1;
-                       } else if (!strcmp(lcd_escape, "[H")) {
-                               /* cursor to home */
-                               lcd_addr_x = lcd_addr_y = 0;
-                               lcd_gotoxy();
-                               processed = 1;
-                       }
-                       /* codes starting with ^[[L */
-                       else if ((lcd_escape_len >= 3) &&
-                                (lcd_escape[0] == '[') &&
-                                (lcd_escape[1] == 'L')) {
-                               processed = handle_lcd_special_code();
-                       }
-
-                       /* LCD special escape codes */
-                       /* flush the escape sequence if it's been processed
-                          or if it is getting too long. */
-                       if (processed || (lcd_escape_len >= LCD_ESCAPE_LEN))
-                               lcd_escape_len = -1;
-               } /* escape codes */
+               lcd_write_char(c);
        }
 
        return tmp - buf;
@@ -1365,8 +1371,19 @@ static struct miscdevice lcd_dev = {
 /* public function usable from the kernel for any purpose */
 static void panel_lcd_print(const char *s)
 {
-       if (lcd_enabled && lcd_initialized)
-               lcd_write(NULL, s, strlen(s), NULL);
+       const char *tmp = s;
+       int count = strlen(s);
+
+       if (lcd_enabled && lcd_initialized) {
+               for (; count-- > 0; tmp++) {
+                       if (!in_interrupt() && (((count + 1) & 0x1f) == 0))
+                               /* let's be a little nice with other processes
+                                  that need some CPU */
+                               schedule();
+
+                       lcd_write_char(*tmp);
+               }
+       }
 }
 
 /* initialize the LCD driver */
@@ -1571,11 +1588,11 @@ static void lcd_init(void)
  */
 
 static ssize_t keypad_read(struct file *file,
-                          char *buf, size_t count, loff_t *ppos)
+                          char __user *buf, size_t count, loff_t *ppos)
 {
 
        unsigned i = *ppos;
-       char *tmp = buf;
+       char __user *tmp = buf;
 
        if (keypad_buflen == 0) {
                if (file->f_flags & O_NONBLOCK)
@@ -1747,16 +1764,20 @@ static inline int input_state_high(struct logical_input *input)
 
                        if (input->high_timer == 0) {
                                char *press_str = input->u.kbd.press_str;
+
                                if (press_str[0]) {
                                        int s = sizeof(input->u.kbd.press_str);
+
                                        keypad_send_key(press_str, s);
                                }
                        }
 
                        if (input->u.kbd.repeat_str[0]) {
                                char *repeat_str = input->u.kbd.repeat_str;
+
                                if (input->high_timer >= KEYPAD_REP_START) {
                                        int s = sizeof(input->u.kbd.repeat_str);
+
                                        input->high_timer -= KEYPAD_REP_DELAY;
                                        keypad_send_key(repeat_str, s);
                                }
@@ -1794,8 +1815,10 @@ static inline void input_state_falling(struct logical_input *input)
 
                        if (input->u.kbd.repeat_str[0]) {
                                char *repeat_str = input->u.kbd.repeat_str;
+
                                if (input->high_timer >= KEYPAD_REP_START) {
                                        int s = sizeof(input->u.kbd.repeat_str);
+
                                        input->high_timer -= KEYPAD_REP_DELAY;
                                        keypad_send_key(repeat_str, s);
                                }
@@ -1811,12 +1834,15 @@ static inline void input_state_falling(struct logical_input *input)
                /* call release event */
                if (input->type == INPUT_TYPE_STD) {
                        void (*release_fct)(int) = input->u.std.release_fct;
+
                        if (release_fct != NULL)
                                release_fct(input->u.std.release_data);
                } else if (input->type == INPUT_TYPE_KBD) {
                        char *release_str = input->u.kbd.release_str;
+
                        if (release_str[0]) {
                                int s = sizeof(input->u.kbd.release_str);
+
                                keypad_send_key(release_str, s);
                        }
                }
@@ -1933,6 +1959,7 @@ static int input_name2mask(const char *name, pmask_t *mask, pmask_t *value,
        om = im = m = v = 0ULL;
        while (*name) {
                int in, out, bit, neg;
+
                for (in = 0; (in < sizeof(sigtab)) &&
                             (sigtab[in] != *name); in++)
                        ;
@@ -2040,6 +2067,7 @@ static struct logical_input *panel_bind_callback(char *name,
 static void keypad_init(void)
 {
        int keynum;
+
        init_waitqueue_head(&keypad_read_wait);
        keypad_buflen = 0;      /* flushes any eventual noisy keystroke */
 
@@ -2298,7 +2326,7 @@ static void __exit panel_cleanup_module(void)
        unregister_reboot_notifier(&panel_notifier);
 
        if (scan_timer.function != NULL)
-               del_timer(&scan_timer);
+               del_timer_sync(&scan_timer);
 
        if (pprt != NULL) {
                if (keypad_enabled) {
index 2ff622ba24f0b46eaa8008ce816c13cfa90b5606..48bc5fca996d1ab872c4e68059838757fa3c9c5b 100644 (file)
@@ -32,10 +32,6 @@ struct pkt_file {
        size_t buf_len;
 };
 
-extern int rtw_ht_enable;
-extern int rtw_cbw40_enable;
-extern int rtw_ampdu_enable;/* for enable tx_ampdu */
-
 #define NR_XMITFRAME   256
 
 struct xmit_priv;
index b225d1c072109503e89b595fcf1fd3756651851f..9edb8e880ae8aad4ae02539a3368aa25426401c2 100644 (file)
@@ -84,9 +84,9 @@ static int rtw_uapsd_acbe_en;
 static int rtw_uapsd_acvi_en;
 static int rtw_uapsd_acvo_en;
 
-int rtw_ht_enable = 1;
-int rtw_cbw40_enable = 3; /*  0 :disable, bit(0): enable 2.4g, bit(1): enable 5g */
-int rtw_ampdu_enable = 1;/* for enable tx_ampdu */
+static int rtw_ht_enable = 1;
+static int rtw_cbw40_enable = 3; /*  0 :disable, bit(0): enable 2.4g, bit(1): enable 5g */
+static int rtw_ampdu_enable = 1;/* for enable tx_ampdu */
 static int rtw_rx_stbc = 1;/*  0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ */
 static int rtw_ampdu_amsdu;/*  0: disabled, 1:enabled, 2:auto */
 
index 2e49cd583212a70dc3bf8bf1ed22eb5d12d0e068..49a4ce44ada640bf9240c9ba3aba202916ecf90b 100644 (file)
@@ -62,10 +62,6 @@ static struct usb_device_id rtw_usb_id_tbl[] = {
 
 MODULE_DEVICE_TABLE(usb, rtw_usb_id_tbl);
 
-static struct specific_device_id specific_device_id_tbl[] = {
-       {}              /* empty table for now */
-};
-
 struct rtw_usb_drv {
        struct usb_driver usbdrv;
        int drv_registered;
@@ -360,28 +356,6 @@ static void rtw_dev_unload(struct adapter *padapter)
        RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("-rtw_dev_unload\n"));
 }
 
-static void process_spec_devid(const struct usb_device_id *pdid)
-{
-       u16 vid, pid;
-       u32 flags;
-       int i;
-       int num = sizeof(specific_device_id_tbl) /
-                 sizeof(struct specific_device_id);
-
-       for (i = 0; i < num; i++) {
-               vid = specific_device_id_tbl[i].idVendor;
-               pid = specific_device_id_tbl[i].idProduct;
-               flags = specific_device_id_tbl[i].flags;
-
-               if ((pdid->idVendor == vid) && (pdid->idProduct == pid) &&
-                   (flags&SPEC_DEV_ID_DISABLE_HT)) {
-                       rtw_ht_enable = 0;
-                       rtw_cbw40_enable = 0;
-                       rtw_ampdu_enable = 0;
-               }
-       }
-}
-
 int rtw_hw_suspend(struct adapter *padapter)
 {
        struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
@@ -781,9 +755,6 @@ static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device
 
        RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_init\n"));
 
-       /* step 0. */
-       process_spec_devid(pdid);
-
        /* Initialize dvobj_priv */
        dvobj = usb_dvobj_init(pusb_intf);
        if (dvobj == NULL) {
index 07fb5e4e50fa7cc7e89e5c30592d31783c234ccb..435f3594dabeb341016f5d6dcda64ee996d850de 100644 (file)
@@ -19,14 +19,6 @@ config 8723AU_AP_MODE
        will never be used as an AP, or the target system has limited memory,
        "Y" should be selected.
 
-config 8723AU_P2P
-       bool "Realtek RTL8723AU Peer-to-peer mode"
-       default y
-       ---help---
-       This option enables peer-to-peer mode for the r8723au driver. Unless you
-       know that peer-to-peer (P2P) mode will never be used, or the target system has
-       limited memory, "Y" should be selected.
-
 config 8723AU_BT_COEXIST
        bool "Realtek RTL8723AU BlueTooth Coexistence"
        default y
index 11c6dd4864621532bc36a7170638e2caf6789539..bbf503dd437a2713efc5b65b78f88bd451c7dae4 100644 (file)
@@ -8,7 +8,6 @@ r8723au-y :=                            \
                core/rtw_led.o          \
                core/rtw_mlme.o         \
                core/rtw_mlme_ext.o     \
-               core/rtw_p2p.o          \
                core/rtw_pwrctrl.o      \
                core/rtw_recv.o         \
                core/rtw_security.o     \
index a357e98cb83e02a54e3182e3d4fe5cece5f54e4c..207a19e4dc9f1c7ecbb2fcbe02c286e4e8e90832 100644 (file)
@@ -21,7 +21,6 @@
 
 #ifdef CONFIG_8723AU_AP_MODE
 
-extern unsigned char RTW_WPA_OUI23A[];
 extern unsigned char WMM_OUI23A[];
 extern unsigned char WPS_OUI23A[];
 extern unsigned char P2P_OUI23A[];
@@ -79,7 +78,8 @@ static void update_BCNTIM(struct rtw_adapter *padapter)
 
        tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
 
-       p = rtw_get_ie23a(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
+       p = rtw_get_ie23a(pie + _FIXED_IE_LENGTH_, WLAN_EID_TIM, &tim_ielen,
+                         pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
        if (p != NULL && tim_ielen>0) {
                tim_ielen += 2;
 
@@ -98,12 +98,16 @@ static void update_BCNTIM(struct rtw_adapter *padapter)
                offset = _FIXED_IE_LENGTH_;
 
                /* get ssid_ie len */
-               p = rtw_get_ie23a(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_));
+               p = rtw_get_ie23a(pie + _BEACON_IE_OFFSET_, WLAN_EID_SSID,
+                                 &tmp_len, (pnetwork_mlmeext->IELength -
+                                            _BEACON_IE_OFFSET_));
                if (p != NULL)
                        offset += tmp_len+2;
 
                /*  get supported rates len */
-               p = rtw_get_ie23a(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_));
+               p = rtw_get_ie23a(pie + _BEACON_IE_OFFSET_, WLAN_EID_SUPP_RATES,
+                                 &tmp_len, (pnetwork_mlmeext->IELength -
+                                            _BEACON_IE_OFFSET_));
                if (p !=  NULL)
                        offset += tmp_len+2;
 
@@ -124,7 +128,7 @@ static void update_BCNTIM(struct rtw_adapter *padapter)
                        memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);
        }
 
-       *dst_ie++= _TIM_IE_;
+       *dst_ie++= WLAN_EID_TIM;
 
        if ((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fc))
                tim_ielen = 5;
@@ -248,7 +252,7 @@ void        expire_timeout_chk23a(struct rtw_adapter *padapter)
 
                                        /* to update bcn with tim_bitmap for this station */
                                        pstapriv->tim_bitmap |= CHKBIT(psta->aid);
-                                       update_beacon23a(padapter, _TIM_IE_, NULL, false);
+                                       update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
 
                                        if (!pmlmeext->active_keep_alive_check)
                                                continue;
@@ -374,9 +378,9 @@ void add_RATid23a(struct rtw_adapter *padapter, struct sta_info *psta, u8 rssi_l
                        tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value23a(psta->bssrateset[i]&0x7f);
        }
        /* n mode ra_bitmap */
-       if (psta_ht->ht_option)
-       {
-               rtw23a_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+       if (psta_ht->ht_option) {
+               rf_type = rtl8723a_get_rf_type(padapter);
+
                if (rf_type == RF_2T2R)
                        limit = 16;/*  2R */
                else
@@ -523,8 +527,6 @@ static void update_bmc_sta(struct rtw_adapter *padapter)
                psta->raid = raid;
                psta->init_rate = init_rate;
 
-               rtw_stassoc_hw_rpt23a(padapter, psta);
-
                spin_lock_bh(&psta->lock);
                psta->state = _FW_LINKED;
                spin_unlock_bh(&psta->lock);
@@ -632,9 +634,8 @@ static void update_hw_ht_param(struct rtw_adapter *padapter)
 
        min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2;
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing));
-
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len));
+       rtl8723a_set_ampdu_min_space(padapter, min_MPDU_spacing);
+       rtl8723a_set_ampdu_factor(padapter, max_AMPDU_len);
 
        /*  Config SM Power Save setting */
        pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;
@@ -644,11 +645,10 @@ static void update_hw_ht_param(struct rtw_adapter *padapter)
 
 static void start_bss_network(struct rtw_adapter *padapter, u8 *pbuf)
 {
-       u8 *p;
+       const u8 *p;
        u8 val8, cur_channel, cur_bwmode, cur_ch_offset;
        u16 bcn_interval;
        u32 acparm;
-       int ie_len;
        struct registry_priv *pregpriv = &padapter->registrypriv;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct security_priv* psecuritypriv = &padapter->securitypriv;
@@ -657,9 +657,6 @@ static void start_bss_network(struct rtw_adapter *padapter, u8 *pbuf)
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *pnetwork_mlmeext = &pmlmeinfo->network;
        struct HT_info_element *pht_info = NULL;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
 
        bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod;
        cur_channel = pnetwork->Configuration.DSConfig;
@@ -695,27 +692,28 @@ static void start_bss_network(struct rtw_adapter *padapter, u8 *pbuf)
        Set_MSR23a(padapter, _HW_STATE_AP_);
 
        /* Set BSSID REG */
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BSSID, pnetwork->MacAddress);
+       hw_var_set_bssid(padapter, pnetwork->MacAddress);
 
        /* Set EDCA param reg */
        acparm = 0x002F3217; /*  VO */
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm));
+       rtl8723a_set_ac_param_vo(padapter, acparm);
        acparm = 0x005E4317; /*  VI */
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm));
+       rtl8723a_set_ac_param_vi(padapter, acparm);
        acparm = 0x005ea42b;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));
+       rtl8723a_set_ac_param_be(padapter, acparm);
        acparm = 0x0000A444; /*  BK */
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm));
+       rtl8723a_set_ac_param_bk(padapter, acparm);
 
        /* Set Security */
-       val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
+       val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) ?
+               0xcc: 0xcf;
+       rtl8723a_set_sec_cfg(padapter, val8);
 
        /* Beacon Control related register */
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval));
+       rtl8723a_set_beacon_interval(padapter, bcn_interval);
 
        UpdateBrateTbl23a(padapter, pnetwork->SupportedRates);
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates);
+       HalSetBrateCfg23a(padapter, pnetwork->SupportedRates);
 
        if (!pmlmepriv->cur_network.join_res) {
                /* setting only at  first time */
@@ -723,21 +721,25 @@ static void start_bss_network(struct rtw_adapter *padapter, u8 *pbuf)
                /* disable dynamic functions, such as high power, DIG */
 
                /* turn on all dynamic functions */
-               Switch_DM_Func23a(padapter, DYNAMIC_ALL_FUNC_ENABLE, true);
+               rtl8723a_odm_support_ability_set(padapter,
+                                                DYNAMIC_ALL_FUNC_ENABLE);
        }
        /* set channel, bwmode */
-       p = rtw_get_ie23a((pnetwork->IEs + sizeof(struct ndis_802_11_fixed_ies)),
-                         _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength -
-                         sizeof(struct ndis_802_11_fixed_ies)));
-       if (p && ie_len) {
-               pht_info = (struct HT_info_element *)(p+2);
-
-               if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) {
+       p = cfg80211_find_ie(WLAN_EID_HT_OPERATION,
+                            pnetwork->IEs +
+                            sizeof(struct ndis_802_11_fixed_ies),
+                            pnetwork->IELength -
+                            sizeof(struct ndis_802_11_fixed_ies));
+       if (p && p[1]) {
+               pht_info = (struct HT_info_element *)(p + 2);
+
+               if (pregpriv->cbw40_enable && pht_info->infos[0] & BIT(2)) {
                        /* switch to the 40M Hz mode */
                        cur_bwmode = HT_CHANNEL_WIDTH_40;
                        switch (pht_info->infos[0] & 0x3) {
                        case 1:
-                               /* pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; */
+                               /* pmlmeext->cur_ch_offset =
+                                  HAL_PRIME_CHNL_OFFSET_LOWER; */
                                cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
                                break;
                        case 3:
@@ -769,14 +771,8 @@ static void start_bss_network(struct rtw_adapter *padapter, u8 *pbuf)
        /* let pnetwork_mlmeext == pnetwork_mlme. */
        memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length);
 
-#ifdef CONFIG_8723AU_P2P
-       memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.ssid,
-              pnetwork->Ssid.ssid_len);
-       pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.ssid_len;
-#endif /* CONFIG_8723AU_P2P */
-
        if (pmlmeext->bstart_bss) {
-               update_beacon23a(padapter, _TIM_IE_, NULL, false);
+               update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
 
                /* issue beacon frame */
                if (send_beacon23a(padapter) == _FAIL)
@@ -848,7 +844,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
        cap = get_unaligned_le16(ie);
 
        /* SSID */
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len,
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_SSID, &ie_len,
                          (pbss_network->IELength -_BEACON_IE_OFFSET_));
        if (p && ie_len > 0) {
                memset(&pbss_network->Ssid, 0, sizeof(struct cfg80211_ssid));
@@ -859,7 +855,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
        /* chnnel */
        channel = 0;
        pbss_network->Configuration.Length = 0;
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len,
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_DS_PARAMS, &ie_len,
                          (pbss_network->IELength - _BEACON_IE_OFFSET_));
        if (p && ie_len > 0)
                channel = *(p + 2);
@@ -868,7 +864,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
 
        memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX);
        /*  get supported rates */
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len,
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_SUPP_RATES, &ie_len,
                          (pbss_network->IELength - _BEACON_IE_OFFSET_));
        if (p) {
                memcpy(supportRate, p+2, ie_len);
@@ -876,7 +872,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
        }
 
        /* get ext_supported rates */
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_,
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_EXT_SUPP_RATES,
                          &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_);
        if (p) {
                memcpy(supportRate+supportRateNum, p+2, ie_len);
@@ -889,7 +885,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
        rtw_set_supported_rate23a(pbss_network->SupportedRates, network_type);
 
        /* parsing ERP_IE */
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len,
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_ERP_INFO, &ie_len,
                          (pbss_network->IELength - _BEACON_IE_OFFSET_));
        if (p && ie_len > 0)
                ERP_IE_handler23a(padapter, (struct ndis_802_11_var_ies *)p);
@@ -906,7 +902,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
        group_cipher = 0; pairwise_cipher = 0;
        psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_;
        psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_;
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len,
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_RSN, &ie_len,
                          (pbss_network->IELength - _BEACON_IE_OFFSET_));
        if (p && ie_len > 0) {
                if (rtw_parse_wpa2_ie23a(p, ie_len+2, &group_cipher,
@@ -928,7 +924,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
        psecuritypriv->wpa_group_cipher = _NO_PRIVACY_;
        psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_;
        for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) {
-               p = rtw_get_ie23a(p, _SSN_IE_1_, &ie_len,
+               p = rtw_get_ie23a(p, WLAN_EID_VENDOR_SPECIFIC, &ie_len,
                                  (pbss_network->IELength - _BEACON_IE_OFFSET_ -
                                  (ie_len + 2)));
                if ((p) && (!memcmp(p+2, OUI1, 4))) {
@@ -956,7 +952,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
        pmlmepriv->qospriv.qos_option = 0;
        if (pregistrypriv->wmm_enable) {
                for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) {
-                       p = rtw_get_ie23a(p, _VENDOR_SPECIFIC_IE_, &ie_len,
+                       p = rtw_get_ie23a(p, WLAN_EID_VENDOR_SPECIFIC, &ie_len,
                                          (pbss_network->IELength -
                                          _BEACON_IE_OFFSET_ - (ie_len + 2)));
                        if ((p) && !memcmp(p+2, WMM_PARA_IE, 6)) {
@@ -978,7 +974,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
                }
        }
        /* parsing HT_CAP_IE */
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len,
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_HT_CAPABILITY, &ie_len,
                          (pbss_network->IELength - _BEACON_IE_OFFSET_));
        if (p && ie_len > 0) {
                u8 rf_type;
@@ -990,7 +986,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
                ht_cap = true;
                network_type |= WIRELESS_11_24N;
 
-               rtw23a_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+               rf_type = rtl8723a_get_rf_type(padapter);
 
                if ((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) ||
                    (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP))
@@ -1010,7 +1006,7 @@ int rtw_check_beacon_data23a(struct rtw_adapter *padapter, u8 *pbuf,  int len)
        }
 
        /* parsing HT_INFO_IE */
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len,
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_HT_OPERATION, &ie_len,
                          (pbss_network->IELength - _BEACON_IE_OFFSET_));
        if (p && ie_len > 0)
                pHT_info_ie = p;
@@ -1200,7 +1196,7 @@ static void update_bcn_erpinfo_ie(struct rtw_adapter *padapter)
                return;
 
        /* parsing ERP_IE */
-       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_));
+       p = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, WLAN_EID_ERP_INFO, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_));
        if (p && len>0)
        {
                struct ndis_802_11_var_ies * pIE = (struct ndis_802_11_var_ies *)p;
@@ -1306,26 +1302,16 @@ static void update_bcn_vendor_spec_ie(struct rtw_adapter *padapter, u8*oui)
 {
        DBG_8723A("%s\n", __func__);
 
-       if (!memcmp(RTW_WPA_OUI23A, oui, 4))
-       {
+       if (!memcmp(RTW_WPA_OUI23A_TYPE, oui, 4))
                update_bcn_wpa_ie(padapter);
-       }
        else if (!memcmp(WMM_OUI23A, oui, 4))
-       {
                update_bcn_wmm_ie(padapter);
-       }
        else if (!memcmp(WPS_OUI23A, oui, 4))
-       {
                update_bcn_wps_ie(padapter);
-       }
        else if (!memcmp(P2P_OUI23A, oui, 4))
-       {
                update_bcn_p2p_ie(padapter);
-       }
        else
-       {
                DBG_8723A("unknown OUI type!\n");
-       }
 }
 
 void update_beacon23a(struct rtw_adapter *padapter, u8 ie_id, u8 *oui, u8 tx)
@@ -1350,50 +1336,37 @@ void update_beacon23a(struct rtw_adapter *padapter, u8 ie_id, u8 *oui, u8 tx)
 
        switch (ie_id)
        {
-               case 0xFF:
-
-                       update_bcn_fixed_ie(padapter);/* 8: TimeStamp, 2: Beacon Interval 2:Capability */
-
-                       break;
-
-               case _TIM_IE_:
-
-                       update_BCNTIM(padapter);
-
-                       break;
-
-               case _ERPINFO_IE_:
-
-                       update_bcn_erpinfo_ie(padapter);
-
-                       break;
-
-               case _HT_CAPABILITY_IE_:
-
-                       update_bcn_htcap_ie(padapter);
-
-                       break;
-
-               case _RSN_IE_2_:
-
-                       update_bcn_rsn_ie(padapter);
-
-                       break;
+       case 0xFF:
+               /* 8: TimeStamp, 2: Beacon Interval 2:Capability */
+               update_bcn_fixed_ie(padapter);
+               break;
 
-               case _HT_ADD_INFO_IE_:
+       case WLAN_EID_TIM:
+               update_BCNTIM(padapter);
+               break;
 
-                       update_bcn_htinfo_ie(padapter);
+       case WLAN_EID_ERP_INFO:
+               update_bcn_erpinfo_ie(padapter);
+               break;
 
-                       break;
+       case WLAN_EID_HT_CAPABILITY:
+               update_bcn_htcap_ie(padapter);
+               break;
 
-               case _VENDOR_SPECIFIC_IE_:
+       case WLAN_EID_RSN:
+               update_bcn_rsn_ie(padapter);
+               break;
 
-                       update_bcn_vendor_spec_ie(padapter, oui);
+       case WLAN_EID_HT_OPERATION:
+               update_bcn_htinfo_ie(padapter);
+               break;
 
-                       break;
+       case WLAN_EID_VENDOR_SPECIFIC:
+               update_bcn_vendor_spec_ie(padapter, oui);
+               break;
 
-               default:
-                       break;
+       default:
+               break;
        }
 
        pmlmepriv->update_bcn = true;
@@ -1562,7 +1535,7 @@ void bss_cap_update_on_sta_join23a(struct rtw_adapter *padapter, struct sta_info
                        if (pmlmepriv->num_sta_non_erp == 1)
                        {
                                beacon_updated = true;
-                               update_beacon23a(padapter, _ERPINFO_IE_, NULL, true);
+                               update_beacon23a(padapter, WLAN_EID_ERP_INFO, NULL, true);
                        }
                }
 
@@ -1578,7 +1551,7 @@ void bss_cap_update_on_sta_join23a(struct rtw_adapter *padapter, struct sta_info
                        if (pmlmepriv->num_sta_non_erp == 0)
                        {
                                beacon_updated = true;
-                               update_beacon23a(padapter, _ERPINFO_IE_, NULL, true);
+                               update_beacon23a(padapter, WLAN_EID_ERP_INFO, NULL, true);
                        }
                }
 
@@ -1669,8 +1642,8 @@ void bss_cap_update_on_sta_join23a(struct rtw_adapter *padapter, struct sta_info
 
        if (rtw_ht_operation_update(padapter) > 0)
        {
-               update_beacon23a(padapter, _HT_CAPABILITY_IE_, NULL, false);
-               update_beacon23a(padapter, _HT_ADD_INFO_IE_, NULL, true);
+               update_beacon23a(padapter, WLAN_EID_HT_CAPABILITY, NULL, false);
+               update_beacon23a(padapter, WLAN_EID_HT_OPERATION, NULL, true);
        }
 
        /* update associcated stations cap. */
@@ -1705,7 +1678,8 @@ u8 bss_cap_update_on_sta_leave23a(struct rtw_adapter *padapter, struct sta_info
                if (pmlmepriv->num_sta_non_erp == 0)
                {
                        beacon_updated = true;
-                       update_beacon23a(padapter, _ERPINFO_IE_, NULL, true);
+                       update_beacon23a(padapter, WLAN_EID_ERP_INFO,
+                                        NULL, true);
                }
        }
 
@@ -1737,8 +1711,8 @@ u8 bss_cap_update_on_sta_leave23a(struct rtw_adapter *padapter, struct sta_info
 
        if (rtw_ht_operation_update(padapter) > 0)
        {
-               update_beacon23a(padapter, _HT_CAPABILITY_IE_, NULL, false);
-               update_beacon23a(padapter, _HT_ADD_INFO_IE_, NULL, true);
+               update_beacon23a(padapter, WLAN_EID_HT_CAPABILITY, NULL, false);
+               update_beacon23a(padapter, WLAN_EID_HT_OPERATION, NULL, true);
        }
 
        /* update associcated stations cap. */
index 5e3088a01800d554115fb64e6011f15e5b4ce085..cb15ddaae12ea87e1698525dc6d0dbf43e90b244 100644 (file)
@@ -19,6 +19,7 @@
 #include <recv_osdep.h>
 #include <cmd_osdep.h>
 #include <mlme_osdep.h>
+#include <rtl8723a_cmd.h>
 
 #ifdef CONFIG_8723AU_BT_COEXIST
 #include <rtl8723a_hal.h>
@@ -526,12 +527,6 @@ u8 rtw_sitesurvey_cmd23a(struct rtw_adapter *padapter,
        if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
                rtw_lps_ctrl_wk_cmd23a(padapter, LPS_CTRL_SCAN, 1);
 
-#ifdef CONFIG_8723AU_P2P
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
-               p2p_ps_wk_cmd23a(padapter, P2P_PS_SCAN, 1);
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
        if (!ph2c)
                return _FAIL;
@@ -1269,8 +1264,7 @@ void lps_ctrl_wk_hdl(struct rtw_adapter *padapter, u8 lps_ctrl_type)
                        mstatus = 1;/* connect */
                        /*  Reset LPS Setting */
                        padapter->pwrctrlpriv.LpsIdleCount = 0;
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_JOINBSSRPT,
-                                            (u8 *)&mstatus);
+                       rtl8723a_set_FwJoinBssReport_cmd(padapter, 1);
 #ifdef CONFIG_8723AU_BT_COEXIST
                        BT_WifiMediaStatusNotify(padapter, mstatus);
 #endif
@@ -1284,8 +1278,7 @@ void lps_ctrl_wk_hdl(struct rtw_adapter *padapter, u8 lps_ctrl_type)
                        {
                                LPS_Leave23a(padapter);
                        }
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_JOINBSSRPT,
-                                            (u8 *)&mstatus);
+                       rtl8723a_set_FwJoinBssReport_cmd(padapter, 0);
                        break;
                case LPS_CTRL_SPECIAL_PACKET:
                        pwrpriv->DelayLPSLastTimeStamp = jiffies;
@@ -1355,48 +1348,6 @@ static void power_saving_wk_hdl(struct rtw_adapter *padapter, u8 *pbuf, int sz)
         rtw_ps_processor23a(padapter);
 }
 
-#ifdef CONFIG_8723AU_P2P
-u8 p2p_protocol_wk_cmd23a(struct rtw_adapter*padapter, int intCmdType)
-{
-       struct cmd_obj *ph2c;
-       struct drvextra_cmd_parm *pdrvextra_cmd_parm;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
-       u8 res = _SUCCESS;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-       {
-               return res;
-       }
-
-       ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
-       if (!ph2c) {
-               res = _FAIL;
-               goto exit;
-       }
-
-       pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm),
-                                    GFP_ATOMIC);
-       if (!pdrvextra_cmd_parm) {
-               kfree(ph2c);
-               res = _FAIL;
-               goto exit;
-       }
-
-       pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID;
-       pdrvextra_cmd_parm->type_size = intCmdType; /* As the command tppe. */
-       pdrvextra_cmd_parm->pbuf = NULL;            /* Must be NULL here */
-
-       init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm,
-                                  GEN_CMD_CODE(_Set_Drv_Extra));
-
-       res = rtw_enqueue_cmd23a(pcmdpriv, ph2c);
-exit:
-
-       return res;
-}
-#endif /* CONFIG_8723AU_P2P */
-
 u8 rtw_ps_cmd23a(struct rtw_adapter*padapter)
 {
        struct cmd_obj *ppscmd;
@@ -1443,11 +1394,11 @@ static void rtw_chk_hi_queue_hdl(struct rtw_adapter *padapter)
                return;
 
        if (psta_bmc->sleepq_len == 0) {
-               u8 val = 0;
+               bool val;
 
-               rtw23a_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val);
+               val = rtl8723a_chk_hi_queue_empty(padapter);
 
-               while(val == false) {
+               while (val == false) {
                        msleep(100);
 
                        cnt++;
@@ -1455,15 +1406,14 @@ static void rtw_chk_hi_queue_hdl(struct rtw_adapter *padapter)
                        if (cnt>10)
                                break;
 
-                       rtw23a_hal_get_hwreg(padapter,
-                                            HW_VAR_CHK_HI_QUEUE_EMPTY, &val);
+                       val = rtl8723a_chk_hi_queue_empty(padapter);
                }
 
                if (cnt <= 10) {
                        pstapriv->tim_bitmap &= ~BIT(0);
                        pstapriv->sta_dz_bitmap &= ~BIT(0);
 
-                       update_beacon23a(padapter, _TIM_IE_, NULL, false);
+                       update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
                } else /* re check again */
                        rtw_chk_hi_queue_cmd23a(padapter);
        }
@@ -1636,16 +1586,6 @@ u8 rtw_drvextra_cmd_hdl23a(struct rtw_adapter *padapter, unsigned char *pbuf)
        case LPS_CTRL_WK_CID:
                lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type_size);
                break;
-#ifdef CONFIG_8723AU_P2P
-       case P2P_PS_WK_CID:
-               p2p_ps_wk_hdl23a(padapter, pdrvextra_cmd->type_size);
-               break;
-       case P2P_PROTO_WK_CID:
-               /*      Commented by Albert 2011/07/01 */
-               /*      I used the type_size as the type command */
-               p2p_protocol_wk_hdl23a(padapter, pdrvextra_cmd->type_size);
-               break;
-#endif /*  CONFIG_8723AU_P2P */
 #ifdef CONFIG_8723AU_AP_MODE
        case CHECK_HIQ_WK_CID:
                rtw_chk_hi_queue_hdl(padapter);
index a48ab25a7d8a251cd93a30cb04349a09ce3cdf1b..8f91bdbc2bbff8c1b2a5efed4ea58c10c05fce91 100644 (file)
@@ -131,7 +131,7 @@ u8 *rtw_set_fixed_ie23a(unsigned char *pbuf, unsigned int len,
 }
 
 /*  rtw_set_ie23a will update frame length */
-u8 *rtw_set_ie23a(u8 *pbuf, int index, uint len, u8 *source, uint *frlen)
+u8 *rtw_set_ie23a(u8 *pbuf, int index, uint len, const u8 *source, uint *frlen)
 {
 
        *pbuf = (u8)index;
@@ -413,7 +413,7 @@ int rtw_generate_ie23a(struct registry_priv *pregistrypriv)
        ie += 2;
 
        /* SSID */
-       ie = rtw_set_ie23a(ie, _SSID_IE_, pdev_network->Ssid.ssid_len,
+       ie = rtw_set_ie23a(ie, WLAN_EID_SSID, pdev_network->Ssid.ssid_len,
                        pdev_network->Ssid.ssid, &sz);
 
        /* supported rates */
@@ -431,25 +431,25 @@ int rtw_generate_ie23a(struct registry_priv *pregistrypriv)
        rateLen = rtw_get_rateset_len23a(pdev_network->SupportedRates);
 
        if (rateLen > 8) {
-               ie = rtw_set_ie23a(ie, _SUPPORTEDRATES_IE_, 8,
+               ie = rtw_set_ie23a(ie, WLAN_EID_SUPP_RATES, 8,
                                pdev_network->SupportedRates, &sz);
                /* ie = rtw_set_ie23a(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); */
        } else {
-               ie = rtw_set_ie23a(ie, _SUPPORTEDRATES_IE_, rateLen,
+               ie = rtw_set_ie23a(ie, WLAN_EID_SUPP_RATES, rateLen,
                                pdev_network->SupportedRates, &sz);
        }
 
        /* DS parameter set */
-       ie = rtw_set_ie23a(ie, _DSSET_IE_, 1,
+       ie = rtw_set_ie23a(ie, WLAN_EID_DS_PARAMS, 1,
                           (u8 *)&pdev_network->Configuration.DSConfig, &sz);
 
        /* IBSS Parameter Set */
 
-       ie = rtw_set_ie23a(ie, _IBSS_PARA_IE_, 2,
+       ie = rtw_set_ie23a(ie, WLAN_EID_IBSS_PARAMS, 2,
                           (u8 *)&pdev_network->Configuration.ATIMWindow, &sz);
 
        if (rateLen > 8) {
-               ie = rtw_set_ie23a(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8),
+               ie = rtw_set_ie23a(ie, WLAN_EID_EXT_SUPP_RATES, (rateLen - 8),
                                (pdev_network->SupportedRates + 8), &sz);
        }
 
@@ -460,60 +460,7 @@ int rtw_generate_ie23a(struct registry_priv *pregistrypriv)
        return sz;
 }
 
-unsigned char *rtw_get_wpa_ie23a(unsigned char *pie, int *wpa_ie_len, int limit)
-{
-       int len;
-       u16 val16;
-       unsigned char wpa_oui_type[] = {0x00, 0x50, 0xf2, 0x01};
-       u8 *pbuf = pie;
-       int limit_new = limit;
-
-       while(1) {
-               pbuf = rtw_get_ie23a(pbuf, _WPA_IE_ID_, &len, limit_new);
-
-               if (pbuf) {
-                       /* check if oui matches... */
-                       if (memcmp((pbuf + 2), wpa_oui_type,
-                                  sizeof(wpa_oui_type))) {
-                               goto check_next_ie;
-                       }
-
-                       /* check version... */
-                       memcpy((u8 *)&val16, (pbuf + 6), sizeof(val16));
-
-                       val16 = le16_to_cpu(val16);
-                       if (val16 != 0x0001)
-                               goto check_next_ie;
-
-                       *wpa_ie_len = *(pbuf + 1);
-
-                       return pbuf;
-               } else {
-                       *wpa_ie_len = 0;
-                       return NULL;
-               }
-
-check_next_ie:
-
-               limit_new = limit - (pbuf - pie) - 2 - len;
-
-               if (limit_new <= 0)
-                       break;
-
-               pbuf += (2 + len);
-       }
-
-       *wpa_ie_len = 0;
-
-       return NULL;
-}
-
-unsigned char *rtw_get_wpa2_ie23a(unsigned char *pie, int *rsn_ie_len, int limit)
-{
-       return rtw_get_ie23a(pie, _WPA2_IE_ID_, rsn_ie_len, limit);
-}
-
-int rtw_get_wpa_cipher_suite23a(u8 *s)
+int rtw_get_wpa_cipher_suite23a(const u8 *s)
 {
        if (!memcmp(s, WPA_CIPHER_SUITE_NONE23A, WPA_SELECTOR_LEN))
                return WPA_CIPHER_NONE;
@@ -529,7 +476,7 @@ int rtw_get_wpa_cipher_suite23a(u8 *s)
        return 0;
 }
 
-int rtw_get_wpa2_cipher_suite23a(u8 *s)
+int rtw_get_wpa2_cipher_suite23a(const u8 *s)
 {
        if (!memcmp(s, RSN_CIPHER_SUITE_NONE23A, RSN_SELECTOR_LEN))
                return WPA_CIPHER_NONE;
@@ -545,19 +492,19 @@ int rtw_get_wpa2_cipher_suite23a(u8 *s)
        return 0;
 }
 
-int rtw_parse_wpa_ie23a(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x)
+int rtw_parse_wpa_ie23a(const u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x)
 {
        int i, ret = _SUCCESS;
        int left, count;
-       u8 *pos;
-       u8 SUITE_1X[4] = {0x00, 0x50, 0xf2, 1};
+       const u8 *pos;
 
        if (wpa_ie_len <= 0) {
                /* No WPA IE - fail silently */
                return _FAIL;
        }
 
-       if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie+1) != (u8)(wpa_ie_len - 2)) ||
+       if ((*wpa_ie != WLAN_EID_VENDOR_SPECIFIC) ||
+           (*(wpa_ie+1) != (u8)(wpa_ie_len - 2)) ||
            memcmp(wpa_ie + 2, RTW_WPA_OUI23A_TYPE, WPA_SELECTOR_LEN)) {
                return _FAIL;
        }
@@ -612,7 +559,7 @@ int rtw_parse_wpa_ie23a(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pair
        if (is_8021x) {
                if (left >= 6) {
                        pos += 2;
-                       if (!memcmp(pos, SUITE_1X, 4)) {
+                       if (!memcmp(pos, RTW_WPA_OUI23A_TYPE, 4)) {
                                RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
                                         ("%s : there has 802.1x auth\n",
                                          __func__));
@@ -624,12 +571,12 @@ int rtw_parse_wpa_ie23a(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pair
        return ret;
 }
 
-int rtw_parse_wpa2_ie23a(u8* rsn_ie, int rsn_ie_len, int *group_cipher,
+int rtw_parse_wpa2_ie23a(const u8* rsn_ie, int rsn_ie_len, int *group_cipher,
                      int *pairwise_cipher, int *is_8021x)
 {
        int i, ret = _SUCCESS;
        int left, count;
-       u8 *pos;
+       const u8 *pos;
        u8 SUITE_1X[4] = {0x00, 0x0f, 0xac, 0x01};
 
        if (rsn_ie_len <= 0) {
@@ -705,11 +652,9 @@ int rtw_get_sec_ie23a(u8 *in_ie, uint in_len, u8 *rsn_ie, u16 *rsn_len,
                   u8 *wpa_ie, u16 *wpa_len)
 {
        u8 authmode, sec_idx, i;
-       u8 wpa_oui[4] = {0x0, 0x50, 0xf2, 0x01};
        uint cnt;
 
 
-
        /* Search required WPA or WPA2 IE and copy to sec_ie[ ] */
 
        cnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_);
@@ -719,8 +664,8 @@ int rtw_get_sec_ie23a(u8 *in_ie, uint in_len, u8 *rsn_ie, u16 *rsn_len,
        while(cnt < in_len) {
                authmode = in_ie[cnt];
 
-               if ((authmode == _WPA_IE_ID_) &&
-                   !memcmp(&in_ie[cnt+2], &wpa_oui[0], 4)) {
+               if ((authmode == WLAN_EID_VENDOR_SPECIFIC) &&
+                   !memcmp(&in_ie[cnt+2], RTW_WPA_OUI23A_TYPE, 4)) {
                                RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
                                         ("\n rtw_get_wpa_ie23a: sec_idx =%d "
                                          "in_ie[cnt+1]+2 =%d\n",
@@ -788,7 +733,8 @@ u8 rtw_is_wps_ie23a(u8 *ie_ptr, uint *wps_ielen)
 
        eid = ie_ptr[0];
 
-       if ((eid == _WPA_IE_ID_) && !memcmp(&ie_ptr[2], wps_oui, 4)) {
+       if ((eid == WLAN_EID_VENDOR_SPECIFIC) &&
+           !memcmp(&ie_ptr[2], wps_oui, 4)) {
                /* DBG_8723A("==> found WPS_IE.....\n"); */
                *wps_ielen = ie_ptr[1] + 2;
                match = true;
@@ -824,7 +770,8 @@ u8 *rtw_get_wps_ie23a(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen)
        while (cnt < in_len) {
                eid = in_ie[cnt];
 
-               if ((eid == _WPA_IE_ID_) && !memcmp(&in_ie[cnt+2], wps_oui, 4)) {
+               if ((eid == WLAN_EID_VENDOR_SPECIFIC) &&
+                   !memcmp(&in_ie[cnt+2], wps_oui, 4)) {
                        wpsie_ptr = &in_ie[cnt];
 
                        if (wps_ie)
@@ -866,7 +813,7 @@ u8 *rtw_get_wps_attr23a(u8 *wps_ie, uint wps_ielen, u16 target_attr_id,
        if (len_attr)
                *len_attr = 0;
 
-       if ((wps_ie[0] != _VENDOR_SPECIFIC_IE_) ||
+       if ((wps_ie[0] != WLAN_EID_VENDOR_SPECIFIC) ||
            memcmp(wps_ie + 2, wps_oui, 4)) {
                return attr_ptr;
        }
@@ -937,237 +884,6 @@ u8 *rtw_get_wps_attr_content23a(u8 *wps_ie, uint wps_ielen, u16 target_attr_id,
        return NULL;
 }
 
-static int
-rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen,
-                                    struct rtw_ieee802_11_elems *elems,
-                                    int show_errors)
-{
-       unsigned int oui;
-
-       /* first 3 bytes in vendor specific information element are the IEEE
-        * OUI of the vendor. The following byte is used a vendor specific
-        * sub-type. */
-       if (elen < 4) {
-               if (show_errors) {
-                       DBG_8723A("short vendor specific "
-                                  "information element ignored (len =%lu)\n",
-                                  (unsigned long) elen);
-               }
-               return -1;
-       }
-
-       oui = RTW_GET_BE24(pos);
-       switch (oui) {
-       case WLAN_OUI_MICROSOFT:
-               /* Microsoft/Wi-Fi information elements are further typed and
-                * subtyped */
-               switch (pos[3]) {
-               case 1:
-                       /* Microsoft OUI (00:50:F2) with OUI Type 1:
-                        * real WPA information element */
-                       elems->wpa_ie = pos;
-                       elems->wpa_ie_len = elen;
-                       break;
-               case WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */
-                       if (elen < 5) {
-                               DBG_8723A("short WME "
-                                          "information element ignored "
-                                          "(len =%lu)\n",
-                                          (unsigned long) elen);
-                               return -1;
-                       }
-                       switch (pos[4]) {
-                       case WME_OUI_SUBTYPE_INFORMATION_ELEMENT:
-                       case WME_OUI_SUBTYPE_PARAMETER_ELEMENT:
-                               elems->wme = pos;
-                               elems->wme_len = elen;
-                               break;
-                       case WME_OUI_SUBTYPE_TSPEC_ELEMENT:
-                               elems->wme_tspec = pos;
-                               elems->wme_tspec_len = elen;
-                               break;
-                       default:
-                               DBG_8723A("unknown WME "
-                                          "information element ignored "
-                                          "(subtype =%d len =%lu)\n",
-                                          pos[4], (unsigned long) elen);
-                               return -1;
-                       }
-                       break;
-               case 4:
-                       /* Wi-Fi Protected Setup (WPS) IE */
-                       elems->wps_ie = pos;
-                       elems->wps_ie_len = elen;
-                       break;
-               default:
-                       DBG_8723A("Unknown Microsoft "
-                                  "information element ignored "
-                                  "(type =%d len =%lu)\n",
-                                  pos[3], (unsigned long) elen);
-                       return -1;
-               }
-               break;
-
-       case OUI_BROADCOM:
-               switch (pos[3]) {
-               case VENDOR_HT_CAPAB_OUI_TYPE:
-                       elems->vendor_ht_cap = pos;
-                       elems->vendor_ht_cap_len = elen;
-                       break;
-               default:
-                       DBG_8723A("Unknown Broadcom "
-                                  "information element ignored "
-                                  "(type =%d len =%lu)\n",
-                                  pos[3], (unsigned long) elen);
-                       return -1;
-               }
-               break;
-
-       default:
-               DBG_8723A("unknown vendor specific information "
-                          "element ignored (vendor OUI %02x:%02x:%02x "
-                          "len =%lu)\n",
-                          pos[0], pos[1], pos[2], (unsigned long) elen);
-               return -1;
-       }
-
-       return 0;
-}
-
-/**
- * ieee802_11_parse_elems - Parse information elements in management frames
- * @start: Pointer to the start of IEs
- * @len: Length of IE buffer in octets
- * @elems: Data structure for parsed elements
- * @show_errors: Whether to show parsing errors in debug log
- * Returns: Parsing result
- */
-enum parse_res rtw_ieee802_11_parse_elems23a(u8 *start, uint len,
-                               struct rtw_ieee802_11_elems *elems,
-                               int show_errors)
-{
-       uint left = len;
-       u8 *pos = start;
-       int unknown = 0;
-
-       memset(elems, 0, sizeof(*elems));
-
-       while (left >= 2) {
-               u8 id, elen;
-
-               id = *pos++;
-               elen = *pos++;
-               left -= 2;
-
-               if (elen > left) {
-                       if (show_errors) {
-                               DBG_8723A("IEEE 802.11 element "
-                                          "parse failed (id =%d elen =%d "
-                                          "left =%lu)\n",
-                                          id, elen, (unsigned long) left);
-                       }
-                       return ParseFailed;
-               }
-
-               switch (id) {
-               case WLAN_EID_SSID:
-                       elems->ssid = pos;
-                       elems->ssid_len = elen;
-                       break;
-               case WLAN_EID_SUPP_RATES:
-                       elems->supp_rates = pos;
-                       elems->supp_rates_len = elen;
-                       break;
-               case WLAN_EID_FH_PARAMS:
-                       elems->fh_params = pos;
-                       elems->fh_params_len = elen;
-                       break;
-               case WLAN_EID_DS_PARAMS:
-                       elems->ds_params = pos;
-                       elems->ds_params_len = elen;
-                       break;
-               case WLAN_EID_CF_PARAMS:
-                       elems->cf_params = pos;
-                       elems->cf_params_len = elen;
-                       break;
-               case WLAN_EID_TIM:
-                       elems->tim = pos;
-                       elems->tim_len = elen;
-                       break;
-               case WLAN_EID_IBSS_PARAMS:
-                       elems->ibss_params = pos;
-                       elems->ibss_params_len = elen;
-                       break;
-               case WLAN_EID_CHALLENGE:
-                       elems->challenge = pos;
-                       elems->challenge_len = elen;
-                       break;
-               case WLAN_EID_ERP_INFO:
-                       elems->erp_info = pos;
-                       elems->erp_info_len = elen;
-                       break;
-               case WLAN_EID_EXT_SUPP_RATES:
-                       elems->ext_supp_rates = pos;
-                       elems->ext_supp_rates_len = elen;
-                       break;
-               case WLAN_EID_VENDOR_SPECIFIC:
-                       if (rtw_ieee802_11_parse_vendor_specific(pos, elen,
-                                                                elems,
-                                                                show_errors))
-                               unknown++;
-                       break;
-               case WLAN_EID_RSN:
-                       elems->rsn_ie = pos;
-                       elems->rsn_ie_len = elen;
-                       break;
-               case WLAN_EID_PWR_CAPABILITY:
-                       elems->power_cap = pos;
-                       elems->power_cap_len = elen;
-                       break;
-               case WLAN_EID_SUPPORTED_CHANNELS:
-                       elems->supp_channels = pos;
-                       elems->supp_channels_len = elen;
-                       break;
-               case WLAN_EID_MOBILITY_DOMAIN:
-                       elems->mdie = pos;
-                       elems->mdie_len = elen;
-                       break;
-               case WLAN_EID_FAST_BSS_TRANSITION:
-                       elems->ftie = pos;
-                       elems->ftie_len = elen;
-                       break;
-               case WLAN_EID_TIMEOUT_INTERVAL:
-                       elems->timeout_int = pos;
-                       elems->timeout_int_len = elen;
-                       break;
-               case WLAN_EID_HT_CAPABILITY:
-                       elems->ht_capabilities = pos;
-                       elems->ht_capabilities_len = elen;
-                       break;
-               case WLAN_EID_HT_OPERATION:
-                       elems->ht_operation = pos;
-                       elems->ht_operation_len = elen;
-                       break;
-               default:
-                       unknown++;
-                       if (!show_errors)
-                               break;
-                       DBG_8723A("IEEE 802.11 element parse "
-                                  "ignored unknown element (id =%d elen =%d)\n",
-                                  id, elen);
-                       break;
-               }
-
-               left -= elen;
-               pos += elen;
-       }
-
-       if (left)
-               return ParseFailed;
-
-       return unknown ? ParseUnknown : ParseOK;
-}
-
 static u8 key_char2num(u8 ch)
 {
        if ((ch >= '0') && (ch <= '9'))
@@ -1214,387 +930,26 @@ void rtw_macaddr_cfg23a(u8 *mac_addr)
                  MAC_ARG(mac_addr));
 }
 
-void dump_ies23a(u8 *buf, u32 buf_len) {
-       u8* pos = (u8*)buf;
-       u8 id, len;
-
-       while (pos-buf <= buf_len) {
-               id = *pos;
-               len = *(pos + 1);
-
-               DBG_8723A("%s ID:%u, LEN:%u\n", __func__, id, len);
-#ifdef CONFIG_8723AU_P2P
-               dump_p2p_ie23a(pos, len);
-#endif
-               dump_wps_ie23a(pos, len);
-
-               pos += (2 + len);
-       }
-}
-
-void dump_wps_ie23a(u8 *ie, u32 ie_len) {
-       u8* pos = (u8*)ie;
-       u16 id;
-       u16 len;
-
-       u8 *wps_ie;
-       uint wps_ielen;
-
-       wps_ie = rtw_get_wps_ie23a(ie, ie_len, NULL, &wps_ielen);
-       if (wps_ie != ie || wps_ielen == 0)
-               return;
-
-       pos+= 6;
-       while (pos-ie < ie_len) {
-               id = get_unaligned_be16(pos);
-               len = get_unaligned_be16(pos + 2);
-
-               DBG_8723A("%s ID:0x%04x, LEN:%u\n", __func__, id, len);
-
-               pos += (4 + len);
-       }
-}
-
-#ifdef CONFIG_8723AU_P2P
-void dump_p2p_ie23a(u8 *ie, u32 ie_len) {
-       u8* pos = (u8*)ie;
-       u8 id;
-       u16 len;
-
-       u8 *p2p_ie;
-       uint p2p_ielen;
-
-       p2p_ie = rtw_get_p2p_ie23a(ie, ie_len, NULL, &p2p_ielen);
-       if (p2p_ie != ie || p2p_ielen == 0)
-               return;
-
-       pos += 6;
-       while (pos-ie < ie_len) {
-               id = *pos;
-               len = get_unaligned_le16(pos+1);
-
-               DBG_8723A("%s ID:%u, LEN:%u\n", __func__, id, len);
-
-               pos+= (3+len);
-       }
-}
-
-/**
- * rtw_get_p2p_ie23a - Search P2P IE from a series of IEs
- * @in_ie: Address of IEs to search
- * @in_len: Length limit from in_ie
- * @p2p_ie: If not NULL and P2P IE is found, P2P IE will be copied to the
- *          buf starting from p2p_ie
- * @p2p_ielen: If not NULL and P2P IE is found, will set to the length of
- *             the entire P2P IE
- *
- * Returns: The address of the P2P IE found, or NULL
- */
-u8 *rtw_get_p2p_ie23a(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen)
-{
-       uint cnt = 0;
-       u8 *p2p_ie_ptr;
-       u8 eid, p2p_oui[4]={0x50, 0x6F, 0x9A, 0x09};
-
-       if (p2p_ielen)
-               *p2p_ielen = 0;
-
-       while (cnt<in_len) {
-               eid = in_ie[cnt];
-               if ((in_len < 0) || (cnt > MAX_IE_SZ)) {
-                       dump_stack();
-                       return NULL;
-               }
-               if ((eid == _VENDOR_SPECIFIC_IE_) &&
-                   !memcmp(&in_ie[cnt + 2], p2p_oui, 4)) {
-                       p2p_ie_ptr = in_ie + cnt;
-
-                       if (p2p_ie != NULL) {
-                               memcpy(p2p_ie, &in_ie[cnt],
-                                      in_ie[cnt + 1] + 2);
-                       }
-
-                       if (p2p_ielen != NULL) {
-                               *p2p_ielen = in_ie[cnt + 1] + 2;
-                       }
-
-                       return p2p_ie_ptr;
-
-                       break;
-               } else {
-                       cnt += in_ie[cnt + 1] + 2; /* goto next */
-               }
-       }
-
-       return NULL;
-}
-
-/**
- * rtw_get_p2p_attr23a - Search a specific P2P attribute from a given P2P IE
- * @p2p_ie: Address of P2P IE to search
- * @p2p_ielen: Length limit from p2p_ie
- * @target_attr_id: The attribute ID of P2P attribute to search
- * @buf_attr: If not NULL and the P2P attribute is found, P2P attribute will
- *            be copied to the buf starting from buf_attr
- * @len_attr: If not NULL and the P2P attribute is found, will set to the
- *            length of the entire P2P attribute
- *
- * Returns: the address of the specific WPS attribute found, or NULL
- */
-u8 *rtw_get_p2p_attr23a(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id,
-                    u8 *buf_attr, u32 *len_attr)
-{
-       u8 *attr_ptr = NULL;
-       u8 *target_attr_ptr = NULL;
-       u8 p2p_oui[4]={0x50, 0x6F, 0x9A, 0x09};
-
-       if (len_attr)
-               *len_attr = 0;
-
-       if (!p2p_ie || (p2p_ie[0] != _VENDOR_SPECIFIC_IE_) ||
-           memcmp(p2p_ie + 2, p2p_oui, 4)) {
-               return attr_ptr;
-       }
-
-       /*  6 = 1(Element ID) + 1(Length) + 3 (OUI) + 1(OUI Type) */
-       attr_ptr = p2p_ie + 6; /* goto first attr */
-
-       while (attr_ptr - p2p_ie < p2p_ielen) {
-               /*  3 = 1(Attribute ID) + 2(Length) */
-               u8 attr_id = *attr_ptr;
-               u16 attr_data_len = get_unaligned_le16(attr_ptr + 1);
-               u16 attr_len = attr_data_len + 3;
-
-               /* DBG_8723A("%s attr_ptr:%p, id:%u, length:%u\n", __func__, attr_ptr, attr_id, attr_data_len); */
-               if (attr_id == target_attr_id) {
-                       target_attr_ptr = attr_ptr;
-
-                       if (buf_attr)
-                               memcpy(buf_attr, attr_ptr, attr_len);
-
-                       if (len_attr)
-                               *len_attr = attr_len;
-
-                       break;
-               } else {
-                       attr_ptr += attr_len; /* goto next */
-               }
-       }
-
-       return target_attr_ptr;
-}
-
-/**
- * rtw_get_p2p_attr23a_content - Search a specific P2P attribute content from
- * a given P2P IE
- * @p2p_ie: Address of P2P IE to search
- * @p2p_ielen: Length limit from p2p_ie
- * @target_attr_id: The attribute ID of P2P attribute to search
- * @buf_content: If not NULL and the P2P attribute is found, P2P attribute
- *               content will be copied to the buf starting from buf_content
- * @len_content: If not NULL and the P2P attribute is found, will set to the
- *               length of the P2P attribute content
- *
- * Returns: the address of the specific P2P attribute content found, or NULL
- */
-u8 *rtw_get_p2p_attr23a_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id,
-                            u8 *buf_content, uint *len_content)
-{
-       u8 *attr_ptr;
-       u32 attr_len;
-
-       if (len_content)
-               *len_content = 0;
-
-       attr_ptr = rtw_get_p2p_attr23a(p2p_ie, p2p_ielen, target_attr_id,
-                                   NULL, &attr_len);
-
-       if (attr_ptr && attr_len) {
-               if (buf_content)
-                       memcpy(buf_content, attr_ptr + 3, attr_len - 3);
-
-               if (len_content)
-                       *len_content = attr_len - 3;
-
-               return attr_ptr+3;
-       }
-
-       return NULL;
-}
-
-u32 rtw_set_p2p_attr_content23a(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr)
-{
-       u32 a_len;
-
-       *pbuf = attr_id;
-
-       /* u16*)(pbuf + 1) = cpu_to_le16(attr_len); */
-       put_unaligned_le16(attr_len, pbuf + 1);
-
-       if (pdata_attr)
-               memcpy(pbuf + 3, pdata_attr, attr_len);
-
-       a_len = attr_len + 3;
-
-       return a_len;
-}
-
-static uint rtw_p2p_attr_remove(u8 *ie, uint ielen_ori, u8 attr_id)
-{
-       u8 *target_attr;
-       u32 target_attr_len;
-       uint ielen = ielen_ori;
-
-       while(1) {
-               target_attr = rtw_get_p2p_attr23a(ie, ielen, attr_id, NULL,
-                                            &target_attr_len);
-               if (target_attr && target_attr_len) {
-                       u8 *next_attr = target_attr+target_attr_len;
-                       uint remain_len = ielen-(next_attr-ie);
-                       /* dump_ies23a(ie, ielen); */
-
-                       memset(target_attr, 0, target_attr_len);
-                       memcpy(target_attr, next_attr, remain_len);
-                       memset(target_attr+remain_len, 0, target_attr_len);
-                       *(ie + 1) -= target_attr_len;
-                       ielen -= target_attr_len;
-               } else {
-                       /* if (index>0) */
-                       /*      dump_ies23a(ie, ielen); */
-                       break;
-               }
-       }
-
-       return ielen;
-}
-
-void rtw_wlan_bssid_ex_remove_p2p_attr23a(struct wlan_bssid_ex *bss_ex, u8 attr_id)
-{
-       u8 *p2p_ie;
-       uint p2p_ielen, p2p_ielen_ori;
-
-       if ((p2p_ie = rtw_get_p2p_ie23a(bss_ex->IEs + _FIXED_IE_LENGTH_,
-                                    bss_ex->IELength - _FIXED_IE_LENGTH_,
-                                    NULL, &p2p_ielen_ori))) {
-               p2p_ielen = rtw_p2p_attr_remove(p2p_ie, p2p_ielen_ori, attr_id);
-               if (p2p_ielen != p2p_ielen_ori) {
-                       u8 *next_ie_ori = p2p_ie+p2p_ielen_ori;
-                       u8 *next_ie = p2p_ie+p2p_ielen;
-                       uint remain_len;
-                       remain_len = bss_ex->IELength-(next_ie_ori-bss_ex->IEs);
-
-                       memcpy(next_ie, next_ie_ori, remain_len);
-                       memset(next_ie+remain_len, 0, p2p_ielen_ori-p2p_ielen);
-                       bss_ex->IELength -= p2p_ielen_ori-p2p_ielen;
-               }
-       }
-}
-
-#endif /* CONFIG_8723AU_P2P */
-
-#ifdef CONFIG_8723AU_P2P
-int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen)
-{
-       int match;
-       const u8 *ie;
-
-       match = 0;
-
-       if (in_len < 0)
-               return match;
-
-       ie = cfg80211_find_vendor_ie(0x506F9A, 0x0A, in_ie, in_len);
-       if (ie && (ie[1] <= (MAX_WFD_IE_LEN - 2))) {
-               if (wfd_ie) {
-                       *wfd_ielen = ie[1] + 2;
-                       memcpy(wfd_ie, ie, ie[1] + 2);
-               } else
-                       if (wfd_ielen)
-                               *wfd_ielen = 0;
-
-               match = 1;
-       }
-
-       return match;
-}
-
-/*     attr_content: The output buffer, contains the "body field" of
-       WFD attribute. */
-/*     attr_contentlen: The data length of the "body field" of WFD
-       attribute. */
-int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id,
-                            u8 *attr_content, uint *attr_contentlen)
-{
-       int match;
-       uint cnt = 0;
-       u8 attr_id, wfd_oui[4] = {0x50, 0x6F, 0x9A, 0x0A};
-
-       match = false;
-
-       if ((wfd_ie[0] != _VENDOR_SPECIFIC_IE_) ||
-           memcmp(wfd_ie + 2, wfd_oui, 4)) {
-               return match;
-       }
-
-       /*      1 (WFD IE) + 1 (Length) + 3 (OUI) + 1 (OUI Type) */
-       cnt = 6;
-       while (cnt < wfd_ielen) {
-               u16 attrlen = get_unaligned_be16(wfd_ie + cnt + 1);
-
-               attr_id = wfd_ie[cnt];
-               if (attr_id == target_attr_id) {
-                       /*      3 -> 1 byte for attribute ID field, 2
-                               bytes for length field */
-                       if (attr_content)
-                               memcpy(attr_content, &wfd_ie[cnt + 3], attrlen);
-
-                       if (attr_contentlen)
-                               *attr_contentlen = attrlen;
-
-                       cnt += attrlen + 3;
-
-                       match = true;
-                       break;
-               } else {
-                       cnt += attrlen + 3; /* goto next */
-               }
-       }
-
-       return match;
-}
-#endif /*  CONFIG_8723AU_P2P */
-
-/* Baron adds to avoid FreeBSD warning */
-int ieee80211_is_empty_essid23a(const char *essid, int essid_len)
-{
-       /* Single white space is for Linksys APs */
-       if (essid_len == 1 && essid[0] == ' ')
-               return 1;
-
-       /* Otherwise, if the entire essid is 0, we assume it is hidden */
-       while (essid_len) {
-               essid_len--;
-               if (essid[essid_len] != '\0')
-                       return 0;
-       }
-
-       return 1;
-}
-
 static int rtw_get_cipher_info(struct wlan_network *pnetwork)
 {
-       u32 wpa_ielen;
-       unsigned char *pbuf;
+       const u8 *pbuf;
        int group_cipher = 0, pairwise_cipher = 0, is8021x = 0;
        int ret = _FAIL;
-       int r;
-       pbuf = rtw_get_wpa_ie23a(&pnetwork->network.IEs[12], &wpa_ielen,
-                             pnetwork->network.IELength - 12);
+       int r, offset, plen;
+       char *pie;
+
+       offset = offsetof(struct ieee80211_mgmt, u.beacon.variable) -
+               offsetof(struct ieee80211_mgmt, u);
+       pie = &pnetwork->network.IEs[offset];
+       plen = pnetwork->network.IELength - offset;
 
-       if (pbuf && (wpa_ielen > 0)) {
+       pbuf = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
+                                      WLAN_OUI_TYPE_MICROSOFT_WPA, pie, plen);
+
+       if (pbuf && pbuf[1] > 0) {
                RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
-                        ("rtw_get_cipher_info: wpa_ielen: %d", wpa_ielen));
-               r = rtw_parse_wpa_ie23a(pbuf, wpa_ielen + 2, &group_cipher,
+                        ("rtw_get_cipher_info: wpa_ielen: %d", pbuf[1]));
+               r = rtw_parse_wpa_ie23a(pbuf, pbuf[1] + 2, &group_cipher,
                                     &pairwise_cipher, &is8021x);
                if (r == _SUCCESS) {
                        pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher;
@@ -1608,13 +963,12 @@ static int rtw_get_cipher_info(struct wlan_network *pnetwork)
                        ret = _SUCCESS;
                }
        } else {
-               pbuf = rtw_get_wpa2_ie23a(&pnetwork->network.IEs[12], &wpa_ielen,
-                                      pnetwork->network.IELength - 12);
+               pbuf = cfg80211_find_ie(WLAN_EID_RSN, pie, plen);
 
-               if (pbuf && (wpa_ielen > 0)) {
+               if (pbuf && pbuf[1] > 0) {
                        RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
                                 ("get RSN IE\n"));
-                       r = rtw_parse_wpa2_ie23a(pbuf, wpa_ielen + 2,
+                       r = rtw_parse_wpa2_ie23a(pbuf, pbuf[1] + 2,
                                              &group_cipher, &pairwise_cipher,
                                              &is8021x);
                        if (r == _SUCCESS) {
@@ -1690,8 +1044,8 @@ void rtw_get_bcn_info23a(struct wlan_network *pnetwork)
        /* get bwmode and ch_offset */
        /* parsing HT_CAP_IE */
        p = rtw_get_ie23a(pnetwork->network.IEs + _FIXED_IE_LENGTH_,
-                      _HT_CAPABILITY_IE_, &len,
-                      pnetwork->network.IELength - _FIXED_IE_LENGTH_);
+                         WLAN_EID_HT_CAPABILITY, &len,
+                         pnetwork->network.IELength - _FIXED_IE_LENGTH_);
        if (p && len > 0) {
                pht_cap = (struct ieee80211_ht_cap *)(p + 2);
                pnetwork->BcnInfo.ht_cap_info = pht_cap->cap_info;
@@ -1700,7 +1054,7 @@ void rtw_get_bcn_info23a(struct wlan_network *pnetwork)
        }
        /* parsing HT_INFO_IE */
        p = rtw_get_ie23a(pnetwork->network.IEs + _FIXED_IE_LENGTH_,
-                      _HT_ADD_INFO_IE_, &len,
+                      WLAN_EID_HT_OPERATION, &len,
                       pnetwork->network.IELength - _FIXED_IE_LENGTH_);
        if (p && len > 0) {
                pht_info = (struct HT_info_element *)(p + 2);
index 30d7185e5637d719b1b27593a39282f4e14b202d..fe4926a4ced652319cd6589b7bf6a44775dabcd3 100644 (file)
@@ -54,7 +54,7 @@ u8 rtw_do_join23a(struct rtw_adapter *padapter)
                /* we try to issue sitesurvey firstly */
 
                if (pmlmepriv->LinkDetectInfo.bBusyTraffic == false ||
-                   rtw_to_roaming(padapter) > 0) {
+                   padapter->mlmepriv.to_roaming > 0) {
                        RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
                                 ("rtw_do_join23a(): site survey if scanned_queue "
                                  "is empty\n."));
@@ -130,7 +130,7 @@ u8 rtw_do_join23a(struct rtw_adapter *padapter)
                                   queue */
                                /* we try to issue sitesurvey firstly */
                                if (pmlmepriv->LinkDetectInfo.bBusyTraffic ==
-                                   false || rtw_to_roaming(padapter) > 0) {
+                                   false || padapter->mlmepriv.to_roaming > 0){
                                        /* DBG_8723A("rtw_do_join23a() when   no "
                                           "desired bss in scanning queue\n");
                                        */
@@ -539,7 +539,7 @@ exit:
 u16 rtw_get_cur_max_rate23a(struct rtw_adapter *adapter)
 {
        int i = 0;
-       u8 *p;
+       const u8 *p;
        u16 rate = 0, max_rate = 0;
        struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
@@ -550,16 +550,16 @@ u16 rtw_get_cur_max_rate23a(struct rtw_adapter *adapter)
        u8 rf_type = 0;
        u8 bw_40MHz = 0, short_GI_20 = 0, short_GI_40 = 0;
        u16 mcs_rate = 0;
-       u32 ht_ielen = 0;
 
        if (!check_fwstate(pmlmepriv, _FW_LINKED) &&
            !check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))
                return 0;
 
        if (pmlmeext->cur_wireless_mode & (WIRELESS_11_24N|WIRELESS_11_5N)) {
-               p = rtw_get_ie23a(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_,
-                              &ht_ielen, pcur_bss->IELength - 12);
-               if (p && ht_ielen > 0) {
+               p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
+                                    &pcur_bss->IEs[12],
+                                    pcur_bss->IELength - 12);
+               if (p && p[1] > 0) {
                        pht_capie = (struct ieee80211_ht_cap *)(p + 2);
 
                        memcpy(&mcs_rate, &pht_capie->mcs, 2);
@@ -577,8 +577,7 @@ u16 rtw_get_cur_max_rate23a(struct rtw_adapter *adapter)
                        short_GI_20 = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info&IEEE80211_HT_CAP_SGI_20) ? 1:0;
                        short_GI_40 = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info&IEEE80211_HT_CAP_SGI_40) ? 1:0;
 
-                       rtw23a_hal_get_hwreg(adapter, HW_VAR_RF_TYPE,
-                                         (u8 *)(&rf_type));
+                       rf_type = rtl8723a_get_rf_type(adapter);
                        max_rate = rtw_mcs_rate23a(rf_type, bw_40MHz &
                                                pregistrypriv->cbw40_enable,
                                                short_GI_20, short_GI_40,
index 6cee78785bdc671e09c14829002f958e5c63a6fe..4d21d623070ee19cbd28fba3f2a5d414b1e7f905 100644 (file)
@@ -53,8 +53,11 @@ int _rtw_init_mlme_priv23a(struct rtw_adapter *padapter)
        pmlmepriv->nic_hdl = padapter;
 
        pmlmepriv->fw_state = 0;
-       pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown;
-       pmlmepriv->scan_mode=SCAN_ACTIVE;/*  1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) */
+       pmlmepriv->cur_network.network.InfrastructureMode =
+               Ndis802_11AutoUnknown;
+       /*  1: active, 0: pasive. Maybe someday we should rename this
+           varable to "active_mode" (Jeff) */
+       pmlmepriv->scan_mode = SCAN_ACTIVE;
 
        spin_lock_init(&pmlmepriv->lock);
        _rtw_init_queue23a(&pmlmepriv->scanned_queue);
@@ -72,11 +75,10 @@ int _rtw_init_mlme_priv23a(struct rtw_adapter *padapter)
 #ifdef CONFIG_8723AU_AP_MODE
 static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen)
 {
-       if(*ppie)
-       {
+       if (*ppie) {
                kfree(*ppie);
                *plen = 0;
-               *ppie=NULL;
+               *ppie = NULL;
        }
 }
 #endif
@@ -86,30 +88,45 @@ void rtw23a_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv)
 #ifdef CONFIG_8723AU_AP_MODE
        kfree(pmlmepriv->assoc_req);
        kfree(pmlmepriv->assoc_rsp);
-       rtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie, &pmlmepriv->wps_beacon_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie, &pmlmepriv->wps_probe_req_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie, &pmlmepriv->wps_probe_resp_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->wps_assoc_resp_ie, &pmlmepriv->wps_assoc_resp_ie_len);
-
-       rtw_free_mlme_ie_data(&pmlmepriv->p2p_beacon_ie, &pmlmepriv->p2p_beacon_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_req_ie, &pmlmepriv->p2p_probe_req_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_resp_ie, &pmlmepriv->p2p_probe_resp_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->p2p_go_probe_resp_ie, &pmlmepriv->p2p_go_probe_resp_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len);
-
-       rtw_free_mlme_ie_data(&pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->wfd_go_probe_resp_ie, &pmlmepriv->wfd_go_probe_resp_ie_len);
-       rtw_free_mlme_ie_data(&pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie,
+                             &pmlmepriv->wps_beacon_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie,
+                             &pmlmepriv->wps_probe_req_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie,
+                             &pmlmepriv->wps_probe_resp_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->wps_assoc_resp_ie,
+                             &pmlmepriv->wps_assoc_resp_ie_len);
+
+       rtw_free_mlme_ie_data(&pmlmepriv->p2p_beacon_ie,
+                             &pmlmepriv->p2p_beacon_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_req_ie,
+                             &pmlmepriv->p2p_probe_req_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_resp_ie,
+                             &pmlmepriv->p2p_probe_resp_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->p2p_go_probe_resp_ie,
+                             &pmlmepriv->p2p_go_probe_resp_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie,
+                             &pmlmepriv->p2p_assoc_req_ie_len);
+
+       rtw_free_mlme_ie_data(&pmlmepriv->wfd_beacon_ie,
+                             &pmlmepriv->wfd_beacon_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_req_ie,
+                             &pmlmepriv->wfd_probe_req_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_resp_ie,
+                             &pmlmepriv->wfd_probe_resp_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->wfd_go_probe_resp_ie,
+                             &pmlmepriv->wfd_go_probe_resp_ie_len);
+       rtw_free_mlme_ie_data(&pmlmepriv->wfd_assoc_req_ie,
+                             &pmlmepriv->wfd_assoc_req_ie_len);
 #endif
 }
 
-void _rtw_free_mlme_priv23a(struct mlme_priv *pmlmepriv)
+void rtw_free_mlme_priv23a(struct mlme_priv *pmlmepriv)
 {
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
+                ("rtw_free_mlme_priv23a\n"));
 
        rtw23a_free_mlme_priv_ie_data(pmlmepriv);
-
 }
 
 struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv)
@@ -129,8 +146,8 @@ struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv)
        return pnetwork;
 }
 
-void _rtw_free_network23a(struct mlme_priv *pmlmepriv,
-                      struct wlan_network *pnetwork, u8 isfreeall)
+static void _rtw_free_network23a(struct mlme_priv *pmlmepriv,
+                                struct wlan_network *pnetwork, u8 isfreeall)
 {
        u32 lifetime = SCANQUEUE_LIFETIME;
 
@@ -150,10 +167,9 @@ void _rtw_free_network23a(struct mlme_priv *pmlmepriv,
 }
 
 void _rtw_free_network23a_nolock23a(struct mlme_priv *pmlmepriv,
-                             struct wlan_network *pnetwork)
+                                   struct wlan_network *pnetwork)
 {
-
-       if (pnetwork == NULL)
+       if (!pnetwork)
                return;
 
        if (pnetwork->fixed == true)
@@ -165,9 +181,9 @@ void _rtw_free_network23a_nolock23a(struct mlme_priv *pmlmepriv,
 }
 
 /*
      return the wlan_network with the matching addr
+ return the wlan_network with the matching addr
 
      Shall be calle under atomic context... to avoid possible racing condition...
+ Shall be calle under atomic context... to avoid possible racing condition...
 */
 struct wlan_network *
 _rtw_find_network23a(struct rtw_queue *scanned_queue, u8 *addr)
@@ -194,7 +210,7 @@ _rtw_find_network23a(struct rtw_queue *scanned_queue, u8 *addr)
                plist = plist->next;
         }
 
-       if(plist == phead)
+       if (plist == phead)
                pnetwork = NULL;
 
        /* spin_unlock_bh(&scanned_queue->lock); */
@@ -208,7 +224,7 @@ void _rtw_free_network23a_queue23a(struct rtw_adapter *padapter, u8 isfreeall)
 {
        struct list_head *phead, *plist, *ptmp;
        struct wlan_network *pnetwork;
-       struct mlme_privpmlmepriv = &padapter->mlmepriv;
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct rtw_queue *scanned_queue = &pmlmepriv->scanned_queue;
 
        spin_lock_bh(&scanned_queue->lock);
@@ -222,20 +238,21 @@ void _rtw_free_network23a_queue23a(struct rtw_adapter *padapter, u8 isfreeall)
        }
 
        spin_unlock_bh(&scanned_queue->lock);
-
 }
 
-int rtw_if_up23a(struct rtw_adapter *padapter) {
-
+int rtw_if_up23a(struct rtw_adapter *padapter)
+{
        int res;
 
-       if(padapter->bDriverStopped || padapter->bSurpriseRemoved ||
-               (check_fwstate(&padapter->mlmepriv, _FW_LINKED)== false)) {
-               RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_if_up23a:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved));
-               res=false;
-       }
-       else
-               res=  true;
+       if (padapter->bDriverStopped || padapter->bSurpriseRemoved ||
+           check_fwstate(&padapter->mlmepriv, _FW_LINKED) == false) {
+               RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
+                        ("rtw_if_up23a:bDriverStopped(%d) OR "
+                         "bSurpriseRemoved(%d)", padapter->bDriverStopped,
+                         padapter->bSurpriseRemoved));
+               res = false;
+       } else
+               res =  true;
 
        return res;
 }
@@ -247,85 +264,127 @@ void rtw_generate_random_ibss23a(u8* pibss)
        pibss[0] = 0x02;  /* in ad-hoc mode bit1 must set to 1 */
        pibss[1] = 0x11;
        pibss[2] = 0x87;
-       pibss[3] = (u8)(curtime & 0xff) ;/* p[0]; */
-       pibss[4] = (u8)((curtime>>8) & 0xff) ;/* p[1]; */
-       pibss[5] = (u8)((curtime>>16) & 0xff) ;/* p[2]; */
+       pibss[3] = curtime & 0xff;/* p[0]; */
+       pibss[4] = (curtime >> 8) & 0xff;/* p[1]; */
+       pibss[5] = (curtime >> 16) & 0xff;/* p[2]; */
 
        return;
 }
 
-u8 *rtw_get_capability23a_from_ie(u8 *ie)
+void rtw_set_roaming(struct rtw_adapter *adapter, u8 to_roaming)
 {
-       return ie + 8 + 2;
+       if (to_roaming == 0)
+               adapter->mlmepriv.to_join = false;
+       adapter->mlmepriv.to_roaming = to_roaming;
 }
 
-u16 rtw_get_capability23a(struct wlan_bssid_ex *bss)
+static void _rtw_roaming(struct rtw_adapter *padapter,
+                        struct wlan_network *tgt_network)
 {
-       u16     val;
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       struct wlan_network *pnetwork;
+       int do_join_r;
 
-       memcpy((u8 *)&val, rtw_get_capability23a_from_ie(bss->IEs), 2);
+       if (tgt_network)
+               pnetwork = tgt_network;
+       else
+               pnetwork = &pmlmepriv->cur_network;
 
-       return le16_to_cpu(val);
+       if (padapter->mlmepriv.to_roaming > 0) {
+               DBG_8723A("roaming from %s("MAC_FMT"), length:%d\n",
+                         pnetwork->network.Ssid.ssid,
+                         MAC_ARG(pnetwork->network.MacAddress),
+                         pnetwork->network.Ssid.ssid_len);
+               memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid,
+                      sizeof(struct cfg80211_ssid));
+
+               pmlmepriv->assoc_by_bssid = false;
+
+               while (1) {
+                       do_join_r = rtw_do_join23a(padapter);
+                       if (do_join_r == _SUCCESS)
+                               break;
+                       else {
+                               DBG_8723A("roaming do_join return %d\n",
+                                         do_join_r);
+                               pmlmepriv->to_roaming--;
+
+                               if (padapter->mlmepriv.to_roaming > 0)
+                                       continue;
+                               else {
+                                       DBG_8723A("%s(%d) -to roaming fail, "
+                                                 "indicate_disconnect\n",
+                                                 __func__, __LINE__);
+                                       rtw_indicate_disconnect23a(padapter);
+                                       break;
+                               }
+                       }
+               }
+       }
 }
 
-u8 *rtw_get_timestampe_from_ie23a(u8 *ie)
+void rtw23a_roaming(struct rtw_adapter *padapter,
+                   struct wlan_network *tgt_network)
 {
-       return ie + 0;
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+
+       spin_lock_bh(&pmlmepriv->lock);
+       _rtw_roaming(padapter, tgt_network);
+       spin_unlock_bh(&pmlmepriv->lock);
 }
 
-u8 *rtw_get_beacon_interval23a_from_ie(u8 *ie)
+u8 *rtw_get_capability23a_from_ie(u8 *ie)
 {
-       return ie + 8;
+       return ie + 8 + 2;
 }
 
-int    rtw_init_mlme_priv23a (struct rtw_adapter *padapter)/* struct   mlme_priv *pmlmepriv) */
+u16 rtw_get_capability23a(struct wlan_bssid_ex *bss)
 {
-       int     res;
+       u16 val;
 
-       res = _rtw_init_mlme_priv23a(padapter);/*  (pmlmepriv); */
+       memcpy(&val, rtw_get_capability23a_from_ie(bss->IEs), 2);
 
-       return res;
+       return le16_to_cpu(val);
 }
 
-void rtw_free_mlme_priv23a (struct mlme_priv *pmlmepriv)
+u8 *rtw_get_beacon_interval23a_from_ie(u8 *ie)
 {
+       return ie + 8;
+}
 
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("rtw_free_mlme_priv23a\n"));
-       _rtw_free_mlme_priv23a(pmlmepriv);
+int rtw_init_mlme_priv23a (struct rtw_adapter *padapter)
+{
+       int     res;
 
+       res = _rtw_init_mlme_priv23a(padapter);
+
+       return res;
 }
 
-void rtw_free_network(struct mlme_priv *pmlmepriv, struct      wlan_network *pnetwork, u8 is_freeall);
-void rtw_free_network(struct mlme_priv *pmlmepriv, struct      wlan_network *pnetwork, u8 is_freeall)/* struct wlan_network *pnetwork, _queue  *free_queue) */
+void rtw_free_network(struct mlme_priv *pmlmepriv,
+                     struct wlan_network *pnetwork, u8 is_freeall)
 {
-
        RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
                 ("rtw_free_network ==> ssid = %s\n\n" ,
                  pnetwork->network.Ssid.ssid));
        _rtw_free_network23a(pmlmepriv, pnetwork, is_freeall);
-
 }
 
-void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork);
-void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork)
+void rtw_free_network_nolock(struct mlme_priv *pmlmepriv,
+                            struct wlan_network *pnetwork)
 {
-
-       /* RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("rtw_free_network ==> ssid = %s\n\n" , pnetwork->network.Ssid.ssid)); */
        _rtw_free_network23a_nolock23a(pmlmepriv, pnetwork);
-
 }
 
 void rtw_free_network_queue23a(struct rtw_adapter* dev, u8 isfreeall)
 {
-
        _rtw_free_network23a_queue23a(dev, isfreeall);
-
 }
 
 /*
      return the wlan_network with the matching addr
+ return the wlan_network with the matching addr
 
      Shall be calle under atomic context... to avoid possible racing condition...
+ Shall be calle under atomic context... to avoid possible racing condition...
 */
 struct wlan_network *
 rtw_find_network23a(struct rtw_queue *scanned_queue, u8 *addr)
@@ -337,25 +396,20 @@ rtw_find_network23a(struct rtw_queue *scanned_queue, u8 *addr)
        return pnetwork;
 }
 
-int rtw_is_same_ibss23a(struct rtw_adapter *adapter, struct wlan_network *pnetwork)
+int rtw_is_same_ibss23a(struct rtw_adapter *adapter,
+                       struct wlan_network *pnetwork)
 {
        int ret = true;
        struct security_priv *psecuritypriv = &adapter->securitypriv;
 
-       if ((psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_) &&
-                   (pnetwork->network.Privacy == 0))
-       {
+       if (psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ &&
+           pnetwork->network.Privacy == 0)
                ret = false;
-       }
-       else if ((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_) &&
-                (pnetwork->network.Privacy == 1))
-       {
+       else if (psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_ &&
+                pnetwork->network.Privacy == 1)
                ret = false;
-       }
        else
-       {
                ret = true;
-       }
 
        return ret;
 }
@@ -363,18 +417,16 @@ int rtw_is_same_ibss23a(struct rtw_adapter *adapter, struct wlan_network *pnetwo
 inline int is_same_ess(struct wlan_bssid_ex *a, struct wlan_bssid_ex *b);
 inline int is_same_ess(struct wlan_bssid_ex *a, struct wlan_bssid_ex *b)
 {
-       /* RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("(%s,%d)(%s,%d)\n", */
-       /*              a->Ssid.Ssid, a->Ssid.SsidLength, b->Ssid.Ssid, b->Ssid.SsidLength)); */
        return (a->Ssid.ssid_len == b->Ssid.ssid_len) &&
                !memcmp(a->Ssid.ssid, b->Ssid.ssid, a->Ssid.ssid_len);
 }
 
 int is_same_network23a(struct wlan_bssid_ex *src, struct wlan_bssid_ex *dst)
 {
-        u16 s_cap, d_cap;
+       u16 s_cap, d_cap;
 
-       memcpy((u8 *)&s_cap, rtw_get_capability23a_from_ie(src->IEs), 2);
-       memcpy((u8 *)&d_cap, rtw_get_capability23a_from_ie(dst->IEs), 2);
+       memcpy(&s_cap, rtw_get_capability23a_from_ie(src->IEs), 2);
+       memcpy(&d_cap, rtw_get_capability23a_from_ie(dst->IEs), 2);
 
        s_cap = le16_to_cpu(s_cap);
        d_cap = le16_to_cpu(d_cap);
@@ -389,10 +441,10 @@ int is_same_network23a(struct wlan_bssid_ex *src, struct wlan_bssid_ex *dst)
                 (d_cap & WLAN_CAPABILITY_ESS)));
 }
 
-struct wlan_network *rtw_get_oldest_wlan_network23a(struct rtw_queue *scanned_queue)
+struct wlan_network *
+rtw_get_oldest_wlan_network23a(struct rtw_queue *scanned_queue)
 {
        struct list_head *plist, *phead;
-
        struct wlan_network *pwlan;
        struct wlan_network *oldest = NULL;
 
@@ -412,7 +464,7 @@ struct wlan_network *rtw_get_oldest_wlan_network23a(struct rtw_queue *scanned_qu
 }
 
 void update_network23a(struct wlan_bssid_ex *dst, struct wlan_bssid_ex *src,
-       struct rtw_adapter * padapter, bool update_ie)
+                      struct rtw_adapter *padapter, bool update_ie)
 {
        u8 ss_ori = dst->PhyInfo.SignalStrength;
        u8 sq_ori = dst->PhyInfo.SignalQuality;
@@ -426,30 +478,35 @@ void update_network23a(struct wlan_bssid_ex *dst, struct wlan_bssid_ex *src,
        u8 sq_final;
        long rssi_final;
 
-       DBG_8723A("%s %s(%pM, ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n",
+       DBG_8723A("%s %s(%pM, ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, "
+                 "ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n",
                  __func__, src->Ssid.ssid, src->MacAddress,
                  src->Configuration.DSConfig, ss_ori, sq_ori, rssi_ori,
                  ss_smp, sq_smp, rssi_smp
        );
 
        /* The rule below is 1/5 for sample value, 4/5 for history value */
-       if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network23a(&padapter->mlmepriv.cur_network.network, src)) {
+       if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) &&
+           is_same_network23a(&padapter->mlmepriv.cur_network.network, src)) {
                /* Take the recvpriv's value for the connected AP*/
                ss_final = padapter->recvpriv.signal_strength;
                sq_final = padapter->recvpriv.signal_qual;
-               /* the rssi value here is undecorated, and will be used for antenna diversity */
+               /* the rssi value here is undecorated, and will be
+                  used for antenna diversity */
                if (sq_smp != 101) /* from the right channel */
                        rssi_final = (src->Rssi+dst->Rssi*4)/5;
                else
                        rssi_final = rssi_ori;
-       }
-       else {
+       } else {
                if (sq_smp != 101) { /* from the right channel */
-                       ss_final = ((u32)(src->PhyInfo.SignalStrength)+(u32)(dst->PhyInfo.SignalStrength)*4)/5;
-                       sq_final = ((u32)(src->PhyInfo.SignalQuality)+(u32)(dst->PhyInfo.SignalQuality)*4)/5;
-                       rssi_final = (src->Rssi+dst->Rssi*4)/5;
+                       ss_final = ((u32)src->PhyInfo.SignalStrength +
+                                   (u32)dst->PhyInfo.SignalStrength * 4) / 5;
+                       sq_final = ((u32)src->PhyInfo.SignalQuality +
+                                   (u32)dst->PhyInfo.SignalQuality * 4) / 5;
+                       rssi_final = src->Rssi+dst->Rssi * 4 / 5;
                } else {
-                       /* bss info not receving from the right channel, use the original RX signal infos */
+                       /* bss info not receving from the right channel, use
+                          the original RX signal infos */
                        ss_final = dst->PhyInfo.SignalStrength;
                        sq_final = dst->PhyInfo.SignalQuality;
                        rssi_final = dst->Rssi;
@@ -458,35 +515,32 @@ void update_network23a(struct wlan_bssid_ex *dst, struct wlan_bssid_ex *src,
        }
 
        if (update_ie)
-               memcpy((u8 *)dst, (u8 *)src, get_wlan_bssid_ex_sz(src));
+               memcpy(dst, src, get_wlan_bssid_ex_sz(src));
 
        dst->PhyInfo.SignalStrength = ss_final;
        dst->PhyInfo.SignalQuality = sq_final;
        dst->Rssi = rssi_final;
 
-       DBG_8723A("%s %s(%pM), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n",
-                 __func__, dst->Ssid.ssid, dst->MacAddress,
+       DBG_8723A("%s %s(%pM), SignalStrength:%u, SignalQuality:%u, "
+                 "RawRSSI:%ld\n",  __func__, dst->Ssid.ssid, dst->MacAddress,
                  dst->PhyInfo.SignalStrength,
                  dst->PhyInfo.SignalQuality, dst->Rssi);
-
 }
 
-static void update_current_network(struct rtw_adapter *adapter, struct wlan_bssid_ex *pnetwork)
+static void update_current_network(struct rtw_adapter *adapter,
+                                  struct wlan_bssid_ex *pnetwork)
 {
-       struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
-
-       if ((check_fwstate(pmlmepriv, _FW_LINKED)== true) && (is_same_network23a(&pmlmepriv->cur_network.network, pnetwork)))
-       {
-               /* RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n"); */
+       struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
 
-               /* if(pmlmepriv->cur_network.network.IELength<= pnetwork->IELength) */
-               {
-                       update_network23a(&pmlmepriv->cur_network.network, pnetwork,adapter, true);
-                       rtw_update_protection23a(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof (struct ndis_802_11_fixed_ies),
-                                                                       pmlmepriv->cur_network.network.IELength);
-               }
+       if (check_fwstate(pmlmepriv, _FW_LINKED) &&
+           is_same_network23a(&pmlmepriv->cur_network.network, pnetwork)) {
+               update_network23a(&pmlmepriv->cur_network.network,
+                                 pnetwork,adapter, true);
+               rtw_update_protection23a(adapter,
+                                        pmlmepriv->cur_network.network.IEs +
+                                        sizeof (struct ndis_802_11_fixed_ies),
+                                        pmlmepriv->cur_network.network.IELength);
        }
-
 }
 
 /*
@@ -494,7 +548,8 @@ static void update_current_network(struct rtw_adapter *adapter, struct wlan_bssi
 Caller must hold pmlmepriv->lock first.
 
 */
-void rtw_update_scanned_network23a(struct rtw_adapter *adapter, struct wlan_bssid_ex *target)
+void rtw_update_scanned_network23a(struct rtw_adapter *adapter,
+                                  struct wlan_bssid_ex *target)
 {
        struct list_head *plist, *phead;
        struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
@@ -561,19 +616,20 @@ void rtw_update_scanned_network23a(struct rtw_adapter *adapter, struct wlan_bssi
 
                /* target.reserved == 1, means that scanned network is
                 * a bcn frame. */
-               if ((pnetwork->network.IELength>target->IELength) &&
-                   (target->reserved == 1))
+               if (pnetwork->network.IELength > target->IELength &&
+                   target->reserved == 1)
                        update_ie = false;
 
-               update_network23a(&pnetwork->network, target,adapter, update_ie);
+               update_network23a(&pnetwork->network, target,adapter,
+                                 update_ie);
        }
 
 exit:
        spin_unlock_bh(&queue->lock);
-
 }
 
-void rtw_add_network(struct rtw_adapter *adapter, struct wlan_bssid_ex *pnetwork)
+void rtw_add_network(struct rtw_adapter *adapter,
+                    struct wlan_bssid_ex *pnetwork)
 {
        update_current_network(adapter, pnetwork);
        rtw_update_scanned_network23a(adapter, pnetwork);
@@ -585,7 +641,8 @@ void rtw_add_network(struct rtw_adapter *adapter, struct wlan_bssid_ex *pnetwork
 /*                        (3) WMM */
 /*                        (4) HT */
 /*                      (5) others */
-int rtw_is_desired_network(struct rtw_adapter *adapter, struct wlan_network *pnetwork)
+int rtw_is_desired_network(struct rtw_adapter *adapter,
+                          struct wlan_network *pnetwork)
 {
        struct security_priv *psecuritypriv = &adapter->securitypriv;
        struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
@@ -600,31 +657,31 @@ int rtw_is_desired_network(struct rtw_adapter *adapter, struct wlan_network *pne
        desired_encmode = psecuritypriv->ndisencryptstatus;
        privacy = pnetwork->network.Privacy;
 
-       if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS))
-       {
-               if (rtw_get_wps_ie23a(pnetwork->network.IEs+_FIXED_IE_LENGTH_, pnetwork->network.IELength-_FIXED_IE_LENGTH_, NULL, &wps_ielen)!= NULL)
-               {
+       if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) {
+               if (rtw_get_wps_ie23a(pnetwork->network.IEs + _FIXED_IE_LENGTH_,
+                                     pnetwork->network.IELength -
+                                     _FIXED_IE_LENGTH_, NULL, &wps_ielen))
                        return true;
-               }
                else
-               {
                        return false;
-               }
        }
-       if (adapter->registrypriv.wifi_spec == 1) /* for  correct flow of 8021X  to do.... */
-       {
-               if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0))
+       if (adapter->registrypriv.wifi_spec == 1) {
+               /* for  correct flow of 8021X  to do.... */
+               if (desired_encmode == Ndis802_11EncryptionDisabled &&
+                   privacy != 0)
                    bselected = false;
        }
 
-       if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) {
-               DBG_8723A("desired_encmode: %d, privacy: %d\n", desired_encmode, privacy);
+       if (desired_encmode != Ndis802_11EncryptionDisabled &&
+           privacy == 0) {
+               DBG_8723A("desired_encmode: %d, privacy: %d\n",
+                         desired_encmode, privacy);
                bselected = false;
        }
 
-       if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)
-       {
-               if (pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode)
+       if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
+               if (pnetwork->network.InfrastructureMode !=
+                   pmlmepriv->cur_network.network.InfrastructureMode)
                        bselected = false;
        }
 
@@ -632,15 +689,14 @@ int rtw_is_desired_network(struct rtw_adapter *adapter, struct wlan_network *pne
 }
 
 /* TODO: Perry : For Power Management */
-void rtw_atimdone_event_callback23a(struct rtw_adapter *adapter , u8 *pbuf)
+void rtw_atimdone_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
 {
-
        RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("receive atimdone_evet\n"));
 
        return;
 }
 
-void rtw_survey_event_cb23a(struct rtw_adapter *adapter, u8 *pbuf)
+void rtw_survey_event_cb23a(struct rtw_adapter *adapter, u8 *pbuf)
 {
        u32 len;
        struct wlan_bssid_ex *pnetwork;
@@ -648,31 +704,36 @@ void rtw_survey_event_cb23a(struct rtw_adapter    *adapter, u8 *pbuf)
 
        pnetwork = (struct wlan_bssid_ex *)pbuf;
 
-       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_survey_event_cb23a, ssid=%s\n",  pnetwork->Ssid.ssid));
+       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,
+                ("rtw_survey_event_cb23a, ssid=%s\n", pnetwork->Ssid.ssid));
 
        len = get_wlan_bssid_ex_sz(pnetwork);
-       if(len > (sizeof(struct wlan_bssid_ex)))
-       {
-               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n ****rtw_survey_event_cb23a: return a wrong bss ***\n"));
+       if (len > (sizeof(struct wlan_bssid_ex))) {
+               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
+                        ("\n ****rtw_survey_event_cb23a: return a wrong "
+                         "bss ***\n"));
                return;
        }
 
        spin_lock_bh(&pmlmepriv->lock);
 
        /*  update IBSS_network 's timestamp */
-       if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == true)
-       {
-               /* RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,"rtw_survey_event_cb23a : WIFI_ADHOC_MASTER_STATE\n\n"); */
+       if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
+               /* RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
+                  "rtw_survey_event_cb23a : WIFI_ADHOC_MASTER_STATE\n\n"); */
                if (ether_addr_equal(pmlmepriv->cur_network.network.MacAddress,
                                     pnetwork->MacAddress)) {
-                       struct wlan_network* ibss_wlan = NULL;
+                       struct wlan_network* ibss_wlan;
 
-                       memcpy(pmlmepriv->cur_network.network.IEs, pnetwork->IEs, 8);
+                       memcpy(pmlmepriv->cur_network.network.IEs,
+                              pnetwork->IEs, 8);
                        spin_lock_bh(&pmlmepriv->scanned_queue.lock);
-                       ibss_wlan = rtw_find_network23a(&pmlmepriv->scanned_queue,  pnetwork->MacAddress);
-                       if (ibss_wlan)
-                       {
-                               memcpy(ibss_wlan->network.IEs , pnetwork->IEs, 8);
+                       ibss_wlan = rtw_find_network23a(
+                               &pmlmepriv->scanned_queue,
+                               pnetwork->MacAddress);
+                       if (ibss_wlan) {
+                               memcpy(ibss_wlan->network.IEs,
+                                      pnetwork->IEs, 8);
                                spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
                                goto exit;
                        }
@@ -681,8 +742,7 @@ void rtw_survey_event_cb23a(struct rtw_adapter      *adapter, u8 *pbuf)
        }
 
        /*  lock pmlmepriv->lock when you accessing network_q */
-       if ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == false)
-       {
+       if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == false) {
                if (pnetwork->Ssid.ssid[0] == 0)
                        pnetwork->Ssid.ssid_len = 0;
 
@@ -696,10 +756,12 @@ exit:
        return;
 }
 
-void rtw_surveydone_event_callback23a(struct rtw_adapter       *adapter, u8 *pbuf)
+void rtw_surveydone_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
 {
        struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
        struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
+       struct wlan_bssid_ex *pdev_network;
+       u8 *pibss;
 
        spin_lock_bh(&pmlmepriv->lock);
 
@@ -709,47 +771,62 @@ void rtw_surveydone_event_callback23a(struct rtw_adapter  *adapter, u8 *pbuf)
                pmlmepriv->wps_probe_req_ie = NULL;
        }
 
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_surveydone_event_callback23a: fw_state:%x\n\n", get_fwstate(pmlmepriv)));
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
+                ("rtw_surveydone_event_callback23a: fw_state:%x\n\n",
+                 get_fwstate(pmlmepriv)));
 
        if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {
                del_timer_sync(&pmlmepriv->scan_to_timer);
 
                _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
        } else {
-
-               RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv)));
+               RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
+                        ("nic status =%x, survey done event comes too late!\n",
+                         get_fwstate(pmlmepriv)));
        }
 
        rtw_set_signal_stat_timer(&adapter->recvpriv);
 
        if (pmlmepriv->to_join == true) {
-               if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)) {
+               if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
                        if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
                                set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
 
-                               if (rtw_select_and_join_from_scanned_queue23a(pmlmepriv) == _SUCCESS) {
+                               if (rtw_select_and_join_from_scanned_queue23a(
+                                           pmlmepriv) == _SUCCESS) {
                                        mod_timer(&pmlmepriv->assoc_timer,
                                                  jiffies + msecs_to_jiffies(MAX_JOIN_TIMEOUT));
                                } else {
-                                       struct wlan_bssid_ex *pdev_network = &adapter->registrypriv.dev_network;
-                                       u8 *pibss = adapter->registrypriv.dev_network.MacAddress;
+                                       pdev_network = &adapter->registrypriv.dev_network;
+                                       pibss = adapter->registrypriv.dev_network.MacAddress;
 
-                                       _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
+                                       _clr_fwstate_(pmlmepriv,
+                                                     _FW_UNDER_SURVEY);
 
-                                       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("switching to adhoc master\n"));
+                                       RT_TRACE(_module_rtl871x_mlme_c_,
+                                                _drv_err_,
+                                                ("switching to adhoc "
+                                                 "master\n"));
 
-                                       memset(&pdev_network->Ssid, 0, sizeof(struct cfg80211_ssid));
-                                       memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct cfg80211_ssid));
+                                       memset(&pdev_network->Ssid, 0,
+                                              sizeof(struct cfg80211_ssid));
+                                       memcpy(&pdev_network->Ssid,
+                                              &pmlmepriv->assoc_ssid,
+                                              sizeof(struct cfg80211_ssid));
 
-                                       rtw_update_registrypriv_dev_network23a(adapter);
+                                       rtw_update_registrypriv_dev_network23a(
+                                               adapter);
                                        rtw_generate_random_ibss23a(pibss);
 
-                                       pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;
+                                       pmlmepriv->fw_state =
+                                               WIFI_ADHOC_MASTER_STATE;
 
-                                       if (rtw_createbss_cmd23a(adapter)!= _SUCCESS)
-                                       {
-                                       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("Error =>rtw_createbss_cmd23a status FAIL\n"));
-                                       }
+                                       if (rtw_createbss_cmd23a(adapter) !=
+                                           _SUCCESS)
+                                       RT_TRACE(_module_rtl871x_mlme_c_,
+                                                _drv_err_,
+                                                ("Error =>rtw_createbss_cmd23a"
+                                                 " status FAIL\n"));
 
                                        pmlmepriv->to_join = false;
                                }
@@ -758,27 +835,32 @@ void rtw_surveydone_event_callback23a(struct rtw_adapter  *adapter, u8 *pbuf)
                        int ret;
                        set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
                        pmlmepriv->to_join = false;
-                       ret = rtw_select_and_join_from_scanned_queue23a(pmlmepriv);
+                       ret = rtw_select_and_join_from_scanned_queue23a(
+                               pmlmepriv);
                        if (ret == _SUCCESS) {
                                unsigned long e;
                                e = msecs_to_jiffies(MAX_JOIN_TIMEOUT);
                                mod_timer(&pmlmepriv->assoc_timer, jiffies + e);
-                       } else if (ret == 2)/* there is no need to wait for join */
-                       {
+                       } else if (ret == 2) {/* there is no need to wait */
                                _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
                                rtw_indicate_connect23a(adapter);
                        } else {
-                               DBG_8723A("try_to_join, but select scanning queue fail, to_roaming:%d\n", rtw_to_roaming(adapter));
-                               if (rtw_to_roaming(adapter) != 0) {
-                                       if (--pmlmepriv->to_roaming == 0
-                                               || _SUCCESS != rtw_sitesurvey_cmd23a(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)
-                                       ) {
+                               DBG_8723A("try_to_join, but select scanning "
+                                         "queue fail, to_roaming:%d\n",
+                                         adapter->mlmepriv.to_roaming);
+                               if (adapter->mlmepriv.to_roaming) {
+                                       if (--pmlmepriv->to_roaming == 0 ||
+                                           rtw_sitesurvey_cmd23a(
+                                                   adapter,
+                                                   &pmlmepriv->assoc_ssid, 1,
+                                                   NULL, 0) != _SUCCESS) {
                                                rtw_set_roaming(adapter, 0);
-                                               rtw_free_assoc_resources23a(adapter, 1);
-                                               rtw_indicate_disconnect23a(adapter);
-                                       } else {
+                                               rtw_free_assoc_resources23a(
+                                                       adapter, 1);
+                                               rtw_indicate_disconnect23a(
+                                                       adapter);
+                                       } else
                                                pmlmepriv->to_join = true;
-                                       }
                                }
                                _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
                        }
@@ -787,18 +869,12 @@ void rtw_surveydone_event_callback23a(struct rtw_adapter  *adapter, u8 *pbuf)
 
        spin_unlock_bh(&pmlmepriv->lock);
 
-#ifdef CONFIG_8723AU_P2P
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-               p2p_ps_wk_cmd23a(adapter, P2P_PS_SCAN_DONE, 0);
-#endif /*  CONFIG_8723AU_P2P */
-
        rtw_os_xmit_schedule23a(adapter);
 
-       if(pmlmeext->sitesurvey_res.bss_cnt == 0)
+       if (pmlmeext->sitesurvey_res.bss_cnt == 0)
                rtw_hal_sreset_reset23a(adapter);
 
        rtw_cfg80211_surveydone_event_callback(adapter);
-
 }
 
 void rtw_dummy_event_callback23a(struct rtw_adapter *adapter , u8 *pbuf)
@@ -809,7 +885,7 @@ void rtw23a_fwdbg_event_callback(struct rtw_adapter *adapter , u8 *pbuf)
 {
 }
 
-static void free_scanqueue(struct      mlme_priv *pmlmepriv)
+static void free_scanqueue(struct mlme_priv *pmlmepriv)
 {
        struct wlan_network *pnetwork;
        struct rtw_queue *scan_queue = &pmlmepriv->scanned_queue;
@@ -827,42 +903,38 @@ static void free_scanqueue(struct mlme_priv *pmlmepriv)
         }
 
        spin_unlock_bh(&scan_queue->lock);
-
 }
 
 /*
-*rtw_free_assoc_resources23a: the caller has to lock pmlmepriv->lock
-*/
-void rtw_free_assoc_resources23a(struct rtw_adapter *adapter, int lock_scanned_queue)
+ *rtw_free_assoc_resources23a: the caller has to lock pmlmepriv->lock
+ */
+void rtw_free_assoc_resources23a(struct rtw_adapter *adapter,
+                                int lock_scanned_queue)
 {
-       struct wlan_network* pwlan = NULL;
-       struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
-       struct  sta_priv *pstapriv = &adapter->stapriv;
+       struct wlan_network* pwlan;
+       struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
+       struct sta_priv *pstapriv = &adapter->stapriv;
        struct wlan_network *tgt_network = &pmlmepriv->cur_network;
+       struct sta_info* psta;
 
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_free_assoc_resources23a\n"));
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("tgt_network->network.MacAddress="MAC_FMT" ssid=%s\n",
-               MAC_ARG(tgt_network->network.MacAddress), tgt_network->network.Ssid.ssid));
-
-       if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE))
-       {
-               struct sta_info* psta;
-
-               psta = rtw_get_stainfo23a(&adapter->stapriv, tgt_network->network.MacAddress);
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,
+                ("+rtw_free_assoc_resources23a\n"));
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
+                ("tgt_network->network.MacAddress="MAC_FMT" ssid=%s\n",
+                 MAC_ARG(tgt_network->network.MacAddress),
+                 tgt_network->network.Ssid.ssid));
 
-               {
-                       spin_lock_bh(&pstapriv->sta_hash_lock);
-                       rtw_free_stainfo23a(adapter,  psta);
-               }
+       if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE)) {
+               psta = rtw_get_stainfo23a(&adapter->stapriv,
+                                         tgt_network->network.MacAddress);
 
+               spin_lock_bh(&pstapriv->sta_hash_lock);
+               rtw_free_stainfo23a(adapter,  psta);
                spin_unlock_bh(&pstapriv->sta_hash_lock);
-
        }
 
-       if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE))
-       {
-               struct sta_info* psta;
-
+       if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE |
+                         WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) {
                rtw_free_all_stainfo23a(adapter);
 
                psta = rtw_get_bcmc_stainfo23a(adapter);
@@ -873,23 +945,25 @@ void rtw_free_assoc_resources23a(struct rtw_adapter *adapter, int lock_scanned_q
                rtw_init_bcmc_stainfo23a(adapter);
        }
 
-       if(lock_scanned_queue)
+       if (lock_scanned_queue)
                spin_lock_bh(&pmlmepriv->scanned_queue.lock);
 
-       pwlan = rtw_find_network23a(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
-       if(pwlan)
+       pwlan = rtw_find_network23a(&pmlmepriv->scanned_queue,
+                                   tgt_network->network.MacAddress);
+       if (pwlan)
                pwlan->fixed = false;
        else
-               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_assoc_resources23a : pwlan== NULL\n\n"));
+               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
+                        ("rtw_free_assoc_resources23a : pwlan== NULL\n"));
 
-       if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count == 1))
+       if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) &&
+           adapter->stapriv.asoc_sta_count == 1)
                rtw_free_network_nolock(pmlmepriv, pwlan);
 
-       if(lock_scanned_queue)
+       if (lock_scanned_queue)
                spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
 
        pmlmepriv->key_mask = 0;
-
 }
 
 /*
@@ -897,46 +971,54 @@ void rtw_free_assoc_resources23a(struct rtw_adapter *adapter, int lock_scanned_q
 */
 void rtw_indicate_connect23a(struct rtw_adapter *padapter)
 {
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_connect23a\n"));
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
+                ("+rtw_indicate_connect23a\n"));
 
        pmlmepriv->to_join = false;
 
-       if(!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
+       if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
                set_fwstate(pmlmepriv, _FW_LINKED);
 
                rtw_led_control(padapter, LED_CTL_LINK);
 
-               rtw_os_indicate_connect23a(padapter);
+               rtw_cfg80211_indicate_connect(padapter);
+
+               netif_carrier_on(padapter->pnetdev);
+
+               if (padapter->pid[2] != 0)
+                       kill_pid(find_vpid(padapter->pid[2]), SIGALRM, 1);
        }
 
        rtw_set_roaming(padapter, 0);
 
        rtw_set_scan_deny(padapter, 3000);
 
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("-rtw_indicate_connect23a: fw_state=0x%08x\n", get_fwstate(pmlmepriv)));
-
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
+                ("-rtw_indicate_connect23a: fw_state=0x%08x\n",
+                 get_fwstate(pmlmepriv)));
 }
 
 /*
-*rtw_indicate_disconnect23a: the caller has to lock pmlmepriv->lock
-*/
+ *rtw_indicate_disconnect23a: the caller has to lock pmlmepriv->lock
+ */
 void rtw_indicate_disconnect23a(struct rtw_adapter *padapter)
 {
        struct  mlme_priv *pmlmepriv = &padapter->mlmepriv;
 
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_disconnect23a\n"));
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
+                ("+rtw_indicate_disconnect23a\n"));
 
        _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING|WIFI_UNDER_WPS);
 
         /* DBG_8723A("clear wps when %s\n", __func__); */
 
-       if (rtw_to_roaming(padapter) > 0)
+       if (padapter->mlmepriv.to_roaming > 0)
                _clr_fwstate_(pmlmepriv, _FW_LINKED);
 
        if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) ||
-           (rtw_to_roaming(padapter) <= 0)) {
+           padapter->mlmepriv.to_roaming <= 0) {
                rtw_os_indicate_disconnect23a(padapter);
 
                /* set ips_deny_time to avoid enter IPS before LPS leave */
@@ -951,17 +1033,7 @@ void rtw_indicate_disconnect23a(struct rtw_adapter *padapter)
 
        }
 
-#ifdef CONFIG_8723AU_P2P
-       p2p_ps_wk_cmd23a(padapter, P2P_PS_DISABLE, 1);
-#endif /*  CONFIG_8723AU_P2P */
-
        rtw_lps_ctrl_wk_cmd23a(padapter, LPS_CTRL_DISCONNECT, 1);
-
-}
-
-inline void rtw_indicate_scan_done23a(struct rtw_adapter *padapter, bool aborted)
-{
-       rtw_os_indicate_scan_done23a(padapter, aborted);
 }
 
 void rtw_scan_abort23a(struct rtw_adapter *adapter)
@@ -974,36 +1046,39 @@ void rtw_scan_abort23a(struct rtw_adapter *adapter)
        pmlmeext->scan_abort = true;
        while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) &&
               jiffies_to_msecs(jiffies - start) <= 200) {
-
                if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
                        break;
 
-               DBG_8723A(FUNC_NDEV_FMT"fw_state = _FW_UNDER_SURVEY!\n", FUNC_NDEV_ARG(adapter->pnetdev));
+               DBG_8723A(FUNC_NDEV_FMT "fw_state = _FW_UNDER_SURVEY!\n",
+                         FUNC_NDEV_ARG(adapter->pnetdev));
                msleep(20);
        }
 
        if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {
                if (!adapter->bDriverStopped && !adapter->bSurpriseRemoved)
-                       DBG_8723A(FUNC_NDEV_FMT"waiting for scan_abort time out!\n", FUNC_NDEV_ARG(adapter->pnetdev));
-               rtw_indicate_scan_done23a(adapter, true);
+                       DBG_8723A(FUNC_NDEV_FMT "waiting for scan_abort time "
+                                 "out!\n", FUNC_NDEV_ARG(adapter->pnetdev));
+               rtw_cfg80211_indicate_scan_done(wdev_to_priv(adapter->rtw_wdev),
+                                               true);
        }
        pmlmeext->scan_abort = false;
 }
 
-static struct sta_info *rtw_joinbss_update_stainfo(struct rtw_adapter *padapter, struct wlan_network *pnetwork)
+static struct sta_info *
+rtw_joinbss_update_stainfo(struct rtw_adapter *padapter,
+                          struct wlan_network *pnetwork)
 {
        int i;
-       struct sta_info *bmc_sta, *psta = NULL;
+       struct sta_info *bmc_sta, *psta;
        struct recv_reorder_ctrl *preorder_ctrl;
        struct sta_priv *pstapriv = &padapter->stapriv;
 
        psta = rtw_get_stainfo23a(pstapriv, pnetwork->network.MacAddress);
-       if (psta == NULL) {
-               psta = rtw_alloc_stainfo23a(pstapriv, pnetwork->network.MacAddress);
-       }
+       if (!psta)
+               psta = rtw_alloc_stainfo23a(pstapriv,
+                                           pnetwork->network.MacAddress);
 
-       if (psta) /* update ptarget_sta */
-       {
+       if (psta) { /* update ptarget_sta */
                DBG_8723A("%s\n", __func__);
 
                psta->aid  = pnetwork->join_res;
@@ -1013,57 +1088,63 @@ static struct sta_info *rtw_joinbss_update_stainfo(struct rtw_adapter *padapter,
                rtw_hal_set_odm_var23a(padapter, HAL_ODM_STA_INFO, psta, true);
 
                /* security related */
-               if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)
-               {
+               if (padapter->securitypriv.dot11AuthAlgrthm ==
+                   dot11AuthAlgrthm_8021X) {
                        padapter->securitypriv.binstallGrpkey = false;
                        padapter->securitypriv.busetkipkey = false;
                        padapter->securitypriv.bgrpkey_handshake = false;
 
                        psta->ieee8021x_blocked = true;
-                       psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;
+                       psta->dot118021XPrivacy =
+                               padapter->securitypriv.dot11PrivacyAlgrthm;
 
-                       memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof (union Keytype));
+                       memset(&psta->dot118021x_UncstKey, 0,
+                              sizeof (union Keytype));
 
-                       memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof (union Keytype));
-                       memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype));
+                       memset(&psta->dot11tkiprxmickey, 0,
+                              sizeof (union Keytype));
+                       memset(&psta->dot11tkiptxmickey, 0,
+                              sizeof (union Keytype));
 
-                       memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48));
-                       memset((u8 *)&psta->dot11rxpn, 0, sizeof (union pn48));
+                       memset(&psta->dot11txpn, 0, sizeof (union pn48));
+                       memset(&psta->dot11rxpn, 0, sizeof (union pn48));
                }
 
                /*      Commented by Albert 2012/07/21 */
                /*      When doing the WPS, the wps_ie_len won't equal to 0 */
-               /*      And the Wi-Fi driver shouldn't allow the data packet to be tramsmitted. */
-               if (padapter->securitypriv.wps_ie_len != 0)
-               {
+               /*      And the Wi-Fi driver shouldn't allow the data packet
+                       to be tramsmitted. */
+               if (padapter->securitypriv.wps_ie_len != 0) {
                        psta->ieee8021x_blocked = true;
                        padapter->securitypriv.wps_ie_len = 0;
                }
 
-               /* for A-MPDU Rx reordering buffer control for bmc_sta & sta_info */
-               /* if A-MPDU Rx is enabled, reseting  rx_ordering_ctrl wstart_b(indicate_seq) to default value = 0xffff */
+               /* for A-MPDU Rx reordering buffer control for bmc_sta &
+                * sta_info */
+               /* if A-MPDU Rx is enabled, reseting
+                  rx_ordering_ctrl wstart_b(indicate_seq) to default
+                  value = 0xffff */
                /* todo: check if AP can send A-MPDU packets */
-               for (i = 0; i < 16 ; i++)
-               {
+               for (i = 0; i < 16 ; i++) {
                        /* preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; */
                        preorder_ctrl = &psta->recvreorder_ctrl[i];
                        preorder_ctrl->enable = false;
                        preorder_ctrl->indicate_seq = 0xffff;
                        preorder_ctrl->wend_b = 0xffff;
-                       preorder_ctrl->wsize_b = 64;/* max_ampdu_sz; ex. 32(kbytes) -> wsize_b = 32 */
+                       /* max_ampdu_sz; ex. 32(kbytes) -> wsize_b = 32 */
+                       preorder_ctrl->wsize_b = 64;
                }
 
                bmc_sta = rtw_get_bcmc_stainfo23a(padapter);
-               if (bmc_sta)
-               {
-                       for (i = 0; i < 16 ; i++)
-                       {
-                               /* preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; */
+               if (bmc_sta) {
+                       for (i = 0; i < 16 ; i++) {
                                preorder_ctrl = &bmc_sta->recvreorder_ctrl[i];
                                preorder_ctrl->enable = false;
                                preorder_ctrl->indicate_seq = 0xffff;
                                preorder_ctrl->wend_b = 0xffff;
-                               preorder_ctrl->wsize_b = 64;/* max_ampdu_sz; ex. 32(kbytes) -> wsize_b = 32 */
+                               /* max_ampdu_sz; ex. 32(kbytes) ->
+                                  wsize_b = 32 */
+                               preorder_ctrl->wsize_b = 64;
                        }
                }
 
@@ -1077,29 +1158,41 @@ static struct sta_info *rtw_joinbss_update_stainfo(struct rtw_adapter *padapter,
 
 /* pnetwork : returns from rtw23a_joinbss_event_cb */
 /* ptarget_wlan: found from scanned_queue */
-static void rtw_joinbss_update_network23a(struct rtw_adapter *padapter, struct wlan_network *ptarget_wlan, struct wlan_network  *pnetwork)
+static void
+rtw_joinbss_update_network23a(struct rtw_adapter *padapter,
+                             struct wlan_network *ptarget_wlan,
+                             struct wlan_network  *pnetwork)
 {
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct wlan_network *cur_network = &pmlmepriv->cur_network;
 
        DBG_8723A("%s\n", __func__);
 
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("\nfw_state:%x, BSSID:"MAC_FMT"\n"
-               , get_fwstate(pmlmepriv), MAC_ARG(pnetwork->network.MacAddress)));
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
+                ("\nfw_state:%x, BSSID:"MAC_FMT"\n", get_fwstate(pmlmepriv),
+                 MAC_ARG(pnetwork->network.MacAddress)));
 
        /*  why not use ptarget_wlan?? */
-       memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length);
+       memcpy(&cur_network->network, &pnetwork->network,
+              pnetwork->network.Length);
        /*  some IEs in pnetwork is wrong, so we should use ptarget_wlan IEs */
        cur_network->network.IELength = ptarget_wlan->network.IELength;
-       memcpy(&cur_network->network.IEs[0], &ptarget_wlan->network.IEs[0], MAX_IE_SZ);
+       memcpy(&cur_network->network.IEs[0], &ptarget_wlan->network.IEs[0],
+              MAX_IE_SZ);
 
        cur_network->aid = pnetwork->join_res;
 
        rtw_set_signal_stat_timer(&padapter->recvpriv);
-       padapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength;
-       padapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality;
-       /* the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) */
-       padapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength);
+       padapter->recvpriv.signal_strength =
+               ptarget_wlan->network.PhyInfo.SignalStrength;
+       padapter->recvpriv.signal_qual =
+               ptarget_wlan->network.PhyInfo.SignalQuality;
+       /*
+        * the ptarget_wlan->network.Rssi is raw data, we use
+        * ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled)
+        */
+       padapter->recvpriv.rssi = translate_percentage_to_dbm(
+               ptarget_wlan->network.PhyInfo.SignalStrength);
        DBG_8723A("%s signal_strength:%3u, rssi:%3d, signal_qual:%3u\n",
                  __func__, padapter->recvpriv.signal_strength,
                  padapter->recvpriv.rssi, padapter->recvpriv.signal_qual);
@@ -1118,40 +1211,51 @@ static void rtw_joinbss_update_network23a(struct rtw_adapter *padapter, struct w
                break;
        default:
                pmlmepriv->fw_state = WIFI_NULL_STATE;
-               RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("Invalid network_mode\n"));
+               RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
+                        ("Invalid network_mode\n"));
                break;
        }
 
-       rtw_update_protection23a(padapter, (cur_network->network.IEs) + sizeof (struct ndis_802_11_fixed_ies),
-                                                                       (cur_network->network.IELength));
+       rtw_update_protection23a(padapter, cur_network->network.IEs +
+                                sizeof (struct ndis_802_11_fixed_ies),
+                                cur_network->network.IELength);
 
-       rtw_update_ht_cap23a(padapter, cur_network->network.IEs, cur_network->network.IELength);
+       rtw_update_ht_cap23a(padapter, cur_network->network.IEs,
+                            cur_network->network.IELength);
 }
 
-/* Notes: the fucntion could be > passive_level (the same context as Rx tasklet) */
-/* pnetwork : returns from rtw23a_joinbss_event_cb */
-/* ptarget_wlan: found from scanned_queue */
-/* if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if  "ptarget_sta" & "ptarget_wlan" exist. */
-/* if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist. */
-/* if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan !=NULL). */
+/*
+ * Notes:
+ * the fucntion could be > passive_level (the same context as Rx tasklet)
+ * pnetwork : returns from rtw23a_joinbss_event_cb
+ * ptarget_wlan: found from scanned_queue
+ * if join_res > 0, for (fw_state==WIFI_STATION_STATE),
+ * we check if  "ptarget_sta" & "ptarget_wlan" exist.
+ * if join_res > 0, for (fw_state==WIFI_ADHOC_STATE),
+ * we only check if "ptarget_wlan" exist.
+ * if join_res > 0, update "cur_network->network" from "pnetwork->network"
+ * if (ptarget_wlan !=NULL).
+ */
 
 void rtw_joinbss_event_prehandle23a(struct rtw_adapter *adapter, u8 *pbuf)
 {
-       static u8 retry=0;
-       struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL;
-       struct  sta_priv *pstapriv = &adapter->stapriv;
-       struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
-       struct wlan_network     *pnetwork       = (struct wlan_network *)pbuf;
+       struct sta_info *ptarget_sta, *pcur_sta;
+       struct sta_priv *pstapriv = &adapter->stapriv;
+       struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
+       struct wlan_network *pnetwork = (struct wlan_network *)pbuf;
        struct wlan_network *cur_network = &pmlmepriv->cur_network;
-       struct wlan_network     *pcur_wlan = NULL, *ptarget_wlan = NULL;
-       unsigned int            the_same_macaddr = false;
+       struct wlan_network *pcur_wlan, *ptarget_wlan = NULL;
+       bool the_same_macaddr;
 
-       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res));
+       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,
+                ("joinbss event call back received with res=%d\n",
+                 pnetwork->join_res));
 
        rtw_get_encrypt_decrypt_from_registrypriv23a(adapter);
 
        if (pmlmepriv->assoc_ssid.ssid_len == 0) {
-               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@   joinbss event call back  for Any SSid\n"));
+               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
+                        ("@@@@@   joinbss event call back  for Any SSid\n"));
        } else {
                RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
                         ("@@@@@   rtw23a_joinbss_event_cb for SSid:%s\n",
@@ -1165,93 +1269,102 @@ void rtw_joinbss_event_prehandle23a(struct rtw_adapter *adapter, u8 *pbuf)
                the_same_macaddr = false;
 
        pnetwork->network.Length = get_wlan_bssid_ex_sz(&pnetwork->network);
-       if(pnetwork->network.Length > sizeof(struct wlan_bssid_ex))
-       {
-               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n"));
+       if (pnetwork->network.Length > sizeof(struct wlan_bssid_ex)) {
+               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
+                        ("\n\n ***joinbss_evt_callback return a wrong bss "
+                         "***\n\n"));
                return;
        }
 
        spin_lock_bh(&pmlmepriv->lock);
 
-       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw23a_joinbss_event_cb !! _enter_critical\n"));
+       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,
+                ("\n rtw23a_joinbss_event_cb !! _enter_critical\n"));
 
-       if(pnetwork->join_res > 0)
-       {
+       if (pnetwork->join_res > 0) {
                spin_lock_bh(&pmlmepriv->scanned_queue.lock);
-               retry = 0;
-               if (check_fwstate(pmlmepriv,_FW_UNDER_LINKING))
-               {
+               if (check_fwstate(pmlmepriv,_FW_UNDER_LINKING)) {
                        /* s1. find ptarget_wlan */
-                       if(check_fwstate(pmlmepriv, _FW_LINKED))
-                       {
-                               if(the_same_macaddr == true)
-                               {
+                       if (check_fwstate(pmlmepriv, _FW_LINKED)) {
+                               if (the_same_macaddr == true) {
                                        ptarget_wlan = rtw_find_network23a(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);
-                               }
-                               else
-                               {
+                               } else {
                                        pcur_wlan = rtw_find_network23a(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);
-                                       if(pcur_wlan)   pcur_wlan->fixed = false;
+                                       if (pcur_wlan)
+                                               pcur_wlan->fixed = false;
 
                                        pcur_sta = rtw_get_stainfo23a(pstapriv, cur_network->network.MacAddress);
-                                       if(pcur_sta) {
+                                       if (pcur_sta) {
                                                spin_lock_bh(&pstapriv->sta_hash_lock);
-                                               rtw_free_stainfo23a(adapter,  pcur_sta);
+                                               rtw_free_stainfo23a(adapter,
+                                                                   pcur_sta);
                                                spin_unlock_bh(&pstapriv->sta_hash_lock);
                                        }
 
                                        ptarget_wlan = rtw_find_network23a(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress);
-                                       if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) {
-                                               if(ptarget_wlan)        ptarget_wlan->fixed = true;
+                                       if (check_fwstate(pmlmepriv,
+                                                         WIFI_STATION_STATE)) {
+                                               if (ptarget_wlan)
+                                                       ptarget_wlan->fixed =
+                                                               true;
                                        }
                                }
 
-                       }
-                       else
-                       {
-                               ptarget_wlan = rtw_find_network23a(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress);
-                               if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) {
-                                       if(ptarget_wlan)        ptarget_wlan->fixed = true;
+                       } else {
+                               ptarget_wlan = rtw_find_network23a(
+                                       &pmlmepriv->scanned_queue,
+                                       pnetwork->network.MacAddress);
+                               if (check_fwstate(pmlmepriv,
+                                                 WIFI_STATION_STATE)) {
+                                       if (ptarget_wlan)
+                                               ptarget_wlan->fixed = true;
                                }
                        }
 
                        /* s2. update cur_network */
-                       if(ptarget_wlan)
-                       {
-                               rtw_joinbss_update_network23a(adapter, ptarget_wlan, pnetwork);
-                       }
-                       else
-                       {
-                               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n"));
+                       if (ptarget_wlan)
+                               rtw_joinbss_update_network23a(adapter,
+                                                             ptarget_wlan,
+                                                             pnetwork);
+                       else {
+                               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
+                                        ("Can't find ptarget_wlan when "
+                                         "joinbss_event callback\n"));
                                spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
                                goto ignore_joinbss_callback;
                        }
 
-                       /* s3. find ptarget_sta & update ptarget_sta after update cur_network only for station mode */
-                       if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true)
-                       {
-                               ptarget_sta = rtw_joinbss_update_stainfo(adapter, pnetwork);
-                               if(ptarget_sta==NULL)
-                               {
-                                       RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't update stainfo when joinbss_event callback\n"));
+                       /* s3. find ptarget_sta & update ptarget_sta after
+                          update cur_network only for station mode */
+                       if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
+                               ptarget_sta = rtw_joinbss_update_stainfo(
+                                       adapter, pnetwork);
+                               if (!ptarget_sta) {
+                                       RT_TRACE(_module_rtl871x_mlme_c_,
+                                                _drv_err_,
+                                                ("Can't update stainfo when "
+                                                 "joinbss_event callback\n"));
                                        spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
                                        goto ignore_joinbss_callback;
                                }
                        }
 
                        /* s4. indicate connect */
-                       if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true)
-                       {
+                       if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
                                rtw_indicate_connect23a(adapter);
-                       } else {
-                                       /* adhoc mode will rtw_indicate_connect23a when rtw_stassoc_event_callback23a */
-                               RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv)));
+                       else {
+                               /* adhoc mode will rtw_indicate_connect23a
+                                  when rtw_stassoc_event_callback23a */
+                               RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,
+                                        ("adhoc mode, fw_state:%x",
+                                         get_fwstate(pmlmepriv)));
                        }
 
                        /* s5. Cancle assoc_timer */
                        del_timer_sync(&pmlmepriv->assoc_timer);
 
-                       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer\n"));
+                       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,
+                                ("Cancle assoc_timer\n"));
                } else {
                        RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
                                 ("rtw23a_joinbss_event_cb err: fw_state:%x",
@@ -1260,20 +1373,19 @@ void rtw_joinbss_event_prehandle23a(struct rtw_adapter *adapter, u8 *pbuf)
                        goto ignore_joinbss_callback;
                }
                spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
-       } else if(pnetwork->join_res == -4) {
+       } else if (pnetwork->join_res == -4) {
                rtw_reset_securitypriv23a(adapter);
                mod_timer(&pmlmepriv->assoc_timer,
                          jiffies + msecs_to_jiffies(1));
 
                /* rtw_free_assoc_resources23a(adapter, 1); */
 
-               if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING))) {
+               if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) {
                        RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
-                                ("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n",
-                                get_fwstate(pmlmepriv)));
+                                ("fail! clear _FW_UNDER_LINKING ^^^fw_state="
+                                 "%x\n", get_fwstate(pmlmepriv)));
                        _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
                }
-
        } else {
                /* if join_res < 0 (join fails), then try again */
                mod_timer(&pmlmepriv->assoc_timer,
@@ -1288,46 +1400,31 @@ ignore_joinbss_callback:
 
 void rtw23a_joinbss_event_cb(struct rtw_adapter *adapter, u8 *pbuf)
 {
-       struct wlan_network     *pnetwork       = (struct wlan_network *)pbuf;
+       struct wlan_network *pnetwork = (struct wlan_network *)pbuf;
 
        mlmeext_joinbss_event_callback23a(adapter, pnetwork->join_res);
 
        rtw_os_xmit_schedule23a(adapter);
-
-}
-
-/* FOR AP , AD-HOC mode */
-void rtw_stassoc_hw_rpt23a(struct rtw_adapter *adapter, struct sta_info *psta)
-{
-       u16 media_status;
-
-       if (psta == NULL)       return;
-
-       media_status = (psta->mac_id<<8)|1; /*   MACID|OPMODE:1 connect */
-       rtw_hal_set_hwreg23a(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status);
 }
 
 void rtw_stassoc_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
 {
        struct sta_info *psta;
        struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
-       struct stassoc_event    *pstassoc       = (struct stassoc_event*)pbuf;
+       struct stassoc_event *pstassoc = (struct stassoc_event*)pbuf;
        struct wlan_network *cur_network = &pmlmepriv->cur_network;
-       struct wlan_network     *ptarget_wlan = NULL;
+       struct wlan_network *ptarget_wlan;
 
-       if(rtw_access_ctrl23a(adapter, pstassoc->macaddr) == false)
+       if (rtw_access_ctrl23a(adapter, pstassoc->macaddr) == false)
                return;
 
 #ifdef CONFIG_8723AU_AP_MODE
-       if(check_fwstate(pmlmepriv, WIFI_AP_STATE))
-       {
+       if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
                psta = rtw_get_stainfo23a(&adapter->stapriv, pstassoc->macaddr);
                if (psta) {
                        /* bss_cap_update_on_sta_join23a(adapter, psta); */
                        /* sta_info_update23a(adapter, psta); */
                        ap_sta_info_defer_update23a(adapter, psta);
-
-                       rtw_stassoc_hw_rpt23a(adapter,psta);
                }
                return;
        }
@@ -1336,13 +1433,19 @@ void rtw_stassoc_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
        psta = rtw_get_stainfo23a(&adapter->stapriv, pstassoc->macaddr);
        if (psta != NULL) {
                /* the sta have been in sta_info_queue => do nothing */
-               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error: rtw_stassoc_event_callback23a: sta has been in sta_hash_queue\n"));
-               return; /* between drv has received this event before and  fw have not yet to set key to CAM_ENTRY) */
+               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
+                        ("Error: rtw_stassoc_event_callback23a: sta has "
+                         "been in sta_hash_queue\n"));
+               /* between drv has received this event before and
+                  fw have not yet to set key to CAM_ENTRY) */
+               return;
        }
 
        psta = rtw_alloc_stainfo23a(&adapter->stapriv, pstassoc->macaddr);
-       if (psta == NULL) {
-               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't alloc sta_info when rtw_stassoc_event_callback23a\n"));
+       if (!psta) {
+               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
+                        ("Can't alloc sta_info when "
+                         "rtw_stassoc_event_callback23a\n"));
                return;
        }
 
@@ -1352,25 +1455,25 @@ void rtw_stassoc_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
        /* psta->aid = (uint)pstassoc->cam_id; */
        DBG_8723A("%s\n",__func__);
        /* for ad-hoc mode */
-       rtw_hal_set_odm_var23a(adapter,HAL_ODM_STA_INFO,psta,true);
+       rtw_hal_set_odm_var23a(adapter, HAL_ODM_STA_INFO, psta, true);
 
-       rtw_stassoc_hw_rpt23a(adapter,psta);
-
-       if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)
-               psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm;
+       if (adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)
+               psta->dot118021XPrivacy =
+                       adapter->securitypriv.dot11PrivacyAlgrthm;
 
        psta->ieee8021x_blocked = false;
 
        spin_lock_bh(&pmlmepriv->lock);
 
-       if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==true ) ||
-               (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==true ) )
-       {
-               if(adapter->stapriv.asoc_sta_count== 2)
-               {
+       if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) ||
+           check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
+               if (adapter->stapriv.asoc_sta_count == 2) {
                        spin_lock_bh(&pmlmepriv->scanned_queue.lock);
-                       ptarget_wlan = rtw_find_network23a(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);
-                       if(ptarget_wlan)        ptarget_wlan->fixed = true;
+                       ptarget_wlan =
+                               rtw_find_network23a(&pmlmepriv->scanned_queue,
+                                                   cur_network->network.MacAddress);
+                       if (ptarget_wlan)
+                               ptarget_wlan->fixed = true;
                        spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
                        /*  a sta + bc/mc_stainfo (not Ibss_stainfo) */
                        rtw_indicate_connect23a(adapter);
@@ -1384,47 +1487,40 @@ void rtw_stassoc_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
 
 void rtw_stadel_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
 {
-       int mac_id=-1;
+       int mac_id;
        struct sta_info *psta;
-       struct wlan_network* pwlan = NULL;
-       struct wlan_bssid_ex    *pdev_network=NULL;
-       u8* pibss = NULL;
-       struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
-       struct  stadel_event *pstadel   = (struct stadel_event*)pbuf;
-       struct  sta_priv *pstapriv = &adapter->stapriv;
+       struct wlan_network* pwlan;
+       struct wlan_bssid_ex *pdev_network;
+       u8 *pibss;
+       struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
+       struct stadel_event *pstadel = (struct stadel_event *)pbuf;
+       struct sta_priv *pstapriv = &adapter->stapriv;
        struct wlan_network *tgt_network = &pmlmepriv->cur_network;
 
        psta = rtw_get_stainfo23a(&adapter->stapriv, pstadel->macaddr);
-       if(psta)
+       if (psta)
                mac_id = psta->mac_id;
        else
                mac_id = pstadel->mac_id;
 
-       DBG_8723A("%s(mac_id=%d)=" MAC_FMT "\n", __func__, mac_id, MAC_ARG(pstadel->macaddr));
-
-       if(mac_id>=0) {
-               u16 media_status;
-               media_status = (mac_id<<8)|0; /*   MACID|OPMODE:0 means disconnect */
-               /* for STA,AP,ADHOC mode, report disconnect stauts to FW */
-               rtw_hal_set_hwreg23a(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status);
-       }
+       DBG_8723A("%s(mac_id=%d)=" MAC_FMT "\n", __func__, mac_id,
+                 MAC_ARG(pstadel->macaddr));
 
         if (check_fwstate(pmlmepriv, WIFI_AP_STATE))
-        {
                return;
-        }
 
        mlmeext_sta_del_event_callback23a(adapter);
 
        spin_lock_bh(&pmlmepriv->lock);
 
-       if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
-       {
-               if (rtw_to_roaming(adapter) > 0)
-                       pmlmepriv->to_roaming--; /* this stadel_event is caused by roaming, decrease to_roaming */
-               else if (rtw_to_roaming(adapter) == 0)
+       if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
+               if (adapter->mlmepriv.to_roaming > 0) {
+                       /* this stadel_event is caused by roaming,
+                          decrease to_roaming */
+                       pmlmepriv->to_roaming--;
+               } else if (adapter->mlmepriv.to_roaming == 0)
                        rtw_set_roaming(adapter, adapter->registrypriv.max_roaming_times);
-               if (*((unsigned short *)(pstadel->rsvd)) != WLAN_REASON_EXPIRATION_CHK)
+               if (*((u16 *)pstadel->rsvd) != WLAN_REASON_EXPIRATION_CHK)
                        rtw_set_roaming(adapter, 0); /* don't roam */
 
                rtw_free_uc_swdec_pending_queue23a(adapter);
@@ -1433,32 +1529,33 @@ void rtw_stadel_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
                rtw_indicate_disconnect23a(adapter);
                spin_lock_bh(&pmlmepriv->scanned_queue.lock);
                /*  remove the network entry in scanned_queue */
-               pwlan = rtw_find_network23a(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
+               pwlan = rtw_find_network23a(&pmlmepriv->scanned_queue,
+                                           tgt_network->network.MacAddress);
                if (pwlan) {
                        pwlan->fixed = false;
                        rtw_free_network_nolock(pmlmepriv, pwlan);
                }
                spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
 
-               _rtw23a_roaming(adapter, tgt_network);
+               _rtw_roaming(adapter, tgt_network);
        }
 
        if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) ||
-             check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))
-       {
+           check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
 
                spin_lock_bh(&pstapriv->sta_hash_lock);
                rtw_free_stainfo23a(adapter,  psta);
                spin_unlock_bh(&pstapriv->sta_hash_lock);
 
-               if (adapter->stapriv.asoc_sta_count == 1) /* a sta + bc/mc_stainfo (not Ibss_stainfo) */
-               {
+               /* a sta + bc/mc_stainfo (not Ibss_stainfo) */
+               if (adapter->stapriv.asoc_sta_count == 1) {
                        spin_lock_bh(&pmlmepriv->scanned_queue.lock);
                        /* free old ibss network */
-                       /* pwlan = rtw_find_network23a(&pmlmepriv->scanned_queue, pstadel->macaddr); */
-                       pwlan = rtw_find_network23a(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
-                       if (pwlan)
-                       {
+                       /* pwlan = rtw_find_network23a(
+                          &pmlmepriv->scanned_queue, pstadel->macaddr); */
+                       pwlan = rtw_find_network23a(&pmlmepriv->scanned_queue,
+                                                   tgt_network->network.MacAddress);
+                       if (pwlan) {
                                pwlan->fixed = false;
                                rtw_free_network_nolock(pmlmepriv, pwlan);
                        }
@@ -1467,7 +1564,8 @@ void rtw_stadel_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
                        pdev_network = &adapter->registrypriv.dev_network;
                        pibss = adapter->registrypriv.dev_network.MacAddress;
 
-                       memcpy(pdev_network, &tgt_network->network, get_wlan_bssid_ex_sz(&tgt_network->network));
+                       memcpy(pdev_network, &tgt_network->network,
+                              get_wlan_bssid_ex_sz(&tgt_network->network));
 
                        memset(&pdev_network->Ssid, 0,
                               sizeof(struct cfg80211_ssid));
@@ -1478,32 +1576,28 @@ void rtw_stadel_event_callback23a(struct rtw_adapter *adapter, u8 *pbuf)
 
                        rtw_generate_random_ibss23a(pibss);
 
-                       if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))
-                       {
+                       if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
                                set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
                                _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE);
                        }
 
-                       if (rtw_createbss_cmd23a(adapter)!= _SUCCESS)
-                       {
-
-                               RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("***Error =>stadel_event_callback: rtw_createbss_cmd23a status FAIL***\n "));
-
+                       if (rtw_createbss_cmd23a(adapter) != _SUCCESS) {
+                               RT_TRACE(_module_rtl871x_ioctl_set_c_,
+                                        _drv_err_,
+                                        ("***Error =>stadel_event_callback: "
+                                         "rtw_createbss_cmd23a status "
+                                         "FAIL***\n"));
                        }
-
                }
-
        }
 
        spin_unlock_bh(&pmlmepriv->lock);
-
 }
 
 void rtw_cpwm_event_callback23a(struct rtw_adapter *padapter, u8 *pbuf)
 {
-
-       RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+rtw_cpwm_event_callback23a !!!\n"));
-
+       RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
+                ("+rtw_cpwm_event_callback23a !!!\n"));
 }
 
 /*
@@ -1518,23 +1612,28 @@ void rtw23a_join_to_handler (unsigned long data)
 
        DBG_8723A("%s, fw_state=%x\n", __func__, get_fwstate(pmlmepriv));
 
-       if(adapter->bDriverStopped ||adapter->bSurpriseRemoved)
+       if (adapter->bDriverStopped ||adapter->bSurpriseRemoved)
                return;
 
        spin_lock_bh(&pmlmepriv->lock);
 
-       if (rtw_to_roaming(adapter) > 0) { /* join timeout caused by roaming */
-               while(1) {
+       if (adapter->mlmepriv.to_roaming > 0) {
+               /* join timeout caused by roaming */
+               while (1) {
                        pmlmepriv->to_roaming--;
-                       if (rtw_to_roaming(adapter) != 0) { /* try another */
+                       if (adapter->mlmepriv.to_roaming != 0) {
+                               /* try another */
                                DBG_8723A("%s try another roaming\n", __func__);
-                               if (_SUCCESS!= (do_join_r = rtw_do_join23a(adapter))) {
-                                       DBG_8723A("%s roaming do_join return %d\n", __func__ , do_join_r);
+                               do_join_r = rtw_do_join23a(adapter);
+                               if (do_join_r != _SUCCESS) {
+                                       DBG_8723A("%s roaming do_join return "
+                                                 "%d\n", __func__ , do_join_r);
                                        continue;
                                }
                                break;
                        } else {
-                               DBG_8723A("%s We've try roaming but fail\n", __func__);
+                               DBG_8723A("%s We've try roaming but fail\n",
+                                         __func__);
                                rtw_indicate_disconnect23a(adapter);
                                break;
                        }
@@ -1543,7 +1642,8 @@ void rtw23a_join_to_handler (unsigned long data)
                rtw_indicate_disconnect23a(adapter);
                free_scanqueue(pmlmepriv);/*  */
 
-               /* indicate disconnect for the case that join_timeout and check_fwstate != FW_LINKED */
+               /* indicate disconnect for the case that join_timeout and
+                  check_fwstate != FW_LINKED */
                rtw_cfg80211_indicate_disconnect(adapter);
        }
 
@@ -1560,7 +1660,8 @@ void rtw_scan_timeout_handler23a(unsigned long data)
        struct rtw_adapter *adapter = (struct rtw_adapter *)data;
        struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
 
-       DBG_8723A(FUNC_ADPT_FMT" fw_state =%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv));
+       DBG_8723A(FUNC_ADPT_FMT" fw_state =%x\n", FUNC_ADPT_ARG(adapter),
+                 get_fwstate(pmlmepriv));
 
        spin_lock_bh(&pmlmepriv->lock);
 
@@ -1568,7 +1669,7 @@ void rtw_scan_timeout_handler23a(unsigned long data)
 
        spin_unlock_bh(&pmlmepriv->lock);
 
-       rtw_indicate_scan_done23a(adapter, true);
+       rtw_cfg80211_indicate_scan_done(wdev_to_priv(adapter->rtw_wdev), true);
 }
 
 static void rtw_auto_scan_handler(struct rtw_adapter *padapter)
@@ -1581,7 +1682,8 @@ static void rtw_auto_scan_handler(struct rtw_adapter *padapter)
                if (pmlmepriv->scan_interval == 0) {
                        DBG_8723A("%s\n", __func__);
                        rtw_set_802_11_bssid23a_list_scan(padapter, NULL, 0);
-                       pmlmepriv->scan_interval = SCAN_INTERVAL;/*  30*2 sec = 60sec */
+                       /*  30*2 sec = 60sec */
+                       pmlmepriv->scan_interval = SCAN_INTERVAL;
                }
        }
 }
@@ -1594,7 +1696,8 @@ void rtw_dynamic_check_timer_handler(unsigned long data)
        if (adapter->hw_init_completed == false)
                goto out;
 
-       if ((adapter->bDriverStopped == true)||(adapter->bSurpriseRemoved == true))
+       if (adapter->bDriverStopped == true ||
+           adapter->bSurpriseRemoved == true)
                goto out;
 
        if (adapter->net_closed == true)
@@ -1602,16 +1705,9 @@ void rtw_dynamic_check_timer_handler(unsigned long data)
 
        rtw_dynamic_chk_wk_cmd23a(adapter);
 
-       if (pregistrypriv->wifi_spec == 1)
-       {
-#ifdef CONFIG_8723AU_P2P
-               struct wifidirect_info *pwdinfo = &adapter->wdinfo;
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-#endif
-               {
-                       /* auto site survey */
-                       rtw_auto_scan_handler(adapter);
-               }
+       if (pregistrypriv->wifi_spec == 1) {
+               /* auto site survey */
+               rtw_auto_scan_handler(adapter);
        }
 out:
        mod_timer(&adapter->mlmepriv.dynamic_chk_timer,
@@ -1628,8 +1724,6 @@ void rtw_clear_scan_deny(struct rtw_adapter *adapter)
 {
        struct mlme_priv *mlmepriv = &adapter->mlmepriv;
        atomic_set(&mlmepriv->set_scan_deny, 0);
-       if (0)
-       DBG_8723A(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter));
 }
 
 void rtw_set_scan_deny_timer_hdl(unsigned long data)
@@ -1642,12 +1736,9 @@ void rtw_set_scan_deny(struct rtw_adapter *adapter, u32 ms)
 {
        struct mlme_priv *mlmepriv = &adapter->mlmepriv;
 
-       if (0)
-       DBG_8723A(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter));
        atomic_set(&mlmepriv->set_scan_deny, 1);
        mod_timer(&mlmepriv->set_scan_deny_timer,
                  jiffies + msecs_to_jiffies(ms));
-
 }
 
 #if defined(IEEE80211_SCAN_RESULT_EXPIRE)
@@ -1657,15 +1748,19 @@ void rtw_set_scan_deny(struct rtw_adapter *adapter, u32 ms)
 #endif
 
 /*
-* Select a new join candidate from the original @param candidate and @param competitor
+* Select a new join candidate from the original @param candidate and
+*     @param competitor
 * @return true: candidate is updated
 * @return false: candidate is not updated
 */
-static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv
-       , struct wlan_network **candidate, struct wlan_network *competitor)
+static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv,
+                                   struct wlan_network **candidate,
+                                   struct wlan_network *competitor)
 {
        int updated = false;
-       struct rtw_adapter *adapter = container_of(pmlmepriv, struct rtw_adapter, mlmepriv);
+       struct rtw_adapter *adapter;
+
+       adapter = container_of(pmlmepriv, struct rtw_adapter, mlmepriv);
 
        /* check bssid, if needed */
        if (pmlmepriv->assoc_by_bssid == true) {
@@ -1684,10 +1779,10 @@ static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv
                        goto exit;
        }
 
-       if (rtw_is_desired_network(adapter, competitor)  == false)
+       if (rtw_is_desired_network(adapter, competitor) == false)
                goto exit;
 
-       if (rtw_to_roaming(adapter) > 0) {
+       if (adapter->mlmepriv.to_roaming > 0) {
                unsigned int passed;
 
                passed = jiffies_to_msecs(jiffies - competitor->last_scanned);
@@ -1697,19 +1792,21 @@ static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv
                        goto exit;
        }
 
-       if (*candidate == NULL ||(*candidate)->network.Rssi<competitor->network.Rssi) {
+       if (!*candidate ||
+           (*candidate)->network.Rssi<competitor->network.Rssi) {
                *candidate = competitor;
                updated = true;
        }
 
        if (updated) {
-               DBG_8723A("[by_bssid:%u][assoc_ssid:%s][to_roaming:%u] new candidate: %s("MAC_FMT") rssi:%d\n",
-                       pmlmepriv->assoc_by_bssid,
-                       pmlmepriv->assoc_ssid.ssid,
-                       rtw_to_roaming(adapter),
-                       (*candidate)->network.Ssid.ssid,
-                       MAC_ARG((*candidate)->network.MacAddress),
-                       (int)(*candidate)->network.Rssi);
+               DBG_8723A("[by_bssid:%u][assoc_ssid:%s][to_roaming:%u] "
+                         "new candidate: %s("MAC_FMT") rssi:%d\n",
+                         pmlmepriv->assoc_by_bssid,
+                         pmlmepriv->assoc_ssid.ssid,
+                         adapter->mlmepriv.to_roaming,
+                         (*candidate)->network.Ssid.ssid,
+                         MAC_ARG((*candidate)->network.MacAddress),
+                         (int)(*candidate)->network.Rssi);
        }
 
 exit:
@@ -1732,8 +1829,8 @@ int rtw_select_and_join_from_scanned_queue23a(struct mlme_priv *pmlmepriv)
        struct list_head *phead, *plist, *ptmp;
        struct rtw_adapter *adapter;
        struct rtw_queue *queue = &pmlmepriv->scanned_queue;
-       struct  wlan_network    *pnetwork = NULL;
-       struct  wlan_network    *candidate = NULL;
+       struct wlan_network *pnetwork;
+       struct wlan_network *candidate = NULL;
 
        spin_lock_bh(&pmlmepriv->scanned_queue.lock);
        phead = get_list_head(queue);
@@ -1764,7 +1861,7 @@ int rtw_select_and_join_from_scanned_queue23a(struct mlme_priv *pmlmepriv)
        }
 
        /*  check for situation of  _FW_LINKED */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
+       if (check_fwstate(pmlmepriv, _FW_LINKED)) {
                DBG_8723A("%s: _FW_LINKED while ask_for_joinbss!!!\n",
                          __func__);
 
@@ -1782,7 +1879,7 @@ exit:
 }
 
 int rtw_set_auth23a(struct rtw_adapter * adapter,
-                struct security_priv *psecuritypriv)
+                   struct security_priv *psecuritypriv)
 {
        struct cmd_obj* pcmd;
        struct setauth_parm *psetauthparm;
@@ -1825,7 +1922,7 @@ exit:
 }
 
 int rtw_set_key23a(struct rtw_adapter *adapter,
-               struct security_priv *psecuritypriv, int keyid, u8 set_tx)
+                  struct security_priv *psecuritypriv, int keyid, u8 set_tx)
 {
        u8 keylen;
        struct cmd_obj *pcmd;
@@ -1850,9 +1947,9 @@ int rtw_set_key23a(struct rtw_adapter *adapter,
                psetkeyparm->algorithm = (unsigned char)
                        psecuritypriv->dot118021XGrpPrivacy;
                RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
-                        ("\n rtw_set_key23a: psetkeyparm->algorithm = (unsigned "
-                         "char)psecuritypriv->dot118021XGrpPrivacy =%d\n",
-                         psetkeyparm->algorithm));
+                        ("\n rtw_set_key23a: psetkeyparm->algorithm = "
+                         "(unsigned char)psecuritypriv->dot118021XGrpPrivacy "
+                         "=%d\n", psetkeyparm->algorithm));
        } else {
                psetkeyparm->algorithm = (u8)psecuritypriv->dot11PrivacyAlgrthm;
                RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
@@ -1897,8 +1994,8 @@ int rtw_set_key23a(struct rtw_adapter *adapter,
                break;
        default:
                RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
-                        ("\n rtw_set_key23a:psecuritypriv->dot11PrivacyAlgrthm = "
-                         "%x (must be 1 or 2 or 4 or 5)\n",
+                        ("\n rtw_set_key23a:psecuritypriv->dot11PrivacyAlgrthm"
+                         " = %x (must be 1 or 2 or 4 or 5)\n",
                          psecuritypriv->dot11PrivacyAlgrthm));
                res = _FAIL;
                kfree(pcmd);
@@ -1931,7 +2028,7 @@ int rtw_restruct_wmm_ie23a(struct rtw_adapter *adapter, u8 *in_ie,
        unsigned int i, j;
 
        i = 12; /* after the fixed IE */
-       while(i < in_len) {
+       while (i < in_len) {
                ielength = initial_out_len;
 
                /* WMM element ID and OUI */
@@ -1982,11 +2079,11 @@ static int SecIsInPMKIDList(struct rtw_adapter *Adapter, u8 *bssid)
                        i++;
                        /* continue; */
                }
-       } while(i < NUM_PMKID_CACHE);
+       } while (i < NUM_PMKID_CACHE);
 
-       if (i == NUM_PMKID_CACHE) {
+       if (i == NUM_PMKID_CACHE)
                i = -1;/*  Could not find. */
-       else {
+       else {
                /*  There is one Pre-Authentication Key for
                    the specific BSSID. */
        }
@@ -2023,8 +2120,9 @@ static int rtw_append_pmkid(struct rtw_adapter *Adapter, int iEntry,
        }
        return ie_len;
 }
+
 int rtw_restruct_sec_ie23a(struct rtw_adapter *adapter, u8 *in_ie, u8 *out_ie,
-                       uint in_len)
+                          uint in_len)
 {
        u8 authmode;
        uint ielength;
@@ -2035,41 +2133,39 @@ int rtw_restruct_sec_ie23a(struct rtw_adapter *adapter, u8 *in_ie, u8 *out_ie,
        uint ndissecuritytype = psecuritypriv->ndisencryptstatus;
 
        RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,
-                ("+rtw_restruct_sec_ie23a: ndisauthmode=%d ndissecuritytype=%d\n",
-                 ndisauthmode, ndissecuritytype));
+                ("+rtw_restruct_sec_ie23a: ndisauthmode=%d "
+                 "ndissecuritytype=%d\n", ndisauthmode, ndissecuritytype));
 
        /* copy fixed ie only */
        memcpy(out_ie, in_ie, 12);
        ielength = 12;
-       if ((ndisauthmode==Ndis802_11AuthModeWPA) ||
-           (ndisauthmode==Ndis802_11AuthModeWPAPSK))
-               authmode=_WPA_IE_ID_;
-       if ((ndisauthmode==Ndis802_11AuthModeWPA2) ||
-           (ndisauthmode==Ndis802_11AuthModeWPA2PSK))
-               authmode=_WPA2_IE_ID_;
+       if (ndisauthmode == Ndis802_11AuthModeWPA ||
+           ndisauthmode == Ndis802_11AuthModeWPAPSK)
+               authmode = WLAN_EID_VENDOR_SPECIFIC;
+       if (ndisauthmode == Ndis802_11AuthModeWPA2 ||
+           ndisauthmode == Ndis802_11AuthModeWPA2PSK)
+               authmode = _WPA2_IE_ID_;
 
        if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) {
                memcpy(out_ie + ielength, psecuritypriv->wps_ie,
                       psecuritypriv->wps_ie_len);
 
                ielength += psecuritypriv->wps_ie_len;
-       } else if ((authmode==_WPA_IE_ID_) || (authmode==_WPA2_IE_ID_)) {
+       } else if (authmode == WLAN_EID_VENDOR_SPECIFIC ||
+                  authmode == _WPA2_IE_ID_) {
                /* copy RSN or SSN */
                memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0],
                       psecuritypriv->supplicant_ie[1] + 2);
                ielength += psecuritypriv->supplicant_ie[1] + 2;
-               rtw_report_sec_ie23a(adapter, authmode,
-                                 psecuritypriv->supplicant_ie);
        }
 
        iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid);
-       if (iEntry < 0) {
+       if (iEntry < 0)
                return ielength;
-       } else {
-               if (authmode == _WPA2_IE_ID_) {
-                       ielength=rtw_append_pmkid(adapter, iEntry,
-                                                 out_ie, ielength);
-               }
+       else {
+               if (authmode == _WPA2_IE_ID_)
+                       ielength = rtw_append_pmkid(adapter, iEntry,
+                                                   out_ie, ielength);
        }
 
        return ielength;
@@ -2162,7 +2258,6 @@ void rtw_update_registrypriv_dev_network23a(struct rtw_adapter* adapter)
        /* notes: translate IELength & Length after assign the
           Length to cmdsz in createbss_cmd(); */
        /* pdev_network->IELength = cpu_to_le32(sz); */
-
 }
 
 void rtw_get_encrypt_decrypt_from_registrypriv23a(struct rtw_adapter* adapter)
@@ -2193,22 +2288,20 @@ void rtw_joinbss_reset23a(struct rtw_adapter *padapter)
                        threshold = 1;
                else
                        threshold = 0;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_RXDMA_AGG_PG_TH,
-                                 (u8 *)(&threshold));
-       } else {
+       } else
                threshold = 1;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_RXDMA_AGG_PG_TH,
-                                 (u8 *)(&threshold));
-       }
+
+       rtl8723a_set_rxdma_agg_pg_th(padapter, threshold);
 }
 
 /* the fucntion is >= passive_level */
 unsigned int rtw_restructure_ht_ie23a(struct rtw_adapter *padapter, u8 *in_ie,
-                                  u8 *out_ie, uint in_len, uint *pout_len)
+                                     u8 *out_ie, uint in_len, uint *pout_len)
 {
-       u32 ielen, out_len;
+       u32 out_len;
        int max_rx_ampdu_factor;
-       unsigned char *p, *pframe;
+       unsigned char *pframe;
+       const u8 *p;
        struct ieee80211_ht_cap ht_capie;
        unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
@@ -2217,14 +2310,14 @@ unsigned int rtw_restructure_ht_ie23a(struct rtw_adapter *padapter, u8 *in_ie,
 
        phtpriv->ht_option = false;
 
-       p = rtw_get_ie23a(in_ie + 12, _HT_CAPABILITY_IE_, &ielen, in_len - 12);
+       p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, in_ie + 12, in_len -12);
 
-       if (p && ielen > 0) {
+       if (p && p[1] > 0) {
                u32 rx_packet_offset, max_recvbuf_sz;
                if (pqospriv->qos_option == 0) {
                        out_len = *pout_len;
                        pframe = rtw_set_ie23a(out_ie + out_len,
-                                           _VENDOR_SPECIFIC_IE_,
+                                           WLAN_EID_VENDOR_SPECIFIC,
                                            _WMM_IE_Length_, WMM_IE, pout_len);
 
                        pqospriv->qos_option = 1;
@@ -2254,17 +2347,19 @@ unsigned int rtw_restructure_ht_ie23a(struct rtw_adapter *padapter, u8 *in_ie,
                        ht_capie.ampdu_params_info |=
                                (IEEE80211_HT_AMPDU_PARM_DENSITY & 0x00);
 
-               pframe = rtw_set_ie23a(out_ie + out_len, _HT_CAPABILITY_IE_,
+               pframe = rtw_set_ie23a(out_ie + out_len, WLAN_EID_HT_CAPABILITY,
                                    sizeof(struct ieee80211_ht_cap),
                                    (unsigned char*)&ht_capie, pout_len);
 
                phtpriv->ht_option = true;
 
-               p = rtw_get_ie23a(in_ie + 12, _HT_ADD_INFO_IE_, &ielen, in_len-12);
-               if (p && (ielen == sizeof(struct ieee80211_ht_addt_info))) {
+               p = cfg80211_find_ie(WLAN_EID_HT_OPERATION, in_ie + 12,
+                                    in_len -12);
+               if (p && (p[1] == sizeof(struct ieee80211_ht_addt_info))) {
                        out_len = *pout_len;
-                       pframe = rtw_set_ie23a(out_ie + out_len, _HT_ADD_INFO_IE_,
-                                           ielen, p + 2 , pout_len);
+                       pframe = rtw_set_ie23a(out_ie + out_len,
+                                              WLAN_EID_HT_OPERATION,
+                                              p[1], p + 2 , pout_len);
                }
        }
 
@@ -2274,18 +2369,14 @@ unsigned int rtw_restructure_ht_ie23a(struct rtw_adapter *padapter, u8 *in_ie,
 /* the fucntion is > passive_level (in critical_section) */
 void rtw_update_ht_cap23a(struct rtw_adapter *padapter, u8 *pie, uint ie_len)
 {
-       u8 *p, max_ampdu_sz;
-       int len;
-       /* struct sta_info *bmc_sta, *psta; */
+       u8 max_ampdu_sz;
+       const u8 *p;
        struct ieee80211_ht_cap *pht_capie;
        struct ieee80211_ht_addt_info *pht_addtinfo;
-       /* struct recv_reorder_ctrl *preorder_ctrl; */
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
-       struct ht_priv          *phtpriv = &pmlmepriv->htpriv;
-       /* struct recv_priv *precvpriv = &padapter->recvpriv; */
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       struct ht_priv *phtpriv = &pmlmepriv->htpriv;
        struct registry_priv *pregistrypriv = &padapter->registrypriv;
-       /* struct wlan_network *pcur_network = &pmlmepriv->cur_network;; */
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
 
        if (!phtpriv->ht_option)
@@ -2296,51 +2387,51 @@ void rtw_update_ht_cap23a(struct rtw_adapter *padapter, u8 *pie, uint ie_len)
 
        DBG_8723A("+rtw_update_ht_cap23a()\n");
 
+       /* Adjust pie + ie_len for our searches */
+       pie += sizeof (struct ndis_802_11_fixed_ies);
+       ie_len -= sizeof (struct ndis_802_11_fixed_ies);
+
        /* maybe needs check if ap supports rx ampdu. */
-       if ((phtpriv->ampdu_enable == false) && (pregistrypriv->ampdu_enable == 1)) {
+       if (phtpriv->ampdu_enable == false &&
+           pregistrypriv->ampdu_enable == 1) {
                if (pregistrypriv->wifi_spec == 1)
                        phtpriv->ampdu_enable = false;
                else
                        phtpriv->ampdu_enable = true;
-       } else if (pregistrypriv->ampdu_enable == 2) {
+       } else if (pregistrypriv->ampdu_enable == 2)
                phtpriv->ampdu_enable = true;
-       }
 
        /* check Max Rx A-MPDU Size */
-       len = 0;
-       p = rtw_get_ie23a(pie+sizeof (struct ndis_802_11_fixed_ies), _HT_CAPABILITY_IE_, &len, ie_len-sizeof (struct ndis_802_11_fixed_ies));
-       if (p && len > 0) {
-               pht_capie = (struct ieee80211_ht_cap *)(p+2);
-               max_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_AMPDU_PARM_FACTOR);
-               max_ampdu_sz = 1 << (max_ampdu_sz+3); /*  max_ampdu_sz (kbytes); */
-
-               /* DBG_8723A("rtw_update_ht_cap23a(): max_ampdu_sz =%d\n", max_ampdu_sz); */
-               phtpriv->rx_ampdu_maxlen = max_ampdu_sz;
+       p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, pie, ie_len);
+
+       if (p && p[1] > 0) {
+               pht_capie = (struct ieee80211_ht_cap *)(p + 2);
+               max_ampdu_sz = pht_capie->ampdu_params_info &
+                       IEEE80211_HT_AMPDU_PARM_FACTOR;
+               /*  max_ampdu_sz (kbytes); */
+               max_ampdu_sz = 1 << (max_ampdu_sz + 3);
 
+               phtpriv->rx_ampdu_maxlen = max_ampdu_sz;
        }
 
-       len = 0;
-       p = rtw_get_ie23a(pie+sizeof (struct ndis_802_11_fixed_ies), _HT_ADD_INFO_IE_, &len, ie_len-sizeof (struct ndis_802_11_fixed_ies));
-       if (p && len>0)
-       {
-               pht_addtinfo = (struct ieee80211_ht_addt_info *)(p+2);
+       p = cfg80211_find_ie(WLAN_EID_HT_OPERATION, pie, ie_len);
+       if (p && p[1] > 0) {
+               pht_addtinfo = (struct ieee80211_ht_addt_info *)(p + 2);
                /* todo: */
        }
 
        /* update cur_bwmode & cur_ch_offset */
-       if ((pregistrypriv->cbw40_enable) &&
-               (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) &&
-               (pmlmeinfo->HT_info.infos[0] & BIT(2)))
-       {
+       if (pregistrypriv->cbw40_enable &&
+           pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1) &&
+           pmlmeinfo->HT_info.infos[0] & BIT(2)) {
                int i;
-               u8      rf_type;
+               u8 rf_type;
 
-               padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+               rf_type = rtl8723a_get_rf_type(padapter);
 
                /* update the MCS rates */
-               for (i = 0; i < 16; i++)
-               {
-                       if ((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
+               for (i = 0; i < 16; i++) {
+                       if (rf_type == RF_1T1R || rf_type == RF_1T2R)
                                pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R23A[i];
                        else
                                pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R23A[i];
@@ -2349,24 +2440,26 @@ void rtw_update_ht_cap23a(struct rtw_adapter *padapter, u8 *pie, uint ie_len)
                pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
                switch ((pmlmeinfo->HT_info.infos[0] & 0x3))
                {
-                       case HT_EXTCHNL_OFFSET_UPPER:
-                               pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
-                               break;
+               case HT_EXTCHNL_OFFSET_UPPER:
+                       pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
+                       break;
 
-                       case HT_EXTCHNL_OFFSET_LOWER:
-                               pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
-                               break;
+               case HT_EXTCHNL_OFFSET_LOWER:
+                       pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
+                       break;
 
-                       default:
-                               pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
-                               break;
+               default:
+                       pmlmeext->cur_ch_offset =
+                               HAL_PRIME_CHNL_OFFSET_DONT_CARE;
+                       break;
                }
        }
 
        /*  */
        /*  Config SM Power Save setting */
        /*  */
-       pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;
+       pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info &
+                           0x0C) >> 2;
        if (pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC)
                DBG_8723A("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __func__);
 
@@ -2376,124 +2469,65 @@ void rtw_update_ht_cap23a(struct rtw_adapter *padapter, u8 *pie, uint ie_len)
        pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3;
 }
 
-void rtw_issue_addbareq_cmd23a(struct rtw_adapter *padapter, struct xmit_frame *pxmitframe)
+void rtw_issue_addbareq_cmd23a(struct rtw_adapter *padapter,
+                              struct xmit_frame *pxmitframe)
 {
        u8 issued;
        int priority;
-       struct sta_info *psta = NULL;
+       struct sta_info *psta;
        struct ht_priv  *phtpriv;
        struct pkt_attrib *pattrib = &pxmitframe->attrib;
        s32 bmcst = is_multicast_ether_addr(pattrib->ra);
 
-       if (bmcst || (padapter->mlmepriv.LinkDetectInfo.NumTxOkInPeriod<100))
+       if (bmcst || padapter->mlmepriv.LinkDetectInfo.NumTxOkInPeriod < 100)
                return;
 
        priority = pattrib->priority;
 
        if (pattrib->psta)
                psta = pattrib->psta;
-       else
-       {
+       else {
                DBG_8723A("%s, call rtw_get_stainfo23a()\n", __func__);
                psta = rtw_get_stainfo23a(&padapter->stapriv, pattrib->ra);
        }
 
-       if (psta == NULL)
-       {
+       if (!psta) {
                DBG_8723A("%s, psta == NUL\n", __func__);
                return;
        }
 
-       if (!(psta->state &_FW_LINKED))
-       {
-               DBG_8723A("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
+       if (!(psta->state &_FW_LINKED)) {
+               DBG_8723A("%s, psta->state(0x%x) != _FW_LINKED\n",
+                         __func__, psta->state);
                return;
        }
 
        phtpriv = &psta->htpriv;
 
-       if ((phtpriv->ht_option == true) && (phtpriv->ampdu_enable == true))
-       {
+       if (phtpriv->ht_option == true && phtpriv->ampdu_enable == true) {
                issued = (phtpriv->agg_enable_bitmap>>priority)&0x1;
                issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1;
 
-               if (0 == issued)
-               {
-                       DBG_8723A("rtw_issue_addbareq_cmd23a, p =%d\n", priority);
-                       psta->htpriv.candidate_tid_bitmap |= CHKBIT((u8)priority);
-                       rtw_addbareq_cmd23a(padapter, (u8) priority, pattrib->ra);
-               }
-       }
-}
-
-inline void rtw_set_roaming(struct rtw_adapter *adapter, u8 to_roaming)
-{
-       if (to_roaming == 0)
-               adapter->mlmepriv.to_join = false;
-       adapter->mlmepriv.to_roaming = to_roaming;
-}
-
-inline u8 rtw_to_roaming(struct rtw_adapter *adapter)
-{
-       return adapter->mlmepriv.to_roaming;
-}
-
-void rtw23a_roaming(struct rtw_adapter *padapter, struct wlan_network *tgt_network)
-{
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
-
-       spin_lock_bh(&pmlmepriv->lock);
-       _rtw23a_roaming(padapter, tgt_network);
-       spin_unlock_bh(&pmlmepriv->lock);
-}
-void _rtw23a_roaming(struct rtw_adapter *padapter, struct wlan_network *tgt_network)
-{
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
-       struct wlan_network *pnetwork;
-       int do_join_r;
-
-       if (tgt_network != NULL)
-               pnetwork = tgt_network;
-       else
-               pnetwork = &pmlmepriv->cur_network;
-
-       if (0 < rtw_to_roaming(padapter)) {
-               DBG_8723A("roaming from %s("MAC_FMT"), length:%d\n",
-                         pnetwork->network.Ssid.ssid,
-                         MAC_ARG(pnetwork->network.MacAddress),
-                         pnetwork->network.Ssid.ssid_len);
-               memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid,
-                      sizeof(struct cfg80211_ssid));
-
-               pmlmepriv->assoc_by_bssid = false;
-
-               while(1) {
-                       if (_SUCCESS == (do_join_r = rtw_do_join23a(padapter))) {
-                               break;
-                       } else {
-                               DBG_8723A("roaming do_join return %d\n", do_join_r);
-                               pmlmepriv->to_roaming--;
-
-                               if (0 < rtw_to_roaming(padapter)) {
-                                       continue;
-                               } else {
-                                       DBG_8723A("%s(%d) -to roaming fail, indicate_disconnect\n", __func__, __LINE__);
-                                       rtw_indicate_disconnect23a(padapter);
-                                       break;
-                               }
-                       }
+               if (issued == 0) {
+                       DBG_8723A("rtw_issue_addbareq_cmd23a, p =%d\n",
+                                 priority);
+                       psta->htpriv.candidate_tid_bitmap |=
+                               CHKBIT((u8)priority);
+                       rtw_addbareq_cmd23a(padapter, (u8) priority,
+                                           pattrib->ra);
                }
        }
 }
 
 int rtw_linked_check(struct rtw_adapter *padapter)
 {
-       if ((check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE)) ||
-           (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))) {
+       if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) ||
+           check_fwstate(&padapter->mlmepriv,
+                         WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) {
                if (padapter->stapriv.asoc_sta_count > 2)
                        return true;
        } else {        /* Station mode */
-               if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) == true)
+               if (check_fwstate(&padapter->mlmepriv, _FW_LINKED))
                        return true;
        }
        return false;
index 1f3e8a0aece4603a7b26a9b704290ef198f13caa..68991dca1cbf582d1767d35412de85b31ec82a49 100644 (file)
 #include <wlan_bssdef.h>
 #include <mlme_osdep.h>
 #include <recv_osdep.h>
-#include <ethernet.h>
 #include <linux/ieee80211.h>
 
 #ifdef CONFIG_8723AU_BT_COEXIST
 #include <rtl8723a_hal.h>
 #endif
 
+static int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAssocRsp23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnProbeReq23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnProbeRsp23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int DoReserved23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnBeacon23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAtim23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnDisassoc23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAuth23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAuth23aClient23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnDeAuth23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAction23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+
+static int on_action_spct23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAction23a_qos(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAction23a_dls(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAction23a_back23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int on_action_public23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAction23a_ht(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAction23a_wmm(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+static int OnAction23a_p2p(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+
 static struct mlme_handler mlme_sta_tbl[]={
        {"OnAssocReq23a",               &OnAssocReq23a},
        {"OnAssocRsp23a",               &OnAssocRsp23a},
@@ -66,7 +87,6 @@ static u8     null_addr[ETH_ALEN]= {0, 0, 0, 0, 0, 0};
 /**************************************************
 OUI definitions for the vendor specific IE
 ***************************************************/
-unsigned char  RTW_WPA_OUI23A[] = {0x00, 0x50, 0xf2, 0x01};
 unsigned char WMM_OUI23A[] = {0x00, 0x50, 0xf2, 0x02};
 unsigned char  WPS_OUI23A[] = {0x00, 0x50, 0xf2, 0x04};
 unsigned char  P2P_OUI23A[] = {0x50, 0x6F, 0x9A, 0x09};
@@ -229,6 +249,17 @@ static struct fwevent wlanevents[] =
 };
 
 
+static void rtw_correct_TSF(struct rtw_adapter *padapter)
+{
+       hw_var_set_correct_tsf(padapter);
+}
+
+static void
+rtw_update_TSF(struct mlme_ext_priv *pmlmeext, struct ieee80211_mgmt *mgmt)
+{
+       pmlmeext->TSFValue = get_unaligned_le64(&mgmt->u.beacon.timestamp);
+}
+
 /*
  * Search the @param channel_num in given @param channel_set
  * @ch_set: the given channel set
@@ -388,96 +419,88 @@ static void init_channel_list(struct rtw_adapter *padapter,
        channel_list->reg_classes = cla;
 }
 
-static u8 init_channel_set(struct rtw_adapter* padapter, u8 ChannelPlan,
-                          struct rt_channel_info *channel_set)
+static u8 init_channel_set(struct rtw_adapter* padapter, u8 cplan,
+                          struct rt_channel_info *c_set)
 {
-       u8      index, chanset_size = 0;
-       u8      b5GBand = false, b2_4GBand = false;
-       u8      Index2G = 0, Index5G = 0;
+       u8 i, ch_size = 0;
+       u8 b5GBand = false, b2_4GBand = false;
+       u8 Index2G = 0, Index5G = 0;
 
-       memset(channel_set, 0, sizeof(struct rt_channel_info)*MAX_CHANNEL_NUM);
+       memset(c_set, 0, sizeof(struct rt_channel_info) * MAX_CHANNEL_NUM);
 
-       if (ChannelPlan >= RT_CHANNEL_DOMAIN_MAX &&
-           ChannelPlan != RT_CHANNEL_DOMAIN_REALTEK_DEFINE) {
-               DBG_8723A("ChannelPlan ID %x error !!!!!\n", ChannelPlan);
-               return chanset_size;
+       if (cplan >= RT_CHANNEL_DOMAIN_MAX &&
+           cplan != RT_CHANNEL_DOMAIN_REALTEK_DEFINE) {
+               DBG_8723A("ChannelPlan ID %x error !!!!!\n", cplan);
+               return ch_size;
        }
 
        if (padapter->registrypriv.wireless_mode & WIRELESS_11G) {
                b2_4GBand = true;
-               if (RT_CHANNEL_DOMAIN_REALTEK_DEFINE == ChannelPlan)
+               if (RT_CHANNEL_DOMAIN_REALTEK_DEFINE == cplan)
                        Index2G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index2G;
                else
-                       Index2G = RTW_ChannelPlanMap[ChannelPlan].Index2G;
+                       Index2G = RTW_ChannelPlanMap[cplan].Index2G;
        }
 
        if (padapter->registrypriv.wireless_mode & WIRELESS_11A) {
                b5GBand = true;
-               if (RT_CHANNEL_DOMAIN_REALTEK_DEFINE == ChannelPlan)
+               if (RT_CHANNEL_DOMAIN_REALTEK_DEFINE == cplan)
                        Index5G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index5G;
                else
-                       Index5G = RTW_ChannelPlanMap[ChannelPlan].Index5G;
+                       Index5G = RTW_ChannelPlanMap[cplan].Index5G;
        }
 
        if (b2_4GBand) {
-               for (index = 0; index<RTW_ChannelPlan2G[Index2G].Len; index++) {
-                       channel_set[chanset_size].ChannelNum =
-                               RTW_ChannelPlan2G[Index2G].Channel[index];
+               for (i = 0; i < RTW_ChannelPlan2G[Index2G].Len; i++) {
+                       c_set[ch_size].ChannelNum =
+                               RTW_ChannelPlan2G[Index2G].Channel[i];
 
-                       if ((RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN == ChannelPlan) ||
+                       if ((RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN == cplan) ||
                            /* Channel 1~11 is active, and 12~14 is passive */
-                           (RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN_2G == ChannelPlan)){
-                               if (channel_set[chanset_size].ChannelNum >= 1 &&
-                                   channel_set[chanset_size].ChannelNum <= 11)
-                                       channel_set[chanset_size].ScanType =
-                                               SCAN_ACTIVE;
-                               else if ((channel_set[chanset_size].ChannelNum >= 12 &&
-                                         channel_set[chanset_size].ChannelNum  <= 14))
-                                       channel_set[chanset_size].ScanType =
-                                               SCAN_PASSIVE;
-                       } else if (RT_CHANNEL_DOMAIN_WORLD_WIDE_13 ==
-                                  ChannelPlan ||
-                                  RT_CHANNEL_DOMAIN_WORLD_WIDE_5G ==
-                                  ChannelPlan ||
+                           RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN_2G == cplan) {
+                               if (c_set[ch_size].ChannelNum >= 1 &&
+                                   c_set[ch_size].ChannelNum <= 11)
+                                       c_set[ch_size].ScanType = SCAN_ACTIVE;
+                               else if (c_set[ch_size].ChannelNum >= 12 &&
+                                        c_set[ch_size].ChannelNum  <= 14)
+                                       c_set[ch_size].ScanType = SCAN_PASSIVE;
+                       } else if (RT_CHANNEL_DOMAIN_WORLD_WIDE_13 == cplan ||
+                                  RT_CHANNEL_DOMAIN_WORLD_WIDE_5G == cplan ||
                                   RT_CHANNEL_DOMAIN_2G_WORLD == Index2G) {
                                /*  channel 12~13, passive scan */
-                               if (channel_set[chanset_size].ChannelNum <= 11)
-                                       channel_set[chanset_size].ScanType =
-                                               SCAN_ACTIVE;
+                               if (c_set[ch_size].ChannelNum <= 11)
+                                       c_set[ch_size].ScanType = SCAN_ACTIVE;
                                else
-                                       channel_set[chanset_size].ScanType =
-                                               SCAN_PASSIVE;
+                                       c_set[ch_size].ScanType = SCAN_PASSIVE;
                        } else
-                               channel_set[chanset_size].ScanType =
-                                       SCAN_ACTIVE;
+                               c_set[ch_size].ScanType = SCAN_ACTIVE;
 
-                       chanset_size++;
+                       ch_size++;
                }
        }
 
        if (b5GBand) {
-               for (index = 0;index<RTW_ChannelPlan5G[Index5G].Len;index++) {
-                       if (RTW_ChannelPlan5G[Index5G].Channel[index] <= 48 ||
-                           RTW_ChannelPlan5G[Index5G].Channel[index] >= 149) {
-                               channel_set[chanset_size].ChannelNum =
-                                       RTW_ChannelPlan5G[Index5G].Channel[index];
-                               if (RT_CHANNEL_DOMAIN_WORLD_WIDE_5G ==
-                                   ChannelPlan) {
+               for (i = 0; i < RTW_ChannelPlan5G[Index5G].Len; i++) {
+                       if (RTW_ChannelPlan5G[Index5G].Channel[i] <= 48 ||
+                           RTW_ChannelPlan5G[Index5G].Channel[i] >= 149) {
+                               c_set[ch_size].ChannelNum =
+                                       RTW_ChannelPlan5G[Index5G].Channel[i];
+                               if (RT_CHANNEL_DOMAIN_WORLD_WIDE_5G == cplan) {
                                        /* passive scan for all 5G channels */
-                                       channel_set[chanset_size].ScanType =
+                                       c_set[ch_size].ScanType =
                                                SCAN_PASSIVE;
                                } else
-                                       channel_set[chanset_size].ScanType =
+                                       c_set[ch_size].ScanType =
                                                SCAN_ACTIVE;
                                DBG_8723A("%s(): channel_set[%d].ChannelNum = "
-                                         "%d\n", __func__, chanset_size,
-                                         channel_set[chanset_size].ChannelNum);
-                               chanset_size++;
+                                         "%d\n", __func__, ch_size,
+                                         c_set[ch_size].ChannelNum);
+                               ch_size++;
                        }
                }
        }
 
-       return chanset_size;
+       return ch_size;
 }
 
 int init_mlme_ext_priv23a(struct rtw_adapter* padapter)
@@ -547,28 +570,28 @@ _mgt_dispatcher23a(struct rtw_adapter *padapter, struct mlme_handler *ptable,
 void mgt_dispatcher23a(struct rtw_adapter *padapter,
                    struct recv_frame *precv_frame)
 {
-       int index;
        struct mlme_handler *ptable;
 #ifdef CONFIG_8723AU_AP_MODE
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 #endif /* CONFIG_8723AU_AP_MODE */
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u16 stype;
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
        struct sta_info *psta;
+       u16 stype;
+       int index;
 
-       if (!ieee80211_is_mgmt(hdr->frame_control))
+       if (!ieee80211_is_mgmt(mgmt->frame_control))
                return;
 
        /* receive the frames that ra(a1) is my address or ra(a1) is
           bc address. */
-       if (!ether_addr_equal(hdr->addr1, myid(&padapter->eeprompriv)) &&
-           !is_broadcast_ether_addr(hdr->addr1))
+       if (!ether_addr_equal(mgmt->da, myid(&padapter->eeprompriv)) &&
+           !is_broadcast_ether_addr(mgmt->da))
                return;
 
        ptable = mlme_sta_tbl;
 
-       stype = le16_to_cpu(hdr->frame_control) & IEEE80211_FCTL_STYPE;
+       stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
        index = stype >> 4;
 
        if (index > 13) {
@@ -579,10 +602,10 @@ void mgt_dispatcher23a(struct rtw_adapter *padapter,
        }
        ptable += index;
 
-       psta = rtw_get_stainfo23a(&padapter->stapriv, hdr->addr2);
+       psta = rtw_get_stainfo23a(&padapter->stapriv, mgmt->sa);
 
        if (psta) {
-               if (ieee80211_has_retry(hdr->frame_control)) {
+               if (ieee80211_has_retry(mgmt->frame_control)) {
                        if (precv_frame->attrib.seq_num ==
                            psta->RxMgmtFrameSeqNum) {
                                /* drop the duplicate management frame */
@@ -623,8 +646,6 @@ void mgt_dispatcher23a(struct rtw_adapter *padapter,
                break;
        default:
                _mgt_dispatcher23a(padapter, ptable, precv_frame);
-               if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true)
-                       rtw_hostapd_mlme_rx23a(padapter, precv_frame);
                break;
        }
 #else
@@ -632,186 +653,63 @@ void mgt_dispatcher23a(struct rtw_adapter *padapter,
 #endif
 }
 
-#ifdef CONFIG_8723AU_P2P
-static u32 p2p_listen_state_process(struct rtw_adapter *padapter,
-                                   unsigned char *da)
-{
-       bool response = true;
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == false ||
-           padapter->mlmepriv.wps_probe_resp_ie == NULL ||
-           padapter->mlmepriv.p2p_probe_resp_ie == NULL) {
-               DBG_8723A("DON'T issue_probersp23a_p2p23a: p2p_enabled:%d, "
-                         "wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p\n",
-                         wdev_to_priv(padapter->rtw_wdev)->p2p_enabled,
-                         padapter->mlmepriv.wps_probe_resp_ie,
-                         padapter->mlmepriv.p2p_probe_resp_ie);
-               response = false;
-       }
-
-       if (response == true)
-               issue_probersp23a_p2p23a(padapter, da);
-
-       return _SUCCESS;
-}
-#endif /* CONFIG_8723AU_P2P */
-
 /****************************************************************************
 
 Following are the callback functions for each subtype of the management frames
 
 *****************************************************************************/
 
-unsigned int OnProbeReq23a(struct rtw_adapter *padapter,
-                          struct recv_frame *precv_frame)
+static int
+OnProbeReq23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
-       unsigned int    ielen;
-       unsigned char   *p;
+       const u8 *ie;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *cur = &pmlmeinfo->network;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
-       uint len = skb->len;
-       u8 is_valid_p2p_probereq = false;
-
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 wifi_test_chk_rate = 1;
-
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
-           !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) &&
-           !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) &&
-           !rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) &&
-           !rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN)) {
-               /*      mcs_rate = 0 -> CCK 1M rate */
-               /*      mcs_rate = 1 -> CCK 2M rate */
-               /*      mcs_rate = 2 -> CCK 5.5M rate */
-               /*      mcs_rate = 3 -> CCK 11M rate */
-               /*      In the P2P mode, the driver should not support
-                       the CCK rate */
-
-               /*      IOT issue: Google Nexus7 use 1M rate to send
-                       p2p_probe_req after GO nego completed and Nexus7
-                       is client */
-               if (wifi_test_chk_rate == 1) {
-                       if ((is_valid_p2p_probereq =
-                            process_probe_req_p2p_ie23a(pwdinfo, pframe,
-                                                        len)) == true) {
-                               if (rtw_p2p_chk_role(pwdinfo,
-                                                    P2P_ROLE_DEVICE)) {
-                                       u8 *sa = ieee80211_get_SA(hdr);
-                                       p2p_listen_state_process(padapter, sa);
-                                       return _SUCCESS;
-                               }
-
-                               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                                       goto _continue;
-                               }
-                       }
-               }
-       }
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
+       int len = skb->len;
 
-_continue:
-#endif /* CONFIG_8723AU_P2P */
-
-       if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
+       if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
                return _SUCCESS;
-       }
 
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == false &&
-               check_fwstate(pmlmepriv,
-                             WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE) == false) {
+       if (!check_fwstate(pmlmepriv, _FW_LINKED) &&
+           !check_fwstate(pmlmepriv,
+                          WIFI_ADHOC_MASTER_STATE | WIFI_AP_STATE))
                return _SUCCESS;
-       }
 
-       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) +
-                         _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ielen,
-                         len - sizeof(struct ieee80211_hdr_3addr) -
-                         _PROBEREQ_IE_OFFSET_);
+       if (unlikely(!ieee80211_is_probe_req(mgmt->frame_control))) {
+               printk(KERN_WARNING "%s: Received non probe request frame\n",
+                      __func__);
+               return _FAIL;
+       }
 
-       /* check (wildcard) SSID */
-       if (p) {
-               if (is_valid_p2p_probereq == true) {
-                       goto _issue_probersp23a;
-               }
+       len -= offsetof(struct ieee80211_mgmt, u.probe_req.variable);
 
-               if ((ielen != 0 &&
-                    memcmp((void *)(p+2), cur->Ssid.ssid,
-                           cur->Ssid.ssid_len)) ||
-                   (ielen == 0 && pmlmeinfo->hidden_ssid_mode)) {
-                       return _SUCCESS;
-               }
+       ie = cfg80211_find_ie(WLAN_EID_SSID, mgmt->u.probe_req.variable, len);
 
-_issue_probersp23a:
+       /* check (wildcard) SSID */
+       if (!ie)
+               goto out;
 
-               if (check_fwstate(pmlmepriv, _FW_LINKED) == true &&
-                   pmlmepriv->cur_network.join_res == true) {
-                       /* DBG_8723A("+issue_probersp23a during ap mode\n"); */
-                       issue_probersp23a(padapter, ieee80211_get_SA(hdr),
-                                         is_valid_p2p_probereq);
-               }
+       if ((ie[1] && memcmp(ie + 2, cur->Ssid.ssid, cur->Ssid.ssid_len)) ||
+           (ie[1] == 0 && pmlmeinfo->hidden_ssid_mode)) {
+               return _SUCCESS;
        }
 
+       if (check_fwstate(pmlmepriv, _FW_LINKED) &&
+           pmlmepriv->cur_network.join_res)
+               issue_probersp23a(padapter, mgmt->sa, false);
+
+out:
        return _SUCCESS;
 }
 
-unsigned int OnProbeRsp23a(struct rtw_adapter *padapter,
-                          struct recv_frame *precv_frame)
+static int
+OnProbeRsp23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-#ifdef CONFIG_8723AU_P2P
-       struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-#endif
-
-#ifdef CONFIG_8723AU_P2P
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) {
-               if (pwdinfo->tx_prov_disc_info.benable == true) {
-                       if (ether_addr_equal(pwdinfo->tx_prov_disc_info.peerIFAddr,
-                                   hdr->addr2)) {
-                               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
-                                       pwdinfo->tx_prov_disc_info.benable = false;
-                                       issue_p2p_provision_request23a(padapter,
-                                                                                               pwdinfo->tx_prov_disc_info.ssid.ssid,
-                                                                                               pwdinfo->tx_prov_disc_info.ssid.ssid_len,
-                                                                                               pwdinfo->tx_prov_disc_info.peerDevAddr);
-                               }
-                               else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                               {
-                                       pwdinfo->tx_prov_disc_info.benable = false;
-                                       issue_p2p_provision_request23a(padapter,
-                                                                                               NULL,
-                                                                                               0,
-                                                                                               pwdinfo->tx_prov_disc_info.peerDevAddr);
-                               }
-                       }
-               }
-               return _SUCCESS;
-       } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) {
-               if (pwdinfo->nego_req_info.benable == true) {
-                       DBG_8723A("[%s] P2P State is GONEGO ING!\n", __func__);
-                       if (ether_addr_equal(pwdinfo->nego_req_info.peerDevAddr,
-                                            hdr->addr2)) {
-                               pwdinfo->nego_req_info.benable = false;
-                               issue_p2p_GO_request23a(padapter, pwdinfo->nego_req_info.peerDevAddr);
-                       }
-               }
-       } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ)) {
-               if (pwdinfo->invitereq_info.benable == true) {
-                       DBG_8723A("[%s] P2P_STATE_TX_INVITE_REQ!\n", __func__);
-                       if (ether_addr_equal(
-                                   pwdinfo->invitereq_info.peer_macaddr,
-                                   hdr->addr2)) {
-                               pwdinfo->invitereq_info.benable = false;
-                               issue_p2p_invitation_request23a(padapter, pwdinfo->invitereq_info.peer_macaddr);
-                       }
-               }
-       }
-#endif
 
        if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
                report_survey_event23a(padapter, precv_frame);
@@ -821,30 +719,30 @@ unsigned int OnProbeRsp23a(struct rtw_adapter *padapter,
        return _SUCCESS;
 }
 
-unsigned int OnBeacon23a(struct rtw_adapter *padapter,
-                        struct recv_frame *precv_frame)
+static int
+OnBeacon23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        int cam_idx;
        struct sta_info *psta;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct sta_priv *pstapriv = &padapter->stapriv;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
        u8 *pframe = skb->data;
-       uint len = skb->len;
+       int pkt_len = skb->len;
        struct wlan_bssid_ex *pbss;
        int ret = _SUCCESS;
-       u8 *p = NULL;
+       u8 *p, *pie;
+       int pie_len;
        u32 ielen = 0;
 
-       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) +
-                         _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ielen,
-                         len - sizeof(struct ieee80211_hdr_3addr) -
-                         _BEACON_IE_OFFSET_);
-       if ((p != NULL) && (ielen > 0)) {
-               if ((*(p + 1 + ielen) == 0x2D) && (*(p + 2 + ielen) != 0x2D)) {
+       pie = mgmt->u.beacon.variable;
+       pie_len = pkt_len - offsetof(struct ieee80211_mgmt, u.beacon.variable);
+       p = rtw_get_ie23a(pie, WLAN_EID_EXT_SUPP_RATES, &ielen, pie_len);
+       if (p && ielen > 0) {
+               if (p[1 + ielen] == 0x2D && p[2 + ielen] != 0x2D) {
                        /* Invalid value 0x2D is detected in Extended Supported
                         * Rates (ESR) IE. Try to fix the IE length to avoid
                         * failed Beacon parsing.
@@ -852,8 +750,8 @@ unsigned int OnBeacon23a(struct rtw_adapter *padapter,
                        DBG_8723A("[WIFIDBG] Error in ESR IE is detected in "
                                  "Beacon of BSSID: %pM. Fix the length of "
                                  "ESR IE to avoid failed Beacon parsing.\n",
-                                 hdr->addr3);
-                       *(p + 1) = ielen - 1;
+                                 mgmt->bssid);
+                       p[1] = ielen - 1;
                }
        }
 
@@ -862,129 +760,130 @@ unsigned int OnBeacon23a(struct rtw_adapter *padapter,
                return _SUCCESS;
        }
 
-       if (ether_addr_equal(hdr->addr3, get_my_bssid23a(&pmlmeinfo->network))){
-               if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) {
-                       /* we should update current network before auth,
-                          or some IE is wrong */
-                       pbss = (struct wlan_bssid_ex *)
-                               kmalloc(sizeof(struct wlan_bssid_ex),
-                                       GFP_ATOMIC);
-                       if (pbss) {
-                               if (collect_bss_info23a(padapter, precv_frame,
-                                                       pbss) == _SUCCESS) {
-                                       update_network23a(&pmlmepriv->cur_network.network, pbss, padapter, true);
-                                       rtw_get_bcn_info23a(&pmlmepriv->cur_network);
-                               }
-                               kfree(pbss);
-                       }
+       if (!ether_addr_equal(mgmt->bssid,
+                             get_my_bssid23a(&pmlmeinfo->network)))
+               goto out;
 
-                       /* check the vendor of the assoc AP */
-                       pmlmeinfo->assoc_AP_vendor = check_assoc_AP23a(pframe + sizeof(struct ieee80211_hdr_3addr), len-sizeof(struct ieee80211_hdr_3addr));
+       if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) {
+               /* we should update current network before auth,
+                  or some IE is wrong */
+               pbss = (struct wlan_bssid_ex *)
+                       kmalloc(sizeof(struct wlan_bssid_ex), GFP_ATOMIC);
+               if (pbss) {
+                       if (collect_bss_info23a(padapter, precv_frame, pbss) ==
+                           _SUCCESS) {
+                               update_network23a(
+                                       &pmlmepriv->cur_network.network, pbss,
+                                       padapter, true);
+                               rtw_get_bcn_info23a(&pmlmepriv->cur_network);
+                       }
+                       kfree(pbss);
+               }
 
-                       /* update TSF Value */
-                       update_TSF23a(pmlmeext, pframe, len);
+               /* check the vendor of the assoc AP */
+               pmlmeinfo->assoc_AP_vendor =
+                       check_assoc_AP23a((u8 *)&mgmt->u.beacon, pkt_len -
+                                         offsetof(struct ieee80211_mgmt, u));
 
-                       /* start auth */
-                       start_clnt_auth23a(padapter);
+               /* update TSF Value */
+               rtw_update_TSF(pmlmeext, mgmt);
 
-                       return _SUCCESS;
-               }
+               /* start auth */
+               start_clnt_auth23a(padapter);
 
-               if (((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) &&
-                   (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) {
-                       psta = rtw_get_stainfo23a(pstapriv, hdr->addr2);
-                       if (psta) {
-                               ret = rtw_check_bcn_info23a(padapter, pframe,
-                                                           len);
-                               if (!ret) {
-                                       DBG_8723A_LEVEL(_drv_always_,
-                                                       "ap has changed, "
-                                                       "disconnect now\n");
-                                       receive_disconnect23a(padapter, pmlmeinfo->network.MacAddress, 65535);
-                                       return _SUCCESS;
-                               }
-                               /* update WMM, ERP in the beacon */
-                               /* todo: the timer is used instead of
-                                  the number of the beacon received */
-                               if ((sta_rx_pkts(psta) & 0xf) == 0) {
-                                       /* DBG_8723A("update_bcn_info\n"); */
-                                       update_beacon23a_info(padapter, pframe,
-                                                             len, psta);
-                               }
+               return _SUCCESS;
+       }
 
-#ifdef CONFIG_8723AU_P2P
-                               process_p2p_ps_ie23a(padapter, (pframe + sizeof(struct ieee80211_hdr_3addr)), (len - sizeof(struct ieee80211_hdr_3addr)));
-#endif /* CONFIG_8723AU_P2P */
+       if (((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) &&
+           (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) {
+               psta = rtw_get_stainfo23a(pstapriv, mgmt->sa);
+               if (psta) {
+                       ret = rtw_check_bcn_info23a(padapter, mgmt, pkt_len);
+                       if (!ret) {
+                               DBG_8723A_LEVEL(_drv_always_, "ap has changed, "
+                                               "disconnect now\n");
+                               receive_disconnect23a(padapter, pmlmeinfo->network.MacAddress, 65535);
+                               return _SUCCESS;
+                       }
+                       /* update WMM, ERP in the beacon */
+                       /* todo: the timer is used instead of
+                          the number of the beacon received */
+                       if ((sta_rx_pkts(psta) & 0xf) == 0) {
+                               /* DBG_8723A("update_bcn_info\n"); */
+                               update_beacon23a_info(padapter, pframe,
+                                                     pkt_len, psta);
+                       }
+               }
+       } else if ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) {
+               psta = rtw_get_stainfo23a(pstapriv, mgmt->sa);
+               if (psta) {
+                       /* update WMM, ERP in the beacon */
+                       /* todo: the timer is used instead of the
+                          number of the beacon received */
+                       if ((sta_rx_pkts(psta) & 0xf) == 0) {
+                               /* DBG_8723A("update_bcn_info\n"); */
+                               update_beacon23a_info(padapter, pframe,
+                                                     pkt_len, psta);
+                       }
+               } else {
+                       /* allocate a new CAM entry for IBSS station */
+                       cam_idx = allocate_fw_sta_entry23a(padapter);
+                       if (cam_idx == NUM_STA)
+                               goto out;
+
+                       /* get supported rate */
+                       if (update_sta_support_rate23a(padapter, pie, pie_len,
+                                                      cam_idx) == _FAIL) {
+                               pmlmeinfo->FW_sta_info[cam_idx].status = 0;
+                               goto out;
                        }
-               } else if ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) {
-                       psta = rtw_get_stainfo23a(pstapriv, hdr->addr2);
-                       if (psta) {
-                               /* update WMM, ERP in the beacon */
-                               /* todo: the timer is used instead of the
-                                  number of the beacon received */
-                               if ((sta_rx_pkts(psta) & 0xf) == 0) {
-                                       /* DBG_8723A("update_bcn_info\n"); */
-                                       update_beacon23a_info(padapter, pframe,
-                                                             len, psta);
-                               }
-                       } else {
-                               /* allocate a new CAM entry for IBSS station */
-                               cam_idx = allocate_fw_sta_entry23a(padapter);
-                               if (cam_idx == NUM_STA)
-                                       goto _END_ONBEACON_;
-
-                               /* get supported rate */
-                               if (update_sta_support_rate23a(padapter, (pframe + sizeof(struct ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_), (len - sizeof(struct ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_), cam_idx) == _FAIL) {
-                                       pmlmeinfo->FW_sta_info[cam_idx].status = 0;
-                                       goto _END_ONBEACON_;
-                               }
 
-                               /* update TSF Value */
-                               update_TSF23a(pmlmeext, pframe, len);
+                       /* update TSF Value */
+                       rtw_update_TSF(pmlmeext, mgmt);
 
-                               /* report sta add event */
-                               report_add_sta_event23a(padapter, hdr->addr2,
-                                                       cam_idx);
-                       }
+                       /* report sta add event */
+                       report_add_sta_event23a(padapter, mgmt->sa,
+                                               cam_idx);
                }
        }
 
-_END_ONBEACON_:
+out:
 
        return _SUCCESS;
 }
 
-unsigned int OnAuth23a(struct rtw_adapter *padapter,
-                      struct recv_frame *precv_frame)
+static int
+OnAuth23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
 #ifdef CONFIG_8723AU_AP_MODE
-       unsigned int    auth_mode, seq, ie_len;
-       unsigned char   *sa, *p;
-       u16     algorithm;
-       int     status;
        static struct sta_info stat;
-       struct  sta_info        *pstat = NULL;
-       struct  sta_priv *pstapriv = &padapter->stapriv;
+       struct sta_info *pstat = NULL;
+       struct sta_priv *pstapriv = &padapter->stapriv;
        struct security_priv *psecuritypriv = &padapter->securitypriv;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
-       uint len = skb->len;
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
+       u8 *pframe;
+       const u8 *p;
+       unsigned char *sa;
+       u16 auth_mode, seq, algorithm;
+       int status, len = skb->len;
 
-       if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
+       if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE)
                return _FAIL;
 
        DBG_8723A("+OnAuth23a\n");
 
-       sa = hdr->addr2;
+       sa = mgmt->sa;
 
        auth_mode = psecuritypriv->dot11AuthAlgrthm;
-       seq = cpu_to_le16(*(u16*)((unsigned long)pframe +
-                                 sizeof(struct ieee80211_hdr_3addr) + 2));
-       algorithm = cpu_to_le16(*(u16*)((unsigned long)pframe +
-                                       sizeof(struct ieee80211_hdr_3addr)));
+
+       pframe = mgmt->u.auth.variable;
+       len = skb->len - offsetof(struct ieee80211_mgmt, u.auth.variable);
+
+       seq = le16_to_cpu(mgmt->u.auth.auth_transaction);
+       algorithm = le16_to_cpu(mgmt->u.auth.auth_alg);
 
        DBG_8723A("auth alg =%x, seq =%X\n", algorithm, seq);
 
@@ -995,8 +894,8 @@ unsigned int OnAuth23a(struct rtw_adapter *padapter,
 
        /*  rx a shared-key auth but shared not enabled, or */
        /*  rx a open-system auth but shared-key is enabled */
-       if ((algorithm > 0 && auth_mode == 0) ||
-           (algorithm == 0 && auth_mode == 1)) {
+       if ((algorithm != WLAN_AUTH_OPEN && auth_mode == 0) ||
+           (algorithm == WLAN_AUTH_OPEN && auth_mode == 1)) {
                DBG_8723A("auth rejected due to bad alg [alg =%d, auth_mib "
                          "=%d] %02X%02X%02X%02X%02X%02X\n",
                          algorithm, auth_mode,
@@ -1035,8 +934,7 @@ unsigned int OnAuth23a(struct rtw_adapter *padapter,
                if (!list_empty(&pstat->asoc_list)) {
                        list_del_init(&pstat->asoc_list);
                        pstapriv->asoc_list_cnt--;
-                       if (pstat->expire_to > 0)
-                       {
+                       if (pstat->expire_to > 0) {
                                /* TODO: STA re_auth within expire_to */
                        }
                }
@@ -1064,7 +962,7 @@ unsigned int OnAuth23a(struct rtw_adapter *padapter,
                goto auth_fail;
        }
 
-       if (algorithm == 0 && (auth_mode == 0 || auth_mode == 2)) {
+       if (algorithm == WLAN_AUTH_OPEN && (auth_mode == 0 || auth_mode == 2)) {
                if (seq == 1) {
                        pstat->state &= ~WIFI_FW_AUTH_NULL;
                        pstat->state |= WIFI_FW_AUTH_SUCCESS;
@@ -1088,22 +986,16 @@ unsigned int OnAuth23a(struct rtw_adapter *padapter,
                        /* checking for challenging txt... */
                        DBG_8723A("checking for challenging txt...\n");
 
-                       p = rtw_get_ie23a(pframe +
-                                         sizeof(struct ieee80211_hdr_3addr) +
-                                         4 + _AUTH_IE_OFFSET_, _CHLGETXT_IE_,
-                                         (int *)&ie_len, len -
-                                         sizeof(struct ieee80211_hdr_3addr) -
-                                         _AUTH_IE_OFFSET_ - 4);
-
-                       if ((p == NULL) || (ie_len<= 0)) {
+                       p = cfg80211_find_ie(WLAN_EID_CHALLENGE, pframe, len);
+                       if (!p || p[1] <= 0) {
                                DBG_8723A("auth rejected because challenge "
                                          "failure!(1)\n");
                                status = WLAN_STATUS_CHALLENGE_FAIL;
                                goto auth_fail;
                        }
 
-                       if (!memcmp((void *)(p + 2), pstat->chg_txt, 128)) {
-                               pstat->state &= (~WIFI_FW_AUTH_STATE);
+                       if (!memcmp(p + 2, pstat->chg_txt, 128)) {
+                               pstat->state &= ~WIFI_FW_AUTH_STATE;
                                pstat->state |= WIFI_FW_AUTH_SUCCESS;
                                /*  challenging txt is correct... */
                                pstat->expire_to =  pstapriv->assoc_to;
@@ -1125,7 +1017,7 @@ unsigned int OnAuth23a(struct rtw_adapter *padapter,
        /*  Now, we are going to issue_auth23a... */
        pstat->auth_seq = seq + 1;
 
-       issue_auth23a(padapter, pstat, (unsigned short)WLAN_STATUS_SUCCESS);
+       issue_auth23a(padapter, pstat, WLAN_STATUS_SUCCESS);
 
        if (pstat->state & WIFI_FW_AUTH_SUCCESS)
                pstat->auth_seq = 0;
@@ -1148,40 +1040,39 @@ auth_fail:
        return _FAIL;
 }
 
-unsigned int OnAuth23aClient23a(struct rtw_adapter *padapter,
-                               struct recv_frame *precv_frame)
+static int
+OnAuth23aClient23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
-       unsigned int    seq, len, status, algthm, offset;
-       unsigned char   *p;
-       unsigned int    go2asoc = 0;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       unsigned int seq, status, algthm;
+       unsigned int go2asoc = 0;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
-       uint pkt_len = skb->len;
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
+       const u8 *p;
+       u8 *pie;
+       int plen = skb->len;
 
        DBG_8723A("%s\n", __func__);
 
        /* check A1 matches or not */
-       if (!ether_addr_equal(myid(&padapter->eeprompriv),
-                             ieee80211_get_DA(hdr)))
+       if (!ether_addr_equal(myid(&padapter->eeprompriv), mgmt->da))
                return _SUCCESS;
 
        if (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE))
                return _SUCCESS;
 
-       offset = ieee80211_has_protected(hdr->frame_control) ? 4: 0;
+       pie = mgmt->u.auth.variable;
+       plen -= offsetof(struct ieee80211_mgmt, u.auth.variable);
 
-       algthm  = le16_to_cpu(*(unsigned short *)((unsigned long)pframe + sizeof(struct ieee80211_hdr_3addr) + offset));
-       seq     = le16_to_cpu(*(unsigned short *)((unsigned long)pframe + sizeof(struct ieee80211_hdr_3addr) + offset + 2));
-       status  = le16_to_cpu(*(unsigned short *)((unsigned long)pframe + sizeof(struct ieee80211_hdr_3addr) + offset + 4));
+       algthm = le16_to_cpu(mgmt->u.auth.auth_alg);
+       seq = le16_to_cpu(mgmt->u.auth.auth_transaction);
+       status = le16_to_cpu(mgmt->u.auth.status_code);
 
-       if (status != 0)
-       {
+       if (status) {
                DBG_8723A("clnt auth fail, status: %d\n", status);
-               if (status == 13)/*  pmlmeinfo->auth_algo == dot11AuthAlgrthm_Auto) */
-               {
+               /*  pmlmeinfo->auth_algo == dot11AuthAlgrthm_Auto) */
+               if (status == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG) {
                        if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)
                                pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open;
                        else
@@ -1193,53 +1084,39 @@ unsigned int OnAuth23aClient23a(struct rtw_adapter *padapter,
                goto authclnt_fail;
        }
 
-       if (seq == 2)
-       {
-               if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)
-               {
-                        /*  legendary shared system */
-                       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&len,
-                               pkt_len - sizeof(struct ieee80211_hdr_3addr) - _AUTH_IE_OFFSET_);
+       if (seq == 2) {
+               if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) {
+                       /*  legendary shared system */
+                       p = cfg80211_find_ie(WLAN_EID_CHALLENGE, pie, plen);
 
-                       if (p == NULL)
-                       {
+                       if (!p) {
                                /* DBG_8723A("marc: no challenge text?\n"); */
                                goto authclnt_fail;
                        }
 
-                       memcpy((void *)(pmlmeinfo->chg_txt), (void *)(p + 2), len);
+                       memcpy((void *)(pmlmeinfo->chg_txt), p + 2, p[1]);
                        pmlmeinfo->auth_seq = 3;
                        issue_auth23a(padapter, NULL, 0);
                        set_link_timer(pmlmeext, REAUTH_TO);
 
                        return _SUCCESS;
-               }
-               else
-               {
+               } else {
                        /*  open system */
                        go2asoc = 1;
                }
-       }
-       else if (seq == 4)
-       {
+       } else if (seq == 4) {
                if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)
-               {
                        go2asoc = 1;
-               }
                else
-               {
                        goto authclnt_fail;
-               }
-       }
-       else
-       {
+       } else {
                /*  this is also illegal */
-               /* DBG_8723A("marc: clnt auth failed due to illegal seq =%x\n", seq); */
+               /* DBG_8723A("marc: clnt auth failed due to illegal seq =%x\n",
+                  seq); */
                goto authclnt_fail;
        }
 
-       if (go2asoc)
-       {
+       if (go2asoc) {
                DBG_8723A_LEVEL(_drv_always_, "auth success, start assoc\n");
                start_clnt_assoc23a(padapter);
                return _SUCCESS;
@@ -1252,19 +1129,153 @@ authclnt_fail:
        return _FAIL;
 }
 
-unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+#ifdef CONFIG_8723AU_AP_MODE
+static int rtw_validate_vendor_specific_ies(const u8 *pos, int elen)
+{
+       unsigned int oui;
+
+       /* first 3 bytes in vendor specific information element are the IEEE
+        * OUI of the vendor. The following byte is used a vendor specific
+        * sub-type. */
+       if (elen < 4) {
+               DBG_8723A("short vendor specific information element "
+                         "ignored (len =%i)\n", elen);
+               return -EINVAL;
+       }
+
+       oui = RTW_GET_BE24(pos);
+       switch (oui) {
+       case WLAN_OUI_MICROSOFT:
+               /* Microsoft/Wi-Fi information elements are further typed and
+                * subtyped */
+               switch (pos[3]) {
+               case 1:
+                       /* Microsoft OUI (00:50:F2) with OUI Type 1:
+                        * real WPA information element */
+                       break;
+               case WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */
+                       if (elen < 5) {
+                               DBG_8723A("short WME information element "
+                                         "ignored (len =%i)\n", elen);
+                               return -EINVAL;
+                       }
+                       switch (pos[4]) {
+                       case WME_OUI_SUBTYPE_INFORMATION_ELEMENT:
+                       case WME_OUI_SUBTYPE_PARAMETER_ELEMENT:
+                               break;
+                       case WME_OUI_SUBTYPE_TSPEC_ELEMENT:
+                               break;
+                       default:
+                               DBG_8723A("unknown WME information element "
+                                         "ignored (subtype =%d len =%i)\n",
+                                          pos[4], elen);
+                               return -EINVAL;
+                       }
+                       break;
+               case 4:
+                       /* Wi-Fi Protected Setup (WPS) IE */
+                       break;
+               default:
+                       DBG_8723A("Unknown Microsoft information element "
+                                 "ignored (type =%d len =%i)\n",
+                                 pos[3], elen);
+                       return -EINVAL;
+               }
+               break;
+
+       case OUI_BROADCOM:
+               switch (pos[3]) {
+               case VENDOR_HT_CAPAB_OUI_TYPE:
+                       break;
+               default:
+                       DBG_8723A("Unknown Broadcom information element "
+                                 "ignored (type =%d len =%i)\n", pos[3], elen);
+                       return -EINVAL;
+               }
+               break;
+
+       default:
+               DBG_8723A("unknown vendor specific information element "
+                         "ignored (vendor OUI %02x:%02x:%02x len =%i)\n",
+                          pos[0], pos[1], pos[2], elen);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int rtw_validate_frame_ies(const u8 *start, uint len)
+{
+       const u8 *pos = start;
+       int left = len;
+       int unknown = 0;
+
+       while (left >= 2) {
+               u8 id, elen;
+
+               id = *pos++;
+               elen = *pos++;
+               left -= 2;
+
+               if (elen > left) {
+                       DBG_8723A("%s: IEEE 802.11 failed (id =%d elen =%d "
+                                 "left =%i)\n", __func__, id, elen, left);
+                       return -EINVAL;
+               }
+
+               switch (id) {
+               case WLAN_EID_SSID:
+               case WLAN_EID_SUPP_RATES:
+               case WLAN_EID_FH_PARAMS:
+               case WLAN_EID_DS_PARAMS:
+               case WLAN_EID_CF_PARAMS:
+               case WLAN_EID_TIM:
+               case WLAN_EID_IBSS_PARAMS:
+               case WLAN_EID_CHALLENGE:
+               case WLAN_EID_ERP_INFO:
+               case WLAN_EID_EXT_SUPP_RATES:
+               case WLAN_EID_VENDOR_SPECIFIC:
+               if (rtw_validate_vendor_specific_ies(pos, elen))
+                       unknown++;
+                       break;
+               case WLAN_EID_RSN:
+               case WLAN_EID_PWR_CAPABILITY:
+               case WLAN_EID_SUPPORTED_CHANNELS:
+               case WLAN_EID_MOBILITY_DOMAIN:
+               case WLAN_EID_FAST_BSS_TRANSITION:
+               case WLAN_EID_TIMEOUT_INTERVAL:
+               case WLAN_EID_HT_CAPABILITY:
+               case WLAN_EID_HT_OPERATION:
+               default:
+                       unknown++;
+                       DBG_8723A("%s IEEE 802.11 ignored unknown element "
+                                 "(id =%d elen =%d)\n", __func__, id, elen);
+                       break;
+               }
+
+               left -= elen;
+               pos += elen;
+       }
+
+       if (left)
+               return -EINVAL;
+
+       return 0;
+}
+#endif
+
+static int
+OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
 #ifdef CONFIG_8723AU_AP_MODE
        u16 capab_info, listen_interval;
-       struct rtw_ieee802_11_elems elems;
        struct sta_info *pstat;
-       unsigned char           reassoc, *p, *pos, *wpa_ie;
+       unsigned char reassoc;
        unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};
-       int             i, ie_len, wpa_ie_len, left;
-       unsigned char           supportRate[16];
-       int                                     supportRateNum;
-       unsigned short          status = WLAN_STATUS_SUCCESS;
-       unsigned short ie_offset;
+       int i, wpa_ie_len, left;
+       unsigned char supportRate[16];
+       int supportRateNum;
+       unsigned short status = WLAN_STATUS_SUCCESS;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct security_priv *psecuritypriv = &padapter->securitypriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
@@ -1272,69 +1283,56 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
        struct wlan_bssid_ex *cur = &pmlmeinfo->network;
        struct sta_priv *pstapriv = &padapter->stapriv;
        struct sk_buff *skb = precv_frame->pkt;
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
+       const u8 *pos, *p, *wpa_ie, *wps_ie;
        u8 *pframe = skb->data;
        uint pkt_len = skb->len;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u16 frame_control;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 p2p_status_code = P2P_STATUS_SUCCESS;
-       u8 *p2pie;
-       u32 p2pielen = 0;
-       u8      wfd_ie[MAX_WFD_IE_LEN] = { 0x00 };
-       u32     wfd_ielen = 0;
-#endif /* CONFIG_8723AU_P2P */
+       int r;
 
-       if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
+       if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE)
                return _FAIL;
 
-       frame_control = hdr->frame_control;
-       if (ieee80211_is_assoc_req(frame_control)) {
+       left = pkt_len - sizeof(struct ieee80211_hdr_3addr);
+       if (ieee80211_is_assoc_req(mgmt->frame_control)) {
                reassoc = 0;
-               ie_offset = _ASOCREQ_IE_OFFSET_;
+               pos = mgmt->u.assoc_req.variable;
+               left -= offsetof(struct ieee80211_mgmt, u.assoc_req.variable);
        } else { /*  WIFI_REASSOCREQ */
                reassoc = 1;
-               ie_offset = _REASOCREQ_IE_OFFSET_;
+               pos = mgmt->u.reassoc_req.variable;
+               left -= offsetof(struct ieee80211_mgmt, u.reassoc_req.variable);
        }
 
-       if (pkt_len < sizeof(struct ieee80211_hdr_3addr) + ie_offset) {
-               DBG_8723A("handle_assoc(reassoc =%d) - too short payload (len =%lu)"
-                      "\n", reassoc, (unsigned long)pkt_len);
+       if (left < 0) {
+               DBG_8723A("handle_assoc(reassoc =%d) - too short payload "
+                         "(len =%lu)\n", reassoc, (unsigned long)pkt_len);
                return _FAIL;
        }
 
-       pstat = rtw_get_stainfo23a(pstapriv, hdr->addr2);
+       pstat = rtw_get_stainfo23a(pstapriv, mgmt->sa);
        if (!pstat) {
                status = WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA;
                goto asoc_class2_error;
        }
 
-       capab_info = get_unaligned_le16(pframe + sizeof(struct ieee80211_hdr_3addr));
-       /* capab_info = le16_to_cpu(*(unsigned short *)(pframe + sizeof(struct ieee80211_hdr_3addr))); */
-       /* listen_interval = le16_to_cpu(*(unsigned short *)(pframe + sizeof(struct ieee80211_hdr_3addr)+2)); */
-       listen_interval = get_unaligned_le16(pframe + sizeof(struct ieee80211_hdr_3addr)+2);
-
-       left = pkt_len - (sizeof(struct ieee80211_hdr_3addr) + ie_offset);
-       pos = pframe + (sizeof(struct ieee80211_hdr_3addr) + ie_offset);
+       /* These two are located at the same offsets whether it's an
+        * assoc_req or a reassoc_req */
+       capab_info = get_unaligned_le16(&mgmt->u.assoc_req.capab_info);
+       listen_interval =
+               get_unaligned_le16(&mgmt->u.assoc_req.listen_interval);
 
        DBG_8723A("%s\n", __func__);
 
        /*  check if this stat has been successfully authenticated/assocated */
-       if (!((pstat->state) & WIFI_FW_AUTH_SUCCESS))
-       {
-               if (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS))
-               {
+       if (!(pstat->state & WIFI_FW_AUTH_SUCCESS)) {
+               if (!(pstat->state & WIFI_FW_ASSOC_SUCCESS)) {
                        status = WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA;
                        goto asoc_class2_error;
-               }
-               else
-               {
+               } else {
                        pstat->state &= (~WIFI_FW_ASSOC_SUCCESS);
                        pstat->state |= WIFI_FW_ASSOC_STATE;
                }
-       }
-       else
-       {
+       } else {
                pstat->state &= (~WIFI_FW_AUTH_SUCCESS);
                pstat->state |= WIFI_FW_ASSOC_STATE;
        }
@@ -1342,41 +1340,40 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
        pstat->capability = capab_info;
 
        /* now parse all ieee802_11 ie to point to elems */
-       if (rtw_ieee802_11_parse_elems23a(pos, left, &elems, 1) == ParseFailed ||
-           !elems.ssid) {
+
+       if (rtw_validate_frame_ies(pos, left)) {
                DBG_8723A("STA " MAC_FMT " sent invalid association request\n",
-                      MAC_ARG(pstat->hwaddr));
+                         MAC_ARG(pstat->hwaddr));
                status = WLAN_STATUS_UNSPECIFIED_FAILURE;
                goto OnAssocReq23aFail;
        }
 
        /*  now we should check all the fields... */
        /*  checking SSID */
-       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset, _SSID_IE_, &ie_len,
-               pkt_len - sizeof(struct ieee80211_hdr_3addr) - ie_offset);
-       if (p == NULL)
-       {
-               status = WLAN_STATUS_UNSPECIFIED_FAILURE;
-       }
-
-       if (ie_len == 0) /*  broadcast ssid, however it is not allowed in assocreq */
+       p = cfg80211_find_ie(WLAN_EID_SSID, pos, left);
+       if (!p || p[1] == 0) {
+               /*  broadcast ssid, however it is not allowed in assocreq */
+               DBG_8723A("STA " MAC_FMT " sent invalid association request "
+                         "lacking an SSID\n", MAC_ARG(pstat->hwaddr));
                status = WLAN_STATUS_UNSPECIFIED_FAILURE;
-       else {
+               goto OnAssocReq23aFail;
+       } else {
                /*  check if ssid match */
-               if (memcmp((void *)(p+2), cur->Ssid.ssid, cur->Ssid.ssid_len))
+               if (memcmp(p + 2, cur->Ssid.ssid, cur->Ssid.ssid_len))
                        status = WLAN_STATUS_UNSPECIFIED_FAILURE;
 
-               if (ie_len != cur->Ssid.ssid_len)
+               if (p[1] != cur->Ssid.ssid_len)
                        status = WLAN_STATUS_UNSPECIFIED_FAILURE;
        }
 
-       if (WLAN_STATUS_SUCCESS != status)
+       if (status != WLAN_STATUS_SUCCESS)
                goto OnAssocReq23aFail;
 
        /*  check if the supported rate is ok */
-       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - sizeof(struct ieee80211_hdr_3addr) - ie_offset);
-       if (p == NULL) {
-               DBG_8723A("Rx a sta assoc-req which supported rate is empty!\n");
+       p = cfg80211_find_ie(WLAN_EID_SUPP_RATES, pos, left);
+       if (!p) {
+               DBG_8723A("Rx a sta assoc-req which supported rate is "
+                         "empty!\n");
                /*  use our own rate set as statoin used */
                /* memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN); */
                /* supportRateNum = AP_BSSRATE_LEN; */
@@ -1384,17 +1381,14 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
                status = WLAN_STATUS_UNSPECIFIED_FAILURE;
                goto OnAssocReq23aFail;
        } else {
-               memcpy(supportRate, p+2, ie_len);
-               supportRateNum = ie_len;
-
-               p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset, _EXT_SUPPORTEDRATES_IE_, &ie_len,
-                               pkt_len - sizeof(struct ieee80211_hdr_3addr) - ie_offset);
-               if (p !=  NULL) {
-
-                       if (supportRateNum<= sizeof(supportRate))
-                       {
-                               memcpy(supportRate+supportRateNum, p+2, ie_len);
-                               supportRateNum += ie_len;
+               memcpy(supportRate, p + 2, p[1]);
+               supportRateNum = p[1];
+
+               p = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, pos, left);
+               if (!p) {
+                       if (supportRateNum <= sizeof(supportRate)) {
+                               memcpy(supportRate+supportRateNum, p + 2, p[1]);
+                               supportRateNum += p[1];
                        }
                }
        }
@@ -1415,90 +1409,97 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
        pstat->wpa_pairwise_cipher = 0;
        pstat->wpa2_pairwise_cipher = 0;
        memset(pstat->wpa_ie, 0, sizeof(pstat->wpa_ie));
-       if ((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) {
 
+       wpa_ie = cfg80211_find_ie(WLAN_EID_RSN, pos, left);
+       if (!wpa_ie)
+               wpa_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
+                                                WLAN_OUI_TYPE_MICROSOFT_WPA,
+                                                pos, left);
+       if (wpa_ie) {
                int group_cipher = 0, pairwise_cipher = 0;
 
-               wpa_ie = elems.rsn_ie;
-               wpa_ie_len = elems.rsn_ie_len;
-
-               if (rtw_parse_wpa2_ie23a(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) {
-                       pstat->dot8021xalg = 1;/* psk,  todo:802.1x */
-                       pstat->wpa_psk |= BIT(1);
-
-                       pstat->wpa2_group_cipher = group_cipher&psecuritypriv->wpa2_group_cipher;
-                       pstat->wpa2_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa2_pairwise_cipher;
-
-                       if (!pstat->wpa2_group_cipher)
-                               status = WLAN_REASON_INVALID_GROUP_CIPHER;
-
-                       if (!pstat->wpa2_pairwise_cipher)
-                               status = WLAN_REASON_INVALID_PAIRWISE_CIPHER;
+               wpa_ie_len = wpa_ie[1];
+               if (psecuritypriv->wpa_psk & BIT(1)) {
+                       r = rtw_parse_wpa2_ie23a(wpa_ie, wpa_ie_len + 2,
+                                                &group_cipher,
+                                                &pairwise_cipher, NULL);
+                       if (r == _SUCCESS) {
+                               pstat->dot8021xalg = 1;/* psk,  todo:802.1x */
+                               pstat->wpa_psk |= BIT(1);
+
+                               pstat->wpa2_group_cipher = group_cipher &
+                                       psecuritypriv->wpa2_group_cipher;
+                               pstat->wpa2_pairwise_cipher = pairwise_cipher &
+                                       psecuritypriv->wpa2_pairwise_cipher;
+                       } else
+                               status = WLAN_STATUS_INVALID_IE;
+               } else if (psecuritypriv->wpa_psk & BIT(0)) {
+                       r = rtw_parse_wpa_ie23a(wpa_ie, wpa_ie_len + 2,
+                                               &group_cipher, &pairwise_cipher,
+                                               NULL);
+                       if (r == _SUCCESS) {
+                               pstat->dot8021xalg = 1;/* psk,  todo:802.1x */
+                               pstat->wpa_psk |= BIT(0);
+
+                               pstat->wpa_group_cipher = group_cipher &
+                                       psecuritypriv->wpa_group_cipher;
+                               pstat->wpa_pairwise_cipher = pairwise_cipher &
+                                       psecuritypriv->wpa_pairwise_cipher;
+                       } else
+                               status = WLAN_STATUS_INVALID_IE;
                } else {
-                       status = WLAN_STATUS_INVALID_IE;
+                       wpa_ie = NULL;
+                       wpa_ie_len = 0;
                }
-
-       } else if ((psecuritypriv->wpa_psk & BIT(0)) && elems.wpa_ie) {
-
-               int group_cipher = 0, pairwise_cipher = 0;
-
-               wpa_ie = elems.wpa_ie;
-               wpa_ie_len = elems.wpa_ie_len;
-
-               if (rtw_parse_wpa_ie23a(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) {
-                       pstat->dot8021xalg = 1;/* psk,  todo:802.1x */
-                       pstat->wpa_psk |= BIT(0);
-
-                       pstat->wpa_group_cipher = group_cipher&psecuritypriv->wpa_group_cipher;
-                       pstat->wpa_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa_pairwise_cipher;
-
+               if (wpa_ie && status == WLAN_STATUS_SUCCESS) {
                        if (!pstat->wpa_group_cipher)
                                status = WLAN_STATUS_INVALID_GROUP_CIPHER;
 
                        if (!pstat->wpa_pairwise_cipher)
                                status = WLAN_STATUS_INVALID_PAIRWISE_CIPHER;
-
-               } else {
-                       status = WLAN_STATUS_INVALID_IE;
                }
-
-       } else {
-               wpa_ie = NULL;
-               wpa_ie_len = 0;
        }
 
-       if (WLAN_STATUS_SUCCESS != status)
+       if (status != WLAN_STATUS_SUCCESS)
                goto OnAssocReq23aFail;
 
        pstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS);
-       if (wpa_ie == NULL) {
-               if (elems.wps_ie) {
-                       DBG_8723A("STA included WPS IE in "
-                                  "(Re)Association Request - assume WPS is "
-                                  "used\n");
+
+       wps_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
+                                        WLAN_OUI_TYPE_MICROSOFT_WPS,
+                                        pos, left);
+
+       if (!wpa_ie) {
+               if (wps_ie) {
+                       DBG_8723A("STA included WPS IE in (Re)Association "
+                                 "Request - assume WPS is used\n");
                        pstat->flags |= WLAN_STA_WPS;
                } else {
-                       DBG_8723A("STA did not include WPA/RSN IE "
-                                  "in (Re)Association Request - possible WPS "
-                                  "use\n");
+                       DBG_8723A("STA did not include WPA/RSN IE in (Re)"
+                                  "Association Request - possible WPS use\n");
                        pstat->flags |= WLAN_STA_MAYBE_WPS;
                }
 
-               /*  AP support WPA/RSN, and sta is going to do WPS, but AP is not ready */
+               /*  AP support WPA/RSN, and sta is going to do WPS, but AP
+                   is not ready */
                /*  that the selected registrar of AP is _FLASE */
-               if ((psecuritypriv->wpa_psk > 0) &&
-                   (pstat->flags & (WLAN_STA_WPS|WLAN_STA_MAYBE_WPS))) {
+               if (psecuritypriv->wpa_psk > 0 &&
+                   pstat->flags & (WLAN_STA_WPS|WLAN_STA_MAYBE_WPS)) {
                        if (pmlmepriv->wps_beacon_ie) {
                                u8 selected_registrar = 0;
 
-                               rtw_get_wps_attr_content23a(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len,
-                                                        WPS_ATTR_SELECTED_REGISTRAR, &selected_registrar, NULL);
+                               rtw_get_wps_attr_content23a(
+                                       pmlmepriv->wps_beacon_ie,
+                                       pmlmepriv->wps_beacon_ie_len,
+                                       WPS_ATTR_SELECTED_REGISTRAR,
+                                       &selected_registrar, NULL);
 
                                if (!selected_registrar) {
-                                       DBG_8723A("selected_registrar is false , or AP is not ready to do WPS\n");
+                                       DBG_8723A("selected_registrar is false,"
+                                                 "or AP is not ready to do "
+                                                 "WPS\n");
 
                                        status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;
-
                                        goto OnAssocReq23aFail;
                                }
                        }
@@ -1508,26 +1509,26 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
 
                if (psecuritypriv->wpa_psk == 0) {
                        DBG_8723A("STA " MAC_FMT ": WPA/RSN IE in association "
-                       "request, but AP don't support WPA/RSN\n", MAC_ARG(pstat->hwaddr));
+                       "request, but AP don't support WPA/RSN\n",
+                                 MAC_ARG(pstat->hwaddr));
 
                        status = WLAN_STATUS_INVALID_IE;
 
                        goto OnAssocReq23aFail;
                }
 
-               if (elems.wps_ie) {
-                       DBG_8723A("STA included WPS IE in "
-                                  "(Re)Association Request - WPS is "
-                                  "used\n");
+               if (wps_ie) {
+                       DBG_8723A("STA included WPS IE in (Re)Association "
+                                 "Request - WPS is used\n");
                        pstat->flags |= WLAN_STA_WPS;
                        copy_len = 0;
                } else {
-                       copy_len = ((wpa_ie_len+2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)):(wpa_ie_len+2);
+                       copy_len = ((wpa_ie_len + 2) > sizeof(pstat->wpa_ie)) ?
+                               sizeof(pstat->wpa_ie) : (wpa_ie_len + 2);
                }
 
-               if (copy_len>0)
-                       memcpy(pstat->wpa_ie, wpa_ie-2, copy_len);
-
+               if (copy_len > 0)
+                       memcpy(pstat->wpa_ie, wpa_ie - 2, copy_len);
        }
 
        /*  check if there is WMM IE & support WWM-PS */
@@ -1539,45 +1540,45 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
        pstat->uapsd_vi = 0;
        pstat->uapsd_be = 0;
        pstat->uapsd_bk = 0;
-       if (pmlmepriv->qospriv.qos_option)
-       {
-               p = pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset; ie_len = 0;
-               for (;;)
-               {
-                       p = rtw_get_ie23a(p, _VENDOR_SPECIFIC_IE_, &ie_len, pkt_len - sizeof(struct ieee80211_hdr_3addr) - ie_offset);
-                       if (p != NULL) {
-                               if (!memcmp(p+2, WMM_IE, 6)) {
-
+       if (pmlmepriv->qospriv.qos_option) {
+               const u8 *end = pos + left;
+               p = pos;
+
+               for (;;) {
+                       left = end - p;
+                       p = cfg80211_find_ie(WLAN_EID_VENDOR_SPECIFIC, p, left);
+                       if (p) {
+                               if (!memcmp(p + 2, WMM_IE, 6)) {
                                        pstat->flags |= WLAN_STA_WME;
 
                                        pstat->qos_option = 1;
-                                       pstat->qos_info = *(p+8);
+                                       pstat->qos_info = *(p + 8);
 
-                                       pstat->max_sp_len = (pstat->qos_info>>5)&0x3;
+                                       pstat->max_sp_len =
+                                               (pstat->qos_info >> 5) & 0x3;
 
-                                       if ((pstat->qos_info&0xf) != 0xf)
+                                       if ((pstat->qos_info & 0xf) != 0xf)
                                                pstat->has_legacy_ac = true;
                                        else
                                                pstat->has_legacy_ac = false;
 
-                                       if (pstat->qos_info&0xf)
-                                       {
-                                               if (pstat->qos_info&BIT(0))
+                                       if (pstat->qos_info & 0xf) {
+                                               if (pstat->qos_info & BIT(0))
                                                        pstat->uapsd_vo = BIT(0)|BIT(1);
                                                else
                                                        pstat->uapsd_vo = 0;
 
-                                               if (pstat->qos_info&BIT(1))
+                                               if (pstat->qos_info & BIT(1))
                                                        pstat->uapsd_vi = BIT(0)|BIT(1);
                                                else
                                                        pstat->uapsd_vi = 0;
 
-                                               if (pstat->qos_info&BIT(2))
+                                               if (pstat->qos_info & BIT(2))
                                                        pstat->uapsd_bk = BIT(0)|BIT(1);
                                                else
                                                        pstat->uapsd_bk = 0;
 
-                                               if (pstat->qos_info&BIT(3))
+                                               if (pstat->qos_info & BIT(3))
                                                        pstat->uapsd_be = BIT(0)|BIT(1);
                                                else
                                                        pstat->uapsd_be = 0;
@@ -1586,45 +1587,42 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
 
                                        break;
                                }
-                       }
-                       else {
+                       } else {
                                break;
                        }
-                       p = p + ie_len + 2;
+                       p = p + p[1] + 2;
                }
        }
 
        /* save HT capabilities in the sta object */
        memset(&pstat->htpriv.ht_cap, 0, sizeof(struct ieee80211_ht_cap));
-       if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct ieee80211_ht_cap))
-       {
+       p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, pos, left);
+
+       if (p && p[1] >= sizeof(struct ieee80211_ht_cap)) {
                pstat->flags |= WLAN_STA_HT;
 
                pstat->flags |= WLAN_STA_WME;
 
-               memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct ieee80211_ht_cap));
-
+               memcpy(&pstat->htpriv.ht_cap, p + 2,
+                      sizeof(struct ieee80211_ht_cap));
        } else
                pstat->flags &= ~WLAN_STA_HT;
 
-       if ((pmlmepriv->htpriv.ht_option == false) && (pstat->flags&WLAN_STA_HT))
-       {
+       if (pmlmepriv->htpriv.ht_option == false && pstat->flags & WLAN_STA_HT){
                status = WLAN_STATUS_UNSPECIFIED_FAILURE;
                goto OnAssocReq23aFail;
        }
 
-       if ((pstat->flags & WLAN_STA_HT) &&
-                   ((pstat->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) ||
-                     (pstat->wpa_pairwise_cipher&WPA_CIPHER_TKIP)))
-       {
-               DBG_8723A("HT: " MAC_FMT " tried to "
-                                  "use TKIP with HT association\n", MAC_ARG(pstat->hwaddr));
+       if (pstat->flags & WLAN_STA_HT &&
+           (pstat->wpa2_pairwise_cipher & WPA_CIPHER_TKIP ||
+            pstat->wpa_pairwise_cipher & WPA_CIPHER_TKIP)) {
+               DBG_8723A("HT: " MAC_FMT " tried to use TKIP with HT "
+                         "association\n", MAC_ARG(pstat->hwaddr));
 
                /* status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY; */
                /* goto OnAssocReq23aFail; */
        }
 
-       /*  */
        pstat->flags |= WLAN_STA_NONERP;
        for (i = 0; i < pstat->bssratelen; i++) {
                if ((pstat->bssrateset[i] & 0x7f) > 22) {
@@ -1641,39 +1639,6 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
        if (status != WLAN_STATUS_SUCCESS)
                goto OnAssocReq23aFail;
 
-#ifdef CONFIG_8723AU_P2P
-       pstat->is_p2p_device = false;
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               if ((p2pie = rtw_get_p2p_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset, pkt_len - sizeof(struct ieee80211_hdr_3addr) - ie_offset, NULL, &p2pielen)))
-               {
-                       pstat->is_p2p_device = true;
-                       if ((p2p_status_code = (u8)process_assoc_req_p2p_ie23a(pwdinfo, pframe, pkt_len, pstat))>0)
-                       {
-                               pstat->p2p_status_code = p2p_status_code;
-                               status = WLAN_STATUS_CAPS_UNSUPPORTED;
-                               goto OnAssocReq23aFail;
-                       }
-               }
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_get_wfd_ie(pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset, pkt_len - sizeof(struct ieee80211_hdr_3addr) - ie_offset, wfd_ie, &wfd_ielen))
-               {
-                       u8      attr_content[ 10 ] = { 0x00 };
-                       u32     attr_contentlen = 0;
-
-                       DBG_8723A("[%s] WFD IE Found!!\n", __func__);
-                       rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
-                       if (attr_contentlen)
-                       {
-                               pwdinfo->wfd_info->peer_rtsp_ctrlport = get_unaligned_be16(attr_content + 2);
-                               DBG_8723A("[%s] Peer PORT NUM = %d\n", __func__, pwdinfo->wfd_info->peer_rtsp_ctrlport);
-                       }
-               }
-#endif
-       }
-       pstat->p2p_status_code = p2p_status_code;
-#endif /* CONFIG_8723AU_P2P */
-
        /* TODO: identify_proprietary_vendor_ie(); */
        /*  Realtek proprietary IE */
        /*  identify if this is Broadcom sta */
@@ -1699,14 +1664,13 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
                        status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;
 
                        goto OnAssocReq23aFail;
-
                } else {
                        pstapriv->sta_aid[pstat->aid - 1] = pstat;
                        DBG_8723A("allocate new AID = (%d)\n", pstat->aid);
                }
        }
 
-       pstat->state &= (~WIFI_FW_ASSOC_STATE);
+       pstat->state &= ~WIFI_FW_ASSOC_STATE;
        pstat->state |= WIFI_FW_ASSOC_SUCCESS;
 
        spin_lock_bh(&pstapriv->auth_list_lock);
@@ -1725,18 +1689,20 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
        spin_unlock_bh(&pstapriv->asoc_list_lock);
 
        /*  now the station is qualified to join our BSS... */
-       if (pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) &&
-           (WLAN_STATUS_SUCCESS == status)) {
+       if (pstat && pstat->state & WIFI_FW_ASSOC_SUCCESS &&
+           status == WLAN_STATUS_SUCCESS) {
 #ifdef CONFIG_8723AU_AP_MODE
                /* 1 bss_cap_update & sta_info_update23a */
                bss_cap_update_on_sta_join23a(padapter, pstat);
                sta_info_update23a(padapter, pstat);
 
                /* issue assoc rsp before notify station join event. */
-               if (ieee80211_is_assoc_req(frame_control))
-                       issue_asocrsp23a(padapter, status, pstat, WIFI_ASSOCRSP);
+               if (ieee80211_is_assoc_req(mgmt->frame_control))
+                       issue_asocrsp23a(padapter, status, pstat,
+                                        WIFI_ASSOCRSP);
                else
-                       issue_asocrsp23a(padapter, status, pstat, WIFI_REASSOCRSP);
+                       issue_asocrsp23a(padapter, status, pstat,
+                                        WIFI_REASSOCRSP);
 
                /* 2 - report to upper layer */
                DBG_8723A("indicate_sta_join_event to upper layer - hostapd\n");
@@ -1752,16 +1718,15 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
 asoc_class2_error:
 
 #ifdef CONFIG_8723AU_AP_MODE
-       issue_deauth23a(padapter, hdr->addr2, status);
+       issue_deauth23a(padapter, mgmt->sa, status);
 #endif
-
        return _FAIL;
 
 OnAssocReq23aFail:
 
 #ifdef CONFIG_8723AU_AP_MODE
        pstat->aid = 0;
-       if (ieee80211_is_assoc_req(frame_control))
+       if (ieee80211_is_assoc_req(mgmt->frame_control))
                issue_asocrsp23a(padapter, status, pstat, WIFI_ASSOCRSP);
        else
                issue_asocrsp23a(padapter, status, pstat, WIFI_REASSOCRSP);
@@ -1772,25 +1737,24 @@ OnAssocReq23aFail:
        return _FAIL;
 }
 
-unsigned int OnAssocRsp23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+static int
+OnAssocRsp23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
-       uint i;
-       int res;
-       unsigned short  status;
        struct ndis_802_11_var_ies *pIE;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
+       struct ieee80211_mgmt *pmgmt = (struct ieee80211_mgmt *) skb->data;
+       int res, i;
+       unsigned short status;
        u8 *pframe = skb->data;
-       uint pkt_len = skb->len;
+       int pkt_len = skb->len;
 
        DBG_8723A("%s\n", __func__);
 
        /* check A1 matches or not */
-       if (!ether_addr_equal(myid(&padapter->eeprompriv),
-                             ieee80211_get_DA(hdr)))
+       if (!ether_addr_equal(myid(&padapter->eeprompriv), pmgmt->da))
                return _SUCCESS;
 
        if (!(pmlmeinfo->state & (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE)))
@@ -1802,8 +1766,8 @@ unsigned int OnAssocRsp23a(struct rtw_adapter *padapter, struct recv_frame *prec
        del_timer_sync(&pmlmeext->link_timer);
 
        /* status */
-       if ((status = le16_to_cpu(*(unsigned short *)(pframe + sizeof(struct ieee80211_hdr_3addr) + 2))) > 0)
-       {
+       status = le16_to_cpu(pmgmt->u.assoc_resp.status_code);
+       if (status > 0) {
                DBG_8723A("assoc reject, status code: %d\n", status);
                pmlmeinfo->state = WIFI_FW_NULL_STATE;
                res = -4;
@@ -1811,42 +1775,37 @@ unsigned int OnAssocRsp23a(struct rtw_adapter *padapter, struct recv_frame *prec
        }
 
        /* get capabilities */
-       pmlmeinfo->capability = le16_to_cpu(*(unsigned short *)(pframe + sizeof(struct ieee80211_hdr_3addr)));
+       pmlmeinfo->capability = le16_to_cpu(pmgmt->u.assoc_resp.capab_info);
 
        /* set slot time */
        pmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10))? 9: 20;
 
        /* AID */
-       res = pmlmeinfo->aid = (int)(le16_to_cpu(*(unsigned short *)(pframe + sizeof(struct ieee80211_hdr_3addr) + 4))&0x3fff);
+       res = pmlmeinfo->aid = le16_to_cpu(pmgmt->u.assoc_resp.aid) & 0x3fff;
 
        /* following are moved to join event callback function */
        /* to handle HT, WMM, rate adaptive, update MAC reg */
        /* for not to handle the synchronous IO in the tasklet */
-       for (i = (6 + sizeof(struct ieee80211_hdr_3addr)); i < pkt_len;) {
+       for (i = offsetof(struct ieee80211_mgmt, u.assoc_resp.variable);
+            i < pkt_len;) {
                pIE = (struct ndis_802_11_var_ies *)(pframe + i);
 
                switch (pIE->ElementID)
                {
-               case _VENDOR_SPECIFIC_IE_:
+               case WLAN_EID_VENDOR_SPECIFIC:
                        if (!memcmp(pIE->data, WMM_PARA_OUI23A, 6))/* WMM */
-                                       WMM_param_handler23a(padapter, pIE);
-#if defined(CONFIG_8723AU_P2P)
-                       else if (!memcmp(pIE->data, WFD_OUI23A, 4)) { /* WFD */
-                               DBG_8723A("[%s] Found WFD IE\n", __func__);
-                               WFD_info_handler(padapter, pIE);
-                       }
-#endif
+                               WMM_param_handler23a(padapter, pIE);
                        break;
 
-               case _HT_CAPABILITY_IE_:        /* HT caps */
+               case WLAN_EID_HT_CAPABILITY:    /* HT caps */
                        HT_caps_handler23a(padapter, pIE);
                        break;
 
-               case _HT_EXTRA_INFO_IE_:        /* HT info */
+               case WLAN_EID_HT_OPERATION:     /* HT info */
                        HT_info_handler23a(padapter, pIE);
                        break;
 
-               case _ERPINFO_IE_:
+               case WLAN_EID_ERP_INFO:
                        ERP_IE_handler23a(padapter, pIE);
 
                default:
@@ -1856,7 +1815,7 @@ unsigned int OnAssocRsp23a(struct rtw_adapter *padapter, struct recv_frame *prec
                i += (pIE->Length + 2);
        }
 
-       pmlmeinfo->state &= (~WIFI_FW_ASSOC_STATE);
+       pmlmeinfo->state &= ~WIFI_FW_ASSOC_STATE;
        pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
 
        /* Update Basic Rate Table for spec, 2010-12-28 , by thomas */
@@ -1879,32 +1838,21 @@ report_assoc_result:
        return _SUCCESS;
 }
 
-unsigned int OnDeAuth23a(struct rtw_adapter *padapter,
-                        struct recv_frame *precv_frame)
+static int
+OnDeAuth23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
-       unsigned short  reason;
+       unsigned short reason;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
 
-       /* check A3 */
-       if (!ether_addr_equal(hdr->addr3, get_my_bssid23a(&pmlmeinfo->network)))
+       if (!ether_addr_equal(mgmt->bssid,
+                             get_my_bssid23a(&pmlmeinfo->network)))
                return _SUCCESS;
 
-#ifdef CONFIG_8723AU_P2P
-       if (pwdinfo->rx_invitereq_info.scan_op_ch_only) {
-               mod_timer(&pwdinfo->reset_ch_sitesurvey,
-                         jiffies + msecs_to_jiffies(10));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       reason = le16_to_cpu(*(unsigned short *)(pframe + sizeof(struct ieee80211_hdr_3addr)));
+       reason = le16_to_cpu(mgmt->u.deauth.reason_code);
 
        DBG_8723A("%s Reason code(%d)\n", __func__, reason);
 
@@ -1914,9 +1862,9 @@ unsigned int OnDeAuth23a(struct rtw_adapter *padapter,
                struct sta_priv *pstapriv = &padapter->stapriv;
 
                DBG_8723A_LEVEL(_drv_always_, "ap recv deauth reason code(%d) "
-                               "sta:%pM\n", reason, hdr->addr2);
+                               "sta:%pM\n", reason, mgmt->sa);
 
-               psta = rtw_get_stainfo23a(pstapriv, hdr->addr2);
+               psta = rtw_get_stainfo23a(pstapriv, mgmt->sa);
                if (psta) {
                        u8 updated = 0;
 
@@ -1933,46 +1881,34 @@ unsigned int OnDeAuth23a(struct rtw_adapter *padapter,
                }
 
                return _SUCCESS;
-       }
-       else
+       } else
 #endif
        {
                DBG_8723A_LEVEL(_drv_always_, "sta recv deauth reason code(%d) "
-                               "sta:%pM\n", reason, hdr->addr3);
+                               "sta:%pM\n", reason, mgmt->bssid);
 
-               receive_disconnect23a(padapter, hdr->addr3, reason);
+               receive_disconnect23a(padapter, mgmt->bssid, reason);
        }
        pmlmepriv->LinkDetectInfo.bBusyTraffic = false;
+
        return _SUCCESS;
 }
 
-unsigned int OnDisassoc23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+static int
+OnDisassoc23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        unsigned short  reason;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
 
-       /* check A3 */
-       if (!ether_addr_equal(hdr->addr3, get_my_bssid23a(&pmlmeinfo->network)))
+       if (!ether_addr_equal(mgmt->bssid,
+                             get_my_bssid23a(&pmlmeinfo->network)))
                return _SUCCESS;
 
-#ifdef CONFIG_8723AU_P2P
-       if (pwdinfo->rx_invitereq_info.scan_op_ch_only)
-       {
-               mod_timer(&pwdinfo->reset_ch_sitesurvey,
-                         jiffies + msecs_to_jiffies(10));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       reason = le16_to_cpu(*(unsigned short *)
-                            (pframe + sizeof(struct ieee80211_hdr_3addr)));
+       reason = le16_to_cpu(mgmt->u.disassoc.reason_code);
 
         DBG_8723A("%s Reason code(%d)\n", __func__, reason);
 
@@ -1982,9 +1918,9 @@ unsigned int OnDisassoc23a(struct rtw_adapter *padapter, struct recv_frame *prec
                struct sta_priv *pstapriv = &padapter->stapriv;
 
                DBG_8723A_LEVEL(_drv_always_, "ap recv disassoc reason code(%d)"
-                               " sta:%pM\n", reason, hdr->addr2);
+                               " sta:%pM\n", reason, mgmt->sa);
 
-               psta = rtw_get_stainfo23a(pstapriv, hdr->addr2);
+               psta = rtw_get_stainfo23a(pstapriv, mgmt->sa);
                if (psta) {
                        u8 updated = 0;
 
@@ -1993,7 +1929,7 @@ unsigned int OnDisassoc23a(struct rtw_adapter *padapter, struct recv_frame *prec
                                list_del_init(&psta->asoc_list);
                                pstapriv->asoc_list_cnt--;
                                updated = ap_free_sta23a(padapter, psta,
-                                                     false, reason);
+                                                        false, reason);
                        }
                        spin_unlock_bh(&pstapriv->asoc_list_lock);
 
@@ -2001,57 +1937,59 @@ unsigned int OnDisassoc23a(struct rtw_adapter *padapter, struct recv_frame *prec
                }
 
                return _SUCCESS;
-       }
-       else
+       } else
 #endif
        {
                DBG_8723A_LEVEL(_drv_always_, "ap recv disassoc reason "
-                               "code(%d) sta:%pM\n", reason, hdr->addr3);
+                               "code(%d) sta:%pM\n", reason, mgmt->bssid);
 
-               receive_disconnect23a(padapter, hdr->addr3, reason);
+               receive_disconnect23a(padapter, mgmt->bssid, reason);
        }
        pmlmepriv->LinkDetectInfo.bBusyTraffic = false;
        return _SUCCESS;
 }
 
-unsigned int OnAtim23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+static int
+OnAtim23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        DBG_8723A("%s\n", __func__);
        return _SUCCESS;
 }
 
-unsigned int on_action_spct23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+static int
+on_action_spct23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        return _FAIL;
 }
 
-unsigned int OnAction23a_qos(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+static int
+OnAction23a_qos(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        return _SUCCESS;
 }
 
-unsigned int OnAction23a_dls(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+static int
+OnAction23a_dls(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        return _SUCCESS;
 }
 
-unsigned int OnAction23a_back23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+static int OnAction23a_back23a(struct rtw_adapter *padapter,
+                              struct recv_frame *precv_frame)
 {
        u8 *addr;
        struct sta_info *psta = NULL;
        struct recv_reorder_ctrl *preorder_ctrl;
-       unsigned char           *frame_body;
-       unsigned char           category, action;
-       unsigned short  tid, status, reason_code = 0;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       unsigned char category, action;
+       unsigned short tid, status, capab, params, reason_code = 0;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
        struct sta_priv *pstapriv = &padapter->stapriv;
 
        /* check RA matches or not */
-       if (!ether_addr_equal(myid(&padapter->eeprompriv), hdr->addr1))
+       if (!ether_addr_equal(myid(&padapter->eeprompriv), mgmt->da))
                return _SUCCESS;
 
        DBG_8723A("%s\n", __func__);
@@ -2060,24 +1998,24 @@ unsigned int OnAction23a_back23a(struct rtw_adapter *padapter, struct recv_frame
                if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))
                        return _SUCCESS;
 
-       addr = hdr->addr2;
+       addr = mgmt->sa;
        psta = rtw_get_stainfo23a(pstapriv, addr);
 
        if (!psta)
                return _SUCCESS;
 
-       frame_body = (unsigned char *)
-               (pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       category = frame_body[0];
+       category = mgmt->u.action.category;
        if (category == WLAN_CATEGORY_BACK) { /*  representing Block Ack */
                if (!pmlmeinfo->HT_enable)
                        return _SUCCESS;
-               action = frame_body[1];
+               /* action_code is located in the same place for all
+                  action events, so pick any */
+               action = mgmt->u.action.u.wme_action.action_code;
                DBG_8723A("%s, action =%d\n", __func__, action);
                switch (action) {
                case WLAN_ACTION_ADDBA_REQ: /* ADDBA request */
-                       memcpy(&pmlmeinfo->ADDBA_req, &frame_body[2],
+                       memcpy(&pmlmeinfo->ADDBA_req,
+                              &mgmt->u.action.u.addba_req.dialog_token,
                               sizeof(struct ADDBA_request));
                        process_addba_req23a(padapter,
                                             (u8 *)&pmlmeinfo->ADDBA_req, addr);
@@ -2091,8 +2029,11 @@ unsigned int OnAction23a_back23a(struct rtw_adapter *padapter, struct recv_frame
                        }
                        break;
                case WLAN_ACTION_ADDBA_RESP: /* ADDBA response */
-                       status = get_unaligned_le16(&frame_body[3]);
-                       tid = ((frame_body[5] >> 2) & 0x7);
+                       status = get_unaligned_le16(
+                               &mgmt->u.action.u.addba_resp.status);
+                       capab = get_unaligned_le16(
+                               &mgmt->u.action.u.addba_resp.capab);
+                       tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
                        if (status == 0) {      /* successful */
                                DBG_8723A("agg_enable for TID =%d\n", tid);
                                psta->htpriv.agg_enable_bitmap |= 1 << tid;
@@ -2103,22 +2044,21 @@ unsigned int OnAction23a_back23a(struct rtw_adapter *padapter, struct recv_frame
                        break;
 
                case WLAN_ACTION_DELBA: /* DELBA */
-                       if ((frame_body[3] & BIT(3)) == 0) {
-                               psta->htpriv.agg_enable_bitmap &=
-                                       ~(1 << ((frame_body[3] >> 4) & 0xf));
-                               psta->htpriv.candidate_tid_bitmap &=
-                                       ~(1 << ((frame_body[3] >> 4) & 0xf));
-
-                               /* reason_code = frame_body[4] | (frame_body[5] << 8); */
-                               reason_code = get_unaligned_le16(&frame_body[4]);
-                       } else if ((frame_body[3] & BIT(3)) == BIT(3)) {
-                               tid = (frame_body[3] >> 4) & 0x0F;
+                       params = get_unaligned_le16(
+                               &mgmt->u.action.u.delba.params);
+                       tid = params >> 12;
 
-                               preorder_ctrl =  &psta->recvreorder_ctrl[tid];
+                       if (params & IEEE80211_DELBA_PARAM_INITIATOR_MASK) {
+                               preorder_ctrl = &psta->recvreorder_ctrl[tid];
                                preorder_ctrl->enable = false;
                                preorder_ctrl->indicate_seq = 0xffff;
+                       } else {
+                               psta->htpriv.agg_enable_bitmap &= ~(1 << tid);
+                               psta->htpriv.candidate_tid_bitmap &=
+                                       ~(1 << tid);
                        }
-
+                       reason_code = get_unaligned_le16(
+                               &mgmt->u.action.u.delba.reason_code);
                        DBG_8723A("%s(): DELBA: %x(%x)\n", __func__,
                                  pmlmeinfo->agg_enable_bitmap, reason_code);
                        /* todo: how to notify the host while receiving
@@ -2131,2930 +2071,166 @@ unsigned int OnAction23a_back23a(struct rtw_adapter *padapter, struct recv_frame
        return _SUCCESS;
 }
 
-#ifdef CONFIG_8723AU_P2P
-
-static int get_reg_classes_full_count(struct p2p_channels channel_list) {
-       int cnt = 0;
-       int i;
-
-       for (i = 0; i < channel_list.reg_classes; i++)
-               cnt += channel_list.reg_class[i].channels;
-
-       return cnt;
-}
-
-void issue_p2p_GO_request23a(struct rtw_adapter *padapter, u8* raddr)
+static s32 rtw_action_public_decache(struct recv_frame *recv_frame, s32 token)
 {
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8                      action = P2P_PUB_ACTION_ACTION;
-       u32                     p2poui = cpu_to_be32(P2POUI);
-       u8                      oui_subtype = P2P_GO_NEGO_REQ;
-       u8                      wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
-       u8                      wpsielen = 0, p2pielen = 0;
-       u16                     len_channellist_attr = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32                                     wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                                   *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                          *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, myid(&padapter->eeprompriv));
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pwdinfo->negotiation_dialog_token = 1;  /*Initialize the dialog value*/
-       pframe = rtw_set_fixed_ie23a(pframe, 1,
-                                    &pwdinfo->negotiation_dialog_token,
-                                    &pattrib->pktlen);
-
-       /*      WPS Section */
-       wpsielen = 0;
-       /*      WPS OUI */
-       *(u32*) (wpsie) = cpu_to_be32(WPSOUI);
-       wpsielen += 4;
-
-       /*      WPS version */
-       /*      Type: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-       wpsielen += 2;
-
-       /*      Value: */
-       wpsie[wpsielen++] = WPS_VERSION_1;      /*      Version 1.0 */
-
-       /*      Device Password ID */
-       /*      Type: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-       wpsielen += 2;
-
-       /*      Value: */
-
-       if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN)
-       {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC);
-       }
-       else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN)
-       {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC);
-       }
-       else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC)
-       {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC);
-       }
-
-       wpsielen += 2;
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen);
-
-       /*      P2P IE Section. */
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20110306 */
-       /*      According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. Group Owner Intent */
-       /*      3. Configuration Timeout */
-       /*      4. Listen Channel */
-       /*      5. Extended Listen Timing */
-       /*      6. Intended P2P Interface Address */
-       /*      7. Channel List */
-       /*      8. P2P Device Info */
-       /*      9. Operating Channel */
-
-       /*      P2P Capability */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (pwdinfo->persistent_supported)
-       {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
-       }
-       else
-       {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
-       }
-
-       /*      Group Owner Intent */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_GO_INTENT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Todo the tie breaker bit. */
-       p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0));
-
-       /*      Configuration Timeout */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       p2pie[p2pielen++] = 200;        /*      2 seconds needed to be the P2P GO */
-       p2pie[p2pielen++] = 200;        /*      2 seconds needed to be the P2P Client */
-
-       /*      Listen Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Operating Class */
-       p2pie[p2pielen++] = 0x51;       /*      Copy from SD7 */
-
-       /*      Channel Number */
-       p2pie[p2pielen++] = pwdinfo->listen_channel;    /*      listening channel number */
-
-       /*      Extended Listen Timing ATTR */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Availability Period */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-       p2pielen += 2;
-
-       /*      Availability Interval */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-       p2pielen += 2;
-
-       /*      Intended P2P Interface Address */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Channel List */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-       /*  Length: */
-       /*  Country String(3) */
-       /*  + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */
-       /*  + number of channels in all classes */
-       len_channellist_attr = 3
-          + (1 + 1) * (u16)(pmlmeext->channel_list.reg_classes)
-          + get_reg_classes_full_count(pmlmeext->channel_list);
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Channel Entry List */
-
-       {
-               int i, j;
-               for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
+       struct rtw_adapter *adapter = recv_frame->adapter;
+       struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
+       struct sk_buff *skb = recv_frame->pkt;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
+       u16 seq_ctrl;
 
-                       /*      Number of Channels */
-                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
+       seq_ctrl = ((recv_frame->attrib.seq_num&0xffff) << 4) |
+               (recv_frame->attrib.frag_num & 0xf);
 
-                       /*      Channel List */
-                       for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
-                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
+       if (ieee80211_has_retry(hdr->frame_control)) {
+               if (token >= 0) {
+                       if ((seq_ctrl == mlmeext->action_public_rxseq) &&
+                           (token == mlmeext->action_public_dialog_token)) {
+                               DBG_8723A(FUNC_ADPT_FMT" seq_ctrl = 0x%x, "
+                                         "rxseq = 0x%x, token:%d\n",
+                                         FUNC_ADPT_ARG(adapter), seq_ctrl,
+                                         mlmeext->action_public_rxseq, token);
+                               return _FAIL;
+                       }
+               } else {
+                       if (seq_ctrl == mlmeext->action_public_rxseq) {
+                               DBG_8723A(FUNC_ADPT_FMT" seq_ctrl = 0x%x, "
+                                         "rxseq = 0x%x\n",
+                                         FUNC_ADPT_ARG(adapter), seq_ctrl,
+                                         mlmeext->action_public_rxseq);
+                               return _FAIL;
                        }
                }
        }
 
-       /*      Device Info */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm);
-
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-       p2pielen += 2;
-
-       /*      OUI */
-       *(u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-       p2pielen += 2;
+       mlmeext->action_public_rxseq = seq_ctrl;
 
-       /*      Number of Secondary Device Types */
-       p2pie[p2pielen++] = 0x00;       /*      No Secondary Device Type List */
+       if (token >= 0)
+               mlmeext->action_public_dialog_token = token;
 
-       /*      Device Name */
-       /*      Type: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-       p2pielen += 2;
+       return _SUCCESS;
+}
 
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
-       p2pielen += 2;
+static unsigned int on_action_public23a_p2p(struct recv_frame *precv_frame)
+{
+       struct sk_buff *skb = precv_frame->pkt;
+       u8 *pframe = skb->data;
+       u8 *frame_body;
+       u8 dialogToken = 0;
 
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name,
-              pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
+       frame_body = (unsigned char *)
+               (pframe + sizeof(struct ieee80211_hdr_3addr));
 
-       /*      Operating Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
+       dialogToken = frame_body[7];
 
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
+       if (rtw_action_public_decache(precv_frame, dialogToken) == _FAIL)
+               return _FAIL;
 
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
+       return _SUCCESS;
+}
 
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
+static unsigned int on_action_public23a_vendor(struct recv_frame *precv_frame)
+{
+       unsigned int ret = _FAIL;
+       struct sk_buff *skb = precv_frame->pkt;
+       u8 *pframe = skb->data;
+       u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr);
 
-       /*      Operating Class */
-       if (pwdinfo->operating_channel <= 14)
-       {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x51;
-       }
-       else if ((pwdinfo->operating_channel >= 36) && (pwdinfo->operating_channel <= 48))
-       {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x73;
-       }
-       else
-       {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x7c;
+       if (!memcmp(frame_body + 2, P2P_OUI23A, 4)) {
+               ret = on_action_public23a_p2p(precv_frame);
        }
 
-       /*      Channel Number */
-       p2pie[p2pielen++] = pwdinfo->operating_channel; /*      operating channel number */
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_nego_req_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
+       return ret;
 }
 
-static void issue_p2p_GO_response(struct rtw_adapter *padapter, u8* raddr, u8* frame_body, uint len, u8 result)
+static unsigned int
+on_action_public23a_default(struct recv_frame *precv_frame, u8 action)
 {
+       unsigned int ret = _FAIL;
+       struct sk_buff *skb = precv_frame->pkt;
+       u8 *pframe = skb->data;
+       uint frame_len = skb->len;
+       u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr);
+       u8 token;
+       struct rtw_adapter *adapter = precv_frame->adapter;
+       int cnt = 0;
+       char msg[64];
 
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_GO_NEGO_RESP;
-       u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 };
-       u8 p2pielen = 0;
-       uint wpsielen = 0;
-       u16 wps_devicepassword_id = 0x0000;
-       uint wps_devicepassword_id_len = 0;
-       u16 len_channellist_attr = 0;
-       int i, j;
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
+       token = frame_body[2];
 
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
+       if (rtw_action_public_decache(precv_frame, token) == _FAIL)
+               goto exit;
 
-       DBG_8723A("[%s] In, result = %d\n", __func__,  result);
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
+       cnt += sprintf((msg+cnt), "%s(token:%u)",
+                      action_public_str23a(action), token);
+       rtw_cfg80211_rx_action(adapter, pframe, frame_len, msg);
 
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
+       ret = _SUCCESS;
 
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
+exit:
+       return ret;
+}
 
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
+static int on_action_public23a(struct rtw_adapter *padapter,
+                              struct recv_frame *precv_frame)
+{
+       unsigned int ret = _FAIL;
+       struct sk_buff *skb = precv_frame->pkt;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
+       u8 *pframe = skb->data;
+       u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr);
+       u8 category, action;
 
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, myid(&padapter->eeprompriv));
+       /* check RA matches or not */
+       if (!ether_addr_equal(myid(&padapter->eeprompriv), hdr->addr1))
+               goto exit;
 
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *) &p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       /*      The Dialog Token of provisioning discovery request frame. */
-       pwdinfo->negotiation_dialog_token = frame_body[7];
-       pframe = rtw_set_fixed_ie23a(pframe, 1,
-                                    &pwdinfo->negotiation_dialog_token,
-                                    &pattrib->pktlen);
-
-       /*      Commented by Albert 20110328 */
-       /*      Try to get the device password ID from the WPS IE of group
-               negotiation request frame */
-       /*      WiFi Direct test plan 5.1.15 */
-       rtw_get_wps_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                         len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen);
-       rtw_get_wps_attr_content23a(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID,
-                                   (u8 *)&wps_devicepassword_id,
-                                   &wps_devicepassword_id_len);
-       wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id);
-
-       memset(wpsie, 0x00, 255);
-       wpsielen = 0;
-
-       /*      WPS Section */
-       wpsielen = 0;
-       /*      WPS OUI */
-       *(u32*) (wpsie) = cpu_to_be32(WPSOUI);
-       wpsielen += 4;
-
-       /*      WPS version */
-       /*      Type: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-       wpsielen += 2;
-
-       /*      Value: */
-       wpsie[wpsielen++] = WPS_VERSION_1;      /*      Version 1.0 */
-
-       /*      Device Password ID */
-       /*      Type: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-       wpsielen += 2;
-
-       /*      Value: */
-       if (wps_devicepassword_id == WPS_DPID_USER_SPEC) {
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_DPID_REGISTRAR_SPEC);
-       } else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC);
-       } else {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC);
-       }
-       wpsielen += 2;
-
-       /*      Commented by Kurt 20120113 */
-       /*      If some device wants to do p2p handshake without sending prov_disc_req */
-       /*      We have to get peer_req_cm from here. */
-       if (!memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3)) {
-               if (wps_devicepassword_id == WPS_DPID_USER_SPEC) {
-                       memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3);
-               } else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) {
-                       memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3);
-               } else {
-                       memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3);
-               }
-       }
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen,
-                              (unsigned char *) wpsie, &pattrib->pktlen);
-
-       /*      P2P IE Section. */
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20100908 */
-       /*      According to the P2P Specification, the group negoitation
-               response frame should contain 9 P2P attributes */
-       /*      1. Status */
-       /*      2. P2P Capability */
-       /*      3. Group Owner Intent */
-       /*      4. Configuration Timeout */
-       /*      5. Operating Channel */
-       /*      6. Intended P2P Interface Address */
-       /*      7. Channel List */
-       /*      8. Device Info */
-       /*      9. Group ID     (Only GO) */
-
-       /*      ToDo: */
-
-       /*      P2P Status */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_STATUS;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       p2pie[p2pielen++] = result;
-
-       /*      P2P Capability */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
-               /*      Commented by Albert 2011/03/08 */
-               /*      According to the P2P specification */
-               /*      if the sending device will be client, the P2P
-                       Capability should be reserved of group negotation
-                       response frame */
-               p2pie[p2pielen++] = 0;
-       } else {
-               /*      Be group owner or meet the error case */
-               p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-       }
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (pwdinfo->persistent_supported) {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN |
-                       P2P_GRPCAP_PERSISTENT_GROUP;
-       } else {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
-       }
-
-       /*      Group Owner Intent */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_GO_INTENT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       if (pwdinfo->peer_intent & 0x01) {
-               /*      Peer's tie breaker bit is 1, our tie breaker
-                       bit should be 0 */
-               p2pie[p2pielen++] = (pwdinfo->intent << 1);
-       } else {
-               /* Peer's tie breaker bit is 0, our tie breaker bit
-                  should be 1 */
-               p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0));
-       }
-
-       /*      Configuration Timeout */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      2 seconds needed to be the P2P GO */
-       p2pie[p2pielen++] = 200;
-       /*      2 seconds needed to be the P2P Client */
-       p2pie[p2pielen++] = 200;
-
-       /*      Operating Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Operating Class */
-       if (pwdinfo->operating_channel <= 14) {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x51;
-       } else if ((pwdinfo->operating_channel >= 36) &&
-                  (pwdinfo->operating_channel <= 48)) {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x73;
-       } else {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x7c;
-       }
-
-       /*      Channel Number */
-       /*      operating channel number */
-       p2pie[p2pielen++] = pwdinfo->operating_channel;
-
-       /*      Intended P2P Interface Address */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Channel List */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-       /*  Country String(3) */
-       /*  + (Operating Class (1) + Number of Channels(1)) *
-           Operation Classes (?) */
-       /*  + number of channels in all classes */
-       len_channellist_attr = 3 +
-               (1 + 1) * (u16)pmlmeext->channel_list.reg_classes +
-               get_reg_classes_full_count(pmlmeext->channel_list);
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
-
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Channel Entry List */
-
-       for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
-               /*      Operating Class */
-               p2pie[p2pielen++] =
-                       pmlmeext->channel_list.reg_class[j].reg_class;
-
-               /*      Number of Channels */
-               p2pie[p2pielen++] =
-                       pmlmeext->channel_list.reg_class[j].channels;
-
-               /*      Channel List */
-               for (i = 0;
-                    i < pmlmeext->channel_list.reg_class[j].channels; i++) {
-                       p2pie[p2pielen++] =
-                               pmlmeext->channel_list.reg_class[j].channel[i];
-               }
-       }
-
-       /*      Device Info */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) +
-               Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field
-               (2bytes) + WPS Device Name Len field (2bytes) */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm);
-
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-       p2pielen += 2;
-
-       /*      OUI */
-       *(u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[p2pielen++] = 0x00;       /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-       p2pielen += 2;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name,
-              pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               /*      Group ID Attribute */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) =
-                       cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      p2P Device Address */
-               memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN);
-               p2pielen += ETH_ALEN;
-
-               /*      SSID */
-               memcpy(p2pie + p2pielen, pwdinfo->nego_ssid,
-                      pwdinfo->nego_ssidlen);
-               p2pielen += pwdinfo->nego_ssidlen;
-
-       }
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen,
-                              (unsigned char *) p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-static void issue_p2p_GO_confirm(struct rtw_adapter *padapter, u8* raddr,
-                                u8 result)
-{
-
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_GO_NEGO_CONF;
-       u8 p2pie[ 255 ] = { 0x00 };
-       u8 p2pielen = 0;
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, myid(&padapter->eeprompriv));
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1,
-                                    &pwdinfo->negotiation_dialog_token,
-                                 &pattrib->pktlen);
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20110306 */
-       /*      According to the P2P Specification, the group negoitation
-               request frame should contain 5 P2P attributes */
-       /*      1. Status */
-       /*      2. P2P Capability */
-       /*      3. Operating Channel */
-       /*      4. Channel List */
-       /*      5. Group ID     (if this WiFi is GO) */
-
-       /*      P2P Status */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_STATUS;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       p2pie[p2pielen++] = result;
-
-       /*      P2P Capability */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (pwdinfo->persistent_supported) {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN |
-                       P2P_GRPCAP_PERSISTENT_GROUP;
-       } else {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
-       }
-
-       /*      Operating Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
-               if (pwdinfo->peer_operating_ch <= 14) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x51;
-               } else if ((pwdinfo->peer_operating_ch >= 36) &&
-                        (pwdinfo->peer_operating_ch <= 48)) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x73;
-               } else {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x7c;
-               }
-
-               p2pie[p2pielen++] = pwdinfo->peer_operating_ch;
-       } else {
-               if (pwdinfo->operating_channel <= 14) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x51;
-               }
-               else if ((pwdinfo->operating_channel >= 36) &&
-                        (pwdinfo->operating_channel <= 48)) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x73;
-               } else {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x7c;
-               }
-
-               /*      Channel Number */
-               /*      Use the listen channel as the operating channel */
-               p2pie[p2pielen++] = pwdinfo->operating_channel;
-       }
-
-       /*      Channel List */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) =
-               cpu_to_le16(pwdinfo->channel_list_attr_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->channel_list_attr,
-              pwdinfo->channel_list_attr_len);
-       p2pielen += pwdinfo->channel_list_attr_len;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-               /*      Group ID Attribute */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) =
-                       cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      p2P Device Address */
-               memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN);
-               p2pielen += ETH_ALEN;
-
-               /*      SSID */
-               memcpy(p2pie + p2pielen, pwdinfo->nego_ssid,
-                      pwdinfo->nego_ssidlen);
-               p2pielen += pwdinfo->nego_ssidlen;
-       }
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen,
-                              (unsigned char *)p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_nego_confirm_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-void issue_p2p_invitation_request23a(struct rtw_adapter *padapter, u8* raddr)
-{
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_INVIT_REQ;
-       u8 p2pie[ 255 ] = { 0x00 };
-       u8 p2pielen = 0;
-       u8 dialogToken = 3;
-       u16 len_channellist_attr = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       int i, j;
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, raddr);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *) &p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       /*      P2P IE Section. */
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20101011 */
-       /*      According to the P2P Specification, the P2P Invitation
-               request frame should contain 7 P2P attributes */
-       /*      1. Configuration Timeout */
-       /*      2. Invitation Flags */
-       /*      3. Operating Channel    (Only GO) */
-       /*      4. P2P Group BSSID      (Should be included if I am the GO) */
-       /*      5. Channel List */
-       /*      6. P2P Group ID */
-       /*      7. P2P Device Info */
-
-       /*      Configuration Timeout */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      2 seconds needed to be the P2P GO */
-       p2pie[p2pielen++] = 200;
-       /*      2 seconds needed to be the P2P Client */
-       p2pie[p2pielen++] = 200;
-
-       /*      Invitation Flags */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_INVITATION_FLAGS;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       p2pie[p2pielen++] = P2P_INVITATION_FLAGS_PERSISTENT;
-
-       /*      Operating Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Operating Class */
-       if (pwdinfo->invitereq_info.operating_ch <= 14)
-               p2pie[p2pielen++] = 0x51;
-       else if ((pwdinfo->invitereq_info.operating_ch >= 36) &&
-                (pwdinfo->invitereq_info.operating_ch <= 48))
-               p2pie[p2pielen++] = 0x73;
-       else
-               p2pie[p2pielen++] = 0x7c;
-
-       /*      Channel Number */
-       /*      operating channel number */
-       p2pie[p2pielen++] = pwdinfo->invitereq_info.operating_ch;
-
-       if (ether_addr_equal(myid(&padapter->eeprompriv),
-                            pwdinfo->invitereq_info.go_bssid)) {
-               /*      P2P Group BSSID */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      P2P Device Address for GO */
-               memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid,
-                      ETH_ALEN);
-               p2pielen += ETH_ALEN;
-       }
-
-       /*      Channel List */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-       /*      Length: */
-       /*  Country String(3) */
-       /*  + (Operating Class (1) + Number of Channels(1)) *
-           Operation Classes (?) */
-       /*  + number of channels in all classes */
-       len_channellist_attr = 3 +
-               (1 + 1) * (u16)pmlmeext->channel_list.reg_classes +
-               get_reg_classes_full_count(pmlmeext->channel_list);
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Channel Entry List */
-       for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
-               /*      Operating Class */
-               p2pie[p2pielen++] =
-                       pmlmeext->channel_list.reg_class[j].reg_class;
-
-               /*      Number of Channels */
-               p2pie[p2pielen++] =
-                       pmlmeext->channel_list.reg_class[j].channels;
-
-               /*      Channel List */
-               for (i = 0;
-                    i < pmlmeext->channel_list.reg_class[j].channels; i++) {
-                       p2pie[p2pielen++] =
-                               pmlmeext->channel_list.reg_class[j].channel[i];
-               }
-       }
-
-       /*      P2P Group ID */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) =
-               cpu_to_le16(6 + pwdinfo->invitereq_info.ssidlen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address for GO */
-       memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      SSID */
-       memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_ssid,
-              pwdinfo->invitereq_info.ssidlen);
-       p2pielen += pwdinfo->invitereq_info.ssidlen;
-
-       /*      Device Info */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) +
-               Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field
-               (2bytes) + WPS Device Name Len field (2bytes) */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY);
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-       p2pielen += 2;
-
-       /*      OUI */
-       *(u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[p2pielen++] = 0x00;       /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-       p2pielen += 2;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name,
-              pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen,
-                              (unsigned char *) p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_invitation_req_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-void issue_p2p_invitation_response23a(struct rtw_adapter *padapter, u8 *raddr,
-                                     u8 dialogToken, u8 status_code)
-{
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_INVIT_RESP;
-       u8 p2pie[ 255 ] = { 0x00 };
-       u8 p2pielen = 0;
-       u16 len_channellist_attr = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       int i, j;
-
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, raddr);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       /*      P2P IE Section. */
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20101005 */
-       /*      According to the P2P Specification, the P2P Invitation
-               response frame should contain 5 P2P attributes */
-       /*      1. Status */
-       /*      2. Configuration Timeout */
-       /*      3. Operating Channel    (Only GO) */
-       /*      4. P2P Group BSSID      (Only GO) */
-       /*      5. Channel List */
-
-       /*      P2P Status */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_STATUS;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      When status code is P2P_STATUS_FAIL_INFO_UNAVAILABLE. */
-       /*      Sent the event receiving the P2P Invitation Req frame
-               to DMP UI. */
-       /*      DMP had to compare the MAC address to find out the profile. */
-       /*      So, the WiFi driver will send the
-               P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. */
-       /*      If the UI found the corresponding profile, the WiFi driver
-               sends the P2P Invitation Req */
-       /*      to NB to rebuild the persistent group. */
-       p2pie[p2pielen++] = status_code;
-
-       /*      Configuration Timeout */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      2 seconds needed to be the P2P GO */
-       p2pie[p2pielen++] = 200;
-       /*      2 seconds needed to be the P2P Client */
-       p2pie[p2pielen++] = 200;
-
-       if (status_code == P2P_STATUS_SUCCESS) {
-               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                       /* The P2P Invitation request frame asks this
-                          Wi-Fi device to be the P2P GO */
-                       /* In this case, the P2P Invitation response
-                          frame should carry the two more P2P attributes. */
-                       /* First one is operating channel attribute. */
-                       /* Second one is P2P Group BSSID attribute. */
-
-                       /* Operating Channel */
-                       /* Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-                       /* Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-                       p2pielen += 2;
-
-                       /* Value: */
-                       /* Country String */
-                       p2pie[p2pielen++] = 'X';
-                       p2pie[p2pielen++] = 'X';
-
-                       /* The third byte should be set to 0x04. */
-                       /* Described in the "Operating Channel Attribute"
-                          section. */
-                       p2pie[p2pielen++] = 0x04;
-
-                       /* Operating Class */
-                       /*      Copy from SD7 */
-                       p2pie[p2pielen++] = 0x51;
-
-                       /* Channel Number */
-                       /*      operating channel number */
-                       p2pie[p2pielen++] = pwdinfo->operating_channel;
-
-                       /*      P2P Group BSSID */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      P2P Device Address for GO */
-                       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv),
-                              ETH_ALEN);
-                       p2pielen += ETH_ALEN;
-               }
-
-               /*      Channel List */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-               /*      Length: */
-               /*  Country String(3) */
-               /*  + (Operating Class (1) + Number of Channels(1)) *
-                   Operation Classes (?) */
-               /*  + number of channels in all classes */
-               len_channellist_attr = 3 +
-                       (1 + 1) * (u16)pmlmeext->channel_list.reg_classes +
-                       get_reg_classes_full_count(pmlmeext->channel_list);
-
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      Country String */
-               p2pie[p2pielen++] = 'X';
-               p2pie[p2pielen++] = 'X';
-
-               /* The third byte should be set to 0x04. */
-               /* Described in the "Operating Channel Attribute" section. */
-               p2pie[p2pielen++] = 0x04;
-
-               /*      Channel Entry List */
-               for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] =
-                               pmlmeext->channel_list.reg_class[j].reg_class;
-
-                       /*      Number of Channels */
-                       p2pie[p2pielen++] =
-                               pmlmeext->channel_list.reg_class[j].channels;
-
-                       /*      Channel List */
-                       for (i = 0;
-                            i < pmlmeext->channel_list.reg_class[j].channels;
-                            i++) {
-                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
-                       }
-               }
-       }
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen,
-                              (unsigned char *)p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-void issue_p2p_provision_request23a(struct rtw_adapter *padapter, u8 *pssid,
-                                   u8 ussidlen, u8 *pdev_raddr)
-{
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u8 dialogToken = 1;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_PROVISION_DISC_REQ;
-       u8 wpsie[100] = { 0x00 };
-       u8 wpsielen = 0;
-       u32 p2pielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, pdev_raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, pdev_raddr);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       p2pielen = build_prov_disc_request_p2p_ie23a(pwdinfo, pframe, pssid,
-                                                    ussidlen, pdev_raddr);
-
-       pframe += p2pielen;
-       pattrib->pktlen += p2pielen;
-
-       wpsielen = 0;
-       /*      WPS OUI */
-       *(u32*) (wpsie) = cpu_to_be32(WPSOUI);
-       wpsielen += 4;
-
-       /*      WPS version */
-       /*      Type: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-       wpsielen += 2;
-
-       /*      Value: */
-       wpsie[wpsielen++] = WPS_VERSION_1;      /*      Version 1.0 */
-
-       /*      Config Method */
-       /*      Type: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-       wpsielen += 2;
-
-       /*      Value: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request);
-       wpsielen += 2;
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen,
-                              (unsigned char *) wpsie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-static u8 is_matched_in_profilelist(u8 *peermacaddr,
-                                   struct profile_info *profileinfo)
-{
-       u8 i, match_result = 0;
-
-       DBG_8723A("[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __func__,
-                 peermacaddr[0], peermacaddr[1], peermacaddr[2],
-                 peermacaddr[3], peermacaddr[4], peermacaddr[5]);
-
-       for (i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++) {
-              DBG_8723A("[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X "
-                        "%.2X\n", __func__, profileinfo->peermac[0],
-                        profileinfo->peermac[1], profileinfo->peermac[2],
-                        profileinfo->peermac[3], profileinfo->peermac[4],
-                        profileinfo->peermac[5]);
-               if (ether_addr_equal(peermacaddr, profileinfo->peermac)) {
-                       match_result = 1;
-                       DBG_8723A("[%s] Match!\n", __func__);
-                       break;
-               }
-       }
-
-       return match_result;
-}
-
-void issue_probersp23a_p2p23a(struct rtw_adapter *padapter, unsigned char *da)
-{
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       unsigned char *mac;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       u16 beacon_interval = 100;
-       u16 capInfo = 0;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 wpsie[255] = { 0x00 };
-       u32 wpsielen = 0, p2pielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo =
-               &padapter->cfg80211_wdinfo;
-       struct ieee80211_channel *ieee_ch =
-               &pcfg80211_wdinfo->remain_on_ch_channel;
-       u8 listen_channel =
-               (u8)ieee80211_frequency_to_channel(ieee_ch->center_freq);
-
-       /* DBG_8723A("%s\n", __func__); */
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-       {
-               return;
-       }
-
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       mac = myid(&padapter->eeprompriv);
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-       ether_addr_copy(pwlanhdr->addr1, da);
-       ether_addr_copy(pwlanhdr->addr2, mac);
-
-       /*      Use the device address for BSSID field. */
-       ether_addr_copy(pwlanhdr->addr3, mac);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(fctrl, WIFI_PROBERSP);
-
-       pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = pattrib->hdrlen;
-       pframe += pattrib->hdrlen;
-
-       /* timestamp will be inserted by hardware */
-       pframe += 8;
-       pattrib->pktlen += 8;
-
-       /*  beacon interval: 2 bytes */
-       memcpy(pframe, (unsigned char *) &beacon_interval, 2);
-       pframe += 2;
-       pattrib->pktlen += 2;
-
-       /*      capability info: 2 bytes */
-       /*      ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of
-               WiFi Direct Spec) */
-       capInfo |= cap_ShortPremble;
-       capInfo |= cap_ShortSlot;
-
-       memcpy(pframe, (unsigned char *) &capInfo, 2);
-       pframe += 2;
-       pattrib->pktlen += 2;
-
-       /*  SSID */
-       pframe = rtw_set_ie23a(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid,
-                              &pattrib->pktlen);
-
-       /*  supported rates... */
-       /*      Use the OFDM rate in the P2P probe response frame.
-               (6(B), 9(B), 12, 18, 24, 36, 48, 54) */
-       pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_, 8,
-                              pwdinfo->support_rate, &pattrib->pktlen);
-
-       /*  DS parameter set */
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled &&
-           listen_channel != 0) {
-               pframe = rtw_set_ie23a(pframe, _DSSET_IE_, 1, (unsigned char *)
-                                      &listen_channel, &pattrib->pktlen);
-       } else {
-               pframe = rtw_set_ie23a(pframe, _DSSET_IE_, 1, (unsigned char *)
-                                      &pwdinfo->listen_channel,
-                                      &pattrib->pktlen);
-       }
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               if (pmlmepriv->wps_probe_resp_ie &&
-                   pmlmepriv->p2p_probe_resp_ie) {
-                       /* WPS IE */
-                       memcpy(pframe, pmlmepriv->wps_probe_resp_ie,
-                              pmlmepriv->wps_probe_resp_ie_len);
-                       pattrib->pktlen += pmlmepriv->wps_probe_resp_ie_len;
-                       pframe += pmlmepriv->wps_probe_resp_ie_len;
-
-                       /* P2P IE */
-                       memcpy(pframe, pmlmepriv->p2p_probe_resp_ie,
-                              pmlmepriv->p2p_probe_resp_ie_len);
-                       pattrib->pktlen += pmlmepriv->p2p_probe_resp_ie_len;
-                       pframe += pmlmepriv->p2p_probe_resp_ie_len;
-               }
-       } else {
-
-               /*      Todo: WPS IE */
-               /*      Noted by Albert 20100907 */
-               /*      According to the WPS specification, all the WPS
-                       attribute is presented by Big Endian. */
-
-               wpsielen = 0;
-               /*      WPS OUI */
-               *(u32*) (wpsie) = cpu_to_be32(WPSOUI);
-               wpsielen += 4;
-
-               /*      WPS version */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-               wpsielen += 2;
-
-               /*      Value: */
-               wpsie[wpsielen++] = WPS_VERSION_1;      /*      Version 1.0 */
-
-               /*      WiFi Simple Config State */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_ATTR_SIMPLE_CONF_STATE);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-               wpsielen += 2;
-
-               /*      Value: */
-               wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG;
-
-               /*      Response Type */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_RESP_TYPE);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-               wpsielen += 2;
-
-               /*      Value: */
-               wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X;
-
-               /*      UUID-E */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_UUID_E);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0010);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, myid(&padapter->eeprompriv), ETH_ALEN);
-               wpsielen += 0x10;
-
-               /*      Manufacturer */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MANUFACTURER);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0007);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, "Realtek", 7);
-               wpsielen += 7;
-
-               /*      Model Name */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NAME);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0006);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, "8192CU", 6);
-               wpsielen += 6;
-
-               /*      Model Number */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NUMBER);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-               wpsielen += 2;
-
-               /*      Value: */
-               wpsie[ wpsielen++ ] = 0x31;             /*      character 1 */
-
-               /*      Serial Number */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_ATTR_SERIAL_NUMBER);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(ETH_ALEN);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, "123456", ETH_ALEN);
-               wpsielen += ETH_ALEN;
-
-               /*      Primary Device Type */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0008);
-               wpsielen += 2;
-
-               /*      Value: */
-               /*      Category ID */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-               wpsielen += 2;
-
-               /*      OUI */
-               *(u32*) (wpsie + wpsielen) = cpu_to_be32(WPSOUI);
-               wpsielen += 4;
-
-               /*      Sub Category ID */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-               wpsielen += 2;
-
-               /*      Device Name */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(pwdinfo->device_name_len);
-               wpsielen += 2;
-
-               /*      Value: */
-               if (pwdinfo->device_name_len) {
-                       memcpy(wpsie + wpsielen, pwdinfo->device_name,
-                              pwdinfo->device_name_len);
-                       wpsielen += pwdinfo->device_name_len;
-               }
-
-               /*      Config Method */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-               wpsielen += 2;
-
-               /*      Value: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(pwdinfo->supported_wps_cm);
-               wpsielen += 2;
-
-               pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen,
-                                      (unsigned char *)wpsie,
-                                      &pattrib->pktlen);
-
-               p2pielen = build_probe_resp_p2p_ie23a(pwdinfo, pframe);
-               pframe += p2pielen;
-               pattrib->pktlen += p2pielen;
-       }
-
-#ifdef CONFIG_8723AU_P2P
-       if (pwdinfo->wfd_info->wfd_enable) {
-               wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
-               pframe += wfdielen;
-               pattrib->pktlen += wfdielen;
-       } else if (pmlmepriv->wfd_probe_resp_ie &&
-                pmlmepriv->wfd_probe_resp_ie_len > 0) {
-               /* WFD IE */
-               memcpy(pframe, pmlmepriv->wfd_probe_resp_ie,
-                      pmlmepriv->wfd_probe_resp_ie_len);
-               pattrib->pktlen += pmlmepriv->wfd_probe_resp_ie_len;
-               pframe += pmlmepriv->wfd_probe_resp_ie_len;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-static int _issue23a_probereq_p2p(struct rtw_adapter *padapter, u8 *da,
-                                 int wait_ack)
-{
-       int ret = _FAIL;
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       unsigned char *mac;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       u8      bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       u8 wpsie[255] = {0x00}, p2pie[255] = {0x00};
-       u16 wpsielen = 0, p2pielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               goto exit;
-
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       mac = myid(&padapter->eeprompriv);
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       if (da) {
-               ether_addr_copy(pwlanhdr->addr1, da);
-               ether_addr_copy(pwlanhdr->addr3, da);
-       } else {
-               if ((pwdinfo->p2p_info.scan_op_ch_only) ||
-                   (pwdinfo->rx_invitereq_info.scan_op_ch_only)) {
-                       /*      This two flags will be set when this is
-                               only the P2P client mode. */
-                       ether_addr_copy(pwlanhdr->addr1,
-                                       pwdinfo->p2p_peer_interface_addr);
-                       ether_addr_copy(pwlanhdr->addr3,
-                                       pwdinfo->p2p_peer_interface_addr);
-               } else {
-                       /*      broadcast probe request frame */
-                       ether_addr_copy(pwlanhdr->addr1, bc_addr);
-                       ether_addr_copy(pwlanhdr->addr3, bc_addr);
-               }
-       }
-       ether_addr_copy(pwlanhdr->addr2, mac);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_PROBEREQ);
-
-       pframe += sizeof (struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr);
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) {
-               pframe = rtw_set_ie23a(pframe, _SSID_IE_,
-                                   pwdinfo->tx_prov_disc_info.ssid.ssid_len,
-                                   pwdinfo->tx_prov_disc_info.ssid.ssid,
-                                   &pattrib->pktlen);
-       } else {
-               pframe = rtw_set_ie23a(pframe, _SSID_IE_,
-                                      P2P_WILDCARD_SSID_LEN,
-                                      pwdinfo->p2p_wildcard_ssid,
-                                      &pattrib->pktlen);
-       }
-       /*      Use the OFDM rate in the P2P probe request frame.
-               (6(B), 9(B), 12(B), 24(B), 36, 48, 54) */
-       pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_, 8,
-                              pwdinfo->support_rate, &pattrib->pktlen);
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               if (pmlmepriv->wps_probe_req_ie &&
-                   pmlmepriv->p2p_probe_req_ie) {
-                       /* WPS IE */
-                       memcpy(pframe, pmlmepriv->wps_probe_req_ie,
-                              pmlmepriv->wps_probe_req_ie_len);
-                       pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
-                       pframe += pmlmepriv->wps_probe_req_ie_len;
-
-                       /* P2P IE */
-                       memcpy(pframe, pmlmepriv->p2p_probe_req_ie,
-                              pmlmepriv->p2p_probe_req_ie_len);
-                       pattrib->pktlen += pmlmepriv->p2p_probe_req_ie_len;
-                       pframe += pmlmepriv->p2p_probe_req_ie_len;
-               }
-       } else {
-
-               /*      WPS IE */
-               /*      Noted by Albert 20110221 */
-               /*      According to the WPS specification, all the WPS
-                       attribute is presented by Big Endian. */
-
-               wpsielen = 0;
-               /*      WPS OUI */
-               *(u32*) (wpsie) = cpu_to_be32(WPSOUI);
-               wpsielen += 4;
-
-               /*      WPS version */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-               wpsielen += 2;
-
-               /*      Value: */
-               wpsie[wpsielen++] = WPS_VERSION_1;      /*      Version 1.0 */
-
-               if (pmlmepriv->wps_probe_req_ie == NULL) {
-                       /*      UUID-E */
-                       /*      Type: */
-                       *(u16*) (wpsie + wpsielen) =
-                               cpu_to_be16(WPS_ATTR_UUID_E);
-                       wpsielen += 2;
-
-                       /*      Length: */
-                       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0010);
-                       wpsielen += 2;
-
-                       /*      Value: */
-                       memcpy(wpsie + wpsielen, myid(&padapter->eeprompriv),
-                              ETH_ALEN);
-                       wpsielen += 0x10;
-
-                       /*      Config Method */
-                       /*      Type: */
-                       *(u16*) (wpsie + wpsielen) =
-                               cpu_to_be16(WPS_ATTR_CONF_METHOD);
-                       wpsielen += 2;
-
-                       /*      Length: */
-                       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-                       wpsielen += 2;
-
-                       /*      Value: */
-                       *(u16*) (wpsie + wpsielen) =
-                               cpu_to_be16(pwdinfo->supported_wps_cm);
-                       wpsielen += 2;
-               }
-
-               /*      Device Name */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(pwdinfo->device_name_len);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, pwdinfo->device_name,
-                      pwdinfo->device_name_len);
-               wpsielen += pwdinfo->device_name_len;
-
-               /*      Primary Device Type */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0008);
-               wpsielen += 2;
-
-               /*      Value: */
-               /*      Category ID */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_RTK_WIDI);
-               wpsielen += 2;
-
-               /*      OUI */
-               *(u32*) (wpsie + wpsielen) = cpu_to_be32(WPSOUI);
-               wpsielen += 4;
-
-               /*      Sub Category ID */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_RTK_DMP);
-               wpsielen += 2;
-
-               /*      Device Password ID */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-               wpsielen += 2;
-
-               /*      Value: */
-               /*      Registrar-specified */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_DPID_REGISTRAR_SPEC);
-               wpsielen += 2;
-
-               pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen,
-                                      (unsigned char *)wpsie,
-                                      &pattrib->pktlen);
-
-               /*      P2P OUI */
-               p2pielen = 0;
-               p2pie[p2pielen++] = 0x50;
-               p2pie[p2pielen++] = 0x6F;
-               p2pie[p2pielen++] = 0x9A;
-               p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-               /*      Commented by Albert 20110221 */
-               /*      According to the P2P Specification, the probe request
-                       frame should contain 5 P2P attributes */
-               /*      1. P2P Capability */
-               /*      2. P2P Device ID if this probe request wants to
-                       find the specific P2P device */
-               /*      3. Listen Channel */
-               /*      4. Extended Listen Timing */
-               /*      5. Operating Channel if this WiFi is working as
-                       the group owner now */
-
-               /*      P2P Capability */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      Device Capability Bitmap, 1 byte */
-               p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-
-               /*      Group Capability Bitmap, 1 byte */
-               if (pwdinfo->persistent_supported)
-                       p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP |
-                               DMP_P2P_GRPCAP_SUPPORT;
-               else
-                       p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT;
-
-               /*      Listen Channel */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      Country String */
-               p2pie[p2pielen++] = 'X';
-               p2pie[p2pielen++] = 'X';
-
-               /* The third byte should be set to 0x04. */
-               /* Described in the "Operating Channel Attribute" section. */
-               p2pie[p2pielen++] = 0x04;
-
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x51;       /*      Copy from SD7 */
-
-               /*      Channel Number */
-               /*      listen channel */
-               p2pie[p2pielen++] = pwdinfo->listen_channel;
-
-               /*      Extended Listen Timing */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      Availability Period */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-               p2pielen += 2;
-
-               /*      Availability Interval */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-               p2pielen += 2;
-
-               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                       /* Operating Channel (if this WiFi is working as
-                          the group owner now) */
-                       /* Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      Country String */
-                       p2pie[p2pielen++] = 'X';
-                       p2pie[p2pielen++] = 'X';
-
-                       /* The third byte should be set to 0x04. */
-                       /* Described in the "Operating Channel Attribute"
-                          section. */
-                       p2pie[p2pielen++] = 0x04;
-
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x51;       /*      Copy from SD7 */
-
-                       /*      Channel Number */
-                       /*      operating channel number */
-                       p2pie[p2pielen++] = pwdinfo->operating_channel;
-               }
-
-               pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen,
-                                      (unsigned char *)p2pie,
-                                      &pattrib->pktlen);
-
-               if (pmlmepriv->wps_probe_req_ie) {
-                       /* WPS IE */
-                       memcpy(pframe, pmlmepriv->wps_probe_req_ie,
-                              pmlmepriv->wps_probe_req_ie_len);
-                       pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
-                       pframe += pmlmepriv->wps_probe_req_ie_len;
-               }
-       }
-
-#ifdef CONFIG_8723AU_P2P
-       if (pwdinfo->wfd_info->wfd_enable) {
-               wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe);
-               pframe += wfdielen;
-               pattrib->pktlen += wfdielen;
-       } else if (pmlmepriv->wfd_probe_req_ie &&
-                  pmlmepriv->wfd_probe_req_ie_len>0) {
-               /* WFD IE */
-               memcpy(pframe, pmlmepriv->wfd_probe_req_ie,
-                      pmlmepriv->wfd_probe_req_ie_len);
-               pattrib->pktlen += pmlmepriv->wfd_probe_req_ie_len;
-               pframe += pmlmepriv->wfd_probe_req_ie_len;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
-                ("issuing probe_req, tx_len =%d\n", pattrib->last_txcmdsz));
-
-       if (wait_ack) {
-               ret = dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe);
-       } else {
-               dump_mgntframe23a(padapter, pmgntframe);
-               ret = _SUCCESS;
-       }
-
-exit:
-       return ret;
-}
-
-inline void issue23a_probereq_p2p(struct rtw_adapter *adapter, u8 *da)
-{
-       _issue23a_probereq_p2p(adapter, da, false);
-}
-
-int issue23a_probereq_p2p_ex(struct rtw_adapter *adapter, u8 *da,
-                            int try_cnt, int wait_ms)
-{
-       int ret;
-       int i = 0;
-       unsigned long start = jiffies;
-
-       do {
-               ret = _issue23a_probereq_p2p(adapter, da,
-                                            wait_ms > 0 ? true : false);
-
-               i++;
-
-               if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
-                       break;
-
-               if (i < try_cnt && wait_ms > 0 && ret == _FAIL)
-                       msleep(wait_ms);
-
-       } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0)));
-
-       if (ret != _FAIL) {
-               ret = _SUCCESS;
-               goto exit;
-       }
-
-       if (try_cnt && wait_ms) {
-               if (da)
-                       DBG_8723A(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d "
-                                 "in %u ms\n", FUNC_ADPT_ARG(adapter),
-                                 MAC_ARG(da), rtw_get_oper_ch23a(adapter),
-                                 ret == _SUCCESS?", acked":"", i, try_cnt,
-                                 jiffies_to_msecs(jiffies - start));
-               else
-                       DBG_8723A(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
-                                 FUNC_ADPT_ARG(adapter),
-                                 rtw_get_oper_ch23a(adapter),
-                                 ret == _SUCCESS?", acked":"", i, try_cnt,
-                                 jiffies_to_msecs(jiffies - start));
-       }
-exit:
-       return ret;
-}
-
-#endif /* CONFIG_8723AU_P2P */
-
-static s32 rtw_action_public_decache(struct recv_frame *recv_frame, s32 token)
-{
-       struct rtw_adapter *adapter = recv_frame->adapter;
-       struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
-       struct sk_buff *skb = recv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u16 seq_ctrl;
-
-       seq_ctrl = ((recv_frame->attrib.seq_num&0xffff) << 4) |
-               (recv_frame->attrib.frag_num & 0xf);
-
-       if (ieee80211_has_retry(hdr->frame_control)) {
-               if (token >= 0) {
-                       if ((seq_ctrl == mlmeext->action_public_rxseq) &&
-                           (token == mlmeext->action_public_dialog_token)) {
-                               DBG_8723A(FUNC_ADPT_FMT" seq_ctrl = 0x%x, "
-                                         "rxseq = 0x%x, token:%d\n",
-                                         FUNC_ADPT_ARG(adapter), seq_ctrl,
-                                         mlmeext->action_public_rxseq, token);
-                               return _FAIL;
-                       }
-               } else {
-                       if (seq_ctrl == mlmeext->action_public_rxseq) {
-                               DBG_8723A(FUNC_ADPT_FMT" seq_ctrl = 0x%x, "
-                                         "rxseq = 0x%x\n",
-                                         FUNC_ADPT_ARG(adapter), seq_ctrl,
-                                         mlmeext->action_public_rxseq);
-                               return _FAIL;
-                       }
-               }
-       }
-
-       mlmeext->action_public_rxseq = seq_ctrl;
-
-       if (token >= 0)
-               mlmeext->action_public_dialog_token = token;
-
-       return _SUCCESS;
-}
-
-static unsigned int on_action_public23a_p2p(struct recv_frame *precv_frame)
-{
-       struct sk_buff *skb = precv_frame->pkt;
-       u8 *pframe = skb->data;
-       u8 *frame_body;
-       u8 dialogToken = 0;
-#ifdef CONFIG_8723AU_P2P
-       struct rtw_adapter *padapter = precv_frame->adapter;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       uint len = skb->len;
-       u8 *p2p_ie;
-       u32     p2p_ielen;
-       struct  wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8      result = P2P_STATUS_SUCCESS;
-#endif /* CONFIG_8723AU_P2P */
-
-       frame_body = (unsigned char *)
-               (pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       dialogToken = frame_body[7];
-
-       if (rtw_action_public_decache(precv_frame, dialogToken) == _FAIL)
-               return _FAIL;
-
-#ifdef CONFIG_8723AU_P2P
-       del_timer_sync(&pwdinfo->reset_ch_sitesurvey);
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               rtw_cfg80211_rx_p2p_action_public(padapter, pframe, len);
-       } else {
-               /*      Do nothing if the driver doesn't enable the P2P function. */
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
-                       return _SUCCESS;
-
-               len -= sizeof(struct ieee80211_hdr_3addr);
-
-               switch (frame_body[ 6 ])/* OUI Subtype */
-               {
-                       case P2P_GO_NEGO_REQ:
-                               DBG_8723A("[%s] Got GO Nego Req Frame\n", __func__);
-                               memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info));
-
-                               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))
-                               {
-                                       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-                               }
-
-                               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
-                               {
-                                       /*      Commented by Albert 20110526 */
-                                       /*      In this case, this means the previous nego fail doesn't be reset yet. */
-                                       del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                                       /*      Restore the previous p2p state */
-                                       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-                                       DBG_8723A("[%s] Restore the previous p2p state to %d\n", __func__, rtw_p2p_state(pwdinfo));
-                               }
-
-                               /*      Commented by Kurt 20110902 */
-                               /* Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */
-                               if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
-                                       rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-
-                               /*      Commented by Kurt 20120113 */
-                               /*      Get peer_dev_addr here if peer doesn't issue prov_disc frame. */
-                               if (is_zero_ether_addr(pwdinfo->rx_prov_disc_info.peerDevAddr))
-                                       ether_addr_copy(pwdinfo->rx_prov_disc_info.peerDevAddr, hdr->addr2);
-
-                               result = process_p2p_group_negotation_req23a(pwdinfo, frame_body, len);
-                               issue_p2p_GO_response(padapter, hdr->addr2,
-                                                     frame_body, len, result);
-
-                               /*      Commented by Albert 20110718 */
-                               /*      No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. */
-                               mod_timer(&pwdinfo->restore_p2p_state_timer,
-                                         jiffies + msecs_to_jiffies(5000));
-                               break;
-
-                       case P2P_GO_NEGO_RESP:
-                               DBG_8723A("[%s] Got GO Nego Resp Frame\n", __func__);
-
-                               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
-                               {
-                                       /*      Commented by Albert 20110425 */
-                                       /*      The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. */
-                                       del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                                       pwdinfo->nego_req_info.benable = false;
-                                       result = process_p2p_group_negotation_resp23a(pwdinfo, frame_body, len);
-                                       issue_p2p_GO_confirm(pwdinfo->padapter,
-                                                            hdr->addr2,
-                                                            result);
-                                       if (result == P2P_STATUS_SUCCESS) {
-                                               if (rtw_p2p_role(pwdinfo) ==
-                                                   P2P_ROLE_CLIENT) {
-                                                       pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch;
-                                                       pwdinfo->p2p_info.scan_op_ch_only = 1;
-                                                       mod_timer(&pwdinfo->reset_ch_sitesurvey2, jiffies + msecs_to_jiffies(P2P_RESET_SCAN_CH));
-                                               }
-                                       }
-
-                                       /*      Reset the dialog token for group negotiation frames. */
-                                       pwdinfo->negotiation_dialog_token = 1;
-
-                                       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
-                                       {
-                                               mod_timer(&pwdinfo->restore_p2p_state_timer, jiffies + msecs_to_jiffies(5000));
-                                       }
-                               } else {
-                                       DBG_8723A("[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __func__);
-                               }
-
-                               break;
-
-                       case P2P_GO_NEGO_CONF:
-
-                               DBG_8723A("[%s] Got GO Nego Confirm Frame\n", __func__);
-                               result = process_p2p_group_negotation_confirm23a(pwdinfo, frame_body, len);
-                               if (P2P_STATUS_SUCCESS == result)
-                               {
-                                       if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT)
-                                       {
-                                               pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch;
-                                               pwdinfo->p2p_info.scan_op_ch_only = 1;
-                                               mod_timer(&pwdinfo->reset_ch_sitesurvey2, jiffies + msecs_to_jiffies(P2P_RESET_SCAN_CH));
-                                       }
-                               }
-                               break;
-
-                       case P2P_INVIT_REQ:
-                               /*      Added by Albert 2010/10/05 */
-                               /*      Received the P2P Invite Request frame. */
-
-                               DBG_8723A("[%s] Got invite request frame!\n", __func__);
-                               if ((p2p_ie = rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)))
-                               {
-                                       /*      Parse the necessary information from the P2P Invitation Request frame. */
-                                       /*      For example: The MAC address of sending this P2P Invitation Request frame. */
-                                       u32     attr_contentlen = 0;
-                                       u8      status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                       struct group_id_info group_id;
-                                       u8      invitation_flag = 0;
-
-                                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen);
-                                       if (attr_contentlen)
-                                       {
-
-                                               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen);
-                                               /*      Commented by Albert 20120510 */
-                                               /*      Copy to the pwdinfo->p2p_peer_interface_addr. */
-                                               /*      So that the WFD UI (or Sigma) can get the peer interface address by using the following command. */
-                                               /*      #> iwpriv wlan0 p2p_get peer_ifa */
-                                               /*      After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant. */
-
-                                               if (attr_contentlen)
-                                               {
-                                                       DBG_8723A("[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __func__,
-                                                                       pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1],
-                                                                       pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3],
-                                                                       pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5]);
-                                               }
-
-                                               if (invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT)
-                                               {
-                                                       /*      Re-invoke the persistent group. */
-
-                                                       memset(&group_id, 0x00, sizeof(struct group_id_info));
-                                                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, (u8*) &group_id, &attr_contentlen);
-                                                       if (attr_contentlen) {
-                                                               if (ether_addr_equal(group_id.go_device_addr, myid(&padapter->eeprompriv))) {
-                                                                       /*      The p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO. */
-                                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO);
-                                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                                                       status_code = P2P_STATUS_SUCCESS;
-                                                               }
-                                                               else
-                                                               {
-                                                                       /*      The p2p device sending this p2p invitation request wants to be the persistent GO. */
-                                                                       if (is_matched_in_profilelist(pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ]))
-                                                                       {
-                                                                               u8 operatingch_info[5] = { 0x00 };
-                                                                               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-                                                                               {
-                                                                                       if (rtw_ch_set_search_ch23a(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4]))
-                                                                                       {
-                                                                                               /*      The operating channel is acceptable for this device. */
-                                                                                               pwdinfo->rx_invitereq_info.operation_ch[0]= operatingch_info[4];
-                                                                                               pwdinfo->rx_invitereq_info.scan_op_ch_only = 1;
-                                                                                               mod_timer(&pwdinfo->reset_ch_sitesurvey, jiffies + msecs_to_jiffies(P2P_RESET_SCAN_CH));
-                                                                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH);
-                                                                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                                                                               status_code = P2P_STATUS_SUCCESS;
-                                                                                               }
-                                                                                       else
-                                                                                       {
-                                                                                               /*      The operating channel isn't supported by this device. */
-                                                                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
-                                                                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                                                                               status_code = P2P_STATUS_FAIL_NO_COMMON_CH;
-                                                                                               mod_timer(&pwdinfo->restore_p2p_state_timer, jiffies + msecs_to_jiffies(3000));
-                                                                                       }
-                                                                               }
-                                                                               else {
-                                                                                       /*      Commented by Albert 20121130 */
-                                                                                       /*      Intel will use the different P2P IE to store the operating channel information */
-                                                                                       /*      Workaround for Intel WiDi 3.5 */
-                                                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH);
-                                                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                                                                       status_code = P2P_STATUS_SUCCESS;
-                                                                               }
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
-
-                                                                               status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;
-                                                                       }
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               DBG_8723A("[%s] P2P Group ID Attribute NOT FOUND!\n", __func__);
-                                                               status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                                       }
-                                               }
-                                               else
-                                               {
-                                                       /*      Received the invitation to join a P2P group. */
-
-                                                       memset(&group_id, 0x00, sizeof(struct group_id_info));
-                                                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, (u8*) &group_id, &attr_contentlen);
-                                                       if (attr_contentlen)
-                                                       {
-                                                               if (ether_addr_equal(group_id.go_device_addr, myid(&padapter->eeprompriv))) {
-                                                                       /*      In this case, the GO can't be myself. */
-                                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
-                                                                       status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                                               }
-                                                               else
-                                                               {
-                                                                       /*      The p2p device sending this p2p invitation request wants to join an existing P2P group */
-                                                                       /*      Commented by Albert 2012/06/28 */
-                                                                       /*      In this case, this Wi-Fi device should use the iwpriv command to get the peer device address. */
-                                                                       /*      The peer device address should be the destination address for the provisioning discovery request. */
-                                                                       /*      Then, this Wi-Fi device should use the iwpriv command to get the peer interface address. */
-                                                                       /*      The peer interface address should be the address for WPS mac address */
-                                                                       ether_addr_copy(pwdinfo->p2p_peer_device_addr, group_id.go_device_addr);
-                                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN);
-                                                                       status_code = P2P_STATUS_SUCCESS;
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               DBG_8723A("[%s] P2P Group ID Attribute NOT FOUND!\n", __func__);
-                                                               status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                                       }
-                                               }
-                                       }
-                                       else
-                                       {
-                                               DBG_8723A("[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __func__);
-                                               status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                       }
-
-                                       DBG_8723A("[%s] status_code = %d\n", __func__, status_code);
-
-                                       pwdinfo->inviteresp_info.token = frame_body[ 7 ];
-                                       issue_p2p_invitation_response23a(padapter, hdr->addr2, pwdinfo->inviteresp_info.token, status_code);
-                               }
-                               break;
-
-                       case P2P_INVIT_RESP:
-                       {
-                               u8      attr_content = 0x00;
-                               u32     attr_contentlen = 0;
-
-                               DBG_8723A("[%s] Got invite response frame!\n", __func__);
-                               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                               if ((p2p_ie = rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)))
-                               {
-                                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
-
-                                       if (attr_contentlen == 1)
-                                       {
-                                               DBG_8723A("[%s] Status = %d\n", __func__, attr_content);
-                                               pwdinfo->invitereq_info.benable = false;
-
-                                               if (attr_content == P2P_STATUS_SUCCESS)
-                                               {
-                                                       if (ether_addr_equal(pwdinfo->invitereq_info.go_bssid, myid(&padapter->eeprompriv))) {
-                                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                                       }
-                                                       else
-                                                       {
-                                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                                       }
-                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_OK);
-                                               }
-                                               else
-                                               {
-                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
-                                               }
-                                       }
-                                       else
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
-                                       }
-                               }
-                               else
-                               {
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
-                               }
-
-                               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL)) {
-                                       mod_timer(&pwdinfo->restore_p2p_state_timer, jiffies + msecs_to_jiffies(5000));
-                               }
-                               break;
-                       }
-                       case P2P_DEVDISC_REQ:
-
-                               process_p2p_devdisc_req23a(pwdinfo, pframe, len);
-
-                               break;
-
-                       case P2P_DEVDISC_RESP:
-
-                               process_p2p_devdisc_resp23a(pwdinfo, pframe, len);
-
-                               break;
-
-                       case P2P_PROVISION_DISC_REQ:
-                               DBG_8723A("[%s] Got Provisioning Discovery Request Frame\n", __func__);
-                               process_p2p_provdisc_req23a(pwdinfo, pframe, len);
-                               ether_addr_copy(pwdinfo->rx_prov_disc_info.peerDevAddr, hdr->addr2);
-
-                               /* 20110902 Kurt */
-                               /* Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */
-                               if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))
-                                       rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);
-                               mod_timer(&pwdinfo->restore_p2p_state_timer,
-                                         jiffies + msecs_to_jiffies(P2P_PROVISION_TIMEOUT));
-                               break;
-
-                       case P2P_PROVISION_DISC_RESP:
-                               /*      Commented by Albert 20110707 */
-                               /*      Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? */
-                               DBG_8723A("[%s] Got Provisioning Discovery Response Frame\n", __func__);
-                               /*      Commented by Albert 20110426 */
-                               /*      The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. */
-                               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP);
-                               process_p2p_provdisc_resp23a(pwdinfo, pframe);
-                               mod_timer(&pwdinfo->restore_p2p_state_timer,
-                                         jiffies + msecs_to_jiffies(P2P_PROVISION_TIMEOUT));
-                               break;
-
-               }
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       return _SUCCESS;
-}
-
-static unsigned int on_action_public23a_vendor(struct recv_frame *precv_frame)
-{
-       unsigned int ret = _FAIL;
-       struct sk_buff *skb = precv_frame->pkt;
-       u8 *pframe = skb->data;
-       u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr);
-
-       if (!memcmp(frame_body + 2, P2P_OUI23A, 4)) {
-               ret = on_action_public23a_p2p(precv_frame);
-       }
-
-       return ret;
-}
-
-static unsigned int
-on_action_public23a_default(struct recv_frame *precv_frame, u8 action)
-{
-       unsigned int ret = _FAIL;
-       struct sk_buff *skb = precv_frame->pkt;
-       u8 *pframe = skb->data;
-       uint frame_len = skb->len;
-       u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr);
-       u8 token;
-       struct rtw_adapter *adapter = precv_frame->adapter;
-       int cnt = 0;
-       char msg[64];
-
-       token = frame_body[2];
-
-       if (rtw_action_public_decache(precv_frame, token) == _FAIL)
-               goto exit;
-
-       cnt += sprintf((msg+cnt), "%s(token:%u)",
-                      action_public_str23a(action), token);
-       rtw_cfg80211_rx_action(adapter, pframe, frame_len, msg);
-
-       ret = _SUCCESS;
-
-exit:
-       return ret;
-}
-
-unsigned int on_action_public23a(struct rtw_adapter *padapter,
-                                struct recv_frame *precv_frame)
-{
-       unsigned int ret = _FAIL;
-       struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
-       u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr);
-       u8 category, action;
-
-       /* check RA matches or not */
-       if (!ether_addr_equal(myid(&padapter->eeprompriv), hdr->addr1))
-               goto exit;
-
-       category = frame_body[0];
-       if (category != WLAN_CATEGORY_PUBLIC)
-               goto exit;
-
-       action = frame_body[1];
-       switch (action) {
-       case ACT_PUBLIC_VENDOR:
-               ret = on_action_public23a_vendor(precv_frame);
-               break;
-       default:
-               ret = on_action_public23a_default(precv_frame, action);
-               break;
-       }
-
-exit:
-       return ret;
-}
-
-unsigned int OnAction23a_ht(struct rtw_adapter *padapter,
-                           struct recv_frame *precv_frame)
-{
-       return _SUCCESS;
-}
-
-unsigned int OnAction23a_wmm(struct rtw_adapter *padapter,
-                            struct recv_frame *precv_frame)
-{
-       return _SUCCESS;
-}
-
-unsigned int OnAction23a_p2p(struct rtw_adapter *padapter,
-                            struct recv_frame *precv_frame)
-{
-#ifdef CONFIG_8723AU_P2P
-       u8 *frame_body;
-       u8 category, OUI_Subtype, dialogToken = 0;
-       struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
-       uint len = skb->len;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       DBG_8723A("%s\n", __func__);
-
-       /* check RA matches or not */
-       if (!ether_addr_equal(myid(&padapter->eeprompriv), hdr->addr1))
-               return _SUCCESS;
-
-       frame_body = (unsigned char *)
-               (pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       category = frame_body[0];
-       if (category != WLAN_CATEGORY_VENDOR_SPECIFIC)
-               return _SUCCESS;
-
-       if (cpu_to_be32(*((u32*) (frame_body + 1))) != P2POUI)
-               return _SUCCESS;
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               rtw_cfg80211_rx_action_p2p(padapter, pframe, len);
-               return _SUCCESS;
-       } else {
-               len -= sizeof(struct ieee80211_hdr_3addr);
-               OUI_Subtype = frame_body[5];
-               dialogToken = frame_body[6];
-
-               switch (OUI_Subtype)
-               {
-               case P2P_NOTICE_OF_ABSENCE:
-                       break;
+       category = frame_body[0];
+       if (category != WLAN_CATEGORY_PUBLIC)
+               goto exit;
 
-               case P2P_PRESENCE_REQUEST:
-                       process_p2p_presence_req23a(pwdinfo, pframe, len);
-                       break;
+       action = frame_body[1];
+       switch (action) {
+       case ACT_PUBLIC_VENDOR:
+               ret = on_action_public23a_vendor(precv_frame);
+               break;
+       default:
+               ret = on_action_public23a_default(precv_frame, action);
+               break;
+       }
 
-               case P2P_PRESENCE_RESPONSE:
-                       break;
+exit:
+       return ret;
+}
 
-               case P2P_GO_DISC_REQUEST:
-                       break;
+static int
+OnAction23a_ht(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+{
+       return _SUCCESS;
+}
 
-               default:
-                       break;
-               }
-       }
-#endif /* CONFIG_8723AU_P2P */
+static int
+OnAction23a_wmm(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+{
+       return _SUCCESS;
+}
 
+static int
+OnAction23a_p2p(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
+{
        return _SUCCESS;
 }
 
-unsigned int OnAction23a(struct rtw_adapter *padapter,
-                        struct recv_frame *precv_frame)
+static int
+OnAction23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        int i;
-       unsigned char   category;
+       u8 category;
        struct action_handler *ptable;
-       unsigned char   *frame_body;
        struct sk_buff *skb = precv_frame->pkt;
-       u8 *pframe = skb->data;
-
-       frame_body = (unsigned char *)
-               (pframe + sizeof(struct ieee80211_hdr_3addr));
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
 
-       category = frame_body[0];
+       category = mgmt->u.action.category;
 
        for (i = 0;
             i < sizeof(OnAction23a_tbl) / sizeof(struct action_handler); i++) {
@@ -5067,8 +2243,7 @@ unsigned int OnAction23a(struct rtw_adapter *padapter,
        return _SUCCESS;
 }
 
-unsigned int DoReserved23a(struct rtw_adapter *padapter,
-                       struct recv_frame *precv_frame)
+int DoReserved23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame)
 {
        return _SUCCESS;
 }
@@ -5267,9 +2442,6 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
        u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
        u8 *wps_ie;
        u32 wps_ielen;
        u8 sr = 0;
@@ -5311,119 +2483,7 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
 
        if ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) {
                /* DBG_8723A("ie len =%d\n", cur_network->IELength); */
-#ifdef CONFIG_8723AU_P2P
-               /*  for P2P : Primary Device Type & Device Name */
-               u32 insert_len = 0;
-               wps_ie = rtw_get_wps_ie23a(cur_network->IEs + _FIXED_IE_LENGTH_,
-                                          cur_network->IELength -
-                                          _FIXED_IE_LENGTH_, NULL, &wps_ielen);
-
-               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wps_ie &&
-                   wps_ielen > 0) {
-                       uint wps_offset, remainder_ielen;
-                       u8 *premainder_ie, *pframe_wscie;
-
-                       wps_offset = (uint)(wps_ie - cur_network->IEs);
-
-                       premainder_ie = wps_ie + wps_ielen;
-
-                       remainder_ielen = cur_network->IELength - wps_offset -
-                               wps_ielen;
-
-                       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-                               if (pmlmepriv->wps_beacon_ie &&
-                                   pmlmepriv->wps_beacon_ie_len>0) {
-                                       memcpy(pframe, cur_network->IEs,
-                                              wps_offset);
-                                       pframe += wps_offset;
-                                       pattrib->pktlen += wps_offset;
-
-                                       memcpy(pframe, pmlmepriv->wps_beacon_ie,
-                                              pmlmepriv->wps_beacon_ie_len);
-                                       pframe += pmlmepriv->wps_beacon_ie_len;
-                                       pattrib->pktlen +=
-                                               pmlmepriv->wps_beacon_ie_len;
-
-                                       /* copy remainder_ie to pframe */
-                                       memcpy(pframe, premainder_ie,
-                                              remainder_ielen);
-                                       pframe += remainder_ielen;
-                                       pattrib->pktlen += remainder_ielen;
-                               } else {
-                                       memcpy(pframe, cur_network->IEs,
-                                              cur_network->IELength);
-                                       pframe += cur_network->IELength;
-                                       pattrib->pktlen +=
-                                               cur_network->IELength;
-                               }
-                       } else {
-                               pframe_wscie = pframe + wps_offset;
-                               memcpy(pframe, cur_network->IEs,
-                                      wps_offset + wps_ielen);
-                               pframe += (wps_offset + wps_ielen);
-                               pattrib->pktlen += (wps_offset + wps_ielen);
-
-                               /* now pframe is end of wsc ie, insert Primary
-                                  Device Type & Device Name */
-                               /*      Primary Device Type */
-                               /*      Type: */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
-                               insert_len += 2;
-
-                               /*      Length: */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(0x0008);
-                               insert_len += 2;
-
-                               /*      Value: */
-                               /*      Category ID */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-                               insert_len += 2;
-
-                               /*      OUI */
-                               *(u32*) (pframe + insert_len) =
-                                       cpu_to_be32(WPSOUI);
-                               insert_len += 4;
-
-                               /*      Sub Category ID */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-                               insert_len += 2;
-
-                               /*      Device Name */
-                               /*      Type: */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-                               insert_len += 2;
-
-                               /*      Length: */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(pwdinfo->device_name_len);
-                               insert_len += 2;
-
-                               /*      Value: */
-                               memcpy(pframe + insert_len,
-                                      pwdinfo->device_name,
-                                      pwdinfo->device_name_len);
-                               insert_len += pwdinfo->device_name_len;
-
-                               /* update wsc ie length */
-                               *(pframe_wscie+1) = (wps_ielen -2) + insert_len;
-
-                               /* pframe move to end */
-                               pframe+= insert_len;
-                               pattrib->pktlen += insert_len;
-
-                               /* copy remainder_ie to pframe */
-                               memcpy(pframe, premainder_ie, remainder_ielen);
-                               pframe += remainder_ielen;
-                               pattrib->pktlen += remainder_ielen;
-                       }
-               } else
-#endif /* CONFIG_8723AU_P2P */
-                       memcpy(pframe, cur_network->IEs, cur_network->IELength);
+               memcpy(pframe, cur_network->IEs, cur_network->IELength);
                len_diff = update_hidden_ssid(pframe + _BEACON_IE_OFFSET_,
                                              cur_network->IELength -
                                              _BEACON_IE_OFFSET_,
@@ -5447,36 +2507,6 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
                else
                        _clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);
 
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                       u32 len;
-                       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-                               len = pmlmepriv->p2p_beacon_ie_len;
-                               if (pmlmepriv->p2p_beacon_ie && len > 0)
-                                       memcpy(pframe,
-                                              pmlmepriv->p2p_beacon_ie, len);
-                       } else
-                               len = build_beacon_p2p_ie23a(pwdinfo, pframe);
-
-                       pframe += len;
-                       pattrib->pktlen += len;
-
-                       if (true == pwdinfo->wfd_info->wfd_enable) {
-                               len = build_beacon_wfd_ie(pwdinfo, pframe);
-                       } else {
-                               len = 0;
-                               if (pmlmepriv->wfd_beacon_ie &&
-                                   pmlmepriv->wfd_beacon_ie_len>0) {
-                                       len = pmlmepriv->wfd_beacon_ie_len;
-                                       memcpy(pframe,
-                                              pmlmepriv->wfd_beacon_ie, len);
-                               }
-                       }
-                       pframe += len;
-                       pattrib->pktlen += len;
-               }
-#endif /* CONFIG_8723AU_P2P */
-
                goto _issue_bcn;
        }
 
@@ -5503,17 +2533,18 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
        pattrib->pktlen += 2;
 
        /*  SSID */
-       pframe = rtw_set_ie23a(pframe, _SSID_IE_, cur_network->Ssid.ssid_len,
+       pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID,
+                              cur_network->Ssid.ssid_len,
                               cur_network->Ssid.ssid, &pattrib->pktlen);
 
        /*  supported rates... */
        rate_len = rtw_get_rateset_len23a(cur_network->SupportedRates);
-       pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_,
+       pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES,
                               ((rate_len > 8)? 8: rate_len),
                               cur_network->SupportedRates, &pattrib->pktlen);
 
        /*  DS parameter set */
-       pframe = rtw_set_ie23a(pframe, _DSSET_IE_, 1, (unsigned char *)
+       pframe = rtw_set_ie23a(pframe, WLAN_EID_DS_PARAMS, 1, (unsigned char *)
                               &cur_network->Configuration.DSConfig,
                               &pattrib->pktlen);
 
@@ -5524,18 +2555,18 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
                /*  IBSS Parameter Set... */
                /* ATIMWindow = cur->Configuration.ATIMWindow; */
                ATIMWindow = 0;
-               pframe = rtw_set_ie23a(pframe, _IBSS_PARA_IE_, 2,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_IBSS_PARAMS, 2,
                                       (unsigned char *)&ATIMWindow,
                                       &pattrib->pktlen);
 
                /* ERP IE */
-               pframe = rtw_set_ie23a(pframe, _ERPINFO_IE_, 1,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_ERP_INFO, 1,
                                       &erpinfo, &pattrib->pktlen);
        }
 
        /*  EXTERNDED SUPPORTED RATE */
        if (rate_len > 8)
-               pframe = rtw_set_ie23a(pframe, _EXT_SUPPORTEDRATES_IE_,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_EXT_SUPP_RATES,
                                       rate_len - 8,
                                       cur_network->SupportedRates + 8,
                                       &pattrib->pktlen);
@@ -5582,22 +2613,17 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
        int ssid_ielen_diff;
        u8 buf[MAX_IE_SZ];
        u8 *ies;
-#endif
-#if defined(CONFIG_8723AU_AP_MODE) || defined(CONFIG_8723AU_P2P)
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 #endif
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
        unsigned int rate_len;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
 
        /* DBG_8723A("%s\n", __func__); */
 
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-       {
+       pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
+       if (!pmgntframe) {
                DBG_8723A("%s, alloc mgnt frame fail\n", __func__);
                return;
        }
@@ -5608,7 +2634,7 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
 
        memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
 
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
+       pframe = (u8 *)pmgntframe->buf_addr + TXDESC_OFFSET;
        pwlanhdr = (struct ieee80211_hdr *)pframe;
 
        mac = myid(&padapter->eeprompriv);
@@ -5640,8 +2666,7 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
                                            &wps_ielen);
 
                /* inerset & update wps_probe_resp_ie */
-               if ((pmlmepriv->wps_probe_resp_ie != NULL) && pwps_ie &&
-                   (wps_ielen > 0)) {
+               if (pmlmepriv->wps_probe_resp_ie && pwps_ie && wps_ielen > 0) {
                        uint wps_offset, remainder_ielen;
                        u8 *premainder_ie;
 
@@ -5658,14 +2683,14 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
 
                        /* to get ie data len */
                        wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];
-                       if ((wps_offset+wps_ielen+2)<= MAX_IE_SZ) {
+                       if (wps_offset + wps_ielen + 2 <= MAX_IE_SZ) {
                                memcpy(pframe, pmlmepriv->wps_probe_resp_ie,
                                       wps_ielen+2);
                                pframe += wps_ielen+2;
                                pattrib->pktlen += wps_ielen+2;
                        }
 
-                       if ((wps_offset+wps_ielen+2+remainder_ielen) <=
+                       if (wps_offset + wps_ielen + 2 + remainder_ielen <=
                            MAX_IE_SZ) {
                                memcpy(pframe, premainder_ie, remainder_ielen);
                                pframe += remainder_ielen;
@@ -5681,9 +2706,9 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
                ies = pmgntframe->buf_addr + TXDESC_OFFSET +
                        sizeof(struct ieee80211_hdr_3addr);
 
-               ssid_ie = rtw_get_ie23a(ies+_FIXED_IE_LENGTH_, _SSID_IE_,
+               ssid_ie = rtw_get_ie23a(ies + _FIXED_IE_LENGTH_, WLAN_EID_SSID,
                                        &ssid_ielen,
-                                       (pframe-ies)-_FIXED_IE_LENGTH_);
+                                       pframe - ies - _FIXED_IE_LENGTH_);
 
                ssid_ielen_diff = cur_network->Ssid.ssid_len - ssid_ielen;
 
@@ -5691,20 +2716,19 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
                        uint remainder_ielen;
                        u8 *remainder_ie;
                        remainder_ie = ssid_ie + 2;
-                       remainder_ielen = (pframe-remainder_ie);
+                       remainder_ielen = pframe - remainder_ie;
 
                        DBG_8723A_LEVEL(_drv_warning_, FUNC_ADPT_FMT
                                        " remainder_ielen > MAX_IE_SZ\n",
                                        FUNC_ADPT_ARG(padapter));
-                       if (remainder_ielen > MAX_IE_SZ) {
+                       if (remainder_ielen > MAX_IE_SZ)
                                remainder_ielen = MAX_IE_SZ;
-                       }
 
                        memcpy(buf, remainder_ie, remainder_ielen);
-                       memcpy(remainder_ie+ssid_ielen_diff, buf,
+                       memcpy(remainder_ie + ssid_ielen_diff, buf,
                               remainder_ielen);
-                       *(ssid_ie+1) = cur_network->Ssid.ssid_len;
-                       memcpy(ssid_ie+2, cur_network->Ssid.ssid,
+                       *(ssid_ie + 1) = cur_network->Ssid.ssid_len;
+                       memcpy(ssid_ie + 2, cur_network->Ssid.ssid,
                               cur_network->Ssid.ssid_len);
 
                        pframe += ssid_ielen_diff;
@@ -5737,40 +2761,42 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
                /* below for ad-hoc mode */
 
                /*  SSID */
-               pframe = rtw_set_ie23a(pframe, _SSID_IE_,
-                                   cur_network->Ssid.ssid_len,
-                                   cur_network->Ssid.ssid, &pattrib->pktlen);
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID,
+                                      cur_network->Ssid.ssid_len,
+                                      cur_network->Ssid.ssid,
+                                      &pattrib->pktlen);
 
                /*  supported rates... */
                rate_len = rtw_get_rateset_len23a(cur_network->SupportedRates);
-               pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES,
                                       ((rate_len > 8)? 8: rate_len),
                                       cur_network->SupportedRates,
                                       &pattrib->pktlen);
 
                /*  DS parameter set */
-               pframe = rtw_set_ie23a(pframe, _DSSET_IE_, 1, (unsigned char *)
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_DS_PARAMS, 1,
+                                      (unsigned char *)
                                       &cur_network->Configuration.DSConfig,
                                       &pattrib->pktlen);
 
-               if ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) {
+               if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) {
                        u8 erpinfo = 0;
                        u32 ATIMWindow;
                        /*  IBSS Parameter Set... */
                        /* ATIMWindow = cur->Configuration.ATIMWindow; */
                        ATIMWindow = 0;
-                       pframe = rtw_set_ie23a(pframe, _IBSS_PARA_IE_, 2,
+                       pframe = rtw_set_ie23a(pframe, WLAN_EID_IBSS_PARAMS, 2,
                                               (unsigned char *)&ATIMWindow,
                                               &pattrib->pktlen);
 
                        /* ERP IE */
-                       pframe = rtw_set_ie23a(pframe, _ERPINFO_IE_, 1,
+                       pframe = rtw_set_ie23a(pframe, WLAN_EID_ERP_INFO, 1,
                                               &erpinfo, &pattrib->pktlen);
                }
 
                /*  EXTERNDED SUPPORTED RATE */
                if (rate_len > 8)
-                       pframe = rtw_set_ie23a(pframe, _EXT_SUPPORTEDRATES_IE_,
+                       pframe = rtw_set_ie23a(pframe, WLAN_EID_EXT_SUPP_RATES,
                                               rate_len - 8,
                                               cur_network->SupportedRates + 8,
                                               &pattrib->pktlen);
@@ -5778,38 +2804,6 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
                /* todo:HT for adhoc */
        }
 
-#ifdef CONFIG_8723AU_P2P
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && is_valid_p2p_probereq) {
-               u32 len;
-               if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-                       /* if pwdinfo->role == P2P_ROLE_DEVICE will call
-                          issue_probersp23a_p2p23a() */
-                       len = pmlmepriv->p2p_go_probe_resp_ie_len;
-                       if (pmlmepriv->p2p_go_probe_resp_ie && len>0)
-                               memcpy(pframe, pmlmepriv->p2p_go_probe_resp_ie,
-                                      len);
-               } else
-                       len = build_probe_resp_p2p_ie23a(pwdinfo, pframe);
-
-               pframe += len;
-               pattrib->pktlen += len;
-
-               if (true == pwdinfo->wfd_info->wfd_enable) {
-                       len = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
-               } else {
-                       len = 0;
-                       if (pmlmepriv->wfd_probe_resp_ie &&
-                           pmlmepriv->wfd_probe_resp_ie_len > 0) {
-                               len = pmlmepriv->wfd_probe_resp_ie_len;
-                               memcpy(pframe, pmlmepriv->wfd_probe_resp_ie,
-                                      len);
-                       }
-               }
-               pframe += len;
-               pattrib->pktlen += len;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        pattrib->last_txcmdsz = pattrib->pktlen;
 
        dump_mgntframe23a(padapter, pmgntframe);
@@ -5874,22 +2868,22 @@ static int _issue_probereq23a(struct rtw_adapter *padapter,
        pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr);
 
        if (pssid)
-               pframe = rtw_set_ie23a(pframe, _SSID_IE_, pssid->ssid_len,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID, pssid->ssid_len,
                                       pssid->ssid, &pattrib->pktlen);
        else
-               pframe = rtw_set_ie23a(pframe, _SSID_IE_, 0, NULL,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID, 0, NULL,
                                       &pattrib->pktlen);
 
        get_rate_set23a(padapter, bssrate, &bssrate_len);
 
        if (bssrate_len > 8) {
-               pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_, 8,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES, 8,
                                       bssrate, &pattrib->pktlen);
-               pframe = rtw_set_ie23a(pframe, _EXT_SUPPORTEDRATES_IE_,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_EXT_SUPP_RATES,
                                       (bssrate_len - 8), (bssrate + 8),
                                       &pattrib->pktlen);
        } else {
-               pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES,
                                       bssrate_len, bssrate, &pattrib->pktlen);
        }
 
@@ -6045,7 +3039,7 @@ void issue_auth23a(struct rtw_adapter *padapter, struct sta_info *psta,
                /*  added challenging text... */
                if ((psta->auth_seq == 2) &&
                    (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key == 1))
-                       pframe = rtw_set_ie23a(pframe, _CHLGETXT_IE_, 128,
+                       pframe = rtw_set_ie23a(pframe, WLAN_EID_CHALLENGE, 128,
                                               psta->chg_txt, &pattrib->pktlen);
 #endif
        } else {
@@ -6104,7 +3098,7 @@ void issue_auth23a(struct rtw_adapter *padapter, struct sta_info *psta,
                if ((pmlmeinfo->auth_seq == 3) &&
                    (pmlmeinfo->state & WIFI_FW_AUTH_STATE) &&
                    (use_shared_key == 1)) {
-                       pframe = rtw_set_ie23a(pframe, _CHLGETXT_IE_, 128,
+                       pframe = rtw_set_ie23a(pframe, WLAN_EID_CHALLENGE, 128,
                                               pmlmeinfo->chg_txt,
                                               &pattrib->pktlen);
 
@@ -6136,22 +3130,20 @@ void issue_asocrsp23a(struct rtw_adapter *padapter, unsigned short status,
        struct xmit_frame *pmgntframe;
        struct ieee80211_hdr *pwlanhdr;
        struct pkt_attrib *pattrib;
-       unsigned char *pbuf, *pframe;
+       unsigned char *pframe;
        unsigned short val;
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *pnetwork = &pmlmeinfo->network;
+       const u8 *p;
        u8 *ie = pnetwork->IEs;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
 
        DBG_8723A("%s\n", __func__);
 
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
+       pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
+       if (!pmgntframe)
                return;
 
        /* update attribute */
@@ -6171,7 +3163,7 @@ void issue_asocrsp23a(struct rtw_adapter *padapter, unsigned short status,
 
        SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
        pmlmeext->mgnt_seq++;
-       if ((pkt_type == WIFI_ASSOCRSP) || (pkt_type == WIFI_REASSOCRSP))
+       if (pkt_type == WIFI_ASSOCRSP || pkt_type == WIFI_REASSOCRSP)
                SetFrameSubType(pwlanhdr, pkt_type);
        else
                return;
@@ -6196,69 +3188,70 @@ void issue_asocrsp23a(struct rtw_adapter *padapter, unsigned short status,
                                     &pattrib->pktlen);
 
        if (pstat->bssratelen <= 8) {
-               pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES,
                                       pstat->bssratelen, pstat->bssrateset,
                                       &pattrib->pktlen);
        } else {
-               pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_, 8,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES, 8,
                                       pstat->bssrateset, &pattrib->pktlen);
-               pframe = rtw_set_ie23a(pframe, _EXT_SUPPORTEDRATES_IE_,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_EXT_SUPP_RATES,
                                       pstat->bssratelen - 8,
                                       pstat->bssrateset + 8, &pattrib->pktlen);
        }
 
-       if ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option)) {
-               uint ie_len = 0;
-
+       if (pstat->flags & WLAN_STA_HT && pmlmepriv->htpriv.ht_option) {
                /* FILL HT CAP INFO IE */
                /* p = hostapd_eid_ht_capabilities_info(hapd, p); */
-               pbuf = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_,
-                                    _HT_CAPABILITY_IE_, &ie_len,
-                                    pnetwork->IELength - _BEACON_IE_OFFSET_);
-               if (pbuf && ie_len>0) {
-                       memcpy(pframe, pbuf, ie_len + 2);
-                       pframe += (ie_len + 2);
-                       pattrib->pktlen += (ie_len + 2);
+               p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
+                                    ie + _BEACON_IE_OFFSET_,
+                                    pnetwork->IELength -_BEACON_IE_OFFSET_);
+               if (p && p[1]) {
+                       memcpy(pframe, p, p[1] + 2);
+                       pframe += (p[1] + 2);
+                       pattrib->pktlen += (p[1] + 2);
                }
 
                /* FILL HT ADD INFO IE */
                /* p = hostapd_eid_ht_operation(hapd, p); */
-               pbuf = rtw_get_ie23a(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_,
-                                    &ie_len,
+               p = cfg80211_find_ie(WLAN_EID_HT_OPERATION,
+                                    ie + _BEACON_IE_OFFSET_,
                                     pnetwork->IELength - _BEACON_IE_OFFSET_);
-               if (pbuf && ie_len > 0) {
-                       memcpy(pframe, pbuf, ie_len + 2);
-                       pframe += (ie_len + 2);
-                       pattrib->pktlen += (ie_len + 2);
+               if (p && p[1] > 0) {
+                       memcpy(pframe, p, p[1] + 2);
+                       pframe += (p[1] + 2);
+                       pattrib->pktlen += (p[1] + 2);
                }
        }
 
        /* FILL WMM IE */
-       if ((pstat->flags & WLAN_STA_WME) && pmlmepriv->qospriv.qos_option) {
-               uint ie_len = 0;
+       if (pstat->flags & WLAN_STA_WME && pmlmepriv->qospriv.qos_option) {
                unsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02,
                                               0x01, 0x01};
-
-               for (pbuf = ie + _BEACON_IE_OFFSET_; ; pbuf += (ie_len + 2)) {
-                       pbuf = rtw_get_ie23a(pbuf, _VENDOR_SPECIFIC_IE_,
-                                            &ie_len, (pnetwork->IELength -
-                                                      _BEACON_IE_OFFSET_ -
-                                                      (ie_len + 2)));
-                       if (pbuf && !memcmp(pbuf + 2, WMM_PARA_IE, 6)) {
-                               memcpy(pframe, pbuf, ie_len + 2);
+               int ie_len = 0;
+
+               for (p = ie + _BEACON_IE_OFFSET_; ; p += (ie_len + 2)) {
+                       p = cfg80211_find_ie(WLAN_EID_VENDOR_SPECIFIC, p,
+                                            pnetwork->IELength -
+                                            _BEACON_IE_OFFSET_ - (ie_len + 2));
+                       if (p)
+                               ie_len = p[1];
+                       else
+                               ie_len = 0;
+                       if (p && !memcmp(p + 2, WMM_PARA_IE, 6)) {
+                               memcpy(pframe, p, ie_len + 2);
                                pframe += (ie_len + 2);
                                pattrib->pktlen += (ie_len + 2);
 
                                break;
                        }
 
-                       if ((!pbuf) || (ie_len == 0))
+                       if (!p || ie_len == 0)
                                break;
                }
        }
 
        if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK) {
-               pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, 6,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, 6,
                                       REALTEK_96B_IE23A, &pattrib->pktlen);
        }
 
@@ -6272,15 +3265,6 @@ void issue_asocrsp23a(struct rtw_adapter *padapter, unsigned short status,
                pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len;
        }
 
-#ifdef CONFIG_8723AU_P2P
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) &&
-           pwdinfo->wfd_info->wfd_enable) {
-               wfdielen = build_assoc_resp_wfd_ie(pwdinfo, pframe);
-               pframe += wfdielen;
-               pattrib->pktlen += wfdielen;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        pattrib->last_txcmdsz = pattrib->pktlen;
 
        dump_mgntframe23a(padapter, pmgntframe);
@@ -6292,11 +3276,11 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
        int ret = _FAIL;
        struct xmit_frame *pmgntframe;
        struct pkt_attrib *pattrib;
-       unsigned char *pframe, *p;
+       unsigned char *pframe;
+       const u8 *p;
        struct ieee80211_hdr *pwlanhdr;
        unsigned short *fctrl;
-       unsigned short val16;
-       unsigned int i, j, ie_len, index = 0;
+       unsigned int i, j, index = 0;
        unsigned char rf_type, bssrate[NumRates], sta_bssrate[NumRates];
        struct ndis_802_11_var_ies *pIE;
        struct registry_priv *pregpriv = &padapter->registrypriv;
@@ -6304,15 +3288,11 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
-       int bssrate_len = 0, sta_bssrate_len = 0;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 p2pie[255] = { 0x00 };
-       u16 p2pielen = 0;
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
+       int bssrate_len = 0, sta_bssrate_len = 0, pie_len;
+       u8 * pie;
 
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
+       pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
+       if (!pmgntframe)
                goto exit;
 
        /* update attribute */
@@ -6321,7 +3301,7 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
 
        memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
 
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
+       pframe = (u8 *)pmgntframe->buf_addr + TXDESC_OFFSET;
        pwlanhdr = (struct ieee80211_hdr *)pframe;
 
        fctrl = &pwlanhdr->frame_control;
@@ -6338,21 +3318,20 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
        pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
 
        /* caps */
-       memcpy(pframe, rtw_get_capability23a_from_ie(pmlmeinfo->network.IEs),
-              2);
+       memcpy(pframe,
+              rtw_get_capability23a_from_ie(pmlmeinfo->network.IEs), 2);
 
        pframe += 2;
        pattrib->pktlen += 2;
 
        /* listen interval */
        /* todo: listen interval for power saving */
-       val16 = cpu_to_le16(3);
-       memcpy(pframe, (unsigned char *)&val16, 2);
+       put_unaligned_le16(3, pframe);
        pframe += 2;
        pattrib->pktlen += 2;
 
        /* SSID */
-       pframe = rtw_set_ie23a(pframe, _SSID_IE_,
+       pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID,
                               pmlmeinfo->network.Ssid.ssid_len,
                               pmlmeinfo->network.Ssid.ssid, &pattrib->pktlen);
 
@@ -6387,7 +3366,7 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
                             Handlink WSG-4000 AP */
                        if ((pmlmeinfo->network.SupportedRates[i] |
                             IEEE80211_BASIC_RATE_MASK) ==
-                           (sta_bssrate[j]|IEEE80211_BASIC_RATE_MASK)) {
+                           (sta_bssrate[j] | IEEE80211_BASIC_RATE_MASK)) {
                                /* DBG_8723A("match i = %d, j =%d\n", i, j); */
                                break;
                        }
@@ -6414,33 +3393,31 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
        }
 
        if (bssrate_len > 8) {
-               pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_, 8,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES, 8,
                                       bssrate, &pattrib->pktlen);
-               pframe = rtw_set_ie23a(pframe, _EXT_SUPPORTEDRATES_IE_,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_EXT_SUPP_RATES,
                                       (bssrate_len - 8), (bssrate + 8),
                                       &pattrib->pktlen);
        } else
-               pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES,
                                       bssrate_len, bssrate, &pattrib->pktlen);
 
        /* RSN */
-       p = rtw_get_ie23a((pmlmeinfo->network.IEs +
-                          sizeof(struct ndis_802_11_fixed_ies)), _RSN_IE_2_,
-                         &ie_len, (pmlmeinfo->network.IELength -
-                                   sizeof(struct ndis_802_11_fixed_ies)));
+       pie = pmlmeinfo->network.IEs + sizeof(struct ndis_802_11_fixed_ies);
+       pie_len = pmlmeinfo->network.IELength -
+               sizeof(struct ndis_802_11_fixed_ies);
+
+       p = cfg80211_find_ie(WLAN_EID_RSN, pie, pie_len);
        if (p)
-               pframe = rtw_set_ie23a(pframe, _RSN_IE_2_, ie_len, (p + 2),
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_RSN, p[1], p + 2,
                                       &pattrib->pktlen);
 
        /* HT caps */
        if (padapter->mlmepriv.htpriv.ht_option == true) {
-               p = rtw_get_ie23a((pmlmeinfo->network.IEs +
-                                  sizeof(struct ndis_802_11_fixed_ies)),
-                                 _HT_CAPABILITY_IE_, &ie_len,
-                                 (pmlmeinfo->network.IELength -
-                                  sizeof(struct ndis_802_11_fixed_ies)));
-               if ((p != NULL) && (!(is_ap_in_tkip23a(padapter)))) {
-                       memcpy(&pmlmeinfo->HT_caps, (p + 2),
+               p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, pie, pie_len);
+
+               if (p && !is_ap_in_tkip23a(padapter)) {
+                       memcpy(&pmlmeinfo->HT_caps, p + 2,
                               sizeof(struct HT_caps_element));
 
                        /* to disable 40M Hz support while gd_bw_40MHz_en = 0 */
@@ -6454,15 +3431,13 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
                        pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |=
                                0x000c;
 
-                       rtw23a_hal_get_hwreg(padapter, HW_VAR_RF_TYPE,
-                                            (u8 *)(&rf_type));
+                       rf_type = rtl8723a_get_rf_type(padapter);
                        /* switch (pregpriv->rf_config) */
-                       switch (rf_type)
-                       {
+                       switch (rf_type) {
                        case RF_1T1R:
-
+                               /* RX STBC One spatial stream */
                                if (pregpriv->rx_stbc)
-                                       pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);/* RX STBC One spatial stream */
+                                       pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);
 
                                memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_1R23A, 16);
                                break;
@@ -6470,18 +3445,17 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
                        case RF_2T2R:
                        case RF_1T2R:
                        default:
-
                                /* enable for 2.4/5 GHz */
-                               if ((pregpriv->rx_stbc == 0x3) ||
-                                   ((pmlmeext->cur_wireless_mode &
-                                     WIRELESS_11_24N) &&
+                               if (pregpriv->rx_stbc == 0x3 ||
+                                   (pmlmeext->cur_wireless_mode &
+                                    WIRELESS_11_24N &&
                                     /* enable for 2.4GHz */
-                                    (pregpriv->rx_stbc == 0x1)) ||
-                                   ((pmlmeext->cur_wireless_mode &
-                                     WIRELESS_11_5N) &&
-                                    (pregpriv->rx_stbc == 0x2)) ||
+                                    pregpriv->rx_stbc == 0x1) ||
+                                   (pmlmeext->cur_wireless_mode &
+                                    WIRELESS_11_5N &&
+                                    pregpriv->rx_stbc == 0x2) ||
                                    /* enable for 5GHz */
-                                   (pregpriv->wifi_spec == 1)) {
+                                   pregpriv->wifi_spec == 1) {
                                        DBG_8723A("declare supporting RX "
                                                  "STBC\n");
                                        pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0200);/* RX STBC two spatial stream */
@@ -6500,9 +3474,8 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
                        }
 #endif
 
-                       pframe = rtw_set_ie23a(pframe, _HT_CAPABILITY_IE_,
-                                              ie_len,
-                                              (u8 *)&pmlmeinfo->HT_caps,
+                       pframe = rtw_set_ie23a(pframe, WLAN_EID_HT_CAPABILITY,
+                                              p[1], (u8 *)&pmlmeinfo->HT_caps,
                                               &pattrib->pktlen);
                }
        }
@@ -6515,8 +3488,8 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
 
                switch (pIE->ElementID)
                {
-               case _VENDOR_SPECIFIC_IE_:
-                       if (!memcmp(pIE->data, RTW_WPA_OUI23A, 4) ||
+               case WLAN_EID_VENDOR_SPECIFIC:
+                       if (!memcmp(pIE->data, RTW_WPA_OUI23A_TYPE, 4) ||
                            !memcmp(pIE->data, WMM_OUI23A, 4) ||
                            !memcmp(pIE->data, WPS_OUI23A, 4)) {
                                if (!padapter->registrypriv.wifi_spec) {
@@ -6528,7 +3501,7 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
                                                pIE->Length = 14;
                                }
                                pframe = rtw_set_ie23a(pframe,
-                                                      _VENDOR_SPECIFIC_IE_,
+                                                      WLAN_EID_VENDOR_SPECIFIC,
                                                       pIE->Length, pIE->data,
                                                       &pattrib->pktlen);
                        }
@@ -6538,198 +3511,13 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
                        break;
                }
 
-               i += (pIE->Length + 2);
+               i += pIE->Length + 2;
        }
 
        if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK)
-               pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, 6,
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, 6,
                                       REALTEK_96B_IE23A, &pattrib->pktlen);
 
-#ifdef CONFIG_8723AU_P2P
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               if (pmlmepriv->p2p_assoc_req_ie &&
-                   pmlmepriv->p2p_assoc_req_ie_len>0) {
-                       memcpy(pframe, pmlmepriv->p2p_assoc_req_ie,
-                              pmlmepriv->p2p_assoc_req_ie_len);
-                       pframe += pmlmepriv->p2p_assoc_req_ie_len;
-                       pattrib->pktlen += pmlmepriv->p2p_assoc_req_ie_len;
-               }
-       } else {
-               if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
-                   !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) {
-                       /*      Should add the P2P IE in the association
-                               request frame. */
-                       /*      P2P OUI */
-
-                       p2pielen = 0;
-                       p2pie[p2pielen++] = 0x50;
-                       p2pie[p2pielen++] = 0x6F;
-                       p2pie[p2pielen++] = 0x9A;
-                       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-                       /*      Commented by Albert 20101109 */
-                       /*      According to the P2P Specification, the
-                               association request frame should contain
-                               3 P2P attributes */
-                       /*      1. P2P Capability */
-                       /*      2. Extended Listen Timing */
-                       /*      3. Device Info */
-                       /*      Commented by Albert 20110516 */
-                       /*      4. P2P Interface */
-
-                       /*      P2P Capability */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      Device Capability Bitmap, 1 byte */
-                       p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-
-                       /*      Group Capability Bitmap, 1 byte */
-                       if (pwdinfo->persistent_supported)
-                               p2pie[p2pielen++] =
-                                       P2P_GRPCAP_PERSISTENT_GROUP |
-                                       DMP_P2P_GRPCAP_SUPPORT;
-                       else
-                               p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT;
-
-                       /*      Extended Listen Timing */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      Availability Period */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-                       p2pielen += 2;
-
-                       /*      Availability Interval */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-                       p2pielen += 2;
-
-                       /*      Device Info */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-                       /*      Length: */
-                       /*      21 -> P2P Device Address (6bytes) + Config
-                               Methods (2bytes) + Primary Device
-                               Type (8bytes) */
-                       /*      + NumofSecondDevType (1byte) + WPS Device
-                               Name ID field (2bytes) + WPS Device Name
-                               Len field (2bytes) */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_le16(21 + pwdinfo->device_name_len);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      P2P Device Address */
-                       memcpy(p2pie + p2pielen,
-                              myid(&padapter->eeprompriv), ETH_ALEN);
-                       p2pielen += ETH_ALEN;
-
-                       /*      Config Method */
-                       /*      This field should be big endian.
-                               Noted by P2P specification. */
-                       if ((pwdinfo->ui_got_wps_info ==
-                            P2P_GOT_WPSINFO_PEER_DISPLAY_PIN) ||
-                           (pwdinfo->ui_got_wps_info ==
-                            P2P_GOT_WPSINFO_SELF_DISPLAY_PIN))
-                               *(u16*) (p2pie + p2pielen) =
-                                       cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY);
-                       else
-                               *(u16*) (p2pie + p2pielen) =
-                                       cpu_to_be16(WPS_CONFIG_METHOD_PBC);
-
-                       p2pielen += 2;
-
-                       /*      Primary Device Type */
-                       /*      Category ID */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-                       p2pielen += 2;
-
-                       /*      OUI */
-                       *(u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI);
-                       p2pielen += 4;
-
-                       /*      Sub Category ID */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-                       p2pielen += 2;
-
-                       /*      Number of Secondary Device Types */
-                       /*      No Secondary Device Type List */
-                       p2pie[p2pielen++] = 0x00;
-
-                       /*      Device Name */
-                       /*      Type: */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-                       p2pielen += 2;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_be16(pwdinfo->device_name_len);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       memcpy(p2pie + p2pielen, pwdinfo->device_name,
-                              pwdinfo->device_name_len);
-                       p2pielen += pwdinfo->device_name_len;
-
-                       /*      P2P Interface */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_INTERFACE;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x000D);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       memcpy(p2pie + p2pielen, pwdinfo->device_addr,
-                              ETH_ALEN);       /* P2P Device Address */
-                       p2pielen += ETH_ALEN;
-
-                       /* P2P Interface Address Count */
-                       p2pie[p2pielen++] = 1;
-
-                       memcpy(p2pie + p2pielen, pwdinfo->device_addr,
-                              ETH_ALEN);       /* P2P Interface Address List */
-                       p2pielen += ETH_ALEN;
-
-                       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_,
-                                              p2pielen, (unsigned char *)p2pie,
-                                              &pattrib->pktlen);
-
-                       /* wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe);*/
-                       /* pframe += wfdielen; */
-                       /* pattrib->pktlen += wfdielen; */
-               }
-       }
-
-       if (true == pwdinfo->wfd_info->wfd_enable) {
-               wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe);
-               pframe += wfdielen;
-               pattrib->pktlen += wfdielen;
-       } else if (pmlmepriv->wfd_assoc_req_ie != NULL &&
-                  pmlmepriv->wfd_assoc_req_ie_len > 0) {
-               /* WFD IE */
-               memcpy(pframe, pmlmepriv->wfd_assoc_req_ie,
-                      pmlmepriv->wfd_assoc_req_ie_len);
-               pattrib->pktlen += pmlmepriv->wfd_assoc_req_ie_len;
-               pframe += pmlmepriv->wfd_assoc_req_ie_len;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        pattrib->last_txcmdsz = pattrib->pktlen;
        dump_mgntframe23a(padapter, pmgntframe);
 
@@ -6741,8 +3529,7 @@ exit:
                kfree(pmlmepriv->assoc_req);
                pmlmepriv->assoc_req = kmalloc(pattrib->pktlen, GFP_ATOMIC);
                if (pmlmepriv->assoc_req) {
-                       memcpy(pmlmepriv->assoc_req, pwlanhdr,
-                              pattrib->pktlen);
+                       memcpy(pmlmepriv->assoc_req, pwlanhdr, pattrib->pktlen);
                        pmlmepriv->assoc_req_len = pattrib->pktlen;
                }
        } else
@@ -7014,20 +3801,9 @@ static int _issue_deauth23a(struct rtw_adapter *padapter, unsigned char *da,
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        int ret = _FAIL;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
 
        /* DBG_8723A("%s to "MAC_FMT"\n", __func__, MAC_ARG(da)); */
 
-#ifdef CONFIG_8723AU_P2P
-       if (!(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) &&
-           (pwdinfo->rx_invitereq_info.scan_op_ch_only)) {
-               mod_timer(&pwdinfo->reset_ch_sitesurvey,
-                         jiffies + msecs_to_jiffies(10));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
                goto exit;
 
@@ -7373,24 +4149,26 @@ static void issue_action_BSSCoexistPacket(struct rtw_adapter *padapter)
 {
        struct list_head *plist, *phead, *ptmp;
        unsigned char category, action;
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                           *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                  *fctrl;
-       struct  wlan_network    *pnetwork = NULL;
+       struct xmit_frame *pmgntframe;
+       struct pkt_attrib *pattrib;
+       u8 *pframe;
+       struct ieee80211_hdr *pwlanhdr;
+       unsigned short *fctrl;
+       struct wlan_network *pnetwork;
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
-       struct rtw_queue        *queue  = &pmlmepriv->scanned_queue;
+       struct rtw_queue *queue = &pmlmepriv->scanned_queue;
        u8 InfoContent[16] = {0};
        u8 ICS[8][15];
+       int i;
 
-       if ((pmlmepriv->num_FortyMHzIntolerant == 0) || (pmlmepriv->num_sta_no_ht == 0))
+       if (pmlmepriv->num_FortyMHzIntolerant == 0 ||
+           pmlmepriv->num_sta_no_ht == 0)
                return;
 
-       if (true == pmlmeinfo->bwmode_updated)
+       if (pmlmeinfo->bwmode_updated)
                return;
 
        DBG_8723A("%s\n", __func__);
@@ -7398,10 +4176,9 @@ static void issue_action_BSSCoexistPacket(struct rtw_adapter *padapter)
        category = WLAN_CATEGORY_PUBLIC;
        action = ACT_PUBLIC_BSSCOEXIST;
 
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-       {
+       pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
+       if (!pmgntframe)
                return;
-       }
 
        /* update attribute */
        pattrib = &pmgntframe->attrib;
@@ -7409,7 +4186,7 @@ static void issue_action_BSSCoexistPacket(struct rtw_adapter *padapter)
 
        memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
 
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
+       pframe = (u8 *)pmgntframe->buf_addr + TXDESC_OFFSET;
        pwlanhdr = (struct ieee80211_hdr *)pframe;
 
        fctrl = &pwlanhdr->frame_control;
@@ -7429,85 +4206,74 @@ static void issue_action_BSSCoexistPacket(struct rtw_adapter *padapter)
        pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
        pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
 
-       /*  */
-       if (pmlmepriv->num_FortyMHzIntolerant>0)
-       {
-               u8 iedata = 0;
-
-               iedata |= BIT(2);/* 20 MHz BSS Width Request */
-
-               pframe = rtw_set_ie23a(pframe, EID_BSSCoexistence,  1, &iedata, &pattrib->pktlen);
+       if (pmlmepriv->num_FortyMHzIntolerant > 0) {
+               u8 iedata = BIT(2);/* 20 MHz BSS Width Request */
 
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_BSS_COEX_2040, 1,
+                                      &iedata, &pattrib->pktlen);
        }
 
-       /*  */
-       memset(ICS, 0, sizeof(ICS));
-       if (pmlmepriv->num_sta_no_ht>0)
-       {
-               int i;
+       if (pmlmepriv->num_sta_no_ht <= 0)
+               goto out;
 
-               spin_lock_bh(&pmlmepriv->scanned_queue.lock);
+       memset(ICS, 0, sizeof(ICS));
 
-               phead = get_list_head(queue);
-               plist = phead->next;
+       spin_lock_bh(&pmlmepriv->scanned_queue.lock);
 
-               list_for_each_safe(plist, ptmp, phead) {
-                       int len;
-                       u8 *p;
-                       struct wlan_bssid_ex *pbss_network;
+       phead = get_list_head(queue);
+       plist = phead->next;
 
-                       pnetwork = container_of(plist, struct wlan_network,
-                                               list);
+       list_for_each_safe(plist, ptmp, phead) {
+               const u8 *p;
+               struct wlan_bssid_ex *pbss_network;
 
-                       pbss_network = &pnetwork->network;
+               pnetwork = container_of(plist, struct wlan_network, list);
 
-                       p = rtw_get_ie23a(pbss_network->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pbss_network->IELength - _FIXED_IE_LENGTH_);
-                       if ((p == NULL) || (len == 0))/* non-HT */
-                       {
-                               if ((pbss_network->Configuration.DSConfig<= 0) || (pbss_network->Configuration.DSConfig>14))
-                                       continue;
+               pbss_network = &pnetwork->network;
 
-                               ICS[0][pbss_network->Configuration.DSConfig]= 1;
+               p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
+                                    pbss_network->IEs + _FIXED_IE_LENGTH_,
+                                    pbss_network->IELength -_FIXED_IE_LENGTH_);
+               if (!p || !p[1]) { /* non-HT */
+                       if (pbss_network->Configuration.DSConfig <= 0 ||
+                           pbss_network->Configuration.DSConfig > 14)
+                               continue;
 
-                               if (ICS[0][0] == 0)
-                                       ICS[0][0] = 1;
-                       }
+                       ICS[0][pbss_network->Configuration.DSConfig] = 1;
 
+                       if (ICS[0][0] == 0)
+                               ICS[0][0] = 1;
                }
 
-               spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
+       }
 
-               for (i = 0;i<8;i++)
-               {
-                       if (ICS[i][0] == 1)
-                       {
-                               int j, k = 0;
+       spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
 
-                               InfoContent[k] = i;
-                               /* SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent, i); */
-                               k++;
+       for (i = 0; i < 8;i++) {
+               if (ICS[i][0] == 1) {
+                       int j, k = 0;
 
-                               for (j = 1;j<= 14;j++)
-                               {
-                                       if (ICS[i][j]== 1)
-                                       {
-                                               if (k<16)
-                                               {
-                                                       InfoContent[k] = j; /* channel number */
-                                                       /* SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j); */
-                                                       k++;
-                                               }
+                       InfoContent[k] = i;
+                       /* SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent, i); */
+                       k++;
+
+                       for (j = 1; j <= 14; j++) {
+                               if (ICS[i][j] == 1) {
+                                       if (k < 16) {
+                                               /* channel number */
+                                               InfoContent[k] = j;
+                                               k++;
                                        }
                                }
-
-                               pframe = rtw_set_ie23a(pframe, EID_BSSIntolerantChlReport, k, InfoContent, &pattrib->pktlen);
-
                        }
 
+                       pframe = rtw_set_ie23a(pframe,
+                                              EID_BSSIntolerantChlReport, k,
+                                              InfoContent, &pattrib->pktlen);
                }
-
        }
 
+out:
        pattrib->last_txcmdsz = pattrib->pktlen;
 
        dump_mgntframe23a(padapter, pmgntframe);
@@ -7555,21 +4321,21 @@ unsigned int send_delba23a(struct rtw_adapter *padapter, u8 initiator, u8 *addr)
 
 unsigned int send_beacon23a(struct rtw_adapter *padapter)
 {
-       u8      bxmitok = false;
+       bool    bxmitok;
        int     issue = 0;
        int poll = 0;
        unsigned long start = jiffies;
        unsigned int passing_time;
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BCN_VALID, NULL);
+       rtl8723a_bcn_valid(padapter);
        do {
                issue_beacon23a(padapter, 100);
                issue++;
                do {
                        yield();
-                       rtw23a_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8 *)(&bxmitok));
+                       bxmitok = rtl8723a_get_bcn_valid(padapter);
                        poll++;
-               } while ((poll%10)!= 0 && false == bxmitok &&
+               } while ((poll % 10) != 0 && bxmitok == false &&
                         !padapter->bSurpriseRemoved &&
                         !padapter->bDriverStopped);
 
@@ -7615,46 +4381,22 @@ bool IsLegal5GChannel(struct rtw_adapter *Adapter, u8 channel)
 
 void site_survey23a(struct rtw_adapter *padapter)
 {
-       unsigned char survey_channel = 0, val8;
+       unsigned char survey_channel = 0;
        enum rt_scan_type ScanType = SCAN_PASSIVE;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
-       u32 initialgain = 0;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) ||
-           (pwdinfo->p2p_info.scan_op_ch_only)) {
-               if (pwdinfo->rx_invitereq_info.scan_op_ch_only)
-                       survey_channel = pwdinfo->rx_invitereq_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx];
-               else
-                       survey_channel = pwdinfo->p2p_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx];
-               ScanType = SCAN_ACTIVE;
-       } else if (rtw_p2p_findphase_ex_is_social(pwdinfo)) {
-               /* The driver is in the find phase, it should go through the social channel. */
-               int ch_set_idx;
-               survey_channel = pwdinfo->social_chan[pmlmeext->sitesurvey_res.channel_idx];
-               ch_set_idx = rtw_ch_set_search_ch23a(pmlmeext->channel_set, survey_channel);
-               if (ch_set_idx >= 0)
-                       ScanType = pmlmeext->channel_set[ch_set_idx].ScanType;
-               else
-                       ScanType = SCAN_ACTIVE;
-       } else
-#endif /* CONFIG_8723AU_P2P */
-       {
-               struct rtw_ieee80211_channel *ch;
-               if (pmlmeext->sitesurvey_res.channel_idx < pmlmeext->sitesurvey_res.ch_num) {
-                       ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx];
-                       survey_channel = ch->hw_value;
-                       ScanType = (ch->flags & IEEE80211_CHAN_NO_IR) ? SCAN_PASSIVE : SCAN_ACTIVE;
-}
+       struct rtw_ieee80211_channel *ch;
+
+       if (pmlmeext->sitesurvey_res.channel_idx <
+           pmlmeext->sitesurvey_res.ch_num) {
+               ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx];
+               survey_channel = ch->hw_value;
+               ScanType = (ch->flags & IEEE80211_CHAN_NO_IR) ?
+                       SCAN_PASSIVE : SCAN_ACTIVE;
        }
 
        if (survey_channel != 0) {
                /* PAUSE 4-AC Queue when site_survey23a */
-               /* rtw23a_hal_get_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */
-               /* val8 |= 0x0f; */
-               /* rtw_hal_set_hwreg23a(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */
                if (pmlmeext->sitesurvey_res.channel_idx == 0)
                        set_channel_bwmode23a(padapter, survey_channel,
                                              HAL_PRIME_CHNL_OFFSET_DONT_CARE,
@@ -7664,276 +4406,220 @@ void site_survey23a(struct rtw_adapter *padapter)
 
                if (ScanType == SCAN_ACTIVE) /* obey the channel plan setting... */
                {
-#ifdef CONFIG_8723AU_P2P
-                       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) ||
-                               rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)
-                       )
-                       {
-                               issue23a_probereq_p2p(padapter, NULL);
-                               issue23a_probereq_p2p(padapter, NULL);
-                               issue23a_probereq_p2p(padapter, NULL);
-                       }
-                       else
-#endif /* CONFIG_8723AU_P2P */
-                       {
-                               int i;
-                               for (i = 0;i<RTW_SSID_SCAN_AMOUNT;i++) {
-                                       if (pmlmeext->sitesurvey_res.ssid[i].ssid_len) {
-                                               /* todo: to issue two probe req??? */
-                                               issue_probereq23a(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL);
-                                               /* msleep(SURVEY_TO>>1); */
-                                               issue_probereq23a(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL);
-                                       }
-                               }
-
-                               if (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
+                       int i;
+                       for (i = 0;i<RTW_SSID_SCAN_AMOUNT;i++) {
+                               if (pmlmeext->sitesurvey_res.ssid[i].ssid_len) {
                                        /* todo: to issue two probe req??? */
-                                       issue_probereq23a(padapter, NULL, NULL);
+                                       issue_probereq23a(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL);
                                        /* msleep(SURVEY_TO>>1); */
-                                       issue_probereq23a(padapter, NULL, NULL);
+                                       issue_probereq23a(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL);
                                }
                        }
+
+                       if (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
+                               /* todo: to issue two probe req??? */
+                               issue_probereq23a(padapter, NULL, NULL);
+                               /* msleep(SURVEY_TO>>1); */
+                               issue_probereq23a(padapter, NULL, NULL);
+                       }
                }
 
                set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
        } else {
-
                /*      channel number is 0 or this channel is not valid. */
+               pmlmeext->sitesurvey_res.state = SCAN_COMPLETE;
 
+               /* switch back to the original channel */
 
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH))
-               {
-                       if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) || (pwdinfo->p2p_info.scan_op_ch_only))
-                       {
-                               /*      Set the find_phase_state_exchange_cnt to P2P_FINDPHASE_EX_CNT. */
-                               /*      This will let the following flow to run the scanning end. */
-                               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);
-                       }
-               }
-
-               if (rtw_p2p_findphase_ex_is_needed(pwdinfo))
-               {
-                       /*      Set the P2P State to the listen state of find phase and set the current channel to the listen channel */
-                       set_channel_bwmode23a(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
-                       rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN);
-                       pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
-
-                       initialgain = 0xff; /* restore RX GAIN */
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
-                       /* turn on dynamic functions */
-                       Restore_DM_Func_Flag23a(padapter);
-                       /* Switch_DM_Func23a(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, true); */
-
-                       mod_timer(&pwdinfo->find_phase_timer, jiffies +
-                                 msecs_to_jiffies(pwdinfo->listen_dwell * 100));
-               } else
-#endif /* CONFIG_8723AU_P2P */
-               {
-#ifdef CONFIG_8723AU_P2P
-                       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH))
-                               rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-                       rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
-#endif /* CONFIG_8723AU_P2P */
-
-                       pmlmeext->sitesurvey_res.state = SCAN_COMPLETE;
-
-                       /* switch back to the original channel */
-
-                       set_channel_bwmode23a(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
-
-                       /* flush 4-AC Queue after site_survey23a */
-                       /* val8 = 0; */
-                       /* rtw_hal_set_hwreg23a(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */
-
-                       /* config MSR */
-                       Set_MSR23a(padapter, (pmlmeinfo->state & 0x3));
+               set_channel_bwmode23a(padapter, pmlmeext->cur_channel,
+                                     pmlmeext->cur_ch_offset,
+                                     pmlmeext->cur_bwmode);
 
-                       initialgain = 0xff; /* restore RX GAIN */
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
-                       /* turn on dynamic functions */
-                       Restore_DM_Func_Flag23a(padapter);
-                       /* Switch_DM_Func23a(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); */
+               /* flush 4-AC Queue after site_survey23a */
+               /* val8 = 0; */
 
-                       if (is_client_associated_to_ap23a(padapter) == true)
-                       {
-                               issue_nulldata23a(padapter, NULL, 0, 3, 500);
+               /* config MSR */
+               Set_MSR23a(padapter, (pmlmeinfo->state & 0x3));
 
-                       }
+               /* restore RX GAIN */
+               rtl8723a_set_initial_gain(padapter, 0xff);
+               /* turn on dynamic functions */
+               rtl8723a_odm_support_ability_restore(padapter);
 
-                       val8 = 0; /* survey done */
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
+               if (is_client_associated_to_ap23a(padapter) == true)
+                       issue_nulldata23a(padapter, NULL, 0, 3, 500);
 
-                       report_surveydone_event23a(padapter);
+               rtl8723a_mlme_sitesurvey(padapter, 0);
 
-                       pmlmeext->chan_scan_time = SURVEY_TO;
-                       pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
+               report_surveydone_event23a(padapter);
 
-                       issue_action_BSSCoexistPacket(padapter);
-                       issue_action_BSSCoexistPacket(padapter);
-                       issue_action_BSSCoexistPacket(padapter);
+               pmlmeext->chan_scan_time = SURVEY_TO;
+               pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
 
-               }
+               issue_action_BSSCoexistPacket(padapter);
+               issue_action_BSSCoexistPacket(padapter);
+               issue_action_BSSCoexistPacket(padapter);
        }
 
        return;
 }
 
 /* collect bss info from Beacon and Probe request/response frames. */
-u8 collect_bss_info23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame, struct wlan_bssid_ex *bssid)
+u8 collect_bss_info23a(struct rtw_adapter *padapter,
+                      struct recv_frame *precv_frame,
+                      struct wlan_bssid_ex *bssid)
 {
-       int     i;
-       u32     len;
-       u8      *p;
-       u16     val16;
+       int i, length;
+       const u8 *p;
        struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8      *pframe = skb->data;
-       u32     packet_len = skb->len;
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
+       int packet_len = skb->len;
        u8 ie_offset;
-       struct registry_priv    *pregistrypriv = &padapter->registrypriv;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct registry_priv *pregistrypriv = &padapter->registrypriv;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
+       u16 capab_info;
 
-       len = packet_len - sizeof(struct ieee80211_hdr_3addr);
+       length = packet_len - sizeof(struct ieee80211_hdr_3addr);
 
-       if (len > MAX_IE_SZ)
-       {
+       if (length > MAX_IE_SZ) {
                /* DBG_8723A("IE too long for survey event\n"); */
                return _FAIL;
        }
 
        memset(bssid, 0, sizeof(struct wlan_bssid_ex));
 
-       if (ieee80211_is_beacon(hdr->frame_control)) {
+       if (ieee80211_is_beacon(mgmt->frame_control)) {
                bssid->reserved = 1;
-               ie_offset = _BEACON_IE_OFFSET_;
+               ie_offset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
+               capab_info = mgmt->u.beacon.capab_info;
+       } else  if (ieee80211_is_probe_req(mgmt->frame_control)) {
+               ie_offset = offsetof(struct ieee80211_mgmt,
+                                    u.probe_req.variable);
+               bssid->reserved = 2;
+               capab_info = 0;
+       } else if (ieee80211_is_probe_resp(mgmt->frame_control)) {
+               ie_offset = offsetof(struct ieee80211_mgmt,
+                                    u.probe_resp.variable);
+               bssid->reserved = 3;
+               capab_info = mgmt->u.probe_resp.capab_info;
        } else {
-               /*  FIXME : more type */
-               if (ieee80211_is_probe_req(hdr->frame_control)) {
-                       ie_offset = _PROBEREQ_IE_OFFSET_;
-                       bssid->reserved = 2;
-               } else if (ieee80211_is_probe_resp(hdr->frame_control)) {
-                       ie_offset = _PROBERSP_IE_OFFSET_;
-                       bssid->reserved = 3;
-               } else {
-                       bssid->reserved = 0;
-                       ie_offset = _FIXED_IE_LENGTH_;
-               }
+               bssid->reserved = 0;
+               ie_offset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
+               capab_info = mgmt->u.beacon.capab_info;
        }
+       ie_offset -= offsetof(struct ieee80211_mgmt, u);
 
-       bssid->Length = sizeof(struct wlan_bssid_ex) - MAX_IE_SZ + len;
+       bssid->Length = sizeof(struct wlan_bssid_ex) - MAX_IE_SZ + length;
 
        /* below is to copy the information element */
-       bssid->IELength = len;
-       memcpy(bssid->IEs, (pframe + sizeof(struct ieee80211_hdr_3addr)), bssid->IELength);
+       bssid->IELength = length;
+       memcpy(bssid->IEs, &mgmt->u, bssid->IELength);
 
        /* get the signal strength */
-       bssid->Rssi = precv_frame->attrib.phy_info.RecvSignalPower; /*  in dBM.raw data */
-       bssid->PhyInfo.SignalQuality = precv_frame->attrib.phy_info.SignalQuality;/* in percentage */
-       bssid->PhyInfo.SignalStrength = precv_frame->attrib.phy_info.SignalStrength;/* in percentage */
+       /*  in dBM.raw data */
+       bssid->Rssi = precv_frame->attrib.phy_info.RecvSignalPower;
+       bssid->PhyInfo.SignalQuality =
+               precv_frame->attrib.phy_info.SignalQuality;/* in percentage */
+       bssid->PhyInfo.SignalStrength =
+               precv_frame->attrib.phy_info.SignalStrength;/* in percentage */
 
        /*  checking SSID */
-       if ((p = rtw_get_ie23a(bssid->IEs + ie_offset, _SSID_IE_, &len, bssid->IELength - ie_offset)) == NULL)
-       {
+       p = cfg80211_find_ie(WLAN_EID_SSID, bssid->IEs + ie_offset,
+                            bssid->IELength - ie_offset);
+
+       if (!p) {
                DBG_8723A("marc: cannot find SSID for survey event\n");
                return _FAIL;
        }
 
-       if (*(p + 1)) {
-               if (len > IEEE80211_MAX_SSID_LEN) {
-                       DBG_8723A("%s()-%d: IE too long (%d) for survey "
-                                 "event\n", __func__, __LINE__, len);
-                       return _FAIL;
-               }
-               memcpy(bssid->Ssid.ssid, (p + 2), *(p + 1));
-               bssid->Ssid.ssid_len = *(p + 1);
-       } else {
-               bssid->Ssid.ssid_len = 0;
+       if (p[1] > IEEE80211_MAX_SSID_LEN) {
+               DBG_8723A("%s()-%d: IE too long (%d) for survey "
+                         "event\n", __func__, __LINE__, p[1]);
+               return _FAIL;
        }
+       memcpy(bssid->Ssid.ssid, p + 2, p[1]);
+       bssid->Ssid.ssid_len = p[1];
 
        memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX);
 
        /* checking rate info... */
        i = 0;
-       p = rtw_get_ie23a(bssid->IEs + ie_offset, _SUPPORTEDRATES_IE_, &len, bssid->IELength - ie_offset);
-       if (p != NULL)
-       {
-               if (len > NDIS_802_11_LENGTH_RATES_EX)
-               {
-                       DBG_8723A("%s()-%d: IE too long (%d) for survey event\n", __func__, __LINE__, len);
+       p = cfg80211_find_ie(WLAN_EID_SUPP_RATES, bssid->IEs + ie_offset,
+                            bssid->IELength - ie_offset);
+       if (p) {
+               if (p[1] > NDIS_802_11_LENGTH_RATES_EX) {
+                       DBG_8723A("%s()-%d: IE too long (%d) for survey "
+                                 "event\n", __func__, __LINE__, p[1]);
                        return _FAIL;
                }
-               memcpy(bssid->SupportedRates, (p + 2), len);
-               i = len;
+               memcpy(bssid->SupportedRates, p + 2, p[1]);
+               i = p[1];
        }
 
-       p = rtw_get_ie23a(bssid->IEs + ie_offset, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - ie_offset);
-       if (p != NULL)
-       {
-               if (len > (NDIS_802_11_LENGTH_RATES_EX-i))
-               {
-                       DBG_8723A("%s()-%d: IE too long (%d) for survey event\n", __func__, __LINE__, len);
+       p = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, bssid->IEs + ie_offset,
+                            bssid->IELength - ie_offset);
+       if (p) {
+               if (p[1] > (NDIS_802_11_LENGTH_RATES_EX-i)) {
+                       DBG_8723A("%s()-%d: IE too long (%d) for survey "
+                                 "event\n", __func__, __LINE__, p[1]);
                        return _FAIL;
                }
-               memcpy(bssid->SupportedRates + i, (p + 2), len);
+               memcpy(bssid->SupportedRates + i, p + 2, p[1]);
        }
 
-       /* todo: */
-       {
-               bssid->NetworkTypeInUse = Ndis802_11OFDM24;
-       }
+       bssid->NetworkTypeInUse = Ndis802_11OFDM24;
 
        if (bssid->IELength < 12)
                return _FAIL;
 
        /*  Checking for DSConfig */
-       p = rtw_get_ie23a(bssid->IEs + ie_offset, _DSSET_IE_, &len, bssid->IELength - ie_offset);
+       p = cfg80211_find_ie(WLAN_EID_DS_PARAMS, bssid->IEs + ie_offset,
+                            bssid->IELength - ie_offset);
 
        bssid->Configuration.DSConfig = 0;
        bssid->Configuration.Length = 0;
 
-       if (p)
-       {
-               bssid->Configuration.DSConfig = *(p + 2);
-       }
-       else
-       {/*  In 5G, some ap do not have DSSET IE */
+       if (p) {
+               bssid->Configuration.DSConfig = p[2];
+       } else {/*  In 5G, some ap do not have DSSET IE */
                /*  checking HT info for channel */
-               p = rtw_get_ie23a(bssid->IEs + ie_offset, _HT_ADD_INFO_IE_, &len, bssid->IELength - ie_offset);
-               if (p)
-               {
-                       struct HT_info_element *HT_info = (struct HT_info_element *)(p + 2);
-                       bssid->Configuration.DSConfig = HT_info->primary_channel;
-               }
-               else
-               { /*  use current channel */
-                       bssid->Configuration.DSConfig = rtw_get_oper_ch23a(padapter);
+               p = cfg80211_find_ie(WLAN_EID_HT_OPERATION,
+                                    bssid->IEs + ie_offset,
+                                    bssid->IELength - ie_offset);
+               if (p) {
+                       struct HT_info_element *HT_info =
+                               (struct HT_info_element *)(p + 2);
+                       bssid->Configuration.DSConfig =
+                               HT_info->primary_channel;
+               } else { /*  use current channel */
+                       bssid->Configuration.DSConfig =
+                               rtw_get_oper_ch23a(padapter);
                }
        }
 
-       if (ieee80211_is_probe_req(hdr->frame_control)) {
+       if (ieee80211_is_probe_req(mgmt->frame_control)) {
                /*  FIXME */
                bssid->InfrastructureMode = Ndis802_11Infrastructure;
-               ether_addr_copy(bssid->MacAddress, hdr->addr2);
+               ether_addr_copy(bssid->MacAddress, mgmt->sa);
                bssid->Privacy = 1;
                return _SUCCESS;
        }
 
-       memcpy(&bssid->Configuration.BeaconPeriod, rtw_get_beacon_interval23a_from_ie(bssid->IEs), 2);
-       bssid->Configuration.BeaconPeriod = le32_to_cpu(bssid->Configuration.BeaconPeriod);
-
-       val16 = rtw_get_capability23a(bssid);
+       memcpy(&bssid->Configuration.BeaconPeriod,
+              rtw_get_beacon_interval23a_from_ie(bssid->IEs), 2);
+       bssid->Configuration.BeaconPeriod =
+               le32_to_cpu(bssid->Configuration.BeaconPeriod);
 
-       if (val16 & BIT(0)) {
+       if (capab_info & BIT(0)) {
                bssid->InfrastructureMode = Ndis802_11Infrastructure;
-               ether_addr_copy(bssid->MacAddress, hdr->addr2);
+               ether_addr_copy(bssid->MacAddress, mgmt->sa);
        } else {
                bssid->InfrastructureMode = Ndis802_11IBSS;
-               ether_addr_copy(bssid->MacAddress, hdr->addr3);
+               ether_addr_copy(bssid->MacAddress, mgmt->bssid);
        }
 
-       if (val16 & BIT(4))
+       if (capab_info & BIT(4))
                bssid->Privacy = 1;
        else
                bssid->Privacy = 0;
@@ -7941,21 +4627,21 @@ u8 collect_bss_info23a(struct rtw_adapter *padapter, struct recv_frame *precv_fr
        bssid->Configuration.ATIMWindow = 0;
 
        /* 20/40 BSS Coexistence check */
-       if ((pregistrypriv->wifi_spec == 1) && (false == pmlmeinfo->bwmode_updated))
-       {
+       if (pregistrypriv->wifi_spec == 1 &&
+           pmlmeinfo->bwmode_updated == false) {
                struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 
-               p = rtw_get_ie23a(bssid->IEs + ie_offset, _HT_CAPABILITY_IE_, &len, bssid->IELength - ie_offset);
-               if (p && len > 0) {
-                       struct HT_caps_element  *pHT_caps;
-                       pHT_caps = (struct HT_caps_element      *)(p + 2);
+               p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
+                                    bssid->IEs + ie_offset,
+                                    bssid->IELength - ie_offset);
+               if (p && p[1] > 0) {
+                       struct HT_caps_element *pHT_caps;
+                       pHT_caps = (struct HT_caps_element *)(p + 2);
 
                        if (pHT_caps->u.HT_cap_element.HT_caps_info & BIT(14))
                                pmlmepriv->num_FortyMHzIntolerant++;
                } else
-               {
                        pmlmepriv->num_sta_no_ht++;
-               }
        }
 
 
@@ -7969,8 +4655,6 @@ u8 collect_bss_info23a(struct rtw_adapter *padapter, struct recv_frame *precv_fr
 void start_create_ibss23a(struct rtw_adapter* padapter)
 {
        unsigned short  caps;
-       u8      val8;
-       u8      join_type;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *pnetwork = &pmlmeinfo->network;
@@ -7983,10 +4667,8 @@ void start_create_ibss23a(struct rtw_adapter* padapter)
        /* udpate capability */
        caps = rtw_get_capability23a(pnetwork);
        update_capinfo23a(padapter, caps);
-       if (caps&cap_IBSS)/* adhoc master */
-       {
-               val8 = 0xcf;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
+       if (caps&cap_IBSS) {    /* adhoc master */
+               rtl8723a_set_sec_cfg(padapter, 0xcf);
 
                /* switch channel */
                /* SelectChannel23a(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE); */
@@ -8008,9 +4690,8 @@ void start_create_ibss23a(struct rtw_adapter* padapter)
                }
                else
                {
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress);
-                       join_type = 0;
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
+                       hw_var_set_bssid(padapter, padapter->registrypriv.dev_network.MacAddress);
+                       hw_var_set_mlme_join(padapter, 0);
 
                        report_join_res23a(padapter, 1);
                        pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
@@ -8047,9 +4728,10 @@ void start_clnt_join23a(struct rtw_adapter* padapter)
 
                Set_MSR23a(padapter, WIFI_FW_STATION_STATE);
 
-               val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;
+               val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) ?
+                       0xcc: 0xcf;
 
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
+               rtl8723a_set_sec_cfg(padapter, val8);
 
                /* switch channel */
                /* set_channel_bwmode23a(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); */
@@ -8062,12 +4744,10 @@ void start_clnt_join23a(struct rtw_adapter* padapter)
                          msecs_to_jiffies((REAUTH_TO * REAUTH_LIMIT) + (REASSOC_TO*REASSOC_LIMIT) + beacon_timeout));
                pmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE;
        }
-       else if (caps&cap_IBSS) /* adhoc client */
-       {
+       else if (caps&cap_IBSS) {       /* adhoc client */
                Set_MSR23a(padapter, WIFI_FW_ADHOC_STATE);
 
-               val8 = 0xcf;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
+               rtl8723a_set_sec_cfg(padapter, 0xcf);
 
                /* switch channel */
                set_channel_bwmode23a(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
@@ -8158,7 +4838,8 @@ unsigned int receive_disconnect23a(struct rtw_adapter *padapter, unsigned char *
        return _SUCCESS;
 }
 
-static void process_80211d(struct rtw_adapter *padapter, struct wlan_bssid_ex *bssid)
+static void process_80211d(struct rtw_adapter *padapter,
+                          struct wlan_bssid_ex *bssid)
 {
        struct registry_priv *pregistrypriv;
        struct mlme_ext_priv *pmlmeext;
@@ -8171,10 +4852,8 @@ static void process_80211d(struct rtw_adapter *padapter, struct wlan_bssid_ex *b
 
        /*  Adjust channel plan by AP Country IE */
        if (pregistrypriv->enable80211d &&
-               (!pmlmeext->update_channel_plan_by_ap_done))
-       {
-               u8 *ie, *p;
-               u32 len;
+           !pmlmeext->update_channel_plan_by_ap_done) {
+               const u8 *ie, *p;
                struct rt_channel_plan chplan_ap;
                struct rt_channel_info chplan_sta[MAX_CHANNEL_NUM];
                u8 country[4];
@@ -8182,31 +4861,34 @@ static void process_80211d(struct rtw_adapter *padapter, struct wlan_bssid_ex *b
                u8 noc; /*  number of channel */
                u8 j, k;
 
-               ie = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, _COUNTRY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
-               if (!ie) return;
-               if (len < 6) return;
+               ie = cfg80211_find_ie(WLAN_EID_COUNTRY,
+                                     bssid->IEs + _FIXED_IE_LENGTH_,
+                                     bssid->IELength - _FIXED_IE_LENGTH_);
+               if (!ie || ie[1] < IEEE80211_COUNTRY_IE_MIN_LEN)
+                       return;
 
                ie += 2;
                p = ie;
-               ie += len;
+               ie += ie[1];
 
-               memset(country, 0, 4);
                memcpy(country, p, 3);
+               country[3] = '\0';
+
                p += 3;
                RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,
-                               ("%s: 802.11d country =%s\n", __func__, country));
+                        ("%s: 802.11d country =%s\n", __func__, country));
 
                i = 0;
-               while ((ie - p) >= 3)
-               {
+               while ((ie - p) >= 3) {
                        fcn = *(p++);
                        noc = *(p++);
                        p++;
 
-                       for (j = 0; j < noc; j++)
-                       {
-                               if (fcn <= 14) channel = fcn + j; /*  2.4 GHz */
-                               else channel = fcn + j*4; /*  5 GHz */
+                       for (j = 0; j < noc; j++) {
+                               if (fcn <= 14)
+                                       channel = fcn + j; /*  2.4 GHz */
+                               else
+                                       channel = fcn + j * 4; /*  5 GHz */
 
                                chplan_ap.Channel[i++] = channel;
                        }
@@ -8220,45 +4902,55 @@ static void process_80211d(struct rtw_adapter *padapter, struct wlan_bssid_ex *b
                i = j = k = 0;
                if (pregistrypriv->wireless_mode & WIRELESS_11G) {
                        do {
-                               if ((i == MAX_CHANNEL_NUM) ||
-                                       (chplan_sta[i].ChannelNum == 0) ||
-                                       (chplan_sta[i].ChannelNum > 14))
+                               if (i == MAX_CHANNEL_NUM ||
+                                   chplan_sta[i].ChannelNum == 0 ||
+                                   chplan_sta[i].ChannelNum > 14)
                                        break;
 
-                               if ((j == chplan_ap.Len) || (chplan_ap.Channel[j] > 14))
+                               if (j == chplan_ap.Len ||
+                                   chplan_ap.Channel[j] > 14)
                                        break;
 
-                               if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j]) {
-                                       chplan_new[k].ChannelNum = chplan_ap.Channel[j];
+                               if (chplan_sta[i].ChannelNum ==
+                                   chplan_ap.Channel[j]) {
+                                       chplan_new[k].ChannelNum =
+                                               chplan_ap.Channel[j];
                                        chplan_new[k].ScanType = SCAN_ACTIVE;
                                        i++;
                                        j++;
                                        k++;
-                               } else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j]) {
-                                       chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
-                                       chplan_new[k].ScanType = SCAN_PASSIVE;
+                               } else if (chplan_sta[i].ChannelNum <
+                                          chplan_ap.Channel[j]) {
+                                       chplan_new[k].ChannelNum =
+                                               chplan_sta[i].ChannelNum;
+                                       chplan_new[k].ScanType =
+                                               SCAN_PASSIVE;
                                        i++;
                                        k++;
-                               } else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j]) {
-                                       chplan_new[k].ChannelNum = chplan_ap.Channel[j];
-                                       chplan_new[k].ScanType = SCAN_ACTIVE;
+                               } else if (chplan_sta[i].ChannelNum >
+                                          chplan_ap.Channel[j]) {
+                                       chplan_new[k].ChannelNum =
+                                               chplan_ap.Channel[j];
+                                       chplan_new[k].ScanType =
+                                               SCAN_ACTIVE;
                                        j++;
                                        k++;
                                }
                        } while (1);
 
                        /*  change AP not support channel to Passive scan */
-                       while ((i < MAX_CHANNEL_NUM) &&
-                               (chplan_sta[i].ChannelNum != 0) &&
-                               (chplan_sta[i].ChannelNum <= 14)) {
-                               chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
+                       while (i < MAX_CHANNEL_NUM &&
+                              chplan_sta[i].ChannelNum != 0 &&
+                              chplan_sta[i].ChannelNum <= 14) {
+                               chplan_new[k].ChannelNum =
+                                       chplan_sta[i].ChannelNum;
                                chplan_new[k].ScanType = SCAN_PASSIVE;
                                i++;
                                k++;
                        }
 
                        /*  add channel AP supported */
-                       while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) {
+                       while (j < chplan_ap.Len && chplan_ap.Channel[j] <= 14){
                                chplan_new[k].ChannelNum = chplan_ap.Channel[j];
                                chplan_new[k].ScanType = SCAN_ACTIVE;
                                j++;
@@ -8266,49 +4958,50 @@ static void process_80211d(struct rtw_adapter *padapter, struct wlan_bssid_ex *b
                        }
                } else {
                        /*  keep original STA 2.4G channel plan */
-                       while ((i < MAX_CHANNEL_NUM) &&
-                               (chplan_sta[i].ChannelNum != 0) &&
-                               (chplan_sta[i].ChannelNum <= 14)) {
-                               chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
+                       while (i < MAX_CHANNEL_NUM &&
+                              chplan_sta[i].ChannelNum != 0 &&
+                              chplan_sta[i].ChannelNum <= 14) {
+                               chplan_new[k].ChannelNum =
+                                       chplan_sta[i].ChannelNum;
                                chplan_new[k].ScanType = chplan_sta[i].ScanType;
                                i++;
                                k++;
                        }
 
                        /*  skip AP 2.4G channel plan */
-                       while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) {
+                       while (j < chplan_ap.Len && chplan_ap.Channel[j] <= 14)
                                j++;
-                       }
                }
 
                if (pregistrypriv->wireless_mode & WIRELESS_11A) {
                        do {
-                               if ((i == MAX_CHANNEL_NUM) ||
-                                   (chplan_sta[i].ChannelNum == 0))
+                               if (i == MAX_CHANNEL_NUM ||
+                                   chplan_sta[i].ChannelNum == 0)
                                        break;
 
-                               if ((j == chplan_ap.Len) || (chplan_ap.Channel[j] == 0))
+                               if (j == chplan_ap.Len ||
+                                   chplan_ap.Channel[j] == 0)
                                        break;
 
-                               if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j])
-                               {
-                                       chplan_new[k].ChannelNum = chplan_ap.Channel[j];
+                               if (chplan_sta[i].ChannelNum ==
+                                   chplan_ap.Channel[j]) {
+                                       chplan_new[k].ChannelNum =
+                                               chplan_ap.Channel[j];
                                        chplan_new[k].ScanType = SCAN_ACTIVE;
                                        i++;
                                        j++;
                                        k++;
-                               }
-                               else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j])
-                               {
-                                       chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
-/*                                     chplan_new[k].ScanType = chplan_sta[i].ScanType; */
+                               } else if (chplan_sta[i].ChannelNum <
+                                          chplan_ap.Channel[j]) {
+                                       chplan_new[k].ChannelNum =
+                                               chplan_sta[i].ChannelNum;
                                        chplan_new[k].ScanType = SCAN_PASSIVE;
                                        i++;
                                        k++;
-                               }
-                               else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j])
-                               {
-                                       chplan_new[k].ChannelNum = chplan_ap.Channel[j];
+                               } else if (chplan_sta[i].ChannelNum >
+                                          chplan_ap.Channel[j]) {
+                                       chplan_new[k].ChannelNum =
+                                               chplan_ap.Channel[j];
                                        chplan_new[k].ScanType = SCAN_ACTIVE;
                                        j++;
                                        k++;
@@ -8316,15 +5009,17 @@ static void process_80211d(struct rtw_adapter *padapter, struct wlan_bssid_ex *b
                        } while (1);
 
                        /*  change AP not support channel to Passive scan */
-                       while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) {
-                               chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
+                       while (i < MAX_CHANNEL_NUM &&
+                              chplan_sta[i].ChannelNum != 0) {
+                               chplan_new[k].ChannelNum =
+                                       chplan_sta[i].ChannelNum;
                                chplan_new[k].ScanType = SCAN_PASSIVE;
                                i++;
                                k++;
                        }
 
                        /*  add channel AP supported */
-                       while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] != 0)) {
+                       while (j < chplan_ap.Len && chplan_ap.Channel[j] != 0) {
                                chplan_new[k].ChannelNum = chplan_ap.Channel[j];
                                chplan_new[k].ScanType = SCAN_ACTIVE;
                                j++;
@@ -8332,8 +5027,10 @@ static void process_80211d(struct rtw_adapter *padapter, struct wlan_bssid_ex *b
                        }
                } else {
                        /*  keep original STA 5G channel plan */
-                       while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) {
-                               chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
+                       while (i < MAX_CHANNEL_NUM &&
+                              chplan_sta[i].ChannelNum != 0) {
+                               chplan_new[k].ChannelNum =
+                                       chplan_sta[i].ChannelNum;
                                chplan_new[k].ScanType = chplan_sta[i].ScanType;
                                i++;
                                k++;
@@ -8346,18 +5043,19 @@ static void process_80211d(struct rtw_adapter *padapter, struct wlan_bssid_ex *b
        channel = bssid->Configuration.DSConfig;
        chplan_new = pmlmeext->channel_set;
        i = 0;
-       while ((i < MAX_CHANNEL_NUM) && (chplan_new[i].ChannelNum != 0)) {
-               if (chplan_new[i].ChannelNum == channel)
-               {
+       while (i < MAX_CHANNEL_NUM && chplan_new[i].ChannelNum != 0) {
+               if (chplan_new[i].ChannelNum == channel) {
                        if (chplan_new[i].ScanType == SCAN_PASSIVE) {
-                               /* 5G Bnad 2, 3 (DFS) doesn't change to active scan */
+                               /* 5G Bnad 2, 3 (DFS) doesn't change
+                                  to active scan */
                                if (channel >= 52 && channel <= 144)
                                        break;
 
                                chplan_new[i].ScanType = SCAN_ACTIVE;
                                RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,
-                                                ("%s: change channel %d scan type from passive to active\n",
-                                                 __func__, channel));
+                                        ("%s: change channel %d scan type "
+                                         "from passive to active\n",
+                                         __func__, channel));
                        }
                        break;
                }
@@ -8691,17 +5389,14 @@ void mlmeext_joinbss_event_callback23a(struct rtw_adapter *padapter, int join_re
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
        struct sta_priv         *pstapriv = &padapter->stapriv;
-       u8      join_type;
-       u16 media_status;
 
-       if (join_res < 0)
-       {
-               join_type = 1;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_BSSID, null_addr);
+       if (join_res < 0) {
+               hw_var_set_mlme_join(padapter, 1);
+               hw_var_set_bssid(padapter, null_addr);
 
                /* restore to initial setting. */
-               update_tx_basic_rate23a(padapter, padapter->registrypriv.wireless_mode);
+               update_tx_basic_rate23a(padapter,
+                                       padapter->registrypriv.wireless_mode);
 
                goto exit_mlmeext_joinbss_event_callback23a;
        }
@@ -8719,15 +5414,15 @@ void mlmeext_joinbss_event_callback23a(struct rtw_adapter *padapter, int join_re
        }
 
        /* turn on dynamic functions */
-       Switch_DM_Func23a(padapter, DYNAMIC_ALL_FUNC_ENABLE, true);
+       rtl8723a_odm_support_ability_set(padapter, DYNAMIC_ALL_FUNC_ENABLE);
 
        /*  update IOT-releated issue */
        update_IOT_info23a(padapter);
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates);
+       HalSetBrateCfg23a(padapter, cur_network->SupportedRates);
 
        /* BCN interval */
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pmlmeinfo->bcn_interval));
+       rtl8723a_set_beacon_interval(padapter, pmlmeinfo->bcn_interval);
 
        /* udpate capability */
        update_capinfo23a(padapter, pmlmeinfo->capability);
@@ -8752,18 +5447,13 @@ void mlmeext_joinbss_event_callback23a(struct rtw_adapter *padapter, int join_re
 
                /* set per sta rate after updating HT cap. */
                set_sta_rate23a(padapter, psta);
-
-               media_status = (psta->mac_id<<8)|1; /*   MACID|OPMODE: 1 means connect */
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status);
        }
 
-       join_type = 2;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
+       hw_var_set_mlme_join(padapter, 2);
 
-       if ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
-       {
+       if ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) {
                /*  correcting TSF */
-               correct_TSF23a(padapter, pmlmeext);
+               rtw_correct_TSF(padapter);
 
                /* set_link_timer(pmlmeext, DISCONNECT_TO); */
        }
@@ -8778,7 +5468,6 @@ void mlmeext_sta_add_event_callback23a(struct rtw_adapter *padapter, struct sta_
 {
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
-       u8      join_type;
 
        DBG_8723A("%s\n", __func__);
 
@@ -8790,11 +5479,8 @@ void mlmeext_sta_add_event_callback23a(struct rtw_adapter *padapter, struct sta_
                }
                else/* adhoc client */
                {
-                       /* update TSF Value */
-                       /* update_TSF23a(pmlmeext, pframe, len); */
-
                        /*  correcting TSF */
-                       correct_TSF23a(padapter, pmlmeext);
+                       rtw_correct_TSF(padapter);
 
                        /* start beacon */
                        if (send_beacon23a(padapter) == _FAIL)
@@ -8810,8 +5496,7 @@ void mlmeext_sta_add_event_callback23a(struct rtw_adapter *padapter, struct sta_
 
                }
 
-               join_type = 2;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
+               hw_var_set_mlme_join(padapter, 2);
        }
 
        pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;
@@ -8832,8 +5517,8 @@ void mlmeext_sta_del_event_callback23a(struct rtw_adapter *padapter)
        {
                /* set_opmode_cmd(padapter, infra_client_with_mlme); */
 
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_DISCONNECT, NULL);
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_BSSID, null_addr);
+               hw_var_set_mlme_disconnect(padapter);
+               hw_var_set_bssid(padapter, null_addr);
 
                /* restore to initial setting. */
                update_tx_basic_rate23a(padapter, padapter->registrypriv.wireless_mode);
@@ -8919,9 +5604,6 @@ void linked_status_chk23a(struct rtw_adapter *padapter)
                if ((psta = rtw_get_stainfo23a(pstapriv, pmlmeinfo->network.MacAddress)) != NULL)
                {
                        bool is_p2p_enable = false;
-#ifdef CONFIG_8723AU_P2P
-                       is_p2p_enable = !rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE);
-#endif
 
                        if (chk_ap_is_alive(padapter, psta) == false)
                                rx_chk = _FAIL;
@@ -9035,32 +5717,17 @@ static void survey_timer_hdl(unsigned long data)
        struct sitesurvey_parm *psurveyPara;
        struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif
 
        /* issue rtw_sitesurvey_cmd23a */
        if (pmlmeext->sitesurvey_res.state > SCAN_START) {
                if (pmlmeext->sitesurvey_res.state ==  SCAN_PROCESS)
                        pmlmeext->sitesurvey_res.channel_idx++;
 
-               if (pmlmeext->scan_abort == true)
-               {
-#ifdef CONFIG_8723AU_P2P
-                       if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))
-                       {
-                               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);
-                               pmlmeext->sitesurvey_res.channel_idx = 3;
-                               DBG_8723A("%s idx:%d, cnt:%u\n", __func__,
-                                         pmlmeext->sitesurvey_res.channel_idx,
-                                         pwdinfo->find_phase_state_exchange_cnt);
-                       } else
-                       #endif
-                       {
-                               pmlmeext->sitesurvey_res.channel_idx = pmlmeext->sitesurvey_res.ch_num;
-                               DBG_8723A("%s idx:%d\n", __func__,
-                                         pmlmeext->sitesurvey_res.channel_idx);
-                       }
+               if (pmlmeext->scan_abort == true) {
+                       pmlmeext->sitesurvey_res.channel_idx =
+                               pmlmeext->sitesurvey_res.ch_num;
+                       DBG_8723A("%s idx:%d\n", __func__,
+                                 pmlmeext->sitesurvey_res.channel_idx);
 
                        pmlmeext->scan_abort = false;/* reset */
                }
@@ -9189,27 +5856,19 @@ u8 setopmode_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct setopmode_parm *psetop = (struct setopmode_parm *)pbuf;
 
-       if (psetop->mode == Ndis802_11APMode)
-       {
+       if (psetop->mode == Ndis802_11APMode) {
                pmlmeinfo->state = WIFI_FW_AP_STATE;
                type = _HW_STATE_AP_;
-       }
-       else if (psetop->mode == Ndis802_11Infrastructure)
-       {
+       } else if (psetop->mode == Ndis802_11Infrastructure) {
                pmlmeinfo->state &= ~(BIT(0)|BIT(1));/*  clear state */
                pmlmeinfo->state |= WIFI_FW_STATION_STATE;/* set to     STATION_STATE */
                type = _HW_STATE_STATION_;
-       }
-       else if (psetop->mode == Ndis802_11IBSS)
-       {
+       } else if (psetop->mode == Ndis802_11IBSS)
                type = _HW_STATE_ADHOC_;
-       }
        else
-       {
                type = _HW_STATE_NOLINK_;
-       }
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type));
+       hw_var_set_opmode(padapter, type);
        /* Set_NETYPE0_MSR(padapter, type); */
 
        return H2C_SUCCESS;
@@ -9249,12 +5908,10 @@ u8 createbss_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
                pmlmeinfo->candidate_tid_bitmap = 0;
 
                /* disable dynamic functions, such as high power, DIG */
-               Save_DM_Func_Flag23a(padapter);
-               Switch_DM_Func23a(padapter, DYNAMIC_FUNC_DISABLE, false);
+               rtl8723a_odm_support_ability_backup(padapter);
 
-               /* config the initial gain under linking, need to write the BB registers */
-               /* initialgain = 0x1E; */
-               /* rtw_hal_set_hwreg23a(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); */
+               rtl8723a_odm_support_ability_clr(padapter,
+                                                DYNAMIC_FUNC_DISABLE);
 
                /* cancel link timer */
                del_timer_sync(&pmlmeext->link_timer);
@@ -9275,7 +5932,6 @@ u8 createbss_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
 
 u8 join_cmd_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
 {
-       u8      join_type;
        struct ndis_802_11_var_ies *    pIE;
        struct registry_priv    *pregpriv = &padapter->registrypriv;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
@@ -9305,7 +5961,7 @@ u8 join_cmd_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
                /* Set_MSR23a(padapter, _HW_STATE_NOLINK_); */
                Set_MSR23a(padapter, _HW_STATE_STATION_);
 
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_DISCONNECT, NULL);
+               hw_var_set_mlme_disconnect(padapter);
        }
 
        rtw_joinbss_reset23a(padapter);
@@ -9337,16 +5993,16 @@ u8 join_cmd_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
 
                switch (pIE->ElementID)
                {
-               case _VENDOR_SPECIFIC_IE_:/* Get WMM IE. */
+               case WLAN_EID_VENDOR_SPECIFIC:/* Get WMM IE. */
                        if (!memcmp(pIE->data, WMM_OUI23A, 4))
                                pmlmeinfo->WMM_enable = 1;
                        break;
 
-               case _HT_CAPABILITY_IE_:        /* Get HT Cap IE. */
+               case WLAN_EID_HT_CAPABILITY:    /* Get HT Cap IE. */
                        pmlmeinfo->HT_caps_enable = 1;
                        break;
 
-               case _HT_EXTRA_INFO_IE_:        /* Get HT Info IE. */
+               case WLAN_EID_HT_OPERATION:     /* Get HT Info IE. */
                        pmlmeinfo->HT_info_enable = 1;
 
                        /* spec case only for cisco's ap because cisco's ap
@@ -9385,19 +6041,9 @@ u8 join_cmd_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
 
                i += (pIE->Length + 2);
        }
-       /* disable dynamic functions, such as high power, DIG */
-       /* Switch_DM_Func23a(padapter, DYNAMIC_FUNC_DISABLE, false); */
-
-       /* config the initial gain under linking, need to write the BB
-          registers */
-       /* initialgain = 0x1E; */
-       /* rtw_hal_set_hwreg23a(padapter, HW_VAR_INITIAL_GAIN,
-          (u8 *)(&initialgain)); */
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BSSID,
-                         pmlmeinfo->network.MacAddress);
-       join_type = 0;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
+       hw_var_set_bssid(padapter, pmlmeinfo->network.MacAddress);
+       hw_var_set_mlme_join(padapter, 0);
 
        /* cancel link timer */
        del_timer_sync(&pmlmeext->link_timer);
@@ -9413,7 +6059,6 @@ u8 disconnect_hdl23a(struct rtw_adapter *padapter, unsigned char *pbuf)
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *pnetwork = &pmlmeinfo->network;
-       u8      val8;
 
        if (is_client_associated_to_ap23a(padapter))
        {
@@ -9424,18 +6069,15 @@ u8 disconnect_hdl23a(struct rtw_adapter *padapter, unsigned char *pbuf)
 
        /* pmlmeinfo->state = WIFI_FW_NULL_STATE; */
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_DISCONNECT, NULL);
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BSSID, null_addr);
+       hw_var_set_mlme_disconnect(padapter);
+       hw_var_set_bssid(padapter, null_addr);
 
        /* restore to initial setting. */
        update_tx_basic_rate23a(padapter, padapter->registrypriv.wireless_mode);
 
-       if (((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
-       {
-               /* Stop BCN */
-               val8 = 0;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_BCN_FUNC, (u8 *)(&val8));
-       }
+       if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) ||
+           ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE))
+               rtl8723a_set_bcn_func(padapter, 0);     /* Stop BCN */
 
        /* set MSR to no link state -> infra. mode */
        Set_MSR23a(padapter, _HW_STATE_STATION_);
@@ -9527,14 +6169,10 @@ u8 sitesurvey_cmd_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf;
        u8 bdelayscan = false;
-       u8 val8;
        u32 initialgain;
        u32 i;
 
        if (pmlmeext->sitesurvey_res.state == SCAN_DISABLE) {
-               /* for first time sitesurvey_cmd */
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_CHECK_TXBUF, NULL);
-
                pmlmeext->sitesurvey_res.state = SCAN_START;
                pmlmeext->sitesurvey_res.bss_cnt = 0;
                pmlmeext->sitesurvey_res.channel_idx = 0;
@@ -9582,25 +6220,23 @@ u8 sitesurvey_cmd_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
        if ((pmlmeext->sitesurvey_res.state == SCAN_START) ||
            (pmlmeext->sitesurvey_res.state == SCAN_TXNULL)) {
                /* disable dynamic functions, such as high power, DIG */
-               Save_DM_Func_Flag23a(padapter);
-               Switch_DM_Func23a(padapter, DYNAMIC_FUNC_DISABLE, false);
+               rtl8723a_odm_support_ability_backup(padapter);
+               rtl8723a_odm_support_ability_clr(padapter,
+                                                DYNAMIC_FUNC_DISABLE);
 
                /* config the initial gain under scaning, need to
                   write the BB registers */
-               if ((wdev_to_priv(padapter->rtw_wdev))->p2p_enabled == true) {
+               if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == true)
                        initialgain = 0x30;
-               else
+               else
                        initialgain = 0x1E;
 
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_INITIAL_GAIN,
-                                 (u8 *)(&initialgain));
+               rtl8723a_set_initial_gain(padapter, initialgain);
 
                /* set MSR to no link state */
                Set_MSR23a(padapter, _HW_STATE_NOLINK_);
 
-               val8 = 1; /* under site survey */
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_SITESURVEY,
-                                 (u8 *)(&val8));
+               rtl8723a_mlme_sitesurvey(padapter, 1);
 
                pmlmeext->sitesurvey_res.state = SCAN_PROCESS;
        }
@@ -9641,10 +6277,10 @@ u8 setkey_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
 
        DBG_8723A_LEVEL(_drv_always_, "set group key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) "
                        "keyid:%d\n", pparm->algorithm, pparm->keyid);
-       write_cam23a(padapter, pparm->keyid, ctrl, null_sta, pparm->key);
+       rtl8723a_cam_write(padapter, pparm->keyid, ctrl, null_sta, pparm->key);
 
        /* allow multicast packets to driver */
-        padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ON_RCR_AM, null_addr);
+       rtl8723a_on_rcr_am(padapter);
 
        return H2C_SUCCESS;
 }
@@ -9705,7 +6341,8 @@ u8 set_stakey_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
                                                pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4],
                                                pparm->addr[5], cam_id);
 
-                       write_cam23a(padapter, cam_id, ctrl, pparm->addr, pparm->key);
+                       rtl8723a_cam_write(padapter, cam_id, ctrl,
+                                          pparm->addr, pparm->key);
 
                        return H2C_SUCCESS_RSP;
 
@@ -9728,7 +6365,7 @@ u8 set_stakey_hdl23a(struct rtw_adapter *padapter, u8 *pbuf)
 
        ctrl = BIT(15) | ((pparm->algorithm) << 2);
 
-       write_cam23a(padapter, cam_id, ctrl, pparm->addr, pparm->key);
+       rtl8723a_cam_write(padapter, cam_id, ctrl, pparm->addr, pparm->key);
 
        pmlmeinfo->enc_algo = pparm->algorithm;
 
diff --git a/drivers/staging/rtl8723au/core/rtw_p2p.c b/drivers/staging/rtl8723au/core/rtw_p2p.c
deleted file mode 100644 (file)
index 1a961e3..0000000
+++ /dev/null
@@ -1,4001 +0,0 @@
-/******************************************************************************
- *
- * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- ******************************************************************************/
-#define _RTW_P2P_C_
-
-#include <drv_types.h>
-#include <rtw_p2p.h>
-#include <wifi.h>
-
-#ifdef CONFIG_8723AU_P2P
-
-static int rtw_p2p_is_channel_list_ok(u8 desired_ch, u8* ch_list, u8 ch_cnt)
-{
-       int found = 0, i = 0;
-
-       for (i = 0; i < ch_cnt; i++)
-       {
-               if (ch_list[ i ] == desired_ch)
-               {
-                       found = 1;
-                       break;
-               }
-       }
-       return found;
-}
-
-static int is_any_client_associated(struct rtw_adapter *padapter)
-{
-       return padapter->stapriv.asoc_list_cnt ? true : false;
-}
-
-static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       struct list_head *phead, *plist;
-       u32 len = 0;
-       u16 attr_len = 0;
-       u8 tmplen, *pdata_attr, *pstart, *pcur;
-       struct sta_info *psta;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct sta_priv *pstapriv = &padapter->stapriv;
-
-       DBG_8723A("%s\n", __func__);
-
-       pdata_attr = kzalloc(MAX_P2P_IE_LEN, GFP_ATOMIC);
-
-       pstart = pdata_attr;
-       pcur = pdata_attr;
-
-       spin_lock_bh(&pstapriv->asoc_list_lock);
-       phead = &pstapriv->asoc_list;
-
-       list_for_each(plist, phead) {
-               psta = container_of(plist, struct sta_info, asoc_list);
-
-               if (psta->is_p2p_device)
-               {
-                       tmplen = 0;
-
-                       pcur++;
-
-                       /* P2P device address */
-                       memcpy(pcur, psta->dev_addr, ETH_ALEN);
-                       pcur += ETH_ALEN;
-
-                       /* P2P interface address */
-                       memcpy(pcur, psta->hwaddr, ETH_ALEN);
-                       pcur += ETH_ALEN;
-
-                       *pcur = psta->dev_cap;
-                       pcur++;
-
-                       /* u16*)(pcur) = cpu_to_be16(psta->config_methods); */
-                       put_unaligned_be16(psta->config_methods, pcur);
-                       pcur += 2;
-
-                       memcpy(pcur, psta->primary_dev_type, 8);
-                       pcur += 8;
-
-                       *pcur = psta->num_of_secdev_type;
-                       pcur++;
-
-                       memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type*8);
-                       pcur += psta->num_of_secdev_type*8;
-
-                       if (psta->dev_name_len>0)
-                       {
-                               /* u16*)(pcur) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */
-                               put_unaligned_be16(WPS_ATTR_DEVICE_NAME, pcur);
-                               pcur += 2;
-
-                               /* u16*)(pcur) = cpu_to_be16(psta->dev_name_len); */
-                               put_unaligned_be16(psta->dev_name_len, pcur);
-                               pcur += 2;
-
-                               memcpy(pcur, psta->dev_name, psta->dev_name_len);
-                               pcur += psta->dev_name_len;
-                       }
-
-                       tmplen = (u8)(pcur-pstart);
-
-                       *pstart = (tmplen-1);
-
-                       attr_len += tmplen;
-
-                       /* pstart += tmplen; */
-                       pstart = pcur;
-
-               }
-
-       }
-       spin_unlock_bh(&pstapriv->asoc_list_lock);
-
-       if (attr_len>0)
-       {
-               len = rtw_set_p2p_attr_content23a(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr);
-       }
-
-       kfree(pdata_attr);
-
-       return len;
-}
-
-static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da)
-{
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                                   *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                          *fctrl;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       unsigned char category = WLAN_CATEGORY_VENDOR_SPECIFIC;/* P2P action frame */
-       u32     p2poui = cpu_to_be32(P2POUI);
-       u8      oui_subtype = P2P_GO_DISC_REQUEST;
-       u8      dialogToken = 0;
-
-       DBG_8723A("[%s]\n", __func__);
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-       {
-               return;
-       }
-
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       memcpy(pwlanhdr->addr1, da, ETH_ALEN);
-       memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       /* Build P2P action frame header */
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       /* there is no IE in this P2P action frame */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-}
-
-static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken)
-{
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                                   *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                          *fctrl;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8                      action = P2P_PUB_ACTION_ACTION;
-       u32                     p2poui = cpu_to_be32(P2POUI);
-       u8                      oui_subtype = P2P_DEVDISC_RESP;
-       u8 p2pie[8] = { 0x00 };
-       u32 p2pielen = 0;
-
-       DBG_8723A("[%s]\n", __func__);
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-       {
-               return;
-       }
-
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       memcpy(pwlanhdr->addr1, da, ETH_ALEN);
-       memcpy(pwlanhdr->addr2, pwdinfo->device_addr, ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pwdinfo->device_addr, ETH_ALEN);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       /* Build P2P public action frame header */
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *) &p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       /* Build P2P IE */
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*  P2P_ATTR_STATUS */
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status);
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen);
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-}
-
-static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, u8* frame_body, u16 config_method)
-{
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8                      action = P2P_PUB_ACTION_ACTION;
-       u8                      dialogToken = frame_body[7];    /*      The Dialog Token of provisioning discovery request frame. */
-       u32                     p2poui = cpu_to_be32(P2POUI);
-       u8                      oui_subtype = P2P_PROVISION_DISC_RESP;
-       u8                      wpsie[ 100 ] = { 0x00 };
-       u8                      wpsielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32                                     wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                                   *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                          *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
-       memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
-       memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *) &p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       wpsielen = 0;
-       /*      WPS OUI */
-       /* u32*) (wpsie) = cpu_to_be32(WPSOUI); */
-       put_unaligned_be32(WPSOUI, wpsie);
-       wpsielen += 4;
-
-       /*      Config Method */
-       /*      Type: */
-       /* u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); */
-       put_unaligned_be16(WPS_ATTR_CONF_METHOD, wpsie + wpsielen);
-       wpsielen += 2;
-
-       /*      Length: */
-       /* u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002); */
-       put_unaligned_be16(0x0002, wpsie + wpsielen);
-       wpsielen += 2;
-
-       /*      Value: */
-       /* u16*) (wpsie + wpsielen) = cpu_to_be16(config_method); */
-       put_unaligned_be16(config_method, wpsie + wpsielen);
-       wpsielen += 2;
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_provdisc_resp_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken)
-{
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                                   *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                          *fctrl;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       unsigned char category = WLAN_CATEGORY_VENDOR_SPECIFIC;/* P2P action frame */
-       u32     p2poui = cpu_to_be32(P2POUI);
-       u8      oui_subtype = P2P_PRESENCE_RESPONSE;
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u8 noa_attr_content[32] = { 0x00 };
-       u32 p2pielen = 0;
-
-       DBG_8723A("[%s]\n", __func__);
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-       {
-               return;
-       }
-
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       memcpy(pwlanhdr->addr1, da, ETH_ALEN);
-       memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       /* Build P2P action frame header */
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *) &p2poui,
-                                    &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       /* Add P2P IE header */
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /* Add Status attribute in P2P IE */
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status);
-
-       /* Add NoA attribute in P2P IE */
-       noa_attr_content[0] = 0x1;/* index */
-       noa_attr_content[1] = 0x0;/* CTWindow and OppPS Parameters */
-
-       /* todo: Notice of Absence Descriptor(s) */
-
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content);
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie,
-                              &pattrib->pktlen);
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-}
-
-u32 build_beacon_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u16 capability = 0;
-       u32 len = 0, p2pielen = 0;
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*      According to the P2P Specification, the beacon frame should contain 3 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. P2P Device ID */
-       /*      3. Notice of Absence (NOA) */
-
-       /*      P2P Capability ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       /*      Be able to participate in additional P2P Groups and */
-       /*      support the P2P Invitation Procedure */
-       /*      Group Capability Bitmap, 1 byte */
-       capability = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY;
-       capability |=  ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8);
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))
-               capability |= (P2P_GRPCAP_GROUP_FORMATION<<8);
-
-       capability = cpu_to_le16(capability);
-
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8*)&capability);
-
-       /*  P2P Device ID ATTR */
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr);
-
-       /*  Notice of Absence ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-
-       /* go_add_noa_attr(pwdinfo); */
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);
-
-       return len;
-}
-
-#ifdef CONFIG_8723AU_P2P
-u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the beacon frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-
-       if (P2P_ROLE_GO == pwdinfo->role)
-       {
-               if (is_any_client_associated(pwdinfo->padapter))
-               {
-                       /*      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) */
-                       put_unaligned_be16(pwfd_info->wfd_device_type |
-                                          WFD_DEVINFO_WSD, wfdie + wfdielen);
-               }
-               else
-               {
-                       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-                       put_unaligned_be16(pwfd_info->wfd_device_type |
-                                          WFD_DEVINFO_SESSION_AVAIL |
-                                          WFD_DEVINFO_WSD, wfdie + wfdielen);
-               }
-
-       }
-       else
-       {
-               /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                  WFD_DEVINFO_SESSION_AVAIL |
-                                  WFD_DEVINFO_WSD, wfdie + wfdielen);
-       }
-
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the probe request frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-
-       if (1 == pwdinfo->wfd_tdls_enable)
-       {
-               /*      WFD primary sink + available for WFD session + WiFi TDLS mode + WSC (WFD Service Discovery) */
-               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                  WFD_DEVINFO_SESSION_AVAIL |
-                                  WFD_DEVINFO_WSD |
-                                  WFD_DEVINFO_PC_TDLS, wfdie + wfdielen);
-       }
-       else
-       {
-               /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSC (WFD Service Discovery) */
-               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                  WFD_DEVINFO_SESSION_AVAIL |
-                                  WFD_DEVINFO_WSD, wfdie + wfdielen);
-       }
-
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunneled)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the probe response frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-       /*      4. WFD Session Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode */
-
-       if (true == pwdinfo->session_available)
-       {
-               if (P2P_ROLE_GO == pwdinfo->role)
-               {
-                       if (is_any_client_associated(pwdinfo->padapter))
-                       {
-                               if (pwdinfo->wfd_tdls_enable)
-                               {
-                                       /*      TDLS mode + WSD (WFD Service Discovery) */
-                                       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT, wfdie + wfdielen);
-                               }
-                               else
-                               {
-                                       /*      WiFi Direct mode + WSD (WFD Service Discovery) */
-                                       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT, wfdie + wfdielen);
-                               }
-                       }
-                       else
-                       {
-                               if (pwdinfo->wfd_tdls_enable)
-                               {
-                                       /*      available for WFD session + TDLS mode + WSD (WFD Service Discovery) */
-                                       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT, wfdie + wfdielen);
-                               }
-                               else
-                               {
-                                       /*      available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-                                       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT, wfdie + wfdielen);
-                               }
-                       }
-               }
-               else
-               {
-                       if (pwdinfo->wfd_tdls_enable)
-                       {
-                               /*      available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-                               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                                  WFD_DEVINFO_SESSION_AVAIL |
-                                                  WFD_DEVINFO_WSD |
-                                                  WFD_DEVINFO_PC_TDLS |
-                                                  WFD_DEVINFO_HDCP_SUPPORT,
-                                                  wfdie + wfdielen);
-                       }
-                       else
-                       {
-
-                               /*      available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-                               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                                  WFD_DEVINFO_SESSION_AVAIL |
-                                                  WFD_DEVINFO_WSD |
-                                                  WFD_DEVINFO_HDCP_SUPPORT,
-                                                  wfdie + wfdielen);
-                       }
-               }
-       }
-       else
-       {
-               if (pwdinfo->wfd_tdls_enable)
-               {
-                       put_unaligned_be16(pwfd_info->wfd_device_type |
-                                          WFD_DEVINFO_WSD |
-                                          WFD_DEVINFO_PC_TDLS |
-                                          WFD_DEVINFO_HDCP_SUPPORT,
-                                          wfdie + wfdielen);
-               }
-               else
-               {
-                       put_unaligned_be16(pwfd_info->wfd_device_type |
-                                          WFD_DEVINFO_WSD |
-                                          WFD_DEVINFO_HDCP_SUPPORT,
-                                          wfdie + wfdielen);
-               }
-
-       }
-
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               /*      WFD Session Information ATTR */
-               /*      Type: */
-               wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
-
-               /*      Length: */
-               /*      Note: In the WFD specification, the size of length field is 2. */
-               put_unaligned_be16(0x0000, wfdie + wfdielen);
-               wfdielen += 2;
-
-               /*      Todo: to add the list of WFD device info descriptor in WFD group. */
-
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter                                      *padapter = NULL;
-       struct mlme_priv                        *pmlmepriv = NULL;
-       struct wifi_display_info                *pwfd_info = NULL;
-
-       /*      WFD OUI */
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
-       {
-               return 0;
-       }
-
-       padapter = pwdinfo->padapter;
-       pmlmepriv = &padapter->mlmepriv;
-       pwfd_info = padapter->wdinfo.wfd_info;
-
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the probe request frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL |
-                          WFD_DEVINFO_WSD, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the probe request frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL |
-                          WFD_DEVINFO_WSD, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) + WFD Session Available */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) + WFD Session Available */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) + WFD Session Available */
-       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_WSD |
-                          WFD_DEVINFO_SESSION_AVAIL, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       if (P2P_ROLE_GO == pwdinfo->role)
-       {
-               /*      WFD Session Information ATTR */
-               /*      Type: */
-               wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
-
-               /*      Length: */
-               /*      Note: In the WFD specification, the size of length field is 2. */
-               put_unaligned_be16(0x0000, wfdie + wfdielen);
-               wfdielen += 2;
-
-               /*      Todo: to add the list of WFD device info descriptor in WFD group. */
-
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       if (P2P_ROLE_GO == pwdinfo->role)
-       {
-               /*      WFD Session Information ATTR */
-               /*      Type: */
-               wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
-
-               /*      Length: */
-               /*      Note: In the WFD specification, the size of length field is 2. */
-               put_unaligned_be16(0x0000, wfdie + wfdielen);
-               wfdielen += 2;
-
-               /*      Todo: to add the list of WFD device info descriptor in WFD group. */
-
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the provision discovery response frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-#endif /* CONFIG_8723AU_P2P */
-
-u32 build_probe_resp_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u32 len = 0, p2pielen = 0;
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20100907 */
-       /*      According to the P2P Specification, the probe response frame should contain 5 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. Extended Listen Timing */
-       /*      3. Notice of Absence (NOA)      (Only GO needs this) */
-       /*      4. Device Info */
-       /*      5. Group Info   (Only GO need this) */
-
-       /*      P2P Capability ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002); */
-       put_unaligned_le16(0x0002, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               p2pie[ p2pielen ] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS);
-
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))
-                       p2pie[ p2pielen ] |= P2P_GRPCAP_GROUP_FORMATION;
-
-               p2pielen++;
-       }
-       else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE))
-       {
-               /*      Group Capability Bitmap, 1 byte */
-               if (pwdinfo->persistent_supported)
-                       p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
-               else
-                       p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;
-       }
-
-       /*      Extended Listen Timing ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004); */
-       put_unaligned_le16(0x0004, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Availability Period */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF); */
-       put_unaligned_le16(0xFFFF, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Availability Interval */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF); */
-       put_unaligned_le16(0xFFFF, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*  Notice of Absence ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               /* go_add_noa_attr(pwdinfo); */
-       }
-
-       /*      Device Info ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); */
-       put_unaligned_le16(21 + pwdinfo->device_name_len, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm); */
-       put_unaligned_be16(pwdinfo->supported_wps_cm, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); */
-       put_unaligned_be16(WPS_PDT_CID_MULIT_MEDIA, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      OUI */
-       /* u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI); */
-       put_unaligned_be32(WPSOUI, p2pie + p2pielen);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); */
-       put_unaligned_be16(WPS_PDT_SCID_MEDIA_SERVER, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[ p2pielen++ ] = 0x00;     /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */
-       put_unaligned_be16(WPS_ATTR_DEVICE_NAME, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); */
-       put_unaligned_be16(pwdinfo->device_name_len, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       /*  Group Info ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               p2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen);
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);
-
-       return len;
-}
-
-u32 build_prov_disc_request_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr)
-{
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u32 len = 0, p2pielen = 0;
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20110301 */
-       /*      According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. Device Info */
-       /*      3. Group ID (When joining an operating P2P Group) */
-
-       /*      P2P Capability ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002); */
-       put_unaligned_le16(0x0002, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (pwdinfo->persistent_supported)
-               p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
-       else
-               p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;
-
-       /*      Device Info ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); */
-       put_unaligned_le16(21 + pwdinfo->device_name_len, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-       if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC)
-       {
-               /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_PBC); */
-               put_unaligned_be16(WPS_CONFIG_METHOD_PBC, p2pie + p2pielen);
-       }
-       else
-       {
-               /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY); */
-               put_unaligned_be16(WPS_CONFIG_METHOD_DISPLAY, p2pie + p2pielen);
-       }
-
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); */
-       put_unaligned_be16(WPS_PDT_CID_MULIT_MEDIA, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      OUI */
-       /* u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI); */
-       put_unaligned_be32(WPSOUI, p2pie + p2pielen);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); */
-       put_unaligned_be16(WPS_PDT_SCID_MEDIA_SERVER, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[ p2pielen++ ] = 0x00;     /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */
-       put_unaligned_be16(WPS_ATTR_DEVICE_NAME, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); */
-       put_unaligned_be16(pwdinfo->device_name_len, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT))
-       {
-               /*      Added by Albert 2011/05/19 */
-               /*      In this case, the pdev_raddr is the device address of the group owner. */
-
-               /*      P2P Group ID ATTR */
-               /*      Type: */
-               p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;
-
-               /*      Length: */
-               /* u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + ussidlen); */
-               put_unaligned_le16(ETH_ALEN + ussidlen, p2pie + p2pielen);
-               p2pielen += 2;
-
-               /*      Value: */
-               memcpy(p2pie + p2pielen, pdev_raddr, ETH_ALEN);
-               p2pielen += ETH_ALEN;
-
-               memcpy(p2pie + p2pielen, pssid, ussidlen);
-               p2pielen += ussidlen;
-
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);
-
-       return len;
-}
-
-u32 build_assoc_resp_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code)
-{
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u32 len = 0, p2pielen = 0;
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*  According to the P2P Specification, the Association response frame should contain 2 P2P attributes */
-       /*      1. Status */
-       /*      2. Extended Listen Timing (optional) */
-
-       /*      Status ATTR */
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code);
-
-       /*  Extended Listen Timing ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-
-       pbuf = rtw_set_ie23a(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);
-
-       return len;
-}
-
-u32 build_deauth_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u32 len = 0;
-
-       return len;
-}
-
-u32 process_probe_req_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       u8 *p;
-       u32 ret = false;
-       u8 *p2pie;
-       u32     p2pielen = 0;
-       int ssid_len = 0, rate_cnt = 0;
-
-       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + _PROBEREQ_IE_OFFSET_, _SUPPORTEDRATES_IE_, (int *)&rate_cnt,
-                       len - sizeof(struct ieee80211_hdr_3addr) - _PROBEREQ_IE_OFFSET_);
-
-       if (rate_cnt <= 4)
-       {
-               int i, g_rate = 0;
-
-               for (i = 0; i < rate_cnt; i++)
-               {
-                       if (((*(p + 2 + i) & 0xff) != 0x02) &&
-                               ((*(p + 2 + i) & 0xff) != 0x04) &&
-                               ((*(p + 2 + i) & 0xff) != 0x0B) &&
-                               ((*(p + 2 + i) & 0xff) != 0x16))
-                       {
-                               g_rate = 1;
-                       }
-               }
-
-               if (g_rate == 0)
-               {
-                       /*      There is no OFDM rate included in SupportedRates IE of this probe request frame */
-                       /*      The driver should response this probe request. */
-                       return ret;
-               }
-       }
-       else
-       {
-               /*      rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4. */
-               /*      We should proceed the following check for this probe request. */
-       }
-
-       /*      Added comments by Albert 20100906 */
-       /*      There are several items we should check here. */
-       /*      1. This probe request frame must contain the P2P IE. (Done) */
-       /*      2. This probe request frame must contain the wildcard SSID. (Done) */
-       /*      3. Wildcard BSSID. (Todo) */
-       /*      4. Destination Address. (Done in mgt_dispatcher23a function) */
-       /*      5. Requested Device Type in WSC IE. (Todo) */
-       /*      6. Device ID attribute in P2P IE. (Todo) */
-
-       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ssid_len,
-                       len - sizeof(struct ieee80211_hdr_3addr) - _PROBEREQ_IE_OFFSET_);
-
-       ssid_len &= 0xff;       /*      Just last 1 byte is valid for ssid len of the probe request */
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               if ((p2pie = rtw_get_p2p_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + _PROBEREQ_IE_OFFSET_, len - sizeof(struct ieee80211_hdr_3addr) - _PROBEREQ_IE_OFFSET_, NULL, &p2pielen)))
-               {
-                       if ((p) && !memcmp((void *)(p+2), (void *)pwdinfo->p2p_wildcard_ssid, 7))
-                       {
-                               /* todo: */
-                               /* Check Requested Device Type attributes in WSC IE. */
-                               /* Check Device ID attribute in P2P IE */
-
-                               ret = true;
-                       }
-                       else if ((p != NULL) && (ssid_len == 0))
-                       {
-                               ret = true;
-                       }
-               }
-               else
-               {
-                       /* non -p2p device */
-               }
-
-       }
-
-       return ret;
-}
-
-u32 process_assoc_req_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len, struct sta_info *psta)
-{
-       u8 status_code = P2P_STATUS_SUCCESS;
-       u8 *pbuf, *pattr_content = NULL;
-       u32 attr_contentlen = 0;
-       u16 cap_attr = 0;
-       unsigned short ie_offset;
-       u8 * ies;
-       u32 ies_len;
-       u8 * p2p_ie;
-       u32     p2p_ielen = 0;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)pframe;
-
-       if (!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-               return P2P_STATUS_FAIL_REQUEST_UNABLE;
-
-       if (ieee80211_is_assoc_req(hdr->frame_control))
-               ie_offset = _ASOCREQ_IE_OFFSET_;
-       else /*  WIFI_REASSOCREQ */
-               ie_offset = _REASOCREQ_IE_OFFSET_;
-
-       ies = pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset;
-       ies_len = len - sizeof(struct ieee80211_hdr_3addr) - ie_offset;
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-
-       if (!p2p_ie)
-       {
-               DBG_8723A("[%s] P2P IE not Found!!\n", __func__);
-               status_code =  P2P_STATUS_FAIL_INVALID_PARAM;
-       }
-       else
-       {
-               DBG_8723A("[%s] P2P IE Found!!\n", __func__);
-       }
-
-       while (p2p_ie)
-       {
-               /* Check P2P Capability ATTR */
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen))
-               {
-                       DBG_8723A("[%s] Got P2P Capability Attr!!\n", __func__);
-                       cap_attr = le16_to_cpu(cap_attr);
-                       psta->dev_cap = cap_attr&0xff;
-               }
-
-               /* Check Extended Listen Timing ATTR */
-
-               /* Check P2P Device Info ATTR */
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint*)&attr_contentlen))
-               {
-                       DBG_8723A("[%s] Got P2P DEVICE INFO Attr!!\n", __func__);
-                       pattr_content = pbuf = kzalloc(attr_contentlen,
-                                                      GFP_ATOMIC);
-                       if (pattr_content) {
-                               u8 num_of_secdev_type;
-                               u16 dev_name_len;
-
-                               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, pattr_content, (uint*)&attr_contentlen);
-
-                               memcpy(psta->dev_addr,  pattr_content, ETH_ALEN);/* P2P Device Address */
-
-                               pattr_content += ETH_ALEN;
-
-                               memcpy(&psta->config_methods, pattr_content, 2);/* Config Methods */
-                               psta->config_methods = be16_to_cpu(psta->config_methods);
-
-                               pattr_content += 2;
-
-                               memcpy(psta->primary_dev_type, pattr_content, 8);
-
-                               pattr_content += 8;
-
-                               num_of_secdev_type = *pattr_content;
-                               pattr_content += 1;
-
-                               if (num_of_secdev_type == 0)
-                               {
-                                       psta->num_of_secdev_type = 0;
-                               }
-                               else
-                               {
-                                       u32 len;
-
-                                       psta->num_of_secdev_type = num_of_secdev_type;
-
-                                       len = (sizeof(psta->secdev_types_list)<(num_of_secdev_type*8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type*8);
-
-                                       memcpy(psta->secdev_types_list, pattr_content, len);
-
-                                       pattr_content += (num_of_secdev_type*8);
-                               }
-
-                               /* dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8); */
-                               psta->dev_name_len = 0;
-                               if (WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16*)pattr_content))
-                               {
-                                       dev_name_len = be16_to_cpu(*(u16*)(pattr_content+2));
-
-                                       psta->dev_name_len = (sizeof(psta->dev_name)<dev_name_len) ? sizeof(psta->dev_name):dev_name_len;
-
-                                       memcpy(psta->dev_name, pattr_content+4, psta->dev_name_len);
-                               }
-
-                               kfree(pbuf);
-
-                       }
-
-               }
-
-               /* Get the next P2P IE */
-               p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-
-       }
-
-       return status_code;
-}
-
-u32 process_p2p_devdisc_req23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                           uint len)
-{
-       u8 *frame_body;
-       u8 status, dialogToken;
-       struct sta_info *psta = NULL;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct sta_priv *pstapriv = &padapter->stapriv;
-       u8 *p2p_ie;
-       u32     p2p_ielen = 0;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) pframe;
-
-       frame_body = (unsigned char *)
-               (pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       dialogToken = frame_body[7];
-       status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;
-
-       if ((p2p_ie = rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                                    len - _PUBLIC_ACTION_IE_OFFSET_, NULL,
-                                    &p2p_ielen))) {
-               u8 groupid[38] = { 0x00 };
-               u8 dev_addr[ETH_ALEN] = { 0x00 };
-               u32 attr_contentlen = 0;
-
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
-                                            P2P_ATTR_GROUP_ID, groupid,
-                                            &attr_contentlen)) {
-                       if (!memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) &&
-                           !memcmp(pwdinfo->p2p_group_ssid, groupid + ETH_ALEN,
-                                   pwdinfo->p2p_group_ssid_len)) {
-                               attr_contentlen = 0;
-
-                               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
-                                                            P2P_ATTR_DEVICE_ID,
-                                                            dev_addr,
-                                                            &attr_contentlen)) {
-                                       struct list_head *phead, *plist, *ptmp;
-
-                                       spin_lock_bh(&pstapriv->asoc_list_lock);
-                                       phead = &pstapriv->asoc_list;
-
-                                       list_for_each_safe(plist, ptmp, phead) {
-                                               psta = container_of(plist, struct sta_info, asoc_list);
-
-                                               if (psta->is_p2p_device && (psta->dev_cap&P2P_DEVCAP_CLIENT_DISCOVERABILITY) &&
-                                                  !memcmp(psta->dev_addr, dev_addr, ETH_ALEN))
-                                               {
-                                                       /* spin_unlock_bh(&pstapriv->asoc_list_lock); */
-                                                       /* issue GO Discoverability Request */
-                                                       issue_group_disc_req(pwdinfo, psta->hwaddr);
-                                                       /* spin_lock_bh(&pstapriv->asoc_list_lock); */
-                                                       status = P2P_STATUS_SUCCESS;
-                                                       break;
-                                               } else {
-                                                       status = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                               }
-                                       }
-                                       spin_unlock_bh(&pstapriv->asoc_list_lock);
-                               } else {
-                                       status = P2P_STATUS_FAIL_INVALID_PARAM;
-                               }
-                       } else {
-                               status = P2P_STATUS_FAIL_INVALID_PARAM;
-                       }
-               }
-       }
-
-       /* issue Device Discoverability Response */
-       issue_p2p_devdisc_resp(pwdinfo, hdr->addr2, status, dialogToken);
-
-       return (status == P2P_STATUS_SUCCESS) ? true:false;
-}
-
-u32 process_p2p_devdisc_resp23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       return true;
-}
-
-u8 process_p2p_provdisc_req23a(struct wifidirect_info *pwdinfo,
-                           u8 *pframe, uint len)
-{
-       u8 *frame_body;
-       u8 *wpsie;
-       u8 *ptr = NULL;
-       uint    wps_ielen = 0, attr_contentlen = 0;
-       u16     uconfig_method = 0;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)pframe;
-
-       frame_body = (pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       wpsie = rtw_get_wps_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                              len - _PUBLIC_ACTION_IE_OFFSET_, NULL,
-                              &wps_ielen);
-       if (!wpsie)
-               goto out;
-
-       if (!rtw_get_wps_attr_content23a(wpsie, wps_ielen, WPS_ATTR_CONF_METHOD,
-                                    (u8 *)&uconfig_method, &attr_contentlen))
-               goto out;
-
-       uconfig_method = be16_to_cpu(uconfig_method);
-       ptr = pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req;
-
-       switch (uconfig_method)
-       {
-       case WPS_CM_DISPLYA:
-               memcpy(ptr, "dis", 3);
-               break;
-
-       case WPS_CM_LABEL:
-               memcpy(ptr, "lab", 3);
-               break;
-
-       case WPS_CM_PUSH_BUTTON:
-               memcpy(ptr, "pbc", 3);
-               break;
-
-       case WPS_CM_KEYPAD:
-               memcpy(ptr, "pad", 3);
-               break;
-       }
-       issue_p2p_provision_resp(pwdinfo, hdr->addr2, frame_body,
-                                uconfig_method);
-
-out:
-       DBG_8723A("[%s] config method = %s\n", __func__, ptr);
-
-       return true;
-}
-
-u8 process_p2p_provdisc_resp23a(struct wifidirect_info *pwdinfo,  u8 *pframe)
-{
-
-       return true;
-}
-
-static u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 ch_cnt, u8 *peer_ch_list)
-{
-       u8 i = 0, j = 0;
-       u8 temp = 0;
-       u8 ch_no = 0;
-       ch_content += 3;
-       ch_cnt -= 3;
-
-       while(ch_cnt > 0)
-       {
-               ch_content += 1;
-               ch_cnt -= 1;
-               temp = *ch_content;
-               for (i = 0 ; i < temp ; i++, j++)
-               {
-                       peer_ch_list[j] = *(ch_content + 1 + i);
-               }
-               ch_content += (temp + 1);
-               ch_cnt -= (temp + 1);
-               ch_no += temp ;
-       }
-
-       return ch_no;
-}
-
-static u8 rtw_p2p_ch_inclusion(struct mlme_ext_priv *pmlmeext, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned)
-{
-       int     i = 0, j = 0, temp = 0;
-       u8 ch_no = 0;
-
-       for (i = 0; i < peer_ch_num; i++)
-       {
-               for (j = temp; j < pmlmeext->max_chan_nums; j++)
-               {
-                       if (*(peer_ch_list + i) == pmlmeext->channel_set[ j ].ChannelNum)
-                       {
-                               ch_list_inclusioned[ ch_no++ ] = *(peer_ch_list + i);
-                               temp = j;
-                               break;
-                       }
-               }
-       }
-
-       return ch_no;
-}
-
-u8 process_p2p_group_negotation_req23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       u8      result = P2P_STATUS_SUCCESS;
-       u32     p2p_ielen = 0, wps_ielen = 0;
-       u8 * ies;
-       u32 ies_len;
-       u8 *p2p_ie;
-       u8 *wpsie;
-       u16             wps_devicepassword_id = 0x0000;
-       uint    wps_devicepassword_id_len = 0;
-#ifdef CONFIG_8723AU_P2P
-       u8      wfd_ie[MAX_WFD_IE_LEN] = { 0x00 };
-       u32     wfd_ielen = 0;
-#endif /*  CONFIG_8723AU_P2P */
-
-       if ((wpsie = rtw_get_wps_ie23a(pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen)))
-       {
-               /*      Commented by Kurt 20120113 */
-               /*      If some device wants to do p2p handshake without sending prov_disc_req */
-               /*      We have to get peer_req_cm from here. */
-               if (!memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3))
-               {
-                       rtw_get_wps_attr_content23a(wpsie, wps_ielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len);
-                       wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id);
-
-                       if (wps_devicepassword_id == WPS_DPID_USER_SPEC)
-                       {
-                               memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3);
-                       }
-                       else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC)
-                       {
-                               memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3);
-                       }
-                       else
-                       {
-                               memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3);
-                       }
-               }
-       }
-       else
-       {
-               DBG_8723A("[%s] WPS IE not Found!!\n", __func__);
-               result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-               return result;
-       }
-
-       if (pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO)
-       {
-               result = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_TX_INFOR_NOREADY);
-               return result;
-       }
-
-       ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
-       ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-
-       if (!p2p_ie)
-       {
-               DBG_8723A("[%s] P2P IE not Found!!\n", __func__);
-               result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-       }
-
-       while (p2p_ie)
-       {
-               u8      attr_content = 0x00;
-               u32     attr_contentlen = 0;
-               u8      ch_content[50] = { 0x00 };
-               uint    ch_cnt = 0;
-               u8      peer_ch_list[50] = { 0x00 };
-               u8      peer_ch_num = 0;
-               u8      ch_list_inclusioned[50] = { 0x00 };
-               u8      ch_num_inclusioned = 0;
-               u16     cap_attr;
-
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING);
-
-               /* Check P2P Capability ATTR */
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen))
-                       cap_attr = le16_to_cpu(cap_attr);
-
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, &attr_content, &attr_contentlen))
-               {
-                       DBG_8723A("[%s] GO Intent = %d, tie = %d\n", __func__, attr_content >> 1, attr_content & 0x01);
-                       pwdinfo->peer_intent = attr_content;    /*      include both intent and tie breaker values. */
-
-                       if (pwdinfo->intent == (pwdinfo->peer_intent >> 1))
-                       {
-                               /*      Try to match the tie breaker value */
-                               if (pwdinfo->intent == P2P_MAX_INTENT)
-                               {
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                       result = P2P_STATUS_FAIL_BOTH_GOINTENT_15;
-                               }
-                               else
-                               {
-                                       if (attr_content & 0x01)
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                       }
-                                       else
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                       }
-                               }
-                       }
-                       else if (pwdinfo->intent > (pwdinfo->peer_intent >> 1))
-                       {
-                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                       }
-                       else
-                       {
-                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                       }
-
-                       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                       {
-                               /*      Store the group id information. */
-                               memcpy(pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN);
-                               memcpy(pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen);
-                       }
-               }
-
-               attr_contentlen = 0;
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen))
-               {
-                       if (attr_contentlen != ETH_ALEN)
-                       {
-                               memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN);
-                       }
-               }
-
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt))
-               {
-                       peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, ch_content, ch_cnt, peer_ch_list);
-                       ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned);
-
-                       if (ch_num_inclusioned == 0)
-                       {
-                               DBG_8723A("[%s] No common channel in channel list!\n", __func__);
-                               result = P2P_STATUS_FAIL_NO_COMMON_CH;
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                               break;
-                       }
-
-                       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                       {
-                               if (!rtw_p2p_is_channel_list_ok(pwdinfo->operating_channel,
-                                                                                               ch_list_inclusioned, ch_num_inclusioned))
-                               {
-                                       {
-                                               u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0;
-                                               attr_contentlen = 0;
-
-                                               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-                                               {
-                                                       peer_operating_ch = operatingch_info[4];
-                                               }
-
-                                               if (rtw_p2p_is_channel_list_ok(peer_operating_ch,
-                                                                                                               ch_list_inclusioned, ch_num_inclusioned))
-                                               {
-                                                       /**
-                                                        *      Change our operating channel as peer's for compatibility.
-                                                        */
-                                                       pwdinfo->operating_channel = peer_operating_ch;
-                                                       DBG_8723A("[%s] Change op ch to %02x as peer's\n", __func__, pwdinfo->operating_channel);
-                                               }
-                                               else
-                                               {
-                                                       /*  Take first channel of ch_list_inclusioned as operating channel */
-                                                       pwdinfo->operating_channel = ch_list_inclusioned[0];
-                                                       DBG_8723A("[%s] Change op ch to %02x\n", __func__, pwdinfo->operating_channel);
-                                               }
-                                       }
-
-                               }
-                       }
-               }
-
-               /* Get the next P2P IE */
-               p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-       }
-
-#ifdef CONFIG_8723AU_P2P
-       /*      Added by Albert 20110823 */
-       /*      Try to get the TCP port information when receiving the negotiation request. */
-       if (rtw_get_wfd_ie(pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen))
-       {
-               u8      attr_content[ 10 ] = { 0x00 };
-               u32     attr_contentlen = 0;
-
-               DBG_8723A("[%s] WFD IE Found!!\n", __func__);
-               rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
-               if (attr_contentlen)
-               {
-                       pwdinfo->wfd_info->peer_rtsp_ctrlport = get_unaligned_be16(attr_content + 2);
-                       DBG_8723A("[%s] Peer PORT NUM = %d\n", __func__, pwdinfo->wfd_info->peer_rtsp_ctrlport);
-               }
-       }
-#endif /*  CONFIG_8723AU_P2P */
-
-       return result;
-}
-
-u8 process_p2p_group_negotation_resp23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       u8      result = P2P_STATUS_SUCCESS;
-       u32     p2p_ielen, wps_ielen;
-       u8 * ies;
-       u32 ies_len;
-       u8 * p2p_ie;
-#ifdef CONFIG_8723AU_P2P
-       u8      wfd_ie[MAX_WFD_IE_LEN] = { 0x00 };
-       u32     wfd_ielen = 0;
-#endif /*  CONFIG_8723AU_P2P */
-
-       ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
-       ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
-
-       /*      Be able to know which one is the P2P GO and which one is P2P client. */
-
-       if (rtw_get_wps_ie23a(ies, ies_len, NULL, &wps_ielen))
-       {
-
-       }
-       else
-       {
-               DBG_8723A("[%s] WPS IE not Found!!\n", __func__);
-               result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-       }
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-       if (!p2p_ie)
-       {
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-               result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
-       }
-       else
-       {
-
-               u8      attr_content = 0x00;
-               u32     attr_contentlen = 0;
-               u8      operatingch_info[5] = { 0x00 };
-               u8      groupid[ 38 ];
-               u16     cap_attr;
-               u8      peer_ch_list[50] = { 0x00 };
-               u8      peer_ch_num = 0;
-               u8      ch_list_inclusioned[50] = { 0x00 };
-               u8      ch_num_inclusioned = 0;
-
-               while (p2p_ie)  /*      Found the P2P IE. */
-               {
-
-                       /* Check P2P Capability ATTR */
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen))
-                               cap_attr = le16_to_cpu(cap_attr);
-
-                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
-                       if (attr_contentlen == 1)
-                       {
-                               DBG_8723A("[%s] Status = %d\n", __func__, attr_content);
-                               if (attr_content == P2P_STATUS_SUCCESS)
-                               {
-                                       /*      Do nothing. */
-                               }
-                               else
-                               {
-                                       if (P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content) {
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INFOR_NOREADY);
-                                       } else {
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                                       }
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                       result = attr_content;
-                                       break;
-                               }
-                       }
-
-                       /*      Try to get the peer's interface address */
-                       attr_contentlen = 0;
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen))
-                       {
-                               if (attr_contentlen != ETH_ALEN)
-                               {
-                                       memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN);
-                               }
-                       }
-
-                       /*      Try to get the peer's intent and tie breaker value. */
-                       attr_content = 0x00;
-                       attr_contentlen = 0;
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, &attr_content, &attr_contentlen))
-                       {
-                               DBG_8723A("[%s] GO Intent = %d, tie = %d\n", __func__, attr_content >> 1, attr_content & 0x01);
-                               pwdinfo->peer_intent = attr_content;    /*      include both intent and tie breaker values. */
-
-                               if (pwdinfo->intent == (pwdinfo->peer_intent >> 1))
-                               {
-                                       /*      Try to match the tie breaker value */
-                                       if (pwdinfo->intent == P2P_MAX_INTENT)
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                               result = P2P_STATUS_FAIL_BOTH_GOINTENT_15;
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                                       }
-                                       else
-                                       {
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                               if (attr_content & 0x01)
-                                               {
-                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                               }
-                                               else
-                                               {
-                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                               }
-                                       }
-                               }
-                               else if (pwdinfo->intent > (pwdinfo->peer_intent >> 1))
-                               {
-                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                       rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                               }
-                               else
-                               {
-                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                       rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                               }
-
-                               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                               {
-                                       /*      Store the group id information. */
-                                       memcpy(pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN);
-                                       memcpy(pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen);
-
-                               }
-                       }
-
-                       /*      Try to get the operation channel information */
-
-                       attr_contentlen = 0;
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-                       {
-                               DBG_8723A("[%s] Peer's operating channel = %d\n", __func__, operatingch_info[4]);
-                               pwdinfo->peer_operating_ch = operatingch_info[4];
-                       }
-
-                       /*      Try to get the channel list information */
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, pwdinfo->channel_list_attr, &pwdinfo->channel_list_attr_len))
-                       {
-                               DBG_8723A("[%s] channel list attribute found, len = %d\n", __func__,  pwdinfo->channel_list_attr_len);
-
-                               peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len, peer_ch_list);
-                               ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned);
-
-                               if (ch_num_inclusioned == 0)
-                               {
-                                       DBG_8723A("[%s] No common channel in channel list!\n", __func__);
-                                       result = P2P_STATUS_FAIL_NO_COMMON_CH;
-                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                                       break;
-                               }
-
-                               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                               {
-                                       if (!rtw_p2p_is_channel_list_ok(pwdinfo->operating_channel,
-                                                                                                       ch_list_inclusioned, ch_num_inclusioned))
-                                       {
-                                               {
-                                                       u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0;
-                                                       attr_contentlen = 0;
-
-                                                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-                                                       {
-                                                               peer_operating_ch = operatingch_info[4];
-                                                       }
-
-                                                       if (rtw_p2p_is_channel_list_ok(peer_operating_ch,
-                                                                                                                       ch_list_inclusioned, ch_num_inclusioned))
-                                                       {
-                                                               /**
-                                                                *      Change our operating channel as peer's for compatibility.
-                                                                */
-                                                               pwdinfo->operating_channel = peer_operating_ch;
-                                                               DBG_8723A("[%s] Change op ch to %02x as peer's\n", __func__, pwdinfo->operating_channel);
-                                                       }
-                                                       else
-                                                       {
-                                                               /*  Take first channel of ch_list_inclusioned as operating channel */
-                                                               pwdinfo->operating_channel = ch_list_inclusioned[0];
-                                                               DBG_8723A("[%s] Change op ch to %02x\n", __func__, pwdinfo->operating_channel);
-                                                       }
-                                               }
-
-                                       }
-                               }
-
-                       }
-                       else
-                       {
-                               DBG_8723A("[%s] channel list attribute not found!\n", __func__);
-                       }
-
-                       /*      Try to get the group id information if peer is GO */
-                       attr_contentlen = 0;
-                       memset(groupid, 0x00, 38);
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen))
-                       {
-                               memcpy(pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN);
-                               memcpy(pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN);
-                       }
-
-                       /* Get the next P2P IE */
-                       p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-               }
-
-       }
-
-#ifdef CONFIG_8723AU_P2P
-       /*      Added by Albert 20111122 */
-       /*      Try to get the TCP port information when receiving the negotiation response. */
-       if (rtw_get_wfd_ie(pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen))
-       {
-               u8      attr_content[ 10 ] = { 0x00 };
-               u32     attr_contentlen = 0;
-
-               DBG_8723A("[%s] WFD IE Found!!\n", __func__);
-               rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
-               if (attr_contentlen)
-               {
-                       pwdinfo->wfd_info->peer_rtsp_ctrlport = get_unaligned_be16(attr_content + 2);
-                       DBG_8723A("[%s] Peer PORT NUM = %d\n", __func__, pwdinfo->wfd_info->peer_rtsp_ctrlport);
-               }
-       }
-#endif /*  CONFIG_8723AU_P2P */
-
-       return result;
-}
-
-u8 process_p2p_group_negotation_confirm23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       u8 * ies;
-       u32 ies_len;
-       u8 * p2p_ie;
-       u32     p2p_ielen = 0;
-       u8      result = P2P_STATUS_SUCCESS;
-       ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
-       ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-       while (p2p_ie)  /*      Found the P2P IE. */
-       {
-               u8      attr_content = 0x00, operatingch_info[5] = { 0x00 };
-               u8      groupid[ 38 ] = { 0x00 };
-               u32     attr_contentlen = 0;
-
-               pwdinfo->negotiation_dialog_token = 1;
-               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
-               if (attr_contentlen == 1)
-               {
-                       DBG_8723A("[%s] Status = %d\n", __func__, attr_content);
-                       result = attr_content;
-
-                       if (attr_content == P2P_STATUS_SUCCESS)
-                       {
-                               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-
-                               /*      Commented by Albert 20100911 */
-                               /*      Todo: Need to handle the case which both Intents are the same. */
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                               if ((pwdinfo->intent) > (pwdinfo->peer_intent >> 1))
-                               {
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                               }
-                               else if ((pwdinfo->intent) < (pwdinfo->peer_intent >> 1))
-                               {
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                               }
-                               else
-                               {
-                                       /*      Have to compare the Tie Breaker */
-                                       if (pwdinfo->peer_intent & 0x01)
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                       }
-                                       else
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                       }
-                               }
-                       }
-                       else
-                       {
-                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                               break;
-                       }
-               }
-
-               /*      Try to get the group id information */
-               attr_contentlen = 0;
-               memset(groupid, 0x00, 38);
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen))
-               {
-                       DBG_8723A("[%s] Ssid = %s, ssidlen = %zu\n", __func__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN]));
-                       memcpy(pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN);
-                       memcpy(pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN);
-               }
-
-               attr_contentlen = 0;
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-               {
-                       DBG_8723A("[%s] Peer's operating channel = %d\n", __func__, operatingch_info[4]);
-                       pwdinfo->peer_operating_ch = operatingch_info[4];
-               }
-
-               /* Get the next P2P IE */
-               p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-
-       }
-
-       return result;
-}
-
-u8 process_p2p_presence_req23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       u8 *frame_body;
-       u8 dialogToken = 0;
-       u8 status = P2P_STATUS_SUCCESS;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) pframe;
-
-       frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       dialogToken = frame_body[6];
-
-       /* todo: check NoA attribute */
-
-       issue_p2p_presence_resp(pwdinfo, hdr->addr2, status, dialogToken);
-
-       return true;
-}
-
-static void find_phase_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct cfg80211_ssid ssid;
-       u8                                      _status = 0;
-
-
-
-       memset((unsigned char*)&ssid, 0, sizeof(struct cfg80211_ssid));
-       memcpy(ssid.ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN);
-       ssid.ssid_len = P2P_WILDCARD_SSID_LEN;
-
-       rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
-
-       spin_lock_bh(&pmlmepriv->lock);
-       _status = rtw_sitesurvey_cmd23a(padapter, &ssid, 1, NULL, 0);
-       spin_unlock_bh(&pmlmepriv->lock);
-
-
-}
-
-void p2p_concurrent_handler(struct rtw_adapter* padapter);
-
-static void restore_p2p_state_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-
-       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) {
-               /*      In the P2P client mode, the driver should not switch back to its listen channel */
-               /*      because this P2P client should stay at the operating channel of P2P GO. */
-               set_channel_bwmode23a(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
-       }
-}
-
-static void pre_tx_invitereq_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       u8      val8 = 1;
-
-       set_channel_bwmode23a(padapter, pwdinfo->invitereq_info.peer_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
-       padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
-       issue23a_probereq_p2p(padapter, NULL);
-       mod_timer(&pwdinfo->pre_tx_scan_timer,
-                 jiffies + msecs_to_jiffies(P2P_TX_PRESCAN_TIMEOUT));
-
-
-}
-
-static void pre_tx_provdisc_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       u8      val8 = 1;
-
-
-       set_channel_bwmode23a(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
-       issue23a_probereq_p2p(padapter, NULL);
-       mod_timer(&pwdinfo->pre_tx_scan_timer,
-                 jiffies + msecs_to_jiffies(P2P_TX_PRESCAN_TIMEOUT));
-
-
-}
-
-static void pre_tx_negoreq_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       u8      val8 = 1;
-
-
-       set_channel_bwmode23a(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
-       issue23a_probereq_p2p(padapter, NULL);
-       mod_timer(&pwdinfo->pre_tx_scan_timer,
-                 jiffies + msecs_to_jiffies(P2P_TX_PRESCAN_TIMEOUT));
-
-
-}
-
-static void ro_ch_handler(struct rtw_adapter *padapter)
-{
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-
-       if (pcfg80211_wdinfo->restore_channel != pmlmeext->cur_channel) {
-               if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED))
-                       pmlmeext->cur_channel = pcfg80211_wdinfo->restore_channel;
-
-               set_channel_bwmode23a(padapter, pmlmeext->cur_channel,
-                                     HAL_PRIME_CHNL_OFFSET_DONT_CARE,
-                                     HT_CHANNEL_WIDTH_20);
-       }
-
-       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-
-       pcfg80211_wdinfo->is_ro_ch = false;
-
-       DBG_8723A("cfg80211_remain_on_channel_expired\n");
-
-       rtw_cfg80211_remain_on_channel_expired(padapter,
-               pcfg80211_wdinfo->remain_on_ch_cookie,
-               &pcfg80211_wdinfo->remain_on_ch_channel,
-               pcfg80211_wdinfo->remain_on_ch_type, GFP_KERNEL);
-}
-
-static void ro_ch_timer_process (unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-
-       p2p_protocol_wk_cmd23a(adapter, P2P_RO_CH_WK);
-}
-
-#ifdef CONFIG_8723AU_P2P
-void rtw_append_wfd_ie(struct rtw_adapter *padapter, u8 *buf, u32* len)
-{
-       unsigned char   *frame_body;
-       u8 category, action, OUI_Subtype, dialogToken = 0;
-       u32     wfdielen = 0;
-
-       frame_body = (unsigned char *)(buf + sizeof(struct ieee80211_hdr_3addr));
-       category = frame_body[0];
-
-       if (category == WLAN_CATEGORY_PUBLIC) {
-               action = frame_body[1];
-               if (action == ACT_PUBLIC_VENDOR &&
-                   !memcmp(frame_body+2, P2P_OUI23A, 4)) {
-                       OUI_Subtype = frame_body[6];
-                       dialogToken = frame_body[7];
-                       switch (OUI_Subtype)/* OUI Subtype */ {
-                       case P2P_GO_NEGO_REQ:
-                               wfdielen = build_nego_req_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_GO_NEGO_RESP:
-                               wfdielen = build_nego_resp_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_GO_NEGO_CONF:
-                               wfdielen = build_nego_confirm_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_INVIT_REQ:
-                               wfdielen = build_invitation_req_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_INVIT_RESP:
-                               wfdielen = build_invitation_resp_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_DEVDISC_REQ:
-                               break;
-                       case P2P_DEVDISC_RESP:
-                               break;
-                       case P2P_PROVISION_DISC_REQ:
-                               wfdielen = build_provdisc_req_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_PROVISION_DISC_RESP:
-                               wfdielen = build_provdisc_resp_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       default:
-                               break;
-                       }
-               }
-       } else if (category == WLAN_CATEGORY_VENDOR_SPECIFIC) {
-               OUI_Subtype = frame_body[5];
-               dialogToken = frame_body[6];
-       } else {
-               DBG_8723A("%s, action frame category =%d\n", __func__, category);
-       }
-}
-#endif
-
-int rtw_p2p_check_frames(struct rtw_adapter *padapter, const u8 *buf, u32 len, u8 tx)
-{
-       int is_p2p_frame = (-1);
-       unsigned char   *frame_body;
-       u8 category, action, OUI_Subtype, dialogToken = 0;
-       u8 *p2p_ie = NULL;
-       uint p2p_ielen = 0;
-       struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
-
-       frame_body = (unsigned char *)(buf + sizeof(struct ieee80211_hdr_3addr));
-       category = frame_body[0];
-       /* just for check */
-       if (category == WLAN_CATEGORY_PUBLIC)
-       {
-               action = frame_body[1];
-               if (action == ACT_PUBLIC_VENDOR &&
-                   !memcmp(frame_body+2, P2P_OUI23A, 4)) {
-                       OUI_Subtype = frame_body[6];
-                       dialogToken = frame_body[7];
-                       is_p2p_frame = OUI_Subtype;
-                       p2p_ie = rtw_get_p2p_ie23a(
-                               (u8 *)buf+sizeof(struct ieee80211_hdr_3addr)+_PUBLIC_ACTION_IE_OFFSET_,
-                               len-sizeof(struct ieee80211_hdr_3addr)-_PUBLIC_ACTION_IE_OFFSET_,
-                               NULL, &p2p_ielen);
-
-                       switch (OUI_Subtype) {/* OUI Subtype */
-                       u8 *cont;
-                       uint cont_len;
-                       case P2P_GO_NEGO_REQ:
-                               DBG_8723A("RTW_%s:P2P_GO_NEGO_REQ, dialogToken =%d\n", (tx == true)?"Tx":"Rx", dialogToken);
-                               break;
-                       case P2P_GO_NEGO_RESP:
-                               cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len);
-                               DBG_8723A("RTW_%s:P2P_GO_NEGO_RESP, dialogToken =%d, status:%d\n", (tx == true)?"Tx":"Rx", dialogToken, cont?*cont:-1);
-
-                               if (!tx)
-                                       pwdev_priv->provdisc_req_issued = false;
-                               break;
-                       case P2P_GO_NEGO_CONF:
-                               cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len);
-                               DBG_8723A("RTW_%s:P2P_GO_NEGO_CONF, dialogToken =%d, status:%d\n",
-                                         (tx == true)?"Tx":"Rx", dialogToken, cont?*cont:-1);
-                               break;
-                       case P2P_INVIT_REQ:
-                       {
-                               struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;
-                               int flags = -1;
-                               int op_ch = 0;
-
-                               if ((cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, NULL, &cont_len)))
-                                       flags = *cont;
-                               if ((cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
-                                       op_ch = *(cont+4);
-
-                               if (invit_info->token != dialogToken)
-                                       rtw_wdev_invit_info_init(invit_info);
-
-                               invit_info->token = dialogToken;
-                               invit_info->flags = (flags ==-1) ? 0x0 : flags;
-                               invit_info->req_op_ch = op_ch;
-
-                               DBG_8723A("RTW_%s:P2P_INVIT_REQ, dialogToken =%d, flags:0x%02x, op_ch:%d\n",
-                                         (tx) ? "Tx" : "Rx", dialogToken, flags, op_ch);
-                               break;
-                       }
-                       case P2P_INVIT_RESP:
-                       {
-                               struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;
-                               int status = -1;
-                               int op_ch = 0;
-
-                               if ((cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len)))
-                                       status = *cont;
-                               if ((cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
-                                       op_ch = *(cont+4);
-
-                               if (invit_info->token != dialogToken) {
-                                       rtw_wdev_invit_info_init(invit_info);
-                               } else {
-                                       invit_info->token = 0;
-                                       invit_info->status = (status ==-1) ? 0xff : status;
-                                       invit_info->rsp_op_ch = op_ch;
-                               }
-
-                               DBG_8723A("RTW_%s:P2P_INVIT_RESP, dialogToken =%d, status:%d, op_ch:%d\n",
-                                         (tx == true)?"Tx":"Rx", dialogToken, status, op_ch);
-                               break;
-                       }
-                       case P2P_DEVDISC_REQ:
-                               DBG_8723A("RTW_%s:P2P_DEVDISC_REQ, dialogToken =%d\n", (tx == true)?"Tx":"Rx", dialogToken);
-                               break;
-                       case P2P_DEVDISC_RESP:
-                               cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len);
-                               DBG_8723A("RTW_%s:P2P_DEVDISC_RESP, dialogToken =%d, status:%d\n", (tx == true)?"Tx":"Rx", dialogToken, cont?*cont:-1);
-                               break;
-                       case P2P_PROVISION_DISC_REQ:
-                       {
-                               size_t frame_body_len = len - sizeof(struct ieee80211_hdr_3addr);
-                               u8 *p2p_ie;
-                               uint p2p_ielen = 0;
-                               uint contentlen = 0;
-
-                               DBG_8723A("RTW_%s:P2P_PROVISION_DISC_REQ, dialogToken =%d\n", (tx == true)?"Tx":"Rx", dialogToken);
-
-                               pwdev_priv->provdisc_req_issued = false;
-
-                               p2p_ie = rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                                                          frame_body_len - _PUBLIC_ACTION_IE_OFFSET_,
-                                                          NULL, &p2p_ielen);
-                               if (p2p_ie) {
-                                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, NULL, &contentlen))
-                                               pwdev_priv->provdisc_req_issued = false;/* case: p2p_client join p2p GO */
-                                       else
-                                               pwdev_priv->provdisc_req_issued = true;/* case: p2p_devices connection before Nego req. */
-                               }
-                       }
-                               break;
-                       case P2P_PROVISION_DISC_RESP:
-                               DBG_8723A("RTW_%s:P2P_PROVISION_DISC_RESP, dialogToken =%d\n", (tx == true)?"Tx":"Rx", dialogToken);
-                               break;
-                       default:
-                               DBG_8723A("RTW_%s:OUI_Subtype =%d, dialogToken =%d\n", (tx == true)?"Tx":"Rx", OUI_Subtype, dialogToken);
-                               break;
-                       }
-
-               }
-
-       }
-       else if (category == WLAN_CATEGORY_VENDOR_SPECIFIC)
-       {
-               OUI_Subtype = frame_body[5];
-               dialogToken = frame_body[6];
-
-               is_p2p_frame = OUI_Subtype;
-
-               switch (OUI_Subtype) {
-               case P2P_NOTICE_OF_ABSENCE:
-                       DBG_8723A("RTW_%s:P2P_NOTICE_OF_ABSENCE, dialogToken =%d\n", (tx == true)?"TX":"RX", dialogToken);
-                       break;
-               case P2P_PRESENCE_REQUEST:
-                       DBG_8723A("RTW_%s:P2P_PRESENCE_REQUEST, dialogToken =%d\n", (tx == true)?"TX":"RX", dialogToken);
-                       break;
-               case P2P_PRESENCE_RESPONSE:
-                       DBG_8723A("RTW_%s:P2P_PRESENCE_RESPONSE, dialogToken =%d\n", (tx == true)?"TX":"RX", dialogToken);
-                       break;
-               case P2P_GO_DISC_REQUEST:
-                       DBG_8723A("RTW_%s:P2P_GO_DISC_REQUEST, dialogToken =%d\n", (tx == true)?"TX":"RX", dialogToken);
-                       break;
-               default:
-                       DBG_8723A("RTW_%s:OUI_Subtype =%d, dialogToken =%d\n", (tx == true)?"TX":"RX", OUI_Subtype, dialogToken);
-                       break;
-               }
-
-       } else {
-               DBG_8723A("RTW_%s:action frame category =%d\n", (tx == true)?"TX":"RX", category);
-       }
-       return is_p2p_frame;
-}
-
-void rtw_init_cfg80211_wifidirect_info(struct rtw_adapter *padapter)
-{
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
-
-       memset(pcfg80211_wdinfo, 0x00, sizeof(struct cfg80211_wifidirect_info));
-
-       setup_timer(&pcfg80211_wdinfo->remain_on_ch_timer,
-                   ro_ch_timer_process, (unsigned long)padapter);
-}
-
-void p2p_protocol_wk_hdl23a(struct rtw_adapter *padapter, int intCmdType)
-{
-       switch (intCmdType) {
-       case P2P_FIND_PHASE_WK:
-               find_phase_handler(padapter);
-               break;
-       case P2P_RESTORE_STATE_WK:
-               restore_p2p_state_handler(padapter);
-               break;
-       case P2P_PRE_TX_PROVDISC_PROCESS_WK:
-               pre_tx_provdisc_handler(padapter);
-               break;
-       case P2P_PRE_TX_INVITEREQ_PROCESS_WK:
-               pre_tx_invitereq_handler(padapter);
-               break;
-       case P2P_PRE_TX_NEGOREQ_PROCESS_WK:
-               pre_tx_negoreq_handler(padapter);
-               break;
-       case P2P_RO_CH_WK:
-               ro_ch_handler(padapter);
-               break;
-       }
-}
-
-#ifdef CONFIG_8723AU_P2P
-void process_p2p_ps_ie23a(struct rtw_adapter *padapter, u8 *IEs, u32 IELength)
-{
-       u8 * ies;
-       u32 ies_len;
-       u8 * p2p_ie;
-       u32     p2p_ielen = 0;
-       u8      noa_attr[MAX_P2P_IE_LEN] = { 0x00 };/*  NoA length should be n*(13) + 2 */
-       u32     attr_contentlen = 0;
-
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       u8      find_p2p = false, find_p2p_ps = false;
-       u8      noa_offset, noa_num, noa_index;
-
-
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-       {
-               return;
-       }
-       if (IELength <= _BEACON_IE_OFFSET_)
-               return;
-
-       ies = IEs + _BEACON_IE_OFFSET_;
-       ies_len = IELength - _BEACON_IE_OFFSET_;
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-
-       while(p2p_ie)
-       {
-               find_p2p = true;
-               /*  Get Notice of Absence IE. */
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen))
-               {
-                       find_p2p_ps = true;
-                       noa_index = noa_attr[0];
-
-                       if ((pwdinfo->p2p_ps_mode == P2P_PS_NONE) ||
-                               (noa_index != pwdinfo->noa_index))/*  if index change, driver should reconfigure related setting. */
-                       {
-                               pwdinfo->noa_index = noa_index;
-                               pwdinfo->opp_ps = noa_attr[1] >> 7;
-                               pwdinfo->ctwindow = noa_attr[1] & 0x7F;
-
-                               noa_offset = 2;
-                               noa_num = 0;
-                               /*  NoA length should be n*(13) + 2 */
-                               if (attr_contentlen > 2)
-                               {
-                                       while(noa_offset < attr_contentlen)
-                                       {
-                                               /* memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1); */
-                                               pwdinfo->noa_count[noa_num] = noa_attr[noa_offset];
-                                               noa_offset += 1;
-
-                                               memcpy(&pwdinfo->noa_duration[noa_num], &noa_attr[noa_offset], 4);
-                                               noa_offset += 4;
-
-                                               memcpy(&pwdinfo->noa_interval[noa_num], &noa_attr[noa_offset], 4);
-                                               noa_offset += 4;
-
-                                               memcpy(&pwdinfo->noa_start_time[noa_num], &noa_attr[noa_offset], 4);
-                                               noa_offset += 4;
-
-                                               noa_num++;
-                                       }
-                               }
-                               pwdinfo->noa_num = noa_num;
-
-                               if (pwdinfo->opp_ps == 1)
-                               {
-                                       pwdinfo->p2p_ps_mode = P2P_PS_CTWINDOW;
-                                       /*  driver should wait LPS for entering CTWindow */
-                                       if (padapter->pwrctrlpriv.bFwCurrentInPSMode == true)
-                                       {
-                                               p2p_ps_wk_cmd23a(padapter, P2P_PS_ENABLE, 1);
-                                       }
-                               }
-                               else if (pwdinfo->noa_num > 0)
-                               {
-                                       pwdinfo->p2p_ps_mode = P2P_PS_NOA;
-                                       p2p_ps_wk_cmd23a(padapter, P2P_PS_ENABLE, 1);
-                               }
-                               else if (pwdinfo->p2p_ps_mode > P2P_PS_NONE)
-                               {
-                                       p2p_ps_wk_cmd23a(padapter, P2P_PS_DISABLE, 1);
-                               }
-                       }
-
-                       break; /*  find target, just break. */
-               }
-
-               /* Get the next P2P IE */
-               p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-
-       }
-
-       if (find_p2p == true)
-       {
-               if ((pwdinfo->p2p_ps_mode > P2P_PS_NONE) && (find_p2p_ps == false))
-               {
-                       p2p_ps_wk_cmd23a(padapter, P2P_PS_DISABLE, 1);
-               }
-       }
-
-
-}
-
-void p2p_ps_wk_hdl23a(struct rtw_adapter *padapter, u8 p2p_ps_state)
-{
-       struct pwrctrl_priv             *pwrpriv = &padapter->pwrctrlpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-
-
-       /*  Pre action for p2p state */
-       switch (p2p_ps_state)
-       {
-               case P2P_PS_DISABLE:
-                       pwdinfo->p2p_ps_state = p2p_ps_state;
-
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
-
-                       pwdinfo->noa_index = 0;
-                       pwdinfo->ctwindow = 0;
-                       pwdinfo->opp_ps = 0;
-                       pwdinfo->noa_num = 0;
-                       pwdinfo->p2p_ps_mode = P2P_PS_NONE;
-                       if (padapter->pwrctrlpriv.bFwCurrentInPSMode == true)
-                       {
-                               if (pwrpriv->smart_ps == 0)
-                               {
-                                       pwrpriv->smart_ps = 2;
-                                       rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)&padapter->pwrctrlpriv.pwr_mode);
-                               }
-                       }
-                       break;
-               case P2P_PS_ENABLE:
-                       if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {
-                               pwdinfo->p2p_ps_state = p2p_ps_state;
-
-                               if (pwdinfo->ctwindow > 0)
-                               {
-                                       if (pwrpriv->smart_ps != 0)
-                                       {
-                                               pwrpriv->smart_ps = 0;
-                                               DBG_8723A("%s(): Enter CTW, change SmartPS\n", __func__);
-                                               rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)&padapter->pwrctrlpriv.pwr_mode);
-                                       }
-                               }
-                               rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
-                       }
-                       break;
-               case P2P_PS_SCAN:
-               case P2P_PS_SCAN_DONE:
-               case P2P_PS_ALLSTASLEEP:
-                       if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {
-                               pwdinfo->p2p_ps_state = p2p_ps_state;
-                               rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
-                       }
-                       break;
-               default:
-                       break;
-       }
-
-
-}
-
-u8 p2p_ps_wk_cmd23a(struct rtw_adapter*padapter, u8 p2p_ps_state, u8 enqueue)
-{
-       struct cmd_obj  *ph2c;
-       struct drvextra_cmd_parm        *pdrvextra_cmd_parm;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
-       u8      res = _SUCCESS;
-
-
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return res;
-
-       if (enqueue) {
-               ph2c = (struct cmd_obj *)kzalloc(sizeof(struct cmd_obj),
-                                                GFP_ATOMIC);
-               if (!ph2c) {
-                       res = _FAIL;
-                       goto exit;
-               }
-
-               pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)
-                       kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC);
-               if (pdrvextra_cmd_parm == NULL) {
-                       kfree(ph2c);
-                       res = _FAIL;
-                       goto exit;
-               }
-
-               pdrvextra_cmd_parm->ec_id = P2P_PS_WK_CID;
-               pdrvextra_cmd_parm->type_size = p2p_ps_state;
-               pdrvextra_cmd_parm->pbuf = NULL;
-
-               init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
-
-               res = rtw_enqueue_cmd23a(pcmdpriv, ph2c);
-       }
-       else
-       {
-               p2p_ps_wk_hdl23a(padapter, p2p_ps_state);
-       }
-
-exit:
-
-
-
-       return res;
-}
-#endif /*  CONFIG_8723AU_P2P */
-
-static void reset_ch_sitesurvey_timer_process(unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct  wifidirect_info *pwdinfo = &adapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /*      Reset the operation channel information */
-       pwdinfo->rx_invitereq_info.operation_ch[0] = 0;
-       pwdinfo->rx_invitereq_info.scan_op_ch_only = 0;
-}
-
-static void reset_ch_sitesurvey_timer_process2(unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct wifidirect_info *pwdinfo = &adapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /*      Reset the operation channel information */
-       pwdinfo->p2p_info.operation_ch[0] = 0;
-       pwdinfo->p2p_info.scan_op_ch_only = 0;
-}
-
-static void restore_p2p_state_timer_process (unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct  wifidirect_info         *pwdinfo = &adapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       p2p_protocol_wk_cmd23a(adapter, P2P_RESTORE_STATE_WK);
-}
-
-static void pre_tx_scan_timer_process (unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct wifidirect_info *pwdinfo = &adapter->wdinfo;
-       struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       spin_lock_bh(&pmlmepriv->lock);
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))
-       {
-               if (true == pwdinfo->tx_prov_disc_info.benable) /*      the provision discovery request frame is trigger to send or not */
-               {
-                       p2p_protocol_wk_cmd23a(adapter, P2P_PRE_TX_PROVDISC_PROCESS_WK);
-                       /* issue23a_probereq_p2p(adapter, NULL); */
-                       /* _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); */
-               }
-       }
-       else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
-       {
-               if (true == pwdinfo->nego_req_info.benable)
-               {
-                       p2p_protocol_wk_cmd23a(adapter, P2P_PRE_TX_NEGOREQ_PROCESS_WK);
-               }
-       }
-       else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ))
-       {
-               if (true == pwdinfo->invitereq_info.benable)
-               {
-                       p2p_protocol_wk_cmd23a(adapter, P2P_PRE_TX_INVITEREQ_PROCESS_WK);
-               }
-       }
-       else
-       {
-               DBG_8723A("[%s] p2p_state is %d, ignore!!\n", __func__, rtw_p2p_state(pwdinfo));
-       }
-
-       spin_unlock_bh(&pmlmepriv->lock);
-}
-
-static void find_phase_timer_process (unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct  wifidirect_info         *pwdinfo = &adapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       adapter->wdinfo.find_phase_state_exchange_cnt++;
-
-       p2p_protocol_wk_cmd23a(adapter, P2P_FIND_PHASE_WK);
-}
-
-void reset_global_wifidirect_info23a(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo;
-
-       pwdinfo = &padapter->wdinfo;
-       pwdinfo->persistent_supported = 0;
-       pwdinfo->session_available = true;
-       pwdinfo->wfd_tdls_enable = 0;
-       pwdinfo->wfd_tdls_weaksec = 0;
-}
-
-#ifdef CONFIG_8723AU_P2P
-int rtw_init_wifi_display_info(struct rtw_adapter* padapter)
-{
-       int     res = _SUCCESS;
-       struct wifi_display_info *pwfd_info = &padapter->wfd_info;
-
-       /*  Used in P2P and TDLS */
-       pwfd_info->rtsp_ctrlport = 554;
-       pwfd_info->peer_rtsp_ctrlport = 0;      /*      Reset to 0 */
-       pwfd_info->wfd_enable = false;
-       pwfd_info->wfd_device_type = WFD_DEVINFO_PSINK;
-       pwfd_info->scan_result_type = SCAN_RESULT_P2P_ONLY;
-
-       /*  Used in P2P */
-       pwfd_info->peer_session_avail = true;
-       pwfd_info->wfd_pc = false;
-
-       /*  Used in TDLS */
-       memset(pwfd_info->ip_address, 0x00, 4);
-       memset(pwfd_info->peer_ip_address, 0x00, 4);
-       return res;
-}
-#endif /* CONFIG_8723AU_P2P */
-
-void rtw_init_wifidirect_timers23a(struct rtw_adapter* padapter)
-{
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       setup_timer(&pwdinfo->find_phase_timer, find_phase_timer_process,
-                   (unsigned long)padapter);
-       setup_timer(&pwdinfo->restore_p2p_state_timer,
-                   restore_p2p_state_timer_process, (unsigned long)padapter);
-       setup_timer(&pwdinfo->pre_tx_scan_timer, pre_tx_scan_timer_process,
-                   (unsigned long)padapter);
-       setup_timer(&pwdinfo->reset_ch_sitesurvey,
-                   reset_ch_sitesurvey_timer_process, (unsigned long)padapter);
-       setup_timer(&pwdinfo->reset_ch_sitesurvey2,
-                   reset_ch_sitesurvey_timer_process2,
-                   (unsigned long)padapter);
-}
-
-void rtw_init_wifidirect_addrs23a(struct rtw_adapter* padapter, u8 *dev_addr, u8 *iface_addr)
-{
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       /*init device&interface address */
-       if (dev_addr) {
-               memcpy(pwdinfo->device_addr, dev_addr, ETH_ALEN);
-       }
-       if (iface_addr) {
-               memcpy(pwdinfo->interface_addr, iface_addr, ETH_ALEN);
-       }
-#endif
-}
-
-void init_wifidirect_info23a(struct rtw_adapter *padapter, enum P2P_ROLE role)
-{
-       struct wifidirect_info  *pwdinfo;
-#ifdef CONFIG_8723AU_P2P
-       struct wifi_display_info        *pwfd_info = &padapter->wfd_info;
-#endif
-
-       pwdinfo = &padapter->wdinfo;
-
-       pwdinfo->padapter = padapter;
-
-       /*      1, 6, 11 are the social channel defined in the WiFi Direct specification. */
-       pwdinfo->social_chan[0] = 1;
-       pwdinfo->social_chan[1] = 6;
-       pwdinfo->social_chan[2] = 11;
-       pwdinfo->social_chan[3] = 0;    /*      channel 0 for scanning ending in site survey function. */
-
-       /*      Use the channel 11 as the listen channel */
-       pwdinfo->listen_channel = 11;
-
-       if (role == P2P_ROLE_DEVICE)
-       {
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
-               pwdinfo->intent = 1;
-               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_LISTEN);
-       }
-       else if (role == P2P_ROLE_CLIENT)
-       {
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-               pwdinfo->intent = 1;
-               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-       }
-       else if (role == P2P_ROLE_GO)
-       {
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-               pwdinfo->intent = 15;
-               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-       }
-
-/*     Use the OFDM rate in the P2P probe response frame. (6(B), 9(B), 12, 18, 24, 36, 48, 54) */
-       pwdinfo->support_rate[0] = 0x8c;        /*      6(B) */
-       pwdinfo->support_rate[1] = 0x92;        /*      9(B) */
-       pwdinfo->support_rate[2] = 0x18;        /*      12 */
-       pwdinfo->support_rate[3] = 0x24;        /*      18 */
-       pwdinfo->support_rate[4] = 0x30;        /*      24 */
-       pwdinfo->support_rate[5] = 0x48;        /*      36 */
-       pwdinfo->support_rate[6] = 0x60;        /*      48 */
-       pwdinfo->support_rate[7] = 0x6c;        /*      54 */
-
-       memcpy((void*) pwdinfo->p2p_wildcard_ssid, "DIRECT-", 7);
-
-       memset(pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN);
-       pwdinfo->device_name_len = 0;
-
-       memset(&pwdinfo->invitereq_info, 0x00, sizeof(struct tx_invite_req_info));
-       pwdinfo->invitereq_info.token = 3;      /*      Token used for P2P invitation request frame. */
-
-       memset(&pwdinfo->inviteresp_info, 0x00, sizeof(struct tx_invite_resp_info));
-       pwdinfo->inviteresp_info.token = 0;
-
-       pwdinfo->profileindex = 0;
-       memset(&pwdinfo->profileinfo[ 0 ], 0x00, sizeof(struct profile_info) * P2P_MAX_PERSISTENT_GROUP_NUM);
-
-       rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
-
-       pwdinfo->listen_dwell = (u8) ((jiffies % 3) + 1);
-       /* DBG_8723A("[%s] listen_dwell time is %d00ms\n", __func__, pwdinfo->listen_dwell); */
-
-       memset(&pwdinfo->tx_prov_disc_info, 0x00, sizeof(struct tx_provdisc_req_info));
-       pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_NONE;
-
-       memset(&pwdinfo->nego_req_info, 0x00, sizeof(struct tx_nego_req_info));
-
-       pwdinfo->device_password_id_for_nego = WPS_DPID_PBC;
-       pwdinfo->negotiation_dialog_token = 1;
-
-       memset(pwdinfo->nego_ssid, 0x00, IEEE80211_MAX_SSID_LEN);
-       pwdinfo->nego_ssidlen = 0;
-
-       pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO;
-#ifdef CONFIG_8723AU_P2P
-       pwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY  | WPS_CONFIG_METHOD_PBC;
-       pwdinfo->wfd_info = pwfd_info;
-#else
-       pwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY | WPS_CONFIG_METHOD_PBC | WPS_CONFIG_METHOD_KEYPAD;
-#endif /* CONFIG_8723AU_P2P */
-       pwdinfo->channel_list_attr_len = 0;
-       memset(pwdinfo->channel_list_attr, 0x00, 100);
-
-       memset(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, 0x00, 4);
-       memset(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, '0', 3);
-       memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info));
-       pwdinfo->wfd_tdls_enable = 0;
-       memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN);
-       memset(pwdinfo->p2p_peer_device_addr, 0x00, ETH_ALEN);
-
-       pwdinfo->rx_invitereq_info.operation_ch[0] = 0;
-       pwdinfo->rx_invitereq_info.operation_ch[1] = 0; /*      Used to indicate the scan end in site survey function */
-       pwdinfo->rx_invitereq_info.scan_op_ch_only = 0;
-       pwdinfo->p2p_info.operation_ch[0] = 0;
-       pwdinfo->p2p_info.operation_ch[1] = 0;                  /*      Used to indicate the scan end in site survey function */
-       pwdinfo->p2p_info.scan_op_ch_only = 0;
-}
-
-int rtw_p2p_enable23a(struct rtw_adapter *padapter, enum P2P_ROLE role)
-{
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       int ret = _SUCCESS;
-
-       if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT ||
-           role == P2P_ROLE_GO) {
-               /* leave IPS/Autosuspend */
-               if (_FAIL == rtw_pwr_wakeup(padapter)) {
-                       ret = _FAIL;
-                       goto exit;
-               }
-
-               /*      Added by Albert 2011/03/22 */
-               /*      In the P2P mode, the driver should not support the b mode. */
-               /*      So, the Tx packet shouldn't use the CCK rate */
-               update_tx_basic_rate23a(padapter, WIRELESS_11AGN);
-
-               /* Enable P2P function */
-               init_wifidirect_info23a(padapter, role);
-
-               rtw_hal_set_odm_var23a(padapter, HAL_ODM_P2P_STATE, NULL, true);
-               #ifdef CONFIG_8723AU_P2P
-               rtw_hal_set_odm_var23a(padapter, HAL_ODM_WIFI_DISPLAY_STATE, NULL, true);
-               #endif
-
-       }
-       else if (role == P2P_ROLE_DISABLE)
-       {
-               if (_FAIL == rtw_pwr_wakeup(padapter)) {
-                       ret = _FAIL;
-                       goto exit;
-               }
-
-               /* Disable P2P function */
-               if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               {
-                       del_timer_sync(&pwdinfo->find_phase_timer);
-                       del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                       del_timer_sync(&pwdinfo->pre_tx_scan_timer);
-                       del_timer_sync(&pwdinfo->reset_ch_sitesurvey);
-                       del_timer_sync(&pwdinfo->reset_ch_sitesurvey2);
-                       reset_ch_sitesurvey_timer_process((unsigned long)padapter);
-                       reset_ch_sitesurvey_timer_process2((unsigned long)padapter);
-                       rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
-                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);
-                       memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));
-               }
-
-               rtw_hal_set_odm_var23a(padapter, HAL_ODM_P2P_STATE, NULL, false);
-               #ifdef CONFIG_8723AU_P2P
-               rtw_hal_set_odm_var23a(padapter, HAL_ODM_WIFI_DISPLAY_STATE, NULL, false);
-               #endif
-
-               /* Restore to initial setting. */
-               update_tx_basic_rate23a(padapter, padapter->registrypriv.wireless_mode);
-       }
-
-exit:
-       return ret;
-}
-
-#endif /* CONFIG_8723AU_P2P */
index 8ddd67f194ba7bf406b083ea95ebd5a7d9a74d07..77880547e80f4599db8c9eb83f7c2af3425b0826 100644 (file)
@@ -17,6 +17,7 @@
 #include <osdep_service.h>
 #include <drv_types.h>
 #include <osdep_intf.h>
+#include <rtl8723a_cmd.h>
 
 #ifdef CONFIG_8723AU_BT_COEXIST
 #include <rtl8723a_hal.h>
@@ -108,33 +109,30 @@ static bool rtw_pwr_unassociated_idle(struct rtw_adapter *adapter)
        struct rtw_adapter *buddy = adapter->pbuddy_adapter;
        struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
        struct xmit_priv *pxmit_priv = &adapter->xmitpriv;
-       struct wifidirect_info *pwdinfo = &adapter->wdinfo;
 
        bool ret = false;
 
        if (time_after_eq(adapter->pwrctrlpriv.ips_deny_time, jiffies))
                goto exit;
 
-       if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)
-               || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
-               || check_fwstate(pmlmepriv, WIFI_AP_STATE)
-               || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
-               || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)
-       ) {
+       if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) ||
+           check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) ||
+           check_fwstate(pmlmepriv, WIFI_AP_STATE) ||
+           check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)){
                goto exit;
        }
 
        /* consider buddy, if exist */
        if (buddy) {
                struct mlme_priv *b_pmlmepriv = &buddy->mlmepriv;
-               struct wifidirect_info *b_pwdinfo = &buddy->wdinfo;
-
-               if (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)
-                       || check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
-                       || check_fwstate(b_pmlmepriv, WIFI_AP_STATE)
-                       || check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
-                       || !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE)
-               ) {
+
+               if (check_fwstate(b_pmlmepriv,
+                                 WIFI_ASOC_STATE|WIFI_SITE_MONITOR) ||
+                   check_fwstate(b_pmlmepriv,
+                                 WIFI_UNDER_LINKING|WIFI_UNDER_WPS) ||
+                   check_fwstate(b_pmlmepriv, WIFI_AP_STATE) ||
+                   check_fwstate(b_pmlmepriv,
+                                 WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)) {
                        goto exit;
                }
        }
@@ -263,7 +261,7 @@ void rtw_set_rpwm23a(struct rtw_adapter *padapter, u8 pslv)
 
        pwrpriv->rpwm = pslv;
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm));
+       rtl8723a_set_rpwm(padapter, rpwm);
 
        pwrpriv->tog += 0x80;
        pwrpriv->cpwm = pslv;
@@ -306,11 +304,6 @@ u8 PS_RDY_CHECK(struct rtw_adapter * padapter)
 void rtw_set_ps_mode23a(struct rtw_adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode)
 {
        struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
-
-
 
        RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
                         ("%s: PowerMode =%d Smart_PS =%d\n",
@@ -333,45 +326,29 @@ void rtw_set_ps_mode23a(struct rtw_adapter *padapter, u8 ps_mode, u8 smart_ps, u
        }
 
        if (ps_mode == PS_MODE_ACTIVE) {
-#ifdef CONFIG_8723AU_P2P
-               if (pwdinfo->opp_ps == 0)
-#endif /* CONFIG_8723AU_P2P */
-               {
-                       DBG_8723A("rtw_set_ps_mode23a: Leave 802.11 power save\n");
+               DBG_8723A("rtw_set_ps_mode23a: Leave 802.11 power save\n");
 
-                       pwrpriv->pwr_mode = ps_mode;
-                       rtw_set_rpwm23a(padapter, PS_STATE_S4);
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
-                       pwrpriv->bFwCurrentInPSMode = false;
-               }
-       }
-       else
-       {
+               pwrpriv->pwr_mode = ps_mode;
+               rtw_set_rpwm23a(padapter, PS_STATE_S4);
+               rtl8723a_set_FwPwrMode_cmd(padapter, ps_mode);
+               pwrpriv->bFwCurrentInPSMode = false;
+       } else {
                if (PS_RDY_CHECK(padapter)
 #ifdef CONFIG_8723AU_BT_COEXIST
                        || (BT_1Ant(padapter) == true)
 #endif
-                       )
-               {
+                       ) {
                        DBG_8723A("%s: Enter 802.11 power save\n", __func__);
 
                        pwrpriv->bFwCurrentInPSMode = true;
                        pwrpriv->pwr_mode = ps_mode;
                        pwrpriv->smart_ps = smart_ps;
                        pwrpriv->bcn_ant_mode = bcn_ant_mode;
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
-
-#ifdef CONFIG_8723AU_P2P
-                       /*  Set CTWindow after LPS */
-                       if (pwdinfo->opp_ps == 1)
-                               p2p_ps_wk_cmd23a(padapter, P2P_PS_ENABLE, 0);
-#endif /* CONFIG_8723AU_P2P */
+                       rtl8723a_set_FwPwrMode_cmd(padapter, ps_mode);
 
                        rtw_set_rpwm23a(padapter, PS_STATE_S2);
                }
        }
-
-
 }
 
 /*
@@ -391,12 +368,11 @@ s32 LPS_RF_ON_check23a(struct rtw_adapter *padapter, u32 delay_ms)
 
        while (1)
        {
-               rtw23a_hal_get_hwreg(padapter, HW_VAR_FWLPS_RF_ON, &bAwake);
-               if (true == bAwake)
+               bAwake = rtl8723a_get_fwlps_rf_on(padapter);
+               if (bAwake == true)
                        break;
 
-               if (true == padapter->bSurpriseRemoved)
-               {
+               if (padapter->bSurpriseRemoved == true) {
                        err = -2;
                        DBG_8723A("%s: device surprise removed!!\n", __func__);
                        break;
@@ -469,10 +445,6 @@ void LeaveAllPowerSaveMode23a(struct rtw_adapter *Adapter)
        /* DBG_8723A("%s.....\n", __func__); */
        if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
        { /* connect */
-#ifdef CONFIG_8723AU_P2P
-               p2p_ps_wk_cmd23a(Adapter, P2P_PS_DISABLE, enqueue);
-#endif /* CONFIG_8723AU_P2P */
-
                rtw_lps_ctrl_wk_cmd23a(Adapter, LPS_CTRL_LEAVE, enqueue);
        }
 
index 0b2455e4f5b681e5226937a0041aef1f738c1ff3..644c3a132e59c56668627651235146e4c1b366cd 100644 (file)
@@ -19,7 +19,6 @@
 #include <mlme_osdep.h>
 #include <linux/ip.h>
 #include <linux/if_ether.h>
-#include <ethernet.h>
 #include <usb_ops.h>
 #include <linux/ieee80211.h>
 #include <wifi.h>
@@ -80,8 +79,6 @@ int _rtw_init_recv_priv23a(struct recv_priv *precvpriv,
                list_add_tail(&precvframe->list,
                              &precvpriv->free_recv_queue.queue);
 
-               res = rtw_os_recv_resource_alloc23a(padapter, precvframe);
-
                precvframe->adapter = padapter;
                precvframe++;
        }
@@ -569,31 +566,35 @@ struct recv_frame *decryptor(struct rtw_adapter *padapter,
 static struct recv_frame *portctrl(struct rtw_adapter *adapter,
                                   struct recv_frame *precv_frame)
 {
-       u8 *psta_addr = NULL, *ptr;
+       u8 *psta_addr, *ptr;
        uint auth_alg;
        struct recv_frame *pfhdr;
        struct sta_info *psta;
        struct sta_priv *pstapriv ;
        struct recv_frame *prtnframe;
-       u16 ether_type = 0;
-       u16 eapol_type = 0x888e;/* for Funia BD's WPA issue */
+       u16 ether_type;
+       u16 eapol_type = ETH_P_PAE;/* for Funia BD's WPA issue */
        struct rx_pkt_attrib *pattrib;
 
        pstapriv = &adapter->stapriv;
-       psta = rtw_get_stainfo23a(pstapriv, psta_addr);
 
        auth_alg = adapter->securitypriv.dot11AuthAlgrthm;
 
-       ptr = precv_frame->pkt->data;
        pfhdr = precv_frame;
        pattrib = &pfhdr->attrib;
        psta_addr = pattrib->ta;
+       psta = rtw_get_stainfo23a(pstapriv, psta_addr);
 
        RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
                 ("########portctrl:adapter->securitypriv.dot11AuthAlgrthm ="
                  "%d\n", adapter->securitypriv.dot11AuthAlgrthm));
 
-       if (auth_alg == 2) {
+       if (auth_alg == dot11AuthAlgrthm_8021X) {
+               /* get ether_type */
+               ptr = pfhdr->pkt->data + pfhdr->attrib.hdrlen;
+
+               ether_type = (ptr[6] << 8) | ptr[7];
+
                if ((psta != NULL) && (psta->ieee8021x_blocked)) {
                        /* blocked */
                        /* only accept EAPOL frame */
@@ -601,13 +602,6 @@ static struct recv_frame *portctrl(struct rtw_adapter *adapter,
                                 ("########portctrl:psta->ieee8021x_blocked =="
                                  "1\n"));
 
-                       prtnframe = precv_frame;
-
-                       /* get ether_type */
-                       ptr = ptr + pfhdr->attrib.hdrlen + LLC_HEADER_SIZE;
-                       memcpy(&ether_type, ptr, 2);
-                       ether_type = ntohs((unsigned short)ether_type);
-
                        if (ether_type == eapol_type) {
                                prtnframe = precv_frame;
                        } else {
@@ -651,9 +645,7 @@ static struct recv_frame *portctrl(struct rtw_adapter *adapter,
                prtnframe = precv_frame;
        }
 
-
-
-               return prtnframe;
+       return prtnframe;
 }
 
 int recv_decache(struct recv_frame *precv_frame, u8 bretry,
@@ -1222,8 +1214,8 @@ int validate_recv_ctrl_frame(struct rtw_adapter *padapter,
 
                                        /* upate BCN for TIM IE */
                                        /* update_BCNTIM(padapter); */
-                                       update_beacon23a(padapter, _TIM_IE_,
-                                                     NULL, false);
+                                       update_beacon23a(padapter, WLAN_EID_TIM,
+                                                        NULL, false);
                                }
 
                                /* spin_unlock_bh(&psta->sleep_q.lock); */
@@ -1254,8 +1246,8 @@ int validate_recv_ctrl_frame(struct rtw_adapter *padapter,
 
                                        /* upate BCN for TIM IE */
                                        /* update_BCNTIM(padapter); */
-                                       update_beacon23a(padapter, _TIM_IE_,
-                                                     NULL, false);
+                                       update_beacon23a(padapter, WLAN_EID_TIM,
+                                                        NULL, false);
                                }
                        }
                }
@@ -2102,7 +2094,7 @@ int recv_indicatepkt_reorder(struct rtw_adapter *padapter,
                /* s1. */
                wlanhdr_to_ethhdr(prframe);
 
-               if ((pattrib->qos!= 1) || (pattrib->eth_type == 0x0806) ||
+               if ((pattrib->qos!= 1) || (pattrib->eth_type == ETH_P_ARP) ||
                    (pattrib->ack_policy != 0)) {
                        if ((padapter->bDriverStopped == false) &&
                            (padapter->bSurpriseRemoved == false)) {
index 4f745920339083bdb2190dd53e44f0b0b006ad9b..5bf7beb6d19cdeb90e80eb8edb8f3c272bb88a55 100644 (file)
@@ -99,7 +99,8 @@ static void sreset_restore_security_station(struct rtw_adapter *padapter)
                val8 = 0xcc;
        else
                val8 = 0xcf;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
+
+       rtl8723a_set_sec_cfg(padapter, val8);
 
        if ((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||
            (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) {
@@ -131,23 +132,16 @@ static void sreset_restore_network_station(struct rtw_adapter *padapter)
                        threshold = 1;
                else
                        threshold = 0;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
-       } else {
+       } else
                threshold = 1;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
-       }
 
-       set_channel_bwmode23a(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
+       rtl8723a_set_rxdma_agg_pg_th(padapter, threshold);
 
-       /* disable dynamic functions, such as high power, DIG */
-       /* Switch_DM_Func23a(padapter, DYNAMIC_FUNC_DISABLE, false); */
+       set_channel_bwmode23a(padapter, pmlmeext->cur_channel,
+                             pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);
-
-       {
-               u8      join_type = 0;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
-       }
+       hw_var_set_bssid(padapter, pmlmeinfo->network.MacAddress);
+       hw_var_set_mlme_join(padapter, 0);
 
        Set_MSR23a(padapter, (pmlmeinfo->state & 0x3));
 
index 99d81e612e7b69bf8cc368af3f41f842dc197367..646e468a630d4303364ad4876fc54e157e76aade 100644 (file)
@@ -283,35 +283,9 @@ void Update23aTblForSoftAP(u8 *bssrateset, u32 bssratelen)
        }
 }
 
-void Save_DM_Func_Flag23a(struct rtw_adapter *padapter)
-{
-       u8      bSaveFlag = true;
-
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
-}
-
-void Restore_DM_Func_Flag23a(struct rtw_adapter *padapter)
-{
-       u8      bSaveFlag = false;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
-}
-
-void Switch_DM_Func23a(struct rtw_adapter *padapter, unsigned long mode, u8 enable)
-{
-       if (enable == true)
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode));
-       else
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode));
-}
-
-static void Set_NETYPE0_MSR(struct rtw_adapter *padapter, u8 type)
-{
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type));
-}
-
 void Set_MSR23a(struct rtw_adapter *padapter, u8 type)
 {
-               Set_NETYPE0_MSR(padapter, type);
+       rtl8723a_set_media_status(padapter, type);
 }
 
 inline u8 rtw_get_oper_ch23a(struct rtw_adapter *adapter)
@@ -483,51 +457,9 @@ unsigned int decide_wait_for_beacon_timeout23a(unsigned int bcn_interval)
                return bcn_interval << 2;
 }
 
-void CAM_empty_entry23a(struct rtw_adapter *Adapter, u8 ucIndex)
-{
-       rtw_hal_set_hwreg23a(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex));
-}
-
 void invalidate_cam_all23a(struct rtw_adapter *padapter)
 {
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_CAM_INVALID_ALL, NULL);
-}
-
-void write_cam23a(struct rtw_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key)
-{
-       unsigned int    i, val, addr;
-       int j;
-       u32     cam_val[2];
-
-       addr = entry << 3;
-
-       for (j = 5; j >= 0; j--) {
-               switch (j) {
-               case 0:
-                       val = (ctrl | (mac[0] << 16) | (mac[1] << 24));
-                       break;
-               case 1:
-                       val = (mac[2] | (mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24));
-                       break;
-               default:
-                       i = (j - 2) << 2;
-                       val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24));
-                       break;
-               }
-
-               cam_val[0] = val;
-               cam_val[1] = addr + (unsigned int)j;
-
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
-
-               /* rtw_write32(padapter, WCAMI, val); */
-
-               /* cmd = CAM_POLLINIG | CAM_WRITE | (addr + j); */
-               /* rtw_write32(padapter, RWCAM, cmd); */
-
-               /* DBG_8723A("%s => cam write: %x, %x\n", __func__, cmd, val); */
-
-       }
+       rtl8723a_cam_invalid_all(padapter);
 }
 
 void clear_cam_entry23a(struct rtw_adapter *padapter, u8 entry)
@@ -536,7 +468,7 @@ void clear_cam_entry23a(struct rtw_adapter *padapter, u8 entry)
 
        unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 
-       write_cam23a(padapter, entry, 0, null_sta, null_key);
+       rtl8723a_cam_write(padapter, entry, 0, null_sta, null_key);
 }
 
 int allocate_fw_sta_entry23a(struct rtw_adapter *padapter)
@@ -561,37 +493,11 @@ void flush_all_cam_entry23a(struct rtw_adapter *padapter)
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_CAM_INVALID_ALL, NULL);
+       rtl8723a_cam_invalid_all(padapter);
 
        memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));
 }
 
-#if defined(CONFIG_8723AU_P2P) && defined(CONFIG_8723AU_P2P)
-int WFD_info_handler(struct rtw_adapter *padapter, struct ndis_802_11_var_ies *        pIE)
-{
-       struct wifidirect_info  *pwdinfo;
-       u8      wfd_ie[MAX_WFD_IE_LEN] = {0x00};
-       u32     wfd_ielen = 0;
-
-       pwdinfo = &padapter->wdinfo;
-       if (rtw_get_wfd_ie((u8 *) pIE, pIE->Length, wfd_ie, &wfd_ielen)) {
-               u8      attr_content[ 10 ] = { 0x00 };
-               u32     attr_contentlen = 0;
-
-               DBG_8723A("[%s] Found WFD IE\n", __func__);
-               rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
-               if (attr_contentlen) {
-                       pwdinfo->wfd_info->peer_rtsp_ctrlport = get_unaligned_be16(attr_content + 2);
-                       DBG_8723A("[%s] Peer PORT NUM = %d\n", __func__, pwdinfo->wfd_info->peer_rtsp_ctrlport);
-                       return true;
-               }
-       } else {
-               DBG_8723A("[%s] NO WFD IE\n", __func__);
-       }
-       return _FAIL;
-}
-#endif
-
 int WMM_param_handler23a(struct rtw_adapter *padapter, struct ndis_802_11_var_ies *    pIE)
 {
        /* struct registry_priv *pregpriv = &padapter->registrypriv; */
@@ -649,22 +555,22 @@ void WMMOnAssocRsp23a(struct rtw_adapter *padapter)
 
                switch (ACI) {
                case 0x0:
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm));
+                       rtl8723a_set_ac_param_be(padapter, acParm);
                        acm_mask |= (ACM? BIT(1):0);
                        edca[XMIT_BE_QUEUE] = acParm;
                        break;
                case 0x1:
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm));
+                       rtl8723a_set_ac_param_bk(padapter, acParm);
                        /* acm_mask |= (ACM? BIT(0):0); */
                        edca[XMIT_BK_QUEUE] = acParm;
                        break;
                case 0x2:
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm));
+                       rtl8723a_set_ac_param_vi(padapter, acParm);
                        acm_mask |= (ACM? BIT(2):0);
                        edca[XMIT_VI_QUEUE] = acParm;
                        break;
                case 0x3:
-                       rtw_hal_set_hwreg23a(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm));
+                       rtl8723a_set_ac_param_vo(padapter, acParm);
                        acm_mask |= (ACM? BIT(3):0);
                        edca[XMIT_VO_QUEUE] = acParm;
                        break;
@@ -674,7 +580,7 @@ void WMMOnAssocRsp23a(struct rtw_adapter *padapter)
        }
 
        if (padapter->registrypriv.acm_method == 1)
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask));
+               rtl8723a_set_acm_ctrl(padapter, acm_mask);
        else
                padapter->mlmepriv.acm_mask = acm_mask;
 
@@ -838,7 +744,7 @@ void HT_caps_handler23a(struct rtw_adapter *padapter, struct ndis_802_11_var_ies
        pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info);
        pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps = le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps);
 
-       rtw23a_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+       rf_type = rtl8723a_get_rf_type(padapter);
 
        /* update the MCS rates */
        for (i = 0; i < 16; i++) {
@@ -896,9 +802,8 @@ void HTOnAssocRsp23a(struct rtw_adapter *padapter)
 
        min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2;
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing));
-
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len));
+       rtl8723a_set_ampdu_min_space(padapter, min_MPDU_spacing);
+       rtl8723a_set_ampdu_factor(padapter, max_AMPDU_len);
 }
 
 void ERP_IE_handler23a(struct rtw_adapter *padapter, struct ndis_802_11_var_ies * pIE)
@@ -951,116 +856,133 @@ void VCS_update23a(struct rtw_adapter *padapter, struct sta_info *psta)
        }
 }
 
-int rtw_check_bcn_info23a(struct rtw_adapter *Adapter, u8 *pframe, u32 packet_len)
+int rtw_check_bcn_info23a(struct rtw_adapter *Adapter,
+                         struct ieee80211_mgmt *mgmt, u32 pkt_len)
 {
-       unsigned int            len;
-       unsigned char           *p;
-       unsigned short  val16;
        struct wlan_network *cur_network = &Adapter->mlmepriv.cur_network;
-       u16 wpa_len = 0, rsn_len = 0;
-       u8 encryp_protocol = 0;
+       struct HT_info_element *pht_info;
+       struct ieee80211_ht_cap *pht_cap;
        struct wlan_bssid_ex *bssid;
-       int group_cipher = 0, pairwise_cipher = 0, is_8021x = 0;
-       unsigned char *pbuf;
-       u32 wpa_ielen = 0;
-       u32 hidden_ssid = 0;
-       struct HT_info_element *pht_info = NULL;
-       struct ieee80211_ht_cap *pht_cap = NULL;
+       unsigned short val16;
+       u16 wpa_len = 0, rsn_len = 0;
+       u8 encryp_protocol;
+       int group_cipher = 0, pairwise_cipher = 0, is_8021x = 0, r;
        u32 bcn_channel;
-       unsigned short  ht_cap_info;
-       unsigned char   ht_info_infos_0;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) pframe;
-       u8 *pbssid = hdr->addr3;
+       unsigned short ht_cap_info;
+       unsigned char ht_info_infos_0;
+       int len, pie_len, ie_offset;
+       const u8 *p;
+       u8 *pie;
 
        if (is_client_associated_to_ap23a(Adapter) == false)
                return true;
 
-       len = packet_len - sizeof(struct ieee80211_hdr_3addr);
+       if (unlikely(!ieee80211_is_beacon(mgmt->frame_control))) {
+               printk(KERN_WARNING "%s: received a non beacon frame!\n",
+                      __func__);
+               return false;
+       }
+
+       len = pkt_len - sizeof(struct ieee80211_hdr_3addr);
 
        if (len > MAX_IE_SZ) {
                DBG_8723A("%s IE too long for survey event\n", __func__);
                return _FAIL;
        }
 
-       if (memcmp(cur_network->network.MacAddress, pbssid, 6)) {
-               DBG_8723A("Oops: rtw_check_network_encrypt linked but recv other bssid bcn\n" MAC_FMT MAC_FMT,
-                               MAC_ARG(pbssid), MAC_ARG(cur_network->network.MacAddress));
+       if (memcmp(cur_network->network.MacAddress, mgmt->bssid, 6)) {
+               DBG_8723A("Oops: rtw_check_network_encrypt linked but recv "
+                         "other bssid bcn\n" MAC_FMT MAC_FMT,
+                         MAC_ARG(mgmt->bssid),
+                         MAC_ARG(cur_network->network.MacAddress));
                return true;
        }
 
        bssid = (struct wlan_bssid_ex *)kzalloc(sizeof(struct wlan_bssid_ex),
                GFP_ATOMIC);
 
-       if (ieee80211_is_beacon(hdr->frame_control))
-               bssid->reserved = 1;
+       bssid->reserved = 1;
 
        bssid->Length = sizeof(struct wlan_bssid_ex) - MAX_IE_SZ + len;
 
        /* below is to copy the information element */
        bssid->IELength = len;
-       memcpy(bssid->IEs, (pframe + sizeof(struct ieee80211_hdr_3addr)), bssid->IELength);
+       memcpy(bssid->IEs, &mgmt->u, bssid->IELength);
 
        /* check bw and channel offset */
        /* parsing HT_CAP_IE */
-       p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
-       if (p && len>0) {
-                       pht_cap = (struct ieee80211_ht_cap *)(p + 2);
-                       ht_cap_info = pht_cap->cap_info;
+       ie_offset = offsetof(struct ieee80211_mgmt, u.beacon.variable) -
+               offsetof(struct ieee80211_mgmt, u);
+       pie = bssid->IEs + ie_offset;
+       pie_len = pkt_len - ie_offset;
+
+       p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, pie, pie_len);
+       if (p && p[1] > 0) {
+               pht_cap = (struct ieee80211_ht_cap *)(p + 2);
+               ht_cap_info = pht_cap->cap_info;
        } else {
-                       ht_cap_info = 0;
+               pht_cap = NULL;
+               ht_cap_info = 0;
        }
+
        /* parsing HT_INFO_IE */
-       p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
-       if (p && len>0) {
-                       pht_info = (struct HT_info_element *)(p + 2);
-                       ht_info_infos_0 = pht_info->infos[0];
+       p = cfg80211_find_ie(WLAN_EID_HT_OPERATION, pie, pie_len);
+       if (p && p[1] > 0) {
+               pht_info = (struct HT_info_element *)(p + 2);
+               ht_info_infos_0 = pht_info->infos[0];
        } else {
-                       ht_info_infos_0 = 0;
+               pht_info = NULL;
+               ht_info_infos_0 = 0;
        }
+
        if (ht_cap_info != cur_network->BcnInfo.ht_cap_info ||
-               ((ht_info_infos_0&0x03) != (cur_network->BcnInfo.ht_info_infos_0&0x03))) {
-                       DBG_8723A("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__,
-                                                       ht_cap_info, ht_info_infos_0);
-                       DBG_8723A("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__,
-                                                       cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0);
-                       DBG_8723A("%s bw mode change, disconnect\n", __func__);
-                       /* bcn_info_update */
-                       cur_network->BcnInfo.ht_cap_info = ht_cap_info;
-                       cur_network->BcnInfo.ht_info_infos_0 = ht_info_infos_0;
-                       /* to do : need to check that whether modify related register of BB or not */
+           ((ht_info_infos_0 & 0x03) !=
+            (cur_network->BcnInfo.ht_info_infos_0 & 0x03))) {
+               DBG_8723A("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n",
+                         __func__, ht_cap_info, ht_info_infos_0);
+               DBG_8723A("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n",
+                         __func__, cur_network->BcnInfo.ht_cap_info,
+                         cur_network->BcnInfo.ht_info_infos_0);
+               DBG_8723A("%s bw mode change, disconnect\n", __func__);
+               /* bcn_info_update */
+               cur_network->BcnInfo.ht_cap_info = ht_cap_info;
+               cur_network->BcnInfo.ht_info_infos_0 = ht_info_infos_0;
+               /* to do : need to check that whether modify related
+                  register of BB or not */
        }
 
        /* Checking for channel */
-       p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, _DSSET_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
-       if (p) {
-                       bcn_channel = *(p + 2);
-       } else {/* In 5G, some ap do not have DSSET IE checking HT info for channel */
-                       p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
-                       if (pht_info) {
-                                       bcn_channel = pht_info->primary_channel;
-                       } else { /* we don't find channel IE, so don't check it */
-                                       DBG_8723A("Oops: %s we don't find channel IE, so don't check it\n", __func__);
-                                       bcn_channel = Adapter->mlmeextpriv.cur_channel;
-                       }
+       p = cfg80211_find_ie(WLAN_EID_DS_PARAMS, pie, pie_len);
+       if (p)
+               bcn_channel = p[2];
+       else {
+               /* In 5G, some ap do not have DSSET IE checking HT
+                  info for channel */
+               p = cfg80211_find_ie(WLAN_EID_HT_OPERATION, pie, pie_len);
+
+               if (pht_info)
+                       bcn_channel = pht_info->primary_channel;
+               else { /* we don't find channel IE, so don't check it */
+                       DBG_8723A("Oops: %s we don't find channel IE, so don't "
+                                 "check it\n", __func__);
+                       bcn_channel = Adapter->mlmeextpriv.cur_channel;
+               }
        }
        if (bcn_channel != Adapter->mlmeextpriv.cur_channel) {
-                       DBG_8723A("%s beacon channel:%d cur channel:%d disconnect\n", __func__,
-                                                  bcn_channel, Adapter->mlmeextpriv.cur_channel);
-                       goto _mismatch;
+               DBG_8723A("%s beacon channel:%d cur channel:%d disconnect\n",
+                         __func__, bcn_channel,
+                         Adapter->mlmeextpriv.cur_channel);
+               goto _mismatch;
        }
 
        /* checking SSID */
-       if ((p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_)) == NULL) {
-               DBG_8723A("%s marc: cannot find SSID for survey event\n", __func__);
-               hidden_ssid = true;
-       } else {
-               hidden_ssid = false;
-       }
-
-       if ((NULL != p) && (false == hidden_ssid && (*(p + 1)))) {
-               memcpy(bssid->Ssid.ssid, (p + 2), *(p + 1));
-               bssid->Ssid.ssid_len = *(p + 1);
+       p = cfg80211_find_ie(WLAN_EID_SSID, pie, pie_len);
+       if (p && p[1]) {
+               memcpy(bssid->Ssid.ssid, p + 2, p[1]);
+               bssid->Ssid.ssid_len = p[1];
        } else {
+               DBG_8723A("%s marc: cannot find SSID for survey event\n",
+                         __func__);
                bssid->Ssid.ssid_len = 0;
                bssid->Ssid.ssid[0] = '\0';
        }
@@ -1091,60 +1013,83 @@ int rtw_check_bcn_info23a(struct rtw_adapter *Adapter, u8 *pframe, u32 packet_le
                bssid->Privacy = 0;
 
        RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
-                       ("%s(): cur_network->network.Privacy is %d, bssid.Privacy is %d\n",
-                        __func__, cur_network->network.Privacy, bssid->Privacy));
+                ("%s(): cur_network->network.Privacy is %d, bssid.Privacy "
+                 "is %d\n", __func__, cur_network->network.Privacy,
+                 bssid->Privacy));
        if (cur_network->network.Privacy != bssid->Privacy) {
                DBG_8723A("%s(), privacy is not match return FAIL\n", __func__);
                goto _mismatch;
        }
 
-       rtw_get_sec_ie23a(bssid->IEs, bssid->IELength, NULL,&rsn_len, NULL,&wpa_len);
+       rtw_get_sec_ie23a(bssid->IEs, bssid->IELength, NULL, &rsn_len, NULL,
+                         &wpa_len);
 
-       if (rsn_len > 0) {
+       if (rsn_len > 0)
                encryp_protocol = ENCRYP_PROTOCOL_WPA2;
-       } else if (wpa_len > 0) {
+       else if (wpa_len > 0)
                encryp_protocol = ENCRYP_PROTOCOL_WPA;
-       else {
+       else {
                if (bssid->Privacy)
                        encryp_protocol = ENCRYP_PROTOCOL_WEP;
+               else
+                       encryp_protocol = ENCRYP_PROTOCOL_OPENSYS;
        }
 
        if (cur_network->BcnInfo.encryp_protocol != encryp_protocol) {
-               DBG_8723A("%s(): enctyp is not match , return FAIL\n", __func__);
+               DBG_8723A("%s(): enctyp is not match, return FAIL\n", __func__);
                goto _mismatch;
        }
 
-       if (encryp_protocol == ENCRYP_PROTOCOL_WPA || encryp_protocol == ENCRYP_PROTOCOL_WPA2) {
-               pbuf = rtw_get_wpa_ie23a(&bssid->IEs[12], &wpa_ielen, bssid->IELength-12);
-               if (pbuf && (wpa_ielen>0)) {
-                       if (_SUCCESS == rtw_parse_wpa_ie23a(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is_8021x)) {
+       if (encryp_protocol == ENCRYP_PROTOCOL_WPA ||
+           encryp_protocol == ENCRYP_PROTOCOL_WPA2) {
+               p = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
+                                           WLAN_OUI_TYPE_MICROSOFT_WPA,
+                                           pie, pie_len);
+               if (p && p[1] > 0) {
+                       r = rtw_parse_wpa_ie23a(p, p[1] + 2, &group_cipher,
+                                               &pairwise_cipher, &is_8021x);
+                       if (r == _SUCCESS)
                                RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
-                                               ("%s pnetwork->pairwise_cipher: %d, group_cipher is %d, is_8021x is %d\n", __func__,
-                                                pairwise_cipher, group_cipher, is_8021x));
-                       }
+                                        ("%s pnetwork->pairwise_cipher: %d, "
+                                         "group_cipher is %d, is_8021x is "
+                                         "%d\n", __func__, pairwise_cipher,
+                                         group_cipher, is_8021x));
                } else {
-                       pbuf = rtw_get_wpa2_ie23a(&bssid->IEs[12], &wpa_ielen, bssid->IELength-12);
-
-                       if (pbuf && (wpa_ielen>0)) {
-                               if (_SUCCESS == rtw_parse_wpa2_ie23a(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is_8021x)) {
-                                       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
-                                                       ("%s pnetwork->pairwise_cipher: %d, pnetwork->group_cipher is %d, is_802x is %d\n",
-                                                        __func__, pairwise_cipher, group_cipher, is_8021x));
-                               }
+                       p = cfg80211_find_ie(WLAN_EID_RSN, pie, pie_len);
+
+                       if (p && p[1] > 0) {
+                               r = rtw_parse_wpa2_ie23a(p, p[1] + 2,
+                                                        &group_cipher,
+                                                        &pairwise_cipher,
+                                                        &is_8021x);
+                               if (r == _SUCCESS)
+                                       RT_TRACE(_module_rtl871x_mlme_c_,
+                                                _drv_info_,
+                                                ("%s pnetwork->pairwise_cipher"
+                                                 ": %d, pnetwork->group_cipher"
+                                                 " is %d, is_802x is %d\n",
+                                                 __func__, pairwise_cipher,
+                                                 group_cipher, is_8021x));
                        }
                }
 
                RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_,
-                               ("%s cur_network->group_cipher is %d: %d\n", __func__, cur_network->BcnInfo.group_cipher, group_cipher));
-               if (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher || group_cipher != cur_network->BcnInfo.group_cipher) {
-                       DBG_8723A("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match , return FAIL\n", __func__,
-                                       pairwise_cipher, cur_network->BcnInfo.pairwise_cipher,
-                                       group_cipher, cur_network->BcnInfo.group_cipher);
+                        ("%s cur_network->group_cipher is %d: %d\n", __func__,
+                         cur_network->BcnInfo.group_cipher, group_cipher));
+               if (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher ||
+                   group_cipher != cur_network->BcnInfo.group_cipher) {
+                       DBG_8723A("%s pairwise_cipher(%x:%x) or group_cipher "
+                                 "(%x:%x) is not match, return FAIL\n",
+                                 __func__, pairwise_cipher,
+                                 cur_network->BcnInfo.pairwise_cipher,
+                                 group_cipher,
+                                 cur_network->BcnInfo.group_cipher);
                        goto _mismatch;
                }
 
                if (is_8021x != cur_network->BcnInfo.is_8021x) {
-                       DBG_8723A("%s authentication is not match , return FAIL\n", __func__);
+                       DBG_8723A("%s authentication is not match, return "
+                                 "FAIL\n", __func__);
                        goto _mismatch;
                }
        }
@@ -1171,11 +1116,11 @@ void update_beacon23a_info(struct rtw_adapter *padapter, u8 *pframe, uint pkt_le
                pIE = (struct ndis_802_11_var_ies *)(pframe + (_BEACON_IE_OFFSET_ + sizeof(struct ieee80211_hdr_3addr)) + i);
 
                switch (pIE->ElementID) {
-               case _HT_EXTRA_INFO_IE_:        /* HT info */
+               case WLAN_EID_HT_OPERATION:     /* HT info */
                        /* HT_info_handler23a(padapter, pIE); */
                        bwmode_update_check(padapter, pIE);
                        break;
-               case _ERPINFO_IE_:
+               case WLAN_EID_ERP_INFO:
                        ERP_IE_handler23a(padapter, pIE);
                        VCS_update23a(padapter, psta);
                        break;
@@ -1199,11 +1144,11 @@ unsigned int is_ap_in_tkip23a(struct rtw_adapter *padapter)
                        pIE = (struct ndis_802_11_var_ies *)(pmlmeinfo->network.IEs + i);
 
                        switch (pIE->ElementID) {
-                       case _VENDOR_SPECIFIC_IE_:
-                               if ((!memcmp(pIE->data, RTW_WPA_OUI23A, 4)) && (!memcmp((pIE->data + 12), WPA_TKIP_CIPHER23A, 4)))
+                       case WLAN_EID_VENDOR_SPECIFIC:
+                               if ((!memcmp(pIE->data, RTW_WPA_OUI23A_TYPE, 4)) && (!memcmp((pIE->data + 12), WPA_TKIP_CIPHER23A, 4)))
                                        return true;
                                break;
-                       case _RSN_IE_2_:
+                       case WLAN_EID_RSN:
                                if (!memcmp((pIE->data + 8), RSN_TKIP_CIPHER23A, 4))
                                        return true;
                                break;
@@ -1230,13 +1175,13 @@ unsigned int should_forbid_n_rate23a(struct rtw_adapter * padapter)
                        pIE = (struct ndis_802_11_var_ies *)(cur_network->IEs + i);
 
                        switch (pIE->ElementID) {
-                       case _VENDOR_SPECIFIC_IE_:
-                               if (!memcmp(pIE->data, RTW_WPA_OUI23A, 4) &&
+                       case WLAN_EID_VENDOR_SPECIFIC:
+                               if (!memcmp(pIE->data, RTW_WPA_OUI23A_TYPE, 4) &&
                                        ((!memcmp((pIE->data + 12), WPA_CIPHER_SUITE_CCMP23A, 4)) ||
                                          (!memcmp((pIE->data + 16), WPA_CIPHER_SUITE_CCMP23A, 4))))
                                        return false;
                                break;
-                       case _RSN_IE_2_:
+                       case WLAN_EID_RSN:
                                if  ((!memcmp((pIE->data + 8), RSN_CIPHER_SUITE_CCMP23A, 4))  ||
                                       (!memcmp((pIE->data + 12), RSN_CIPHER_SUITE_CCMP23A, 4)))
                                return false;
@@ -1265,11 +1210,11 @@ unsigned int is_ap_in_wep23a(struct rtw_adapter *padapter)
                        pIE = (struct ndis_802_11_var_ies *)(pmlmeinfo->network.IEs + i);
 
                        switch (pIE->ElementID) {
-                       case _VENDOR_SPECIFIC_IE_:
-                               if (!memcmp(pIE->data, RTW_WPA_OUI23A, 4))
+                       case WLAN_EID_VENDOR_SPECIFIC:
+                               if (!memcmp(pIE->data, RTW_WPA_OUI23A_TYPE, 4))
                                        return false;
                                break;
-                       case _RSN_IE_2_:
+                       case WLAN_EID_RSN:
                                return false;
 
                        default:
@@ -1432,15 +1377,6 @@ void set_sta_rate23a(struct rtw_adapter *padapter, struct sta_info *psta)
 void update_tx_basic_rate23a(struct rtw_adapter *padapter, u8 wirelessmode)
 {
        unsigned char supported_rates[NDIS_802_11_LENGTH_RATES_EX];
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info* pwdinfo = &padapter->wdinfo;
-
-       /*      Added by Albert 2011/03/22 */
-       /*      In the P2P mode, the driver should not support the b mode. */
-       /*      So, the Tx packet shouldn't use the CCK rate */
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-#endif /* CONFIG_8723AU_P2P */
 
        memset(supported_rates, 0, NDIS_802_11_LENGTH_RATES_EX);
 
@@ -1457,7 +1393,7 @@ void update_tx_basic_rate23a(struct rtw_adapter *padapter, u8 wirelessmode)
        else
                update_mgnt_tx_rate23a(padapter, IEEE80211_OFDM_RATE_6MB);
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_BASIC_RATE, supported_rates);
+       HalSetBrateCfg23a(padapter, supported_rates);
 }
 
 unsigned char check_assoc_AP23a(u8 *pframe, uint len)
@@ -1473,7 +1409,7 @@ unsigned char check_assoc_AP23a(u8 *pframe, uint len)
                pIE = (struct ndis_802_11_var_ies *)(pframe + i);
 
                switch (pIE->ElementID) {
-               case _VENDOR_SPECIFIC_IE_:
+               case WLAN_EID_VENDOR_SPECIFIC:
                        if ((!memcmp(pIE->data, ARTHEROS_OUI1, 3)) ||
                            (!memcmp(pIE->data, ARTHEROS_OUI2, 3))) {
                                DBG_8723A("link to Artheros AP\n");
@@ -1546,15 +1482,15 @@ void update_IOT_info23a(struct rtw_adapter *padapter)
                pmlmeinfo->turboMode_cts2self = 0;
                pmlmeinfo->turboMode_rtsen = 1;
                /* disable high power */
-               Switch_DM_Func23a(padapter, ~DYNAMIC_BB_DYNAMIC_TXPWR,
-                              false);
+               rtl8723a_odm_support_ability_clr(padapter, (u32)
+                                                ~DYNAMIC_BB_DYNAMIC_TXPWR);
                break;
        case HT_IOT_PEER_REALTEK:
                /* rtw_write16(padapter, 0x4cc, 0xffff); */
                /* rtw_write16(padapter, 0x546, 0x01c0); */
                /* disable high power */
-               Switch_DM_Func23a(padapter, ~DYNAMIC_BB_DYNAMIC_TXPWR,
-                              false);
+               rtl8723a_odm_support_ability_clr(padapter, (u32)
+                                                ~DYNAMIC_BB_DYNAMIC_TXPWR);
                break;
        default:
                pmlmeinfo->turboMode_cts2self = 0;
@@ -1567,22 +1503,19 @@ void update_capinfo23a(struct rtw_adapter *Adapter, u16 updateCap)
 {
        struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
-       bool            ShortPreamble;
 
        if (updateCap & cShortPreamble) {
                /*  Short Preamble */
                if (pmlmeinfo->preamble_mode != PREAMBLE_SHORT) {
                        /*  PREAMBLE_LONG or PREAMBLE_AUTO */
-                       ShortPreamble = true;
                        pmlmeinfo->preamble_mode = PREAMBLE_SHORT;
-                       rtw_hal_set_hwreg23a(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble);
+                       rtl8723a_ack_preamble(Adapter, true);
                }
        } else { /*  Long Preamble */
                if (pmlmeinfo->preamble_mode != PREAMBLE_LONG) {
                        /*  PREAMBLE_SHORT or PREAMBLE_AUTO */
-                       ShortPreamble = false;
                        pmlmeinfo->preamble_mode = PREAMBLE_LONG;
-                       rtw_hal_set_hwreg23a(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble);
+                       rtl8723a_ack_preamble(Adapter, false);
                }
        }
        if (updateCap & cIBSS) {
@@ -1605,13 +1538,12 @@ void update_capinfo23a(struct rtw_adapter *Adapter, u16 updateCap)
                        pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;
                }
        }
-       rtw_hal_set_hwreg23a(Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime);
+       rtl8723a_set_slot_time(Adapter, pmlmeinfo->slotTime);
 }
 
 void update_wireless_mode23a(struct rtw_adapter *padapter)
 {
        int ratelen, network_type = 0;
-       u32 SIFS_Timer;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
@@ -1640,10 +1572,9 @@ void update_wireless_mode23a(struct rtw_adapter *padapter)
 
        pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode;
 
-       SIFS_Timer = 0x0a0a0808; /* 0x0808 -> for CCK, 0x0a0a -> for OFDM */
-                             /* change this value if having IOT issues. */
-
-       padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_RESP_SIFS,  (u8 *)&SIFS_Timer);
+       /* 0x0808 -> for CCK, 0x0a0a -> for OFDM */
+       /* change this value if having IOT issues. */
+       rtl8723a_set_resp_sifs(padapter, 0x08, 0x08, 0x0a, 0x0a);
 
        if (pmlmeext->cur_wireless_mode & WIRELESS_11B)
                update_mgnt_tx_rate23a(padapter, IEEE80211_CCK_RATE_1MB);
@@ -1664,24 +1595,25 @@ void update_bmc_sta_support_rate23a(struct rtw_adapter *padapter, u32 mac_id)
        }
 }
 
-int update_sta_support_rate23a(struct rtw_adapter *padapter, u8 *pvar_ie, uint var_ie_len, int cam_idx)
+int update_sta_support_rate23a(struct rtw_adapter *padapter, u8 *pvar_ie,
+                              uint var_ie_len, int cam_idx)
 {
-       unsigned int    ie_len;
-       struct ndis_802_11_var_ies *pIE;
-       int     supportRateNum = 0;
+       int supportRateNum = 0;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
+       const u8 *p;
 
-       pIE = (struct ndis_802_11_var_ies *)rtw_get_ie23a(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len);
-       if (pIE == NULL)
+       p = cfg80211_find_ie(WLAN_EID_SUPP_RATES, pvar_ie, var_ie_len);
+       if (!p)
                return _FAIL;
 
-       memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len);
-       supportRateNum = ie_len;
+       memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, p + 2, p[1]);
+       supportRateNum = p[1];
 
-       pIE = (struct ndis_802_11_var_ies *)rtw_get_ie23a(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len);
-       if (pIE)
-               memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len);
+       p = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, pvar_ie, var_ie_len);
+       if (p)
+               memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates +
+                      supportRateNum, p + 2, p[1]);
        return _SUCCESS;
 }
 
@@ -1711,26 +1643,6 @@ void process_addba_req23a(struct rtw_adapter *padapter, u8 *paddba_req, u8 *addr
        }
 }
 
-void update_TSF23a(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len)
-{
-       u8 *pIE;
-       u32 *pbuf;
-
-       pIE = pframe + sizeof(struct ieee80211_hdr_3addr);
-       pbuf = (u32 *)pIE;
-
-       pmlmeext->TSFValue = le32_to_cpu(*(pbuf+1));
-
-       pmlmeext->TSFValue = pmlmeext->TSFValue << 32;
-
-       pmlmeext->TSFValue |= le32_to_cpu(*pbuf);
-}
-
-void correct_TSF23a(struct rtw_adapter *padapter, struct mlme_ext_priv *pmlmeext)
-{
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_CORRECT_TSF, NULL);
-}
-
 void beacon_timing_control23a(struct rtw_adapter *padapter)
 {
        rtw_hal_bcn_related_reg_setting23a(padapter);
index 0f10cfa10d39e42c93af988ee1a3d6c89dc0a559..e7252d16c989a82a577ec8ecb1c7bfb9d807e91b 100644 (file)
@@ -443,21 +443,17 @@ u8 qos_acm23a(u8 acm_mask, u8 priority)
        return change_priority;
 }
 
-static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
+static void set_qos(struct sk_buff *skb, struct pkt_attrib *pattrib)
 {
-       struct ethhdr etherhdr;
-       struct iphdr ip_hdr;
+       u8 *pframe = skb->data;
+       struct iphdr *ip_hdr;
        s32 UserPriority = 0;
 
-       _rtw_open_pktfile23a(ppktfile->pkt, ppktfile);
-       _rtw_pktfile_read23a(ppktfile, (unsigned char*)&etherhdr, ETH_HLEN);
-
        /*  get UserPriority from IP hdr */
-       if (pattrib->ether_type == 0x0800) {
-               _rtw_pktfile_read23a(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr));
-/*             UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3; */
-               UserPriority = ip_hdr.tos >> 5;
-       } else if (pattrib->ether_type == 0x888e) {
+       if (pattrib->ether_type == ETH_P_IP) {
+               ip_hdr = (struct iphdr *)(pframe + ETH_HLEN);
+               UserPriority = ip_hdr->tos >> 5;
+       } else if (pattrib->ether_type == ETH_P_PAE) {
                /*  "When priority processing of data frames is supported, */
                /*  a STA's SME should send EAPOL-Key frames at the highest
                    priority." */
@@ -470,57 +466,53 @@ static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
 }
 
 static s32 update_attrib(struct rtw_adapter *padapter,
-                        struct sk_buff *pkt, struct pkt_attrib *pattrib)
+                        struct sk_buff *skb, struct pkt_attrib *pattrib)
 {
-       uint i;
-       struct pkt_file pktfile;
        struct sta_info *psta = NULL;
-       struct ethhdr etherhdr;
-
        int bmcast;
        struct sta_priv *pstapriv = &padapter->stapriv;
        struct security_priv *psecuritypriv = &padapter->securitypriv;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct qos_priv *pqospriv = &pmlmepriv->qospriv;
        int res = _SUCCESS;
+       struct ethhdr *ehdr = (struct ethhdr *) skb->data;
 
-       _rtw_open_pktfile23a(pkt, &pktfile);
-       i = _rtw_pktfile_read23a(&pktfile, (u8*)&etherhdr, ETH_HLEN);
-
-       pattrib->ether_type = ntohs(etherhdr.h_proto);
+       pattrib->ether_type = ntohs(ehdr->h_proto);
 
-       memcpy(pattrib->dst, &etherhdr.h_dest, ETH_ALEN);
-       memcpy(pattrib->src, &etherhdr.h_source, ETH_ALEN);
+       ether_addr_copy(pattrib->dst, ehdr->h_dest);
+       ether_addr_copy(pattrib->src, ehdr->h_source);
 
        pattrib->pctrl = 0;
 
        if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true) ||
                (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true)) {
-               memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
-               memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+               ether_addr_copy(pattrib->ra, pattrib->dst);
+               ether_addr_copy(pattrib->ta, pattrib->src);
        }
        else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
-               memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
-               memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+               ether_addr_copy(pattrib->ra, get_bssid(pmlmepriv));
+               ether_addr_copy(pattrib->ta, pattrib->src);
        }
        else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
-               memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
-               memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
+               ether_addr_copy(pattrib->ra, pattrib->dst);
+               ether_addr_copy(pattrib->ta, get_bssid(pmlmepriv));
        }
 
-       pattrib->pktlen = pktfile.pkt_len;
+       pattrib->pktlen = skb->len - ETH_HLEN;
 
        if (pattrib->ether_type == ETH_P_IP) {
                /*  The following is for DHCP and ARP packet, we use cck1M
                    to tx these packets and let LPS awake some time */
                /*  to prevent DHCP protocol fail */
-               u8 tmp[24];
-               _rtw_pktfile_read23a(&pktfile, &tmp[0], 24);
                pattrib->dhcp_pkt = 0;
-               if (pktfile.pkt_len > 282) {/* MINIMUM_DHCP_PACKET_SIZE) { */
-                       if (ETH_P_IP == pattrib->ether_type) {/*  IP header */
-                               if (((tmp[21] == 68) && (tmp[23] == 67)) ||
-                                   ((tmp[21] == 67) && (tmp[23] == 68))) {
+               /* MINIMUM_DHCP_PACKET_SIZE) { */
+               if (pattrib->pktlen > 282 + 24) {
+                       if (pattrib->ether_type == ETH_P_IP) {/*  IP header */
+                               u8 *pframe = skb->data;
+                               pframe += ETH_HLEN;
+
+                               if ((pframe[21] == 68 && pframe[23] == 67) ||
+                                   (pframe[21] == 67 && pframe[23] == 68)) {
                                        /*  68 : UDP BOOTP client */
                                        /*  67 : UDP BOOTP server */
                                        RT_TRACE(_module_rtl871x_xmit_c_,
@@ -532,17 +524,17 @@ static s32 update_attrib(struct rtw_adapter *padapter,
                                }
                        }
                }
-       } else if (0x888e == pattrib->ether_type) {
+       } else if (pattrib->ether_type == ETH_P_PAE) {
                DBG_8723A_LEVEL(_drv_always_, "send eapol packet\n");
        }
 
-       if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) {
+       if ((pattrib->ether_type == ETH_P_PAE) || (pattrib->dhcp_pkt == 1)) {
                rtw_set_scan_deny(padapter, 3000);
        }
 
        /*  If EAPOL , ARP , OR DHCP packet, driver must be in active mode. */
-       if ((pattrib->ether_type == 0x0806) ||
-           (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) {
+       if ((pattrib->ether_type == ETH_P_ARP) ||
+           (pattrib->ether_type == ETH_P_PAE) || (pattrib->dhcp_pkt == 1)) {
                rtw_lps_ctrl_wk_cmd23a(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
        }
 
@@ -592,10 +584,10 @@ static s32 update_attrib(struct rtw_adapter *padapter,
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE | WIFI_ADHOC_STATE |
                          WIFI_ADHOC_MASTER_STATE)) {
                if (psta->qos_option)
-                       set_qos(&pktfile, pattrib);
+                       set_qos(skb, pattrib);
        } else {
                if (pqospriv->qos_option) {
-                       set_qos(&pktfile, pattrib);
+                       set_qos(skb, pattrib);
 
                        if (pmlmepriv->acm_mask != 0) {
                                pattrib->priority = qos_acm23a(pmlmepriv->acm_mask,
@@ -610,7 +602,7 @@ static s32 update_attrib(struct rtw_adapter *padapter,
 
                pattrib->encrypt = 0;
 
-               if ((pattrib->ether_type != 0x888e) &&
+               if ((pattrib->ether_type != ETH_P_PAE) &&
                    (check_fwstate(pmlmepriv, WIFI_MP_STATE) == false)) {
                        RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
                                 ("\npsta->ieee8021x_blocked == true,  "
@@ -1116,39 +1108,40 @@ This sub-routine will perform all the following:
 6. apply sw-encrypt, if necessary.
 
 */
-s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
+s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
                              struct xmit_frame *pxmitframe)
 {
-       struct pkt_file pktfile;
-       struct sta_info         *psta;
-       struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
-       struct pkt_attrib       *pattrib = &pxmitframe->attrib;
+       struct sta_info *psta;
+       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+       struct pkt_attrib *pattrib = &pxmitframe->attrib;
        s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
        u8 *pframe, *mem_start;
        u8 hw_hdr_offset;
        u8 *pbuf_start;
-
+       u8 *pdata = skb->data;
+       int data_len = skb->len;
        s32 bmcst = is_multicast_ether_addr(pattrib->ra);
        s32 res = _SUCCESS;
 
-       if (pattrib->psta) {
+       if (pattrib->psta)
                psta = pattrib->psta;
-       else {
+       else {
                DBG_8723A("%s, call rtw_get_stainfo23a()\n", __func__);
                psta = rtw_get_stainfo23a(&padapter->stapriv, pattrib->ra);
        }
 
-       if (psta == NULL) {
+       if (!psta) {
                DBG_8723A("%s, psta == NUL\n", __func__);
                return _FAIL;
        }
 
        if (!(psta->state &_FW_LINKED)) {
-               DBG_8723A("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
+               DBG_8723A("%s, psta->state(0x%x) != _FW_LINKED\n",
+                         __func__, psta->state);
                return _FAIL;
        }
 
-       if (pxmitframe->buf_addr == NULL) {
+       if (!pxmitframe->buf_addr) {
                DBG_8723A("==> %s buf_addr == NULL\n", __func__);
                return _FAIL;
        }
@@ -1157,7 +1150,7 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
 
        hw_hdr_offset = TXDESC_OFFSET;
 
-       mem_start = pbuf_start +        hw_hdr_offset;
+       mem_start = pbuf_start + hw_hdr_offset;
 
        if (rtw_make_wlanhdr23a(padapter, mem_start, pattrib) == _FAIL) {
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
@@ -1167,8 +1160,8 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
                goto exit;
        }
 
-       _rtw_open_pktfile23a(pkt, &pktfile);
-       _rtw_pktfile_read23a(&pktfile, NULL, pattrib->pkt_hdrlen);
+       pdata += pattrib->pkt_hdrlen;
+       data_len -= pattrib->pkt_hdrlen;
 
        frg_inx = 0;
        frg_len = pxmitpriv->frag_len - 4;/* 2346-4 = 2342 */
@@ -1187,23 +1180,30 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
 
                /* adding icv, if necessary... */
                if (pattrib->iv_len) {
-                       if (psta != NULL) {
+                       if (psta) {
                                switch (pattrib->encrypt) {
                                case _WEP40_:
                                case _WEP104_:
-                                       WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
+                                       WEP_IV(pattrib->iv, psta->dot11txpn,
+                                              pattrib->key_idx);
                                        break;
                                case _TKIP_:
                                        if (bmcst)
-                                               TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
+                                               TKIP_IV(pattrib->iv,
+                                                       psta->dot11txpn,
+                                                       pattrib->key_idx);
                                        else
-                                               TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
+                                               TKIP_IV(pattrib->iv,
+                                                       psta->dot11txpn, 0);
                                        break;
                                case _AES_:
                                        if (bmcst)
-                                               AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
+                                               AES_IV(pattrib->iv,
+                                                      psta->dot11txpn,
+                                                      pattrib->key_idx);
                                        else
-                                               AES_IV(pattrib->iv, psta->dot11txpn, 0);
+                                               AES_IV(pattrib->iv,
+                                                      psta->dot11txpn, 0);
                                        break;
                                }
                        }
@@ -1225,16 +1225,20 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
                        mpdu_len -= llc_sz;
                }
 
-               if ((pattrib->icv_len >0) && (pattrib->bswenc))
+               if (pattrib->icv_len > 0 && pattrib->bswenc)
                        mpdu_len -= pattrib->icv_len;
 
-               if (bmcst) {
+               if (bmcst)
                        /*  don't do fragment to broadcat/multicast packets */
-                       mem_sz = _rtw_pktfile_read23a(&pktfile, pframe, pattrib->pktlen);
-               } else {
-                       mem_sz = _rtw_pktfile_read23a(&pktfile, pframe, mpdu_len);
-               }
+                       mem_sz = min_t(s32, data_len, pattrib->pktlen);
+               else
+                       mem_sz = min_t(s32, data_len, mpdu_len);
+
+               memcpy(pframe, pdata, mem_sz);
+
                pframe += mem_sz;
+               pdata += mem_sz;
+               data_len -= mem_sz;
 
                if ((pattrib->icv_len >0) && (pattrib->bswenc)) {
                        memcpy(pframe, pattrib->icv, pattrib->icv_len);
@@ -1243,7 +1247,7 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
 
                frg_inx++;
 
-               if (bmcst || (rtw_endofpktfile23a(&pktfile))) {
+               if (bmcst || data_len <= 0) {
                        pattrib->nr_frags = frg_inx;
 
                        pattrib->last_txcmdsz = pattrib->hdrlen +
@@ -1257,16 +1261,18 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
 
                        break;
                } else {
-                       RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("%s: There're still something in packet!\n", __func__));
+                       RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
+                                ("%s: There're still something in packet!\n",
+                                 __func__));
                }
 
                mem_start = PTR_ALIGN(pframe, 4) + hw_hdr_offset;
                memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);
-
        }
 
        if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) {
-               RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n"));
+               RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
+                        ("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n"));
                DBG_8723A("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n");
                res = _FAIL;
                goto exit;
@@ -1313,11 +1319,10 @@ s32 rtw_put_snap23a(u8 *data, u16 h_proto)
 
 void rtw_update_protection23a(struct rtw_adapter *padapter, u8 *ie, uint ie_len)
 {
-       struct  xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct  registry_priv *pregistrypriv = &padapter->registrypriv;
-       uint    protection;
-       u8      *perp;
-       int      erp_len;
+       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+       struct registry_priv *pregistrypriv = &padapter->registrypriv;
+       uint protection;
+       const u8 *p;
 
        switch (pxmitpriv->vcs_setting) {
        case DISABLE_VCS:
@@ -1327,11 +1332,11 @@ void rtw_update_protection23a(struct rtw_adapter *padapter, u8 *ie, uint ie_len)
                break;
        case AUTO_VCS:
        default:
-               perp = rtw_get_ie23a(ie, _ERPINFO_IE_, &erp_len, ie_len);
-               if (perp == NULL) {
+               p = cfg80211_find_ie(WLAN_EID_ERP_INFO, ie, ie_len);
+               if (!p)
                        pxmitpriv->vcs = NONE_VCS;
-               else {
-                       protection = (*(perp + 2)) & BIT(1);
+               else {
+                       protection = (*(p + 2)) & BIT(1);
                        if (protection) {
                                if (pregistrypriv->vcs_type == RTS_CTS)
                                        pxmitpriv->vcs = RTS_CTS;
@@ -2036,7 +2041,8 @@ int xmitframe_enqueue_for_sleeping_sta23a(struct rtw_adapter *padapter, struct x
 
                        /* DBG_8723A("enqueue, sq_len =%d, tim =%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */
 
-                       update_beacon23a(padapter, _TIM_IE_, NULL, false);/* tx bc/mc packets after upate bcn */
+                       /* tx bc/mc packets after upate bcn */
+                       update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
 
                        /* spin_unlock_bh(&psta->sleep_q.lock); */
 
@@ -2093,7 +2099,8 @@ int xmitframe_enqueue_for_sleeping_sta23a(struct rtw_adapter *padapter, struct x
 
                                if (psta->sleepq_len == 1) {
                                        /* upate BCN for TIM IE */
-                                       update_beacon23a(padapter, _TIM_IE_, NULL, false);
+                                       update_beacon23a(padapter, WLAN_EID_TIM,
+                                                        NULL, false);
                                }
                        }
 
@@ -2307,7 +2314,7 @@ void wakeup_sta_to_xmit23a(struct rtw_adapter *padapter, struct sta_info *psta)
        }
 
        if (update_mask)
-               update_beacon23a(padapter, _TIM_IE_, NULL, false);
+               update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
 }
 
 void xmit_delivery_enabled_frames23a(struct rtw_adapter *padapter,
@@ -2372,7 +2379,7 @@ void xmit_delivery_enabled_frames23a(struct rtw_adapter *padapter,
                        pstapriv->tim_bitmap &= ~CHKBIT(psta->aid);
 
                        /* upate BCN for TIM IE */
-                       update_beacon23a(padapter, _TIM_IE_, NULL, false);
+                       update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
                }
        }
        spin_unlock_bh(&pxmitpriv->lock);
index 0640f3522136d5783b8e1cb35c164f16e792bdd2..d1701a35bc90a158c5ef535a4d2c05e82c076712 100644 (file)
@@ -344,12 +344,6 @@ bool Hal_MappingOutPipe23a(struct rtw_adapter *pAdapter, u8 NumOutPipe)
        return result;
 }
 
-void hal_init_macaddr23a(struct rtw_adapter *adapter)
-{
-       rtw_hal_set_hwreg23a(adapter, HW_VAR_MAC_ADDR,
-                         adapter->eeprompriv.mac_addr);
-}
-
 /*
 * C2H event format:
 * Field         TRIGGER                CONTENT    CMD_SEQ      CMD_LEN          CMD_ID
@@ -676,11 +670,13 @@ void rtl8723a_cam_empty_entry(struct rtw_adapter *padapter, u8 ucIndex)
                /* delay_ms(40); */
                rtw_write32(padapter, WCAMI, ulContent);
                /* RT_TRACE(COMP_SEC, DBG_LOUD,
-                  ("CAM_empty_entry23a(): WRITE A4: %lx \n", ulContent));*/
+                  ("rtl8723a_cam_empty_entry(): WRITE A4: %lx \n",
+                  ulContent));*/
                /* delay_ms(40); */
                rtw_write32(padapter, RWCAM, ulCommand);
                /* RT_TRACE(COMP_SEC, DBG_LOUD,
-                  ("CAM_empty_entry23a(): WRITE A0: %lx \n", ulCommand));*/
+                  ("rtl8723a_cam_empty_entry(): WRITE A0: %lx \n",
+                  ulCommand));*/
        }
 }
 
@@ -689,14 +685,37 @@ void rtl8723a_cam_invalid_all(struct rtw_adapter *padapter)
        rtw_write32(padapter, RWCAM, BIT(31) | BIT(30));
 }
 
-void rtl8723a_cam_write(struct rtw_adapter *padapter, u32 val1, u32 val2)
+void rtl8723a_cam_write(struct rtw_adapter *padapter,
+                       u8 entry, u16 ctrl, u8 *mac, u8 *key)
 {
        u32 cmd;
+       unsigned int i, val, addr;
+       int j;
+
+       addr = entry << 3;
+
+       for (j = 5; j >= 0; j--) {
+               switch (j) {
+               case 0:
+                       val = ctrl | (mac[0] << 16) | (mac[1] << 24);
+                       break;
+               case 1:
+                       val = mac[2] | (mac[3] << 8) |
+                               (mac[4] << 16) | (mac[5] << 24);
+                       break;
+               default:
+                       i = (j - 2) << 2;
+                       val = key[i] | (key[i+1] << 8) |
+                               (key[i+2] << 16) | (key[i+3] << 24);
+                       break;
+               }
 
-       rtw_write32(padapter, WCAMI, val1);
+               rtw_write32(padapter, WCAMI, val);
+               cmd = CAM_POLLINIG | CAM_WRITE | (addr + j);
+               rtw_write32(padapter, RWCAM, cmd);
 
-       cmd = CAM_POLLINIG | CAM_WRITE | val2;
-       rtw_write32(padapter, RWCAM, cmd);
+               /* DBG_8723A("%s => cam write: %x, %x\n", __func__, cmd, val);*/
+       }
 }
 
 void rtl8723a_fifo_cleanup(struct rtw_adapter *padapter)
@@ -736,14 +755,6 @@ void rtl8723a_fifo_cleanup(struct rtw_adapter *padapter)
        }
 }
 
-void rtl8723a_set_apfm_on_mac(struct rtw_adapter *padapter, u8 val)
-{
-       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
-
-       pHalData->bMacPwrCtrlOn = val;
-       DBG_8723A("%s: bMacPwrCtrlOn =%d\n", __func__, pHalData->bMacPwrCtrlOn);
-}
-
 void rtl8723a_bcn_valid(struct rtw_adapter *padapter)
 {
        /* BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2,
@@ -752,9 +763,13 @@ void rtl8723a_bcn_valid(struct rtw_adapter *padapter)
                   rtw_read8(padapter, REG_TDECTRL + 2) | BIT0);
 }
 
-void rtl8723a_set_tx_pause(struct rtw_adapter *padapter, u8 pause)
+bool rtl8723a_get_bcn_valid(struct rtw_adapter *padapter)
 {
-       rtw_write8(padapter, REG_TXPAUSE, pause);
+       bool retval;
+
+       retval = (rtw_read8(padapter, REG_TDECTRL + 2) & BIT0) ? true : false;
+
+       return retval;
 }
 
 void rtl8723a_set_beacon_interval(struct rtw_adapter *padapter, u16 interval)
@@ -837,23 +852,18 @@ void rtl8723a_set_initial_gain(struct rtw_adapter *padapter, u32 rx_gain)
        }
 }
 
-void rtl8723a_odm_support_ability_write(struct rtw_adapter *padapter, u32 val)
+void rtl8723a_odm_support_ability_restore(struct rtw_adapter *padapter)
 {
        struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
 
-       pHalData->odmpriv.SupportAbility = val;
+       pHalData->odmpriv.SupportAbility = pHalData->odmpriv.BK_SupportAbility;
 }
 
-void rtl8723a_odm_support_ability_backup(struct rtw_adapter *padapter, u8 val)
+void rtl8723a_odm_support_ability_backup(struct rtw_adapter *padapter)
 {
        struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
 
-       if (val)        /*  save dm flag */
-               pHalData->odmpriv.BK_SupportAbility =
-                       pHalData->odmpriv.SupportAbility;
-       else            /*  restore dm flag */
-               pHalData->odmpriv.SupportAbility =
-                       pHalData->odmpriv.BK_SupportAbility;
+       pHalData->odmpriv.BK_SupportAbility = pHalData->odmpriv.SupportAbility;
 }
 
 void rtl8723a_odm_support_ability_set(struct rtw_adapter *padapter, u32 val)
@@ -879,3 +889,42 @@ void rtl8723a_set_rpwm(struct rtw_adapter *padapter, u8 val)
 {
        rtw_write8(padapter, REG_USB_HRPWM, val);
 }
+
+u8 rtl8723a_get_rf_type(struct rtw_adapter *padapter)
+{
+       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
+
+       return pHalData->rf_type;
+}
+
+bool rtl8723a_get_fwlps_rf_on(struct rtw_adapter *padapter)
+{
+       bool retval;
+       u32 valRCR;
+
+       /*  When we halt NIC, we should check if FW LPS is leave. */
+
+       if ((padapter->bSurpriseRemoved == true) ||
+           (padapter->pwrctrlpriv.rf_pwrstate == rf_off)) {
+               /*  If it is in HW/SW Radio OFF or IPS state, we do
+                   not check Fw LPS Leave, because Fw is unload. */
+               retval = true;
+       } else {
+               valRCR = rtw_read32(padapter, REG_RCR);
+               if (valRCR & 0x00070000)
+                       retval = false;
+               else
+                       retval = true;
+       }
+
+       return retval;
+}
+
+bool rtl8723a_chk_hi_queue_empty(struct rtw_adapter *padapter)
+{
+       u32 hgq;
+
+       hgq = rtw_read32(padapter, REG_HGQ_INFORMATION);
+
+       return ((hgq & 0x0000ff00) == 0) ? true : false;
+}
index de3608b4010aec9a0af902a96723dec414d2e047..04cc53424b51e73f70b34fa5f5544519faba33d3 100644 (file)
@@ -117,18 +117,6 @@ uint rtw_hal_deinit23a(struct rtw_adapter *padapter)
        return status;
 }
 
-void rtw_hal_set_hwreg23a(struct rtw_adapter *padapter, u8 variable, u8 *val)
-{
-       if (padapter->HalFunc.SetHwRegHandler)
-               padapter->HalFunc.SetHwRegHandler(padapter, variable, val);
-}
-
-void rtw23a_hal_get_hwreg(struct rtw_adapter *padapter, u8 variable, u8 *val)
-{
-       if (padapter->HalFunc.GetHwRegHandler)
-               padapter->HalFunc.GetHwRegHandler(padapter, variable, val);
-}
-
 u8 rtw_hal_set_def_var23a(struct rtw_adapter *padapter, enum hal_def_variable eVariable, void *pValue)
 {
        if (padapter->HalFunc.SetHalDefVarHandler)
index 9d738d79de4bb748020ead68b563dc1510b22b92..69041efe5c361d32f45bc6f728769faaa1577c74 100644 (file)
@@ -3944,7 +3944,6 @@ bthci_CmdAMPTestEnd(struct rtw_adapter *padapter,
        enum hci_status status = HCI_STATUS_SUCCESS;
        struct bt_30info *pBTInfo = GET_BT_INFO(padapter);
        struct bt_hci_info *pBtHciInfo = &pBTInfo->BtHciInfo;
-       u8 bFilterOutNonAssociatedBSSID = true;
 
        if (!pBtHciInfo->bInTestMode) {
                RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Not in Test mode, return status = HCI_STATUS_CMD_DISALLOW\n"));
@@ -3956,7 +3955,7 @@ bthci_CmdAMPTestEnd(struct rtw_adapter *padapter,
 
        del_timer_sync(&pBTInfo->BTTestSendPacketTimer);
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_CHECK_BSSID, (u8 *)(&bFilterOutNonAssociatedBSSID));
+       rtl8723a_check_bssid(padapter, true);
 
        /* send command complete event here when all data are received. */
        {
@@ -4057,8 +4056,7 @@ bthci_CmdAMPTestCommand(struct rtw_adapter *padapter,
                          jiffies + msecs_to_jiffies(50));
                RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("TX Single Test \n"));
        } else if (pBtHciInfo->TestScenario == 0x02) {
-               u8 bFilterOutNonAssociatedBSSID = false;
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_CHECK_BSSID, (u8 *)(&bFilterOutNonAssociatedBSSID));
+               rtl8723a_check_bssid(padapter, false);
                RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Receive Frame Test \n"));
        }
 
@@ -4677,7 +4675,7 @@ bthci_StateConnected(struct rtw_adapter *padapter,
                if (padapter->HalFunc.UpdateRAMaskHandler)
                        padapter->HalFunc.UpdateRAMaskHandler(padapter, MAX_FW_SUPPORT_MACID_NUM-1-EntryNum, 0);
 
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_BASIC_RATE, padapter->mlmepriv.cur_network.network.SupportedRates);
+               HalSetBrateCfg23a(padapter, padapter->mlmepriv.cur_network.network.SupportedRates);
                BTDM_SetFwChnlInfo(padapter, RT_MEDIA_CONNECT);
                break;
        default:
@@ -11221,7 +11219,9 @@ void HALBT_SetKey(struct rtw_adapter *padapter, u8 EntryNum)
        pBtAssocEntry->HwCAMIndex = BT_HWCAM_STAR + EntryNum;
 
        usConfig = CAM_VALID | (CAM_AES << 2);
-       write_cam23a(padapter, pBtAssocEntry->HwCAMIndex, usConfig, pBtAssocEntry->BTRemoteMACAddr, pBtAssocEntry->PTK + TKIP_ENC_KEY_POS);
+       rtl8723a_cam_write(padapter, pBtAssocEntry->HwCAMIndex, usConfig,
+                          pBtAssocEntry->BTRemoteMACAddr,
+                          pBtAssocEntry->PTK + TKIP_ENC_KEY_POS);
 }
 
 void HALBT_RemoveKey(struct rtw_adapter *padapter, u8 EntryNum)
@@ -11234,8 +11234,10 @@ void HALBT_RemoveKey(struct rtw_adapter *padapter, u8 EntryNum)
 
        if (pBTinfo->BtAsocEntry[EntryNum].HwCAMIndex != 0) {
                /*  ToDo : add New HALBT_RemoveKey function !! */
-               if (pBtAssocEntry->HwCAMIndex >= BT_HWCAM_STAR && pBtAssocEntry->HwCAMIndex < HALF_CAM_ENTRY)
-                       CAM_empty_entry23a(padapter, pBtAssocEntry->HwCAMIndex);
+               if (pBtAssocEntry->HwCAMIndex >= BT_HWCAM_STAR &&
+                   pBtAssocEntry->HwCAMIndex < HALF_CAM_ENTRY)
+                       rtl8723a_cam_empty_entry(padapter,
+                                                pBtAssocEntry->HwCAMIndex);
                pBTinfo->BtAsocEntry[EntryNum].HwCAMIndex = 0;
        }
 }
index 0b205e1204fc3ea7b68367d7c7c6fa06239d536d..307963d9e7d0cbd4163ac2c65cb1b64609db71bd 100644 (file)
@@ -255,30 +255,36 @@ static void ConstructBeacon(struct rtw_adapter *padapter, u8 *pframe, u32 *pLeng
        /* below for ad-hoc mode */
 
        /*  SSID */
-       pframe = rtw_set_ie23a(pframe, _SSID_IE_, cur_network->Ssid.ssid_len,
-                           cur_network->Ssid.ssid, &pktlen);
+       pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID,
+                              cur_network->Ssid.ssid_len,
+                              cur_network->Ssid.ssid, &pktlen);
 
        /*  supported rates... */
        rate_len = rtw_get_rateset_len23a(cur_network->SupportedRates);
-       pframe = rtw_set_ie23a(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8) ?
+       pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES, ((rate_len > 8) ?
                               8 : rate_len), cur_network->SupportedRates, &pktlen);
 
        /*  DS parameter set */
-       pframe = rtw_set_ie23a(pframe, _DSSET_IE_, 1, (unsigned char *)&cur_network->Configuration.DSConfig, &pktlen);
+       pframe = rtw_set_ie23a(pframe, WLAN_EID_DS_PARAMS, 1, (unsigned char *)
+                              &cur_network->Configuration.DSConfig, &pktlen);
 
        if ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) {
                u32 ATIMWindow;
                /*  IBSS Parameter Set... */
                /* ATIMWindow = cur->Configuration.ATIMWindow; */
                ATIMWindow = 0;
-               pframe = rtw_set_ie23a(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_IBSS_PARAMS, 2,
+                                      (unsigned char *)(&ATIMWindow), &pktlen);
        }
 
        /* todo: ERP IE */
 
        /*  EXTERNDED SUPPORTED RATE */
        if (rate_len > 8)
-               pframe = rtw_set_ie23a(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);
+               pframe = rtw_set_ie23a(pframe, WLAN_EID_EXT_SUPP_RATES,
+                                      (rate_len - 8),
+                                      (cur_network->SupportedRates + 8),
+                                      &pktlen);
 
        /* todo:HT for adhoc */
 
@@ -770,76 +776,3 @@ void rtl8723a_set_BTCoex_AP_mode_FwRsvdPkt_cmd(struct rtw_adapter *padapter)
        }
 }
 #endif
-
-#ifdef CONFIG_8723AU_P2P
-void rtl8723a_set_p2p_ps_offload_cmd(struct rtw_adapter *padapter, u8 p2p_ps_state)
-{
-       struct hal_data_8723a   *pHalData = GET_HAL_DATA(padapter);
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct P2P_PS_Offload_t *p2p_ps_offload = &pHalData->p2p_ps_offload;
-       u8 i;
-
-       switch (p2p_ps_state) {
-       case P2P_PS_DISABLE:
-               DBG_8723A("P2P_PS_DISABLE \n");
-               memset(p2p_ps_offload, 0, 1);
-               break;
-       case P2P_PS_ENABLE:
-               DBG_8723A("P2P_PS_ENABLE \n");
-               /*  update CTWindow value. */
-               if (pwdinfo->ctwindow > 0) {
-                       p2p_ps_offload->CTWindow_En = 1;
-                       rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow);
-               }
-
-               /*  hw only support 2 set of NoA */
-               for (i = 0; i < pwdinfo->noa_num; i++) {
-                       /*  To control the register setting for which NOA */
-                       rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4));
-                       if (i == 0)
-                               p2p_ps_offload->NoA0_En = 1;
-                       else
-                               p2p_ps_offload->NoA1_En = 1;
-
-                       /*  config P2P NoA Descriptor Register */
-                       rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]);
-
-                       rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]);
-
-                       rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]);
-
-                       rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]);
-               }
-
-               if ((pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0)) {
-                       /*  rst p2p circuit */
-                       rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4));
-
-                       p2p_ps_offload->Offload_En = 1;
-
-                       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                               p2p_ps_offload->role = 1;
-                               p2p_ps_offload->AllStaSleep = 0;
-                       } else {
-                               p2p_ps_offload->role = 0;
-                       }
-
-                       p2p_ps_offload->discovery = 0;
-               }
-               break;
-       case P2P_PS_SCAN:
-               DBG_8723A("P2P_PS_SCAN \n");
-               p2p_ps_offload->discovery = 1;
-               break;
-       case P2P_PS_SCAN_DONE:
-               DBG_8723A("P2P_PS_SCAN_DONE \n");
-               p2p_ps_offload->discovery = 0;
-               pwdinfo->p2p_ps_state = P2P_PS_ENABLE;
-               break;
-       default:
-               break;
-       }
-
-       FillH2CCmd(padapter, P2P_PS_OFFLOAD_EID, 1, (u8 *)p2p_ps_offload);
-}
-#endif /* CONFIG_8723AU_P2P */
index f204ab1714e7f921184cb0400248a8635cd7771f..4ca7b8ec7b38606210df706fc5c02fac59ce9176 100644 (file)
@@ -76,7 +76,7 @@ static void dm_CheckPbcGPIO(struct rtw_adapter *padapter)
                        return;
                }
 
-               rtw_signal_process(padapter->pid[0], SIGUSR1);
+               kill_pid(find_vpid(padapter->pid[0]), SIGUSR1, 1);
        }
 }
 
@@ -217,14 +217,7 @@ rtl8723a_HalDmWatchDog(
                goto skip_dm;
 
        bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode;
-       rtw23a_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
-
-#ifdef CONFIG_8723AU_P2P
-       /*  Fw is under p2p powersaving mode, driver should stop dynamic mechanism. */
-       /*  modifed by thomas. 2011.06.11. */
-       if (Adapter->wdinfo.p2p_ps_mode)
-               bFwPSAwake = false;
-#endif /* CONFIG_8723AU_P2P */
+       bFwPSAwake = rtl8723a_get_fwlps_rf_on(Adapter);
 
        if ((hw_init_completed) && ((!bFwCurrentInPSMode) && bFwPSAwake)) {
                /*  Calculate Tx/Rx statistics. */
index 0982b0a4ab9b37791ddcbe810330963ec836f5f1..0a86923e7def59a44e3055b55315e9fb7813326e 100644 (file)
@@ -619,6 +619,7 @@ hal_ReadEFuse_WiFi(struct rtw_adapter *padapter,
        u8 offset, wden;
        u8 efuseHeader, efuseExtHdr, efuseData;
        u16 i, total, used;
+       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
 
        /*  Do NOT excess total size of EFuse table.
            Added by Roger, 2008.11.10. */
@@ -696,7 +697,7 @@ hal_ReadEFuse_WiFi(struct rtw_adapter *padapter,
        EFUSE_GetEfuseDefinition23a(padapter, EFUSE_WIFI,
                                 TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, &total);
        used = eFuse_Addr - 1;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_EFUSE_BYTES, (u8 *)&used);
+       pHalData->EfuseUsedBytes = used;
 
        kfree(efuseTbl);
 }
@@ -711,6 +712,7 @@ hal_ReadEFuse_BT(struct rtw_adapter *padapter,
        u8 efuseHeader, efuseExtHdr, efuseData;
        u8 offset, wden;
        u16 i, total, used;
+       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
 
        /*  Do NOT excess total size of EFuse table.
            Added by Roger, 2008.11.10. */
@@ -812,7 +814,7 @@ hal_ReadEFuse_BT(struct rtw_adapter *padapter,
        EFUSE_GetEfuseDefinition23a(padapter, EFUSE_BT,
                                 TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, &total);
        used = (EFUSE_BT_REAL_BANK_CONTENT_LEN * (bank - 1)) + eFuse_Addr - 1;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_EFUSE_BT_BYTES, (u8 *) &used);
+       pHalData->BTEfuseUsedBytes = used;
 
 exit:
        kfree(efuseTbl);
@@ -834,8 +836,9 @@ hal_EfuseGetCurrentSize_WiFi(struct rtw_adapter *padapter)
        u16 efuse_addr = 0;
        u8 hoffset = 0, hworden = 0;
        u8 efuse_data, word_cnts = 0;
+       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
 
-       rtw23a_hal_get_hwreg(padapter, HW_VAR_EFUSE_BYTES, (u8 *) &efuse_addr);
+       efuse_addr = pHalData->EfuseUsedBytes;
 
        DBG_8723A("%s: start_efuse_addr = 0x%X\n", __func__, efuse_addr);
 
@@ -872,7 +875,7 @@ hal_EfuseGetCurrentSize_WiFi(struct rtw_adapter *padapter)
                efuse_addr += (word_cnts * 2) + 1;
        }
 
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_EFUSE_BYTES, (u8 *) &efuse_addr);
+       pHalData->EfuseUsedBytes = efuse_addr;
 
        DBG_8723A("%s: CurrentSize =%d\n", __func__, efuse_addr);
 
@@ -888,8 +891,9 @@ hal_EfuseGetCurrentSize_BT(struct rtw_adapter *padapter)
        u8 hoffset = 0, hworden = 0;
        u8 efuse_data, word_cnts = 0;
        u16 retU2 = 0;
+       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
 
-       rtw23a_hal_get_hwreg(padapter, HW_VAR_EFUSE_BT_BYTES, (u8 *) &btusedbytes);
+       btusedbytes = pHalData->BTEfuseUsedBytes;
 
        efuse_addr = (u16) ((btusedbytes % EFUSE_BT_REAL_BANK_CONTENT_LEN));
        startBank = (u8) (1 + (btusedbytes / EFUSE_BT_REAL_BANK_CONTENT_LEN));
@@ -954,7 +958,7 @@ hal_EfuseGetCurrentSize_BT(struct rtw_adapter *padapter)
        }
 
        retU2 = ((bank - 1) * EFUSE_BT_REAL_BANK_CONTENT_LEN) + efuse_addr;
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_EFUSE_BT_BYTES, (u8 *)&retU2);
+       pHalData->BTEfuseUsedBytes = retU2;
 
        DBG_8723A("%s: CurrentSize =%d\n", __func__, retU2);
        return retU2;
@@ -1144,6 +1148,7 @@ static u8
 hal_EfusePartialWriteCheck(struct rtw_adapter *padapter, u8 efuseType,
                           u16 *pAddr, struct pg_pkt_struct *pTargetPkt)
 {
+       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
        u8 bRet = false;
        u16 startAddr = 0, efuse_max_available_len = 0, efuse_max = 0;
        u8 efuse_data = 0;
@@ -1154,13 +1159,11 @@ hal_EfusePartialWriteCheck(struct rtw_adapter *padapter, u8 efuseType,
        EFUSE_GetEfuseDefinition23a(padapter, efuseType,
                                 TYPE_EFUSE_CONTENT_LEN_BANK, &efuse_max);
 
-       if (efuseType == EFUSE_WIFI) {
-               rtw23a_hal_get_hwreg(padapter, HW_VAR_EFUSE_BYTES,
-                                 (u8 *) &startAddr);
-       } else {
-               rtw23a_hal_get_hwreg(padapter, HW_VAR_EFUSE_BT_BYTES,
-                                 (u8 *) &startAddr);
-       }
+       if (efuseType == EFUSE_WIFI)
+               startAddr = pHalData->EfuseUsedBytes;
+       else
+               startAddr = pHalData->BTEfuseUsedBytes;
+
        startAddr %= efuse_max;
 
        while (1) {
@@ -2935,7 +2938,7 @@ void rtl8723a_fill_fake_txdesc(struct rtw_adapter *padapter, u8 *pDesc,
        rtl8723a_cal_txdesc_chksum(ptxdesc);
 }
 
-static void hw_var_set_opmode(struct rtw_adapter *padapter, u8 mode)
+void hw_var_set_opmode(struct rtw_adapter *padapter, u8 mode)
 {
        u8 val8;
 
@@ -2996,7 +2999,7 @@ static void hw_var_set_opmode(struct rtw_adapter *padapter, u8 mode)
        rtw_write8(padapter, MSR, val8);
 }
 
-static void hw_var_set_macaddr(struct rtw_adapter *padapter, u8 *val)
+void hw_var_set_macaddr(struct rtw_adapter *padapter, u8 *val)
 {
        u8 idx = 0;
        u32 reg_macid;
@@ -3007,7 +3010,7 @@ static void hw_var_set_macaddr(struct rtw_adapter *padapter, u8 *val)
                rtw_write8(padapter, (reg_macid + idx), val[idx]);
 }
 
-static void hw_var_set_bssid(struct rtw_adapter *padapter, u8 *val)
+void hw_var_set_bssid(struct rtw_adapter *padapter, u8 *val)
 {
        u8 idx = 0;
        u32 reg_bssid;
@@ -3018,7 +3021,7 @@ static void hw_var_set_bssid(struct rtw_adapter *padapter, u8 *val)
                rtw_write8(padapter, (reg_bssid + idx), val[idx]);
 }
 
-static void hw_var_set_correct_tsf(struct rtw_adapter *padapter)
+void hw_var_set_correct_tsf(struct rtw_adapter *padapter)
 {
        u64 tsf;
        u32 reg_tsftr;
@@ -3028,8 +3031,8 @@ static void hw_var_set_correct_tsf(struct rtw_adapter *padapter)
        /* tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue %
           (pmlmeinfo->bcn_interval*1024)) - 1024; us */
        tsf = pmlmeext->TSFValue -
-               rtw_modular6423a(pmlmeext->TSFValue,
-                             (pmlmeinfo->bcn_interval * 1024)) - 1024; /* us */
+               do_div(pmlmeext->TSFValue,
+                      (pmlmeinfo->bcn_interval * 1024)) - 1024;        /* us */
 
        if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) ||
            ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) {
@@ -3055,7 +3058,7 @@ static void hw_var_set_correct_tsf(struct rtw_adapter *padapter)
                ResumeTxBeacon(padapter);
 }
 
-static void hw_var_set_mlme_disconnect(struct rtw_adapter *padapter)
+void hw_var_set_mlme_disconnect(struct rtw_adapter *padapter)
 {
        /*  reject all data frames */
        rtw_write16(padapter, REG_RXFLTMAP2, 0);
@@ -3067,7 +3070,7 @@ static void hw_var_set_mlme_disconnect(struct rtw_adapter *padapter)
        SetBcnCtrlReg23a(padapter, DIS_TSF_UDT, 0);
 }
 
-static void hw_var_set_mlme_join(struct rtw_adapter *padapter, u8 type)
+void hw_var_set_mlme_join(struct rtw_adapter *padapter, u8 type)
 {
        u8 RetryLimit = 0x30;
 
@@ -3129,264 +3132,6 @@ static void hw_var_set_mlme_join(struct rtw_adapter *padapter, u8 type)
 #endif
 }
 
-void SetHwReg8723A(struct rtw_adapter *padapter, u8 variable, u8 *val)
-{
-       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
-       u32 *val32 = (u32 *)val;
-
-       switch (variable) {
-       case HW_VAR_MEDIA_STATUS:
-               rtl8723a_set_media_status(padapter, *val);
-               break;
-
-       case HW_VAR_MEDIA_STATUS1:
-               rtl8723a_set_media_status1(padapter, *val);
-               break;
-
-       case HW_VAR_SET_OPMODE:
-               hw_var_set_opmode(padapter, *val);
-               break;
-
-       case HW_VAR_MAC_ADDR:
-               hw_var_set_macaddr(padapter, val);
-               break;
-
-       case HW_VAR_BSSID:
-               hw_var_set_bssid(padapter, val);
-               break;
-
-       case HW_VAR_BASIC_RATE:
-               HalSetBrateCfg23a(padapter, val);
-               break;
-
-       case HW_VAR_TXPAUSE:
-               rtl8723a_set_tx_pause(padapter, *val);
-               break;
-
-       case HW_VAR_BCN_FUNC:
-               rtl8723a_set_bcn_func(padapter, *val);
-               break;
-
-       case HW_VAR_CORRECT_TSF:
-               hw_var_set_correct_tsf(padapter);
-               break;
-
-       case HW_VAR_CHECK_BSSID:
-               rtl8723a_check_bssid(padapter, *val);
-               break;
-
-       case HW_VAR_MLME_DISCONNECT:
-               hw_var_set_mlme_disconnect(padapter);
-               break;
-
-       case HW_VAR_MLME_SITESURVEY:
-               rtl8723a_mlme_sitesurvey(padapter, *val);
-               break;
-
-       case HW_VAR_MLME_JOIN:
-               hw_var_set_mlme_join(padapter, *val);
-               break;
-
-       case HW_VAR_ON_RCR_AM:
-               rtl8723a_on_rcr_am(padapter);
-               break;
-
-       case HW_VAR_OFF_RCR_AM:
-               rtl8723a_off_rcr_am(padapter);
-               break;
-
-       case HW_VAR_BEACON_INTERVAL:
-               rtl8723a_set_beacon_interval(padapter, *((u16 *) val));
-               break;
-
-       case HW_VAR_SLOT_TIME:
-               rtl8723a_set_slot_time(padapter, *val);
-               break;
-
-       case HW_VAR_RESP_SIFS:
-               rtl8723a_set_resp_sifs(padapter, val[0], val[1],
-                                      val[2], val[3]);
-               break;
-
-       case HW_VAR_ACK_PREAMBLE:
-               rtl8723a_ack_preamble(padapter, *val);
-               break;
-
-       case HW_VAR_SEC_CFG:
-               rtl8723a_set_sec_cfg(padapter, *val);
-               break;
-
-       case HW_VAR_DM_FLAG:
-               rtl8723a_odm_support_ability_write(padapter, *val32);
-               break;
-       case HW_VAR_DM_FUNC_OP:
-               rtl8723a_odm_support_ability_backup(padapter, *val);
-               break;
-       case HW_VAR_DM_FUNC_SET:
-               rtl8723a_odm_support_ability_set(padapter, *val32);
-               break;
-
-       case HW_VAR_DM_FUNC_CLR:
-               rtl8723a_odm_support_ability_clr(padapter, *val32);
-               break;
-
-       case HW_VAR_CAM_EMPTY_ENTRY:
-               rtl8723a_cam_empty_entry(padapter, *val);
-               break;
-
-       case HW_VAR_CAM_INVALID_ALL:
-               rtl8723a_cam_invalid_all(padapter);
-               break;
-
-       case HW_VAR_CAM_WRITE:
-               rtl8723a_cam_write(padapter, val32[0], val32[1]);
-               break;
-
-       case HW_VAR_AC_PARAM_VO:
-               rtl8723a_set_ac_param_vo(padapter, *val32);
-               break;
-
-       case HW_VAR_AC_PARAM_VI:
-               rtl8723a_set_ac_param_vi(padapter, *val32);
-               break;
-
-       case HW_VAR_AC_PARAM_BE:
-               rtl8723a_set_ac_param_be(padapter, *val32);
-               break;
-
-       case HW_VAR_AC_PARAM_BK:
-               rtl8723a_set_ac_param_bk(padapter, *val32);
-               break;
-
-       case HW_VAR_ACM_CTRL:
-               rtl8723a_set_acm_ctrl(padapter, *val);
-               break;
-
-       case HW_VAR_AMPDU_MIN_SPACE:
-               rtl8723a_set_ampdu_min_space(padapter, *val);
-               break;
-
-       case HW_VAR_AMPDU_FACTOR:
-               rtl8723a_set_ampdu_factor(padapter, *val);
-               break;
-
-       case HW_VAR_RXDMA_AGG_PG_TH:
-               rtl8723a_set_rxdma_agg_pg_th(padapter, *val);
-               break;
-
-       case HW_VAR_H2C_FW_PWRMODE:
-               rtl8723a_set_FwPwrMode_cmd(padapter, *val);
-               break;
-
-       case HW_VAR_H2C_FW_JOINBSSRPT:
-               rtl8723a_set_FwJoinBssReport_cmd(padapter, *val);
-               break;
-
-#ifdef CONFIG_8723AU_P2P
-       case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
-               rtl8723a_set_p2p_ps_offload_cmd(padapter, *val);
-               break;
-#endif /* CONFIG_8723AU_P2P */
-
-       case HW_VAR_INITIAL_GAIN:
-               rtl8723a_set_initial_gain(padapter, *val32);
-               break;
-       case HW_VAR_EFUSE_BYTES:
-               pHalData->EfuseUsedBytes = *((u16 *) val);
-               break;
-       case HW_VAR_EFUSE_BT_BYTES:
-               pHalData->BTEfuseUsedBytes = *((u16 *) val);
-               break;
-       case HW_VAR_FIFO_CLEARN_UP:
-               rtl8723a_fifo_cleanup(padapter);
-               break;
-       case HW_VAR_CHECK_TXBUF:
-               break;
-       case HW_VAR_APFM_ON_MAC:
-               rtl8723a_set_apfm_on_mac(padapter, *val);
-               break;
-
-       case HW_VAR_NAV_UPPER:
-               rtl8723a_set_nav_upper(padapter, *val32);
-               break;
-       case HW_VAR_BCN_VALID:
-               rtl8723a_bcn_valid(padapter);
-               break;
-       default:
-               break;
-       }
-
-}
-
-void GetHwReg8723A(struct rtw_adapter *padapter, u8 variable, u8 *val)
-{
-       struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
-
-       switch (variable) {
-       case HW_VAR_BASIC_RATE:
-               *((u16 *) val) = pHalData->BasicRateSet;
-               break;
-
-       case HW_VAR_TXPAUSE:
-               *val = rtw_read8(padapter, REG_TXPAUSE);
-               break;
-
-       case HW_VAR_BCN_VALID:
-               /* BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2 */
-               val[0] = (BIT0 & rtw_read8(padapter, REG_TDECTRL + 2)) ? true :
-                       false;
-               break;
-
-       case HW_VAR_RF_TYPE:
-               *val = pHalData->rf_type;
-               break;
-
-       case HW_VAR_DM_FLAG:
-       {
-               struct dm_odm_t *podmpriv = &pHalData->odmpriv;
-               *((u32 *) val) = podmpriv->SupportAbility;
-       }
-               break;
-
-       case HW_VAR_FWLPS_RF_ON:
-       {
-               /*  When we halt NIC, we should check if FW LPS is leave. */
-               u32 valRCR;
-
-               if ((padapter->bSurpriseRemoved == true) ||
-                   (padapter->pwrctrlpriv.rf_pwrstate == rf_off)) {
-                       /*  If it is in HW/SW Radio OFF or IPS state, we do
-                           not check Fw LPS Leave, because Fw is unload. */
-                       *val = true;
-               } else {
-                       valRCR = rtw_read32(padapter, REG_RCR);
-                       valRCR &= 0x00070000;
-                       if (valRCR)
-                               *val = false;
-                       else
-                               *val = true;
-               }
-       }
-               break;
-       case HW_VAR_EFUSE_BYTES:
-               *((u16 *) val) = pHalData->EfuseUsedBytes;
-               break;
-
-       case HW_VAR_EFUSE_BT_BYTES:
-               *((u16 *) val) = pHalData->BTEfuseUsedBytes;
-               break;
-
-       case HW_VAR_APFM_ON_MAC:
-               *val = pHalData->bMacPwrCtrlOn;
-               break;
-       case HW_VAR_CHK_HI_QUEUE_EMPTY:
-               *val =
-                   ((rtw_read32(padapter, REG_HGQ_INFORMATION) & 0x0000ff00) ==
-                    0) ? true : false;
-               break;
-       }
-}
-
 #ifdef CONFIG_8723AU_BT_COEXIST
 
 void rtl8723a_SingleDualAntennaDetection(struct rtw_adapter *padapter)
index 213d1936109d019e0b6f9c936f4ec8b3509625dd..e1f17af78a1226d4c3f3323137aad542c07a7174 100644 (file)
@@ -19,7 +19,6 @@
 #include <mlme_osdep.h>
 #include <linux/ip.h>
 #include <linux/if_ether.h>
-#include <ethernet.h>
 #include <usb_ops.h>
 #include <wifi.h>
 #include <rtl8723a_hal.h>
@@ -66,8 +65,8 @@ int rtl8723au_init_recv_priv(struct rtw_adapter *padapter)
        for (i = 0; i < NR_RECVBUFF; i++) {
                INIT_LIST_HEAD(&precvbuf->list);
 
-               res = rtw_os_recvbuf_resource_alloc23a(padapter, precvbuf);
-               if (res == _FAIL)
+               precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL);
+               if (!precvbuf->purb)
                        break;
 
                precvbuf->adapter = padapter;
@@ -110,7 +109,11 @@ void rtl8723au_free_recv_priv(struct rtw_adapter *padapter)
        precvbuf = (struct recv_buf *)precvpriv->precv_buf;
 
        for (i = 0; i < NR_RECVBUFF; i++) {
-               rtw_os_recvbuf_resource_free23a(padapter, precvbuf);
+               usb_free_urb(precvbuf->purb);
+
+               if (precvbuf->pskb)
+                       dev_kfree_skb_any(precvbuf->pskb);
+
                precvbuf++;
        }
 
index e206829d50fa370ff4eb773ad3cdc1ff5284c4b7..0a6e343373ffd06f977e7d789fc3cd6bc515494c 100644 (file)
@@ -621,7 +621,6 @@ static u32 rtl8723au_hal_init(struct rtw_adapter *Adapter)
        struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
        struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv;
        struct registry_priv *pregistrypriv = &Adapter->registrypriv;
-       u32 NavUpper = WiFiNavUpperUs;
 
        unsigned long init_start_time = jiffies;
 
@@ -779,7 +778,7 @@ static u32 rtl8723au_hal_init(struct rtw_adapter *Adapter)
        _InitDriverInfoSize(Adapter, DRVINFO_SZ);
 
        _InitInterrupt(Adapter);
-       hal_init_macaddr23a(Adapter);/* set mac_address */
+       hw_var_set_macaddr(Adapter, Adapter->eeprompriv.mac_addr);
        _InitNetworkType(Adapter);/* set msr */
        _InitWMACSetting(Adapter);
        _InitAdaptiveCtrl(Adapter);
@@ -888,7 +887,7 @@ static u32 rtl8723au_hal_init(struct rtw_adapter *Adapter)
        rtl8723a_InitHalDm(Adapter);
 
        HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC31);
-       rtw_hal_set_hwreg23a(Adapter, HW_VAR_NAV_UPPER, (u8 *)&NavUpper);
+       rtl8723a_set_nav_upper(Adapter, WiFiNavUpperUs);
 
        /*  2011/03/09 MH debug only, UMC-B cut pass 2500 S5 test, but we need to fin root cause. */
        if (((rtw_read32(Adapter, rFPGA0_RFMOD) & 0xFF000000) != 0x83000000)) {
@@ -1497,52 +1496,6 @@ static void ReadAdapterInfo8723AU(struct rtw_adapter *Adapter)
        _ReadAdapterInfo8723AU(Adapter);
 }
 
-#define GPIO_DEBUG_PORT_NUM 0
-static void rtl8723au_trigger_gpio_0(struct rtw_adapter *padapter)
-{
-       u32 gpioctrl;
-       DBG_8723A("==> trigger_gpio_0...\n");
-       rtw_write16_async(padapter, REG_GPIO_PIN_CTRL, 0);
-       rtw_write8_async(padapter, REG_GPIO_PIN_CTRL+2, 0xFF);
-       gpioctrl = (BIT(GPIO_DEBUG_PORT_NUM) << 24)|
-               (BIT(GPIO_DEBUG_PORT_NUM) << 16);
-       rtw_write32_async(padapter, REG_GPIO_PIN_CTRL, gpioctrl);
-       gpioctrl |= (BIT(GPIO_DEBUG_PORT_NUM)<<8);
-       rtw_write32_async(padapter, REG_GPIO_PIN_CTRL, gpioctrl);
-       DBG_8723A("<=== trigger_gpio_0...\n");
-}
-
-/*
- * If variable not handled here,
- * some variables will be processed in SetHwReg8723A()
- */
-static void SetHwReg8723AU(struct rtw_adapter *Adapter, u8 variable, u8 *val)
-{
-       switch (variable) {
-       case HW_VAR_RXDMA_AGG_PG_TH:
-               break;
-       case HW_VAR_SET_RPWM:
-               rtl8723a_set_rpwm(Adapter, *val);
-               break;
-       case HW_VAR_TRIGGER_GPIO_0:
-               rtl8723au_trigger_gpio_0(Adapter);
-               break;
-       default:
-               SetHwReg8723A(Adapter, variable, val);
-               break;
-       }
-
-}
-
-/*
- * If variable not handled here,
- * some variables will be processed in GetHwReg8723A()
- */
-static void GetHwReg8723AU(struct rtw_adapter *Adapter, u8 variable, u8 *val)
-{
-       GetHwReg8723A(Adapter, variable, val);
-}
-
 /*  */
 /*     Description: */
 /*             Query setting of specified variable. */
@@ -1820,8 +1773,6 @@ int rtl8723au_set_hal_ops(struct rtw_adapter *padapter)
        pHalFunc->init_default_value = &rtl8723au_init_default_value;
        pHalFunc->intf_chip_configure = &rtl8723au_interface_configure;
        pHalFunc->read_adapter_info = &ReadAdapterInfo8723AU;
-       pHalFunc->SetHwRegHandler = &SetHwReg8723AU;
-       pHalFunc->GetHwRegHandler = &GetHwReg8723AU;
        pHalFunc->GetHalDefVarHandler = &GetHalDefVar8192CUsb;
        pHalFunc->SetHalDefVarHandler = &SetHalDefVar8192CUsb;
        pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8192CUsb;
index 53eecea48ceca3053fa76d9aa9aa81f5d88f35ba..de25e1a5eee86ccc2b30e667dffeedd0367538dc 100644 (file)
@@ -55,7 +55,6 @@ enum _NIC_VERSION {
 #include <rtw_event.h>
 #include <rtw_led.h>
 #include <rtw_mlme_ext.h>
-#include <rtw_p2p.h>
 #include <rtw_ap.h>
 
 #include "ioctl_cfg80211.h"
@@ -258,13 +257,7 @@ struct rtw_adapter {
        struct  hostapd_priv    *phostapdpriv;
 #endif
 
-       struct cfg80211_wifidirect_info cfg80211_wdinfo;
        u32     setband;
-       struct wifidirect_info  wdinfo;
-
-#ifdef CONFIG_8723AU_P2P
-       struct wifi_display_info wfd_info;
-#endif /* CONFIG_8723AU_P2P */
 
        void *HalData;
        u32 hal_data_sz;
@@ -316,10 +309,6 @@ struct rtw_adapter {
        u8 bRxRSSIDisplay;
        /* The driver will show the desired chan nor when this flag is 1. */
        u8 bNotifyChannelChange;
-#ifdef CONFIG_8723AU_P2P
-       /* driver will show current P2P status when the  application reads it*/
-       u8 bShowGetP2PState;
-#endif
        struct rtw_adapter *pbuddy_adapter;
 
        /* extend to support multi interface */
@@ -327,21 +316,6 @@ struct rtw_adapter {
        /* IFACE_ID1 is equals to SECONDARY_ADAPTER */
        u8 iface_id;
 
-#ifdef CONFIG_BR_EXT
-       _lock                                   br_ext_lock;
-       /* unsigned int                 macclone_completed; */
-       struct nat25_network_db_entry   *nethash[NAT25_HASH_SIZE];
-       int                             pppoe_connection_in_progress;
-       unsigned char                   pppoe_addr[MACADDRLEN];
-       unsigned char                   scdb_mac[MACADDRLEN];
-       unsigned char                   scdb_ip[4];
-       struct nat25_network_db_entry   *scdb_entry;
-       unsigned char                   br_mac[MACADDRLEN];
-       unsigned char                   br_ip[4];
-
-       struct br_ext_info              ethBrExtInfo;
-#endif /*  CONFIG_BR_EXT */
-
        u8    fix_rate;
 
        unsigned char     in_cta_test;
diff --git a/drivers/staging/rtl8723au/include/ethernet.h b/drivers/staging/rtl8723au/include/ethernet.h
deleted file mode 100644 (file)
index 39fc6df..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/******************************************************************************
- *
- * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- *
- ******************************************************************************/
-/*! \file */
-#ifndef __INC_ETHERNET_H
-#define __INC_ETHERNET_H
-
-#define LLC_HEADER_SIZE                        6       /*  LLC Header Length */
-
-#endif /*  #ifndef __INC_ETHERNET_H */
index 20f983cfc2b7a7b16e5b38d1d65d765270e364cb..5f050a346a8a19b7c5e3c0a48aff01daa0c78461 100644 (file)
@@ -165,8 +165,6 @@ void HalSetBrateCfg23a(struct rtw_adapter *padapter, u8 *mBratesOS);
 bool
 Hal_MappingOutPipe23a(struct rtw_adapter *pAdapter, u8 NumOutPipe);
 
-void hal_init_macaddr23a(struct rtw_adapter *adapter);
-
 void c2h_evt_clear23a(struct rtw_adapter *adapter);
 s32 c2h_evt_read23a(struct rtw_adapter *adapter, u8 *buf);
 
@@ -185,11 +183,12 @@ void rtl8723a_ack_preamble(struct rtw_adapter *padapter, u8 bShortPreamble);
 void rtl8723a_set_sec_cfg(struct rtw_adapter *padapter, u8 sec);
 void rtl8723a_cam_empty_entry(struct rtw_adapter *padapter, u8 ucIndex);
 void rtl8723a_cam_invalid_all(struct rtw_adapter *padapter);
-void rtl8723a_cam_write(struct rtw_adapter *padapter, u32 val1, u32 val2);
+void rtl8723a_cam_write(struct rtw_adapter *padapter,
+                       u8 entry, u16 ctrl, u8 *mac, u8 *key);
 void rtl8723a_fifo_cleanup(struct rtw_adapter *padapter);
 void rtl8723a_set_apfm_on_mac(struct rtw_adapter *padapter, u8 val);
 void rtl8723a_bcn_valid(struct rtw_adapter *padapter);
-void rtl8723a_set_tx_pause(struct rtw_adapter *padapter, u8 pause);
+bool rtl8723a_get_bcn_valid(struct rtw_adapter *padapter);
 void rtl8723a_set_beacon_interval(struct rtw_adapter *padapter, u16 interval);
 void rtl8723a_set_resp_sifs(struct rtw_adapter *padapter,
                            u8 r2t1, u8 r2t2, u8 t2t1, u8 t2t2);
@@ -202,10 +201,14 @@ void rtl8723a_set_nav_upper(struct rtw_adapter *padapter, u32 usNavUpper);
 void rtl8723a_set_initial_gain(struct rtw_adapter *padapter, u32 rx_gain);
 
 void rtl8723a_odm_support_ability_write(struct rtw_adapter *padapter, u32 val);
-void rtl8723a_odm_support_ability_backup(struct rtw_adapter *padapter, u8 val);
+void rtl8723a_odm_support_ability_backup(struct rtw_adapter *padapter);
+void rtl8723a_odm_support_ability_restore(struct rtw_adapter *padapter);
 void rtl8723a_odm_support_ability_set(struct rtw_adapter *padapter, u32 val);
 void rtl8723a_odm_support_ability_clr(struct rtw_adapter *padapter, u32 val);
 
 void rtl8723a_set_rpwm(struct rtw_adapter *padapter, u8 val);
+u8 rtl8723a_get_rf_type(struct rtw_adapter *padapter);
+bool rtl8723a_get_fwlps_rf_on(struct rtw_adapter *padapter);
+bool rtl8723a_chk_hi_queue_empty(struct rtw_adapter *padapter);
 
 #endif /* __HAL_COMMON_H__ */
index d183f4ba1ecb295cc62992bc251c39fa5559cadc..89516467f24107fa10ca2f46a0144276b26d8485 100644 (file)
@@ -35,78 +35,6 @@ enum _CHIP_TYPE {
        MAX_CHIP_TYPE
 };
 
-enum HW_VARIABLES {
-       HW_VAR_MEDIA_STATUS,
-       HW_VAR_MEDIA_STATUS1,
-       HW_VAR_SET_OPMODE,
-       HW_VAR_MAC_ADDR,
-       HW_VAR_BSSID,
-       HW_VAR_INIT_RTS_RATE,
-       HW_VAR_BASIC_RATE,
-       HW_VAR_TXPAUSE,
-       HW_VAR_BCN_FUNC,
-       HW_VAR_CORRECT_TSF,
-       HW_VAR_CHECK_BSSID,
-       HW_VAR_MLME_DISCONNECT,
-       HW_VAR_MLME_SITESURVEY,
-       HW_VAR_MLME_JOIN,
-       HW_VAR_ON_RCR_AM,
-       HW_VAR_OFF_RCR_AM,
-       HW_VAR_BEACON_INTERVAL,
-       HW_VAR_SLOT_TIME,
-       HW_VAR_RESP_SIFS,
-       HW_VAR_ACK_PREAMBLE,
-       HW_VAR_SEC_CFG,
-       HW_VAR_BCN_VALID,
-       HW_VAR_RF_TYPE,
-       HW_VAR_DM_FLAG,
-       HW_VAR_DM_FUNC_OP,
-       HW_VAR_DM_FUNC_SET,
-       HW_VAR_DM_FUNC_CLR,
-       HW_VAR_CAM_EMPTY_ENTRY,
-       HW_VAR_CAM_INVALID_ALL,
-       HW_VAR_CAM_WRITE,
-       HW_VAR_CAM_READ,
-       HW_VAR_AC_PARAM_VO,
-       HW_VAR_AC_PARAM_VI,
-       HW_VAR_AC_PARAM_BE,
-       HW_VAR_AC_PARAM_BK,
-       HW_VAR_ACM_CTRL,
-       HW_VAR_AMPDU_MIN_SPACE,
-       HW_VAR_AMPDU_FACTOR,
-       HW_VAR_RXDMA_AGG_PG_TH,
-       HW_VAR_SET_RPWM,
-       HW_VAR_H2C_FW_PWRMODE,
-       HW_VAR_H2C_FW_JOINBSSRPT,
-       HW_VAR_FWLPS_RF_ON,
-       HW_VAR_H2C_FW_P2P_PS_OFFLOAD,
-       HW_VAR_TDLS_WRCR,
-       HW_VAR_TDLS_INIT_CH_SEN,
-       HW_VAR_TDLS_RS_RCR,
-       HW_VAR_TDLS_DONE_CH_SEN,
-       HW_VAR_INITIAL_GAIN,
-       HW_VAR_TRIGGER_GPIO_0,
-       HW_VAR_BT_SET_COEXIST,
-       HW_VAR_BT_ISSUE_DELBA,
-       HW_VAR_CURRENT_ANTENNA,
-       HW_VAR_ANTENNA_DIVERSITY_LINK,
-       HW_VAR_ANTENNA_DIVERSITY_SELECT,
-       HW_VAR_SWITCH_EPHY_WoWLAN,
-       HW_VAR_EFUSE_BYTES,
-       HW_VAR_EFUSE_BT_BYTES,
-       HW_VAR_FIFO_CLEARN_UP,
-       HW_VAR_CHECK_TXBUF,
-       HW_VAR_APFM_ON_MAC, /* Auto FSM to Turn On, include clock, isolation, power control for MAC only */
-       /*  The valid upper nav range for the HW updating, if the true value is larger than the upper range, the HW won't update it. */
-       /*  Unit in microsecond. 0 means disable this function. */
-       HW_VAR_NAV_UPPER,
-       HW_VAR_RPT_TIMER_SETTING,
-       HW_VAR_TX_RPT_MAX_MACID,
-       HW_VAR_H2C_MEDIA_STATUS_RPT,
-       HW_VAR_CHK_HI_QUEUE_EMPTY,
-       HW_VAR_READ_LLT_TAB,
-};
-
 enum hal_def_variable {
        HAL_DEF_UNDERCORATEDSMOOTHEDPWDB,
        HAL_DEF_IS_SUPPORT_ANT_DIV,
@@ -175,11 +103,6 @@ struct hal_ops {
 
        void (*hal_dm_watchdog)(struct rtw_adapter *padapter);
 
-       void (*SetHwRegHandler)(struct rtw_adapter *padapter,
-                               u8 variable, u8 *val);
-       void (*GetHwRegHandler)(struct rtw_adapter *padapter,
-                               u8 variable, u8 *val);
-
        u8 (*GetHalDefVarHandler)(struct rtw_adapter *padapter,
                                  enum hal_def_variable eVariable,
                                  void *pValue);
@@ -291,11 +214,6 @@ enum hardware_type {
 };
 
 #define GET_EEPROM_EFUSE_PRIV(adapter) (&adapter->eeprompriv)
-#define is_boot_from_eeprom(adapter) (adapter->eeprompriv.EepromOrEfuse)
-
-extern int rtw_ht_enable23A;
-extern int rtw_cbw40_enable23A;
-extern int rtw_ampdu_enable23A;/* for enable tx_ampdu */
 
 void rtw_hal_def_value_init23a(struct rtw_adapter *padapter);
 int pm_netdev_open23a(struct net_device *pnetdev, u8 bnormal);
@@ -312,8 +230,6 @@ u32 rtw_hal_power_on23a(struct rtw_adapter *padapter);
 uint rtw_hal_init23a(struct rtw_adapter *padapter);
 uint rtw_hal_deinit23a(struct rtw_adapter *padapter);
 void rtw_hal_stop(struct rtw_adapter *padapter);
-void rtw_hal_set_hwreg23a(struct rtw_adapter *padapter, u8 variable, u8 *val);
-void rtw23a_hal_get_hwreg(struct rtw_adapter *padapter, u8 variable, u8 *val);
 
 void rtw_hal_chip_configure23a(struct rtw_adapter *padapter);
 void rtw_hal_read_chip_info23a(struct rtw_adapter *padapter);
@@ -388,5 +304,11 @@ void rtw_hal_reset_security_engine23a(struct rtw_adapter *adapter);
 
 s32 rtw_hal_c2h_handler23a(struct rtw_adapter *adapter, struct c2h_evt_hdr *c2h_evt);
 c2h_id_filter rtw_hal_c2h_id_filter_ccx23a(struct rtw_adapter *adapter);
+void hw_var_set_correct_tsf(struct rtw_adapter *padapter);
+void hw_var_set_mlme_disconnect(struct rtw_adapter *padapter);
+void hw_var_set_opmode(struct rtw_adapter *padapter, u8 mode);
+void hw_var_set_macaddr(struct rtw_adapter *padapter, u8 *val);
+void hw_var_set_bssid(struct rtw_adapter *padapter, u8 *val);
+void hw_var_set_mlme_join(struct rtw_adapter *padapter, u8 type);
 
 #endif /* __HAL_INTF_H__ */
index 28e4ab239fb963ad98a5a005949ae62bf6b6301b..76875f651d822655c8ebafe7972d26209e35b4dc 100644 (file)
@@ -298,53 +298,6 @@ struct ieee80211_snap_hdr {
 #define WEP_KEY_LEN 13
 
 
-
-/*
-
- 802.11 data frame from AP
-
-      ,-------------------------------------------------------------------.
-Bytes |  2   |  2   |    6    |    6    |    6    |  2   | 0..2312 |   4  |
-      |------|------|---------|---------|---------|------|---------|------|
-Desc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  frame  |  fcs |
-      |      | tion | (BSSID) |         |         | ence |  data   |      |
-      `-------------------------------------------------------------------'
-
-Total: 28-2340 bytes
-
-*/
-
-struct ieee80211_header_data {
-       u16 frame_ctl;
-       u16 duration_id;
-       u8 addr1[6];
-       u8 addr2[6];
-       u8 addr3[6];
-       u16 seq_ctrl;
-};
-
-struct ieee80211_info_element_hdr {
-       u8 id;
-       u8 len;
-} __attribute__ ((packed));
-
-struct ieee80211_info_element {
-       u8 id;
-       u8 len;
-       u8 data[0];
-} __attribute__ ((packed));
-
-
-struct ieee80211_txb {
-       u8 nr_frags;
-       u8 encrypted;
-       u16 reserved;
-       u16 frag_size;
-       u16 payload_size;
-       struct sk_buff *fragments[0];
-};
-
-
 /* MAX_RATES_LENGTH needs to be 12.  The spec says 8, and many APs
  * only use 8, and then use extended rates for the remaining supported
  * rates.  Other APs, however, stick all of their supported rates on the
@@ -382,9 +335,6 @@ join_res:
 #define IEEE_G            (1<<2)
 #define IEEE_MODE_MASK    (IEEE_A|IEEE_B|IEEE_G)
 
-/* Baron move to ieee80211.c */
-int ieee80211_is_empty_essid23a(const char *essid, int essid_len);
-
 enum _PUBLIC_ACTION{
        ACT_PUBLIC_BSSCOEXIST = 0, /*  20/40 BSS Coexistence */
        ACT_PUBLIC_DSE_ENABLE = 1,
@@ -457,68 +407,8 @@ struct rtw_ieee80211_channel {
        /*, (channel)->orig_mag*/ \
        /*, (channel)->orig_mpwr*/ \
 
-/* Parsed Information Elements */
-struct rtw_ieee802_11_elems {
-       u8 *ssid;
-       u8 ssid_len;
-       u8 *supp_rates;
-       u8 supp_rates_len;
-       u8 *fh_params;
-       u8 fh_params_len;
-       u8 *ds_params;
-       u8 ds_params_len;
-       u8 *cf_params;
-       u8 cf_params_len;
-       u8 *tim;
-       u8 tim_len;
-       u8 *ibss_params;
-       u8 ibss_params_len;
-       u8 *challenge;
-       u8 challenge_len;
-       u8 *erp_info;
-       u8 erp_info_len;
-       u8 *ext_supp_rates;
-       u8 ext_supp_rates_len;
-       u8 *wpa_ie;
-       u8 wpa_ie_len;
-       u8 *rsn_ie;
-       u8 rsn_ie_len;
-       u8 *wme;
-       u8 wme_len;
-       u8 *wme_tspec;
-       u8 wme_tspec_len;
-       u8 *wps_ie;
-       u8 wps_ie_len;
-       u8 *power_cap;
-       u8 power_cap_len;
-       u8 *supp_channels;
-       u8 supp_channels_len;
-       u8 *mdie;
-       u8 mdie_len;
-       u8 *ftie;
-       u8 ftie_len;
-       u8 *timeout_int;
-       u8 timeout_int_len;
-       u8 *ht_capabilities;
-       u8 ht_capabilities_len;
-       u8 *ht_operation;
-       u8 ht_operation_len;
-       u8 *vendor_ht_cap;
-       u8 vendor_ht_cap_len;
-};
-
-enum parse_res {
-       ParseOK = 0,
-       ParseUnknown = 1,
-       ParseFailed = -1
-};
-
-enum parse_res rtw_ieee802_11_parse_elems23a(u8 *start, uint len,
-                               struct rtw_ieee802_11_elems *elems,
-                               int show_errors);
-
 u8 *rtw_set_fixed_ie23a(unsigned char *pbuf, unsigned int len, unsigned char *source, unsigned int *frlen);
-u8 *rtw_set_ie23a(u8 *pbuf, int index, uint len, u8 *source, uint *frlen);
+u8 *rtw_set_ie23a(u8 *pbuf, int index, uint len, const u8 *source, uint *frlen);
 
 enum secondary_ch_offset {
        SCN = 0, /* no secondary channel */
@@ -537,12 +427,10 @@ int rtw_ies_remove_ie23a(u8 *ies, uint *ies_len, uint offset, u8 eid, u8 *oui, u
 
 void rtw_set_supported_rate23a(u8* SupportedRates, uint mode) ;
 
-unsigned char *rtw_get_wpa_ie23a(unsigned char *pie, int *wpa_ie_len, int limit);
-unsigned char *rtw_get_wpa2_ie23a(unsigned char *pie, int *rsn_ie_len, int limit);
-int rtw_get_wpa_cipher_suite23a(u8 *s);
-int rtw_get_wpa2_cipher_suite23a(u8 *s);
-int rtw_parse_wpa_ie23a(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x);
-int rtw_parse_wpa2_ie23a(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x);
+int rtw_get_wpa_cipher_suite23a(const u8 *s);
+int rtw_get_wpa2_cipher_suite23a(const u8 *s);
+int rtw_parse_wpa_ie23a(const u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x);
+int rtw_parse_wpa2_ie23a(const u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x);
 
 int rtw_get_sec_ie23a(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len);
 
@@ -551,32 +439,6 @@ u8 *rtw_get_wps_ie23a(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen);
 u8 *rtw_get_wps_attr23a(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_attr, u32 *len_attr);
 u8 *rtw_get_wps_attr_content23a(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_content, uint *len_content);
 
-/**
- * for_each_ie - iterate over continuous IEs
- * @ie:
- * @buf:
- * @buf_len:
- */
-#define for_each_ie(ie, buf, buf_len) \
-       for (ie = (void*)buf; (((u8*)ie) - ((u8*)buf) + 1) < buf_len; ie = (void*)(((u8*)ie) + *(((u8*)ie)+1) + 2))
-
-void dump_ies23a(u8 *buf, u32 buf_len);
-void dump_wps_ie23a(u8 *ie, u32 ie_len);
-
-#ifdef CONFIG_8723AU_P2P
-void dump_p2p_ie23a(u8 *ie, u32 ie_len);
-u8 *rtw_get_p2p_ie23a(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen);
-u8 *rtw_get_p2p_attr23a(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr);
-u8 *rtw_get_p2p_attr23a_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content);
-u32 rtw_set_p2p_attr_content23a(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr);
-void rtw_wlan_bssid_ex_remove_p2p_attr23a(struct wlan_bssid_ex *bss_ex, u8 attr_id);
-#endif
-
-#ifdef CONFIG_8723AU_P2P
-int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen);
-int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen);
-#endif /*  CONFIG_8723AU_P2P */
-
 uint   rtw_get_rateset_len23a(u8       *rateset);
 
 struct registry_priv;
index b7132a9a13783f039a3460d236e23cb9e772718b..4bb5525b7a6823c4237ea49b506ef8b078614c24 100644 (file)
 #include <drv_types.h>
 
 void rtw_os_indicate_disconnect23a(struct rtw_adapter *adapter);
-void rtw_os_indicate_connect23a(struct rtw_adapter *adapter);
-void rtw_os_indicate_scan_done23a(struct rtw_adapter *padapter, bool aborted);
-void rtw_report_sec_ie23a(struct rtw_adapter *adapter, u8 authmode, u8 *sec_ie);
-
 void rtw_reset_securitypriv23a(struct rtw_adapter *adapter);
 
 #endif /* _MLME_OSDEP_H_ */
index 039bc7285ed010c62e93c285cccec6ddd8df50e3..40445bbafe771f9dbedc849f76297f749e862cd7 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/kref.h>
 #include <linux/netdevice.h>
 #include <linux/skbuff.h>
-#include <linux/circ_buf.h>
 #include <asm/uaccess.h>
 #include <asm/byteorder.h>
 #include <asm/atomic.h>
@@ -40,7 +39,6 @@
 #include <linux/sched.h>
 #include <linux/etherdevice.h>
 #include <linux/wireless.h>
-#include <net/iw_handler.h>
 #include <linux/if_arp.h>
 #include <linux/rtnetlink.h>
 #include <linux/delay.h>
@@ -139,7 +137,6 @@ void        _rtw_vmfree(u8 *pbuf, u32 sz);
 
 extern unsigned char REALTEK_96B_IE23A[];
 extern unsigned char MCS_rate_2R23A[16];
-extern unsigned char RTW_WPA_OUI23A[];
 extern unsigned char WPA_TKIP_CIPHER23A[4];
 extern unsigned char RSN_TKIP_CIPHER23A[4];
 
@@ -149,16 +146,6 @@ extern unsigned char       MCS_rate_1R23A[16];
 void   _rtw_init_queue23a(struct rtw_queue *pqueue);
 u32    _rtw_queue_empty23a(struct rtw_queue *pqueue);
 
-static inline u32 bitshift(u32 bitmask)
-{
-       u32 i;
-
-       for (i = 0; i <= 31; i++)
-               if (((bitmask>>i) &  0x1) == 1) break;
-
-       return i;
-}
-
 void rtw_suspend_lock_init(void);
 void rtw_suspend_lock_uninit(void);
 void rtw_lock_suspend(void);
@@ -174,12 +161,6 @@ void rtw_unlock_suspend(void);
 #define FUNC_ADPT_FMT "%s(%s)"
 #define FUNC_ADPT_ARG(adapter) __func__, adapter->pnetdev->name
 
-#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1)
-
-u64 rtw_modular6423a(u64 x, u64 y);
-u64 rtw_division6423a(u64 x, u64 y);
-
-
 /* Macros for handling unaligned memory accesses */
 
 #define RTW_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \
@@ -199,9 +180,7 @@ bool rtw_cbuf_push23a(struct rtw_cbuf *cbuf, void *buf);
 void *rtw_cbuf_pop23a(struct rtw_cbuf *cbuf);
 struct rtw_cbuf *rtw_cbuf_alloc23a(u32 size);
 void rtw_cbuf_free(struct rtw_cbuf *cbuf);
-int rtw_change_ifname(struct rtw_adapter *padapter, const char *ifname);
 s32 c2h_evt_hdl(struct rtw_adapter *adapter, struct c2h_evt_hdr *c2h_evt, c2h_id_filter filter);
-void indicate_wx_scan_complete_event(struct rtw_adapter *padapter);
 u8 rtw_do_join23a(struct rtw_adapter *padapter);
 
 #endif
index 15c94b6168bfeb1904d782b57a65e19a0282d47f..c2d3f1bd594827eb4fbb4d2787e76a79d9261c18 100644 (file)
@@ -23,22 +23,13 @@ void _rtw_free_recv_priv23a (struct recv_priv *precvpriv);
 
 int rtw_recv_entry23a(struct recv_frame *precv_frame);
 int rtw_recv_indicatepkt23a(struct rtw_adapter *adapter, struct recv_frame *precv_frame);
-void rtw_recv_returnpacket(struct net_device *cnxt, struct sk_buff *preturnedpkt);
 
-void rtw_hostapd_mlme_rx23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
 void rtw_handle_tkip_mic_err23a(struct rtw_adapter *padapter, u8 bgroup);
 
 int    rtw_init_recv_priv(struct recv_priv *precvpriv, struct rtw_adapter *padapter);
 void rtw_free_recv_priv (struct recv_priv *precvpriv);
 
 int rtw_os_recv_resource_init(struct recv_priv *precvpriv, struct rtw_adapter *padapter);
-int rtw_os_recv_resource_alloc23a(struct rtw_adapter *padapter, struct recv_frame *precvframe);
-void rtw_os_recv_resource_free(struct recv_priv *precvpriv);
-
-int rtw_os_recvbuf_resource_alloc23a(struct rtw_adapter *padapter, struct recv_buf *precvbuf);
-int rtw_os_recvbuf_resource_free23a(struct rtw_adapter *padapter, struct recv_buf *precvbuf);
-
-void rtw_os_read_port23a(struct rtw_adapter *padapter, struct recv_buf *precvbuf);
 
 void rtw_init_recv_timer23a(struct recv_reorder_ctrl *preorder_ctrl);
 
index 8fccbfc3a45c65dd92873cb41f37b8899b800d93..09fa72340302582b3954f56be9a454fef146c447 100644 (file)
@@ -151,10 +151,6 @@ u8 rtl8723a_set_rssi_cmd(struct rtw_adapter * padapter, u8 *param);
 u8 rtl8723a_set_raid_cmd(struct rtw_adapter * padapter, u32 mask, u8 arg);
 void rtl8723a_add_rateatid(struct rtw_adapter * padapter, u32 bitmap, u8 arg, u8 rssi_level);
 
-#ifdef CONFIG_8723AU_P2P
-void rtl8723a_set_p2p_ps_offload_cmd(struct rtw_adapter * padapter, u8 p2p_ps_state);
-#endif /* CONFIG_8723AU_P2P */
-
 void CheckFwRsvdPageContent23a(struct rtw_adapter *padapter);
 
 #endif
index c20248bab717421a13ecc433f1a1894ab5b663de..f6b4b7c7c22dc983c77fbf7be59b676f77311777 100644 (file)
@@ -424,11 +424,6 @@ struct hal_data_8723a {
 
        bool                            bMACFuncEnable;
 
-#ifdef CONFIG_8723AU_P2P
-       struct P2P_PS_Offload_t p2p_ps_offload;
-#endif
-
-
        /*  */
        /*  For USB Interface HAL related */
        /*  */
@@ -437,14 +432,6 @@ struct hal_data_8723a {
        /*  Interrupt related register information. */
        u32     IntArray[2];
        u32     IntrMask[2];
-
-       /*  */
-       /*  For SDIO Interface HAL related */
-       /*  */
-
-       /*  Auto FSM to Turn On, include clock, isolation, power control for MAC only */
-       u8                      bMacPwrCtrlOn;
-
 };
 
 #define GET_HAL_DATA(__pAdapter)       ((struct hal_data_8723a *)((__pAdapter)->HalData))
@@ -556,8 +543,6 @@ void Hal_EfuseParseThermalMeter_8723A(struct rtw_adapter *padapter, u8 *hwinfo,
 void Hal_InitChannelPlan23a(struct rtw_adapter *padapter);
 
 void rtl8723a_set_hal_ops(struct hal_ops *pHalFunc);
-void SetHwReg8723A(struct rtw_adapter *padapter, u8 variable, u8 *val);
-void GetHwReg8723A(struct rtw_adapter *padapter, u8 variable, u8 *val);
 #ifdef CONFIG_8723AU_BT_COEXIST
 void rtl8723a_SingleDualAntennaDetection(struct rtw_adapter *padapter);
 #endif
index 76f82d68f633d2b205cf2360174a146d78a38e86..7bcadff02ef9822d69fcf08445968d501f870146 100644 (file)
@@ -22,8 +22,6 @@
 #ifdef CONFIG_8723AU_AP_MODE
 
 /* external function */
-void rtw_indicate_sta_assoc_event23a(struct rtw_adapter *padapter, struct sta_info *psta);
-void rtw_indicate_sta_disassoc_event23a(struct rtw_adapter *padapter, struct sta_info *psta);
 
 void init_mlme_ap_info23a(struct rtw_adapter *padapter);
 void free_mlme_ap_info23a(struct rtw_adapter *padapter);
index f9caa3e35f57d3288c07294747b173cb927f9794..ba6d572b81b3fb0b6c6db728bd917b9305d5d3cb 100644 (file)
@@ -106,9 +106,6 @@ u32 rtw_init_evt_priv23a (struct evt_priv *pevtpriv);
 void rtw_free_evt_priv23a (struct evt_priv *pevtpriv);
 void rtw_cmd_clr_isr23a(struct cmd_priv *pcmdpriv);
 void rtw_evt_notify_isr(struct evt_priv *pevtpriv);
-#ifdef CONFIG_8723AU_P2P
-u8 p2p_protocol_wk_cmd23a(struct rtw_adapter*padapter, int intCmdType );
-#endif /* CONFIG_8723AU_P2P */
 
 enum rtw_drvextra_cmd_id
 {
index 31f96f39b498dcb6bb9fe9ea142d749e676b6e7b..3d6f7307e41eee4f12742e87e0b147d0816597a8 100644 (file)
@@ -148,30 +148,6 @@ struct tx_invite_resp_info {
        u8      token;  /*      Used to record the dialog token of p2p invitation request frame. */
 };
 
-#ifdef CONFIG_8723AU_P2P
-
-struct wifi_display_info {
-       u16     wfd_enable;             /* Enable/Disable the WFD function. */
-       u16     rtsp_ctrlport;          /* TCP port number at which the this WFD device listens for RTSP messages */
-       u16     peer_rtsp_ctrlport;     /* TCP port number at which the peer WFD device listens for RTSP messages */
-                                       /* This filed should be filled when receiving the gropu negotiation request */
-
-       u8      peer_session_avail;     /* WFD session is available or not for the peer wfd device. */
-                                       /* This variable will be set when sending the provisioning discovery request to peer WFD device. */
-                                       /* And this variable will be reset when it is read by using the iwpriv p2p_get wfd_sa command. */
-       u8      ip_address[4];
-       u8      peer_ip_address[4];
-       u8      wfd_pc;         /* WFD preferred connection */
-                               /* 0 -> Prefer to use the P2P for WFD connection on peer side. */
-                               /* 1 -> Prefer to use the TDLS for WFD connection on peer side. */
-
-       u8      wfd_device_type;/* WFD Device Type */
-                               /* 0 -> WFD Source Device */
-                               /* 1 -> WFD Primary Sink Device */
-       enum    SCAN_RESULT_TYPE scan_result_type;      /* Used when P2P is enable. This parameter will impact the scan result. */
-};
-#endif /* CONFIG_8723AU_P2P */
-
 struct tx_provdisc_req_info {
        u16     wps_config_method_request;      /* Used when sending the provisioning request frame */
        u16     peer_channel_num[2];            /* The channel number which the receiver stands. */
@@ -203,102 +179,6 @@ struct scan_limit_info {
        u8      operation_ch[2];        /* Store the operation channel of invitation request frame */
 };
 
-struct cfg80211_wifidirect_info {
-       struct timer_list               remain_on_ch_timer;
-       u8              restore_channel;
-       struct ieee80211_channel        remain_on_ch_channel;
-       enum nl80211_channel_type       remain_on_ch_type;
-       u64     remain_on_ch_cookie;
-       bool is_ro_ch;
-};
-
-struct wifidirect_info {
-       struct rtw_adapter      *padapter;
-       struct timer_list       find_phase_timer;
-       struct timer_list       restore_p2p_state_timer;
-
-       /*      Used to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer. */
-       struct timer_list       pre_tx_scan_timer;
-       struct timer_list       reset_ch_sitesurvey;
-       struct timer_list       reset_ch_sitesurvey2;   /*      Just for resetting the scan limit function by using p2p nego */
-       struct tx_provdisc_req_info     tx_prov_disc_info;
-       struct rx_provdisc_req_info rx_prov_disc_info;
-       struct tx_invite_req_info       invitereq_info;
-       struct profile_info     profileinfo[P2P_MAX_PERSISTENT_GROUP_NUM];      /*      Store the profile information of persistent group */
-       struct tx_invite_resp_info      inviteresp_info;
-       struct tx_nego_req_info nego_req_info;
-       struct group_id_info    groupid_info;   /*      Store the group id information when doing the group negotiation handshake. */
-       struct scan_limit_info  rx_invitereq_info;      /*      Used for get the limit scan channel from the Invitation procedure */
-       struct scan_limit_info  p2p_info;               /*      Used for get the limit scan channel from the P2P negotiation handshake */
-#ifdef CONFIG_8723AU_P2P
-       struct wifi_display_info        *wfd_info;
-#endif
-       enum P2P_ROLE   role;
-       enum P2P_STATE  pre_p2p_state;
-       enum P2P_STATE  p2p_state;
-       u8      device_addr[ETH_ALEN];  /*      The device address should be the mac address of this device. */
-       u8      interface_addr[ETH_ALEN];
-       u8      social_chan[4];
-       u8      listen_channel;
-       u8      operating_channel;
-       u8      listen_dwell;           /*      This value should be between 1 and 3 */
-       u8      support_rate[8];
-       u8      p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN];
-       u8      intent;         /*      should only include the intent value. */
-       u8      p2p_peer_interface_addr[ETH_ALEN];
-       u8      p2p_peer_device_addr[ETH_ALEN];
-       u8      peer_intent;    /*      Included the intent value and tie breaker value. */
-       u8      device_name[WPS_MAX_DEVICE_NAME_LEN];   /*      Device name for displaying on searching device screen */
-       u8      device_name_len;
-       u8      profileindex;   /*      Used to point to the index of profileinfo array */
-       u8      peer_operating_ch;
-       u8      find_phase_state_exchange_cnt;
-       u16     device_password_id_for_nego;    /*      The device password ID for group negotation */
-       u8      negotiation_dialog_token;
-       /*      SSID information for group negotitation */
-       u8 nego_ssid[IEEE80211_MAX_SSID_LEN];
-       u8 nego_ssidlen;
-       u8 p2p_group_ssid[IEEE80211_MAX_SSID_LEN];
-       u8 p2p_group_ssid_len;
-       u8      persistent_supported;   /*      Flag to know the persistent function should be supported or not. */
-                                       /*      In the Sigma test, the Sigma will provide this enable from the sta_set_p2p CAPI. */
-                                       /*      0: disable */
-                                       /*      1: enable */
-       u8      session_available;      /*      Flag to set the WFD session available to enable or disable "by Sigma" */
-                                       /*      In the Sigma test, the Sigma will disable the session available by using the sta_preset CAPI. */
-                                       /*      0: disable */
-                                       /*      1: enable */
-
-       u8      wfd_tdls_enable;        /*      Flag to enable or disable the TDLS by WFD Sigma */
-                                       /*      0: disable */
-                                       /*      1: enable */
-       u8      wfd_tdls_weaksec;       /*      Flag to enable or disable the weak security function for TDLS by WFD Sigma */
-                               /*      0: disable */
-                               /*      In this case, the driver can't issue the tdsl setup request frame. */
-                               /*      1: enable */
-                               /*      In this case, the driver can issue the tdls setup request frame */
-                               /*      even the current security is weak security. */
-
-       enum    P2P_WPSINFO             ui_got_wps_info;                        /*      This field will store the WPS value (PIN value or PBC) that UI had got from the user. */
-       u16     supported_wps_cm;                       /*      This field describes the WPS config method which this driver supported. */
-                                                                                                               /*      The value should be the combination of config method defined in page104 of WPS v2.0 spec. */
-       uint    channel_list_attr_len;          /*      This field will contain the length of body of P2P Channel List attribute of group negotitation response frame. */
-       u8      channel_list_attr[100];         /*      This field will contain the body of P2P Channel List attribute of group negotitation response frame. */
-                                                                                                               /*      We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame. */
-#ifdef CONFIG_8723AU_P2P
-       enum P2P_PS_MODE        p2p_ps_mode; /*  indicate p2p ps mode */
-       enum P2P_PS_STATE       p2p_ps_state; /*  indicate p2p ps state */
-       u8      noa_index; /*  Identifies and instance of Notice of Absence timing. */
-       u8      ctwindow; /*  Client traffic window. A period of time in TU after TBTT. */
-       u8      opp_ps; /*  opportunistic power save. */
-       u8      noa_num; /*  number of NoA descriptor in P2P IE. */
-       u8      noa_count[P2P_MAX_NOA_NUM]; /*  Count for owner, Type of client. */
-       u32     noa_duration[P2P_MAX_NOA_NUM]; /*  Max duration for owner, preferred or min acceptable duration for client. */
-       u32     noa_interval[P2P_MAX_NOA_NUM]; /*  Length of interval for owner, preferred or max acceptable interval of client. */
-       u32     noa_start_time[P2P_MAX_NOA_NUM]; /*  schedule expressed in terms of the lower 4 bytes of the TSF timer. */
-#endif /*  CONFIG_8723AU_P2P */
-};
-
 struct tdls_ss_record {        /* signal strength record */
        u8      macaddr[ETH_ALEN];
        u8      RxPWDBAll;
@@ -324,9 +204,6 @@ struct tdls_info {
        u8      watchdog_count;
        u8      dev_discovered;         /* WFD_TDLS: for sigma test */
        u8      enable;
-#ifdef CONFIG_8723AU_P2P
-       struct wifi_display_info                *wfd_info;
-#endif
 };
 
 struct mlme_priv {
@@ -553,7 +430,6 @@ void rtw_free_assoc_resources23a(struct rtw_adapter *adapter,
                              int lock_scanned_queue);
 void rtw_indicate_disconnect23a(struct rtw_adapter *adapter);
 void rtw_indicate_connect23a(struct rtw_adapter *adapter);
-void rtw_indicate_scan_done23a(struct rtw_adapter *padapter, bool aborted);
 void rtw_scan_abort23a(struct rtw_adapter *adapter);
 
 int rtw_restruct_sec_ie23a(struct rtw_adapter *adapter, u8 *in_ie, u8 *out_ie,
@@ -582,8 +458,6 @@ void _rtw_free_mlme_priv23a(struct mlme_priv *pmlmepriv);
 
 struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv);
 
-void _rtw_free_network23a(struct mlme_priv *pmlmepriv,
-                      struct wlan_network *pnetwork, u8 isfreeall);
 void _rtw_free_network23a_nolock23a(struct mlme_priv *pmlmepriv,
                              struct wlan_network *pnetwork);
 
@@ -596,7 +470,6 @@ int rtw_if_up23a(struct rtw_adapter *padapter);
 int rtw_linked_check(struct rtw_adapter *padapter);
 
 u8 *rtw_get_capability23a_from_ie(u8 *ie);
-u8 *rtw_get_timestampe_from_ie23a(u8 *ie);
 u8 *rtw_get_beacon_interval23a_from_ie(u8 *ie);
 
 
@@ -613,12 +486,8 @@ int rtw_is_same_ibss23a(struct rtw_adapter *adapter,
                     struct wlan_network *pnetwork);
 int is_same_network23a(struct wlan_bssid_ex *src, struct wlan_bssid_ex *dst);
 
-void _rtw23a_roaming(struct rtw_adapter *adapter,
-                 struct wlan_network *tgt_network);
 void rtw23a_roaming(struct rtw_adapter *adapter,
                 struct wlan_network *tgt_network);
 void rtw_set_roaming(struct rtw_adapter *adapter, u8 to_roaming);
-u8 rtw_to_roaming(struct rtw_adapter *adapter);
-void rtw_stassoc_hw_rpt23a(struct rtw_adapter *adapter, struct sta_info *psta);
 
 #endif /* __RTL871X_MLME_H_ */
index 0aaf0d5d8aeaa654fce8c193401c729344977db4..cbea64938c548539a66ee25201855b7d3d186235 100644 (file)
@@ -89,7 +89,6 @@
 #define                _54M_RATE_      11
 
 
-extern unsigned char RTW_WPA_OUI23A[];
 extern unsigned char WMM_OUI23A[];
 extern unsigned char WPS_OUI23A[];
 extern unsigned char WFD_OUI23A[];
@@ -262,13 +261,13 @@ enum SCAN_STATE {
 
 struct mlme_handler {
        char *str;
-       unsigned int (*func)(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+       int (*func)(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
 };
 
 struct action_handler {
        unsigned int   num;
        char* str;
-       unsigned int (*func)(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
+       int (*func)(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
 };
 
 struct ss_res
@@ -474,10 +473,6 @@ void get_rate_set23a(struct rtw_adapter *padapter, unsigned char *pbssrate,
 void UpdateBrateTbl23a(struct rtw_adapter *padapter,u8 *mBratesOS);
 void Update23aTblForSoftAP(u8 *bssrateset, u32 bssratelen);
 
-void Save_DM_Func_Flag23a(struct rtw_adapter *padapter);
-void Restore_DM_Func_Flag23a(struct rtw_adapter *padapter);
-void Switch_DM_Func23a(struct rtw_adapter *padapter, unsigned long mode, u8 enable);
-
 void Set_MSR23a(struct rtw_adapter *padapter, u8 type);
 
 u8 rtw_get_oper_ch23a(struct rtw_adapter *adapter);
@@ -495,12 +490,9 @@ void SetBWMode23a(struct rtw_adapter *padapter, unsigned short bwmode,
 
 unsigned int decide_wait_for_beacon_timeout23a(unsigned int bcn_interval);
 
-void write_cam23a(struct rtw_adapter *padapter, u8 entry, u16 ctrl,
-              u8 *mac, u8 *key);
 void clear_cam_entry23a(struct rtw_adapter *padapter, u8 entry);
 
 void invalidate_cam_all23a(struct rtw_adapter *padapter);
-void CAM_empty_entry23a(struct rtw_adapter *Adapter, u8 ucIndex);
 
 int allocate_fw_sta_entry23a(struct rtw_adapter *padapter);
 void flush_all_cam_entry23a(struct rtw_adapter *padapter);
@@ -526,10 +518,6 @@ unsigned char check_assoc_AP23a(u8 *pframe, uint len);
 
 int WMM_param_handler23a(struct rtw_adapter *padapter,
                      struct ndis_802_11_var_ies *pIE);
-#ifdef CONFIG_8723AU_P2P
-int WFD_info_handler(struct rtw_adapter *padapter,
-                    struct ndis_802_11_var_ies *pIE);
-#endif
 void WMMOnAssocRsp23a(struct rtw_adapter *padapter);
 
 void HT_caps_handler23a(struct rtw_adapter *padapter,
@@ -544,7 +532,8 @@ void VCS_update23a(struct rtw_adapter *padapter, struct sta_info *psta);
 
 void update_beacon23a_info(struct rtw_adapter *padapter, u8 *pframe, uint len,
                        struct sta_info *psta);
-int rtw_check_bcn_info23a(struct rtw_adapter *Adapter, u8 *pframe, u32 packet_len);
+int rtw_check_bcn_info23a(struct rtw_adapter *Adapter,
+                         struct ieee80211_mgmt *mgmt, u32 packet_len);
 void update_IOT_info23a(struct rtw_adapter *padapter);
 void update_capinfo23a(struct rtw_adapter *Adapter, u16 updateCap);
 void update_wireless_mode23a(struct rtw_adapter * padapter);
@@ -594,18 +583,6 @@ s32 dump_mgntframe23a_and_wait(struct rtw_adapter *padapter,
 s32 dump_mgntframe23a_and_wait_ack23a(struct rtw_adapter *padapter,
                                struct xmit_frame *pmgntframe);
 
-#ifdef CONFIG_8723AU_P2P
-void issue_probersp23a_p2p23a(struct rtw_adapter *padapter, unsigned char *da);
-void issue_p2p_provision_request23a(struct rtw_adapter *padapter, u8 *pssid,
-                                u8 ussidlen, u8* pdev_raddr);
-void issue_p2p_GO_request23a(struct rtw_adapter *padapter, u8* raddr);
-void issue23a_probereq_p2p(struct rtw_adapter *padapter, u8 *da);
-int issue23a_probereq_p2p_ex(struct rtw_adapter *adapter, u8 *da, int try_cnt,
-                         int wait_ms);
-void issue_p2p_invitation_response23a(struct rtw_adapter *padapter, u8* raddr,
-                                  u8 dialogToken, u8 success);
-void issue_p2p_invitation_request23a(struct rtw_adapter *padapter, u8* raddr);
-#endif /* CONFIG_8723AU_P2P */
 void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms);
 void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
                    u8 is_valid_p2p_probereq);
@@ -638,28 +615,6 @@ void start_clnt_auth23a(struct rtw_adapter *padapter);
 void start_clnt_join23a(struct rtw_adapter *padapter);
 void start_create_ibss23a(struct rtw_adapter *padapter);
 
-unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAssocRsp23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnProbeReq23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnProbeRsp23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int DoReserved23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnBeacon23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAtim23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnDisassoc23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAuth23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAuth23aClient23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnDeAuth23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAction23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-
-unsigned int on_action_spct23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAction23a_qos(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAction23a_dls(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAction23a_back23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int on_action_public23a(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAction23a_ht(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAction23a_wmm(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-unsigned int OnAction23a_p2p(struct rtw_adapter *padapter, struct recv_frame *precv_frame);
-
 
 void mlmeext_joinbss_event_callback23a(struct rtw_adapter *padapter, int join_res);
 void mlmeext_sta_del_event_callback23a(struct rtw_adapter *padapter);
@@ -680,7 +635,6 @@ int cckratesonly_included23a(unsigned char *rate, int ratelen);
 
 void process_addba_req23a(struct rtw_adapter *padapter, u8 *paddba_req, u8 *addr);
 
-void update_TSF23a(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);
 void correct_TSF23a(struct rtw_adapter *padapter, struct mlme_ext_priv *pmlmeext);
 
 struct cmd_hdl {
diff --git a/drivers/staging/rtl8723au/include/rtw_p2p.h b/drivers/staging/rtl8723au/include/rtw_p2p.h
deleted file mode 100644 (file)
index 93fdc65..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/******************************************************************************
- *
- * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- ******************************************************************************/
-#ifndef __RTW_P2P_H_
-#define __RTW_P2P_H_
-
-#include <drv_types.h>
-
-u32 build_beacon_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_probe_resp_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_prov_disc_request_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf,
-                                  u8 *pssid, u8 ussidlen, u8 *pdev_raddr);
-u32 build_assoc_resp_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf,
-                           u8 status_code);
-u32 build_deauth_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf);
-#ifdef CONFIG_8723AU_P2P
-u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf,
-                           u8 tunneled);
-u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-#endif /* CONFIG_8723AU_P2P */
-
-u32 process_probe_req_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                            uint len);
-u32 process_assoc_req_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                            uint len, struct sta_info *psta);
-u32 process_p2p_devdisc_req23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                           uint len);
-u32 process_p2p_devdisc_resp23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                            uint len);
-u8 process_p2p_provdisc_req23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                           uint len);
-u8 process_p2p_provdisc_resp23a(struct wifidirect_info *pwdinfo, u8 *pframe);
-u8 process_p2p_group_negotation_req23a(struct wifidirect_info *pwdinfo,
-                                   u8 *pframe, uint len);
-u8 process_p2p_group_negotation_resp23a(struct wifidirect_info *pwdinfo,
-                                    u8 *pframe, uint len);
-u8 process_p2p_group_negotation_confirm23a(struct wifidirect_info *pwdinfo,
-                                       u8 *pframe, uint len);
-u8 process_p2p_presence_req23a(struct wifidirect_info *pwdinfo,
-                           u8 *pframe, uint len);
-
-void p2p_protocol_wk_hdl23a(struct rtw_adapter *padapter, int cmdtype);
-
-#ifdef CONFIG_8723AU_P2P
-void   process_p2p_ps_ie23a(struct rtw_adapter *padapter, u8 *IEs, u32 IELength);
-void   p2p_ps_wk_hdl23a(struct rtw_adapter *padapter, u8 p2p_ps_state);
-u8 p2p_ps_wk_cmd23a(struct rtw_adapter *padapter, u8 p2p_ps_state, u8 enqueue);
-#endif /*  CONFIG_8723AU_P2P */
-
-void rtw_init_cfg80211_wifidirect_info(struct rtw_adapter *padapter);
-int rtw_p2p_check_frames(struct rtw_adapter *padapter, const u8 *buf,
-                        u32 len, u8 tx);
-void rtw_append_wfd_ie(struct rtw_adapter *padapter, u8 *buf, u32 *len);
-
-void reset_global_wifidirect_info23a(struct rtw_adapter *padapter);
-int rtw_init_wifi_display_info(struct rtw_adapter *padapter);
-void rtw_init_wifidirect_timers23a(struct rtw_adapter *padapter);
-void rtw_init_wifidirect_addrs23a(struct rtw_adapter *padapter, u8 *dev_addr,
-                              u8 *iface_addr);
-void init_wifidirect_info23a(struct rtw_adapter *padapter, enum P2P_ROLE role);
-int rtw_p2p_enable23a(struct rtw_adapter *padapter, enum P2P_ROLE role);
-
-static inline void _rtw_p2p_set_state(struct wifidirect_info *wdinfo,
-                                     enum P2P_STATE state)
-{
-       if (wdinfo->p2p_state != state) {
-               /* wdinfo->pre_p2p_state = wdinfo->p2p_state; */
-               wdinfo->p2p_state = state;
-       }
-}
-
-static inline void _rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo,
-                                         enum P2P_STATE state)
-{
-       if (wdinfo->pre_p2p_state != state)
-               wdinfo->pre_p2p_state = state;
-}
-
-static inline void _rtw_p2p_set_role(struct wifidirect_info *wdinfo,
-                                    enum P2P_ROLE role)
-{
-       if (wdinfo->role != role)
-               wdinfo->role = role;
-}
-
-static inline int _rtw_p2p_state(struct wifidirect_info *wdinfo)
-{
-       return wdinfo->p2p_state;
-}
-
-static inline int _rtw_p2p_pre_state(struct wifidirect_info *wdinfo)
-{
-       return wdinfo->pre_p2p_state;
-}
-
-static inline int _rtw_p2p_role(struct wifidirect_info *wdinfo)
-{
-       return wdinfo->role;
-}
-
-static inline bool _rtw_p2p_chk_state(struct wifidirect_info *wdinfo,
-                                     enum P2P_STATE state)
-{
-       return wdinfo->p2p_state == state;
-}
-
-static inline bool _rtw_p2p_chk_role(struct wifidirect_info *wdinfo,
-                                    enum P2P_ROLE role)
-{
-       return wdinfo->role == role;
-}
-
-#define rtw_p2p_set_state(wdinfo, state) _rtw_p2p_set_state(wdinfo, state)
-#define rtw_p2p_set_pre_state(wdinfo, state)                   \
-       _rtw_p2p_set_pre_state(wdinfo, state)
-#define rtw_p2p_set_role(wdinfo, role) _rtw_p2p_set_role(wdinfo, role)
-
-#define rtw_p2p_state(wdinfo) _rtw_p2p_state(wdinfo)
-#define rtw_p2p_pre_state(wdinfo) _rtw_p2p_pre_state(wdinfo)
-#define rtw_p2p_role(wdinfo) _rtw_p2p_role(wdinfo)
-#define rtw_p2p_chk_state(wdinfo, state) _rtw_p2p_chk_state(wdinfo, state)
-#define rtw_p2p_chk_role(wdinfo, role) _rtw_p2p_chk_role(wdinfo, role)
-
-#define rtw_p2p_findphase_ex_set(wdinfo, value) \
-       ((wdinfo)->find_phase_state_exchange_cnt = (value))
-
-/* is this find phase exchange for social channel scan? */
-#define rtw_p2p_findphase_ex_is_social(wdinfo)                 \
-       ((wdinfo)->find_phase_state_exchange_cnt >=             \
-        P2P_FINDPHASE_EX_SOCIAL_FIRST)
-
-/* should we need find phase exchange anymore? */
-#define rtw_p2p_findphase_ex_is_needed(wdinfo) \
-       ((wdinfo)->find_phase_state_exchange_cnt < P2P_FINDPHASE_EX_MAX && \
-       (wdinfo)->find_phase_state_exchange_cnt != P2P_FINDPHASE_EX_NONE)
-
-#endif
index 75bbb934a53cf228d295e70828b0207986c9bffd..702dd845a3ff033a4fe65c1c86bc93b283f0cffd 100644 (file)
@@ -30,7 +30,6 @@
 
 #define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
 
-#define _WPA_IE_ID_    0xdd
 #define _WPA2_IE_ID_   0x30
 
 #define SHA256_MAC_LEN 32
@@ -316,22 +315,6 @@ static const unsigned long K[64] = {
        0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
 };
 
-/* Various logical functions */
-#define RORc(x, y) \
-(((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
-((unsigned long)(x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
-#define Ch(x, y, z)     (z ^ (x & (y ^ z)))
-#define Maj(x, y, z)    (((x | y) & z) | (x & y))
-#define S(x, n)         RORc((x), (n))
-#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
-#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
-#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
-#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
-#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
-#ifndef MIN
-#define MIN(x, y) (((x) < (y)) ? (x) : (y))
-#endif
-
 void rtw_secmicsetkey23a(struct mic_data *pmicdata, u8 *key);
 void rtw_secmicappend23abyte23a(struct mic_data *pmicdata, u8 b);
 void rtw_secmicappend23a(struct mic_data *pmicdata, u8 *src, u32 nbBytes);
index b5034c6ef1dc7db10d811c8599c6ca82e595a130..57ad44ec0aa8208bebf7328ba9ba7b124728ef9e 100644 (file)
@@ -219,39 +219,8 @@ static inline unsigned char *get_hdr_bssid(unsigned char *pframe)
 
 #define _FIXED_IE_LENGTH_              _BEACON_IE_OFFSET_
 
-#define _SSID_IE_                      0
-#define _SUPPORTEDRATES_IE_            1
-#define _DSSET_IE_                     3
-#define _TIM_IE_                       5
-#define _IBSS_PARA_IE_                 6
-#define _COUNTRY_IE_                   7
-#define _CHLGETXT_IE_                  16
-#define _SUPPORTED_CH_IE_              36
-#define _CH_SWTICH_ANNOUNCE_   37      /* Secondary Channel Offset */
-#define _RSN_IE_2_                     48
-#define _SSN_IE_1_                     221
-#define _ERPINFO_IE_                   42
-#define _EXT_SUPPORTEDRATES_IE_                50
-
-#define _HT_CAPABILITY_IE_             45
-#define _FTIE_                         55
-#define _TIMEOUT_ITVL_IE_              56
-#define _SRC_IE_                       59
-#define _HT_EXTRA_INFO_IE_             61
-#define _HT_ADD_INFO_IE_               61 /* _HT_EXTRA_INFO_IE_ */
-
-
-#define        EID_BSSCoexistence              72 /*  20/40 BSS Coexistence */
-#define        EID_BSSIntolerantChlReport      73
-#define _RIC_Descriptor_IE_            75
-
-#define _LINK_ID_IE_           101
-#define _CH_SWITCH_TIMING_     104
-#define _PTI_BUFFER_STATUS_    106
-#define _EXT_CAP_IE_           127
-#define _VENDOR_SPECIFIC_IE_   221
 
-#define        _RESERVED47_            47
+#define        EID_BSSIntolerantChlReport      73
 
 /* ---------------------------------------------------------------------------
                                        Below is the fixed elements...
@@ -490,72 +459,6 @@ struct ADDBA_request {
 #define WPS_ASSOC_STATE_ASSOCIATION_FAILURE    0x03
 #define WPS_ASSOC_STATE_IP_FAILURE             0x04
 
-/*     =====================P2P Section===================== */
-/*     For P2P */
-#define        P2POUI                                  0x506F9A09
-
-/*     P2P Attribute ID */
-#define        P2P_ATTR_STATUS                         0x00
-#define        P2P_ATTR_MINOR_REASON_CODE              0x01
-#define        P2P_ATTR_CAPABILITY                     0x02
-#define        P2P_ATTR_DEVICE_ID                      0x03
-#define        P2P_ATTR_GO_INTENT                      0x04
-#define        P2P_ATTR_CONF_TIMEOUT                   0x05
-#define        P2P_ATTR_LISTEN_CH                      0x06
-#define        P2P_ATTR_GROUP_BSSID                    0x07
-#define        P2P_ATTR_EX_LISTEN_TIMING               0x08
-#define        P2P_ATTR_INTENTED_IF_ADDR               0x09
-#define        P2P_ATTR_MANAGEABILITY                  0x0A
-#define        P2P_ATTR_CH_LIST                        0x0B
-#define        P2P_ATTR_NOA                            0x0C
-#define        P2P_ATTR_DEVICE_INFO                    0x0D
-#define        P2P_ATTR_GROUP_INFO                     0x0E
-#define        P2P_ATTR_GROUP_ID                       0x0F
-#define        P2P_ATTR_INTERFACE                      0x10
-#define        P2P_ATTR_OPERATING_CH                   0x11
-#define        P2P_ATTR_INVITATION_FLAGS               0x12
-
-/*     Value of Status Attribute */
-#define        P2P_STATUS_SUCCESS                      0x00
-#define        P2P_STATUS_FAIL_INFO_UNAVAILABLE        0x01
-#define        P2P_STATUS_FAIL_INCOMPATIBLE_PARAM      0x02
-#define        P2P_STATUS_FAIL_LIMIT_REACHED           0x03
-#define        P2P_STATUS_FAIL_INVALID_PARAM           0x04
-#define        P2P_STATUS_FAIL_REQUEST_UNABLE          0x05
-#define        P2P_STATUS_FAIL_PREVOUS_PROTO_ERR       0x06
-#define        P2P_STATUS_FAIL_NO_COMMON_CH            0x07
-#define        P2P_STATUS_FAIL_UNKNOWN_P2PGROUP        0x08
-#define        P2P_STATUS_FAIL_BOTH_GOINTENT_15        0x09
-#define        P2P_STATUS_FAIL_INCOMPATIBLE_PROVSION   0x0A
-#define        P2P_STATUS_FAIL_USER_REJECT             0x0B
-
-/*     Value of Inviation Flags Attribute */
-#define        P2P_INVITATION_FLAGS_PERSISTENT         BIT(0)
-
-#define        DMP_P2P_DEVCAP_SUPPORT  (P2P_DEVCAP_SERVICE_DISCOVERY | \
-                                P2P_DEVCAP_CLIENT_DISCOVERABILITY | \
-                                P2P_DEVCAP_CONCURRENT_OPERATION | \
-                                P2P_DEVCAP_INVITATION_PROC)
-
-#define        DMP_P2P_GRPCAP_SUPPORT  (P2P_GRPCAP_INTRABSS)
-
-/*     Value of Device Capability Bitmap */
-#define        P2P_DEVCAP_SERVICE_DISCOVERY            BIT(0)
-#define        P2P_DEVCAP_CLIENT_DISCOVERABILITY       BIT(1)
-#define        P2P_DEVCAP_CONCURRENT_OPERATION         BIT(2)
-#define        P2P_DEVCAP_INFRA_MANAGED                BIT(3)
-#define        P2P_DEVCAP_DEVICE_LIMIT                 BIT(4)
-#define        P2P_DEVCAP_INVITATION_PROC              BIT(5)
-
-/*     Value of Group Capability Bitmap */
-#define        P2P_GRPCAP_GO                           BIT(0)
-#define        P2P_GRPCAP_PERSISTENT_GROUP             BIT(1)
-#define        P2P_GRPCAP_GROUP_LIMIT                  BIT(2)
-#define        P2P_GRPCAP_INTRABSS                     BIT(3)
-#define        P2P_GRPCAP_CROSS_CONN                   BIT(4)
-#define        P2P_GRPCAP_PERSISTENT_RECONN            BIT(5)
-#define        P2P_GRPCAP_GROUP_FORMATION              BIT(6)
-
 /*     P2P Public Action Frame ( Management Frame ) */
 #define        P2P_PUB_ACTION_ACTION                   0x09
 
@@ -570,37 +473,6 @@ struct ADDBA_request {
 #define        P2P_PROVISION_DISC_REQ                  7
 #define        P2P_PROVISION_DISC_RESP                 8
 
-/*     P2P Action Frame Type */
-#define        P2P_NOTICE_OF_ABSENCE                   0
-#define        P2P_PRESENCE_REQUEST                    1
-#define        P2P_PRESENCE_RESPONSE                   2
-#define        P2P_GO_DISC_REQUEST                     3
-
-
-#define        P2P_MAX_PERSISTENT_GROUP_NUM            10
-
-#define        P2P_PROVISIONING_SCAN_CNT               3
-
-#define        P2P_WILDCARD_SSID_LEN                   7
-
-#define        P2P_FINDPHASE_EX_NONE                   0       /*  default value, used when: (1)p2p disabed or (2)p2p enabled but only do 1 scan phase */
-#define        P2P_FINDPHASE_EX_FULL                   1       /*  used when p2p enabled and want to do 1 scan phase and P2P_FINDPHASE_EX_MAX-1 find phase */
-#define        P2P_FINDPHASE_EX_SOCIAL_FIRST           (P2P_FINDPHASE_EX_FULL+1)
-#define        P2P_FINDPHASE_EX_MAX                                    4
-#define        P2P_FINDPHASE_EX_SOCIAL_LAST            P2P_FINDPHASE_EX_MAX
-
-#define        P2P_PROVISION_TIMEOUT                   5000    /*5 sec timeout for sending the provision discovery request */
-#define        P2P_CONCURRENT_PROVISION_TIMEOUT        3000    /*3 sec timeout for sending the provision discovery request under concurrent mode */
-#define        P2P_GO_NEGO_TIMEOUT                     5000    /*5 sec timeout for receiving the group negotation response */
-#define        P2P_CONCURRENT_GO_NEGO_TIMEOUT          3000    /*3 sec timeout for sending the negotiation request under concurrent mode */
-#define        P2P_TX_PRESCAN_TIMEOUT                  100     /*100ms */
-#define        P2P_INVITE_TIMEOUT                      5000    /*5 sec timeout for sending the invitation request */
-#define        P2P_CONCURRENT_INVITE_TIMEOUT           3000    /*3 sec timeout for sending the invitation request under concurrent mode */
-#define        P2P_RESET_SCAN_CH                       25000   /*25 sec t/o to reset the scan channel ( based on channel plan ) */
-#define        P2P_MAX_INTENT                          15
-
-#define        P2P_MAX_NOA_NUM                         2
-
 /*     WPS Configuration Method */
 #define        WPS_CM_NONE                                     0x0000
 #define        WPS_CM_LABEL                                    0x0004
@@ -615,93 +487,4 @@ struct ADDBA_request {
 #define        WPS_CM_SW_DISPLAY_PIN                           0x2008
 #define        WPS_CM_LCD_DISPLAY_PIN                          0x4008
 
-enum P2P_ROLE {
-       P2P_ROLE_DISABLE = 0,
-       P2P_ROLE_DEVICE = 1,
-       P2P_ROLE_CLIENT = 2,
-       P2P_ROLE_GO = 3
-};
-
-enum P2P_STATE {
-       P2P_STATE_NONE = 0,                     /*P2P disable */
-       P2P_STATE_IDLE = 1,                     /*P2P had enabled and do nothing */
-       P2P_STATE_LISTEN = 2,                   /*In pure listen state */
-       P2P_STATE_SCAN = 3,                     /*In scan phase */
-       P2P_STATE_FIND_PHASE_LISTEN = 4,        /*In the listen state of find phase */
-       P2P_STATE_FIND_PHASE_SEARCH = 5,        /*In the search state of find phase */
-       P2P_STATE_TX_PROVISION_DIS_REQ = 6,     /*In P2P provisioning discovery */
-       P2P_STATE_RX_PROVISION_DIS_RSP = 7,
-       P2P_STATE_RX_PROVISION_DIS_REQ = 8,
-       P2P_STATE_GONEGO_ING = 9,               /*Doing the group owner negoitation handshake */
-       P2P_STATE_GONEGO_OK = 10,               /*finish the group negoitation handshake with success */
-       P2P_STATE_GONEGO_FAIL = 11,             /*finish the group negoitation handshake with failure */
-       P2P_STATE_RECV_INVITE_REQ_MATCH = 12,   /*receiving the P2P Inviation request and match with the profile. */
-       P2P_STATE_PROVISIONING_ING = 13,        /*Doing the P2P WPS */
-       P2P_STATE_PROVISIONING_DONE = 14,       /*Finish the P2P WPS */
-       P2P_STATE_TX_INVITE_REQ = 15,           /*Transmit the P2P Invitation request */
-       P2P_STATE_RX_INVITE_RESP_OK = 16,       /*Receiving the P2P Invitation response */
-       P2P_STATE_RECV_INVITE_REQ_DISMATCH = 17,/*receiving the P2P Inviation request and dismatch with the profile. */
-       P2P_STATE_RECV_INVITE_REQ_GO = 18,      /*receiving the P2P Inviation request and this wifi is GO. */
-       P2P_STATE_RECV_INVITE_REQ_JOIN = 19,    /*receiving the P2P Inviation request to join an existing P2P Group. */
-       P2P_STATE_RX_INVITE_RESP_FAIL = 20,     /*receiving the P2P Inviation response with failure */
-       P2P_STATE_RX_INFOR_NOREADY = 21,        /*receiving p2p negotiation response with information is not available */
-       P2P_STATE_TX_INFOR_NOREADY = 22,        /*sending p2p negotiation response with information is not available */
-};
-
-enum P2P_WPSINFO {
-       P2P_NO_WPSINFO                          = 0,
-       P2P_GOT_WPSINFO_PEER_DISPLAY_PIN        = 1,
-       P2P_GOT_WPSINFO_SELF_DISPLAY_PIN        = 2,
-       P2P_GOT_WPSINFO_PBC                     = 3,
-};
-
-#define        P2P_PRIVATE_IOCTL_SET_LEN               64
-
-enum P2P_PROTO_WK_ID {
-       P2P_FIND_PHASE_WK = 0,
-       P2P_RESTORE_STATE_WK = 1,
-       P2P_PRE_TX_PROVDISC_PROCESS_WK = 2,
-       P2P_PRE_TX_NEGOREQ_PROCESS_WK = 3,
-       P2P_PRE_TX_INVITEREQ_PROCESS_WK = 4,
-       P2P_AP_P2P_CH_SWITCH_PROCESS_WK = 5,
-       P2P_RO_CH_WK = 6,
-};
-
-#ifdef CONFIG_8723AU_P2P
-enum P2P_PS_STATE {
-       P2P_PS_DISABLE = 0,
-       P2P_PS_ENABLE = 1,
-       P2P_PS_SCAN = 2,
-       P2P_PS_SCAN_DONE = 3,
-       P2P_PS_ALLSTASLEEP = 4, /*  for P2P GO */
-};
-
-enum P2P_PS_MODE {
-       P2P_PS_NONE = 0,
-       P2P_PS_CTWINDOW = 1,
-       P2P_PS_NOA       = 2,
-       P2P_PS_MIX = 3, /*  CTWindow and NoA */
-};
-#endif /*  CONFIG_8723AU_P2P */
-
-/*     =====================WFD Section===================== */
-/*     For Wi-Fi Display */
-#define        WFD_ATTR_DEVICE_INFO                    0x00
-#define        WFD_ATTR_ASSOC_BSSID                    0x01
-#define        WFD_ATTR_COUPLED_SINK_INFO      0x06
-#define        WFD_ATTR_LOCAL_IP_ADDR          0x08
-#define        WFD_ATTR_SESSION_INFO           0x09
-#define        WFD_ATTR_ALTER_MAC                      0x0a
-
-/*     For WFD Device Information Attribute */
-#define        WFD_DEVINFO_SOURCE                                      0x0000
-#define        WFD_DEVINFO_PSINK                                       0x0001
-#define        WFD_DEVINFO_SSINK                                       0x0002
-#define        WFD_DEVINFO_DUAL                                        0x0003
-
-#define        WFD_DEVINFO_SESSION_AVAIL                       0x0010
-#define        WFD_DEVINFO_WSD                                         0x0040
-#define        WFD_DEVINFO_PC_TDLS                                     0x0080
-#define        WFD_DEVINFO_HDCP_SUPPORT                        0x0100
-
 #endif /*  _WIFI_H_ */
index 0eca53ece75d4fface20889819093fb5ad5fe641..2be04c48656c459a86366cf8cbd69defc1997db8 100644 (file)
 #include <osdep_service.h>
 #include <drv_types.h>
 
-struct pkt_file {
-       struct sk_buff *pkt;
-       __kernel_size_t pkt_len; /* the remainder length of the open_file */
-       unsigned char *cur_buffer;
-       u8 *buf_start;
-       u8 *cur_addr;
-       __kernel_size_t buf_len;
-};
-
 
 #define NR_XMITFRAME   256
 
-struct xmit_priv;
-struct pkt_attrib;
-struct sta_xmit_priv;
-struct xmit_frame;
-struct xmit_buf;
-
 int rtw_xmit23a_entry23a(struct sk_buff *pkt, struct net_device *pnetdev);
 
 void rtw_os_xmit_schedule23a(struct rtw_adapter *padapter);
@@ -44,10 +29,6 @@ int rtw_os_xmit_resource_alloc23a(struct rtw_adapter *padapter,
                               struct xmit_buf *pxmitbuf, u32 alloc_sz);
 void rtw_os_xmit_resource_free23a(struct rtw_adapter *padapter,
                               struct xmit_buf *pxmitbuf);
-uint rtw_remainder_len23a(struct pkt_file *pfile);
-void _rtw_open_pktfile23a(struct sk_buff *pkt, struct pkt_file *pfile);
-uint _rtw_pktfile_read23a(struct pkt_file *pfile, u8 *rmem, uint rlen);
-int rtw_endofpktfile23a(struct pkt_file *pfile);
 
 void rtw_os_pkt_complete23a(struct rtw_adapter *padapter, struct sk_buff *pkt);
 void rtw_os_xmit_complete23a(struct rtw_adapter *padapter,
index 50840b9a11fa06075ba0d58386a449957c5aa192..5dbe3f43ab0e8e57d9ed24b992248740d9880e95 100644 (file)
@@ -263,7 +263,6 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter,
        size_t len, bssinf_len = 0;
        struct ieee80211_hdr *pwlanhdr;
        unsigned short *fctrl;
-       u8 bc_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
        struct wireless_dev *wdev = padapter->rtw_wdev;
        struct wiphy *wiphy = wdev->wiphy;
@@ -289,7 +288,6 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter,
 
        notify_channel = ieee80211_get_channel(wiphy, freq);
 
-       /* rtw_get_timestampe_from_ie23a() */
        notify_timestamp = jiffies_to_msecs(jiffies) * 1000;    /* uSec */
 
        notify_interval =
@@ -321,7 +319,7 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter,
        SetSeqNum(pwlanhdr, 0);
 
        if (pnetwork->network.reserved == 1) {  /*  WIFI_BEACON */
-               memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
+               eth_broadcast_addr(pwlanhdr->addr1);
                SetFrameSubType(pbuf, WIFI_BEACON);
        } else {
                memcpy(pwlanhdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN);
@@ -357,9 +355,6 @@ void rtw_cfg80211_indicate_connect(struct rtw_adapter *padapter)
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct wlan_network *cur_network = &pmlmepriv->cur_network;
        struct wireless_dev *pwdev = padapter->rtw_wdev;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif
 
        DBG_8723A("%s(padapter =%p)\n", __func__, padapter);
 
@@ -370,18 +365,7 @@ void rtw_cfg80211_indicate_connect(struct rtw_adapter *padapter)
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE))
                return;
 
-#ifdef CONFIG_8723AU_P2P
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-               rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-               DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =%d\n",
-                         __func__, rtw_p2p_role(pwdinfo),
-                         rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       if (rtw_to_roaming(padapter) > 0) {
+       if (padapter->mlmepriv.to_roaming > 0) {
                struct wiphy *wiphy = pwdev->wiphy;
                struct ieee80211_channel *notify_channel;
                u32 freq;
@@ -429,9 +413,6 @@ void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter)
 {
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct wireless_dev *pwdev = padapter->rtw_wdev;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif
 
        DBG_8723A("%s(padapter =%p)\n", __func__, padapter);
 
@@ -442,21 +423,6 @@ void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter)
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE))
                return;
 
-#ifdef CONFIG_8723AU_P2P
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-               del_timer_sync(&pwdinfo->find_phase_timer);
-               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-               del_timer_sync(&pwdinfo->pre_tx_scan_timer);
-
-               rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-
-               DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =%d\n",
-                         __func__, rtw_p2p_role(pwdinfo),
-                         rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        if (!padapter->mlmepriv.not_indic_disco) {
                if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING)) {
                        cfg80211_connect_result(padapter->pnetdev, NULL, NULL,
@@ -921,11 +887,6 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev,
        struct rtw_adapter *padapter = netdev_priv(dev);
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct security_priv *psecuritypriv = &padapter->securitypriv;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
-
-
 
        DBG_8723A("%s\n", __func__);
 
@@ -1080,15 +1041,6 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev,
                                        rtw_set_key23a(padapter,
                                                    &padapter->securitypriv,
                                                    param->u.crypt.idx, 1);
-#ifdef CONFIG_8723AU_P2P
-                                       if (rtw_p2p_chk_state
-                                           (pwdinfo,
-                                            P2P_STATE_PROVISIONING_ING)) {
-                                               rtw_p2p_set_state(pwdinfo,
-                                                                 P2P_STATE_PROVISIONING_DONE);
-                                       }
-#endif /* CONFIG_8723AU_P2P */
-
                                }
                        }
 
@@ -1147,7 +1099,7 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
                return -1;
 
        param->cmd = IEEE_CMD_SET_ENCRYPTION;
-       memset(param->sta_addr, 0xff, ETH_ALEN);
+       eth_broadcast_addr(param->sta_addr);
 
        switch (params->cipher) {
        case IW_AUTH_CIPHER_NONE:
@@ -1298,10 +1250,8 @@ static int cfg80211_rtw_get_station(struct wiphy *wiphy,
                ret = -ENOENT;
                goto exit;
        }
-#ifdef CONFIG_DEBUG_CFG80211
        DBG_8723A(FUNC_NDEV_FMT " mac =" MAC_FMT "\n", FUNC_NDEV_ARG(ndev),
                  MAC_ARG(mac));
-#endif
 
        /* for infra./P2PClient mode */
        if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) &&
@@ -1352,9 +1302,6 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy);
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif
        int ret = 0;
        u8 change = false;
 
@@ -1386,34 +1333,10 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
        case NL80211_IFTYPE_P2P_CLIENT:
        case NL80211_IFTYPE_STATION:
                networkType = Ndis802_11Infrastructure;
-#ifdef CONFIG_8723AU_P2P
-               if (change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                       del_timer_sync(&pwdinfo->find_phase_timer);
-                       del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                       del_timer_sync(&pwdinfo->pre_tx_scan_timer);
-
-                       /* it means remove GO and change mode from AP(GO)
-                          to station(P2P DEVICE) */
-                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-
-                       DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state ="
-                                 "%d\n", __func__, rtw_p2p_role(pwdinfo),
-                                 rtw_p2p_state(pwdinfo),
-                                 rtw_p2p_pre_state(pwdinfo));
-               }
-#endif /* CONFIG_8723AU_P2P */
                break;
        case NL80211_IFTYPE_P2P_GO:
        case NL80211_IFTYPE_AP:
                networkType = Ndis802_11APMode;
-#ifdef CONFIG_8723AU_P2P
-               if (change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-                       /* it means P2P Group created, we will be GO
-                          and change mode from  P2P DEVICE to AP(GO) */
-                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-               }
-#endif /* CONFIG_8723AU_P2P */
                break;
        default:
                return -EOPNOTSUPP;
@@ -1438,9 +1361,8 @@ void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv,
 {
        spin_lock_bh(&pwdev_priv->scan_req_lock);
        if (pwdev_priv->scan_request != NULL) {
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("%s with scan req\n", __func__);
-#endif
+
                if (pwdev_priv->scan_request->wiphy !=
                    pwdev_priv->rtw_wdev->wiphy)
                        DBG_8723A("error wiphy compare\n");
@@ -1449,9 +1371,7 @@ void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv,
 
                pwdev_priv->scan_request = NULL;
        } else {
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("%s without scan req\n", __func__);
-#endif
        }
        spin_unlock_bh(&pwdev_priv->scan_req_lock);
 }
@@ -1463,10 +1383,6 @@ void rtw_cfg80211_surveydone_event_callback(struct rtw_adapter *padapter)
        struct rtw_queue *queue = &pmlmepriv->scanned_queue;
        struct wlan_network *pnetwork;
 
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A("%s\n", __func__);
-#endif
-
        spin_lock_bh(&pmlmepriv->scanned_queue.lock);
 
        phead = get_list_head(queue);
@@ -1495,23 +1411,15 @@ static int rtw_cfg80211_set_probe_req_wpsp2pie(struct rtw_adapter *padapter,
        int ret = 0;
        uint wps_ielen = 0;
        u8 *wps_ie;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-       u8 *p2p_ie;
-       u32 wfd_ielen = 0;
-#endif
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 
-#ifdef CONFIG_DEBUG_CFG80211
        DBG_8723A("%s, ielen =%d\n", __func__, len);
-#endif
 
        if (len > 0) {
                wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen);
                if (wps_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
                        DBG_8723A("probe_req_wps_ielen =%d\n", wps_ielen);
-#endif
+
                        if (pmlmepriv->wps_probe_req_ie) {
                                pmlmepriv->wps_probe_req_ie_len = 0;
                                kfree(pmlmepriv->wps_probe_req_ie);
@@ -1528,60 +1436,6 @@ static int rtw_cfg80211_set_probe_req_wpsp2pie(struct rtw_adapter *padapter,
                        memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen);
                        pmlmepriv->wps_probe_req_ie_len = wps_ielen;
                }
-#ifdef CONFIG_8723AU_P2P
-               p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
-               if (p2p_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("probe_req_p2p_ielen =%d\n", p2p_ielen);
-#endif
-
-                       if (pmlmepriv->p2p_probe_req_ie) {
-                               pmlmepriv->p2p_probe_req_ie_len = 0;
-                               kfree(pmlmepriv->p2p_probe_req_ie);
-                               pmlmepriv->p2p_probe_req_ie = NULL;
-                       }
-
-                       pmlmepriv->p2p_probe_req_ie =
-                               kmalloc(p2p_ielen, GFP_KERNEL);
-                       if (pmlmepriv->p2p_probe_req_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-                       memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen);
-                       pmlmepriv->p2p_probe_req_ie_len = p2p_ielen;
-               }
-#endif /* CONFIG_8723AU_P2P */
-
-               /* buf += p2p_ielen; */
-               /* len -= p2p_ielen; */
-
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("probe_req_wfd_ielen =%d\n", wfd_ielen);
-#endif
-
-                       if (pmlmepriv->wfd_probe_req_ie) {
-                               pmlmepriv->wfd_probe_req_ie_len = 0;
-                               kfree(pmlmepriv->wfd_probe_req_ie);
-                               pmlmepriv->wfd_probe_req_ie = NULL;
-                       }
-
-                       pmlmepriv->wfd_probe_req_ie =
-                               kmalloc(wfd_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wfd_probe_req_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-                       rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie,
-                                      &pmlmepriv->wfd_probe_req_ie_len);
-               }
-#endif /* CONFIG_8723AU_P2P */
-
        }
 
        return ret;
@@ -1599,25 +1453,16 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
        struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
        struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
        struct cfg80211_ssid *ssids = request->ssids;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       int social_channel = 0;
-#endif /* CONFIG_8723AU_P2P */
        bool need_indicate_scan_done = false;
 
-#ifdef CONFIG_DEBUG_CFG80211
        DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
-#endif
 
        spin_lock_bh(&pwdev_priv->scan_req_lock);
        pwdev_priv->scan_request = request;
        spin_unlock_bh(&pwdev_priv->scan_req_lock);
 
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
-
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("%s under WIFI_AP_STATE\n", __func__);
-#endif
                /* need_indicate_scan_done = true; */
                /* goto check_need_indicate_scan_done; */
        }
@@ -1626,29 +1471,6 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
                need_indicate_scan_done = true;
                goto check_need_indicate_scan_done;
        }
-#ifdef CONFIG_8723AU_P2P
-       if (!memcmp(ssids->ssid, "DIRECT-", 7) &&
-           rtw_get_p2p_ie23a((u8 *) request->ie, request->ie_len, NULL, NULL)) {
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-                       rtw_p2p_enable23a(padapter, P2P_ROLE_DEVICE);
-                       wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true;
-               } else {
-                       rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                                 rtw_p2p_role(pwdinfo),
-                                 rtw_p2p_state(pwdinfo));
-#endif
-               }
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
-
-               if (request->n_channels == 3 &&
-                   request->channels[0]->hw_value == 1 &&
-                   request->channels[1]->hw_value == 6 &&
-                   request->channels[2]->hw_value == 11)
-                       social_channel = 1;
-       }
-#endif /* CONFIG_8723AU_P2P */
 
        if (request->ie && request->ie_len > 0) {
                rtw_cfg80211_set_probe_req_wpsp2pie(padapter,
@@ -1674,28 +1496,12 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
                need_indicate_scan_done = true;
                goto check_need_indicate_scan_done;
        }
-#ifdef CONFIG_8723AU_P2P
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
-           !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) {
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
-               rtw_free_network_queue23a(padapter, true);
-
-               if (social_channel == 0)
-                       rtw_p2p_findphase_ex_set(pwdinfo,
-                                                P2P_FINDPHASE_EX_NONE);
-               else
-                       rtw_p2p_findphase_ex_set(pwdinfo,
-                                                P2P_FINDPHASE_EX_SOCIAL_LAST);
-       }
-#endif /* CONFIG_8723AU_P2P */
 
        memset(ssid, 0, sizeof(struct cfg80211_ssid) * RTW_SSID_SCAN_AMOUNT);
        /* parsing request ssids, n_ssids */
        for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) {
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("ssid =%s, len =%d\n", ssids[i].ssid,
                          ssids[i].ssid_len);
-#endif
                memcpy(ssid[i].ssid, ssids[i].ssid, ssids[i].ssid_len);
                ssid[i].ssid_len = ssids[i].ssid_len;
        }
@@ -1707,11 +1513,9 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
        if (request->n_channels == 1) {
                for (i = 0; i < request->n_channels &&
                     i < RTW_CHANNEL_SCAN_AMOUNT; i++) {
-#ifdef CONFIG_DEBUG_CFG80211
                        DBG_8723A(FUNC_ADPT_FMT CHAN_FMT "\n",
                                  FUNC_ADPT_ARG(padapter),
                                  CHAN_ARG(request->channels[i]));
-#endif
                        ch[i].hw_value = request->channels[i]->hw_value;
                        ch[i].flags = request->channels[i]->flags;
                }
@@ -1877,13 +1681,10 @@ static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv,
 static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                                   size_t ielen)
 {
-       u8 *buf = NULL, *pos = NULL;
+       u8 *buf = NULL;
        int group_cipher = 0, pairwise_cipher = 0;
        int ret = 0;
-       int wpa_ielen = 0;
-       int wpa2_ielen = 0;
-       u8 *pwpa, *pwpa2;
-       u8 null_addr[] = { 0, 0, 0, 0, 0, 0 };
+       const u8 *pwpa, *pwpa2;
        int i;
 
        if (!pie || !ielen) {
@@ -1910,7 +1711,6 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                          buf[i], buf[i + 1],
                          buf[i + 2], buf[i + 3], buf[i + 4],
                          buf[i + 5], buf[i + 6], buf[i + 7]);
-       pos = buf;
        if (ielen < RSN_HEADER_LEN) {
                RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_,
                         ("Ie len too short %d\n", (int)ielen));
@@ -1918,33 +1718,35 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                goto exit;
        }
 
-       pwpa = rtw_get_wpa_ie23a(buf, &wpa_ielen, ielen);
-       if (pwpa && wpa_ielen > 0) {
-               if (rtw_parse_wpa_ie23a(pwpa, wpa_ielen + 2, &group_cipher,
-                                    &pairwise_cipher, NULL) == _SUCCESS) {
+       pwpa = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
+                                      WLAN_OUI_TYPE_MICROSOFT_WPA,
+                                      buf, ielen);
+       if (pwpa && pwpa[1] > 0) {
+               if (rtw_parse_wpa_ie23a(pwpa, pwpa[1] + 2, &group_cipher,
+                                       &pairwise_cipher, NULL) == _SUCCESS) {
                        padapter->securitypriv.dot11AuthAlgrthm =
                                dot11AuthAlgrthm_8021X;
                        padapter->securitypriv.ndisauthtype =
                                Ndis802_11AuthModeWPAPSK;
-                       memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0],
-                              wpa_ielen + 2);
+                       memcpy(padapter->securitypriv.supplicant_ie, pwpa,
+                              pwpa[1] + 2);
 
-                       DBG_8723A("got wpa_ie, wpa_ielen:%u\n", wpa_ielen);
+                       DBG_8723A("got wpa_ie, wpa_ielen:%u\n", pwpa[1]);
                }
        }
 
-       pwpa2 = rtw_get_wpa2_ie23a(buf, &wpa2_ielen, ielen);
-       if (pwpa2 && wpa2_ielen > 0) {
-               if (rtw_parse_wpa2_ie23a (pwpa2, wpa2_ielen + 2, &group_cipher,
-                                      &pairwise_cipher, NULL) == _SUCCESS) {
+       pwpa2 = cfg80211_find_ie(WLAN_EID_RSN, buf, ielen);
+       if (pwpa2 && pwpa2[1] > 0) {
+               if (rtw_parse_wpa2_ie23a (pwpa2, pwpa2[1] + 2, &group_cipher,
+                                         &pairwise_cipher, NULL) == _SUCCESS) {
                        padapter->securitypriv.dot11AuthAlgrthm =
                                dot11AuthAlgrthm_8021X;
                        padapter->securitypriv.ndisauthtype =
                                Ndis802_11AuthModeWPA2PSK;
-                       memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0],
-                              wpa2_ielen + 2);
+                       memcpy(padapter->securitypriv.supplicant_ie, pwpa2,
+                              pwpa2[1] + 2);
 
-                       DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen);
+                       DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", pwpa2[1]);
                }
        }
 
@@ -2029,75 +1831,13 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                }
        }
 
-#ifdef CONFIG_8723AU_P2P
-       {                       /* check p2p_ie for assoc req; */
-               uint p2p_ielen = 0;
-               u8 *p2p_ie;
-               struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-               p2p_ie = rtw_get_p2p_ie23a(buf, ielen, NULL, &p2p_ielen);
-               if (p2p_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("%s p2p_assoc_req_ielen =%d\n", __func__,
-                                 p2p_ielen);
-#endif
-
-                       if (pmlmepriv->p2p_assoc_req_ie) {
-                               pmlmepriv->p2p_assoc_req_ie_len = 0;
-                               kfree(pmlmepriv->p2p_assoc_req_ie);
-                               pmlmepriv->p2p_assoc_req_ie = NULL;
-                       }
-
-                       pmlmepriv->p2p_assoc_req_ie =
-                               kmalloc(p2p_ielen, GFP_KERNEL);
-                       if (pmlmepriv->p2p_assoc_req_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               goto exit;
-                       }
-                       memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen);
-                       pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen;
-               }
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-#ifdef CONFIG_8723AU_P2P
-       {                       /* check wfd_ie for assoc req; */
-               uint wfd_ielen = 0;
-               struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-               if (rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("%s wfd_assoc_req_ielen =%d\n", __func__,
-                                 wfd_ielen);
-#endif
-
-                       if (pmlmepriv->wfd_assoc_req_ie) {
-                               pmlmepriv->wfd_assoc_req_ie_len = 0;
-                               kfree(pmlmepriv->wfd_assoc_req_ie);
-                               pmlmepriv->wfd_assoc_req_ie = NULL;
-                       }
-
-                       pmlmepriv->wfd_assoc_req_ie =
-                               kmalloc(wfd_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wfd_assoc_req_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               goto exit;
-                       }
-                       rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie,
-                                      &pmlmepriv->wfd_assoc_req_ie_len);
-               }
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        /* TKIP and AES disallow multicast packets until installing group key */
        if (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ ||
            padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ ||
            padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)
                /* WPS open need to enable multicast */
                /* check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == true)*/
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_OFF_RCR_AM, null_addr);
+               rtl8723a_off_rcr_am(padapter);
 
        RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
                 ("rtw_set_wpa_ie: pairwise_cipher = 0x%08x padapter->"
@@ -2513,8 +2253,7 @@ static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,
                if (!memcmp(psecuritypriv->PMKIDList[index].Bssid,
                            pmksa->bssid, ETH_ALEN)) {
                        /* BSSID is matched, the same AP => Remove this PMKID information and reset it. */
-                       memset(psecuritypriv->PMKIDList[index].Bssid, 0x00,
-                              ETH_ALEN);
+                       eth_zero_addr(psecuritypriv->PMKIDList[index].Bssid);
                        memset(psecuritypriv->PMKIDList[index].PMKID, 0x00,
                               WLAN_PMKID_LEN);
                        psecuritypriv->PMKIDList[index].bUsed = false;
@@ -2739,9 +2478,6 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
                struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
                u32 len = skb->len;
                u8 category, action;
-#ifdef CONFIG_8723AU_P2P
-               int type = -1;
-#endif
 
                if (rtw_action_frame_parse23a(skb->data, len, &category,
                                           &action) == false) {
@@ -2753,19 +2489,12 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
 
                DBG_8723A("RTW_Tx:da =" MAC_FMT " via " FUNC_NDEV_FMT "\n",
                          MAC_ARG(dot11_hdr->addr1), FUNC_NDEV_ARG(ndev));
-#ifdef CONFIG_8723AU_P2P
-               type = rtw_p2p_check_frames(padapter, skb->data, len, true);
-               if (type >= 0)
-                       goto dump;
-#endif
                if (category == WLAN_CATEGORY_PUBLIC)
                        DBG_8723A("RTW_Tx:%s\n", action_public_str23a(action));
                else
                        DBG_8723A("RTW_Tx:category(%u), action(%u)\n", category,
                                  action);
-#ifdef CONFIG_8723AU_P2P
-dump:
-#endif
+
                /* starting alloc mgmt frame to dump it */
                pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
                if (pmgntframe == NULL)
@@ -2781,16 +2510,6 @@ dump:
                pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
 
                memcpy(pframe, skb->data, len);
-#ifdef CONFIG_8723AU_P2P
-               if (type >= 0) {
-                       struct wifi_display_info *pwfd_info;
-
-                       pwfd_info = padapter->wdinfo.wfd_info;
-
-                       if (pwfd_info->wfd_enable)
-                               rtw_append_wfd_ie(padapter, pframe, &len);
-               }
-#endif /*  CONFIG_8723AU_P2P */
                pattrib->pktlen = len;
 
                /* update seq number */
@@ -2976,10 +2695,6 @@ static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head,
        int ret = 0;
        u8 *pbuf = NULL;
        uint len, wps_ielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       uint p2p_ielen = 0;
-       u8 got_p2p_ie = false;
-#endif
        struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
        /* struct sta_priv *pstapriv = &padapter->stapriv; */
 
@@ -3007,55 +2722,14 @@ static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head,
             &wps_ielen))
                DBG_8723A("add bcn, wps_ielen =%d\n", wps_ielen);
 
-#ifdef CONFIG_8723AU_P2P
-       /* check p2p ie if inclued */
-       if (rtw_get_p2p_ie23a
-           (pbuf + _FIXED_IE_LENGTH_, len - _FIXED_IE_LENGTH_, NULL,
-            &p2p_ielen)) {
-               DBG_8723A("got p2p_ie, len =%d\n", p2p_ielen);
-               got_p2p_ie = true;
-       }
-#endif
-
        /* pbss_network->IEs will not include p2p_ie, wfd ie */
-       rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_,
-                         P2P_OUI23A, 4);
-       rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_,
-                         WFD_OUI23A, 4);
+       rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_,
+                            WLAN_EID_VENDOR_SPECIFIC, P2P_OUI23A, 4);
+       rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_,
+                            WLAN_EID_VENDOR_SPECIFIC, WFD_OUI23A, 4);
 
        if (rtw_check_beacon_data23a(adapter, pbuf, len) == _SUCCESS) {
-#ifdef CONFIG_8723AU_P2P
-               /* check p2p if enable */
-               if (got_p2p_ie == true) {
-                       struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
-                       struct wifidirect_info *pwdinfo = &adapter->wdinfo;
-
-                       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-                               DBG_8723A("Enable P2P function for the first "
-                                         "time\n");
-                               rtw_p2p_enable23a(adapter, P2P_ROLE_GO);
-                               wdev_to_priv(adapter->rtw_wdev)->p2p_enabled =
-                                       true;
-                       } else {
-                               del_timer_sync(&pwdinfo->find_phase_timer);
-                               del_timer_sync(&pwdinfo->
-                                              restore_p2p_state_timer);
-                               del_timer_sync(&pwdinfo->pre_tx_scan_timer);
-
-                               DBG_8723A("enter GO Mode, p2p_ielen =%d\n",
-                                         p2p_ielen);
-
-                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                               pwdinfo->intent = 15;
-                       }
-
-                       pwdinfo->operating_channel = pmlmeext->cur_channel;
-               }
-#endif /* CONFIG_8723AU_P2P */
-
                ret = 0;
-
        } else {
                ret = -EINVAL;
        }
@@ -3252,9 +2926,6 @@ static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,
 void rtw_cfg80211_rx_action_p2p(struct rtw_adapter *padapter, u8 *pmgmt_frame,
                                uint frame_len)
 {
-#ifdef CONFIG_8723AU_P2P
-       int type;
-#endif
        s32 freq;
        int channel;
        u8 category, action;
@@ -3262,17 +2933,9 @@ void rtw_cfg80211_rx_action_p2p(struct rtw_adapter *padapter, u8 *pmgmt_frame,
        channel = rtw_get_oper_ch23a(padapter);
 
        DBG_8723A("RTW_Rx:cur_ch =%d\n", channel);
-#ifdef CONFIG_8723AU_P2P
-       type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false);
-       if (type >= 0)
-               goto indicate;
-#endif
        rtw_action_frame_parse23a(pmgmt_frame, frame_len, &category, &action);
        DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, action);
 
-#ifdef CONFIG_8723AU_P2P
-indicate:
-#endif
        if (channel <= RTW_CH_MAX_2G_CHANNEL)
                freq = ieee80211_channel_to_frequency(channel,
                                                      IEEE80211_BAND_2GHZ);
@@ -3287,9 +2950,6 @@ indicate:
 void rtw_cfg80211_rx_p2p_action_public(struct rtw_adapter *padapter,
                                       u8 *pmgmt_frame, uint frame_len)
 {
-#ifdef CONFIG_8723AU_P2P
-       int type;
-#endif
        s32 freq;
        int channel;
        u8 category, action;
@@ -3297,23 +2957,9 @@ void rtw_cfg80211_rx_p2p_action_public(struct rtw_adapter *padapter,
        channel = rtw_get_oper_ch23a(padapter);
 
        DBG_8723A("RTW_Rx:cur_ch =%d\n", channel);
-#ifdef CONFIG_8723AU_P2P
-       type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false);
-       if (type >= 0) {
-               switch (type) {
-               case P2P_GO_NEGO_CONF:
-               case P2P_PROVISION_DISC_RESP:
-                       rtw_clear_scan_deny(padapter);
-               }
-               goto indicate;
-       }
-#endif
        rtw_action_frame_parse23a(pmgmt_frame, frame_len, &category, &action);
        DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, action);
 
-#ifdef CONFIG_8723AU_P2P
-indicate:
-#endif
        if (channel <= RTW_CH_MAX_2G_CHANNEL)
                freq = ieee80211_channel_to_frequency(channel,
                                                      IEEE80211_BAND_2GHZ);
@@ -3353,350 +2999,6 @@ void rtw_cfg80211_rx_action(struct rtw_adapter *adapter, u8 *frame,
        rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC);
 }
 
-#ifdef CONFIG_8723AU_P2P
-void rtw_cfg80211_issue_p2p_provision_request23a(struct rtw_adapter *padapter,
-                                             const u8 *buf, size_t len)
-{
-       u16 wps_devicepassword_id = 0x0000;
-       uint wps_devicepassword_id_len = 0;
-       u8 wpsie[255] = { 0x00 }, p2p_ie[255] = { 0x00 };
-       uint p2p_ielen = 0;
-       uint wpsielen = 0;
-       u32 devinfo_contentlen = 0;
-       u8 devinfo_content[64] = { 0x00 };
-       u16 capability = 0;
-       uint capability_len = 0;
-
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u8 dialogToken = 1;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_PROVISION_DISC_REQ;
-       u32 p2pielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr, *hdr;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 *frame_body =
-           (unsigned char *)(buf + sizeof(struct ieee80211_hdr_3addr));
-       size_t frame_body_len = len - sizeof(struct ieee80211_hdr_3addr);
-
-       DBG_8723A("[%s] In\n", __func__);
-
-       hdr = (struct ieee80211_hdr *)buf;
-       /* prepare for building provision_request frame */
-       memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, hdr->addr1, ETH_ALEN);
-       memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, hdr->addr1, ETH_ALEN);
-
-       pwdinfo->tx_prov_disc_info.wps_config_method_request =
-           WPS_CM_PUSH_BUTTON;
-
-       rtw_get_wps_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                      frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie,
-                      &wpsielen);
-       rtw_get_wps_attr_content23a(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID,
-                                   (u8 *)&wps_devicepassword_id,
-                                   &wps_devicepassword_id_len);
-       wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id);
-
-       switch (wps_devicepassword_id) {
-       case WPS_DPID_PIN:
-               pwdinfo->tx_prov_disc_info.wps_config_method_request =
-                       WPS_CM_LABEL;
-               break;
-       case WPS_DPID_USER_SPEC:
-               pwdinfo->tx_prov_disc_info.wps_config_method_request =
-                       WPS_CM_DISPLYA;
-               break;
-       case WPS_DPID_MACHINE_SPEC:
-               break;
-       case WPS_DPID_REKEY:
-               break;
-       case WPS_DPID_PBC:
-               pwdinfo->tx_prov_disc_info.wps_config_method_request =
-                       WPS_CM_PUSH_BUTTON;
-               break;
-       case WPS_DPID_REGISTRAR_SPEC:
-               pwdinfo->tx_prov_disc_info.wps_config_method_request =
-                       WPS_CM_KEYPAD;
-               break;
-       default:
-               break;
-       }
-
-       if (rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                          frame_body_len - _PUBLIC_ACTION_IE_OFFSET_,
-                          p2p_ie, &p2p_ielen)) {
-               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
-                                        P2P_ATTR_DEVICE_INFO, devinfo_content,
-                                        &devinfo_contentlen);
-               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY,
-                                        (u8 *)&capability, &capability_len);
-       }
-
-       /* start to build provision_request frame */
-       memset(wpsie, 0, sizeof(wpsie));
-       memset(p2p_ie, 0, sizeof(p2p_ie));
-       p2p_ielen = 0;
-
-       pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
-       if (pmgntframe == NULL)
-               return;
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *) (pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       pwlanhdr->frame_control = 0;
-
-       memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr,
-              ETH_ALEN);
-       memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr,
-              ETH_ALEN);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui,
-                                 &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       /* build_prov_disc_request_p2p_ie23a */
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2p_ie[p2pielen++] = 0x50;
-       p2p_ie[p2pielen++] = 0x6F;
-       p2p_ie[p2pielen++] = 0x9A;
-       p2p_ie[p2pielen++] = 0x09;      /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20110301 */
-       /*      According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. Device Info */
-       /*      3. Group ID ( When joining an operating P2P Group ) */
-
-       /*      P2P Capability ATTR */
-       /*      Type: */
-       p2p_ie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       put_unaligned_le16(0x0002, p2p_ie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       /*      Group Capability Bitmap, 1 byte */
-       memcpy(p2p_ie + p2pielen, &capability, 2);
-       p2pielen += 2;
-
-       /*      Device Info ATTR */
-       /*      Type: */
-       p2p_ie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       put_unaligned_le16(devinfo_contentlen, p2p_ie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen);
-       p2pielen += devinfo_contentlen;
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen,
-                           (unsigned char *)p2p_ie, &p2p_ielen);
-       pattrib->pktlen += p2p_ielen;
-
-       wpsielen = 0;
-       /*      WPS OUI */
-       *(u32 *)(wpsie) = cpu_to_be32(WPSOUI);
-       wpsielen += 4;
-
-       /*      WPS version */
-       /*      Type: */
-       *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
-       wpsielen += 2;
-
-       /*      Value: */
-       wpsie[wpsielen++] = WPS_VERSION_1;      /*      Version 1.0 */
-
-       /*      Config Method */
-       /*      Type: */
-       *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
-       wpsielen += 2;
-
-       /*      Value: */
-       *(u16 *)(wpsie + wpsielen) =
-           cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request);
-       wpsielen += 2;
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen,
-                           (unsigned char *)wpsie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       /* dump_mgntframe23a(padapter, pmgntframe); */
-       if (dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe) != _SUCCESS)
-               DBG_8723A("%s, ack to\n", __func__);
-}
-
-static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
-                                         struct wireless_dev *wdev,
-                                         struct ieee80211_channel *channel,
-                                         unsigned int duration, u64 *cookie)
-{
-       s32 err = 0;
-       struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo =
-           &padapter->cfg80211_wdinfo;
-       u8 remain_ch =
-               (u8) ieee80211_frequency_to_channel(channel->center_freq);
-       u8 ready_on_channel = false;
-
-       DBG_8723A(FUNC_ADPT_FMT " ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter),
-                 remain_ch, duration);
-
-       if (pcfg80211_wdinfo->is_ro_ch == true) {
-               DBG_8723A("%s, cancel ro ch timer\n", __func__);
-
-               del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
-
-#ifdef CONFIG_8723AU_P2P
-               p2p_protocol_wk_hdl23a(padapter, P2P_RO_CH_WK);
-#endif
-       }
-
-       pcfg80211_wdinfo->is_ro_ch = true;
-
-       if (_FAIL == rtw_pwr_wakeup(padapter)) {
-               err = -EFAULT;
-               goto exit;
-       }
-
-       memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel,
-              sizeof(struct ieee80211_channel));
-       pcfg80211_wdinfo->remain_on_ch_cookie = *cookie;
-
-       rtw_scan_abort23a(padapter);
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-               rtw_p2p_enable23a(padapter, P2P_ROLE_DEVICE);
-               wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true;
-       } else {
-               rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-#ifdef CONFIG_DEBUG_CFG80211
-               DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                         rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
-#endif
-       }
-
-       rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
-
-       if (duration < 400)
-               duration = duration * 3;        /* extend from exper. */
-
-       pcfg80211_wdinfo->restore_channel = pmlmeext->cur_channel;
-
-       if (rtw_ch_set_search_ch23a(pmlmeext->channel_set, remain_ch) >= 0) {
-               if (remain_ch != pmlmeext->cur_channel) {
-                       ready_on_channel = true;
-               }
-       } else {
-               DBG_8723A("%s remain_ch:%u not in channel plan!!!!\n",
-                         __func__, remain_ch);
-       }
-
-       /* call this after other things have been done */
-       if (ready_on_channel == true) {
-               if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
-                       pmlmeext->cur_channel = remain_ch;
-
-                       set_channel_bwmode23a(padapter, remain_ch,
-                                          HAL_PRIME_CHNL_OFFSET_DONT_CARE,
-                                          HT_CHANNEL_WIDTH_20);
-               }
-       }
-       DBG_8723A("%s, set ro ch timer, duration =%d\n", __func__, duration);
-       mod_timer(&pcfg80211_wdinfo->remain_on_ch_timer,
-                 jiffies + msecs_to_jiffies(duration));
-
-       rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type,
-                                     duration, GFP_KERNEL);
-
-       pwdinfo->listen_channel = pmlmeext->cur_channel;
-
-exit:
-       if (err)
-               pcfg80211_wdinfo->is_ro_ch = false;
-
-       return err;
-}
-
-static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
-                                                struct wireless_dev *wdev,
-                                                u64 cookie)
-{
-       s32 err = 0;
-       struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo =
-           &padapter->cfg80211_wdinfo;
-
-       DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
-
-       if (pcfg80211_wdinfo->is_ro_ch == true) {
-               DBG_8723A("%s, cancel ro ch timer\n", __func__);
-               del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
-#ifdef CONFIG_8723AU_P2P
-               p2p_protocol_wk_hdl23a(padapter, P2P_RO_CH_WK);
-#endif
-       }
-
-       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                 rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
-#endif
-       pcfg80211_wdinfo->is_ro_ch = false;
-
-       return err;
-}
-
-#endif /* CONFIG_8723AU_P2P */
-
 static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
                                 const u8 *buf, size_t len)
 {
@@ -3708,7 +3010,6 @@ static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
        struct ieee80211_hdr *pwlanhdr;
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       /* struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; */
 
        if (_FAIL == rtw_pwr_wakeup(padapter)) {
                ret = -EFAULT;
@@ -3753,39 +3054,21 @@ static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
        pattrib->seqnum = pmlmeext->mgnt_seq;
        pmlmeext->mgnt_seq++;
 
-#ifdef CONFIG_8723AU_P2P
-       {
-               struct wifi_display_info *pwfd_info;
-
-               pwfd_info = padapter->wdinfo.wfd_info;
-
-               if (true == pwfd_info->wfd_enable) {
-                       rtw_append_wfd_ie(padapter, pframe, &pattrib->pktlen);
-               }
-       }
-#endif /*  CONFIG_8723AU_P2P */
-
        pattrib->last_txcmdsz = pattrib->pktlen;
 
        if (dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe) != _SUCCESS) {
                ack = false;
                ret = _FAIL;
 
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("%s, ack == _FAIL\n", __func__);
-#endif
        } else {
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("%s, ack =%d, ok!\n", __func__, ack);
-#endif
                ret = _SUCCESS;
        }
 
 exit:
 
-#ifdef CONFIG_DEBUG_CFG80211
        DBG_8723A("%s, ret =%d\n", __func__, ret);
-#endif
 
        return ret;
 }
@@ -3824,10 +3107,8 @@ static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
        /* cookie generation */
        *cookie = (unsigned long)buf;
 
-#ifdef CONFIG_DEBUG_CFG80211
        DBG_8723A(FUNC_ADPT_FMT " len =%zu, ch =%d"
                  "\n", FUNC_ADPT_ARG(padapter), len, tx_ch);
-#endif /* CONFIG_DEBUG_CFG80211 */
 
        /* indicate ack before issue frame to avoid racing with rsp frame */
        rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack,
@@ -3842,20 +3123,12 @@ static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 
        DBG_8723A("RTW_Tx:tx_ch =%d, da =" MAC_FMT "\n", tx_ch,
                  MAC_ARG(hdr->addr1));
-#ifdef CONFIG_8723AU_P2P
-       type = rtw_p2p_check_frames(padapter, buf, len, true);
-       if (type >= 0)
-               goto dump;
-#endif
        if (category == WLAN_CATEGORY_PUBLIC)
                DBG_8723A("RTW_Tx:%s\n", action_public_str23a(action));
        else
                DBG_8723A("RTW_Tx:category(%u), action(%u)\n",
                          category, action);
 
-#ifdef CONFIG_8723AU_P2P
-dump:
-#endif
        do {
                dump_cnt++;
                tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len);
@@ -3893,12 +3166,6 @@ static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
                                             struct wireless_dev *wdev,
                                             u16 frame_type, bool reg)
 {
-
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A(FUNC_ADPT_FMT " frame_type:%x, reg:%d\n",
-                 FUNC_ADPT_ARG(adapter), frame_type, reg);
-#endif
-
        if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ))
                return;
 
@@ -3911,11 +3178,6 @@ static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf,
        int ret = 0;
        uint wps_ielen = 0;
        u8 *wps_ie;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-       u32 wfd_ielen = 0;
-       u8 *p2p_ie;
-#endif
 #ifdef CONFIG_8723AU_AP_MODE
        u8 wps_oui[8] = { 0x0, 0x50, 0xf2, 0x04 };
 #endif
@@ -3928,9 +3190,7 @@ static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf,
        if (len > 0) {
                wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen);
                if (wps_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
                        DBG_8723A("bcn_wps_ielen =%d\n", wps_ielen);
-#endif
 
                        if (pmlmepriv->wps_beacon_ie) {
                                pmlmepriv->wps_beacon_ie_len = 0;
@@ -3949,63 +3209,10 @@ static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf,
                        pmlmepriv->wps_beacon_ie_len = wps_ielen;
 
 #ifdef CONFIG_8723AU_AP_MODE
-                       update_beacon23a(padapter, _VENDOR_SPECIFIC_IE_, wps_oui,
-                                     true);
+                       update_beacon23a(padapter, WLAN_EID_VENDOR_SPECIFIC,
+                                        wps_oui, true);
 #endif
                }
-#ifdef CONFIG_8723AU_P2P
-               p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
-               if (p2p_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("bcn_p2p_ielen =%d\n", p2p_ielen);
-#endif
-
-                       if (pmlmepriv->p2p_beacon_ie) {
-                               pmlmepriv->p2p_beacon_ie_len = 0;
-                               kfree(pmlmepriv->p2p_beacon_ie);
-                               pmlmepriv->p2p_beacon_ie = NULL;
-                       }
-
-                       pmlmepriv->p2p_beacon_ie =
-                               kmalloc(p2p_ielen, GFP_KERNEL);
-                       if (pmlmepriv->p2p_beacon_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-                       }
-
-                       memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen);
-                       pmlmepriv->p2p_beacon_ie_len = p2p_ielen;
-               }
-#endif /* CONFIG_8723AU_P2P */
-
-               /* buf += p2p_ielen; */
-               /* len -= p2p_ielen; */
-
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("bcn_wfd_ielen =%d\n", wfd_ielen);
-#endif
-
-                       if (pmlmepriv->wfd_beacon_ie) {
-                               pmlmepriv->wfd_beacon_ie_len = 0;
-                               kfree(pmlmepriv->wfd_beacon_ie);
-                               pmlmepriv->wfd_beacon_ie = NULL;
-                       }
-
-                       pmlmepriv->wfd_beacon_ie =
-                               kmalloc(wfd_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wfd_beacon_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-                       rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie,
-                                      &pmlmepriv->wfd_beacon_ie_len);
-               }
-#endif /* CONFIG_8723AU_P2P */
 
                pmlmeext->bstart_bss = true;
 
@@ -4019,11 +3226,6 @@ static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net,
 {
        struct rtw_adapter *padapter = netdev_priv(net);
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-       u8 *p2p_ie;
-       u32 wfd_ielen = 0;
-#endif
        int ret = 0;
        uint wps_ielen = 0;
        u8 *wps_ie;
@@ -4067,104 +3269,6 @@ static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net,
 
                }
 
-               /* buf += wps_ielen; */
-               /* len -= wps_ielen; */
-
-#ifdef CONFIG_8723AU_P2P
-               p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
-               if (p2p_ie) {
-                       u8 is_GO = false;
-                       u32 attr_contentlen = 0;
-                       u16 cap_attr = 0;
-
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("probe_resp_p2p_ielen =%d\n", p2p_ielen);
-#endif
-
-                       /* Check P2P Capability ATTR */
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
-                                                    P2P_ATTR_CAPABILITY,
-                                                    (u8 *) &cap_attr,
-                                                    (uint *) &attr_contentlen)) {
-                               u8 grp_cap = 0;
-                               /* DBG_8723A( "[%s] Got P2P Capability Attr!!\n", __func__ ); */
-                               cap_attr = le16_to_cpu(cap_attr);
-                               grp_cap = (u8) ((cap_attr >> 8) & 0xff);
-
-                               is_GO = (grp_cap & BIT(0)) ? true : false;
-
-                               if (is_GO)
-                                       DBG_8723A
-                                           ("Got P2P Capability Attr, grp_cap"
-                                            "= 0x%x, is_GO\n", grp_cap);
-                       }
-
-                       if (is_GO == false) {
-                               if (pmlmepriv->p2p_probe_resp_ie) {
-                                       pmlmepriv->p2p_probe_resp_ie_len = 0;
-                                       kfree(pmlmepriv->p2p_probe_resp_ie);
-                                       pmlmepriv->p2p_probe_resp_ie = NULL;
-                               }
-
-                               pmlmepriv->p2p_probe_resp_ie =
-                                   kmalloc(p2p_ielen, GFP_KERNEL);
-                               if (pmlmepriv->p2p_probe_resp_ie == NULL) {
-                                       DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                                 __func__, __LINE__);
-                                       return -EINVAL;
-                               }
-                               memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie,
-                                      p2p_ielen);
-                               pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen;
-                       } else {
-                               if (pmlmepriv->p2p_go_probe_resp_ie) {
-                                       pmlmepriv->p2p_go_probe_resp_ie_len = 0;
-                                       kfree(pmlmepriv->p2p_go_probe_resp_ie);
-                                       pmlmepriv->p2p_go_probe_resp_ie = NULL;
-                               }
-
-                               pmlmepriv->p2p_go_probe_resp_ie =
-                                   kmalloc(p2p_ielen, GFP_KERNEL);
-                               if (pmlmepriv->p2p_go_probe_resp_ie == NULL) {
-                                       DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                                 __func__, __LINE__);
-                                       return -EINVAL;
-
-                               }
-                               memcpy(pmlmepriv->p2p_go_probe_resp_ie,
-                                      p2p_ie, p2p_ielen);
-                               pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen;
-                       }
-               }
-#endif /* CONFIG_8723AU_P2P */
-
-               /* buf += p2p_ielen; */
-               /* len -= p2p_ielen; */
-
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("probe_resp_wfd_ielen =%d\n", wfd_ielen);
-#endif
-
-                       if (pmlmepriv->wfd_probe_resp_ie) {
-                               pmlmepriv->wfd_probe_resp_ie_len = 0;
-                               kfree(pmlmepriv->wfd_probe_resp_ie);
-                               pmlmepriv->wfd_probe_resp_ie = NULL;
-                       }
-
-                       pmlmepriv->wfd_probe_resp_ie =
-                           kmalloc(wfd_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wfd_probe_resp_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-                       rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie,
-                                      &pmlmepriv->wfd_probe_resp_ie_len);
-               }
-#endif /* CONFIG_8723AU_P2P */
        }
 
        return ret;
@@ -4205,19 +3309,10 @@ int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len,
 {
        int ret = 0;
        uint wps_ielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-#endif
 
-#ifdef CONFIG_DEBUG_CFG80211
        DBG_8723A("%s, ielen =%d\n", __func__, len);
-#endif
 
-       if ((rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen) && (wps_ielen > 0))
-#ifdef CONFIG_8723AU_P2P
-           || (rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen) && (p2p_ielen > 0))
-#endif
-           ) {
+       if (rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen) && (wps_ielen > 0)) {
                if (net) {
                        switch (type) {
                        case 0x1:       /* BEACON */
@@ -4280,11 +3375,6 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
        .change_bss = cfg80211_rtw_change_bss,
 #endif /* CONFIG_8723AU_AP_MODE */
 
-#ifdef CONFIG_8723AU_P2P
-       .remain_on_channel = cfg80211_rtw_remain_on_channel,
-       .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel,
-#endif
-
        .mgmt_tx = cfg80211_rtw_mgmt_tx,
        .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
 };
@@ -4348,7 +3438,7 @@ void rtw_cfg80211_init_wiphy(struct rtw_adapter *padapter)
        struct wireless_dev *pwdev = padapter->rtw_wdev;
        struct wiphy *wiphy = pwdev->wiphy;
 
-       rtw23a_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+       rf_type = rtl8723a_get_rf_type(padapter);
 
        DBG_8723A("%s:rf_type =%d\n", __func__, rf_type);
 
@@ -4387,9 +3477,6 @@ static void rtw_cfg80211_preinit_wiphy(struct rtw_adapter *padapter,
            BIT(NL80211_IFTYPE_ADHOC) |
 #ifdef CONFIG_8723AU_AP_MODE
            BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MONITOR) |
-#endif
-#if defined(CONFIG_8723AU_P2P)
-           BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO) |
 #endif
            0;
 
index b30d4d37556ab8d601e59c546856f4c869205ced..c0e79f56d2eb80be6f89fc820f4f7c8ad5fe76bd 100644 (file)
 #include <mlme_osdep.h>
 #include <rtw_ioctl_set.h>
 
-void rtw_os_indicate_connect23a(struct rtw_adapter *adapter)
-{
-       rtw_cfg80211_indicate_connect(adapter);
-
-       netif_carrier_on(adapter->pnetdev);
-
-       if (adapter->pid[2] != 0)
-               rtw_signal_process(adapter->pid[2], SIGALRM);
-}
-
-void rtw_os_indicate_scan_done23a(struct rtw_adapter *padapter, bool aborted)
-{
-       rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev),
-                                       aborted);
-}
-
 static struct rt_pmkid_list backupPMKIDList[NUM_PMKID_CACHE];
 
 void rtw_reset_securitypriv23a(struct rtw_adapter *adapter)
@@ -52,9 +36,6 @@ void rtw_reset_securitypriv23a(struct rtw_adapter *adapter)
                 *  When the countermeasure is trigger, the driver have to
                 *  disconnect with AP for 60 seconds.
                 */
-               memset(&backupPMKIDList[0], 0x00, sizeof(struct rt_pmkid_list) *
-                      NUM_PMKID_CACHE);
-
                memcpy(&backupPMKIDList[0], &adapter->securitypriv.PMKIDList[0],
                       sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE);
                backupPMKIDIndex = adapter->securitypriv.PMKIDIndex;
@@ -99,89 +80,3 @@ void rtw_os_indicate_disconnect23a(struct rtw_adapter *adapter)
 
        rtw_reset_securitypriv23a(adapter);
 }
-
-void rtw_report_sec_ie23a(struct rtw_adapter *adapter, u8 authmode, u8 *sec_ie)
-{
-       uint    len;
-       u8      *buff, *p, i;
-       union iwreq_data wrqu;
-
-       RT_TRACE(_module_mlme_osdep_c_, _drv_info_,
-                ("+rtw_report_sec_ie23a, authmode =%d\n", authmode));
-
-       buff = NULL;
-       if (authmode == _WPA_IE_ID_) {
-               RT_TRACE(_module_mlme_osdep_c_, _drv_info_,
-                        ("rtw_report_sec_ie23a, authmode =%d\n", authmode));
-
-               buff = kzalloc(IW_CUSTOM_MAX, GFP_KERNEL);
-               if (!buff)
-                       return;
-               p = buff;
-
-               p += sprintf(p, "ASSOCINFO(ReqIEs =");
-
-               len = sec_ie[1]+2;
-               len =  (len < IW_CUSTOM_MAX) ? len : IW_CUSTOM_MAX;
-
-               for (i = 0; i < len; i++)
-                       p += sprintf(p, "%02x", sec_ie[i]);
-
-               p += sprintf(p, ")");
-
-               memset(&wrqu, 0, sizeof(wrqu));
-
-               wrqu.data.length = p-buff;
-
-               wrqu.data.length = (wrqu.data.length < IW_CUSTOM_MAX) ?
-                                  wrqu.data.length : IW_CUSTOM_MAX;
-
-               kfree(buff);
-       }
-}
-
-#ifdef CONFIG_8723AU_AP_MODE
-void rtw_indicate_sta_assoc_event23a(struct rtw_adapter *padapter,
-                                 struct sta_info *psta)
-{
-       struct sta_priv *pstapriv = &padapter->stapriv;
-       union iwreq_data wrqu;
-
-       if (psta == NULL)
-               return;
-
-       if (psta->aid > NUM_STA)
-               return;
-
-       if (pstapriv->sta_aid[psta->aid - 1] != psta)
-               return;
-
-       wrqu.addr.sa_family = ARPHRD_ETHER;
-
-       memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN);
-
-       DBG_8723A("+rtw_indicate_sta_assoc_event23a\n");
-}
-
-void rtw_indicate_sta_disassoc_event23a(struct rtw_adapter *padapter,
-                                    struct sta_info *psta)
-{
-       struct sta_priv *pstapriv = &padapter->stapriv;
-       union iwreq_data wrqu;
-
-       if (psta == NULL)
-               return;
-
-       if (psta->aid > NUM_STA)
-               return;
-
-       if (pstapriv->sta_aid[psta->aid - 1] != psta)
-               return;
-
-       wrqu.addr.sa_family = ARPHRD_ETHER;
-
-       memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN);
-
-       DBG_8723A("+rtw_indicate_sta_disassoc_event23a\n");
-}
-#endif
index 57eca7a45672b94674677f88cfef688ca403c386..fd9de2a60bf77e38b525af99375a3b47e1e18180 100644 (file)
@@ -20,7 +20,6 @@
 #include <recv_osdep.h>
 #include <hal_intf.h>
 #include <rtw_version.h>
-#include <ethernet.h>
 
 #include <usb_osintf.h>
 #include <linux/version.h>
@@ -66,10 +65,10 @@ static int rtw_acm_method;/*  0:By SW 1:By HW. */
 static int rtw_wmm_enable = 1;/*  default is set to enable the wmm. */
 static int rtw_uapsd_enable;
 
-int rtw_ht_enable23A = 1;
+static int rtw_ht_enable = 1;
 /* 0 :diable, bit(0): enable 2.4g, bit(1): enable 5g */
-int rtw_cbw40_enable23A = 3;
-int rtw_ampdu_enable23A = 1;/* for enable tx_ampdu */
+static int rtw_cbw40_enable = 3;
+static int rtw_ampdu_enable = 1;/* for enable tx_ampdu */
 /*  0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable
  * 2.4GHZ for IOT issue with bufflao's AP at 5GHZ
  */
@@ -130,9 +129,9 @@ module_param(rtw_wmm_enable, int, 0644);
 module_param(rtw_vrtl_carrier_sense, int, 0644);
 module_param(rtw_vcs_type, int, 0644);
 module_param(rtw_busy_thresh, int, 0644);
-module_param(rtw_ht_enable23A, int, 0644);
-module_param(rtw_cbw40_enable23A, int, 0644);
-module_param(rtw_ampdu_enable23A, int, 0644);
+module_param(rtw_ht_enable, int, 0644);
+module_param(rtw_cbw40_enable, int, 0644);
+module_param(rtw_ampdu_enable, int, 0644);
 module_param(rtw_rx_stbc, int, 0644);
 module_param(rtw_ampdu_amsdu, int, 0644);
 
@@ -203,9 +202,9 @@ static uint loadparam(struct rtw_adapter *padapter,  struct net_device *pnetdev)
         /* UAPSD */
        registry_par->wmm_enable = (u8)rtw_wmm_enable;
        registry_par->uapsd_enable = (u8)rtw_uapsd_enable;
-       registry_par->ht_enable = (u8)rtw_ht_enable23A;
-       registry_par->cbw40_enable = (u8)rtw_cbw40_enable23A;
-       registry_par->ampdu_enable = (u8)rtw_ampdu_enable23A;
+       registry_par->ht_enable = (u8)rtw_ht_enable;
+       registry_par->cbw40_enable = (u8)rtw_cbw40_enable;
+       registry_par->ampdu_enable = (u8)rtw_ampdu_enable;
        registry_par->rx_stbc = (u8)rtw_rx_stbc;
        registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu;
        registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit;
@@ -456,9 +455,6 @@ static u8 rtw_init_default_value(struct rtw_adapter *padapter)
        padapter->bWritePortCancel = false;
        padapter->bRxRSSIDisplay = 0;
        padapter->bNotifyChannelChange = 0;
-#ifdef CONFIG_8723AU_P2P
-       padapter->bShowGetP2PState = 1;
-#endif
        return ret;
 }
 
@@ -521,17 +517,6 @@ u8 rtw_init_drv_sw23a(struct rtw_adapter *padapter)
                goto exit;
        }
 
-#ifdef CONFIG_8723AU_P2P
-       rtw_init_wifidirect_timers23a(padapter);
-       init_wifidirect_info23a(padapter, P2P_ROLE_DISABLE);
-       reset_global_wifidirect_info23a(padapter);
-       rtw_init_cfg80211_wifidirect_info(padapter);
-#ifdef CONFIG_8723AU_P2P
-       if (rtw_init_wifi_display_info(padapter) == _FAIL)
-               RT_TRACE(_module_os_intfs_c_, _drv_err_,
-                        ("\n Can't init init_wifi_display_info\n"));
-#endif
-#endif /* CONFIG_8723AU_P2P */
 
        if (init_mlme_ext_priv23a(padapter) == _FAIL) {
                RT_TRACE(_module_os_intfs_c_, _drv_err_,
@@ -600,10 +585,6 @@ void rtw_cancel_all_timer23a(struct rtw_adapter *padapter)
 
        del_timer_sync(&padapter->pwrctrlpriv.pwr_state_check_timer);
 
-#ifdef CONFIG_8723AU_P2P
-       del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
-#endif /* CONFIG_8723AU_P2P */
-
        del_timer_sync(&padapter->mlmepriv.set_scan_deny_timer);
        rtw_clear_scan_deny(padapter);
        RT_TRACE(_module_os_intfs_c_, _drv_info_,
@@ -616,26 +597,8 @@ void rtw_cancel_all_timer23a(struct rtw_adapter *padapter)
 
 u8 rtw_free_drv_sw23a(struct rtw_adapter *padapter)
 {
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo;
-#endif
-
        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("==>rtw_free_drv_sw23a"));
 
-       /* we can call rtw_p2p_enable23a here, but:
-        *  1. rtw_p2p_enable23a may have IO operation
-        *  2. rtw_p2p_enable23a is bundled with wext interface
-        */
-#ifdef CONFIG_8723AU_P2P
-       pwdinfo = &padapter->wdinfo;
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-               del_timer_sync(&pwdinfo->find_phase_timer);
-               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-               del_timer_sync(&pwdinfo->pre_tx_scan_timer);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
-       }
-#endif
-
        free_mlme_ext_priv23a(&padapter->mlmeextpriv);
 
        rtw_free_cmd_priv23a(&padapter->cmdpriv);
@@ -887,7 +850,7 @@ void rtw_ips_pwr_down23a(struct rtw_adapter *padapter)
 
 void rtw_ips_dev_unload23a(struct rtw_adapter *padapter)
 {
-       rtw_hal_set_hwreg23a(padapter, HW_VAR_FIFO_CLEARN_UP, NULL);
+       rtl8723a_fifo_cleanup(padapter);
 
        if (padapter->intf_stop)
                padapter->intf_stop(padapter);
@@ -946,12 +909,6 @@ static int netdev_close(struct net_device *pnetdev)
                rtw_led_control(padapter, LED_CTL_POWER_OFF);
        }
 
-#ifdef CONFIG_8723AU_P2P
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled)
-               wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = false;
-       rtw_p2p_enable23a(padapter, P2P_ROLE_DISABLE);
-#endif /* CONFIG_8723AU_P2P */
-
        rtw_scan_abort23a(padapter);
         /* set this at the end */
        padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR;
index 97fc27dce19c987288540949142bd117d9c9e951..b89e779fa0452243a88ab54f8de0fa979b7ed32a 100644 (file)
@@ -71,17 +71,6 @@ u32 _rtw_queue_empty23a(struct rtw_queue *pqueue)
                return false;
 }
 
-u64 rtw_modular6423a(u64 x, u64 y)
-{
-       return do_div(x, y);
-}
-
-u64 rtw_division6423a(u64 x, u64 y)
-{
-       do_div(x, y);
-       return x;
-}
-
 /* rtw_cbuf_full23a - test if cbuf is full
  * @cbuf: pointer of struct rtw_cbuf
  *
index 84402a589f258ae56045555aebda6f30d778f5d4..528ed9253b141eaa9f27e36aa2499e3f7015e218 100644 (file)
 #include <recv_osdep.h>
 
 #include <osdep_intf.h>
-#include <ethernet.h>
 
 #include <usb_ops.h>
 
-/* alloc os related resource in struct recv_frame */
-int rtw_os_recv_resource_alloc23a(struct rtw_adapter *padapter,
-                              struct recv_frame *precvframe)
-{
-       int res = _SUCCESS;
-
-       precvframe->pkt = NULL;
-
-       return res;
-}
-
-/* alloc os related resource in struct recv_buf */
-int rtw_os_recvbuf_resource_alloc23a(struct rtw_adapter *padapter,
-                                 struct recv_buf *precvbuf)
-{
-       int res = _SUCCESS;
-
-       precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL);
-       if (precvbuf->purb == NULL)
-               res = _FAIL;
-
-       precvbuf->pskb = NULL;
-
-       return res;
-}
-
-/* free os related resource in struct recv_buf */
-int rtw_os_recvbuf_resource_free23a(struct rtw_adapter *padapter,
-                                struct recv_buf *precvbuf)
-{
-       int ret = _SUCCESS;
-
-       usb_free_urb(precvbuf->purb);
-
-       if (precvbuf->pskb)
-               dev_kfree_skb_any(precvbuf->pskb);
-
-       return ret;
-}
-
 void rtw_handle_tkip_mic_err23a(struct rtw_adapter *padapter, u8 bgroup)
 {
        enum nl80211_key_type key_type = 0;
@@ -110,11 +69,6 @@ void rtw_handle_tkip_mic_err23a(struct rtw_adapter *padapter, u8 bgroup)
        wrqu.data.length = sizeof(ev);
 }
 
-void rtw_hostapd_mlme_rx23a(struct rtw_adapter *padapter,
-                        struct recv_frame *precv_frame)
-{
-}
-
 int rtw_recv_indicatepkt23a(struct rtw_adapter *padapter,
                         struct recv_frame *precv_frame)
 {
@@ -205,18 +159,6 @@ _recv_indicatepkt_drop:
         return _FAIL;
 }
 
-void rtw_os_read_port23a(struct rtw_adapter *padapter, struct recv_buf *precvbuf)
-{
-       struct recv_priv *precvpriv = &padapter->recvpriv;
-
-       /* free skb in recv_buf */
-       dev_kfree_skb_any(precvbuf->pskb);
-
-       precvbuf->pskb = NULL;
-
-       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, precvbuf);
-}
-
 void rtw_init_recv_timer23a(struct recv_reorder_ctrl *preorder_ctrl)
 {
        setup_timer(&preorder_ctrl->reordering_ctrl_timer,
index 612806e0de2e80f5a2d01044f9bbdd3717d97eda..31ab34601bab99546a551c1cd70a93b87a25cffc 100644 (file)
@@ -353,6 +353,7 @@ int rtw_hw_suspend23a(struct rtw_adapter *padapter)
 {
        struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
        struct net_device *pnetdev = padapter->pnetdev;
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 
        if ((!padapter->bup) || (padapter->bDriverStopped) ||
            (padapter->bSurpriseRemoved)) {
@@ -380,20 +381,16 @@ int rtw_hw_suspend23a(struct rtw_adapter *padapter)
 
                /* s2-2.  indicate disconnect to os */
                /* rtw_indicate_disconnect23a(padapter); */
-               {
-                       struct  mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-                       if (check_fwstate(pmlmepriv, _FW_LINKED)) {
-                               _clr_fwstate_(pmlmepriv, _FW_LINKED);
+               if (check_fwstate(pmlmepriv, _FW_LINKED)) {
+                       _clr_fwstate_(pmlmepriv, _FW_LINKED);
 
-                               rtw_led_control(padapter, LED_CTL_NO_LINK);
+                       rtw_led_control(padapter, LED_CTL_NO_LINK);
 
-                               rtw_os_indicate_disconnect23a(padapter);
+                       rtw_os_indicate_disconnect23a(padapter);
 
-                               /* donnot enqueue cmd */
-                               rtw_lps_ctrl_wk_cmd23a(padapter,
-                                                   LPS_CTRL_DISCONNECT, 0);
-                       }
+                       /* donnot enqueue cmd */
+                       rtw_lps_ctrl_wk_cmd23a(padapter,
+                                              LPS_CTRL_DISCONNECT, 0);
                }
                /* s2-3. */
                rtw_free_assoc_resources23a(padapter, 1);
@@ -509,7 +506,8 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
        up(&pwrpriv->lock);
 
        if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
-               rtw_indicate_scan_done23a(padapter, 1);
+               rtw_cfg80211_indicate_scan_done(
+                       wdev_to_priv(padapter->rtw_wdev), true);
 
        if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
                rtw_indicate_disconnect23a(padapter);
@@ -565,7 +563,7 @@ int rtw_resume_process23a(struct rtw_adapter *padapter)
 
        if (padapter->pid[1] != 0) {
                DBG_8723A("pid[1]:%d\n", padapter->pid[1]);
-               rtw_signal_process(padapter->pid[1], SIGUSR2);
+               kill_pid(find_vpid(padapter->pid[1]), SIGUSR2, 1);
        }
 
        rtw23a_roaming(padapter, NULL);
@@ -664,10 +662,6 @@ static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
 
        /*  set mac addr */
        rtw_macaddr_cfg23a(padapter->eeprompriv.mac_addr);
-#ifdef CONFIG_8723AU_P2P
-       rtw_init_wifidirect_addrs23a(padapter, padapter->eeprompriv.mac_addr,
-                                 padapter->eeprompriv.mac_addr);
-#endif
 
        DBG_8723A("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n",
                  padapter->bDriverStopped, padapter->bSurpriseRemoved,
index e1c6fc7462333ec84741e258d63933a1002ba301..69f88848715abc9d61f58ed9cbabcf91b18e8e43 100644 (file)
 #include <xmit_osdep.h>
 #include <osdep_intf.h>
 
-uint rtw_remainder_len23a(struct pkt_file *pfile)
-{
-       return pfile->buf_len - ((unsigned long)(pfile->cur_addr) -
-              (unsigned long)(pfile->buf_start));
-}
-
-void _rtw_open_pktfile23a(struct sk_buff *pktptr, struct pkt_file *pfile)
-{
-       pfile->pkt = pktptr;
-       pfile->buf_start = pktptr->data;
-       pfile->cur_addr = pktptr->data;
-       pfile->buf_len = pktptr->len;
-       pfile->pkt_len = pktptr->len;
-
-       pfile->cur_buffer = pfile->buf_start;
-}
-
-uint _rtw_pktfile_read23a(struct pkt_file *pfile, u8 *rmem, uint rlen)
-{
-       uint    len = 0;
-
-       len =  rtw_remainder_len23a(pfile);
-       len = (rlen > len) ? len : rlen;
-
-       if (rmem)
-               skb_copy_bits(pfile->pkt, pfile->buf_len-pfile->pkt_len,
-                             rmem, len);
-
-       pfile->cur_addr += len;
-       pfile->pkt_len -= len;
-
-       return len;
-}
-
-int rtw_endofpktfile23a(struct pkt_file *pfile)
-{
-       if (pfile->pkt_len == 0)
-               return true;
-       return false;
-}
-
 int rtw_os_xmit_resource_alloc23a(struct rtw_adapter *padapter,
                               struct xmit_buf *pxmitbuf, u32 alloc_sz)
 {
index 4fb6bf0d1da2de68f72b5d73fb8dc936924f1c30..256e514f424ab25f425e744419e0695cfa26b0a3 100644 (file)
  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  * more details.
  *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
- *
  * The full GNU General Public License is included in this distribution in the
  * file called LICENSE.
  *
@@ -34,42 +30,43 @@ void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw);
 
 void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw,
-                                                                                        u32 *p_inta, u32 *p_intb);
+                                   u32 *p_inta, u32 *p_intb);
 int rtl8821ae_hw_init(struct ieee80211_hw *hw);
 void rtl8821ae_card_disable(struct ieee80211_hw *hw);
 void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw);
 void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw);
-int rtl8821ae_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type);
+int rtl8821ae_set_network_type(struct ieee80211_hw *hw,
+                              enum nl80211_iftype type);
 void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid);
 void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci);
 void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw);
 void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw);
 void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw,
-                                                                                               u32 add_msr, u32 rm_msr);
+                                    u32 add_msr, u32 rm_msr);
 void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                                                                       struct ieee80211_sta *sta,
-                                                                                       u8 rssi_level);
+                                  struct ieee80211_sta *sta,
+                                  u8 rssi_level);
 void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
 void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw);
 void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index,
-                                               u8 *p_macaddr, bool is_group, u8 enc_algo,
-                                               bool is_wepkey, bool clear_all);
+                      u8 *p_macaddr, bool is_group, u8 enc_algo,
+                      bool is_wepkey, bool clear_all);
 
 void rtl8821ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
-                                                                                                                       bool autoload_fail,
-                                                                                                                       u8* hwinfo);
+                                             bool autoload_fail,
+                                             u8 *hwinfo);
 void rtl8812ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
-                                                                                                                       bool autoload_fail,
-                                                                                                                       u8* hwinfo);
-void rtl8821ae_bt_reg_init(struct ieee80211_hwhw);
-void rtl8821ae_bt_hw_init(struct ieee80211_hwhw);
+                                             bool autoload_fail,
+                                             u8 *hwinfo);
+void rtl8821ae_bt_reg_init(struct ieee80211_hw *hw);
+void rtl8821ae_bt_hw_init(struct ieee80211_hw *hw);
 void rtl8821ae_suspend(struct ieee80211_hw *hw);
 void rtl8821ae_resume(struct ieee80211_hw *hw);
 void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw,
-                                                                                 bool allow_all_da,
-                                                                                 bool write_into_reg);
+                                 bool allow_all_da,
+                                 bool write_into_reg);
 void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw);
 void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw);
 #endif
index c6370d3d637f9d26884086db5e4ddc3ff7e9a80a..a93b05bf992cd6ddd871bea029a37973239ebd5f 100644 (file)
@@ -30,7 +30,8 @@ static inline void cpld_set_bit(struct channel *channel, unsigned reg, u32 bit)
        spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
 }
 
-static inline void cpld_clear_bit(struct channel *channel, unsigned reg, u32 bit)
+static inline void cpld_clear_bit(struct channel *channel,
+                               unsigned reg, u32 bit)
 {
        unsigned long flags;
        spin_lock_irqsave(&channel->card->bootrom_lock, flags);
diff --git a/drivers/staging/skein/Kconfig b/drivers/staging/skein/Kconfig
new file mode 100644 (file)
index 0000000..8f5a72a
--- /dev/null
@@ -0,0 +1,32 @@
+config CRYPTO_SKEIN
+       bool "Skein digest algorithm"
+       depends on (X86 || UML_X86) && 64BIT
+       select CRYPTO_THREEFISH
+       select CRYPTO_HASH
+       help
+         Skein secure hash algorithm is one of 5 finalists from the NIST SHA3
+         competition.
+
+         Skein is optimized for modern, 64bit processors and is highly
+         customizable.  See:
+
+         http://www.skein-hash.info/sites/default/files/skein1.3.pdf
+
+         for more information.  This module depends on the threefish block
+         cipher module.
+
+config CRYPTO_THREEFISH
+       bool "Threefish tweakable block cipher"
+       depends on (X86 || UML_X86) && 64BIT
+       select CRYPTO_ALGAPI
+       help
+         Threefish cipher algorithm is the tweakable block cipher underneath
+         the Skein family of secure hash algorithms.  Skein is one of 5
+         finalists from the NIST SHA3 competition.
+
+         Skein is optimized for modern, 64bit processors and is highly
+         customizable.  See:
+
+         http://www.skein-hash.info/sites/default/files/skein1.3.pdf
+
+         for more information.
diff --git a/drivers/staging/skein/Makefile b/drivers/staging/skein/Makefile
new file mode 100644 (file)
index 0000000..2bb386e
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# Makefile for the skein secure hash algorithm
+#
+subdir-ccflags-y := -I$(src)/include/
+
+obj-$(CONFIG_CRYPTO_SKEIN) +=   skein.o \
+                               skeinApi.o \
+                               skein_block.o
+
+obj-$(CONFIG_CRYPTO_THREEFISH) += threefish1024Block.o \
+                                 threefish256Block.o \
+                                 threefish512Block.o \
+                                 threefishApi.o
diff --git a/drivers/staging/skein/TODO b/drivers/staging/skein/TODO
new file mode 100644 (file)
index 0000000..f5c167a
--- /dev/null
@@ -0,0 +1,11 @@
+skein/threefish TODO
+
+ - rename camelcase vars
+ - rename camelcase functions
+ - rename files
+ - move macros into appropriate header files
+ - add / pass test vectors
+ - module support
+
+Please send patches to Jason Cooper <jason@lakedaemon.net> in addition to the
+staging tree mailinglist.
diff --git a/drivers/staging/skein/include/skein.h b/drivers/staging/skein/include/skein.h
new file mode 100644 (file)
index 0000000..0a2abce
--- /dev/null
@@ -0,0 +1,344 @@
+#ifndef _SKEIN_H_
+#define _SKEIN_H_     1
+/**************************************************************************
+**
+** Interface declarations and internal definitions for Skein hashing.
+**
+** Source code author: Doug Whiting, 2008.
+**
+** This algorithm and source code is released to the public domain.
+**
+***************************************************************************
+**
+** The following compile-time switches may be defined to control some
+** tradeoffs between speed, code size, error checking, and security.
+**
+** The "default" note explains what happens when the switch is not defined.
+**
+**  SKEIN_DEBUG            -- make callouts from inside Skein code
+**                            to examine/display intermediate values.
+**                            [default: no callouts (no overhead)]
+**
+**  SKEIN_ERR_CHECK        -- how error checking is handled inside Skein
+**                            code. If not defined, most error checking
+**                            is disabled (for performance). Otherwise,
+**                            the switch value is interpreted as:
+**                                0: use assert()      to flag errors
+**                                1: return SKEIN_FAIL to flag errors
+**
+***************************************************************************/
+
+#ifndef RotL_64
+#define RotL_64(x, N)    (((x) << (N)) | ((x) >> (64-(N))))
+#endif
+
+/* below two prototype assume we are handed aligned data */
+#define Skein_Put64_LSB_First(dst08, src64, bCnt) memcpy(dst08, src64, bCnt)
+#define Skein_Get64_LSB_First(dst64, src08, wCnt) memcpy(dst64, src08, 8*(wCnt))
+#define Skein_Swap64(w64)  (w64)
+
+enum {
+       SKEIN_SUCCESS         =      0, /* return codes from Skein calls */
+       SKEIN_FAIL            =      1,
+       SKEIN_BAD_HASHLEN     =      2
+};
+
+#define  SKEIN_MODIFIER_WORDS   (2) /* number of modifier (tweak) words */
+
+#define  SKEIN_256_STATE_WORDS  (4)
+#define  SKEIN_512_STATE_WORDS  (8)
+#define  SKEIN1024_STATE_WORDS (16)
+#define  SKEIN_MAX_STATE_WORDS (16)
+
+#define  SKEIN_256_STATE_BYTES  (8*SKEIN_256_STATE_WORDS)
+#define  SKEIN_512_STATE_BYTES  (8*SKEIN_512_STATE_WORDS)
+#define  SKEIN1024_STATE_BYTES  (8*SKEIN1024_STATE_WORDS)
+
+#define  SKEIN_256_STATE_BITS  (64*SKEIN_256_STATE_WORDS)
+#define  SKEIN_512_STATE_BITS  (64*SKEIN_512_STATE_WORDS)
+#define  SKEIN1024_STATE_BITS  (64*SKEIN1024_STATE_WORDS)
+
+#define  SKEIN_256_BLOCK_BYTES  (8*SKEIN_256_STATE_WORDS)
+#define  SKEIN_512_BLOCK_BYTES  (8*SKEIN_512_STATE_WORDS)
+#define  SKEIN1024_BLOCK_BYTES  (8*SKEIN1024_STATE_WORDS)
+
+struct skein_ctx_hdr {
+       size_t  hashBitLen;             /* size of hash result, in bits */
+       size_t  bCnt;                   /* current byte count in buffer b[] */
+       u64  T[SKEIN_MODIFIER_WORDS];   /* tweak: T[0]=byte cnt, T[1]=flags */
+};
+
+struct skein_256_ctx { /* 256-bit Skein hash context structure */
+       struct skein_ctx_hdr h;         /* common header context variables */
+       u64  X[SKEIN_256_STATE_WORDS];  /* chaining variables */
+       u8  b[SKEIN_256_BLOCK_BYTES];   /* partial block buf (8-byte aligned) */
+};
+
+struct skein_512_ctx { /* 512-bit Skein hash context structure */
+       struct skein_ctx_hdr h;         /* common header context variables */
+       u64  X[SKEIN_512_STATE_WORDS];  /* chaining variables */
+       u8  b[SKEIN_512_BLOCK_BYTES];   /* partial block buf (8-byte aligned) */
+};
+
+struct skein1024_ctx { /* 1024-bit Skein hash context structure */
+       struct skein_ctx_hdr h;         /* common header context variables */
+       u64  X[SKEIN1024_STATE_WORDS];  /* chaining variables */
+       u8  b[SKEIN1024_BLOCK_BYTES];   /* partial block buf (8-byte aligned) */
+};
+
+/*   Skein APIs for (incremental) "straight hashing" */
+int  Skein_256_Init(struct skein_256_ctx *ctx, size_t hashBitLen);
+int  Skein_512_Init(struct skein_512_ctx *ctx, size_t hashBitLen);
+int  Skein1024_Init(struct skein1024_ctx *ctx, size_t hashBitLen);
+
+int  Skein_256_Update(struct skein_256_ctx *ctx, const u8 *msg,
+                       size_t msgByteCnt);
+int  Skein_512_Update(struct skein_512_ctx *ctx, const u8 *msg,
+                       size_t msgByteCnt);
+int  Skein1024_Update(struct skein1024_ctx *ctx, const u8 *msg,
+                       size_t msgByteCnt);
+
+int  Skein_256_Final(struct skein_256_ctx *ctx, u8 *hashVal);
+int  Skein_512_Final(struct skein_512_ctx *ctx, u8 *hashVal);
+int  Skein1024_Final(struct skein1024_ctx *ctx, u8 *hashVal);
+
+/*
+**   Skein APIs for "extended" initialization: MAC keys, tree hashing.
+**   After an InitExt() call, just use Update/Final calls as with Init().
+**
+**   Notes: Same parameters as _Init() calls, plus treeInfo/key/keyBytes.
+**          When keyBytes == 0 and treeInfo == SKEIN_SEQUENTIAL,
+**              the results of InitExt() are identical to calling Init().
+**          The function Init() may be called once to "precompute" the IV for
+**              a given hashBitLen value, then by saving a copy of the context
+**              the IV computation may be avoided in later calls.
+**          Similarly, the function InitExt() may be called once per MAC key
+**              to precompute the MAC IV, then a copy of the context saved and
+**              reused for each new MAC computation.
+**/
+int  Skein_256_InitExt(struct skein_256_ctx *ctx, size_t hashBitLen,
+                       u64 treeInfo, const u8 *key, size_t keyBytes);
+int  Skein_512_InitExt(struct skein_512_ctx *ctx, size_t hashBitLen,
+                       u64 treeInfo, const u8 *key, size_t keyBytes);
+int  Skein1024_InitExt(struct skein1024_ctx *ctx, size_t hashBitLen,
+                       u64 treeInfo, const u8 *key, size_t keyBytes);
+
+/*
+**   Skein APIs for MAC and tree hash:
+**      Final_Pad:  pad, do final block, but no OUTPUT type
+**      Output:     do just the output stage
+*/
+int  Skein_256_Final_Pad(struct skein_256_ctx *ctx, u8 *hashVal);
+int  Skein_512_Final_Pad(struct skein_512_ctx *ctx, u8 *hashVal);
+int  Skein1024_Final_Pad(struct skein1024_ctx *ctx, u8 *hashVal);
+
+#ifndef SKEIN_TREE_HASH
+#define SKEIN_TREE_HASH (1)
+#endif
+#if  SKEIN_TREE_HASH
+int  Skein_256_Output(struct skein_256_ctx *ctx, u8 *hashVal);
+int  Skein_512_Output(struct skein_512_ctx *ctx, u8 *hashVal);
+int  Skein1024_Output(struct skein1024_ctx *ctx, u8 *hashVal);
+#endif
+
+/*****************************************************************
+** "Internal" Skein definitions
+**    -- not needed for sequential hashing API, but will be
+**           helpful for other uses of Skein (e.g., tree hash mode).
+**    -- included here so that they can be shared between
+**           reference and optimized code.
+******************************************************************/
+
+/* tweak word T[1]: bit field starting positions */
+#define SKEIN_T1_BIT(BIT)       ((BIT) - 64)      /* second word  */
+
+#define SKEIN_T1_POS_TREE_LVL   SKEIN_T1_BIT(112) /* 112..118 hash tree level */
+#define SKEIN_T1_POS_BIT_PAD    SKEIN_T1_BIT(119) /* 119 part. final in byte */
+#define SKEIN_T1_POS_BLK_TYPE   SKEIN_T1_BIT(120) /* 120..125 type field `*/
+#define SKEIN_T1_POS_FIRST      SKEIN_T1_BIT(126) /* 126      first blk flag */
+#define SKEIN_T1_POS_FINAL      SKEIN_T1_BIT(127) /* 127      final blk flag */
+
+/* tweak word T[1]: flag bit definition(s) */
+#define SKEIN_T1_FLAG_FIRST     (((u64)  1) << SKEIN_T1_POS_FIRST)
+#define SKEIN_T1_FLAG_FINAL     (((u64)  1) << SKEIN_T1_POS_FINAL)
+#define SKEIN_T1_FLAG_BIT_PAD   (((u64)  1) << SKEIN_T1_POS_BIT_PAD)
+
+/* tweak word T[1]: tree level bit field mask */
+#define SKEIN_T1_TREE_LVL_MASK  (((u64)0x7F) << SKEIN_T1_POS_TREE_LVL)
+#define SKEIN_T1_TREE_LEVEL(n)  (((u64) (n)) << SKEIN_T1_POS_TREE_LVL)
+
+/* tweak word T[1]: block type field */
+#define SKEIN_BLK_TYPE_KEY       (0) /* key, for MAC and KDF */
+#define SKEIN_BLK_TYPE_CFG       (4) /* configuration block */
+#define SKEIN_BLK_TYPE_PERS      (8) /* personalization string */
+#define SKEIN_BLK_TYPE_PK       (12) /* pubkey (for digital sigs) */
+#define SKEIN_BLK_TYPE_KDF      (16) /* key identifier for KDF */
+#define SKEIN_BLK_TYPE_NONCE    (20) /* nonce for PRNG */
+#define SKEIN_BLK_TYPE_MSG      (48) /* message processing */
+#define SKEIN_BLK_TYPE_OUT      (63) /* output stage */
+#define SKEIN_BLK_TYPE_MASK     (63) /* bit field mask */
+
+#define SKEIN_T1_BLK_TYPE(T)   (((u64) (SKEIN_BLK_TYPE_##T)) << \
+                                       SKEIN_T1_POS_BLK_TYPE)
+#define SKEIN_T1_BLK_TYPE_KEY   SKEIN_T1_BLK_TYPE(KEY)  /* for MAC and KDF */
+#define SKEIN_T1_BLK_TYPE_CFG   SKEIN_T1_BLK_TYPE(CFG)  /* config block */
+#define SKEIN_T1_BLK_TYPE_PERS  SKEIN_T1_BLK_TYPE(PERS) /* personalization */
+#define SKEIN_T1_BLK_TYPE_PK    SKEIN_T1_BLK_TYPE(PK)   /* pubkey (for sigs) */
+#define SKEIN_T1_BLK_TYPE_KDF   SKEIN_T1_BLK_TYPE(KDF)  /* key ident for KDF */
+#define SKEIN_T1_BLK_TYPE_NONCE SKEIN_T1_BLK_TYPE(NONCE)/* nonce for PRNG */
+#define SKEIN_T1_BLK_TYPE_MSG   SKEIN_T1_BLK_TYPE(MSG)  /* message processing */
+#define SKEIN_T1_BLK_TYPE_OUT   SKEIN_T1_BLK_TYPE(OUT)  /* output stage */
+#define SKEIN_T1_BLK_TYPE_MASK  SKEIN_T1_BLK_TYPE(MASK) /* field bit mask */
+
+#define SKEIN_T1_BLK_TYPE_CFG_FINAL    (SKEIN_T1_BLK_TYPE_CFG | \
+                                       SKEIN_T1_FLAG_FINAL)
+#define SKEIN_T1_BLK_TYPE_OUT_FINAL    (SKEIN_T1_BLK_TYPE_OUT | \
+                                       SKEIN_T1_FLAG_FINAL)
+
+#define SKEIN_VERSION           (1)
+
+#ifndef SKEIN_ID_STRING_LE      /* allow compile-time personalization */
+#define SKEIN_ID_STRING_LE      (0x33414853) /* "SHA3" (little-endian)*/
+#endif
+
+#define SKEIN_MK_64(hi32, lo32)  ((lo32) + (((u64) (hi32)) << 32))
+#define SKEIN_SCHEMA_VER        SKEIN_MK_64(SKEIN_VERSION, SKEIN_ID_STRING_LE)
+#define SKEIN_KS_PARITY         SKEIN_MK_64(0x1BD11BDA, 0xA9FC1A22)
+
+#define SKEIN_CFG_STR_LEN       (4*8)
+
+/* bit field definitions in config block treeInfo word */
+#define SKEIN_CFG_TREE_LEAF_SIZE_POS  (0)
+#define SKEIN_CFG_TREE_NODE_SIZE_POS  (8)
+#define SKEIN_CFG_TREE_MAX_LEVEL_POS  (16)
+
+#define SKEIN_CFG_TREE_LEAF_SIZE_MSK (((u64)0xFF) << \
+                                       SKEIN_CFG_TREE_LEAF_SIZE_POS)
+#define SKEIN_CFG_TREE_NODE_SIZE_MSK (((u64)0xFF) << \
+                                       SKEIN_CFG_TREE_NODE_SIZE_POS)
+#define SKEIN_CFG_TREE_MAX_LEVEL_MSK (((u64)0xFF) << \
+                                       SKEIN_CFG_TREE_MAX_LEVEL_POS)
+
+#define SKEIN_CFG_TREE_INFO(leaf, node, maxLvl)                   \
+       ((((u64)(leaf))   << SKEIN_CFG_TREE_LEAF_SIZE_POS) |    \
+        (((u64)(node))   << SKEIN_CFG_TREE_NODE_SIZE_POS) |    \
+        (((u64)(maxLvl)) << SKEIN_CFG_TREE_MAX_LEVEL_POS))
+
+/* use as treeInfo in InitExt() call for sequential processing */
+#define SKEIN_CFG_TREE_INFO_SEQUENTIAL SKEIN_CFG_TREE_INFO(0, 0, 0)
+
+/*
+**   Skein macros for getting/setting tweak words, etc.
+**   These are useful for partial input bytes, hash tree init/update, etc.
+**/
+#define Skein_Get_Tweak(ctxPtr, TWK_NUM)          ((ctxPtr)->h.T[TWK_NUM])
+#define Skein_Set_Tweak(ctxPtr, TWK_NUM, tVal) { \
+               (ctxPtr)->h.T[TWK_NUM] = (tVal); \
+       }
+
+#define Skein_Get_T0(ctxPtr)     Skein_Get_Tweak(ctxPtr, 0)
+#define Skein_Get_T1(ctxPtr)     Skein_Get_Tweak(ctxPtr, 1)
+#define Skein_Set_T0(ctxPtr, T0) Skein_Set_Tweak(ctxPtr, 0, T0)
+#define Skein_Set_T1(ctxPtr, T1) Skein_Set_Tweak(ctxPtr, 1, T1)
+
+/* set both tweak words at once */
+#define Skein_Set_T0_T1(ctxPtr, T0, T1)           \
+       {                                           \
+       Skein_Set_T0(ctxPtr, (T0));                  \
+       Skein_Set_T1(ctxPtr, (T1));                  \
+       }
+
+#define Skein_Set_Type(ctxPtr, BLK_TYPE)         \
+       Skein_Set_T1(ctxPtr, SKEIN_T1_BLK_TYPE_##BLK_TYPE)
+
+/*
+ * setup for starting with a new type:
+ * h.T[0]=0; h.T[1] = NEW_TYPE; h.bCnt=0;
+ */
+#define Skein_Start_New_Type(ctxPtr, BLK_TYPE) { \
+               Skein_Set_T0_T1(ctxPtr, 0, SKEIN_T1_FLAG_FIRST | \
+                               SKEIN_T1_BLK_TYPE_##BLK_TYPE); \
+               (ctxPtr)->h.bCnt = 0; \
+       }
+
+#define Skein_Clear_First_Flag(hdr) { \
+               (hdr).T[1] &= ~SKEIN_T1_FLAG_FIRST; \
+       }
+#define Skein_Set_Bit_Pad_Flag(hdr) { \
+               (hdr).T[1] |=  SKEIN_T1_FLAG_BIT_PAD; \
+       }
+
+#define Skein_Set_Tree_Level(hdr, height) { \
+               (hdr).T[1] |= SKEIN_T1_TREE_LEVEL(height); \
+       }
+
+/*****************************************************************
+** "Internal" Skein definitions for debugging and error checking
+******************************************************************/
+#ifdef SKEIN_DEBUG             /* examine/display intermediate values? */
+#include "skein_debug.h"
+#else                           /* default is no callouts */
+#define Skein_Show_Block(bits, ctx, X, blkPtr, wPtr, ksEvenPtr, ksOddPtr)
+#define Skein_Show_Round(bits, ctx, r, X)
+#define Skein_Show_R_Ptr(bits, ctx, r, X_ptr)
+#define Skein_Show_Final(bits, ctx, cnt, outPtr)
+#define Skein_Show_Key(bits, ctx, key, keyBytes)
+#endif
+
+#define Skein_Assert(x, retCode)/* ignore all Asserts, for performance */
+#define Skein_assert(x)
+
+/*****************************************************************
+** Skein block function constants (shared across Ref and Opt code)
+******************************************************************/
+enum {
+           /* Skein_256 round rotation constants */
+       R_256_0_0 = 14, R_256_0_1 = 16,
+       R_256_1_0 = 52, R_256_1_1 = 57,
+       R_256_2_0 = 23, R_256_2_1 = 40,
+       R_256_3_0 =  5, R_256_3_1 = 37,
+       R_256_4_0 = 25, R_256_4_1 = 33,
+       R_256_5_0 = 46, R_256_5_1 = 12,
+       R_256_6_0 = 58, R_256_6_1 = 22,
+       R_256_7_0 = 32, R_256_7_1 = 32,
+
+           /* Skein_512 round rotation constants */
+       R_512_0_0 = 46, R_512_0_1 = 36, R_512_0_2 = 19, R_512_0_3 = 37,
+       R_512_1_0 = 33, R_512_1_1 = 27, R_512_1_2 = 14, R_512_1_3 = 42,
+       R_512_2_0 = 17, R_512_2_1 = 49, R_512_2_2 = 36, R_512_2_3 = 39,
+       R_512_3_0 = 44, R_512_3_1 =  9, R_512_3_2 = 54, R_512_3_3 = 56,
+       R_512_4_0 = 39, R_512_4_1 = 30, R_512_4_2 = 34, R_512_4_3 = 24,
+       R_512_5_0 = 13, R_512_5_1 = 50, R_512_5_2 = 10, R_512_5_3 = 17,
+       R_512_6_0 = 25, R_512_6_1 = 29, R_512_6_2 = 39, R_512_6_3 = 43,
+       R_512_7_0 =  8, R_512_7_1 = 35, R_512_7_2 = 56, R_512_7_3 = 22,
+
+           /* Skein1024 round rotation constants */
+       R1024_0_0 = 24, R1024_0_1 = 13, R1024_0_2 =  8, R1024_0_3 = 47,
+       R1024_0_4 =  8, R1024_0_5 = 17, R1024_0_6 = 22, R1024_0_7 = 37,
+       R1024_1_0 = 38, R1024_1_1 = 19, R1024_1_2 = 10, R1024_1_3 = 55,
+       R1024_1_4 = 49, R1024_1_5 = 18, R1024_1_6 = 23, R1024_1_7 = 52,
+       R1024_2_0 = 33, R1024_2_1 =  4, R1024_2_2 = 51, R1024_2_3 = 13,
+       R1024_2_4 = 34, R1024_2_5 = 41, R1024_2_6 = 59, R1024_2_7 = 17,
+       R1024_3_0 =  5, R1024_3_1 = 20, R1024_3_2 = 48, R1024_3_3 = 41,
+       R1024_3_4 = 47, R1024_3_5 = 28, R1024_3_6 = 16, R1024_3_7 = 25,
+       R1024_4_0 = 41, R1024_4_1 =  9, R1024_4_2 = 37, R1024_4_3 = 31,
+       R1024_4_4 = 12, R1024_4_5 = 47, R1024_4_6 = 44, R1024_4_7 = 30,
+       R1024_5_0 = 16, R1024_5_1 = 34, R1024_5_2 = 56, R1024_5_3 = 51,
+       R1024_5_4 =  4, R1024_5_5 = 53, R1024_5_6 = 42, R1024_5_7 = 41,
+       R1024_6_0 = 31, R1024_6_1 = 44, R1024_6_2 = 47, R1024_6_3 = 46,
+       R1024_6_4 = 19, R1024_6_5 = 42, R1024_6_6 = 44, R1024_6_7 = 25,
+       R1024_7_0 =  9, R1024_7_1 = 48, R1024_7_2 = 35, R1024_7_3 = 52,
+       R1024_7_4 = 23, R1024_7_5 = 31, R1024_7_6 = 37, R1024_7_7 = 20
+};
+
+#ifndef SKEIN_ROUNDS
+#define SKEIN_256_ROUNDS_TOTAL (72)    /* # rounds for diff block sizes */
+#define SKEIN_512_ROUNDS_TOTAL (72)
+#define SKEIN1024_ROUNDS_TOTAL (80)
+#else                  /* allow command-line define in range 8*(5..14)   */
+#define SKEIN_256_ROUNDS_TOTAL (8*((((SKEIN_ROUNDS/100) + 5) % 10) + 5))
+#define SKEIN_512_ROUNDS_TOTAL (8*((((SKEIN_ROUNDS/10)  + 5) % 10) + 5))
+#define SKEIN1024_ROUNDS_TOTAL (8*((((SKEIN_ROUNDS)     + 5) % 10) + 5))
+#endif
+
+#endif  /* ifndef _SKEIN_H_ */
diff --git a/drivers/staging/skein/include/skeinApi.h b/drivers/staging/skein/include/skeinApi.h
new file mode 100644 (file)
index 0000000..ace931a
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+Copyright (c) 2010 Werner Dittmann
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef SKEINAPI_H
+#define SKEINAPI_H
+
+/**
+ * @file skeinApi.h
+ * @brief A Skein API and its functions.
+ * @{
+ *
+ * This API and the functions that implement this API simplify the usage
+ * of Skein. The design and the way to use the functions follow the openSSL
+ * design but at the same time take care of some Skein specific behaviour
+ * and possibilities.
+ *
+ * The functions enable applications to create a normal Skein hashes and
+ * message authentication codes (MAC).
+ *
+ * Using these functions is simple and straight forward:
+ *
+ * @code
+ *
+ * #include <skeinApi.h>
+ *
+ * ...
+ * struct skein_ctx ctx;             // a Skein hash or MAC context
+ *
+ * // prepare context, here for a Skein with a state size of 512 bits.
+ * skeinCtxPrepare(&ctx, Skein512);
+ *
+ * // Initialize the context to set the requested hash length in bits
+ * // here request a output hash size of 31 bits (Skein supports variable
+ * // output sizes even very strange sizes)
+ * skeinInit(&ctx, 31);
+ *
+ * // Now update Skein with any number of message bits. A function that
+ * // takes a number of bytes is also available.
+ * skeinUpdateBits(&ctx, message, msgLength);
+ *
+ * // Now get the result of the Skein hash. The output buffer must be
+ * // large enough to hold the request number of output bits. The application
+ * // may now extract the bits.
+ * skeinFinal(&ctx, result);
+ * ...
+ * @endcode
+ *
+ * An application may use @c skeinReset to reset a Skein context and use
+ * it for creation of another hash with the same Skein state size and output
+ * bit length. In this case the API implementation restores some internal
+ * internal state data and saves a full Skein initialization round.
+ *
+ * To create a MAC the application just uses @c skeinMacInit instead of
+ * @c skeinInit. All other functions calls remain the same.
+ *
+ */
+
+#include <linux/types.h>
+#include <skein.h>
+
+/**
+ * Which Skein size to use
+ */
+enum skein_size {
+       Skein256 = 256,     /*!< Skein with 256 bit state */
+       Skein512 = 512,     /*!< Skein with 512 bit state */
+       Skein1024 = 1024    /*!< Skein with 1024 bit state */
+};
+
+/**
+ * Context for Skein.
+ *
+ * This structure was setup with some know-how of the internal
+ * Skein structures, in particular ordering of header and size dependent
+ * variables. If Skein implementation changes this, then adapt these
+ * structures as well.
+ */
+struct skein_ctx {
+       u64 skeinSize;
+       u64  XSave[SKEIN_MAX_STATE_WORDS];   /* save area for state variables */
+       union {
+               struct skein_ctx_hdr h;
+               struct skein_256_ctx s256;
+               struct skein_512_ctx s512;
+               struct skein1024_ctx s1024;
+       } m;
+};
+
+/**
+ * Prepare a Skein context.
+ *
+ * An application must call this function before it can use the Skein
+ * context. The functions clears memory and initializes size dependent
+ * variables.
+ *
+ * @param ctx
+ *     Pointer to a Skein context.
+ * @param size
+ *     Which Skein size to use.
+ * @return
+ *     SKEIN_SUCESS of SKEIN_FAIL
+ */
+int skeinCtxPrepare(struct skein_ctx *ctx, enum skein_size size);
+
+/**
+ * Initialize a Skein context.
+ *
+ * Initializes the context with this data and saves the resulting Skein
+ * state variables for further use.
+ *
+ * @param ctx
+ *     Pointer to a Skein context.
+ * @param hashBitLen
+ *     Number of MAC hash bits to compute
+ * @return
+ *     SKEIN_SUCESS of SKEIN_FAIL
+ * @see skeinReset
+ */
+int skeinInit(struct skein_ctx *ctx, size_t hashBitLen);
+
+/**
+ * Resets a Skein context for further use.
+ *
+ * Restores the saved chaining variables to reset the Skein context.
+ * Thus applications can reuse the same setup to  process several
+ * messages. This saves a complete Skein initialization cycle.
+ *
+ * @param ctx
+ *     Pointer to a pre-initialized Skein MAC context
+ */
+void skeinReset(struct skein_ctx *ctx);
+
+/**
+ * Initializes a Skein context for MAC usage.
+ *
+ * Initializes the context with this data and saves the resulting Skein
+ * state variables for further use.
+ *
+ * Applications call the normal Skein functions to update the MAC and
+ * get the final result.
+ *
+ * @param ctx
+ *     Pointer to an empty or preinitialized Skein MAC context
+ * @param key
+ *     Pointer to key bytes or NULL
+ * @param keyLen
+ *     Length of the key in bytes or zero
+ * @param hashBitLen
+ *     Number of MAC hash bits to compute
+ * @return
+ *     SKEIN_SUCESS of SKEIN_FAIL
+ */
+int skeinMacInit(struct skein_ctx *ctx, const u8 *key, size_t keyLen,
+                size_t hashBitLen);
+
+/**
+ * Update Skein with the next part of the message.
+ *
+ * @param ctx
+ *     Pointer to initialized Skein context
+ * @param msg
+ *     Pointer to the message.
+ * @param msgByteCnt
+ *     Length of the message in @b bytes
+ * @return
+ *     Success or error code.
+ */
+int skeinUpdate(struct skein_ctx *ctx, const u8 *msg,
+               size_t msgByteCnt);
+
+/**
+ * Update the hash with a message bit string.
+ *
+ * Skein can handle data not only as bytes but also as bit strings of
+ * arbitrary length (up to its maximum design size).
+ *
+ * @param ctx
+ *     Pointer to initialized Skein context
+ * @param msg
+ *     Pointer to the message.
+ * @param msgBitCnt
+ *     Length of the message in @b bits.
+ */
+int skeinUpdateBits(struct skein_ctx *ctx, const u8 *msg,
+                   size_t msgBitCnt);
+
+/**
+ * Finalize Skein and return the hash.
+ *
+ * Before an application can reuse a Skein setup the application must
+ * reset the Skein context.
+ *
+ * @param ctx
+ *     Pointer to initialized Skein context
+ * @param hash
+ *     Pointer to buffer that receives the hash. The buffer must be large
+ *     enough to store @c hashBitLen bits.
+ * @return
+ *     Success or error code.
+ * @see skeinReset
+ */
+int skeinFinal(struct skein_ctx *ctx, u8 *hash);
+
+/**
+ * @}
+ */
+#endif
diff --git a/drivers/staging/skein/include/skein_block.h b/drivers/staging/skein/include/skein_block.h
new file mode 100644 (file)
index 0000000..b15c079
--- /dev/null
@@ -0,0 +1,22 @@
+/***********************************************************************
+**
+** Implementation of the Skein hash function.
+**
+** Source code author: Doug Whiting, 2008.
+**
+** This algorithm and source code is released to the public domain.
+**
+************************************************************************/
+#ifndef _SKEIN_BLOCK_H_
+#define _SKEIN_BLOCK_H_
+
+#include <skein.h> /* get the Skein API definitions   */
+
+void Skein_256_Process_Block(struct skein_256_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd);
+void Skein_512_Process_Block(struct skein_512_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd);
+void Skein1024_Process_Block(struct skein1024_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd);
+
+#endif
diff --git a/drivers/staging/skein/include/skein_iv.h b/drivers/staging/skein/include/skein_iv.h
new file mode 100644 (file)
index 0000000..8dd5e4d
--- /dev/null
@@ -0,0 +1,186 @@
+#ifndef _SKEIN_IV_H_
+#define _SKEIN_IV_H_
+
+#include <skein.h>    /* get Skein macros and types */
+
+/*
+***************** Pre-computed Skein IVs *******************
+**
+** NOTE: these values are not "magic" constants, but
+** are generated using the Threefish block function.
+** They are pre-computed here only for speed; i.e., to
+** avoid the need for a Threefish call during Init().
+**
+** The IV for any fixed hash length may be pre-computed.
+** Only the most common values are included here.
+**
+************************************************************
+**/
+
+#define MK_64 SKEIN_MK_64
+
+/* blkSize =  256 bits. hashSize =  128 bits */
+const u64 SKEIN_256_IV_128[] = {
+       MK_64(0xE1111906, 0x964D7260),
+       MK_64(0x883DAAA7, 0x7C8D811C),
+       MK_64(0x10080DF4, 0x91960F7A),
+       MK_64(0xCCF7DDE5, 0xB45BC1C2)
+};
+
+/* blkSize =  256 bits. hashSize =  160 bits */
+const u64 SKEIN_256_IV_160[] = {
+       MK_64(0x14202314, 0x72825E98),
+       MK_64(0x2AC4E9A2, 0x5A77E590),
+       MK_64(0xD47A5856, 0x8838D63E),
+       MK_64(0x2DD2E496, 0x8586AB7D)
+};
+
+/* blkSize =  256 bits. hashSize =  224 bits */
+const u64 SKEIN_256_IV_224[] = {
+       MK_64(0xC6098A8C, 0x9AE5EA0B),
+       MK_64(0x876D5686, 0x08C5191C),
+       MK_64(0x99CB88D7, 0xD7F53884),
+       MK_64(0x384BDDB1, 0xAEDDB5DE)
+};
+
+/* blkSize =  256 bits. hashSize =  256 bits */
+const u64 SKEIN_256_IV_256[] = {
+       MK_64(0xFC9DA860, 0xD048B449),
+       MK_64(0x2FCA6647, 0x9FA7D833),
+       MK_64(0xB33BC389, 0x6656840F),
+       MK_64(0x6A54E920, 0xFDE8DA69)
+};
+
+/* blkSize =  512 bits. hashSize =  128 bits */
+const u64 SKEIN_512_IV_128[] = {
+       MK_64(0xA8BC7BF3, 0x6FBF9F52),
+       MK_64(0x1E9872CE, 0xBD1AF0AA),
+       MK_64(0x309B1790, 0xB32190D3),
+       MK_64(0xBCFBB854, 0x3F94805C),
+       MK_64(0x0DA61BCD, 0x6E31B11B),
+       MK_64(0x1A18EBEA, 0xD46A32E3),
+       MK_64(0xA2CC5B18, 0xCE84AA82),
+       MK_64(0x6982AB28, 0x9D46982D)
+};
+
+/* blkSize =  512 bits. hashSize =  160 bits */
+const u64 SKEIN_512_IV_160[] = {
+       MK_64(0x28B81A2A, 0xE013BD91),
+       MK_64(0xC2F11668, 0xB5BDF78F),
+       MK_64(0x1760D8F3, 0xF6A56F12),
+       MK_64(0x4FB74758, 0x8239904F),
+       MK_64(0x21EDE07F, 0x7EAF5056),
+       MK_64(0xD908922E, 0x63ED70B8),
+       MK_64(0xB8EC76FF, 0xECCB52FA),
+       MK_64(0x01A47BB8, 0xA3F27A6E)
+};
+
+/* blkSize =  512 bits. hashSize =  224 bits */
+const u64 SKEIN_512_IV_224[] = {
+       MK_64(0xCCD06162, 0x48677224),
+       MK_64(0xCBA65CF3, 0xA92339EF),
+       MK_64(0x8CCD69D6, 0x52FF4B64),
+       MK_64(0x398AED7B, 0x3AB890B4),
+       MK_64(0x0F59D1B1, 0x457D2BD0),
+       MK_64(0x6776FE65, 0x75D4EB3D),
+       MK_64(0x99FBC70E, 0x997413E9),
+       MK_64(0x9E2CFCCF, 0xE1C41EF7)
+};
+
+/* blkSize =  512 bits. hashSize =  256 bits */
+const u64 SKEIN_512_IV_256[] = {
+       MK_64(0xCCD044A1, 0x2FDB3E13),
+       MK_64(0xE8359030, 0x1A79A9EB),
+       MK_64(0x55AEA061, 0x4F816E6F),
+       MK_64(0x2A2767A4, 0xAE9B94DB),
+       MK_64(0xEC06025E, 0x74DD7683),
+       MK_64(0xE7A436CD, 0xC4746251),
+       MK_64(0xC36FBAF9, 0x393AD185),
+       MK_64(0x3EEDBA18, 0x33EDFC13)
+};
+
+/* blkSize =  512 bits. hashSize =  384 bits */
+const u64 SKEIN_512_IV_384[] = {
+       MK_64(0xA3F6C6BF, 0x3A75EF5F),
+       MK_64(0xB0FEF9CC, 0xFD84FAA4),
+       MK_64(0x9D77DD66, 0x3D770CFE),
+       MK_64(0xD798CBF3, 0xB468FDDA),
+       MK_64(0x1BC4A666, 0x8A0E4465),
+       MK_64(0x7ED7D434, 0xE5807407),
+       MK_64(0x548FC1AC, 0xD4EC44D6),
+       MK_64(0x266E1754, 0x6AA18FF8)
+};
+
+/* blkSize =  512 bits. hashSize =  512 bits */
+const u64 SKEIN_512_IV_512[] = {
+       MK_64(0x4903ADFF, 0x749C51CE),
+       MK_64(0x0D95DE39, 0x9746DF03),
+       MK_64(0x8FD19341, 0x27C79BCE),
+       MK_64(0x9A255629, 0xFF352CB1),
+       MK_64(0x5DB62599, 0xDF6CA7B0),
+       MK_64(0xEABE394C, 0xA9D5C3F4),
+       MK_64(0x991112C7, 0x1A75B523),
+       MK_64(0xAE18A40B, 0x660FCC33)
+};
+
+/* blkSize = 1024 bits. hashSize =  384 bits */
+const u64 SKEIN1024_IV_384[] = {
+       MK_64(0x5102B6B8, 0xC1894A35),
+       MK_64(0xFEEBC9E3, 0xFE8AF11A),
+       MK_64(0x0C807F06, 0xE32BED71),
+       MK_64(0x60C13A52, 0xB41A91F6),
+       MK_64(0x9716D35D, 0xD4917C38),
+       MK_64(0xE780DF12, 0x6FD31D3A),
+       MK_64(0x797846B6, 0xC898303A),
+       MK_64(0xB172C2A8, 0xB3572A3B),
+       MK_64(0xC9BC8203, 0xA6104A6C),
+       MK_64(0x65909338, 0xD75624F4),
+       MK_64(0x94BCC568, 0x4B3F81A0),
+       MK_64(0x3EBBF51E, 0x10ECFD46),
+       MK_64(0x2DF50F0B, 0xEEB08542),
+       MK_64(0x3B5A6530, 0x0DBC6516),
+       MK_64(0x484B9CD2, 0x167BBCE1),
+       MK_64(0x2D136947, 0xD4CBAFEA)
+};
+
+/* blkSize = 1024 bits. hashSize =  512 bits */
+const u64 SKEIN1024_IV_512[] = {
+       MK_64(0xCAEC0E5D, 0x7C1B1B18),
+       MK_64(0xA01B0E04, 0x5F03E802),
+       MK_64(0x33840451, 0xED912885),
+       MK_64(0x374AFB04, 0xEAEC2E1C),
+       MK_64(0xDF25A0E2, 0x813581F7),
+       MK_64(0xE4004093, 0x8B12F9D2),
+       MK_64(0xA662D539, 0xC2ED39B6),
+       MK_64(0xFA8B85CF, 0x45D8C75A),
+       MK_64(0x8316ED8E, 0x29EDE796),
+       MK_64(0x053289C0, 0x2E9F91B8),
+       MK_64(0xC3F8EF1D, 0x6D518B73),
+       MK_64(0xBDCEC3C4, 0xD5EF332E),
+       MK_64(0x549A7E52, 0x22974487),
+       MK_64(0x67070872, 0x5B749816),
+       MK_64(0xB9CD28FB, 0xF0581BD1),
+       MK_64(0x0E2940B8, 0x15804974)
+};
+
+/* blkSize = 1024 bits. hashSize = 1024 bits */
+const u64 SKEIN1024_IV_1024[] = {
+       MK_64(0xD593DA07, 0x41E72355),
+       MK_64(0x15B5E511, 0xAC73E00C),
+       MK_64(0x5180E5AE, 0xBAF2C4F0),
+       MK_64(0x03BD41D3, 0xFCBCAFAF),
+       MK_64(0x1CAEC6FD, 0x1983A898),
+       MK_64(0x6E510B8B, 0xCDD0589F),
+       MK_64(0x77E2BDFD, 0xC6394ADA),
+       MK_64(0xC11E1DB5, 0x24DCB0A3),
+       MK_64(0xD6D14AF9, 0xC6329AB5),
+       MK_64(0x6A9B0BFC, 0x6EB67E0D),
+       MK_64(0x9243C60D, 0xCCFF1332),
+       MK_64(0x1A1F1DDE, 0x743F02D4),
+       MK_64(0x0996753C, 0x10ED0BB8),
+       MK_64(0x6572DD22, 0xF2B4969A),
+       MK_64(0x61FD3062, 0xD00A579A),
+       MK_64(0x1DE0536E, 0x8682E539)
+};
+
+#endif /* _SKEIN_IV_H_ */
diff --git a/drivers/staging/skein/include/threefishApi.h b/drivers/staging/skein/include/threefishApi.h
new file mode 100644 (file)
index 0000000..e81675d
--- /dev/null
@@ -0,0 +1,164 @@
+
+#ifndef THREEFISHAPI_H
+#define THREEFISHAPI_H
+
+/**
+ * @file threefishApi.h
+ * @brief A Threefish cipher API and its functions.
+ * @{
+ *
+ * This API and the functions that implement this API simplify the usage
+ * of the Threefish cipher. The design and the way to use the functions
+ * follow the openSSL design but at the same time take care of some Threefish
+ * specific behaviour and possibilities.
+ *
+ * These are the low level functions that deal with Threefisch blocks only.
+ * Implementations for cipher modes such as ECB, CFB, or CBC may use these
+ * functions.
+ *
+@code
+    // Threefish cipher context data
+    struct threefish_key keyCtx;
+
+    // Initialize the context
+    threefishSetKey(&keyCtx, Threefish512, key, tweak);
+
+    // Encrypt
+    threefishEncryptBlockBytes(&keyCtx, input, cipher);
+@endcode
+ */
+
+#include <linux/types.h>
+#include <skein.h>
+
+#define KeyScheduleConst 0x1BD11BDAA9FC1A22L
+
+/**
+ * Which Threefish size to use
+ */
+enum threefish_size {
+       Threefish256 = 256,     /*!< Skein with 256 bit state */
+       Threefish512 = 512,     /*!< Skein with 512 bit state */
+       Threefish1024 = 1024    /*!< Skein with 1024 bit state */
+};
+
+/**
+ * Context for Threefish key and tweak words.
+ *
+ * This structure was setup with some know-how of the internal
+ * Skein structures, in particular ordering of header and size dependent
+ * variables. If Skein implementation changes this, the adapt these
+ * structures as well.
+ */
+struct threefish_key {
+       u64 stateSize;
+       u64 key[SKEIN_MAX_STATE_WORDS+1];   /* max number of key words*/
+       u64 tweak[3];
+};
+
+/**
+ * Set Threefish key and tweak data.
+ *
+ * This function sets the key and tweak data for the Threefish cipher of
+ * the given size. The key data must have the same length (number of bits)
+ * as the state size
+ *
+ * @param keyCtx
+ *     Pointer to a Threefish key structure.
+ * @param size
+ *     Which Skein size to use.
+ * @param keyData
+ *     Pointer to the key words (word has 64 bits).
+ * @param tweak
+ *     Pointer to the two tweak words (word has 64 bits).
+ */
+void threefishSetKey(struct threefish_key *keyCtx,
+                       enum threefish_size stateSize,
+                       u64 *keyData, u64 *tweak);
+
+/**
+ * Encrypt Threefisch block (bytes).
+ *
+ * The buffer must have at least the same length (number of bits) aas the
+ * state size for this key. The function uses the first @c stateSize bits
+ * of the input buffer, encrypts them and stores the result in the output
+ * buffer.
+ *
+ * @param keyCtx
+ *     Pointer to a Threefish key structure.
+ * @param in
+ *     Poionter to plaintext data buffer.
+ * @param out
+ *     Pointer to cipher buffer.
+ */
+void threefishEncryptBlockBytes(struct threefish_key *keyCtx, u8 *in, u8 *out);
+
+/**
+ * Encrypt Threefisch block (words).
+ *
+ * The buffer must have at least the same length (number of bits) aas the
+ * state size for this key. The function uses the first @c stateSize bits
+ * of the input buffer, encrypts them and stores the result in the output
+ * buffer.
+ *
+ * The wordsize ist set to 64 bits.
+ *
+ * @param keyCtx
+ *     Pointer to a Threefish key structure.
+ * @param in
+ *     Poionter to plaintext data buffer.
+ * @param out
+ *     Pointer to cipher buffer.
+ */
+void threefishEncryptBlockWords(struct threefish_key *keyCtx, u64 *in,
+                               u64 *out);
+
+/**
+ * Decrypt Threefisch block (bytes).
+ *
+ * The buffer must have at least the same length (number of bits) aas the
+ * state size for this key. The function uses the first @c stateSize bits
+ * of the input buffer, decrypts them and stores the result in the output
+ * buffer
+ *
+ * @param keyCtx
+ *     Pointer to a Threefish key structure.
+ * @param in
+ *     Poionter to cipher data buffer.
+ * @param out
+ *     Pointer to plaintext buffer.
+ */
+void threefishDecryptBlockBytes(struct threefish_key *keyCtx, u8 *in, u8 *out);
+
+/**
+ * Decrypt Threefisch block (words).
+ *
+ * The buffer must have at least the same length (number of bits) aas the
+ * state size for this key. The function uses the first @c stateSize bits
+ * of the input buffer, encrypts them and stores the result in the output
+ * buffer.
+ *
+ * The wordsize ist set to 64 bits.
+ *
+ * @param keyCtx
+ *     Pointer to a Threefish key structure.
+ * @param in
+ *     Poionter to cipher data buffer.
+ * @param out
+ *     Pointer to plaintext buffer.
+ */
+void threefishDecryptBlockWords(struct threefish_key *keyCtx, u64 *in,
+                               u64 *out);
+
+void threefishEncrypt256(struct threefish_key *keyCtx, u64 *input, u64 *output);
+void threefishEncrypt512(struct threefish_key *keyCtx, u64 *input, u64 *output);
+void threefishEncrypt1024(struct threefish_key *keyCtx, u64 *input,
+                       u64 *output);
+void threefishDecrypt256(struct threefish_key *keyCtx, u64 *input, u64 *output);
+void threefishDecrypt512(struct threefish_key *keyCtx, u64 *input, u64 *output);
+void threefishDecrypt1024(struct threefish_key *keyCtx, u64 *input,
+                       u64 *output);
+/**
+ * @}
+ */
+#endif
diff --git a/drivers/staging/skein/skein.c b/drivers/staging/skein/skein.c
new file mode 100644 (file)
index 0000000..096b86b
--- /dev/null
@@ -0,0 +1,880 @@
+/***********************************************************************
+**
+** Implementation of the Skein hash function.
+**
+** Source code author: Doug Whiting, 2008.
+**
+** This algorithm and source code is released to the public domain.
+**
+************************************************************************/
+
+#define  SKEIN_PORT_CODE /* instantiate any code in skein_port.h */
+
+#include <linux/string.h>       /* get the memcpy/memset functions */
+#include <skein.h> /* get the Skein API definitions   */
+#include <skein_iv.h>    /* get precomputed IVs */
+#include <skein_block.h>
+
+/*****************************************************************/
+/*     256-bit Skein                                             */
+/*****************************************************************/
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* init the context for a straight hashing operation  */
+int Skein_256_Init(struct skein_256_ctx *ctx, size_t hashBitLen)
+{
+       union {
+               u8  b[SKEIN_256_STATE_BYTES];
+               u64  w[SKEIN_256_STATE_WORDS];
+       } cfg;                              /* config block */
+
+       Skein_Assert(hashBitLen > 0, SKEIN_BAD_HASHLEN);
+       ctx->h.hashBitLen = hashBitLen;         /* output hash bit count */
+
+       switch (hashBitLen) { /* use pre-computed values, where available */
+       case  256:
+               memcpy(ctx->X, SKEIN_256_IV_256, sizeof(ctx->X));
+               break;
+       case  224:
+               memcpy(ctx->X, SKEIN_256_IV_224, sizeof(ctx->X));
+               break;
+       case  160:
+               memcpy(ctx->X, SKEIN_256_IV_160, sizeof(ctx->X));
+               break;
+       case  128:
+               memcpy(ctx->X, SKEIN_256_IV_128, sizeof(ctx->X));
+               break;
+       default:
+               /* here if there is no precomputed IV value available */
+               /*
+                * build/process the config block, type == CONFIG (could be
+                * precomputed)
+                */
+               /* set tweaks: T0=0; T1=CFG | FINAL */
+               Skein_Start_New_Type(ctx, CFG_FINAL);
+
+               /* set the schema, version */
+               cfg.w[0] = Skein_Swap64(SKEIN_SCHEMA_VER);
+               /* hash result length in bits */
+               cfg.w[1] = Skein_Swap64(hashBitLen);
+               cfg.w[2] = Skein_Swap64(SKEIN_CFG_TREE_INFO_SEQUENTIAL);
+               /* zero pad config block */
+               memset(&cfg.w[3], 0, sizeof(cfg) - 3*sizeof(cfg.w[0]));
+
+               /* compute the initial chaining values from config block */
+               /* zero the chaining variables */
+               memset(ctx->X, 0, sizeof(ctx->X));
+               Skein_256_Process_Block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
+               break;
+       }
+       /* The chaining vars ctx->X are now initialized for hashBitLen. */
+       /* Set up to process the data message portion of the hash (default) */
+       Skein_Start_New_Type(ctx, MSG);              /* T0=0, T1= MSG type */
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* init the context for a MAC and/or tree hash operation */
+/* [identical to Skein_256_Init() when keyBytes == 0 && \
+ *     treeInfo == SKEIN_CFG_TREE_INFO_SEQUENTIAL] */
+int Skein_256_InitExt(struct skein_256_ctx *ctx, size_t hashBitLen,
+                       u64 treeInfo, const u8 *key, size_t keyBytes)
+{
+       union {
+               u8  b[SKEIN_256_STATE_BYTES];
+               u64  w[SKEIN_256_STATE_WORDS];
+       } cfg; /* config block */
+
+       Skein_Assert(hashBitLen > 0, SKEIN_BAD_HASHLEN);
+       Skein_Assert(keyBytes == 0 || key != NULL, SKEIN_FAIL);
+
+       /* compute the initial chaining values ctx->X[], based on key */
+       if (keyBytes == 0) { /* is there a key? */
+               /* no key: use all zeroes as key for config block */
+               memset(ctx->X, 0, sizeof(ctx->X));
+       } else { /* here to pre-process a key */
+               Skein_assert(sizeof(cfg.b) >= sizeof(ctx->X));
+               /* do a mini-Init right here */
+               /* set output hash bit count = state size */
+               ctx->h.hashBitLen = 8*sizeof(ctx->X);
+               /* set tweaks: T0 = 0; T1 = KEY type */
+               Skein_Start_New_Type(ctx, KEY);
+               /* zero the initial chaining variables */
+               memset(ctx->X, 0, sizeof(ctx->X));
+               /* hash the key */
+               Skein_256_Update(ctx, key, keyBytes);
+               /* put result into cfg.b[] */
+               Skein_256_Final_Pad(ctx, cfg.b);
+               /* copy over into ctx->X[] */
+               memcpy(ctx->X, cfg.b, sizeof(cfg.b));
+       }
+       /*
+        * build/process the config block, type == CONFIG (could be
+        * precomputed for each key)
+        */
+       /* output hash bit count */
+       ctx->h.hashBitLen = hashBitLen;
+       Skein_Start_New_Type(ctx, CFG_FINAL);
+
+       /* pre-pad cfg.w[] with zeroes */
+       memset(&cfg.w, 0, sizeof(cfg.w));
+       cfg.w[0] = Skein_Swap64(SKEIN_SCHEMA_VER);
+       /* hash result length in bits */
+       cfg.w[1] = Skein_Swap64(hashBitLen);
+       /* tree hash config info (or SKEIN_CFG_TREE_INFO_SEQUENTIAL) */
+       cfg.w[2] = Skein_Swap64(treeInfo);
+
+       Skein_Show_Key(256, &ctx->h, key, keyBytes);
+
+       /* compute the initial chaining values from config block */
+       Skein_256_Process_Block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
+
+       /* The chaining vars ctx->X are now initialized */
+       /* Set up to process the data message portion of the hash (default) */
+       Skein_Start_New_Type(ctx, MSG);
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* process the input bytes */
+int Skein_256_Update(struct skein_256_ctx *ctx, const u8 *msg,
+                       size_t msgByteCnt)
+{
+       size_t n;
+
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN_256_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* process full blocks, if any */
+       if (msgByteCnt + ctx->h.bCnt > SKEIN_256_BLOCK_BYTES) {
+               /* finish up any buffered message data */
+               if (ctx->h.bCnt) {
+                       /* # bytes free in buffer b[] */
+                       n = SKEIN_256_BLOCK_BYTES - ctx->h.bCnt;
+                       if (n) {
+                               /* check on our logic here */
+                               Skein_assert(n < msgByteCnt);
+                               memcpy(&ctx->b[ctx->h.bCnt], msg, n);
+                               msgByteCnt  -= n;
+                               msg         += n;
+                               ctx->h.bCnt += n;
+                       }
+                       Skein_assert(ctx->h.bCnt == SKEIN_256_BLOCK_BYTES);
+                       Skein_256_Process_Block(ctx, ctx->b, 1,
+                                               SKEIN_256_BLOCK_BYTES);
+                       ctx->h.bCnt = 0;
+               }
+               /*
+                * now process any remaining full blocks, directly from input
+                * message data
+                */
+               if (msgByteCnt > SKEIN_256_BLOCK_BYTES) {
+                       /* number of full blocks to process */
+                       n = (msgByteCnt-1) / SKEIN_256_BLOCK_BYTES;
+                       Skein_256_Process_Block(ctx, msg, n,
+                                               SKEIN_256_BLOCK_BYTES);
+                       msgByteCnt -= n * SKEIN_256_BLOCK_BYTES;
+                       msg        += n * SKEIN_256_BLOCK_BYTES;
+               }
+               Skein_assert(ctx->h.bCnt == 0);
+       }
+
+       /* copy any remaining source message data bytes into b[] */
+       if (msgByteCnt) {
+               Skein_assert(msgByteCnt + ctx->h.bCnt <= SKEIN_256_BLOCK_BYTES);
+               memcpy(&ctx->b[ctx->h.bCnt], msg, msgByteCnt);
+               ctx->h.bCnt += msgByteCnt;
+       }
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* finalize the hash computation and output the result */
+int Skein_256_Final(struct skein_256_ctx *ctx, u8 *hashVal)
+{
+       size_t i, n, byteCnt;
+       u64 X[SKEIN_256_STATE_WORDS];
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN_256_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* tag as the final block */
+       ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL;
+       /* zero pad b[] if necessary */
+       if (ctx->h.bCnt < SKEIN_256_BLOCK_BYTES)
+               memset(&ctx->b[ctx->h.bCnt], 0,
+                       SKEIN_256_BLOCK_BYTES - ctx->h.bCnt);
+
+       /* process the final block */
+       Skein_256_Process_Block(ctx, ctx->b, 1, ctx->h.bCnt);
+
+       /* now output the result */
+       /* total number of output bytes */
+       byteCnt = (ctx->h.hashBitLen + 7) >> 3;
+
+       /* run Threefish in "counter mode" to generate output */
+       /* zero out b[], so it can hold the counter */
+       memset(ctx->b, 0, sizeof(ctx->b));
+       /* keep a local copy of counter mode "key" */
+       memcpy(X, ctx->X, sizeof(X));
+       for (i = 0; i*SKEIN_256_BLOCK_BYTES < byteCnt; i++) {
+               /* build the counter block */
+               ((u64 *)ctx->b)[0] = Skein_Swap64((u64) i);
+               Skein_Start_New_Type(ctx, OUT_FINAL);
+               /* run "counter mode" */
+               Skein_256_Process_Block(ctx, ctx->b, 1, sizeof(u64));
+               /* number of output bytes left to go */
+               n = byteCnt - i*SKEIN_256_BLOCK_BYTES;
+               if (n >= SKEIN_256_BLOCK_BYTES)
+                       n  = SKEIN_256_BLOCK_BYTES;
+               /* "output" the ctr mode bytes */
+               Skein_Put64_LSB_First(hashVal+i*SKEIN_256_BLOCK_BYTES, ctx->X,
+                                     n);
+               Skein_Show_Final(256, &ctx->h, n,
+                                hashVal+i*SKEIN_256_BLOCK_BYTES);
+               /* restore the counter mode key for next time */
+               memcpy(ctx->X, X, sizeof(X));
+       }
+       return SKEIN_SUCCESS;
+}
+
+/*****************************************************************/
+/*     512-bit Skein                                             */
+/*****************************************************************/
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* init the context for a straight hashing operation  */
+int Skein_512_Init(struct skein_512_ctx *ctx, size_t hashBitLen)
+{
+       union {
+               u8  b[SKEIN_512_STATE_BYTES];
+               u64  w[SKEIN_512_STATE_WORDS];
+       } cfg;                              /* config block */
+
+       Skein_Assert(hashBitLen > 0, SKEIN_BAD_HASHLEN);
+       ctx->h.hashBitLen = hashBitLen;         /* output hash bit count */
+
+       switch (hashBitLen) { /* use pre-computed values, where available */
+       case  512:
+               memcpy(ctx->X, SKEIN_512_IV_512, sizeof(ctx->X));
+               break;
+       case  384:
+               memcpy(ctx->X, SKEIN_512_IV_384, sizeof(ctx->X));
+               break;
+       case  256:
+               memcpy(ctx->X, SKEIN_512_IV_256, sizeof(ctx->X));
+               break;
+       case  224:
+               memcpy(ctx->X, SKEIN_512_IV_224, sizeof(ctx->X));
+               break;
+       default:
+               /* here if there is no precomputed IV value available */
+               /*
+                * build/process the config block, type == CONFIG (could be
+                * precomputed)
+                */
+               /* set tweaks: T0=0; T1=CFG | FINAL */
+               Skein_Start_New_Type(ctx, CFG_FINAL);
+
+               /* set the schema, version */
+               cfg.w[0] = Skein_Swap64(SKEIN_SCHEMA_VER);
+               /* hash result length in bits */
+               cfg.w[1] = Skein_Swap64(hashBitLen);
+               cfg.w[2] = Skein_Swap64(SKEIN_CFG_TREE_INFO_SEQUENTIAL);
+               /* zero pad config block */
+               memset(&cfg.w[3], 0, sizeof(cfg) - 3*sizeof(cfg.w[0]));
+
+               /* compute the initial chaining values from config block */
+               /* zero the chaining variables */
+               memset(ctx->X, 0, sizeof(ctx->X));
+               Skein_512_Process_Block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
+               break;
+       }
+
+       /*
+        * The chaining vars ctx->X are now initialized for the given
+        * hashBitLen.
+        */
+       /* Set up to process the data message portion of the hash (default) */
+       Skein_Start_New_Type(ctx, MSG);              /* T0=0, T1= MSG type */
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* init the context for a MAC and/or tree hash operation */
+/* [identical to Skein_512_Init() when keyBytes == 0 && \
+ *     treeInfo == SKEIN_CFG_TREE_INFO_SEQUENTIAL] */
+int Skein_512_InitExt(struct skein_512_ctx *ctx, size_t hashBitLen,
+                       u64 treeInfo, const u8 *key, size_t keyBytes)
+{
+       union {
+               u8  b[SKEIN_512_STATE_BYTES];
+               u64  w[SKEIN_512_STATE_WORDS];
+       } cfg;                              /* config block */
+
+       Skein_Assert(hashBitLen > 0, SKEIN_BAD_HASHLEN);
+       Skein_Assert(keyBytes == 0 || key != NULL, SKEIN_FAIL);
+
+       /* compute the initial chaining values ctx->X[], based on key */
+       if (keyBytes == 0) { /* is there a key? */
+               /* no key: use all zeroes as key for config block */
+               memset(ctx->X, 0, sizeof(ctx->X));
+       } else { /* here to pre-process a key */
+               Skein_assert(sizeof(cfg.b) >= sizeof(ctx->X));
+               /* do a mini-Init right here */
+               /* set output hash bit count = state size */
+               ctx->h.hashBitLen = 8*sizeof(ctx->X);
+               /* set tweaks: T0 = 0; T1 = KEY type */
+               Skein_Start_New_Type(ctx, KEY);
+               /* zero the initial chaining variables */
+               memset(ctx->X, 0, sizeof(ctx->X));
+               /* hash the key */
+               Skein_512_Update(ctx, key, keyBytes);
+               /* put result into cfg.b[] */
+               Skein_512_Final_Pad(ctx, cfg.b);
+               /* copy over into ctx->X[] */
+               memcpy(ctx->X, cfg.b, sizeof(cfg.b));
+       }
+       /*
+        * build/process the config block, type == CONFIG (could be
+        * precomputed for each key)
+        */
+       ctx->h.hashBitLen = hashBitLen;             /* output hash bit count */
+       Skein_Start_New_Type(ctx, CFG_FINAL);
+
+       /* pre-pad cfg.w[] with zeroes */
+       memset(&cfg.w, 0, sizeof(cfg.w));
+       cfg.w[0] = Skein_Swap64(SKEIN_SCHEMA_VER);
+       /* hash result length in bits */
+       cfg.w[1] = Skein_Swap64(hashBitLen);
+       /* tree hash config info (or SKEIN_CFG_TREE_INFO_SEQUENTIAL) */
+       cfg.w[2] = Skein_Swap64(treeInfo);
+
+       Skein_Show_Key(512, &ctx->h, key, keyBytes);
+
+       /* compute the initial chaining values from config block */
+       Skein_512_Process_Block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
+
+       /* The chaining vars ctx->X are now initialized */
+       /* Set up to process the data message portion of the hash (default) */
+       Skein_Start_New_Type(ctx, MSG);
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* process the input bytes */
+int Skein_512_Update(struct skein_512_ctx *ctx, const u8 *msg,
+                       size_t msgByteCnt)
+{
+       size_t n;
+
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN_512_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* process full blocks, if any */
+       if (msgByteCnt + ctx->h.bCnt > SKEIN_512_BLOCK_BYTES) {
+               /* finish up any buffered message data */
+               if (ctx->h.bCnt) {
+                       /* # bytes free in buffer b[] */
+                       n = SKEIN_512_BLOCK_BYTES - ctx->h.bCnt;
+                       if (n) {
+                               /* check on our logic here */
+                               Skein_assert(n < msgByteCnt);
+                               memcpy(&ctx->b[ctx->h.bCnt], msg, n);
+                               msgByteCnt  -= n;
+                               msg         += n;
+                               ctx->h.bCnt += n;
+                       }
+                       Skein_assert(ctx->h.bCnt == SKEIN_512_BLOCK_BYTES);
+                       Skein_512_Process_Block(ctx, ctx->b, 1,
+                                               SKEIN_512_BLOCK_BYTES);
+                       ctx->h.bCnt = 0;
+               }
+               /*
+                * now process any remaining full blocks, directly from input
+                * message data
+                */
+               if (msgByteCnt > SKEIN_512_BLOCK_BYTES) {
+                       /* number of full blocks to process */
+                       n = (msgByteCnt-1) / SKEIN_512_BLOCK_BYTES;
+                       Skein_512_Process_Block(ctx, msg, n,
+                                               SKEIN_512_BLOCK_BYTES);
+                       msgByteCnt -= n * SKEIN_512_BLOCK_BYTES;
+                       msg        += n * SKEIN_512_BLOCK_BYTES;
+               }
+               Skein_assert(ctx->h.bCnt == 0);
+       }
+
+       /* copy any remaining source message data bytes into b[] */
+       if (msgByteCnt) {
+               Skein_assert(msgByteCnt + ctx->h.bCnt <= SKEIN_512_BLOCK_BYTES);
+               memcpy(&ctx->b[ctx->h.bCnt], msg, msgByteCnt);
+               ctx->h.bCnt += msgByteCnt;
+       }
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* finalize the hash computation and output the result */
+int Skein_512_Final(struct skein_512_ctx *ctx, u8 *hashVal)
+{
+       size_t i, n, byteCnt;
+       u64 X[SKEIN_512_STATE_WORDS];
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN_512_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* tag as the final block */
+       ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL;
+       /* zero pad b[] if necessary */
+       if (ctx->h.bCnt < SKEIN_512_BLOCK_BYTES)
+               memset(&ctx->b[ctx->h.bCnt], 0,
+                       SKEIN_512_BLOCK_BYTES - ctx->h.bCnt);
+
+       /* process the final block */
+       Skein_512_Process_Block(ctx, ctx->b, 1, ctx->h.bCnt);
+
+       /* now output the result */
+       /* total number of output bytes */
+       byteCnt = (ctx->h.hashBitLen + 7) >> 3;
+
+       /* run Threefish in "counter mode" to generate output */
+       /* zero out b[], so it can hold the counter */
+       memset(ctx->b, 0, sizeof(ctx->b));
+       /* keep a local copy of counter mode "key" */
+       memcpy(X, ctx->X, sizeof(X));
+       for (i = 0; i*SKEIN_512_BLOCK_BYTES < byteCnt; i++) {
+               /* build the counter block */
+               ((u64 *)ctx->b)[0] = Skein_Swap64((u64) i);
+               Skein_Start_New_Type(ctx, OUT_FINAL);
+               /* run "counter mode" */
+               Skein_512_Process_Block(ctx, ctx->b, 1, sizeof(u64));
+               /* number of output bytes left to go */
+               n = byteCnt - i*SKEIN_512_BLOCK_BYTES;
+               if (n >= SKEIN_512_BLOCK_BYTES)
+                       n  = SKEIN_512_BLOCK_BYTES;
+               /* "output" the ctr mode bytes */
+               Skein_Put64_LSB_First(hashVal+i*SKEIN_512_BLOCK_BYTES, ctx->X,
+                                     n);
+               Skein_Show_Final(512, &ctx->h, n,
+                                hashVal+i*SKEIN_512_BLOCK_BYTES);
+               /* restore the counter mode key for next time */
+               memcpy(ctx->X, X, sizeof(X));
+       }
+       return SKEIN_SUCCESS;
+}
+
+/*****************************************************************/
+/*    1024-bit Skein                                             */
+/*****************************************************************/
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* init the context for a straight hashing operation  */
+int Skein1024_Init(struct skein1024_ctx *ctx, size_t hashBitLen)
+{
+       union {
+               u8  b[SKEIN1024_STATE_BYTES];
+               u64  w[SKEIN1024_STATE_WORDS];
+       } cfg;                              /* config block */
+
+       Skein_Assert(hashBitLen > 0, SKEIN_BAD_HASHLEN);
+       ctx->h.hashBitLen = hashBitLen;         /* output hash bit count */
+
+       switch (hashBitLen) { /* use pre-computed values, where available */
+       case  512:
+               memcpy(ctx->X, SKEIN1024_IV_512, sizeof(ctx->X));
+               break;
+       case  384:
+               memcpy(ctx->X, SKEIN1024_IV_384, sizeof(ctx->X));
+               break;
+       case 1024:
+               memcpy(ctx->X, SKEIN1024_IV_1024, sizeof(ctx->X));
+               break;
+       default:
+               /* here if there is no precomputed IV value available */
+               /*
+                * build/process the config block, type == CONFIG
+                * (could be precomputed)
+                */
+               /* set tweaks: T0=0; T1=CFG | FINAL */
+               Skein_Start_New_Type(ctx, CFG_FINAL);
+
+               /* set the schema, version */
+               cfg.w[0] = Skein_Swap64(SKEIN_SCHEMA_VER);
+               /* hash result length in bits */
+               cfg.w[1] = Skein_Swap64(hashBitLen);
+               cfg.w[2] = Skein_Swap64(SKEIN_CFG_TREE_INFO_SEQUENTIAL);
+               /* zero pad config block */
+               memset(&cfg.w[3], 0, sizeof(cfg) - 3*sizeof(cfg.w[0]));
+
+               /* compute the initial chaining values from config block */
+               /* zero the chaining variables */
+               memset(ctx->X, 0, sizeof(ctx->X));
+               Skein1024_Process_Block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
+               break;
+       }
+
+       /* The chaining vars ctx->X are now initialized for the hashBitLen. */
+       /* Set up to process the data message portion of the hash (default) */
+       Skein_Start_New_Type(ctx, MSG);              /* T0=0, T1= MSG type */
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* init the context for a MAC and/or tree hash operation */
+/* [identical to Skein1024_Init() when keyBytes == 0 && \
+ *     treeInfo == SKEIN_CFG_TREE_INFO_SEQUENTIAL] */
+int Skein1024_InitExt(struct skein1024_ctx *ctx, size_t hashBitLen,
+                       u64 treeInfo, const u8 *key, size_t keyBytes)
+{
+       union {
+               u8  b[SKEIN1024_STATE_BYTES];
+               u64  w[SKEIN1024_STATE_WORDS];
+       } cfg;                              /* config block */
+
+       Skein_Assert(hashBitLen > 0, SKEIN_BAD_HASHLEN);
+       Skein_Assert(keyBytes == 0 || key != NULL, SKEIN_FAIL);
+
+       /* compute the initial chaining values ctx->X[], based on key */
+       if (keyBytes == 0) { /* is there a key? */
+               /* no key: use all zeroes as key for config block */
+               memset(ctx->X, 0, sizeof(ctx->X));
+       } else { /* here to pre-process a key */
+               Skein_assert(sizeof(cfg.b) >= sizeof(ctx->X));
+               /* do a mini-Init right here */
+               /* set output hash bit count = state size */
+               ctx->h.hashBitLen = 8*sizeof(ctx->X);
+               /* set tweaks: T0 = 0; T1 = KEY type */
+               Skein_Start_New_Type(ctx, KEY);
+               /* zero the initial chaining variables */
+               memset(ctx->X, 0, sizeof(ctx->X));
+               /* hash the key */
+               Skein1024_Update(ctx, key, keyBytes);
+               /* put result into cfg.b[] */
+               Skein1024_Final_Pad(ctx, cfg.b);
+               /* copy over into ctx->X[] */
+               memcpy(ctx->X, cfg.b, sizeof(cfg.b));
+       }
+       /*
+        * build/process the config block, type == CONFIG (could be
+        * precomputed for each key)
+        */
+       /* output hash bit count */
+       ctx->h.hashBitLen = hashBitLen;
+       Skein_Start_New_Type(ctx, CFG_FINAL);
+
+       /* pre-pad cfg.w[] with zeroes */
+       memset(&cfg.w, 0, sizeof(cfg.w));
+       cfg.w[0] = Skein_Swap64(SKEIN_SCHEMA_VER);
+       /* hash result length in bits */
+       cfg.w[1] = Skein_Swap64(hashBitLen);
+       /* tree hash config info (or SKEIN_CFG_TREE_INFO_SEQUENTIAL) */
+       cfg.w[2] = Skein_Swap64(treeInfo);
+
+       Skein_Show_Key(1024, &ctx->h, key, keyBytes);
+
+       /* compute the initial chaining values from config block */
+       Skein1024_Process_Block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
+
+       /* The chaining vars ctx->X are now initialized */
+       /* Set up to process the data message portion of the hash (default) */
+       Skein_Start_New_Type(ctx, MSG);
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* process the input bytes */
+int Skein1024_Update(struct skein1024_ctx *ctx, const u8 *msg,
+                       size_t msgByteCnt)
+{
+       size_t n;
+
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN1024_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* process full blocks, if any */
+       if (msgByteCnt + ctx->h.bCnt > SKEIN1024_BLOCK_BYTES) {
+               /* finish up any buffered message data */
+               if (ctx->h.bCnt) {
+                       /* # bytes free in buffer b[] */
+                       n = SKEIN1024_BLOCK_BYTES - ctx->h.bCnt;
+                       if (n) {
+                               /* check on our logic here */
+                               Skein_assert(n < msgByteCnt);
+                               memcpy(&ctx->b[ctx->h.bCnt], msg, n);
+                               msgByteCnt  -= n;
+                               msg         += n;
+                               ctx->h.bCnt += n;
+                       }
+                       Skein_assert(ctx->h.bCnt == SKEIN1024_BLOCK_BYTES);
+                       Skein1024_Process_Block(ctx, ctx->b, 1,
+                                               SKEIN1024_BLOCK_BYTES);
+                       ctx->h.bCnt = 0;
+               }
+               /*
+                * now process any remaining full blocks, directly from input
+                * message data
+                */
+               if (msgByteCnt > SKEIN1024_BLOCK_BYTES) {
+                       /* number of full blocks to process */
+                       n = (msgByteCnt-1) / SKEIN1024_BLOCK_BYTES;
+                       Skein1024_Process_Block(ctx, msg, n,
+                                               SKEIN1024_BLOCK_BYTES);
+                       msgByteCnt -= n * SKEIN1024_BLOCK_BYTES;
+                       msg        += n * SKEIN1024_BLOCK_BYTES;
+               }
+               Skein_assert(ctx->h.bCnt == 0);
+       }
+
+       /* copy any remaining source message data bytes into b[] */
+       if (msgByteCnt) {
+               Skein_assert(msgByteCnt + ctx->h.bCnt <= SKEIN1024_BLOCK_BYTES);
+               memcpy(&ctx->b[ctx->h.bCnt], msg, msgByteCnt);
+               ctx->h.bCnt += msgByteCnt;
+       }
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* finalize the hash computation and output the result */
+int Skein1024_Final(struct skein1024_ctx *ctx, u8 *hashVal)
+{
+       size_t i, n, byteCnt;
+       u64 X[SKEIN1024_STATE_WORDS];
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN1024_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* tag as the final block */
+       ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL;
+       /* zero pad b[] if necessary */
+       if (ctx->h.bCnt < SKEIN1024_BLOCK_BYTES)
+               memset(&ctx->b[ctx->h.bCnt], 0,
+                       SKEIN1024_BLOCK_BYTES - ctx->h.bCnt);
+
+       /* process the final block */
+       Skein1024_Process_Block(ctx, ctx->b, 1, ctx->h.bCnt);
+
+       /* now output the result */
+       /* total number of output bytes */
+       byteCnt = (ctx->h.hashBitLen + 7) >> 3;
+
+       /* run Threefish in "counter mode" to generate output */
+       /* zero out b[], so it can hold the counter */
+       memset(ctx->b, 0, sizeof(ctx->b));
+       /* keep a local copy of counter mode "key" */
+       memcpy(X, ctx->X, sizeof(X));
+       for (i = 0; i*SKEIN1024_BLOCK_BYTES < byteCnt; i++) {
+               /* build the counter block */
+               ((u64 *)ctx->b)[0] = Skein_Swap64((u64) i);
+               Skein_Start_New_Type(ctx, OUT_FINAL);
+               /* run "counter mode" */
+               Skein1024_Process_Block(ctx, ctx->b, 1, sizeof(u64));
+               /* number of output bytes left to go */
+               n = byteCnt - i*SKEIN1024_BLOCK_BYTES;
+               if (n >= SKEIN1024_BLOCK_BYTES)
+                       n  = SKEIN1024_BLOCK_BYTES;
+               /* "output" the ctr mode bytes */
+               Skein_Put64_LSB_First(hashVal+i*SKEIN1024_BLOCK_BYTES, ctx->X,
+                                     n);
+               Skein_Show_Final(1024, &ctx->h, n,
+                                hashVal+i*SKEIN1024_BLOCK_BYTES);
+               /* restore the counter mode key for next time */
+               memcpy(ctx->X, X, sizeof(X));
+       }
+       return SKEIN_SUCCESS;
+}
+
+/**************** Functions to support MAC/tree hashing ***************/
+/*   (this code is identical for Optimized and Reference versions)    */
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* finalize the hash computation and output the block, no OUTPUT stage */
+int Skein_256_Final_Pad(struct skein_256_ctx *ctx, u8 *hashVal)
+{
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN_256_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* tag as the final block */
+       ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL;
+       /* zero pad b[] if necessary */
+       if (ctx->h.bCnt < SKEIN_256_BLOCK_BYTES)
+               memset(&ctx->b[ctx->h.bCnt], 0,
+                       SKEIN_256_BLOCK_BYTES - ctx->h.bCnt);
+       /* process the final block */
+       Skein_256_Process_Block(ctx, ctx->b, 1, ctx->h.bCnt);
+
+       /* "output" the state bytes */
+       Skein_Put64_LSB_First(hashVal, ctx->X, SKEIN_256_BLOCK_BYTES);
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* finalize the hash computation and output the block, no OUTPUT stage */
+int Skein_512_Final_Pad(struct skein_512_ctx *ctx, u8 *hashVal)
+{
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN_512_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* tag as the final block */
+       ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL;
+       /* zero pad b[] if necessary */
+       if (ctx->h.bCnt < SKEIN_512_BLOCK_BYTES)
+               memset(&ctx->b[ctx->h.bCnt], 0,
+                       SKEIN_512_BLOCK_BYTES - ctx->h.bCnt);
+       /* process the final block */
+       Skein_512_Process_Block(ctx, ctx->b, 1, ctx->h.bCnt);
+
+       /* "output" the state bytes */
+       Skein_Put64_LSB_First(hashVal, ctx->X, SKEIN_512_BLOCK_BYTES);
+
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* finalize the hash computation and output the block, no OUTPUT stage */
+int Skein1024_Final_Pad(struct skein1024_ctx *ctx, u8 *hashVal)
+{
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN1024_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* tag as the final block */
+       ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL;
+       /* zero pad b[] if necessary */
+       if (ctx->h.bCnt < SKEIN1024_BLOCK_BYTES)
+               memset(&ctx->b[ctx->h.bCnt], 0,
+                       SKEIN1024_BLOCK_BYTES - ctx->h.bCnt);
+       /* process the final block */
+       Skein1024_Process_Block(ctx, ctx->b, 1, ctx->h.bCnt);
+
+       /* "output" the state bytes */
+       Skein_Put64_LSB_First(hashVal, ctx->X, SKEIN1024_BLOCK_BYTES);
+
+       return SKEIN_SUCCESS;
+}
+
+#if SKEIN_TREE_HASH
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* just do the OUTPUT stage                                       */
+int Skein_256_Output(struct skein_256_ctx *ctx, u8 *hashVal)
+{
+       size_t i, n, byteCnt;
+       u64 X[SKEIN_256_STATE_WORDS];
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN_256_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* now output the result */
+       /* total number of output bytes */
+       byteCnt = (ctx->h.hashBitLen + 7) >> 3;
+
+       /* run Threefish in "counter mode" to generate output */
+       /* zero out b[], so it can hold the counter */
+       memset(ctx->b, 0, sizeof(ctx->b));
+       /* keep a local copy of counter mode "key" */
+       memcpy(X, ctx->X, sizeof(X));
+       for (i = 0; i*SKEIN_256_BLOCK_BYTES < byteCnt; i++) {
+               /* build the counter block */
+               ((u64 *)ctx->b)[0] = Skein_Swap64((u64) i);
+               Skein_Start_New_Type(ctx, OUT_FINAL);
+               /* run "counter mode" */
+               Skein_256_Process_Block(ctx, ctx->b, 1, sizeof(u64));
+               /* number of output bytes left to go */
+               n = byteCnt - i*SKEIN_256_BLOCK_BYTES;
+               if (n >= SKEIN_256_BLOCK_BYTES)
+                       n  = SKEIN_256_BLOCK_BYTES;
+               /* "output" the ctr mode bytes */
+               Skein_Put64_LSB_First(hashVal+i*SKEIN_256_BLOCK_BYTES, ctx->X,
+                                     n);
+               Skein_Show_Final(256, &ctx->h, n,
+                                hashVal+i*SKEIN_256_BLOCK_BYTES);
+               /* restore the counter mode key for next time */
+               memcpy(ctx->X, X, sizeof(X));
+       }
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* just do the OUTPUT stage                                       */
+int Skein_512_Output(struct skein_512_ctx *ctx, u8 *hashVal)
+{
+       size_t i, n, byteCnt;
+       u64 X[SKEIN_512_STATE_WORDS];
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN_512_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* now output the result */
+       /* total number of output bytes */
+       byteCnt = (ctx->h.hashBitLen + 7) >> 3;
+
+       /* run Threefish in "counter mode" to generate output */
+       /* zero out b[], so it can hold the counter */
+       memset(ctx->b, 0, sizeof(ctx->b));
+       /* keep a local copy of counter mode "key" */
+       memcpy(X, ctx->X, sizeof(X));
+       for (i = 0; i*SKEIN_512_BLOCK_BYTES < byteCnt; i++) {
+               /* build the counter block */
+               ((u64 *)ctx->b)[0] = Skein_Swap64((u64) i);
+               Skein_Start_New_Type(ctx, OUT_FINAL);
+               /* run "counter mode" */
+               Skein_512_Process_Block(ctx, ctx->b, 1, sizeof(u64));
+               /* number of output bytes left to go */
+               n = byteCnt - i*SKEIN_512_BLOCK_BYTES;
+               if (n >= SKEIN_512_BLOCK_BYTES)
+                       n  = SKEIN_512_BLOCK_BYTES;
+               /* "output" the ctr mode bytes */
+               Skein_Put64_LSB_First(hashVal+i*SKEIN_512_BLOCK_BYTES, ctx->X,
+                                     n);
+               Skein_Show_Final(256, &ctx->h, n,
+                                hashVal+i*SKEIN_512_BLOCK_BYTES);
+               /* restore the counter mode key for next time */
+               memcpy(ctx->X, X, sizeof(X));
+       }
+       return SKEIN_SUCCESS;
+}
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/* just do the OUTPUT stage                                       */
+int Skein1024_Output(struct skein1024_ctx *ctx, u8 *hashVal)
+{
+       size_t i, n, byteCnt;
+       u64 X[SKEIN1024_STATE_WORDS];
+       /* catch uninitialized context */
+       Skein_Assert(ctx->h.bCnt <= SKEIN1024_BLOCK_BYTES, SKEIN_FAIL);
+
+       /* now output the result */
+       /* total number of output bytes */
+       byteCnt = (ctx->h.hashBitLen + 7) >> 3;
+
+       /* run Threefish in "counter mode" to generate output */
+       /* zero out b[], so it can hold the counter */
+       memset(ctx->b, 0, sizeof(ctx->b));
+       /* keep a local copy of counter mode "key" */
+       memcpy(X, ctx->X, sizeof(X));
+       for (i = 0; i*SKEIN1024_BLOCK_BYTES < byteCnt; i++) {
+               /* build the counter block */
+               ((u64 *)ctx->b)[0] = Skein_Swap64((u64) i);
+               Skein_Start_New_Type(ctx, OUT_FINAL);
+               /* run "counter mode" */
+               Skein1024_Process_Block(ctx, ctx->b, 1, sizeof(u64));
+               /* number of output bytes left to go */
+               n = byteCnt - i*SKEIN1024_BLOCK_BYTES;
+               if (n >= SKEIN1024_BLOCK_BYTES)
+                       n  = SKEIN1024_BLOCK_BYTES;
+               /* "output" the ctr mode bytes */
+               Skein_Put64_LSB_First(hashVal+i*SKEIN1024_BLOCK_BYTES, ctx->X,
+                                     n);
+               Skein_Show_Final(256, &ctx->h, n,
+                                hashVal+i*SKEIN1024_BLOCK_BYTES);
+               /* restore the counter mode key for next time */
+               memcpy(ctx->X, X, sizeof(X));
+       }
+       return SKEIN_SUCCESS;
+}
+#endif
diff --git a/drivers/staging/skein/skeinApi.c b/drivers/staging/skein/skeinApi.c
new file mode 100644 (file)
index 0000000..dd109bf
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+Copyright (c) 2010 Werner Dittmann
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <linux/string.h>
+#include <skeinApi.h>
+
+int skeinCtxPrepare(struct skein_ctx *ctx, enum skein_size size)
+{
+       Skein_Assert(ctx && size, SKEIN_FAIL);
+
+       memset(ctx , 0, sizeof(struct skein_ctx));
+       ctx->skeinSize = size;
+
+       return SKEIN_SUCCESS;
+}
+
+int skeinInit(struct skein_ctx *ctx, size_t hashBitLen)
+{
+       int ret = SKEIN_FAIL;
+       size_t Xlen = 0;
+       u64 *X = NULL;
+       u64 treeInfo = SKEIN_CFG_TREE_INFO_SEQUENTIAL;
+
+       Skein_Assert(ctx, SKEIN_FAIL);
+       /*
+        * The following two lines rely of the fact that the real Skein
+        * contexts are a union in out context and thus have tha maximum
+        * memory available.  The beauty of C :-) .
+        */
+       X = ctx->m.s256.X;
+       Xlen = ctx->skeinSize/8;
+       /*
+        * If size is the same and hash bit length is zero then reuse
+        * the save chaining variables.
+        */
+       switch (ctx->skeinSize) {
+       case Skein256:
+               ret = Skein_256_InitExt(&ctx->m.s256, hashBitLen,
+                                       treeInfo, NULL, 0);
+               break;
+       case Skein512:
+               ret = Skein_512_InitExt(&ctx->m.s512, hashBitLen,
+                                       treeInfo, NULL, 0);
+               break;
+       case Skein1024:
+               ret = Skein1024_InitExt(&ctx->m.s1024, hashBitLen,
+                                       treeInfo, NULL, 0);
+               break;
+       }
+
+       if (ret == SKEIN_SUCCESS) {
+               /*
+                * Save chaining variables for this combination of size and
+                * hashBitLen
+                */
+               memcpy(ctx->XSave, X, Xlen);
+       }
+       return ret;
+}
+
+int skeinMacInit(struct skein_ctx *ctx, const u8 *key, size_t keyLen,
+               size_t hashBitLen)
+{
+       int ret = SKEIN_FAIL;
+       u64 *X = NULL;
+       size_t Xlen = 0;
+       u64 treeInfo = SKEIN_CFG_TREE_INFO_SEQUENTIAL;
+
+       Skein_Assert(ctx, SKEIN_FAIL);
+
+       X = ctx->m.s256.X;
+       Xlen = ctx->skeinSize/8;
+
+       Skein_Assert(hashBitLen, SKEIN_BAD_HASHLEN);
+
+       switch (ctx->skeinSize) {
+       case Skein256:
+               ret = Skein_256_InitExt(&ctx->m.s256, hashBitLen,
+                                       treeInfo,
+                                       (const u8 *)key, keyLen);
+
+               break;
+       case Skein512:
+               ret = Skein_512_InitExt(&ctx->m.s512, hashBitLen,
+                                       treeInfo,
+                                       (const u8 *)key, keyLen);
+               break;
+       case Skein1024:
+               ret = Skein1024_InitExt(&ctx->m.s1024, hashBitLen,
+                                       treeInfo,
+                                       (const u8 *)key, keyLen);
+
+               break;
+       }
+       if (ret == SKEIN_SUCCESS) {
+               /*
+                * Save chaining variables for this combination of key,
+                * keyLen, hashBitLen
+                */
+               memcpy(ctx->XSave, X, Xlen);
+       }
+       return ret;
+}
+
+void skeinReset(struct skein_ctx *ctx)
+{
+       size_t Xlen = 0;
+       u64 *X = NULL;
+
+       /*
+        * The following two lines rely of the fact that the real Skein
+        * contexts are a union in out context and thus have tha maximum
+        * memory available.  The beautiy of C :-) .
+        */
+       X = ctx->m.s256.X;
+       Xlen = ctx->skeinSize/8;
+       /* Restore the chaing variable, reset byte counter */
+       memcpy(X, ctx->XSave, Xlen);
+
+       /* Setup context to process the message */
+       Skein_Start_New_Type(&ctx->m, MSG);
+}
+
+int skeinUpdate(struct skein_ctx *ctx, const u8 *msg,
+               size_t msgByteCnt)
+{
+       int ret = SKEIN_FAIL;
+       Skein_Assert(ctx, SKEIN_FAIL);
+
+       switch (ctx->skeinSize) {
+       case Skein256:
+               ret = Skein_256_Update(&ctx->m.s256, (const u8 *)msg,
+                                       msgByteCnt);
+               break;
+       case Skein512:
+               ret = Skein_512_Update(&ctx->m.s512, (const u8 *)msg,
+                                       msgByteCnt);
+               break;
+       case Skein1024:
+               ret = Skein1024_Update(&ctx->m.s1024, (const u8 *)msg,
+                                       msgByteCnt);
+               break;
+       }
+       return ret;
+
+}
+
+int skeinUpdateBits(struct skein_ctx *ctx, const u8 *msg,
+                       size_t msgBitCnt)
+{
+       /*
+        * I've used the bit pad implementation from skein_test.c (see NIST CD)
+        * and modified it to use the convenience functions and added some
+        * pointer arithmetic.
+        */
+       size_t length;
+       u8 mask;
+       u8 *up;
+
+       /*
+        * only the final Update() call is allowed do partial bytes, else
+        * assert an error
+        */
+       Skein_Assert((ctx->m.h.T[1] & SKEIN_T1_FLAG_BIT_PAD) == 0 ||
+                       msgBitCnt == 0, SKEIN_FAIL);
+
+       /* if number of bits is a multiple of bytes - that's easy */
+       if ((msgBitCnt & 0x7) == 0)
+               return skeinUpdate(ctx, msg, msgBitCnt >> 3);
+
+       skeinUpdate(ctx, msg, (msgBitCnt >> 3) + 1);
+
+       /*
+        * The next line rely on the fact that the real Skein contexts
+        * are a union in our context. After the addition the pointer points to
+        * Skein's real partial block buffer.
+        * If this layout ever changes we have to adapt this as well.
+        */
+       up = (u8 *)ctx->m.s256.X + ctx->skeinSize / 8;
+
+       /* set tweak flag for the skeinFinal call */
+       Skein_Set_Bit_Pad_Flag(ctx->m.h);
+
+       /* now "pad" the final partial byte the way NIST likes */
+       /* get the bCnt value (same location for all block sizes) */
+       length = ctx->m.h.bCnt;
+       /* internal sanity check: there IS a partial byte in the buffer! */
+       Skein_assert(length != 0);
+       /* partial byte bit mask */
+       mask = (u8) (1u << (7 - (msgBitCnt & 7)));
+       /* apply bit padding on final byte (in the buffer) */
+       up[length-1]  = (u8)((up[length-1] & (0-mask))|mask);
+
+       return SKEIN_SUCCESS;
+}
+
+int skeinFinal(struct skein_ctx *ctx, u8 *hash)
+{
+       int ret = SKEIN_FAIL;
+       Skein_Assert(ctx, SKEIN_FAIL);
+
+       switch (ctx->skeinSize) {
+       case Skein256:
+               ret = Skein_256_Final(&ctx->m.s256, (u8 *)hash);
+               break;
+       case Skein512:
+               ret = Skein_512_Final(&ctx->m.s512, (u8 *)hash);
+               break;
+       case Skein1024:
+               ret = Skein1024_Final(&ctx->m.s1024, (u8 *)hash);
+               break;
+       }
+       return ret;
+}
diff --git a/drivers/staging/skein/skeinBlockNo3F.c b/drivers/staging/skein/skeinBlockNo3F.c
new file mode 100644 (file)
index 0000000..6917638
--- /dev/null
@@ -0,0 +1,175 @@
+
+#include <linux/string.h>
+#include <skein.h>
+#include <threefishApi.h>
+
+
+/*****************************  Skein_256 ******************************/
+void Skein_256_Process_Block(struct skein_256_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd)
+{
+       struct threefish_key key;
+       u64 tweak[2];
+       int i;
+       u64  w[SKEIN_256_STATE_WORDS]; /* local copy of input block */
+       u64 words[3];
+
+       Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
+       tweak[0] = ctx->h.T[0];
+       tweak[1] = ctx->h.T[1];
+
+       do  {
+               u64 carry = byteCntAdd;
+
+               words[0] = tweak[0] & 0xffffffffL;
+               words[1] = ((tweak[0] >> 32) & 0xffffffffL);
+               words[2] = (tweak[1] & 0xffffffffL);
+
+               for (i = 0; i < 3; i++) {
+                       carry += words[i];
+                       words[i] = carry;
+                       carry >>= 32;
+               }
+               tweak[0] = words[0] & 0xffffffffL;
+               tweak[0] |= (words[1] & 0xffffffffL) << 32;
+               tweak[1] |= words[2] & 0xffffffffL;
+
+               threefishSetKey(&key, Threefish256, ctx->X, tweak);
+
+               /* get input block in little-endian format */
+               Skein_Get64_LSB_First(w, blkPtr, SKEIN_256_STATE_WORDS);
+
+               threefishEncryptBlockWords(&key, w, ctx->X);
+
+               blkPtr += SKEIN_256_BLOCK_BYTES;
+
+               /* do the final "feedforward" xor, update ctx chaining vars */
+               ctx->X[0] = ctx->X[0] ^ w[0];
+               ctx->X[1] = ctx->X[1] ^ w[1];
+               ctx->X[2] = ctx->X[2] ^ w[2];
+               ctx->X[3] = ctx->X[3] ^ w[3];
+
+               tweak[1] &= ~SKEIN_T1_FLAG_FIRST;
+       } while (--blkCnt);
+
+       ctx->h.T[0] = tweak[0];
+       ctx->h.T[1] = tweak[1];
+}
+
+void Skein_512_Process_Block(struct skein_512_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd)
+{
+       struct threefish_key key;
+       u64 tweak[2];
+       int i;
+       u64 words[3];
+       u64  w[SKEIN_512_STATE_WORDS]; /* local copy of input block */
+
+       Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
+       tweak[0] = ctx->h.T[0];
+       tweak[1] = ctx->h.T[1];
+
+       do  {
+               u64 carry = byteCntAdd;
+
+               words[0] = tweak[0] & 0xffffffffL;
+               words[1] = ((tweak[0] >> 32) & 0xffffffffL);
+               words[2] = (tweak[1] & 0xffffffffL);
+
+               for (i = 0; i < 3; i++) {
+                       carry += words[i];
+                       words[i] = carry;
+                       carry >>= 32;
+               }
+               tweak[0] = words[0] & 0xffffffffL;
+               tweak[0] |= (words[1] & 0xffffffffL) << 32;
+               tweak[1] |= words[2] & 0xffffffffL;
+
+               threefishSetKey(&key, Threefish512, ctx->X, tweak);
+
+               /* get input block in little-endian format */
+               Skein_Get64_LSB_First(w, blkPtr, SKEIN_512_STATE_WORDS);
+
+               threefishEncryptBlockWords(&key, w, ctx->X);
+
+               blkPtr += SKEIN_512_BLOCK_BYTES;
+
+               /* do the final "feedforward" xor, update ctx chaining vars */
+               ctx->X[0] = ctx->X[0] ^ w[0];
+               ctx->X[1] = ctx->X[1] ^ w[1];
+               ctx->X[2] = ctx->X[2] ^ w[2];
+               ctx->X[3] = ctx->X[3] ^ w[3];
+               ctx->X[4] = ctx->X[4] ^ w[4];
+               ctx->X[5] = ctx->X[5] ^ w[5];
+               ctx->X[6] = ctx->X[6] ^ w[6];
+               ctx->X[7] = ctx->X[7] ^ w[7];
+
+               tweak[1] &= ~SKEIN_T1_FLAG_FIRST;
+       } while (--blkCnt);
+
+       ctx->h.T[0] = tweak[0];
+       ctx->h.T[1] = tweak[1];
+}
+
+void Skein1024_Process_Block(struct skein1024_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd)
+{
+       struct threefish_key key;
+       u64 tweak[2];
+       int i;
+       u64 words[3];
+       u64  w[SKEIN1024_STATE_WORDS]; /* local copy of input block */
+
+       Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
+       tweak[0] = ctx->h.T[0];
+       tweak[1] = ctx->h.T[1];
+
+       do  {
+               u64 carry = byteCntAdd;
+
+               words[0] = tweak[0] & 0xffffffffL;
+               words[1] = ((tweak[0] >> 32) & 0xffffffffL);
+               words[2] = (tweak[1] & 0xffffffffL);
+
+               for (i = 0; i < 3; i++) {
+                       carry += words[i];
+                       words[i] = carry;
+                       carry >>= 32;
+               }
+               tweak[0] = words[0] & 0xffffffffL;
+               tweak[0] |= (words[1] & 0xffffffffL) << 32;
+               tweak[1] |= words[2] & 0xffffffffL;
+
+               threefishSetKey(&key, Threefish1024, ctx->X, tweak);
+
+               /* get input block in little-endian format */
+               Skein_Get64_LSB_First(w, blkPtr, SKEIN1024_STATE_WORDS);
+
+               threefishEncryptBlockWords(&key, w, ctx->X);
+
+               blkPtr += SKEIN1024_BLOCK_BYTES;
+
+               /* do the final "feedforward" xor, update ctx chaining vars */
+               ctx->X[0]  = ctx->X[0]  ^ w[0];
+               ctx->X[1]  = ctx->X[1]  ^ w[1];
+               ctx->X[2]  = ctx->X[2]  ^ w[2];
+               ctx->X[3]  = ctx->X[3]  ^ w[3];
+               ctx->X[4]  = ctx->X[4]  ^ w[4];
+               ctx->X[5]  = ctx->X[5]  ^ w[5];
+               ctx->X[6]  = ctx->X[6]  ^ w[6];
+               ctx->X[7]  = ctx->X[7]  ^ w[7];
+               ctx->X[8]  = ctx->X[8]  ^ w[8];
+               ctx->X[9]  = ctx->X[9]  ^ w[9];
+               ctx->X[10] = ctx->X[10] ^ w[10];
+               ctx->X[11] = ctx->X[11] ^ w[11];
+               ctx->X[12] = ctx->X[12] ^ w[12];
+               ctx->X[13] = ctx->X[13] ^ w[13];
+               ctx->X[14] = ctx->X[14] ^ w[14];
+               ctx->X[15] = ctx->X[15] ^ w[15];
+
+               tweak[1] &= ~SKEIN_T1_FLAG_FIRST;
+       } while (--blkCnt);
+
+       ctx->h.T[0] = tweak[0];
+       ctx->h.T[1] = tweak[1];
+}
diff --git a/drivers/staging/skein/skein_block.c b/drivers/staging/skein/skein_block.c
new file mode 100644 (file)
index 0000000..fd96ca0
--- /dev/null
@@ -0,0 +1,770 @@
+/***********************************************************************
+**
+** Implementation of the Skein block functions.
+**
+** Source code author: Doug Whiting, 2008.
+**
+** This algorithm and source code is released to the public domain.
+**
+** Compile-time switches:
+**
+**  SKEIN_USE_ASM  -- set bits (256/512/1024) to select which
+**                    versions use ASM code for block processing
+**                    [default: use C for all block sizes]
+**
+************************************************************************/
+
+#include <linux/string.h>
+#include <skein.h>
+
+#ifndef SKEIN_USE_ASM
+#define SKEIN_USE_ASM   (0) /* default is all C code (no ASM) */
+#endif
+
+#ifndef SKEIN_LOOP
+#define SKEIN_LOOP 001 /* default: unroll 256 and 512, but not 1024 */
+#endif
+
+#define BLK_BITS        (WCNT*64) /* some useful definitions for code here */
+#define KW_TWK_BASE     (0)
+#define KW_KEY_BASE     (3)
+#define ks              (kw + KW_KEY_BASE)
+#define ts              (kw + KW_TWK_BASE)
+
+#ifdef SKEIN_DEBUG
+#define DebugSaveTweak(ctx) { ctx->h.T[0] = ts[0]; ctx->h.T[1] = ts[1]; }
+#else
+#define DebugSaveTweak(ctx)
+#endif
+
+/*****************************  Skein_256 ******************************/
+#if !(SKEIN_USE_ASM & 256)
+void Skein_256_Process_Block(struct skein_256_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd)
+       { /* do it in C */
+       enum {
+               WCNT = SKEIN_256_STATE_WORDS
+       };
+#undef  RCNT
+#define RCNT  (SKEIN_256_ROUNDS_TOTAL/8)
+
+#ifdef SKEIN_LOOP /* configure how much to unroll the loop */
+#define SKEIN_UNROLL_256 (((SKEIN_LOOP)/100)%10)
+#else
+#define SKEIN_UNROLL_256 (0)
+#endif
+
+#if SKEIN_UNROLL_256
+#if (RCNT % SKEIN_UNROLL_256)
+#error "Invalid SKEIN_UNROLL_256" /* sanity check on unroll count */
+#endif
+       size_t  r;
+       u64  kw[WCNT+4+RCNT*2]; /* key schedule: chaining vars + tweak + "rot"*/
+#else
+       u64  kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
+#endif
+       u64  X0, X1, X2, X3; /* local copy of context vars, for speed */
+       u64  w[WCNT]; /* local copy of input block */
+#ifdef SKEIN_DEBUG
+       const u64 *Xptr[4]; /* use for debugging (help cc put Xn in regs) */
+       Xptr[0] = &X0;  Xptr[1] = &X1;  Xptr[2] = &X2;  Xptr[3] = &X3;
+#endif
+       Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
+       ts[0] = ctx->h.T[0];
+       ts[1] = ctx->h.T[1];
+       do  {
+               /*
+                * this implementation only supports 2**64 input bytes
+                * (no carry out here)
+                */
+               ts[0] += byteCntAdd; /* update processed length */
+
+               /* precompute the key schedule for this block */
+               ks[0] = ctx->X[0];
+               ks[1] = ctx->X[1];
+               ks[2] = ctx->X[2];
+               ks[3] = ctx->X[3];
+               ks[4] = ks[0] ^ ks[1] ^ ks[2] ^ ks[3] ^ SKEIN_KS_PARITY;
+
+               ts[2] = ts[0] ^ ts[1];
+
+               /* get input block in little-endian format */
+               Skein_Get64_LSB_First(w, blkPtr, WCNT);
+               DebugSaveTweak(ctx);
+               Skein_Show_Block(BLK_BITS, &ctx->h, ctx->X, blkPtr, w, ks, ts);
+
+               X0 = w[0] + ks[0]; /* do the first full key injection */
+               X1 = w[1] + ks[1] + ts[0];
+               X2 = w[2] + ks[2] + ts[1];
+               X3 = w[3] + ks[3];
+
+               /* show starting state values */
+               Skein_Show_R_Ptr(BLK_BITS, &ctx->h, SKEIN_RND_KEY_INITIAL,
+                                Xptr);
+
+               blkPtr += SKEIN_256_BLOCK_BYTES;
+
+               /* run the rounds */
+
+#define Round256(p0, p1, p2, p3, ROT, rNum)                              \
+do { \
+       X##p0 += X##p1; X##p1 = RotL_64(X##p1, ROT##_0); X##p1 ^= X##p0; \
+       X##p2 += X##p3; X##p3 = RotL_64(X##p3, ROT##_1); X##p3 ^= X##p2; \
+} while (0)
+
+#if SKEIN_UNROLL_256 == 0
+#define R256(p0, p1, p2, p3, ROT, rNum) /* fully unrolled */ \
+do { \
+       Round256(p0, p1, p2, p3, ROT, rNum) \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, rNum, Xptr); \
+} while (0)
+
+#define I256(R) \
+do { \
+       /* inject the key schedule value */ \
+       X0   += ks[((R)+1) % 5]; \
+       X1   += ks[((R)+2) % 5] + ts[((R)+1) % 3]; \
+       X2   += ks[((R)+3) % 5] + ts[((R)+2) % 3]; \
+       X3   += ks[((R)+4) % 5] +     (R)+1;       \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, SKEIN_RND_KEY_INJECT, Xptr); \
+} while (0)
+#else /* looping version */
+#define R256(p0, p1, p2, p3, ROT, rNum) \
+do { \
+       Round256(p0, p1, p2, p3, ROT, rNum) \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, 4 * (r - 1) + rNum, Xptr); \
+} while (0)
+
+#define I256(R) \
+do { \
+       /* inject the key schedule value */ \
+       X0   += ks[r+(R)+0]; \
+       X1   += ks[r+(R)+1] + ts[r+(R)+0]; \
+       X2   += ks[r+(R)+2] + ts[r+(R)+1]; \
+       X3   += ks[r+(R)+3] +    r+(R);    \
+       /* rotate key schedule */ \
+       ks[r + (R) + 4]   = ks[r + (R) - 1]; \
+       ts[r + (R) + 2]   = ts[r + (R) - 1]; \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, SKEIN_RND_KEY_INJECT, Xptr); \
+} while (0)
+
+       for (r = 1; r < 2 * RCNT; r += 2 * SKEIN_UNROLL_256)
+#endif
+               {
+#define R256_8_rounds(R)                  \
+do { \
+               R256(0, 1, 2, 3, R_256_0, 8 * (R) + 1);  \
+               R256(0, 3, 2, 1, R_256_1, 8 * (R) + 2);  \
+               R256(0, 1, 2, 3, R_256_2, 8 * (R) + 3);  \
+               R256(0, 3, 2, 1, R_256_3, 8 * (R) + 4);  \
+               I256(2 * (R));                      \
+               R256(0, 1, 2, 3, R_256_4, 8 * (R) + 5);  \
+               R256(0, 3, 2, 1, R_256_5, 8 * (R) + 6);  \
+               R256(0, 1, 2, 3, R_256_6, 8 * (R) + 7);  \
+               R256(0, 3, 2, 1, R_256_7, 8 * (R) + 8);  \
+               I256(2 * (R) + 1); \
+} while (0)
+
+               R256_8_rounds(0);
+
+#define R256_Unroll_R(NN) \
+       ((SKEIN_UNROLL_256 == 0 && \
+         SKEIN_256_ROUNDS_TOTAL/8 > (NN)) || \
+        (SKEIN_UNROLL_256 > (NN)))
+
+       #if   R256_Unroll_R(1)
+               R256_8_rounds(1);
+       #endif
+       #if   R256_Unroll_R(2)
+               R256_8_rounds(2);
+       #endif
+       #if   R256_Unroll_R(3)
+               R256_8_rounds(3);
+       #endif
+       #if   R256_Unroll_R(4)
+               R256_8_rounds(4);
+       #endif
+       #if   R256_Unroll_R(5)
+               R256_8_rounds(5);
+       #endif
+       #if   R256_Unroll_R(6)
+               R256_8_rounds(6);
+       #endif
+       #if   R256_Unroll_R(7)
+               R256_8_rounds(7);
+       #endif
+       #if   R256_Unroll_R(8)
+               R256_8_rounds(8);
+       #endif
+       #if   R256_Unroll_R(9)
+               R256_8_rounds(9);
+       #endif
+       #if   R256_Unroll_R(10)
+               R256_8_rounds(10);
+       #endif
+       #if   R256_Unroll_R(11)
+               R256_8_rounds(11);
+       #endif
+       #if   R256_Unroll_R(12)
+               R256_8_rounds(12);
+       #endif
+       #if   R256_Unroll_R(13)
+               R256_8_rounds(13);
+       #endif
+       #if   R256_Unroll_R(14)
+               R256_8_rounds(14);
+       #endif
+       #if  (SKEIN_UNROLL_256 > 14)
+#error  "need more unrolling in Skein_256_Process_Block"
+       #endif
+               }
+               /* do the final "feedforward" xor, update context chaining */
+               ctx->X[0] = X0 ^ w[0];
+               ctx->X[1] = X1 ^ w[1];
+               ctx->X[2] = X2 ^ w[2];
+               ctx->X[3] = X3 ^ w[3];
+
+               Skein_Show_Round(BLK_BITS, &ctx->h, SKEIN_RND_FEED_FWD, ctx->X);
+
+               ts[1] &= ~SKEIN_T1_FLAG_FIRST;
+       } while (--blkCnt);
+       ctx->h.T[0] = ts[0];
+       ctx->h.T[1] = ts[1];
+}
+
+#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
+size_t Skein_256_Process_Block_CodeSize(void)
+{
+       return ((u8 *) Skein_256_Process_Block_CodeSize) -
+               ((u8 *) Skein_256_Process_Block);
+}
+unsigned int Skein_256_Unroll_Cnt(void)
+{
+       return SKEIN_UNROLL_256;
+}
+#endif
+#endif
+
+/*****************************  Skein_512 ******************************/
+#if !(SKEIN_USE_ASM & 512)
+void Skein_512_Process_Block(struct skein_512_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd)
+{ /* do it in C */
+       enum {
+               WCNT = SKEIN_512_STATE_WORDS
+       };
+#undef  RCNT
+#define RCNT  (SKEIN_512_ROUNDS_TOTAL/8)
+
+#ifdef SKEIN_LOOP /* configure how much to unroll the loop */
+#define SKEIN_UNROLL_512 (((SKEIN_LOOP)/10)%10)
+#else
+#define SKEIN_UNROLL_512 (0)
+#endif
+
+#if SKEIN_UNROLL_512
+#if (RCNT % SKEIN_UNROLL_512)
+#error "Invalid SKEIN_UNROLL_512" /* sanity check on unroll count */
+#endif
+       size_t  r;
+       u64  kw[WCNT+4+RCNT*2]; /* key sched: chaining vars + tweak + "rot"*/
+#else
+       u64  kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
+#endif
+       u64  X0, X1, X2, X3, X4, X5, X6, X7; /* local copies, for speed */
+       u64  w[WCNT]; /* local copy of input block */
+#ifdef SKEIN_DEBUG
+       const u64 *Xptr[8]; /* use for debugging (help cc put Xn in regs) */
+       Xptr[0] = &X0;  Xptr[1] = &X1;  Xptr[2] = &X2;  Xptr[3] = &X3;
+       Xptr[4] = &X4;  Xptr[5] = &X5;  Xptr[6] = &X6;  Xptr[7] = &X7;
+#endif
+
+       Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
+       ts[0] = ctx->h.T[0];
+       ts[1] = ctx->h.T[1];
+       do  {
+               /*
+                * this implementation only supports 2**64 input bytes
+                * (no carry out here)
+                */
+               ts[0] += byteCntAdd; /* update processed length */
+
+               /* precompute the key schedule for this block */
+               ks[0] = ctx->X[0];
+               ks[1] = ctx->X[1];
+               ks[2] = ctx->X[2];
+               ks[3] = ctx->X[3];
+               ks[4] = ctx->X[4];
+               ks[5] = ctx->X[5];
+               ks[6] = ctx->X[6];
+               ks[7] = ctx->X[7];
+               ks[8] = ks[0] ^ ks[1] ^ ks[2] ^ ks[3] ^
+                       ks[4] ^ ks[5] ^ ks[6] ^ ks[7] ^ SKEIN_KS_PARITY;
+
+               ts[2] = ts[0] ^ ts[1];
+
+               /* get input block in little-endian format */
+               Skein_Get64_LSB_First(w, blkPtr, WCNT);
+               DebugSaveTweak(ctx);
+               Skein_Show_Block(BLK_BITS, &ctx->h, ctx->X, blkPtr, w, ks, ts);
+
+               X0   = w[0] + ks[0]; /* do the first full key injection */
+               X1   = w[1] + ks[1];
+               X2   = w[2] + ks[2];
+               X3   = w[3] + ks[3];
+               X4   = w[4] + ks[4];
+               X5   = w[5] + ks[5] + ts[0];
+               X6   = w[6] + ks[6] + ts[1];
+               X7   = w[7] + ks[7];
+
+               blkPtr += SKEIN_512_BLOCK_BYTES;
+
+               Skein_Show_R_Ptr(BLK_BITS, &ctx->h, SKEIN_RND_KEY_INITIAL,
+                                Xptr);
+               /* run the rounds */
+#define Round512(p0, p1, p2, p3, p4, p5, p6, p7, ROT, rNum) \
+do { \
+       X##p0 += X##p1; X##p1 = RotL_64(X##p1, ROT##_0); X##p1 ^= X##p0; \
+       X##p2 += X##p3; X##p3 = RotL_64(X##p3, ROT##_1); X##p3 ^= X##p2; \
+       X##p4 += X##p5; X##p5 = RotL_64(X##p5, ROT##_2); X##p5 ^= X##p4; \
+       X##p6 += X##p7; X##p7 = RotL_64(X##p7, ROT##_3); X##p7 ^= X##p6; \
+} while (0)
+
+#if SKEIN_UNROLL_512 == 0
+#define R512(p0, p1, p2, p3, p4, p5, p6, p7, ROT, rNum) /* unrolled */ \
+do { \
+       Round512(p0, p1, p2, p3, p4, p5, p6, p7, ROT, rNum) \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, rNum, Xptr); \
+} while (0)
+
+#define I512(R) \
+do { \
+       /* inject the key schedule value */ \
+       X0   += ks[((R) + 1) % 9]; \
+       X1   += ks[((R) + 2) % 9]; \
+       X2   += ks[((R) + 3) % 9]; \
+       X3   += ks[((R) + 4) % 9]; \
+       X4   += ks[((R) + 5) % 9]; \
+       X5   += ks[((R) + 6) % 9] + ts[((R) + 1) % 3]; \
+       X6   += ks[((R) + 7) % 9] + ts[((R) + 2) % 3]; \
+       X7   += ks[((R) + 8) % 9] +     (R) + 1;       \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, SKEIN_RND_KEY_INJECT, Xptr); \
+} while (0)
+#else /* looping version */
+#define R512(p0, p1, p2, p3, p4, p5, p6, p7, ROT, rNum) \
+do { \
+       Round512(p0, p1, p2, p3, p4, p5, p6, p7, ROT, rNum) \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, 4 * (r - 1) + rNum, Xptr); \
+} while (0)
+
+#define I512(R) \
+do { \
+       /* inject the key schedule value */ \
+       X0   += ks[r + (R) + 0]; \
+       X1   += ks[r + (R) + 1]; \
+       X2   += ks[r + (R) + 2]; \
+       X3   += ks[r + (R) + 3]; \
+       X4   += ks[r + (R) + 4]; \
+       X5   += ks[r + (R) + 5] + ts[r + (R) + 0]; \
+       X6   += ks[r + (R) + 6] + ts[r + (R) + 1]; \
+       X7   += ks[r + (R) + 7] +         r + (R); \
+       /* rotate key schedule */ \
+       ks[r +         (R) + 8] = ks[r + (R) - 1]; \
+       ts[r +         (R) + 2] = ts[r + (R) - 1]; \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, SKEIN_RND_KEY_INJECT, Xptr); \
+} while (0)
+
+               for (r = 1; r < 2 * RCNT; r += 2 * SKEIN_UNROLL_512)
+#endif /* end of looped code definitions */
+               {
+#define R512_8_rounds(R)  /* do 8 full rounds */  \
+do { \
+               R512(0, 1, 2, 3, 4, 5, 6, 7, R_512_0, 8 * (R) + 1);   \
+               R512(2, 1, 4, 7, 6, 5, 0, 3, R_512_1, 8 * (R) + 2);   \
+               R512(4, 1, 6, 3, 0, 5, 2, 7, R_512_2, 8 * (R) + 3);   \
+               R512(6, 1, 0, 7, 2, 5, 4, 3, R_512_3, 8 * (R) + 4);   \
+               I512(2 * (R));                              \
+               R512(0, 1, 2, 3, 4, 5, 6, 7, R_512_4, 8 * (R) + 5);   \
+               R512(2, 1, 4, 7, 6, 5, 0, 3, R_512_5, 8 * (R) + 6);   \
+               R512(4, 1, 6, 3, 0, 5, 2, 7, R_512_6, 8 * (R) + 7);   \
+               R512(6, 1, 0, 7, 2, 5, 4, 3, R_512_7, 8 * (R) + 8);   \
+               I512(2 * (R) + 1);        /* and key injection */ \
+} while (0)
+
+                       R512_8_rounds(0);
+
+#define R512_Unroll_R(NN) \
+               ((SKEIN_UNROLL_512 == 0 && \
+                 SKEIN_512_ROUNDS_TOTAL/8 > (NN)) || \
+                (SKEIN_UNROLL_512 > (NN)))
+
+       #if   R512_Unroll_R(1)
+                       R512_8_rounds(1);
+       #endif
+       #if   R512_Unroll_R(2)
+                       R512_8_rounds(2);
+       #endif
+       #if   R512_Unroll_R(3)
+                       R512_8_rounds(3);
+       #endif
+       #if   R512_Unroll_R(4)
+                       R512_8_rounds(4);
+       #endif
+       #if   R512_Unroll_R(5)
+                       R512_8_rounds(5);
+       #endif
+       #if   R512_Unroll_R(6)
+                       R512_8_rounds(6);
+       #endif
+       #if   R512_Unroll_R(7)
+                       R512_8_rounds(7);
+       #endif
+       #if   R512_Unroll_R(8)
+                       R512_8_rounds(8);
+       #endif
+       #if   R512_Unroll_R(9)
+                       R512_8_rounds(9);
+       #endif
+       #if   R512_Unroll_R(10)
+                       R512_8_rounds(10);
+       #endif
+       #if   R512_Unroll_R(11)
+                       R512_8_rounds(11);
+       #endif
+       #if   R512_Unroll_R(12)
+                       R512_8_rounds(12);
+       #endif
+       #if   R512_Unroll_R(13)
+                       R512_8_rounds(13);
+       #endif
+       #if   R512_Unroll_R(14)
+                       R512_8_rounds(14);
+       #endif
+       #if  (SKEIN_UNROLL_512 > 14)
+#error  "need more unrolling in Skein_512_Process_Block"
+       #endif
+               }
+
+               /* do the final "feedforward" xor, update context chaining */
+               ctx->X[0] = X0 ^ w[0];
+               ctx->X[1] = X1 ^ w[1];
+               ctx->X[2] = X2 ^ w[2];
+               ctx->X[3] = X3 ^ w[3];
+               ctx->X[4] = X4 ^ w[4];
+               ctx->X[5] = X5 ^ w[5];
+               ctx->X[6] = X6 ^ w[6];
+               ctx->X[7] = X7 ^ w[7];
+               Skein_Show_Round(BLK_BITS, &ctx->h, SKEIN_RND_FEED_FWD, ctx->X);
+
+               ts[1] &= ~SKEIN_T1_FLAG_FIRST;
+       } while (--blkCnt);
+       ctx->h.T[0] = ts[0];
+       ctx->h.T[1] = ts[1];
+}
+
+#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
+size_t Skein_512_Process_Block_CodeSize(void)
+{
+       return ((u8 *) Skein_512_Process_Block_CodeSize) -
+               ((u8 *) Skein_512_Process_Block);
+}
+unsigned int Skein_512_Unroll_Cnt(void)
+{
+       return SKEIN_UNROLL_512;
+}
+#endif
+#endif
+
+/*****************************  Skein1024 ******************************/
+#if !(SKEIN_USE_ASM & 1024)
+void Skein1024_Process_Block(struct skein1024_ctx *ctx, const u8 *blkPtr,
+                               size_t blkCnt, size_t byteCntAdd)
+{ /* do it in C, always looping (unrolled is bigger AND slower!) */
+       enum {
+               WCNT = SKEIN1024_STATE_WORDS
+       };
+#undef  RCNT
+#define RCNT  (SKEIN1024_ROUNDS_TOTAL/8)
+
+#ifdef SKEIN_LOOP /* configure how much to unroll the loop */
+#define SKEIN_UNROLL_1024 ((SKEIN_LOOP)%10)
+#else
+#define SKEIN_UNROLL_1024 (0)
+#endif
+
+#if (SKEIN_UNROLL_1024 != 0)
+#if (RCNT % SKEIN_UNROLL_1024)
+#error "Invalid SKEIN_UNROLL_1024" /* sanity check on unroll count */
+#endif
+       size_t  r;
+       u64  kw[WCNT+4+RCNT*2]; /* key sched: chaining vars + tweak + "rot" */
+#else
+       u64  kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
+#endif
+
+       /* local copy of vars, for speed */
+       u64  X00, X01, X02, X03, X04, X05, X06, X07,
+            X08, X09, X10, X11, X12, X13, X14, X15;
+       u64  w[WCNT]; /* local copy of input block */
+#ifdef SKEIN_DEBUG
+       const u64 *Xptr[16]; /* use for debugging (help cc put Xn in regs) */
+       Xptr[0]  = &X00;  Xptr[1]  = &X01;  Xptr[2]  = &X02;  Xptr[3]  = &X03;
+       Xptr[4]  = &X04;  Xptr[5]  = &X05;  Xptr[6]  = &X06;  Xptr[7]  = &X07;
+       Xptr[8]  = &X08;  Xptr[9]  = &X09;  Xptr[10] = &X10;  Xptr[11] = &X11;
+       Xptr[12] = &X12;  Xptr[13] = &X13;  Xptr[14] = &X14;  Xptr[15] = &X15;
+#endif
+
+       Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
+       ts[0] = ctx->h.T[0];
+       ts[1] = ctx->h.T[1];
+       do  {
+               /*
+                * this implementation only supports 2**64 input bytes
+                * (no carry out here)
+                */
+               ts[0] += byteCntAdd; /* update processed length */
+
+               /* precompute the key schedule for this block */
+               ks[0]  = ctx->X[0];
+               ks[1]  = ctx->X[1];
+               ks[2]  = ctx->X[2];
+               ks[3]  = ctx->X[3];
+               ks[4]  = ctx->X[4];
+               ks[5]  = ctx->X[5];
+               ks[6]  = ctx->X[6];
+               ks[7]  = ctx->X[7];
+               ks[8]  = ctx->X[8];
+               ks[9]  = ctx->X[9];
+               ks[10] = ctx->X[10];
+               ks[11] = ctx->X[11];
+               ks[12] = ctx->X[12];
+               ks[13] = ctx->X[13];
+               ks[14] = ctx->X[14];
+               ks[15] = ctx->X[15];
+               ks[16] =  ks[0] ^  ks[1] ^  ks[2] ^  ks[3] ^
+                         ks[4] ^  ks[5] ^  ks[6] ^  ks[7] ^
+                         ks[8] ^  ks[9] ^ ks[10] ^ ks[11] ^
+                         ks[12] ^ ks[13] ^ ks[14] ^ ks[15] ^ SKEIN_KS_PARITY;
+
+               ts[2]  = ts[0] ^ ts[1];
+
+               /* get input block in little-endian format */
+               Skein_Get64_LSB_First(w, blkPtr, WCNT);
+               DebugSaveTweak(ctx);
+               Skein_Show_Block(BLK_BITS, &ctx->h, ctx->X, blkPtr, w, ks, ts);
+
+               X00    =  w[0] +  ks[0]; /* do the first full key injection */
+               X01    =  w[1] +  ks[1];
+               X02    =  w[2] +  ks[2];
+               X03    =  w[3] +  ks[3];
+               X04    =  w[4] +  ks[4];
+               X05    =  w[5] +  ks[5];
+               X06    =  w[6] +  ks[6];
+               X07    =  w[7] +  ks[7];
+               X08    =  w[8] +  ks[8];
+               X09    =  w[9] +  ks[9];
+               X10    = w[10] + ks[10];
+               X11    = w[11] + ks[11];
+               X12    = w[12] + ks[12];
+               X13    = w[13] + ks[13] + ts[0];
+               X14    = w[14] + ks[14] + ts[1];
+               X15    = w[15] + ks[15];
+
+               Skein_Show_R_Ptr(BLK_BITS, &ctx->h, SKEIN_RND_KEY_INITIAL,
+                                Xptr);
+
+#define Round1024(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pA, pB, pC, pD, pE, \
+                       pF, ROT, rNum) \
+do { \
+       X##p0 += X##p1; X##p1 = RotL_64(X##p1, ROT##_0); X##p1 ^= X##p0;   \
+       X##p2 += X##p3; X##p3 = RotL_64(X##p3, ROT##_1); X##p3 ^= X##p2;   \
+       X##p4 += X##p5; X##p5 = RotL_64(X##p5, ROT##_2); X##p5 ^= X##p4;   \
+       X##p6 += X##p7; X##p7 = RotL_64(X##p7, ROT##_3); X##p7 ^= X##p6;   \
+       X##p8 += X##p9; X##p9 = RotL_64(X##p9, ROT##_4); X##p9 ^= X##p8;   \
+       X##pA += X##pB; X##pB = RotL_64(X##pB, ROT##_5); X##pB ^= X##pA;   \
+       X##pC += X##pD; X##pD = RotL_64(X##pD, ROT##_6); X##pD ^= X##pC;   \
+       X##pE += X##pF; X##pF = RotL_64(X##pF, ROT##_7); X##pF ^= X##pE;   \
+} while (0)
+
+#if SKEIN_UNROLL_1024 == 0
+#define R1024(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pA, pB, pC, pD, pE, pF, \
+               ROT, rn) \
+do { \
+       Round1024(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pA, pB, pC, pD, pE, \
+                       pF, ROT, rn) \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, rn, Xptr); \
+} while (0)
+
+#define I1024(R) \
+do { \
+       /* inject the key schedule value */ \
+       X00   += ks[((R) +  1) % 17]; \
+       X01   += ks[((R) +  2) % 17]; \
+       X02   += ks[((R) +  3) % 17]; \
+       X03   += ks[((R) +  4) % 17]; \
+       X04   += ks[((R) +  5) % 17]; \
+       X05   += ks[((R) +  6) % 17]; \
+       X06   += ks[((R) +  7) % 17]; \
+       X07   += ks[((R) +  8) % 17]; \
+       X08   += ks[((R) +  9) % 17]; \
+       X09   += ks[((R) + 10) % 17]; \
+       X10   += ks[((R) + 11) % 17]; \
+       X11   += ks[((R) + 12) % 17]; \
+       X12   += ks[((R) + 13) % 17]; \
+       X13   += ks[((R) + 14) % 17] + ts[((R) + 1) % 3]; \
+       X14   += ks[((R) + 15) % 17] + ts[((R) + 2) % 3]; \
+       X15   += ks[((R) + 16) % 17] +     (R) + 1;       \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, SKEIN_RND_KEY_INJECT, Xptr); \
+} while (0)
+#else /* looping version */
+#define R1024(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pA, pB, pC, pD, pE, pF, \
+               ROT, rn) \
+do { \
+       Round1024(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pA, pB, pC, pD, pE, \
+                       pF, ROT, rn) \
+       Skein_Show_R_Ptr(BLK_BITS, &ctx->h, 4 * (r - 1) + rn, Xptr); \
+} while (0)
+
+#define I1024(R) \
+do { \
+       /* inject the key schedule value */ \
+       X00   += ks[r + (R) +  0]; \
+       X01   += ks[r + (R) +  1]; \
+       X02   += ks[r + (R) +  2]; \
+       X03   += ks[r + (R) +  3]; \
+       X04   += ks[r + (R) +  4]; \
+       X05   += ks[r + (R) +  5]; \
+       X06   += ks[r + (R) +  6]; \
+       X07   += ks[r + (R) +  7]; \
+       X08   += ks[r + (R) +  8]; \
+       X09   += ks[r + (R) +  9]; \
+       X10   += ks[r + (R) + 10]; \
+       X11   += ks[r + (R) + 11]; \
+       X12   += ks[r + (R) + 12]; \
+       X13   += ks[r + (R) + 13] + ts[r + (R) + 0]; \
+       X14   += ks[r + (R) + 14] + ts[r + (R) + 1]; \
+       X15   += ks[r + (R) + 15] +         r + (R); \
+       /* rotate key schedule */ \
+       ks[r  +         (R) + 16] = ks[r + (R) - 1]; \
+       ts[r  +         (R) +  2] = ts[r + (R) - 1]; \
+       Skein_Show_R_Ptr(BLK_BITSi, &ctx->h, SKEIN_RND_KEY_INJECT, Xptr); \
+} while (0)
+
+               for (r = 1; r <= 2 * RCNT; r += 2 * SKEIN_UNROLL_1024)
+#endif
+               {
+#define R1024_8_rounds(R) \
+do { \
+       R1024(00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, \
+               R1024_0, 8*(R) + 1); \
+       R1024(00, 09, 02, 13, 06, 11, 04, 15, 10, 07, 12, 03, 14, 05, 08, 01, \
+               R1024_1, 8*(R) + 2); \
+       R1024(00, 07, 02, 05, 04, 03, 06, 01, 12, 15, 14, 13, 08, 11, 10, 09, \
+               R1024_2, 8*(R) + 3); \
+       R1024(00, 15, 02, 11, 06, 13, 04, 09, 14, 01, 08, 05, 10, 03, 12, 07, \
+               R1024_3, 8*(R) + 4); \
+       I1024(2*(R)); \
+       R1024(00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, \
+               R1024_4, 8*(R) + 5); \
+       R1024(00, 09, 02, 13, 06, 11, 04, 15, 10, 07, 12, 03, 14, 05, 08, 01, \
+               R1024_5, 8*(R) + 6); \
+       R1024(00, 07, 02, 05, 04, 03, 06, 01, 12, 15, 14, 13, 08, 11, 10, 09, \
+               R1024_6, 8*(R) + 7); \
+       R1024(00, 15, 02, 11, 06, 13, 04, 09, 14, 01, 08, 05, 10, 03, 12, 07, \
+               R1024_7, 8*(R) + 8); \
+       I1024(2*(R)+1); \
+} while (0)
+
+                       R1024_8_rounds(0);
+
+#define R1024_Unroll_R(NN) \
+               ((SKEIN_UNROLL_1024 == 0 && \
+                 SKEIN1024_ROUNDS_TOTAL/8 > (NN)) || \
+                (SKEIN_UNROLL_1024 > (NN)))
+
+       #if   R1024_Unroll_R(1)
+                       R1024_8_rounds(1);
+       #endif
+       #if   R1024_Unroll_R(2)
+                       R1024_8_rounds(2);
+       #endif
+       #if   R1024_Unroll_R(3)
+                       R1024_8_rounds(3);
+       #endif
+       #if   R1024_Unroll_R(4)
+                       R1024_8_rounds(4);
+       #endif
+       #if   R1024_Unroll_R(5)
+                       R1024_8_rounds(5);
+       #endif
+       #if   R1024_Unroll_R(6)
+                       R1024_8_rounds(6);
+       #endif
+       #if   R1024_Unroll_R(7)
+                       R1024_8_rounds(7);
+       #endif
+       #if   R1024_Unroll_R(8)
+                       R1024_8_rounds(8);
+       #endif
+       #if   R1024_Unroll_R(9)
+                       R1024_8_rounds(9);
+       #endif
+       #if   R1024_Unroll_R(10)
+                       R1024_8_rounds(10);
+       #endif
+       #if   R1024_Unroll_R(11)
+                       R1024_8_rounds(11);
+       #endif
+       #if   R1024_Unroll_R(12)
+                       R1024_8_rounds(12);
+       #endif
+       #if   R1024_Unroll_R(13)
+                       R1024_8_rounds(13);
+       #endif
+       #if   R1024_Unroll_R(14)
+                       R1024_8_rounds(14);
+       #endif
+#if  (SKEIN_UNROLL_1024 > 14)
+#error  "need more unrolling in Skein_1024_Process_Block"
+  #endif
+               }
+               /* do the final "feedforward" xor, update context chaining */
+
+               ctx->X[0] = X00 ^ w[0];
+               ctx->X[1] = X01 ^ w[1];
+               ctx->X[2] = X02 ^ w[2];
+               ctx->X[3] = X03 ^ w[3];
+               ctx->X[4] = X04 ^ w[4];
+               ctx->X[5] = X05 ^ w[5];
+               ctx->X[6] = X06 ^ w[6];
+               ctx->X[7] = X07 ^ w[7];
+               ctx->X[8] = X08 ^ w[8];
+               ctx->X[9] = X09 ^ w[9];
+               ctx->X[10] = X10 ^ w[10];
+               ctx->X[11] = X11 ^ w[11];
+               ctx->X[12] = X12 ^ w[12];
+               ctx->X[13] = X13 ^ w[13];
+               ctx->X[14] = X14 ^ w[14];
+               ctx->X[15] = X15 ^ w[15];
+
+               Skein_Show_Round(BLK_BITS, &ctx->h, SKEIN_RND_FEED_FWD, ctx->X);
+
+               ts[1] &= ~SKEIN_T1_FLAG_FIRST;
+               blkPtr += SKEIN1024_BLOCK_BYTES;
+       } while (--blkCnt);
+       ctx->h.T[0] = ts[0];
+       ctx->h.T[1] = ts[1];
+}
+
+#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
+size_t Skein1024_Process_Block_CodeSize(void)
+{
+       return ((u8 *) Skein1024_Process_Block_CodeSize) -
+               ((u8 *) Skein1024_Process_Block);
+}
+unsigned int Skein1024_Unroll_Cnt(void)
+{
+       return SKEIN_UNROLL_1024;
+}
+#endif
+#endif
diff --git a/drivers/staging/skein/threefish1024Block.c b/drivers/staging/skein/threefish1024Block.c
new file mode 100644 (file)
index 0000000..fe7517b
--- /dev/null
@@ -0,0 +1,4900 @@
+#include <linux/string.h>
+#include <threefishApi.h>
+
+
+void threefishEncrypt1024(struct threefish_key *keyCtx, u64 *input, u64 *output)
+{
+       u64 b0 = input[0], b1 = input[1],
+         b2 = input[2], b3 = input[3],
+         b4 = input[4], b5 = input[5],
+         b6 = input[6], b7 = input[7],
+         b8 = input[8], b9 = input[9],
+         b10 = input[10], b11 = input[11],
+         b12 = input[12], b13 = input[13],
+         b14 = input[14], b15 = input[15];
+       u64 k0 = keyCtx->key[0], k1 = keyCtx->key[1],
+         k2 = keyCtx->key[2], k3 = keyCtx->key[3],
+         k4 = keyCtx->key[4], k5 = keyCtx->key[5],
+         k6 = keyCtx->key[6], k7 = keyCtx->key[7],
+         k8 = keyCtx->key[8], k9 = keyCtx->key[9],
+         k10 = keyCtx->key[10], k11 = keyCtx->key[11],
+         k12 = keyCtx->key[12], k13 = keyCtx->key[13],
+         k14 = keyCtx->key[14], k15 = keyCtx->key[15],
+         k16 = keyCtx->key[16];
+       u64 t0 = keyCtx->tweak[0], t1 = keyCtx->tweak[1],
+         t2 = keyCtx->tweak[2];
+
+       b1 += k1;
+       b0 += b1 + k0;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k3;
+       b2 += b3 + k2;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k5;
+       b4 += b5 + k4;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k7;
+       b6 += b7 + k6;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k9;
+       b8 += b9 + k8;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k11;
+       b10 += b11 + k10;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k13 + t0;
+       b12 += b13 + k12;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k15;
+       b14 += b15 + k14 + t1;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k2;
+       b0 += b1 + k1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k4;
+       b2 += b3 + k3;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k6;
+       b4 += b5 + k5;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k8;
+       b6 += b7 + k7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k10;
+       b8 += b9 + k9;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k12;
+       b10 += b11 + k11;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k14 + t1;
+       b12 += b13 + k13;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k16 + 1;
+       b14 += b15 + k15 + t2;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k3;
+       b0 += b1 + k2;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k5;
+       b2 += b3 + k4;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k7;
+       b4 += b5 + k6;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k9;
+       b6 += b7 + k8;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k11;
+       b8 += b9 + k10;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k13;
+       b10 += b11 + k12;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k15 + t2;
+       b12 += b13 + k14;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k0 + 2;
+       b14 += b15 + k16 + t0;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k4;
+       b0 += b1 + k3;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k6;
+       b2 += b3 + k5;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k8;
+       b4 += b5 + k7;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k10;
+       b6 += b7 + k9;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k12;
+       b8 += b9 + k11;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k14;
+       b10 += b11 + k13;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k16 + t0;
+       b12 += b13 + k15;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k1 + 3;
+       b14 += b15 + k0 + t1;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k5;
+       b0 += b1 + k4;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k7;
+       b2 += b3 + k6;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k9;
+       b4 += b5 + k8;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k11;
+       b6 += b7 + k10;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k13;
+       b8 += b9 + k12;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k15;
+       b10 += b11 + k14;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k0 + t1;
+       b12 += b13 + k16;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k2 + 4;
+       b14 += b15 + k1 + t2;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k6;
+       b0 += b1 + k5;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k8;
+       b2 += b3 + k7;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k10;
+       b4 += b5 + k9;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k12;
+       b6 += b7 + k11;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k14;
+       b8 += b9 + k13;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k16;
+       b10 += b11 + k15;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k1 + t2;
+       b12 += b13 + k0;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k3 + 5;
+       b14 += b15 + k2 + t0;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k7;
+       b0 += b1 + k6;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k9;
+       b2 += b3 + k8;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k11;
+       b4 += b5 + k10;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k13;
+       b6 += b7 + k12;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k15;
+       b8 += b9 + k14;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k0;
+       b10 += b11 + k16;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k2 + t0;
+       b12 += b13 + k1;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k4 + 6;
+       b14 += b15 + k3 + t1;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k8;
+       b0 += b1 + k7;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k10;
+       b2 += b3 + k9;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k12;
+       b4 += b5 + k11;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k14;
+       b6 += b7 + k13;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k16;
+       b8 += b9 + k15;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k1;
+       b10 += b11 + k0;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k3 + t1;
+       b12 += b13 + k2;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k5 + 7;
+       b14 += b15 + k4 + t2;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k9;
+       b0 += b1 + k8;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k11;
+       b2 += b3 + k10;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k13;
+       b4 += b5 + k12;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k15;
+       b6 += b7 + k14;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k0;
+       b8 += b9 + k16;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k2;
+       b10 += b11 + k1;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k4 + t2;
+       b12 += b13 + k3;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k6 + 8;
+       b14 += b15 + k5 + t0;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k10;
+       b0 += b1 + k9;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k12;
+       b2 += b3 + k11;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k14;
+       b4 += b5 + k13;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k16;
+       b6 += b7 + k15;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k1;
+       b8 += b9 + k0;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k3;
+       b10 += b11 + k2;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k5 + t0;
+       b12 += b13 + k4;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k7 + 9;
+       b14 += b15 + k6 + t1;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k11;
+       b0 += b1 + k10;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k13;
+       b2 += b3 + k12;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k15;
+       b4 += b5 + k14;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k0;
+       b6 += b7 + k16;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k2;
+       b8 += b9 + k1;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k4;
+       b10 += b11 + k3;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k6 + t1;
+       b12 += b13 + k5;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k8 + 10;
+       b14 += b15 + k7 + t2;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k12;
+       b0 += b1 + k11;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k14;
+       b2 += b3 + k13;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k16;
+       b4 += b5 + k15;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k1;
+       b6 += b7 + k0;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k3;
+       b8 += b9 + k2;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k5;
+       b10 += b11 + k4;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k7 + t2;
+       b12 += b13 + k6;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k9 + 11;
+       b14 += b15 + k8 + t0;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k13;
+       b0 += b1 + k12;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k15;
+       b2 += b3 + k14;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k0;
+       b4 += b5 + k16;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k2;
+       b6 += b7 + k1;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k4;
+       b8 += b9 + k3;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k6;
+       b10 += b11 + k5;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k8 + t0;
+       b12 += b13 + k7;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k10 + 12;
+       b14 += b15 + k9 + t1;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k14;
+       b0 += b1 + k13;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k16;
+       b2 += b3 + k15;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k1;
+       b4 += b5 + k0;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k3;
+       b6 += b7 + k2;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k5;
+       b8 += b9 + k4;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k7;
+       b10 += b11 + k6;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k9 + t1;
+       b12 += b13 + k8;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k11 + 13;
+       b14 += b15 + k10 + t2;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k15;
+       b0 += b1 + k14;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k0;
+       b2 += b3 + k16;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k2;
+       b4 += b5 + k1;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k4;
+       b6 += b7 + k3;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k6;
+       b8 += b9 + k5;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k8;
+       b10 += b11 + k7;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k10 + t2;
+       b12 += b13 + k9;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k12 + 14;
+       b14 += b15 + k11 + t0;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k16;
+       b0 += b1 + k15;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k1;
+       b2 += b3 + k0;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k3;
+       b4 += b5 + k2;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k5;
+       b6 += b7 + k4;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k7;
+       b8 += b9 + k6;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k9;
+       b10 += b11 + k8;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k11 + t0;
+       b12 += b13 + k10;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k13 + 15;
+       b14 += b15 + k12 + t1;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k0;
+       b0 += b1 + k16;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k2;
+       b2 += b3 + k1;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k4;
+       b4 += b5 + k3;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k6;
+       b6 += b7 + k5;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k8;
+       b8 += b9 + k7;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k10;
+       b10 += b11 + k9;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k12 + t1;
+       b12 += b13 + k11;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k14 + 16;
+       b14 += b15 + k13 + t2;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k1;
+       b0 += b1 + k0;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k3;
+       b2 += b3 + k2;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k5;
+       b4 += b5 + k4;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k7;
+       b6 += b7 + k6;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k9;
+       b8 += b9 + k8;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k11;
+       b10 += b11 + k10;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k13 + t2;
+       b12 += b13 + k12;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k15 + 17;
+       b14 += b15 + k14 + t0;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       b1 += k2;
+       b0 += b1 + k1;
+       b1 = ((b1 << 24) | (b1 >> (64 - 24))) ^ b0;
+
+       b3 += k4;
+       b2 += b3 + k3;
+       b3 = ((b3 << 13) | (b3 >> (64 - 13))) ^ b2;
+
+       b5 += k6;
+       b4 += b5 + k5;
+       b5 = ((b5 << 8) | (b5 >> (64 - 8))) ^ b4;
+
+       b7 += k8;
+       b6 += b7 + k7;
+       b7 = ((b7 << 47) | (b7 >> (64 - 47))) ^ b6;
+
+       b9 += k10;
+       b8 += b9 + k9;
+       b9 = ((b9 << 8) | (b9 >> (64 - 8))) ^ b8;
+
+       b11 += k12;
+       b10 += b11 + k11;
+       b11 = ((b11 << 17) | (b11 >> (64 - 17))) ^ b10;
+
+       b13 += k14 + t0;
+       b12 += b13 + k13;
+       b13 = ((b13 << 22) | (b13 >> (64 - 22))) ^ b12;
+
+       b15 += k16 + 18;
+       b14 += b15 + k15 + t1;
+       b15 = ((b15 << 37) | (b15 >> (64 - 37))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 38) | (b9 >> (64 - 38))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 19) | (b13 >> (64 - 19))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 10) | (b11 >> (64 - 10))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 55) | (b15 >> (64 - 55))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 49) | (b7 >> (64 - 49))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 18) | (b3 >> (64 - 18))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 23) | (b5 >> (64 - 23))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 52) | (b1 >> (64 - 52))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 33) | (b7 >> (64 - 33))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 4) | (b5 >> (64 - 4))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 51) | (b3 >> (64 - 51))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 34) | (b15 >> (64 - 34))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 41) | (b13 >> (64 - 41))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 59) | (b11 >> (64 - 59))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 17) | (b9 >> (64 - 17))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 5) | (b15 >> (64 - 5))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 20) | (b11 >> (64 - 20))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 48) | (b13 >> (64 - 48))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 41) | (b9 >> (64 - 41))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 47) | (b1 >> (64 - 47))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 28) | (b5 >> (64 - 28))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 25) | (b7 >> (64 - 25))) ^ b12;
+
+       b1 += k3;
+       b0 += b1 + k2;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b0;
+
+       b3 += k5;
+       b2 += b3 + k4;
+       b3 = ((b3 << 9) | (b3 >> (64 - 9))) ^ b2;
+
+       b5 += k7;
+       b4 += b5 + k6;
+       b5 = ((b5 << 37) | (b5 >> (64 - 37))) ^ b4;
+
+       b7 += k9;
+       b6 += b7 + k8;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b6;
+
+       b9 += k11;
+       b8 += b9 + k10;
+       b9 = ((b9 << 12) | (b9 >> (64 - 12))) ^ b8;
+
+       b11 += k13;
+       b10 += b11 + k12;
+       b11 = ((b11 << 47) | (b11 >> (64 - 47))) ^ b10;
+
+       b13 += k15 + t1;
+       b12 += b13 + k14;
+       b13 = ((b13 << 44) | (b13 >> (64 - 44))) ^ b12;
+
+       b15 += k0 + 19;
+       b14 += b15 + k16 + t2;
+       b15 = ((b15 << 30) | (b15 >> (64 - 30))) ^ b14;
+
+       b0 += b9;
+       b9 = ((b9 << 16) | (b9 >> (64 - 16))) ^ b0;
+
+       b2 += b13;
+       b13 = ((b13 << 34) | (b13 >> (64 - 34))) ^ b2;
+
+       b6 += b11;
+       b11 = ((b11 << 56) | (b11 >> (64 - 56))) ^ b6;
+
+       b4 += b15;
+       b15 = ((b15 << 51) | (b15 >> (64 - 51))) ^ b4;
+
+       b10 += b7;
+       b7 = ((b7 << 4) | (b7 >> (64 - 4))) ^ b10;
+
+       b12 += b3;
+       b3 = ((b3 << 53) | (b3 >> (64 - 53))) ^ b12;
+
+       b14 += b5;
+       b5 = ((b5 << 42) | (b5 >> (64 - 42))) ^ b14;
+
+       b8 += b1;
+       b1 = ((b1 << 41) | (b1 >> (64 - 41))) ^ b8;
+
+       b0 += b7;
+       b7 = ((b7 << 31) | (b7 >> (64 - 31))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 44) | (b5 >> (64 - 44))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 47) | (b3 >> (64 - 47))) ^ b4;
+
+       b6 += b1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b6;
+
+       b12 += b15;
+       b15 = ((b15 << 19) | (b15 >> (64 - 19))) ^ b12;
+
+       b14 += b13;
+       b13 = ((b13 << 42) | (b13 >> (64 - 42))) ^ b14;
+
+       b8 += b11;
+       b11 = ((b11 << 44) | (b11 >> (64 - 44))) ^ b8;
+
+       b10 += b9;
+       b9 = ((b9 << 25) | (b9 >> (64 - 25))) ^ b10;
+
+       b0 += b15;
+       b15 = ((b15 << 9) | (b15 >> (64 - 9))) ^ b0;
+
+       b2 += b11;
+       b11 = ((b11 << 48) | (b11 >> (64 - 48))) ^ b2;
+
+       b6 += b13;
+       b13 = ((b13 << 35) | (b13 >> (64 - 35))) ^ b6;
+
+       b4 += b9;
+       b9 = ((b9 << 52) | (b9 >> (64 - 52))) ^ b4;
+
+       b14 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b14;
+
+       b8 += b5;
+       b5 = ((b5 << 31) | (b5 >> (64 - 31))) ^ b8;
+
+       b10 += b3;
+       b3 = ((b3 << 37) | (b3 >> (64 - 37))) ^ b10;
+
+       b12 += b7;
+       b7 = ((b7 << 20) | (b7 >> (64 - 20))) ^ b12;
+
+       output[0] = b0 + k3;
+       output[1] = b1 + k4;
+       output[2] = b2 + k5;
+       output[3] = b3 + k6;
+       output[4] = b4 + k7;
+       output[5] = b5 + k8;
+       output[6] = b6 + k9;
+       output[7] = b7 + k10;
+       output[8] = b8 + k11;
+       output[9] = b9 + k12;
+       output[10] = b10 + k13;
+       output[11] = b11 + k14;
+       output[12] = b12 + k15;
+       output[13] = b13 + k16 + t2;
+       output[14] = b14 + k0 + t0;
+       output[15] = b15 + k1 + 20;
+}
+
+void threefishDecrypt1024(struct threefish_key *keyCtx, u64 *input, u64 *output)
+{
+       u64 b0 = input[0], b1 = input[1],
+         b2 = input[2], b3 = input[3],
+         b4 = input[4], b5 = input[5],
+         b6 = input[6], b7 = input[7],
+         b8 = input[8], b9 = input[9],
+         b10 = input[10], b11 = input[11],
+         b12 = input[12], b13 = input[13],
+         b14 = input[14], b15 = input[15];
+       u64 k0 = keyCtx->key[0], k1 = keyCtx->key[1],
+         k2 = keyCtx->key[2], k3 = keyCtx->key[3],
+         k4 = keyCtx->key[4], k5 = keyCtx->key[5],
+         k6 = keyCtx->key[6], k7 = keyCtx->key[7],
+         k8 = keyCtx->key[8], k9 = keyCtx->key[9],
+         k10 = keyCtx->key[10], k11 = keyCtx->key[11],
+         k12 = keyCtx->key[12], k13 = keyCtx->key[13],
+         k14 = keyCtx->key[14], k15 = keyCtx->key[15],
+         k16 = keyCtx->key[16];
+       u64 t0 = keyCtx->tweak[0], t1 = keyCtx->tweak[1],
+         t2 = keyCtx->tweak[2];
+       u64 tmp;
+
+       b0 -= k3;
+       b1 -= k4;
+       b2 -= k5;
+       b3 -= k6;
+       b4 -= k7;
+       b5 -= k8;
+       b6 -= k9;
+       b7 -= k10;
+       b8 -= k11;
+       b9 -= k12;
+       b10 -= k13;
+       b11 -= k14;
+       b12 -= k15;
+       b13 -= k16 + t2;
+       b14 -= k0 + t0;
+       b15 -= k1 + 20;
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k16 + t2;
+       b15 -= k0 + 19;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k14;
+       b13 -= k15 + t1;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k12;
+       b11 -= k13;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k10;
+       b9 -= k11;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k8;
+       b7 -= k9;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k6;
+       b5 -= k7;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k4;
+       b3 -= k5;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k2;
+       b1 -= k3;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k15 + t1;
+       b15 -= k16 + 18;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k13;
+       b13 -= k14 + t0;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k11;
+       b11 -= k12;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k9;
+       b9 -= k10;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k7;
+       b7 -= k8;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k5;
+       b5 -= k6;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k3;
+       b3 -= k4;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k1;
+       b1 -= k2;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k14 + t0;
+       b15 -= k15 + 17;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k12;
+       b13 -= k13 + t2;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k10;
+       b11 -= k11;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k8;
+       b9 -= k9;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k6;
+       b7 -= k7;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k4;
+       b5 -= k5;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k2;
+       b3 -= k3;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k0;
+       b1 -= k1;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k13 + t2;
+       b15 -= k14 + 16;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k11;
+       b13 -= k12 + t1;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k9;
+       b11 -= k10;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k7;
+       b9 -= k8;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k5;
+       b7 -= k6;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k3;
+       b5 -= k4;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k1;
+       b3 -= k2;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k16;
+       b1 -= k0;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k12 + t1;
+       b15 -= k13 + 15;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k10;
+       b13 -= k11 + t0;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k8;
+       b11 -= k9;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k6;
+       b9 -= k7;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k4;
+       b7 -= k5;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k2;
+       b5 -= k3;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k0;
+       b3 -= k1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k15;
+       b1 -= k16;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k11 + t0;
+       b15 -= k12 + 14;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k9;
+       b13 -= k10 + t2;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k7;
+       b11 -= k8;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k5;
+       b9 -= k6;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k3;
+       b7 -= k4;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k1;
+       b5 -= k2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k16;
+       b3 -= k0;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k14;
+       b1 -= k15;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k10 + t2;
+       b15 -= k11 + 13;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k8;
+       b13 -= k9 + t1;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k6;
+       b11 -= k7;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k4;
+       b9 -= k5;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k2;
+       b7 -= k3;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k0;
+       b5 -= k1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k15;
+       b3 -= k16;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k13;
+       b1 -= k14;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k9 + t1;
+       b15 -= k10 + 12;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k7;
+       b13 -= k8 + t0;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k5;
+       b11 -= k6;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k3;
+       b9 -= k4;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k1;
+       b7 -= k2;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k16;
+       b5 -= k0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k14;
+       b3 -= k15;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k12;
+       b1 -= k13;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k8 + t0;
+       b15 -= k9 + 11;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k6;
+       b13 -= k7 + t2;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k4;
+       b11 -= k5;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k2;
+       b9 -= k3;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k0;
+       b7 -= k1;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k15;
+       b5 -= k16;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k13;
+       b3 -= k14;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k11;
+       b1 -= k12;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k7 + t2;
+       b15 -= k8 + 10;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k5;
+       b13 -= k6 + t1;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k3;
+       b11 -= k4;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k1;
+       b9 -= k2;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k16;
+       b7 -= k0;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k14;
+       b5 -= k15;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k12;
+       b3 -= k13;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k10;
+       b1 -= k11;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k6 + t1;
+       b15 -= k7 + 9;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k4;
+       b13 -= k5 + t0;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k2;
+       b11 -= k3;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k0;
+       b9 -= k1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k15;
+       b7 -= k16;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k13;
+       b5 -= k14;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k11;
+       b3 -= k12;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k9;
+       b1 -= k10;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k5 + t0;
+       b15 -= k6 + 8;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k3;
+       b13 -= k4 + t2;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k1;
+       b11 -= k2;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k16;
+       b9 -= k0;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k14;
+       b7 -= k15;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k12;
+       b5 -= k13;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k10;
+       b3 -= k11;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k8;
+       b1 -= k9;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k4 + t2;
+       b15 -= k5 + 7;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k2;
+       b13 -= k3 + t1;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k0;
+       b11 -= k1;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k15;
+       b9 -= k16;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k13;
+       b7 -= k14;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k11;
+       b5 -= k12;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k9;
+       b3 -= k10;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k7;
+       b1 -= k8;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k3 + t1;
+       b15 -= k4 + 6;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k1;
+       b13 -= k2 + t0;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k16;
+       b11 -= k0;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k14;
+       b9 -= k15;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k12;
+       b7 -= k13;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k10;
+       b5 -= k11;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k8;
+       b3 -= k9;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k6;
+       b1 -= k7;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k2 + t0;
+       b15 -= k3 + 5;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k0;
+       b13 -= k1 + t2;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k15;
+       b11 -= k16;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k13;
+       b9 -= k14;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k11;
+       b7 -= k12;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k9;
+       b5 -= k10;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k7;
+       b3 -= k8;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k5;
+       b1 -= k6;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k1 + t2;
+       b15 -= k2 + 4;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k16;
+       b13 -= k0 + t1;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k14;
+       b11 -= k15;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k12;
+       b9 -= k13;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k10;
+       b7 -= k11;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k8;
+       b5 -= k9;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k6;
+       b3 -= k7;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k4;
+       b1 -= k5;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k0 + t1;
+       b15 -= k1 + 3;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k15;
+       b13 -= k16 + t0;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k13;
+       b11 -= k14;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k11;
+       b9 -= k12;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k9;
+       b7 -= k10;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k7;
+       b5 -= k8;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k5;
+       b3 -= k6;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k3;
+       b1 -= k4;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k16 + t0;
+       b15 -= k0 + 2;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k14;
+       b13 -= k15 + t2;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k12;
+       b11 -= k13;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k10;
+       b9 -= k11;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k8;
+       b7 -= k9;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k6;
+       b5 -= k7;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k4;
+       b3 -= k5;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k2;
+       b1 -= k3;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 20) | (tmp << (64 - 20));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 37) | (tmp << (64 - 37));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 31) | (tmp << (64 - 31));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 52) | (tmp << (64 - 52));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 35) | (tmp << (64 - 35));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 48) | (tmp << (64 - 48));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 25) | (tmp << (64 - 25));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 44) | (tmp << (64 - 44));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 19) | (tmp << (64 - 19));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 47) | (tmp << (64 - 47));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 44) | (tmp << (64 - 44));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 42) | (tmp << (64 - 42));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 53) | (tmp << (64 - 53));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 4) | (tmp << (64 - 4));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 56) | (tmp << (64 - 56));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 34) | (tmp << (64 - 34));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 16) | (tmp << (64 - 16));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 30) | (tmp << (64 - 30));
+       b14 -= b15 + k15 + t2;
+       b15 -= k16 + 1;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 44) | (tmp << (64 - 44));
+       b12 -= b13 + k13;
+       b13 -= k14 + t1;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 47) | (tmp << (64 - 47));
+       b10 -= b11 + k11;
+       b11 -= k12;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 12) | (tmp << (64 - 12));
+       b8 -= b9 + k9;
+       b9 -= k10;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 31) | (tmp << (64 - 31));
+       b6 -= b7 + k7;
+       b7 -= k8;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 37) | (tmp << (64 - 37));
+       b4 -= b5 + k5;
+       b5 -= k6;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 9) | (tmp << (64 - 9));
+       b2 -= b3 + k3;
+       b3 -= k4;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 41) | (tmp << (64 - 41));
+       b0 -= b1 + k1;
+       b1 -= k2;
+
+       tmp = b7 ^ b12;
+       b7 = (tmp >> 25) | (tmp << (64 - 25));
+       b12 -= b7;
+
+       tmp = b3 ^ b10;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b10 -= b3;
+
+       tmp = b5 ^ b8;
+       b5 = (tmp >> 28) | (tmp << (64 - 28));
+       b8 -= b5;
+
+       tmp = b1 ^ b14;
+       b1 = (tmp >> 47) | (tmp << (64 - 47));
+       b14 -= b1;
+
+       tmp = b9 ^ b4;
+       b9 = (tmp >> 41) | (tmp << (64 - 41));
+       b4 -= b9;
+
+       tmp = b13 ^ b6;
+       b13 = (tmp >> 48) | (tmp << (64 - 48));
+       b6 -= b13;
+
+       tmp = b11 ^ b2;
+       b11 = (tmp >> 20) | (tmp << (64 - 20));
+       b2 -= b11;
+
+       tmp = b15 ^ b0;
+       b15 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b15;
+
+       tmp = b9 ^ b10;
+       b9 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b9;
+
+       tmp = b11 ^ b8;
+       b11 = (tmp >> 59) | (tmp << (64 - 59));
+       b8 -= b11;
+
+       tmp = b13 ^ b14;
+       b13 = (tmp >> 41) | (tmp << (64 - 41));
+       b14 -= b13;
+
+       tmp = b15 ^ b12;
+       b15 = (tmp >> 34) | (tmp << (64 - 34));
+       b12 -= b15;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b6 -= b1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 51) | (tmp << (64 - 51));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 4) | (tmp << (64 - 4));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 33) | (tmp << (64 - 33));
+       b0 -= b7;
+
+       tmp = b1 ^ b8;
+       b1 = (tmp >> 52) | (tmp << (64 - 52));
+       b8 -= b1;
+
+       tmp = b5 ^ b14;
+       b5 = (tmp >> 23) | (tmp << (64 - 23));
+       b14 -= b5;
+
+       tmp = b3 ^ b12;
+       b3 = (tmp >> 18) | (tmp << (64 - 18));
+       b12 -= b3;
+
+       tmp = b7 ^ b10;
+       b7 = (tmp >> 49) | (tmp << (64 - 49));
+       b10 -= b7;
+
+       tmp = b15 ^ b4;
+       b15 = (tmp >> 55) | (tmp << (64 - 55));
+       b4 -= b15;
+
+       tmp = b11 ^ b6;
+       b11 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b11;
+
+       tmp = b13 ^ b2;
+       b13 = (tmp >> 19) | (tmp << (64 - 19));
+       b2 -= b13;
+
+       tmp = b9 ^ b0;
+       b9 = (tmp >> 38) | (tmp << (64 - 38));
+       b0 -= b9;
+
+       tmp = b15 ^ b14;
+       b15 = (tmp >> 37) | (tmp << (64 - 37));
+       b14 -= b15 + k14 + t1;
+       b15 -= k15;
+
+       tmp = b13 ^ b12;
+       b13 = (tmp >> 22) | (tmp << (64 - 22));
+       b12 -= b13 + k12;
+       b13 -= k13 + t0;
+
+       tmp = b11 ^ b10;
+       b11 = (tmp >> 17) | (tmp << (64 - 17));
+       b10 -= b11 + k10;
+       b11 -= k11;
+
+       tmp = b9 ^ b8;
+       b9 = (tmp >> 8) | (tmp << (64 - 8));
+       b8 -= b9 + k8;
+       b9 -= k9;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 47) | (tmp << (64 - 47));
+       b6 -= b7 + k6;
+       b7 -= k7;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 8) | (tmp << (64 - 8));
+       b4 -= b5 + k4;
+       b5 -= k5;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b3 + k2;
+       b3 -= k3;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 24) | (tmp << (64 - 24));
+       b0 -= b1 + k0;
+       b1 -= k1;
+
+       output[15] = b15;
+       output[14] = b14;
+       output[13] = b13;
+       output[12] = b12;
+       output[11] = b11;
+       output[10] = b10;
+       output[9] = b9;
+       output[8] = b8;
+       output[7] = b7;
+       output[6] = b6;
+       output[5] = b5;
+       output[4] = b4;
+       output[3] = b3;
+       output[2] = b2;
+       output[1] = b1;
+       output[0] = b0;
+}
diff --git a/drivers/staging/skein/threefish256Block.c b/drivers/staging/skein/threefish256Block.c
new file mode 100644 (file)
index 0000000..2ae746a
--- /dev/null
@@ -0,0 +1,1137 @@
+#include <linux/string.h>
+#include <threefishApi.h>
+
+
+void threefishEncrypt256(struct threefish_key *keyCtx, u64 *input, u64 *output)
+{
+       u64 b0 = input[0], b1 = input[1],
+         b2 = input[2], b3 = input[3];
+       u64 k0 = keyCtx->key[0], k1 = keyCtx->key[1],
+         k2 = keyCtx->key[2], k3 = keyCtx->key[3],
+         k4 = keyCtx->key[4];
+       u64 t0 = keyCtx->tweak[0], t1 = keyCtx->tweak[1],
+         t2 = keyCtx->tweak[2];
+
+       b1 += k1 + t0;
+       b0 += b1 + k0;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k3;
+       b2 += b3 + k2 + t1;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k2 + t1;
+       b0 += b1 + k1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k4 + 1;
+       b2 += b3 + k3 + t2;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+
+       b1 += k3 + t2;
+       b0 += b1 + k2;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k0 + 2;
+       b2 += b3 + k4 + t0;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k4 + t0;
+       b0 += b1 + k3;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k1 + 3;
+       b2 += b3 + k0 + t1;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+
+       b1 += k0 + t1;
+       b0 += b1 + k4;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k2 + 4;
+       b2 += b3 + k1 + t2;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k1 + t2;
+       b0 += b1 + k0;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k3 + 5;
+       b2 += b3 + k2 + t0;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+
+       b1 += k2 + t0;
+       b0 += b1 + k1;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k4 + 6;
+       b2 += b3 + k3 + t1;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k3 + t1;
+       b0 += b1 + k2;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k0 + 7;
+       b2 += b3 + k4 + t2;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+
+       b1 += k4 + t2;
+       b0 += b1 + k3;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k1 + 8;
+       b2 += b3 + k0 + t0;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k0 + t0;
+       b0 += b1 + k4;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k2 + 9;
+       b2 += b3 + k1 + t1;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+
+       b1 += k1 + t1;
+       b0 += b1 + k0;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k3 + 10;
+       b2 += b3 + k2 + t2;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k2 + t2;
+       b0 += b1 + k1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k4 + 11;
+       b2 += b3 + k3 + t0;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+
+       b1 += k3 + t0;
+       b0 += b1 + k2;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k0 + 12;
+       b2 += b3 + k4 + t1;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k4 + t1;
+       b0 += b1 + k3;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k1 + 13;
+       b2 += b3 + k0 + t2;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+
+       b1 += k0 + t2;
+       b0 += b1 + k4;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k2 + 14;
+       b2 += b3 + k1 + t0;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k1 + t0;
+       b0 += b1 + k0;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k3 + 15;
+       b2 += b3 + k2 + t1;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+
+       b1 += k2 + t1;
+       b0 += b1 + k1;
+       b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
+
+       b3 += k4 + 16;
+       b2 += b3 + k3 + t2;
+       b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
+
+       b1 += k3 + t2;
+       b0 += b1 + k2;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
+
+       b3 += k0 + 17;
+       b2 += b3 + k4 + t0;
+       b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
+
+       b0 += b1;
+       b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
+
+       b2 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
+
+       b0 += b3;
+       b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
+
+       b2 += b1;
+       b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
+
+       output[0] = b0 + k3;
+       output[1] = b1 + k4 + t0;
+       output[2] = b2 + k0 + t1;
+       output[3] = b3 + k1 + 18;
+}
+
+void threefishDecrypt256(struct threefish_key *keyCtx, u64 *input, u64 *output)
+{
+       u64 b0 = input[0], b1 = input[1],
+         b2 = input[2], b3 = input[3];
+       u64 k0 = keyCtx->key[0], k1 = keyCtx->key[1],
+         k2 = keyCtx->key[2], k3 = keyCtx->key[3],
+         k4 = keyCtx->key[4];
+       u64 t0 = keyCtx->tweak[0], t1 = keyCtx->tweak[1],
+         t2 = keyCtx->tweak[2];
+
+       u64 tmp;
+
+       b0 -= k3;
+       b1 -= k4 + t0;
+       b2 -= k0 + t1;
+       b3 -= k1 + 18;
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k2;
+       b1 -= k3 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k4 + t0;
+       b3 -= k0 + 17;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k1;
+       b1 -= k2 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k3 + t2;
+       b3 -= k4 + 16;
+
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k0;
+       b1 -= k1 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k2 + t1;
+       b3 -= k3 + 15;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k4;
+       b1 -= k0 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k1 + t0;
+       b3 -= k2 + 14;
+
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k3;
+       b1 -= k4 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k0 + t2;
+       b3 -= k1 + 13;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k2;
+       b1 -= k3 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k4 + t1;
+       b3 -= k0 + 12;
+
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k1;
+       b1 -= k2 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k3 + t0;
+       b3 -= k4 + 11;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k0;
+       b1 -= k1 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k2 + t2;
+       b3 -= k3 + 10;
+
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k4;
+       b1 -= k0 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k1 + t1;
+       b3 -= k2 + 9;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k3;
+       b1 -= k4 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k0 + t0;
+       b3 -= k1 + 8;
+
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k2;
+       b1 -= k3 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k4 + t2;
+       b3 -= k0 + 7;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k1;
+       b1 -= k2 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k3 + t1;
+       b3 -= k4 + 6;
+
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k0;
+       b1 -= k1 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k2 + t0;
+       b3 -= k3 + 5;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k4;
+       b1 -= k0 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k1 + t2;
+       b3 -= k2 + 4;
+
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k3;
+       b1 -= k4 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k0 + t1;
+       b3 -= k1 + 3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k2;
+       b1 -= k3 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k4 + t0;
+       b3 -= k0 + 2;
+
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 32) | (tmp << (64 - 32));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 32) | (tmp << (64 - 32));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 58) | (tmp << (64 - 58));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 12) | (tmp << (64 - 12));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b0 -= b1 + k1;
+       b1 -= k2 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b3 + k3 + t2;
+       b3 -= k4 + 1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 5) | (tmp << (64 - 5));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 37) | (tmp << (64 - 37));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 23) | (tmp << (64 - 23));
+       b0 -= b1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 40) | (tmp << (64 - 40));
+       b2 -= b3;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 52) | (tmp << (64 - 52));
+       b0 -= b3;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 57) | (tmp << (64 - 57));
+       b2 -= b1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 14) | (tmp << (64 - 14));
+       b0 -= b1 + k0;
+       b1 -= k1 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 16) | (tmp << (64 - 16));
+       b2 -= b3 + k2 + t1;
+       b3 -= k3;
+
+       output[0] = b0;
+       output[1] = b1;
+       output[2] = b2;
+       output[3] = b3;
+}
diff --git a/drivers/staging/skein/threefish512Block.c b/drivers/staging/skein/threefish512Block.c
new file mode 100644 (file)
index 0000000..f428fd6
--- /dev/null
@@ -0,0 +1,2223 @@
+#include <linux/string.h>
+#include <threefishApi.h>
+
+
+void threefishEncrypt512(struct threefish_key *keyCtx, u64 *input, u64 *output)
+{
+       u64 b0 = input[0], b1 = input[1],
+         b2 = input[2], b3 = input[3],
+         b4 = input[4], b5 = input[5],
+         b6 = input[6], b7 = input[7];
+       u64 k0 = keyCtx->key[0], k1 = keyCtx->key[1],
+         k2 = keyCtx->key[2], k3 = keyCtx->key[3],
+         k4 = keyCtx->key[4], k5 = keyCtx->key[5],
+         k6 = keyCtx->key[6], k7 = keyCtx->key[7],
+         k8 = keyCtx->key[8];
+       u64 t0 = keyCtx->tweak[0], t1 = keyCtx->tweak[1],
+         t2 = keyCtx->tweak[2];
+
+       b1 += k1;
+       b0 += b1 + k0;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k3;
+       b2 += b3 + k2;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k5 + t0;
+       b4 += b5 + k4;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k7;
+       b6 += b7 + k6 + t1;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k2;
+       b0 += b1 + k1;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k4;
+       b2 += b3 + k3;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k6 + t1;
+       b4 += b5 + k5;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k8 + 1;
+       b6 += b7 + k7 + t2;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       b1 += k3;
+       b0 += b1 + k2;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k5;
+       b2 += b3 + k4;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k7 + t2;
+       b4 += b5 + k6;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k0 + 2;
+       b6 += b7 + k8 + t0;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k4;
+       b0 += b1 + k3;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k6;
+       b2 += b3 + k5;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k8 + t0;
+       b4 += b5 + k7;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k1 + 3;
+       b6 += b7 + k0 + t1;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       b1 += k5;
+       b0 += b1 + k4;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k7;
+       b2 += b3 + k6;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k0 + t1;
+       b4 += b5 + k8;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k2 + 4;
+       b6 += b7 + k1 + t2;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k6;
+       b0 += b1 + k5;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k8;
+       b2 += b3 + k7;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k1 + t2;
+       b4 += b5 + k0;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k3 + 5;
+       b6 += b7 + k2 + t0;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       b1 += k7;
+       b0 += b1 + k6;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k0;
+       b2 += b3 + k8;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k2 + t0;
+       b4 += b5 + k1;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k4 + 6;
+       b6 += b7 + k3 + t1;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k8;
+       b0 += b1 + k7;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k1;
+       b2 += b3 + k0;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k3 + t1;
+       b4 += b5 + k2;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k5 + 7;
+       b6 += b7 + k4 + t2;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       b1 += k0;
+       b0 += b1 + k8;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k2;
+       b2 += b3 + k1;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k4 + t2;
+       b4 += b5 + k3;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k6 + 8;
+       b6 += b7 + k5 + t0;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k1;
+       b0 += b1 + k0;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k3;
+       b2 += b3 + k2;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k5 + t0;
+       b4 += b5 + k4;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k7 + 9;
+       b6 += b7 + k6 + t1;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       b1 += k2;
+       b0 += b1 + k1;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k4;
+       b2 += b3 + k3;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k6 + t1;
+       b4 += b5 + k5;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k8 + 10;
+       b6 += b7 + k7 + t2;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k3;
+       b0 += b1 + k2;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k5;
+       b2 += b3 + k4;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k7 + t2;
+       b4 += b5 + k6;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k0 + 11;
+       b6 += b7 + k8 + t0;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       b1 += k4;
+       b0 += b1 + k3;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k6;
+       b2 += b3 + k5;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k8 + t0;
+       b4 += b5 + k7;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k1 + 12;
+       b6 += b7 + k0 + t1;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k5;
+       b0 += b1 + k4;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k7;
+       b2 += b3 + k6;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k0 + t1;
+       b4 += b5 + k8;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k2 + 13;
+       b6 += b7 + k1 + t2;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       b1 += k6;
+       b0 += b1 + k5;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k8;
+       b2 += b3 + k7;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k1 + t2;
+       b4 += b5 + k0;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k3 + 14;
+       b6 += b7 + k2 + t0;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k7;
+       b0 += b1 + k6;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k0;
+       b2 += b3 + k8;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k2 + t0;
+       b4 += b5 + k1;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k4 + 15;
+       b6 += b7 + k3 + t1;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       b1 += k8;
+       b0 += b1 + k7;
+       b1 = ((b1 << 46) | (b1 >> (64 - 46))) ^ b0;
+
+       b3 += k1;
+       b2 += b3 + k0;
+       b3 = ((b3 << 36) | (b3 >> (64 - 36))) ^ b2;
+
+       b5 += k3 + t1;
+       b4 += b5 + k2;
+       b5 = ((b5 << 19) | (b5 >> (64 - 19))) ^ b4;
+
+       b7 += k5 + 16;
+       b6 += b7 + k4 + t2;
+       b7 = ((b7 << 37) | (b7 >> (64 - 37))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 33) | (b1 >> (64 - 33))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 27) | (b7 >> (64 - 27))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 14) | (b5 >> (64 - 14))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 42) | (b3 >> (64 - 42))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 17) | (b1 >> (64 - 17))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 49) | (b3 >> (64 - 49))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 36) | (b5 >> (64 - 36))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 39) | (b7 >> (64 - 39))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 44) | (b1 >> (64 - 44))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 9) | (b7 >> (64 - 9))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 54) | (b5 >> (64 - 54))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 56) | (b3 >> (64 - 56))) ^ b4;
+
+       b1 += k0;
+       b0 += b1 + k8;
+       b1 = ((b1 << 39) | (b1 >> (64 - 39))) ^ b0;
+
+       b3 += k2;
+       b2 += b3 + k1;
+       b3 = ((b3 << 30) | (b3 >> (64 - 30))) ^ b2;
+
+       b5 += k4 + t2;
+       b4 += b5 + k3;
+       b5 = ((b5 << 34) | (b5 >> (64 - 34))) ^ b4;
+
+       b7 += k6 + 17;
+       b6 += b7 + k5 + t0;
+       b7 = ((b7 << 24) | (b7 >> (64 - 24))) ^ b6;
+
+       b2 += b1;
+       b1 = ((b1 << 13) | (b1 >> (64 - 13))) ^ b2;
+
+       b4 += b7;
+       b7 = ((b7 << 50) | (b7 >> (64 - 50))) ^ b4;
+
+       b6 += b5;
+       b5 = ((b5 << 10) | (b5 >> (64 - 10))) ^ b6;
+
+       b0 += b3;
+       b3 = ((b3 << 17) | (b3 >> (64 - 17))) ^ b0;
+
+       b4 += b1;
+       b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b4;
+
+       b6 += b3;
+       b3 = ((b3 << 29) | (b3 >> (64 - 29))) ^ b6;
+
+       b0 += b5;
+       b5 = ((b5 << 39) | (b5 >> (64 - 39))) ^ b0;
+
+       b2 += b7;
+       b7 = ((b7 << 43) | (b7 >> (64 - 43))) ^ b2;
+
+       b6 += b1;
+       b1 = ((b1 << 8) | (b1 >> (64 - 8))) ^ b6;
+
+       b0 += b7;
+       b7 = ((b7 << 35) | (b7 >> (64 - 35))) ^ b0;
+
+       b2 += b5;
+       b5 = ((b5 << 56) | (b5 >> (64 - 56))) ^ b2;
+
+       b4 += b3;
+       b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b4;
+
+       output[0] = b0 + k0;
+       output[1] = b1 + k1;
+       output[2] = b2 + k2;
+       output[3] = b3 + k3;
+       output[4] = b4 + k4;
+       output[5] = b5 + k5 + t0;
+       output[6] = b6 + k6 + t1;
+       output[7] = b7 + k7 + 18;
+}
+
+void threefishDecrypt512(struct threefish_key *keyCtx, u64 *input, u64 *output)
+{
+       u64 b0 = input[0], b1 = input[1],
+         b2 = input[2], b3 = input[3],
+         b4 = input[4], b5 = input[5],
+         b6 = input[6], b7 = input[7];
+       u64 k0 = keyCtx->key[0], k1 = keyCtx->key[1],
+         k2 = keyCtx->key[2], k3 = keyCtx->key[3],
+         k4 = keyCtx->key[4], k5 = keyCtx->key[5],
+         k6 = keyCtx->key[6], k7 = keyCtx->key[7],
+         k8 = keyCtx->key[8];
+       u64 t0 = keyCtx->tweak[0], t1 = keyCtx->tweak[1],
+         t2 = keyCtx->tweak[2];
+
+       u64 tmp;
+
+       b0 -= k0;
+       b1 -= k1;
+       b2 -= k2;
+       b3 -= k3;
+       b4 -= k4;
+       b5 -= k5 + t0;
+       b6 -= k6 + t1;
+       b7 -= k7 + 18;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k5 + t0;
+       b7 -= k6 + 17;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k3;
+       b5 -= k4 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k1;
+       b3 -= k2;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k8;
+       b1 -= k0;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k4 + t2;
+       b7 -= k5 + 16;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k2;
+       b5 -= k3 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k0;
+       b3 -= k1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k7;
+       b1 -= k8;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k3 + t1;
+       b7 -= k4 + 15;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k1;
+       b5 -= k2 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k8;
+       b3 -= k0;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k6;
+       b1 -= k7;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k2 + t0;
+       b7 -= k3 + 14;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k0;
+       b5 -= k1 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k7;
+       b3 -= k8;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k5;
+       b1 -= k6;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k1 + t2;
+       b7 -= k2 + 13;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k8;
+       b5 -= k0 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k6;
+       b3 -= k7;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k4;
+       b1 -= k5;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k0 + t1;
+       b7 -= k1 + 12;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k7;
+       b5 -= k8 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k5;
+       b3 -= k6;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k3;
+       b1 -= k4;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k8 + t0;
+       b7 -= k0 + 11;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k6;
+       b5 -= k7 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k4;
+       b3 -= k5;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k2;
+       b1 -= k3;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k7 + t2;
+       b7 -= k8 + 10;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k5;
+       b5 -= k6 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k3;
+       b3 -= k4;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k1;
+       b1 -= k2;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k6 + t1;
+       b7 -= k7 + 9;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k4;
+       b5 -= k5 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k2;
+       b3 -= k3;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k0;
+       b1 -= k1;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k5 + t0;
+       b7 -= k6 + 8;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k3;
+       b5 -= k4 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k1;
+       b3 -= k2;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k8;
+       b1 -= k0;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k4 + t2;
+       b7 -= k5 + 7;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k2;
+       b5 -= k3 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k0;
+       b3 -= k1;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k7;
+       b1 -= k8;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k3 + t1;
+       b7 -= k4 + 6;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k1;
+       b5 -= k2 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k8;
+       b3 -= k0;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k6;
+       b1 -= k7;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k2 + t0;
+       b7 -= k3 + 5;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k0;
+       b5 -= k1 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k7;
+       b3 -= k8;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k5;
+       b1 -= k6;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k1 + t2;
+       b7 -= k2 + 4;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k8;
+       b5 -= k0 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k6;
+       b3 -= k7;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k4;
+       b1 -= k5;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k0 + t1;
+       b7 -= k1 + 3;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k7;
+       b5 -= k8 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k5;
+       b3 -= k6;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k3;
+       b1 -= k4;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k8 + t0;
+       b7 -= k0 + 2;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k6;
+       b5 -= k7 + t2;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k4;
+       b3 -= k5;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k2;
+       b1 -= k3;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 22) | (tmp << (64 - 22));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 56) | (tmp << (64 - 56));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 35) | (tmp << (64 - 35));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 8) | (tmp << (64 - 8));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 43) | (tmp << (64 - 43));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 29) | (tmp << (64 - 29));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 25) | (tmp << (64 - 25));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 17) | (tmp << (64 - 17));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 10) | (tmp << (64 - 10));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 50) | (tmp << (64 - 50));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 13) | (tmp << (64 - 13));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 24) | (tmp << (64 - 24));
+       b6 -= b7 + k7 + t2;
+       b7 -= k8 + 1;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 34) | (tmp << (64 - 34));
+       b4 -= b5 + k5;
+       b5 -= k6 + t1;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 30) | (tmp << (64 - 30));
+       b2 -= b3 + k3;
+       b3 -= k4;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 39) | (tmp << (64 - 39));
+       b0 -= b1 + k1;
+       b1 -= k2;
+
+       tmp = b3 ^ b4;
+       b3 = (tmp >> 56) | (tmp << (64 - 56));
+       b4 -= b3;
+
+       tmp = b5 ^ b2;
+       b5 = (tmp >> 54) | (tmp << (64 - 54));
+       b2 -= b5;
+
+       tmp = b7 ^ b0;
+       b7 = (tmp >> 9) | (tmp << (64 - 9));
+       b0 -= b7;
+
+       tmp = b1 ^ b6;
+       b1 = (tmp >> 44) | (tmp << (64 - 44));
+       b6 -= b1;
+
+       tmp = b7 ^ b2;
+       b7 = (tmp >> 39) | (tmp << (64 - 39));
+       b2 -= b7;
+
+       tmp = b5 ^ b0;
+       b5 = (tmp >> 36) | (tmp << (64 - 36));
+       b0 -= b5;
+
+       tmp = b3 ^ b6;
+       b3 = (tmp >> 49) | (tmp << (64 - 49));
+       b6 -= b3;
+
+       tmp = b1 ^ b4;
+       b1 = (tmp >> 17) | (tmp << (64 - 17));
+       b4 -= b1;
+
+       tmp = b3 ^ b0;
+       b3 = (tmp >> 42) | (tmp << (64 - 42));
+       b0 -= b3;
+
+       tmp = b5 ^ b6;
+       b5 = (tmp >> 14) | (tmp << (64 - 14));
+       b6 -= b5;
+
+       tmp = b7 ^ b4;
+       b7 = (tmp >> 27) | (tmp << (64 - 27));
+       b4 -= b7;
+
+       tmp = b1 ^ b2;
+       b1 = (tmp >> 33) | (tmp << (64 - 33));
+       b2 -= b1;
+
+       tmp = b7 ^ b6;
+       b7 = (tmp >> 37) | (tmp << (64 - 37));
+       b6 -= b7 + k6 + t1;
+       b7 -= k7;
+
+       tmp = b5 ^ b4;
+       b5 = (tmp >> 19) | (tmp << (64 - 19));
+       b4 -= b5 + k4;
+       b5 -= k5 + t0;
+
+       tmp = b3 ^ b2;
+       b3 = (tmp >> 36) | (tmp << (64 - 36));
+       b2 -= b3 + k2;
+       b3 -= k3;
+
+       tmp = b1 ^ b0;
+       b1 = (tmp >> 46) | (tmp << (64 - 46));
+       b0 -= b1 + k0;
+       b1 -= k1;
+
+       output[0] = b0;
+       output[1] = b1;
+       output[2] = b2;
+       output[3] = b3;
+
+       output[7] = b7;
+       output[6] = b6;
+       output[5] = b5;
+       output[4] = b4;
+}
diff --git a/drivers/staging/skein/threefishApi.c b/drivers/staging/skein/threefishApi.c
new file mode 100644 (file)
index 0000000..1e70f66
--- /dev/null
@@ -0,0 +1,79 @@
+
+
+#include <linux/string.h>
+#include <threefishApi.h>
+
+void threefishSetKey(struct threefish_key *keyCtx,
+                       enum threefish_size stateSize,
+                       u64 *keyData, u64 *tweak)
+{
+       int keyWords = stateSize / 64;
+       int i;
+       u64 parity = KeyScheduleConst;
+
+       keyCtx->tweak[0] = tweak[0];
+       keyCtx->tweak[1] = tweak[1];
+       keyCtx->tweak[2] = tweak[0] ^ tweak[1];
+
+       for (i = 0; i < keyWords; i++) {
+               keyCtx->key[i] = keyData[i];
+               parity ^= keyData[i];
+       }
+       keyCtx->key[i] = parity;
+       keyCtx->stateSize = stateSize;
+}
+
+void threefishEncryptBlockBytes(struct threefish_key *keyCtx, u8 *in,
+                               u8 *out)
+{
+       u64 plain[SKEIN_MAX_STATE_WORDS];        /* max number of words*/
+       u64 cipher[SKEIN_MAX_STATE_WORDS];
+
+       Skein_Get64_LSB_First(plain, in, keyCtx->stateSize / 64);
+       threefishEncryptBlockWords(keyCtx, plain, cipher);
+       Skein_Put64_LSB_First(out, cipher, keyCtx->stateSize / 8);
+}
+
+void threefishEncryptBlockWords(struct threefish_key *keyCtx, u64 *in,
+                               u64 *out)
+{
+       switch (keyCtx->stateSize) {
+       case Threefish256:
+               threefishEncrypt256(keyCtx, in, out);
+               break;
+       case Threefish512:
+               threefishEncrypt512(keyCtx, in, out);
+               break;
+       case Threefish1024:
+               threefishEncrypt1024(keyCtx, in, out);
+               break;
+       }
+}
+
+void threefishDecryptBlockBytes(struct threefish_key *keyCtx, u8 *in,
+                               u8 *out)
+{
+       u64 plain[SKEIN_MAX_STATE_WORDS];        /* max number of words*/
+       u64 cipher[SKEIN_MAX_STATE_WORDS];
+
+       Skein_Get64_LSB_First(cipher, in, keyCtx->stateSize / 64);
+       threefishDecryptBlockWords(keyCtx, cipher, plain);
+       Skein_Put64_LSB_First(out, plain, keyCtx->stateSize / 8);
+}
+
+void threefishDecryptBlockWords(struct threefish_key *keyCtx, u64 *in,
+                               u64 *out)
+{
+       switch (keyCtx->stateSize) {
+       case Threefish256:
+               threefishDecrypt256(keyCtx, in, out);
+               break;
+       case Threefish512:
+               threefishDecrypt512(keyCtx, in, out);
+               break;
+       case Threefish1024:
+               threefishDecrypt1024(keyCtx, in, out);
+               break;
+       }
+}
+
index 1ca91f7092b176cc8d27d4f1f36ddb694ff32d28..7495b890b6f0a50bb8b2b2253dd4dd41d75ca22c 100644 (file)
@@ -641,7 +641,7 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr,
                if (kstrtol(cp, 10, &value) == 0)
                        ret = spk_set_num_var(value, param, len);
                else
-                       pr_warn("overflow or parsing error has occured");
+                       pr_warn("overflow or parsing error has occurred");
                if (ret == -ERANGE) {
                        var_data = param->data;
                        pr_warn("value for %s out of range, expect %d to %d\n",
index ffb4eeefdddb37e5ae2447c6501b50e00e59f37f..2d8497277aae3ec0de9d6dd6d03197e2a51cfb47 100644 (file)
@@ -684,7 +684,7 @@ static int vme_user_match(struct vme_dev *vdev)
 static int vme_user_probe(struct vme_dev *vdev)
 {
        int i, err;
-       char name[12];
+       char *name;
 
        /* Save pointer to the bridge device */
        if (vme_user_bridge != NULL) {
@@ -792,15 +792,16 @@ static int vme_user_probe(struct vme_dev *vdev)
        /* Add sysfs Entries */
        for (i = 0; i < VME_DEVS; i++) {
                int num;
+
                switch (type[i]) {
                case MASTER_MINOR:
-                       sprintf(name, "bus/vme/m%%d");
+                       name = "bus/vme/m%d";
                        break;
                case CONTROL_MINOR:
-                       sprintf(name, "bus/vme/ctl");
+                       name = "bus/vme/ctl";
                        break;
                case SLAVE_MINOR:
-                       sprintf(name, "bus/vme/s%%d");
+                       name = "bus/vme/s%d";
                        break;
                default:
                        err = -EINVAL;
index db38ca05113064a8e9879b328f8ee8d272653974..e7227954f2fe88a25805b1b9a473eb348c4392d1 100644 (file)
@@ -24,7 +24,6 @@
  *      vUpdateIFS - Update slotTime,SIFS,DIFS, and EIFS
  *      CARDvUpdateBasicTopRate - Update BasicTopRate
  *      CARDbAddBasicRate - Add to BasicRateSet
- *      CARDbSetBasicRate - Set Basic Tx Rate
  *      CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet
  *      CARDvSetLoopbackMode - Set Loopback mode
  *      CARDbSoftwareReset - Sortware reset NIC
@@ -1877,19 +1876,6 @@ void CARDvUpdateBasicTopRate(void *pDeviceHandler)
        pDevice->byTopCCKBasicRate = byTopCCK;
 }
 
-/*
- * Description: Set NIC Tx Basic Rate
- *
- * Parameters:
- *  In:
- *      pDevice         - The adapter to be set
- *      wBasicRate      - Basic Rate to be set
- *  Out:
- *      none
- *
- * Return Value: true if succeeded; false if failed.
- *
- */
 bool CARDbAddBasicRate(void *pDeviceHandler, unsigned short wRateIdx)
 {
        PSDevice pDevice = (PSDevice) pDeviceHandler;
index c9a89cd7633cfacfe6594d33e9d86cad8fff92f4..2d760da626bb474a4551933f12805e8cad81b333 100644 (file)
@@ -51,7 +51,7 @@ extern unsigned short TxRate_iwconfig; //2008-5-8 <add> by chester
 /*---------------------  Static Variables  --------------------------*/
 //static int          msglevel                =MSG_LEVEL_DEBUG;
 static int msglevel = MSG_LEVEL_INFO;
-const unsigned char acbyIERate[MAX_RATE] =
+static const unsigned char acbyIERate[MAX_RATE] =
 {0x02, 0x04, 0x0B, 0x16, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
 
 #define AUTORATE_TXOK_CNT       0x0400
index 062c3a374b99f70c985e70b051fdd414cc8f974c..985c3c19a4a7b779a6f7ded62d90b337d850b4e4 100644 (file)
 
 /*---------------------  Export Types  ------------------------------*/
 
-#define DBG_PRT(l, p, args...) { if (l <= msglevel) printk(p, ##args); }
-#define PRINT_K(p, args...) { if (PRIVATE_Message) printk(p, ##args); }
+#define DBG_PRT(l, p, args...)         \
+do {                                   \
+       if (l <= msglevel)              \
+               printk(p, ##args);      \
+} while (0)
+
+#define PRINT_K(p, args...)            \
+do {                                   \
+       if (PRIVATE_Message)            \
+               printk(p, ##args);      \
+} while (0)
 
 //0:11A 1:11B 2:11G
 typedef enum _VIA_BB_TYPE
index b5cd2e44e53dac9079c9964bdbe97cc10fb2c907..1de5d2c907d2433390bf6b6870ad3254806aea9c 100644 (file)
@@ -305,7 +305,8 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq)
                        result = -EINVAL;
                        break;
                }
-               pList = (PSBSSIDList)kmalloc(sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)), (int)GFP_ATOMIC);
+               pList = (PSBSSIDList)kmalloc(sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)),
+                                            GFP_ATOMIC);
                if (pList == NULL) {
                        result = -ENOMEM;
                        break;
@@ -576,7 +577,8 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq)
                        result = -EINVAL;
                        break;
                }
-               pNodeList = (PSNodeList)kmalloc(sizeof(SNodeList) + (sNodeList.uItem * sizeof(SNodeItem)), (int)GFP_ATOMIC);
+               pNodeList = (PSNodeList)kmalloc(sizeof(SNodeList) + (sNodeList.uItem * sizeof(SNodeItem)),
+                                               GFP_ATOMIC);
                if (pNodeList == NULL) {
                        result = -ENOMEM;
                        break;
index ac3fc16704c1c5b54a50a9ca954bbfc58070a6d4..a601c47a3803cb5f9d67c510619ae8c1b21bee8e 100644 (file)
@@ -1835,19 +1835,14 @@ int iwctl_siwencodeext(struct net_device *dev,
        size_t seq_len = 0, key_len = 0;
 //
        // int ii;
-       u8 *buf;
-       size_t blen;
        u8 key_array[64];
        int ret = 0;
 
        PRINT_K("SIOCSIWENCODEEXT...... \n");
 
-       blen = sizeof(*param);
-       buf = kmalloc((int)blen, (int)GFP_KERNEL);
-       if (buf == NULL)
+       param = kzalloc(sizeof(*param), GFP_KERNEL);
+       if (param == NULL)
                return -ENOMEM;
-       memset(buf, 0, blen);
-       param = (struct viawget_wpa_param *)buf;
 
 //recover alg_name
        switch (ext->alg) {
index d17224f39b4d52d527e02ee53bdf71946b90854f..1f72589cf718637851d650c314baa6efe8b52bd8 100644 (file)
@@ -188,7 +188,8 @@ int wpa_set_wpadev(PSDevice pDevice, int val)
  *
  */
 
-int wpa_set_keys(PSDevice pDevice, void *ctx, bool fcpfkernel)
+int wpa_set_keys(PSDevice pDevice, void *ctx,
+                bool fcpfkernel) __must_hold(&pDevice->lock)
 {
        struct viawget_wpa_param *param = ctx;
        PSMgmtObject pMgmt = pDevice->pMgmt;
@@ -593,7 +594,7 @@ static int wpa_get_scan(PSDevice pDevice,
 
        unsigned char *ptempBSS;
 
-       ptempBSS = kmalloc(sizeof(KnownBSS), (int)GFP_ATOMIC);
+       ptempBSS = kmalloc(sizeof(KnownBSS), GFP_ATOMIC);
 
        if (ptempBSS == NULL) {
                printk(KERN_ERR "bubble sort kmalloc memory fail@@@\n");
@@ -635,7 +636,7 @@ static int wpa_get_scan(PSDevice pDevice,
                count++;
        }
 
-       pBuf = kcalloc(count, sizeof(struct viawget_scan_result), (int)GFP_ATOMIC);
+       pBuf = kcalloc(count, sizeof(struct viawget_scan_result), GFP_ATOMIC);
 
        if (pBuf == NULL) {
                ret = -ENOMEM;
@@ -679,7 +680,7 @@ static int wpa_get_scan(PSDevice pDevice,
                ret = -EFAULT;
        }
        param->u.scan_results.scan_count = count;
-       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " param->u.scan_results.scan_count = %d\n", count)
+       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " param->u.scan_results.scan_count = %d\n", count);
 
                kfree(pBuf);
        return ret;
@@ -857,7 +858,7 @@ int wpa_ioctl(PSDevice pDevice, struct iw_point *p)
            p->length > VIAWGET_WPA_MAX_BUF_SIZE || !p->pointer)
                return -EINVAL;
 
-       param = kmalloc((int)p->length, (int)GFP_KERNEL);
+       param = kmalloc((int)p->length, GFP_KERNEL);
        if (param == NULL)
                return -ENOMEM;
 
index e2bfa8d266cd8a68f8ef11a8b99c2710e2522a50..a9d51687db7f56e4439c4efb100902ef938c428c 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "device.h"
 #include "80211hdr.h"
+#include "aes_ccmp.h"
 
 /*
  * SBOX Table
index cd2ea76c8b1e1ee70eda84d70cdcce6117978dce..15c1e861c84b696e38da4be1764daeb99571bf91 100644 (file)
@@ -31,6 +31,7 @@
  *
  */
 
+#include <linux/compiler.h>
 #include "firmware.h"
 #include "control.h"
 #include "rndis.h"
@@ -43,7 +44,7 @@ static int msglevel = MSG_LEVEL_INFO;
 
 #define FIRMWARE_CHUNK_SIZE    0x400
 
-int FIRMWAREbDownload(struct vnt_private *pDevice)
+int FIRMWAREbDownload(struct vnt_private *pDevice) __must_hold(&pDevice->lock)
 {
        struct device *dev = &pDevice->usb->dev;
        const struct firmware *fw;
index 3840323858fcc13ffe57901f9272d0d15096ac7a..1ff14469df9967b4f26494ebe638655b05e7984c 100644 (file)
@@ -181,31 +181,31 @@ static void s_vFillTxKey(struct vnt_private *pDevice,
        struct vnt_mic_hdr *mic_hdr)
 {
        u8 *pbyBuf = (u8 *)&fifo_head->adwTxKey[0];
-       u32 *pdwIV = (u32 *)pbyIVHead;
-       u32 *pdwExtIV = (u32 *)((u8 *)pbyIVHead + 4);
+       __le32 *pdwIV = (__le32 *)pbyIVHead;
+       __le32 *pdwExtIV = (__le32 *)((u8 *)pbyIVHead + 4);
        struct ieee80211_hdr *pMACHeader = (struct ieee80211_hdr *)pbyHdrBuf;
-       u32 dwRevIVCounter;
+       __le32 rev_iv_counter;
 
        /* Fill TXKEY */
        if (pTransmitKey == NULL)
                return;
 
-       dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
-       *pdwIV = pDevice->dwIVCounter;
+       rev_iv_counter = cpu_to_le32(pDevice->dwIVCounter);
+       *pdwIV = cpu_to_le32(pDevice->dwIVCounter);
        pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
 
        switch (pTransmitKey->byCipherSuite) {
        case KEY_CTL_WEP:
                if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) {
-                       memcpy(pDevice->abyPRNG, (u8 *)&dwRevIVCounter, 3);
+                       memcpy(pDevice->abyPRNG, (u8 *)&rev_iv_counter, 3);
                        memcpy(pDevice->abyPRNG + 3, pTransmitKey->abyKey,
                                                pTransmitKey->uKeyLength);
                } else {
-                       memcpy(pbyBuf, (u8 *)&dwRevIVCounter, 3);
+                       memcpy(pbyBuf, (u8 *)&rev_iv_counter, 3);
                        memcpy(pbyBuf + 3, pTransmitKey->abyKey,
                                                pTransmitKey->uKeyLength);
                        if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
-                               memcpy(pbyBuf+8, (u8 *)&dwRevIVCounter, 3);
+                               memcpy(pbyBuf+8, (u8 *)&rev_iv_counter, 3);
                        memcpy(pbyBuf+11, pTransmitKey->abyKey,
                                                pTransmitKey->uKeyLength);
                        }
@@ -213,9 +213,8 @@ static void s_vFillTxKey(struct vnt_private *pDevice,
                        memcpy(pDevice->abyPRNG, pbyBuf, 16);
                }
                /* Append IV after Mac Header */
-               *pdwIV &= WEP_IV_MASK;
-               *pdwIV |= (u32)pDevice->byKeyIndex << 30;
-               *pdwIV = cpu_to_le32(*pdwIV);
+               *pdwIV &= cpu_to_le32(WEP_IV_MASK);
+               *pdwIV |= cpu_to_le32((u32)pDevice->byKeyIndex << 30);
 
                pDevice->dwIVCounter++;
                if (pDevice->dwIVCounter > WEP_IV_MASK)
@@ -256,7 +255,7 @@ static void s_vFillTxKey(struct vnt_private *pDevice,
                *(pbyIVHead+3) = (u8)(((pDevice->byKeyIndex << 6) &
                                                        0xc0) | 0x20);
 
-               *pdwIV |= cpu_to_le16((u16)(pTransmitKey->wTSC15_0));
+               *pdwIV |= cpu_to_le32((u32)(pTransmitKey->wTSC15_0));
 
                /* Append IV&ExtIV after Mac Header */
                *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
@@ -283,9 +282,10 @@ static void s_vFillTxKey(struct vnt_private *pDevice,
 
                /* MICHDR2 */
                memcpy(mic_hdr->addr3, pMACHeader->addr3, ETH_ALEN);
-               mic_hdr->frame_control = cpu_to_le16(pMACHeader->frame_control
-                                                               & 0xc78f);
-               mic_hdr->seq_ctrl = cpu_to_le16(pMACHeader->seq_ctrl & 0xf);
+               mic_hdr->frame_control = cpu_to_le16(
+                       le16_to_cpu(pMACHeader->frame_control) & 0xc78f);
+               mic_hdr->seq_ctrl = cpu_to_le16(
+                               le16_to_cpu(pMACHeader->seq_ctrl) & 0xf);
 
                if (ieee80211_has_a4(pMACHeader->frame_control))
                        memcpy(mic_hdr->addr4, pMACHeader->addr4, ETH_ALEN);
@@ -551,7 +551,8 @@ static int vnt_fill_ieee80211_rts(struct vnt_private *priv,
                __le16 duration)
 {
        rts->duration = duration;
-       rts->frame_control = TYPE_CTL_RTS;
+       rts->frame_control =
+               cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
 
        if (priv->op_mode == NL80211_IFTYPE_ADHOC ||
                                priv->op_mode == NL80211_IFTYPE_AP)
@@ -741,7 +742,9 @@ static u16 s_vFillCTSHead(struct vnt_private *pDevice, u32 uDMAIdx,
                        pDevice->tx_rate_fb1, bNeedAck, byFBOption);
                /* Get CTS Frame body */
                pBuf->data.duration = pBuf->duration_ba;
-               pBuf->data.frame_control = TYPE_CTL_CTS;
+               pBuf->data.frame_control =
+                       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
+
                memcpy(pBuf->data.ra, pDevice->abyCurrentNetAddr, ETH_ALEN);
 
                return vnt_rxtx_datahead_g_fb(pDevice, byPktType, wCurrentRate,
@@ -757,7 +760,9 @@ static u16 s_vFillCTSHead(struct vnt_private *pDevice, u32 uDMAIdx,
                        wCurrentRate, bNeedAck, byFBOption);
                /*Get CTS Frame body*/
                pBuf->data.duration = pBuf->duration_ba;
-               pBuf->data.frame_control = TYPE_CTL_CTS;
+               pBuf->data.frame_control =
+                       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
+
                memcpy(pBuf->data.ra, pDevice->abyCurrentNetAddr, ETH_ALEN);
 
                return vnt_rxtx_datahead_g(pDevice, byPktType, wCurrentRate,
@@ -800,7 +805,7 @@ static u16 s_vGenerateTxParameter(struct vnt_private *pDevice,
        u16 wFifoCtl;
        u8 byFBOption = AUTO_FB_NONE;
 
-       pFifoHead->wReserved = wCurrentRate;
+       pFifoHead->current_rate = cpu_to_le16(wCurrentRate);
        wFifoCtl = pFifoHead->wFIFOCtl;
 
        if (wFifoCtl & FIFOCTL_AUTO_FB_0)
@@ -1008,7 +1013,7 @@ static int s_bPacketToWirelessUsb(struct vnt_private *pDevice, u8 byPktType,
                pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
        }
 
-    pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us;
+    pTxBufHead->time_stamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us);
 
     //Set FRAGCTL_MACHDCNT
        cbMACHdLen = WLAN_HDR_ADDR3_LEN;
@@ -1431,7 +1436,7 @@ CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice,
     }
 
     pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
-    pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
+    pTxBufHead->time_stamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
 
     if (is_multicast_ether_addr(pPacket->p80211Header->sA3.abyAddr1)) {
         bNeedACK = false;
@@ -1605,7 +1610,7 @@ CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice,
        }
     }
 
-    pTX_Buffer->wTxByteCount = cpu_to_le16((u16)(cbReqCount));
+    pTX_Buffer->tx_byte_count = cpu_to_le16((u16)(cbReqCount));
     pTX_Buffer->byPKTNO = (u8) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
     pTX_Buffer->byType = 0x00;
 
@@ -1697,7 +1702,7 @@ CMD_STATUS csBeacon_xmit(struct vnt_private *pDevice,
 
     cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize;
 
-    pTX_Buffer->wTxByteCount = (u16)cbReqCount;
+    pTX_Buffer->tx_byte_count = cpu_to_le16((u16)cbReqCount);
     pTX_Buffer->byPKTNO = (u8) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
     pTX_Buffer->byType = 0x01;
 
@@ -1800,7 +1805,7 @@ void vDMA0_tx_80211(struct vnt_private *pDevice, struct sk_buff *skb)
     }
 
     pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
-    pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
+    pTxBufHead->time_stamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
 
     if (is_multicast_ether_addr(p80211Header->sA3.abyAddr1)) {
         bNeedACK = false;
@@ -2045,7 +2050,7 @@ void vDMA0_tx_80211(struct vnt_private *pDevice, struct sk_buff *skb)
        }
     }
 
-    pTX_Buffer->wTxByteCount = cpu_to_le16((u16)(cbReqCount));
+    pTX_Buffer->tx_byte_count = cpu_to_le16((u16)(cbReqCount));
     pTX_Buffer->byPKTNO = (u8) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
     pTX_Buffer->byType = 0x00;
 
@@ -2437,7 +2442,7 @@ int nsDMA_tx_packet(struct vnt_private *pDevice,
     }
 
     pTX_Buffer->byPKTNO = (u8) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
-    pTX_Buffer->wTxByteCount = (u16)BytesToWrite;
+    pTX_Buffer->tx_byte_count = cpu_to_le16((u16)BytesToWrite);
 
     pContext->pPacket = skb;
     pContext->type = CONTEXT_DATA_PACKET;
@@ -2591,7 +2596,7 @@ int bRelayPacketSend(struct vnt_private *pDevice, u8 *pbySkbData, u32 uDataLen,
     }
 
     pTX_Buffer->byPKTNO = (u8) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
-    pTX_Buffer->wTxByteCount = (u16)BytesToWrite;
+    pTX_Buffer->tx_byte_count = cpu_to_le16((u16)BytesToWrite);
 
     pContext->pPacket = NULL;
     pContext->type = CONTEXT_DATA_PACKET;
index 6d6539d29d04ce5240cd467f481a892e39d74092..4dfb2e0c6ae78a6b6d30dbfccd1c3fc95d0229e3 100644 (file)
@@ -217,15 +217,15 @@ union vnt_tx_head {
 struct vnt_tx_fifo_head {
        u32 adwTxKey[4];
        u16 wFIFOCtl;
-       u16 wTimeStamp;
+       __le16 time_stamp;
        u16 wFragCtl;
-       u16 wReserved;
+       __le16 current_rate;
 } __packed;
 
 struct vnt_tx_buffer {
        u8 byType;
        u8 byPKTNO;
-       u16 wTxByteCount;
+       __le16 tx_byte_count;
        struct vnt_tx_fifo_head fifo_head;
        union vnt_tx_head tx_head;
 } __packed;
@@ -241,7 +241,7 @@ struct vnt_tx_short_buf_head {
 struct vnt_beacon_buffer {
        u8 byType;
        u8 byPKTNO;
-       u16 wTxByteCount;
+       __le16 tx_byte_count;
        struct vnt_tx_short_buf_head short_head;
        struct ieee80211_hdr hdr;
 } __packed;
index aec6b568a4a926b109441ef474296b4acb7f556c..f57fcfdc24d5665893318f38fff518e996ee0976 100644 (file)
@@ -60,8 +60,6 @@
 #define TYPE_DATE_NULL      0x4800
 
 #define TYPE_CTL_PSPOLL     0xa400
-#define TYPE_CTL_RTS        0xb400
-#define TYPE_CTL_CTS        0xc400
 #define TYPE_CTL_ACK        0xd400
 
 #else //if LITTLE_ENDIAN
@@ -91,8 +89,6 @@
 #define TYPE_DATE_NULL      0x0048
 
 #define TYPE_CTL_PSPOLL     0x00a4
-#define TYPE_CTL_RTS        0x00b4
-#define TYPE_CTL_CTS        0x00c4
 #define TYPE_CTL_ACK        0x00d4
 
 #endif //#ifdef __BIG_ENDIAN