Re: linux-next: manual merge of the net-next tree with the staging tree
From: Greg KH
Date: Thu Sep 02 2021 - 05:30:13 EST
On Mon, Aug 30, 2021 at 11:42:38AM +1000, Stephen Rothwell wrote:
> Hi all,
>
> Today's linux-next merge of the net-next tree got a conflict in:
>
> drivers/staging/rtl8723bs/os_dep/ioctl_linux.c
>
> between commit:
>
> 174ac41a7aaf ("staging: rtl8723bs: remove obsolete wext support")
>
> from the staging tree and commit:
>
> 89939e890605 ("staging: rtlwifi: use siocdevprivate")
>
> from the net-next tree.
>
> I fixed it up (see below - though it is probably better to get rid of
> rtw_siocdevprivate() as well) and can carry the fix as necessary. This
> is now fixed as far as linux-next is concerned, but any non trivial
> conflicts should be mentioned to your upstream maintainer when your tree
> is submitted for merging. You may also want to consider cooperating
> with the maintainer of the conflicting tree to minimise any particularly
> complex conflicts.
>
> --
> Cheers,
> Stephen Rothwell
>
> diff --cc drivers/staging/rtl8723bs/os_dep/ioctl_linux.c
> index 9d4a233a861e,aa7bd76bb5f1..000000000000
> --- a/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c
> +++ b/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c
> @@@ -1335,8 -3728,778 +1335,21 @@@ static int rtw_hostapd_ioctl(struct net
> return ret;
> }
>
> -static int rtw_wx_set_priv(struct net_device *dev,
> - struct iw_request_info *info,
> - union iwreq_data *awrq,
> - char *extra)
> -{
> -
> -#ifdef DEBUG_RTW_WX_SET_PRIV
> - char *ext_dbg;
> -#endif
> -
> - int ret = 0;
> - int len = 0;
> - char *ext;
> -
> - struct adapter *padapter = rtw_netdev_priv(dev);
> - struct iw_point *dwrq = (struct iw_point *)awrq;
> -
> - if (dwrq->length == 0)
> - return -EFAULT;
> -
> - len = dwrq->length;
> - ext = vmalloc(len);
> - if (!ext)
> - return -ENOMEM;
> -
> - if (copy_from_user(ext, dwrq->pointer, len)) {
> - vfree(ext);
> - return -EFAULT;
> - }
> -
> - #ifdef DEBUG_RTW_WX_SET_PRIV
> - ext_dbg = vmalloc(len);
> - if (!ext_dbg) {
> - vfree(ext, len);
> - return -ENOMEM;
> - }
> -
> - memcpy(ext_dbg, ext, len);
> - #endif
> -
> - /* added for wps2.0 @20110524 */
> - if (dwrq->flags == 0x8766 && len > 8) {
> - u32 cp_sz;
> - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
> - u8 *probereq_wpsie = ext;
> - int probereq_wpsie_len = len;
> - u8 wps_oui[4] = {0x0, 0x50, 0xf2, 0x04};
> -
> - if ((WLAN_EID_VENDOR_SPECIFIC == probereq_wpsie[0]) &&
> - (!memcmp(&probereq_wpsie[2], wps_oui, 4))) {
> - cp_sz = probereq_wpsie_len > MAX_WPS_IE_LEN ? MAX_WPS_IE_LEN : probereq_wpsie_len;
> -
> - if (pmlmepriv->wps_probe_req_ie) {
> - pmlmepriv->wps_probe_req_ie_len = 0;
> - kfree(pmlmepriv->wps_probe_req_ie);
> - pmlmepriv->wps_probe_req_ie = NULL;
> - }
> -
> - pmlmepriv->wps_probe_req_ie = rtw_malloc(cp_sz);
> - if (pmlmepriv->wps_probe_req_ie == NULL) {
> - printk("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__);
> - ret = -EINVAL;
> - goto FREE_EXT;
> -
> - }
> -
> - memcpy(pmlmepriv->wps_probe_req_ie, probereq_wpsie, cp_sz);
> - pmlmepriv->wps_probe_req_ie_len = cp_sz;
> -
> - }
> -
> - goto FREE_EXT;
> -
> - }
> -
> - if (len >= WEXT_CSCAN_HEADER_SIZE
> - && !memcmp(ext, WEXT_CSCAN_HEADER, WEXT_CSCAN_HEADER_SIZE)) {
> - ret = rtw_wx_set_scan(dev, info, awrq, ext);
> - goto FREE_EXT;
> - }
> -
> -FREE_EXT:
> -
> - vfree(ext);
> - #ifdef DEBUG_RTW_WX_SET_PRIV
> - vfree(ext_dbg);
> - #endif
> -
> - return ret;
> -
> -}
> -
> -static int rtw_pm_set(struct net_device *dev,
> - struct iw_request_info *info,
> - union iwreq_data *wrqu, char *extra)
> -{
> - int ret = 0;
> - unsigned mode = 0;
> - struct adapter *padapter = rtw_netdev_priv(dev);
> -
> - if (!memcmp(extra, "lps =", 4)) {
> - sscanf(extra+4, "%u", &mode);
> - ret = rtw_pm_set_lps(padapter, mode);
> - } else if (!memcmp(extra, "ips =", 4)) {
> - sscanf(extra+4, "%u", &mode);
> - ret = rtw_pm_set_ips(padapter, mode);
> - } else {
> - ret = -EINVAL;
> - }
> -
> - return ret;
> -}
> -
> -static int rtw_test(
> - struct net_device *dev,
> - struct iw_request_info *info,
> - union iwreq_data *wrqu, char *extra)
> -{
> - u32 len;
> - u8 *pbuf, *pch;
> - char *ptmp;
> - u8 *delim = ",";
> - struct adapter *padapter = rtw_netdev_priv(dev);
> -
> -
> - len = wrqu->data.length;
> -
> - pbuf = rtw_zmalloc(len);
> - if (!pbuf)
> - return -ENOMEM;
> -
> - if (copy_from_user(pbuf, wrqu->data.pointer, len)) {
> - kfree(pbuf);
> - return -EFAULT;
> - }
> -
> - ptmp = (char *)pbuf;
> - pch = strsep(&ptmp, delim);
> - if ((pch == NULL) || (strlen(pch) == 0)) {
> - kfree(pbuf);
> - return -EFAULT;
> - }
> -
> - if (strcmp(pch, "bton") == 0)
> - hal_btcoex_SetManualControl(padapter, false);
> -
> - if (strcmp(pch, "btoff") == 0)
> - hal_btcoex_SetManualControl(padapter, true);
> -
> - if (strcmp(pch, "h2c") == 0) {
> - u8 param[8];
> - u8 count = 0;
> - u32 tmp;
> - u8 i;
> - u32 pos;
> - s32 ret;
> -
> -
> - do {
> - pch = strsep(&ptmp, delim);
> - if ((pch == NULL) || (strlen(pch) == 0))
> - break;
> -
> - sscanf(pch, "%x", &tmp);
> - param[count++] = (u8)tmp;
> - } while (count < 8);
> -
> - if (count == 0) {
> - kfree(pbuf);
> - return -EFAULT;
> - }
> -
> - ret = rtw_hal_fill_h2c_cmd(padapter, param[0], count-1, ¶m[1]);
> -
> - pos = sprintf(extra, "H2C ID = 0x%02x content =", param[0]);
> - for (i = 1; i < count; i++)
> - pos += sprintf(extra+pos, "%02x,", param[i]);
> - extra[pos] = 0;
> - pos--;
> - pos += sprintf(extra+pos, " %s", ret == _FAIL?"FAIL":"OK");
> -
> - wrqu->data.length = strlen(extra) + 1;
> - }
> -
> - kfree(pbuf);
> - return 0;
> -}
> -
> -static iw_handler rtw_handlers[] = {
> - NULL, /* SIOCSIWCOMMIT */
> - rtw_wx_get_name, /* SIOCGIWNAME */
> - dummy, /* SIOCSIWNWID */
> - dummy, /* SIOCGIWNWID */
> - rtw_wx_set_freq, /* SIOCSIWFREQ */
> - rtw_wx_get_freq, /* SIOCGIWFREQ */
> - rtw_wx_set_mode, /* SIOCSIWMODE */
> - rtw_wx_get_mode, /* SIOCGIWMODE */
> - dummy, /* SIOCSIWSENS */
> - rtw_wx_get_sens, /* SIOCGIWSENS */
> - NULL, /* SIOCSIWRANGE */
> - rtw_wx_get_range, /* SIOCGIWRANGE */
> - rtw_wx_set_priv, /* SIOCSIWPRIV */
> - NULL, /* SIOCGIWPRIV */
> - NULL, /* SIOCSIWSTATS */
> - NULL, /* SIOCGIWSTATS */
> - dummy, /* SIOCSIWSPY */
> - dummy, /* SIOCGIWSPY */
> - NULL, /* SIOCGIWTHRSPY */
> - NULL, /* SIOCWIWTHRSPY */
> - rtw_wx_set_wap, /* SIOCSIWAP */
> - rtw_wx_get_wap, /* SIOCGIWAP */
> - rtw_wx_set_mlme, /* request MLME operation; uses struct iw_mlme */
> - dummy, /* SIOCGIWAPLIST -- depricated */
> - rtw_wx_set_scan, /* SIOCSIWSCAN */
> - rtw_wx_get_scan, /* SIOCGIWSCAN */
> - rtw_wx_set_essid, /* SIOCSIWESSID */
> - rtw_wx_get_essid, /* SIOCGIWESSID */
> - dummy, /* SIOCSIWNICKN */
> - rtw_wx_get_nick, /* SIOCGIWNICKN */
> - NULL, /* -- hole -- */
> - NULL, /* -- hole -- */
> - rtw_wx_set_rate, /* SIOCSIWRATE */
> - rtw_wx_get_rate, /* SIOCGIWRATE */
> - rtw_wx_set_rts, /* SIOCSIWRTS */
> - rtw_wx_get_rts, /* SIOCGIWRTS */
> - rtw_wx_set_frag, /* SIOCSIWFRAG */
> - rtw_wx_get_frag, /* SIOCGIWFRAG */
> - dummy, /* SIOCSIWTXPOW */
> - dummy, /* SIOCGIWTXPOW */
> - dummy, /* SIOCSIWRETRY */
> - rtw_wx_get_retry, /* SIOCGIWRETRY */
> - rtw_wx_set_enc, /* SIOCSIWENCODE */
> - rtw_wx_get_enc, /* SIOCGIWENCODE */
> - dummy, /* SIOCSIWPOWER */
> - rtw_wx_get_power, /* SIOCGIWPOWER */
> - NULL, /*---hole---*/
> - NULL, /*---hole---*/
> - rtw_wx_set_gen_ie, /* SIOCSIWGENIE */
> - NULL, /* SIOCGWGENIE */
> - rtw_wx_set_auth, /* SIOCSIWAUTH */
> - NULL, /* SIOCGIWAUTH */
> - rtw_wx_set_enc_ext, /* SIOCSIWENCODEEXT */
> - NULL, /* SIOCGIWENCODEEXT */
> - rtw_wx_set_pmkid, /* SIOCSIWPMKSA */
> - NULL, /*---hole---*/
> -};
> -
> -static const struct iw_priv_args rtw_private_args[] = {
> - {
> - SIOCIWFIRSTPRIV + 0x0,
> - IW_PRIV_TYPE_CHAR | 0x7FF, 0, "write"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x1,
> - IW_PRIV_TYPE_CHAR | 0x7FF,
> - IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "read"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x2, 0, 0, "driver_ext"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x3, 0, 0, "mp_ioctl"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x4,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "apinfo"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x5,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "setpid"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x6,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_start"
> - },
> -/* for PLATFORM_MT53XX */
> - {
> - SIOCIWFIRSTPRIV + 0x7,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "get_sensitivity"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x8,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_prob_req_ie"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x9,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_assoc_req_ie"
> - },
> -
> -/* for RTK_DMP_PLATFORM */
> - {
> - SIOCIWFIRSTPRIV + 0xA,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "channel_plan"
> - },
> -
> - {
> - SIOCIWFIRSTPRIV + 0xB,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "dbg"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0xC,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "rfw"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0xD,
> - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "rfr"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x10,
> - IW_PRIV_TYPE_CHAR | 1024, 0, "p2p_set"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x11,
> - IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "p2p_get"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x12, 0, 0, "NULL"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x13,
> - IW_PRIV_TYPE_CHAR | 64, IW_PRIV_TYPE_CHAR | 64, "p2p_get2"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x14,
> - IW_PRIV_TYPE_CHAR | 64, 0, "tdls"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x15,
> - IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, "tdls_get"
> - },
> - {
> - SIOCIWFIRSTPRIV + 0x16,
> - IW_PRIV_TYPE_CHAR | 64, 0, "pm_set"
> - },
> -
> - {SIOCIWFIRSTPRIV + 0x18, IW_PRIV_TYPE_CHAR | IFNAMSIZ, 0, "rereg_nd_name"},
> - {SIOCIWFIRSTPRIV + 0x1A, IW_PRIV_TYPE_CHAR | 1024, 0, "efuse_set"},
> - {SIOCIWFIRSTPRIV + 0x1B, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_get"},
> - {
> - SIOCIWFIRSTPRIV + 0x1D,
> - IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 0x7FF, "test"
> - },
> -};
> -
> -static iw_handler rtw_private_handler[] = {
> - rtw_wx_write32, /* 0x00 */
> - rtw_wx_read32, /* 0x01 */
> - rtw_drvext_hdl, /* 0x02 */
> - NULL, /* 0x03 */
> -
> -/* for MM DTV platform */
> - rtw_get_ap_info, /* 0x04 */
> -
> - rtw_set_pid, /* 0x05 */
> - rtw_wps_start, /* 0x06 */
> -
> -/* for PLATFORM_MT53XX */
> - rtw_wx_get_sensitivity, /* 0x07 */
> - rtw_wx_set_mtk_wps_probe_ie, /* 0x08 */
> - rtw_wx_set_mtk_wps_ie, /* 0x09 */
> -
> -/* for RTK_DMP_PLATFORM */
> -/* Set Channel depend on the country code */
> - rtw_wx_set_channel_plan, /* 0x0A */
> -
> - rtw_dbg_port, /* 0x0B */
> - rtw_wx_write_rf, /* 0x0C */
> - rtw_wx_read_rf, /* 0x0D */
> - rtw_wx_priv_null, /* 0x0E */
> - rtw_wx_priv_null, /* 0x0F */
> - rtw_p2p_set, /* 0x10 */
> - rtw_p2p_get, /* 0x11 */
> - NULL, /* 0x12 */
> - rtw_p2p_get2, /* 0x13 */
> -
> - NULL, /* 0x14 */
> - NULL, /* 0x15 */
> -
> - rtw_pm_set, /* 0x16 */
> - rtw_wx_priv_null, /* 0x17 */
> - rtw_rereg_nd_name, /* 0x18 */
> - rtw_wx_priv_null, /* 0x19 */
> - NULL, /* 0x1A */
> - NULL, /* 0x1B */
> - NULL, /* 0x1C is reserved for hostapd */
> - rtw_test, /* 0x1D */
> -};
> -
> -static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
> -{
> - struct adapter *padapter = rtw_netdev_priv(dev);
> - struct iw_statistics *piwstats = &padapter->iwstats;
> - int tmp_level = 0;
> - int tmp_qual = 0;
> - int tmp_noise = 0;
> -
> - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) != true) {
> - piwstats->qual.qual = 0;
> - piwstats->qual.level = 0;
> - piwstats->qual.noise = 0;
> - } else {
> - tmp_level = padapter->recvpriv.signal_strength;
> - tmp_qual = padapter->recvpriv.signal_qual;
> - tmp_noise = padapter->recvpriv.noise;
> -
> - piwstats->qual.level = tmp_level;
> - piwstats->qual.qual = tmp_qual;
> - piwstats->qual.noise = tmp_noise;
> - }
> - piwstats->qual.updated = IW_QUAL_ALL_UPDATED ;/* IW_QUAL_DBM; */
> -
> - return &padapter->iwstats;
> -}
> -
> -struct iw_handler_def rtw_handlers_def = {
> - .standard = rtw_handlers,
> - .num_standard = ARRAY_SIZE(rtw_handlers),
> -#if defined(CONFIG_WEXT_PRIV)
> - .private = rtw_private_handler,
> - .private_args = (struct iw_priv_args *)rtw_private_args,
> - .num_private = ARRAY_SIZE(rtw_private_handler),
> - .num_private_args = ARRAY_SIZE(rtw_private_args),
> -#endif
> - .get_wireless_stats = rtw_get_wireless_stats,
> -};
> -
> -/* copy from net/wireless/wext.c start */
> -/* ---------------------------------------------------------------- */
> -/*
> - * Calculate size of private arguments
> - */
> -static const char iw_priv_type_size[] = {
> - 0, /* IW_PRIV_TYPE_NONE */
> - 1, /* IW_PRIV_TYPE_BYTE */
> - 1, /* IW_PRIV_TYPE_CHAR */
> - 0, /* Not defined */
> - sizeof(__u32), /* IW_PRIV_TYPE_INT */
> - sizeof(struct iw_freq), /* IW_PRIV_TYPE_FLOAT */
> - sizeof(struct sockaddr), /* IW_PRIV_TYPE_ADDR */
> - 0, /* Not defined */
> -};
> -
> -static int get_priv_size(__u16 args)
> -{
> - int num = args & IW_PRIV_SIZE_MASK;
> - int type = (args & IW_PRIV_TYPE_MASK) >> 12;
> -
> - return num * iw_priv_type_size[type];
> -}
> /* copy from net/wireless/wext.c end */
>
> -static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_data)
> -{
> - int err = 0;
> - u8 *input = NULL;
> - u32 input_len = 0;
> - const char delim[] = " ";
> - u8 *output = NULL;
> - u32 output_len = 0;
> - u32 count = 0;
> - u8 *buffer = NULL;
> - u32 buffer_len = 0;
> - char *ptr = NULL;
> - u8 cmdname[17] = {0}; /* IFNAMSIZ+1 */
> - u32 cmdlen;
> - s32 len;
> - u8 *extra = NULL;
> - u32 extra_size = 0;
> -
> - s32 k;
> - const iw_handler *priv; /* Private ioctl */
> - const struct iw_priv_args *priv_args; /* Private ioctl description */
> - u32 num_priv_args; /* Number of descriptions */
> - iw_handler handler;
> - int temp;
> - int subcmd = 0; /* sub-ioctl index */
> - int offset = 0; /* Space for sub-ioctl index */
> -
> - union iwreq_data wdata;
> -
> -
> - memcpy(&wdata, wrq_data, sizeof(wdata));
> -
> - input_len = 2048;
> - input = rtw_zmalloc(input_len);
> - if (NULL == input)
> - return -ENOMEM;
> - if (copy_from_user(input, wdata.data.pointer, input_len)) {
> - err = -EFAULT;
> - goto exit;
> - }
> - ptr = input;
> - len = strlen(input);
> -
> - sscanf(ptr, "%16s", cmdname);
> - cmdlen = strlen(cmdname);
> -
> - /* skip command string */
> - if (cmdlen > 0)
> - cmdlen += 1; /* skip one space */
> - ptr += cmdlen;
> - len -= cmdlen;
> -
> - priv = rtw_private_handler;
> - priv_args = rtw_private_args;
> - num_priv_args = ARRAY_SIZE(rtw_private_args);
> -
> - if (num_priv_args == 0) {
> - err = -EOPNOTSUPP;
> - goto exit;
> - }
> -
> - /* Search the correct ioctl */
> - k = -1;
> - while ((++k < num_priv_args) && strcmp(priv_args[k].name, cmdname));
> -
> - /* If not found... */
> - if (k == num_priv_args) {
> - err = -EOPNOTSUPP;
> - goto exit;
> - }
> -
> - /* Watch out for sub-ioctls ! */
> - if (priv_args[k].cmd < SIOCDEVPRIVATE) {
> - int j = -1;
> -
> - /* Find the matching *real* ioctl */
> - while ((++j < num_priv_args) && ((priv_args[j].name[0] != '\0') ||
> - (priv_args[j].set_args != priv_args[k].set_args) ||
> - (priv_args[j].get_args != priv_args[k].get_args)));
> -
> - /* If not found... */
> - if (j == num_priv_args) {
> - err = -EINVAL;
> - goto exit;
> - }
> -
> - /* Save sub-ioctl number */
> - subcmd = priv_args[k].cmd;
> - /* Reserve one int (simplify alignment issues) */
> - offset = sizeof(__u32);
> - /* Use real ioctl definition from now on */
> - k = j;
> - }
> -
> - buffer = rtw_zmalloc(4096);
> - if (NULL == buffer) {
> - err = -ENOMEM;
> - goto exit;
> - }
> -
> - /* If we have to set some data */
> - if ((priv_args[k].set_args & IW_PRIV_TYPE_MASK) &&
> - (priv_args[k].set_args & IW_PRIV_SIZE_MASK)) {
> - u8 *str;
> -
> - switch (priv_args[k].set_args & IW_PRIV_TYPE_MASK) {
> - case IW_PRIV_TYPE_BYTE:
> - /* Fetch args */
> - count = 0;
> - do {
> - str = strsep(&ptr, delim);
> - if (NULL == str)
> - break;
> - sscanf(str, "%i", &temp);
> - buffer[count++] = (u8)temp;
> - } while (1);
> - buffer_len = count;
> -
> - /* Number of args to fetch */
> - wdata.data.length = count;
> - if (wdata.data.length > (priv_args[k].set_args & IW_PRIV_SIZE_MASK))
> - wdata.data.length = priv_args[k].set_args & IW_PRIV_SIZE_MASK;
> -
> - break;
> -
> - case IW_PRIV_TYPE_INT:
> - /* Fetch args */
> - count = 0;
> - do {
> - str = strsep(&ptr, delim);
> - if (NULL == str)
> - break;
> - sscanf(str, "%i", &temp);
> - ((s32 *)buffer)[count++] = (s32)temp;
> - } while (1);
> - buffer_len = count * sizeof(s32);
> -
> - /* Number of args to fetch */
> - wdata.data.length = count;
> - if (wdata.data.length > (priv_args[k].set_args & IW_PRIV_SIZE_MASK))
> - wdata.data.length = priv_args[k].set_args & IW_PRIV_SIZE_MASK;
> -
> - break;
> -
> - case IW_PRIV_TYPE_CHAR:
> - if (len > 0) {
> - /* Size of the string to fetch */
> - wdata.data.length = len;
> - if (wdata.data.length > (priv_args[k].set_args & IW_PRIV_SIZE_MASK))
> - wdata.data.length = priv_args[k].set_args & IW_PRIV_SIZE_MASK;
> -
> - /* Fetch string */
> - memcpy(buffer, ptr, wdata.data.length);
> - } else {
> - wdata.data.length = 1;
> - buffer[0] = '\0';
> - }
> - buffer_len = wdata.data.length;
> - break;
> -
> - default:
> - err = -1;
> - goto exit;
> - }
> -
> - if ((priv_args[k].set_args & IW_PRIV_SIZE_FIXED) &&
> - (wdata.data.length != (priv_args[k].set_args & IW_PRIV_SIZE_MASK))) {
> - err = -EINVAL;
> - goto exit;
> - }
> - } else { /* if args to set */
> - wdata.data.length = 0L;
> - }
> -
> - /* Those two tests are important. They define how the driver
> - * will have to handle the data */
> - if ((priv_args[k].set_args & IW_PRIV_SIZE_FIXED) &&
> - ((get_priv_size(priv_args[k].set_args) + offset) <= IFNAMSIZ)) {
> - /* First case : all SET args fit within wrq */
> - if (offset)
> - wdata.mode = subcmd;
> - memcpy(wdata.name + offset, buffer, IFNAMSIZ - offset);
> - } else {
> - if ((priv_args[k].set_args == 0) &&
> - (priv_args[k].get_args & IW_PRIV_SIZE_FIXED) &&
> - (get_priv_size(priv_args[k].get_args) <= IFNAMSIZ)) {
> - /* Second case : no SET args, GET args fit within wrq */
> - if (offset)
> - wdata.mode = subcmd;
> - } else {
> - /* Third case : args won't fit in wrq, or variable number of args */
> - if (copy_to_user(wdata.data.pointer, buffer, buffer_len)) {
> - err = -EFAULT;
> - goto exit;
> - }
> - wdata.data.flags = subcmd;
> - }
> - }
> -
> - kfree(input);
> - input = NULL;
> -
> - extra_size = 0;
> - if (IW_IS_SET(priv_args[k].cmd)) {
> - /* Size of set arguments */
> - extra_size = get_priv_size(priv_args[k].set_args);
> -
> - /* Does it fits in iwr ? */
> - if ((priv_args[k].set_args & IW_PRIV_SIZE_FIXED) &&
> - ((extra_size + offset) <= IFNAMSIZ))
> - extra_size = 0;
> - } else {
> - /* Size of get arguments */
> - extra_size = get_priv_size(priv_args[k].get_args);
> -
> - /* Does it fits in iwr ? */
> - if ((priv_args[k].get_args & IW_PRIV_SIZE_FIXED) &&
> - (extra_size <= IFNAMSIZ))
> - extra_size = 0;
> - }
> -
> - if (extra_size == 0) {
> - extra = (u8 *)&wdata;
> - kfree(buffer);
> - buffer = NULL;
> - } else
> - extra = buffer;
> -
> - handler = priv[priv_args[k].cmd - SIOCIWFIRSTPRIV];
> - err = handler(dev, NULL, &wdata, extra);
> -
> - /* If we have to get some data */
> - if ((priv_args[k].get_args & IW_PRIV_TYPE_MASK) &&
> - (priv_args[k].get_args & IW_PRIV_SIZE_MASK)) {
> - int j;
> - int n = 0; /* number of args */
> - u8 str[20] = {0};
> -
> - /* Check where is the returned data */
> - if ((priv_args[k].get_args & IW_PRIV_SIZE_FIXED) &&
> - (get_priv_size(priv_args[k].get_args) <= IFNAMSIZ))
> - n = priv_args[k].get_args & IW_PRIV_SIZE_MASK;
> - else
> - n = wdata.data.length;
> -
> - output = rtw_zmalloc(4096);
> - if (NULL == output) {
> - err = -ENOMEM;
> - goto exit;
> - }
> -
> - switch (priv_args[k].get_args & IW_PRIV_TYPE_MASK) {
> - case IW_PRIV_TYPE_BYTE:
> - /* Display args */
> - for (j = 0; j < n; j++) {
> - len = scnprintf(str, sizeof(str), "%d ", extra[j]);
> - output_len = strlen(output);
> - if ((output_len + len + 1) > 4096) {
> - err = -E2BIG;
> - goto exit;
> - }
> - memcpy(output+output_len, str, len);
> - }
> - break;
> -
> - case IW_PRIV_TYPE_INT:
> - /* Display args */
> - for (j = 0; j < n; j++) {
> - len = scnprintf(str, sizeof(str), "%d ", ((__s32 *)extra)[j]);
> - output_len = strlen(output);
> - if ((output_len + len + 1) > 4096) {
> - err = -E2BIG;
> - goto exit;
> - }
> - memcpy(output+output_len, str, len);
> - }
> - break;
> -
> - case IW_PRIV_TYPE_CHAR:
> - /* Display args */
> - memcpy(output, extra, n);
> - break;
> -
> - default:
> - err = -1;
> - goto exit;
> - }
> -
> - output_len = strlen(output) + 1;
> - wrq_data->data.length = output_len;
> - if (copy_to_user(wrq_data->data.pointer, output, output_len)) {
> - err = -EFAULT;
> - goto exit;
> - }
> - } else { /* if args to set */
> - wrq_data->data.length = 0;
> - }
> -
> -exit:
> - kfree(input);
> - kfree(buffer);
> - kfree(output);
> -
> - return err;
> -}
> -
> + int rtw_siocdevprivate(struct net_device *dev, struct ifreq *rq,
> + void __user *data, int cmd)
> + {
> - struct iwreq *wrq = (struct iwreq *)rq;
> -
> + /* little hope of fixing this, better remove the whole function */
> + if (in_compat_syscall())
> + return -EOPNOTSUPP;
> +
> + if (cmd != SIOCDEVPRIVATE)
> + return -EOPNOTSUPP;
> +
> - return rtw_ioctl_wext_private(dev, &wrq->u);
> ++ return -EOPNOTSUPP;
> + }
> +
> int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
> {
> struct iwreq *wrq = (struct iwreq *)rq;
Should all now be resolved in Linus's tree.
thanks,
greg k-h