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>
1  2 
drivers/staging/Kconfig
drivers/staging/Makefile
drivers/staging/comedi/comedi_fops.c
drivers/staging/goldfish/goldfish_audio.c
drivers/staging/rtl8723au/core/rtw_wlan_util.c
drivers/staging/vme/devices/vme_user.c

diff --combined drivers/staging/Kconfig
index b597165092f8ab6d897ab3a6fa3b3fd14ab809a7,22365f140bec3d2d009b60d345369bd38aedf41a..e62be2b0b16df7cec9f09d901682d7b6f90fedb8
@@@ -40,8 -40,6 +40,6 @@@ source "drivers/staging/olpc_dcon/Kconf
  
  source "drivers/staging/panel/Kconfig"
  
- source "drivers/staging/rtl8187se/Kconfig"
  source "drivers/staging/rtl8192u/Kconfig"
  
  source "drivers/staging/rtl8192e/Kconfig"
@@@ -146,8 -144,6 +144,8 @@@ source "drivers/staging/gs_fpgaboot/Kco
  
  source "drivers/staging/nokia_h4p/Kconfig"
  
 +source "drivers/staging/skein/Kconfig"
 +
  source "drivers/staging/unisys/Kconfig"
  
  endif # STAGING
diff --combined drivers/staging/Makefile
index 3860be7ee90d6e121a90d72b03922411437f2aac,fbe84ed2d048e4b953af51e2b9724945c7021db9..35edbe293631445d77a988e665f97d0788cf9bca
@@@ -12,7 -12,6 +12,6 @@@ obj-$(CONFIG_PRISM2_USB)      += wlan-ng
  obj-$(CONFIG_COMEDI)          += comedi/
  obj-$(CONFIG_FB_OLPC_DCON)    += olpc_dcon/
  obj-$(CONFIG_PANEL)           += panel/
- obj-$(CONFIG_R8187SE)         += rtl8187se/
  obj-$(CONFIG_RTL8192U)                += rtl8192u/
  obj-$(CONFIG_RTL8192E)                += rtl8192e/
  obj-$(CONFIG_R8712U)          += rtl8712/
@@@ -65,5 -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 e283e6c7b52bb0ce172c3d4fcca8ec8e8b7f1546,acc80197e35ed86f0c89eee412f6bba9d0d640b5..70545e670dd0b8ccb3b8aeb54c7f85bc4711db76
@@@ -1435,15 -1435,13 +1435,15 @@@ static int __comedi_get_user_cmd(struc
        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;
        }
  
@@@ -1599,6 -1597,7 +1599,6 @@@ static int do_cmdtest_ioctl(struct come
  {
        struct comedi_cmd cmd;
        struct comedi_subdevice *s;
 -      unsigned int *chanlist = NULL;
        unsigned int __user *user_chanlist;
        int ret;
  
                ret = -EFAULT;
        }
  
 -      kfree(chanlist);
 -
        return ret;
  }
  
@@@ -1925,14 -1926,21 +1925,21 @@@ static int comedi_mmap(struct file *fil
        struct comedi_device *dev = file->private_data;
        struct comedi_subdevice *s;
        struct comedi_async *async;
-       struct comedi_buf_map *bm;
+       struct comedi_buf_map *bm = NULL;
        unsigned long start = vma->vm_start;
        unsigned long size;
        int n_pages;
        int i;
        int retval;
  
-       mutex_lock(&dev->mutex);
+       /*
+        * 'trylock' avoids circular dependency with current->mm->mmap_sem
+        * and down-reading &dev->attach_lock should normally succeed without
+        * contention unless the device is in the process of being attached
+        * or detached.
+        */
+       if (!down_read_trylock(&dev->attach_lock))
+               return -EAGAIN;
  
        if (!dev->attached) {
                dev_dbg(dev->class_dev, "no driver attached\n");
        }
  
        n_pages = size >> PAGE_SHIFT;
-       bm = async->buf_map;
+       /* get reference to current buf map (if any) */
+       bm = comedi_buf_map_from_subdev_get(s);
        if (!bm || n_pages > bm->n_pages) {
                retval = -EINVAL;
                goto done;
  
        retval = 0;
  done:
-       mutex_unlock(&dev->mutex);
+       up_read(&dev->attach_lock);
+       comedi_buf_map_put(bm); /* put reference to buf map - okay if NULL */
        return retval;
  }
  
index aca980ec3696adafdc6238b3070f03b8e991e32b,7ac2602242f1f4e6527025b0b2566b52e01687f3..9243845418d64f61656f14716c5e79fd13ea3bff
@@@ -147,7 -147,6 +147,7 @@@ static ssize_t goldfish_audio_write(str
  
        while (count > 0) {
                ssize_t copy = count;
 +
                if (copy > WRITE_BUFFER_SIZE)
                        copy = WRITE_BUFFER_SIZE;
                wait_event_interruptible(data->wait, (data->buffer_status &
@@@ -335,6 -334,7 +335,7 @@@ static int goldfish_audio_probe(struct 
        return 0;
  
  err_misc_register_failed:
+       free_irq(data->irq, data);
  err_request_irq_failed:
        dma_free_coherent(&pdev->dev, COMBINED_BUFFER_SIZE,
                                        data->buffer_virt, data->buffer_phys);
index 8824dd4fb55d18bf731ce23e8498f991ccf09db3,99d81e612e7b69bf8cc368af3f41f842dc197367..646e468a630d4303364ad4876fc54e157e76aade
@@@ -283,9 -283,35 +283,9 @@@ void Update23aTblForSoftAP(u8 *bssrates
        }
  }
  
 -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)
@@@ -457,9 -483,51 +457,9 @@@ unsigned int decide_wait_for_beacon_tim
                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)
  
        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)
@@@ -493,11 -561,37 +493,11 @@@ void flush_all_cam_entry23a(struct rtw_
        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; */
@@@ -555,22 -649,22 +555,22 @@@ void WMMOnAssocRsp23a(struct rtw_adapte
  
                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;
        }
  
        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;
  
        inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;
  
        if (pregpriv->wifi_spec == 1) {
-               u32     j, tmp, change_inx;
+               u32     j, tmp, change_inx = false;
  
                /* entry indx: 0->vo, 1->vi, 2->be, 3->bk. */
                for (i = 0; i < 4; i++) {
@@@ -744,7 -838,7 +744,7 @@@ void HT_caps_handler23a(struct rtw_adap
        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++) {
@@@ -802,8 -896,9 +802,8 @@@ void HTOnAssocRsp23a(struct rtw_adapte
  
        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)
@@@ -856,133 -951,116 +856,133 @@@ void VCS_update23a(struct rtw_adapter *
        }
  }
  
 -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';
        }
                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;
                }
        }
@@@ -1116,11 -1171,11 +1116,11 @@@ void update_beacon23a_info(struct rtw_a
                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;
@@@ -1144,11 -1199,11 +1144,11 @@@ unsigned int is_ap_in_tkip23a(struct rt
                        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;
@@@ -1175,13 -1230,13 +1175,13 @@@ unsigned int should_forbid_n_rate23a(st
                        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;
@@@ -1210,11 -1265,11 +1210,11 @@@ unsigned int is_ap_in_wep23a(struct rtw
                        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:
@@@ -1377,6 -1432,15 +1377,6 @@@ void set_sta_rate23a(struct rtw_adapte
  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);
  
        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)
                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");
@@@ -1482,15 -1546,15 +1482,15 @@@ void update_IOT_info23a(struct rtw_adap
                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;
@@@ -1503,19 -1567,22 +1503,19 @@@ void update_capinfo23a(struct rtw_adapt
  {
        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) {
                        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;
  
        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);
@@@ -1595,25 -1664,24 +1595,25 @@@ void update_bmc_sta_support_rate23a(str
        }
  }
  
 -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;
  }
  
@@@ -1643,6 -1711,26 +1643,6 @@@ void process_addba_req23a(struct rtw_ad
        }
  }
  
 -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 5fa7f831dabd4a09e9e82e7135dcfc80c9ca448c,ffb4eeefdddb37e5ae2447c6501b50e00e59f37f..2d8497277aae3ec0de9d6dd6d03197e2a51cfb47
@@@ -684,7 -684,7 +684,7 @@@ static int vme_user_match(struct vme_de
  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) {
                image[i].kern_buf = kmalloc(image[i].size_buf, GFP_KERNEL);
                if (image[i].kern_buf == NULL) {
                        err = -ENOMEM;
-                       goto err_master_buf;
+                       vme_master_free(image[i].resource);
+                       goto err_master;
                }
        }
  
        /* 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;
  
        return 0;
  
-       /* Ensure counter set correcty to destroy all sysfs devices */
-       i = VME_DEVS;
  err_sysfs:
        while (i > 0) {
                i--;
  
        /* Ensure counter set correcty to unalloc all master windows */
        i = MASTER_MAX + 1;
- err_master_buf:
-       for (i = MASTER_MINOR; i < (MASTER_MAX + 1); i++)
-               kfree(image[i].kern_buf);
  err_master:
        while (i > MASTER_MINOR) {
                i--;
+               kfree(image[i].kern_buf);
                vme_master_free(image[i].resource);
        }