2011-07-12 15:13:07

by Ali Bahar

[permalink] [raw]
Subject: [PATCH 0/2] staging: r8712u: Set ESSID/AP now possible before interface is brought Up.

These are updates to how the 'bup' flag is handled. The first allows Sets
before the interface is brought Up, and the second is housekeeping of the
flag's value when the interface is taken Down.

Ali Bahar (2):
staging: r8712u: Sets to SSID, and to AP MAC#, can now be done
when the interface is Down.
staging: r8712u: Interface-state not fully tracked.

drivers/staging/rtl8712/drv_types.h | 5 +++++
drivers/staging/rtl8712/os_intfs.c | 14 ++++++++++++++
drivers/staging/rtl8712/rtl871x_ioctl_linux.c | 25 +++++++++++++++++++++----
3 files changed, 40 insertions(+), 4 deletions(-)

--
1.7.6



2011-07-12 15:13:07

by Ali Bahar

[permalink] [raw]
Subject: [PATCH 1/2] staging: r8712u: Sets to SSID, and to AP MAC#, can now be done when the interface is Down.

The original Realtek code assumed that ioctl Sets get done after the
interface is Up. This included the set to Essid and to the AP MAC#;
and it fit Realtek's installation procedure. But there is no such
necessity for the adapter, and no stated requirement found
elsewhere. Also, wireless drivers typically permit this.

A typical error message used to be:
Error for wireless request "Set ESSID" (8B1A) :
SET failed on device wlan0 ; Operation not permitted.

Signed-off-by: Ali Bahar <[email protected]>
---
Larry,

this matches _your_ patch, of course. So it is a good candidate for an initial
submission -- to ensure that I don't fall foul of the process.

Ali

---
drivers/staging/rtl8712/drv_types.h | 5 +++++
drivers/staging/rtl8712/rtl871x_ioctl_linux.c | 25 +++++++++++++++++++++----
2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/rtl8712/drv_types.h b/drivers/staging/rtl8712/drv_types.h
index 3bb66dc..fd50f78 100644
--- a/drivers/staging/rtl8712/drv_types.h
+++ b/drivers/staging/rtl8712/drv_types.h
@@ -118,6 +118,11 @@ struct dvobj_priv {
struct usb_device *pusbdev;
};

+/**
+ * struct _adapter - the main adapter structure for this device.
+ *
+ * bup: True indicates that the interface is Up.
+ */
struct _adapter {
struct dvobj_priv dvobjpriv;
struct mlme_priv mlmepriv;
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
index 40e6b5c..59bdab1 100644
--- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
+++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
@@ -975,6 +975,13 @@ static int r871x_wx_set_priv(struct net_device *dev,
* s2. set_802_11_authentication_mode()
* s3. set_802_11_encryption_mode()
* s4. set_802_11_bssid()
+ *
+ * This function intends to handle the Set AP command, which specifies the
+ * MAC# of a preferred Access Point.
+ * Currently, the request comes via Wireless Extensions' SIOCSIWAP ioctl.
+ *
+ * For this operation to succeed, there is no need for the interface to be Up.
+ *
*/
static int r8711_wx_set_wap(struct net_device *dev,
struct iw_request_info *info,
@@ -992,8 +999,6 @@ static int r8711_wx_set_wap(struct net_device *dev,
struct wlan_network *pnetwork = NULL;
enum NDIS_802_11_AUTHENTICATION_MODE authmode;

- if (padapter->bup == false)
- return -1;
if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true)
return -1;
if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true)
@@ -1074,6 +1079,14 @@ static int r871x_wx_set_mlme(struct net_device *dev,
return ret;
}

+/**
+ *
+ * This function intends to handle the Set Scan command.
+ * Currently, the request comes via Wireless Extensions' SIOCSIWSCAN ioctl.
+ *
+ * For this operation to succeed, the interface is brought Up beforehand.
+ *
+ */
static int r8711_wx_set_scan(struct net_device *dev,
struct iw_request_info *a,
union iwreq_data *wrqu, char *extra)
@@ -1169,6 +1182,12 @@ static int r8711_wx_get_scan(struct net_device *dev,
* s2. set_802_11_authenticaion_mode()
* s3. set_802_11_encryption_mode()
* s4. set_802_11_ssid()
+ *
+ * This function intends to handle the Set ESSID command.
+ * Currently, the request comes via the Wireless Extensions' SIOCSIWESSID ioctl.
+ *
+ * For this operation to succeed, there is no need for the interface to be Up.
+ *
*/
static int r8711_wx_set_essid(struct net_device *dev,
struct iw_request_info *a,
@@ -1184,8 +1203,6 @@ static int r8711_wx_set_essid(struct net_device *dev,
struct list_head *phead;
u32 len;

- if (padapter->bup == false)
- return -1;
if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
return -1;
if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
--
1.7.6


2011-07-12 15:13:07

by Ali Bahar

[permalink] [raw]
Subject: [PATCH 2/2] staging: r8712u: Interface-state not fully tracked.

padapter->bup is True when the interface has been
brought Up. But it was not being reset when the
interface is taken Down.
This has not caused a known problem, as other
state variables may be compensating for it. Never
the less, it is now properly tracked.

Signed-off-by: Ali Bahar <[email protected]>
---
drivers/staging/rtl8712/os_intfs.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/drivers/staging/rtl8712/os_intfs.c b/drivers/staging/rtl8712/os_intfs.c
index 3f38e8e..6697941 100644
--- a/drivers/staging/rtl8712/os_intfs.c
+++ b/drivers/staging/rtl8712/os_intfs.c
@@ -375,6 +375,12 @@ static void enable_video_mode(struct _adapter *padapter, int cbw40_value)
r8712_fw_cmd(padapter, intcmd);
}

+/**
+ *
+ * This function intends to handle the activation of an interface
+ * i.e. when it is brought Up/Active from a Down state.
+ *
+ */
static int netdev_open(struct net_device *pnetdev)
{
struct _adapter *padapter = (struct _adapter *)_netdev_priv(pnetdev);
@@ -434,6 +440,12 @@ netdev_open_error:
return -1;
}

+/**
+ *
+ * This function intends to handle the shutdown of an interface
+ * i.e. when it is brought Down from an Up/Active state.
+ *
+ */
static int netdev_close(struct net_device *pnetdev)
{
struct _adapter *padapter = (struct _adapter *) _netdev_priv(pnetdev);
@@ -458,6 +470,8 @@ static int netdev_close(struct net_device *pnetdev)
r8712_free_network_queue(padapter);
/*Stop driver mlme relation timer*/
stop_drv_timers(padapter);
+ /* The interface is no longer Up: */
+ padapter->bup = false;
return 0;
}

--
1.7.6


2011-07-12 15:21:35

by Larry Finger

[permalink] [raw]
Subject: Re: [PATCH 1/2] staging: r8712u: Sets to SSID, and to AP MAC#, can now be done when the interface is Down.

On 07/12/2011 10:10 AM, Ali Bahar wrote:
> The original Realtek code assumed that ioctl Sets get done after the
> interface is Up. This included the set to Essid and to the AP MAC#;
> and it fit Realtek's installation procedure. But there is no such
> necessity for the adapter, and no stated requirement found
> elsewhere. Also, wireless drivers typically permit this.
>
> A typical error message used to be:
> Error for wireless request "Set ESSID" (8B1A) :
> SET failed on device wlan0 ; Operation not permitted.
>
> Signed-off-by: Ali Bahar<[email protected]>
> ---
> Larry,
>
> this matches _your_ patch, of course. So it is a good candidate for an initial
> submission -- to ensure that I don't fall foul of the process.
>
> Ali
>

Acked-by: Larry Finger <[email protected]>

Greg,

This patch might be pushed to stable, but I'm not 100% sure. If r8712u is
controlled by NetworkManager, it behaves correctly. It fails only when used as
an AP, and perhaps with some versions of manual network control.

Larry

> ---
> drivers/staging/rtl8712/drv_types.h | 5 +++++
> drivers/staging/rtl8712/rtl871x_ioctl_linux.c | 25 +++++++++++++++++++++----
> 2 files changed, 26 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/staging/rtl8712/drv_types.h b/drivers/staging/rtl8712/drv_types.h
> index 3bb66dc..fd50f78 100644
> --- a/drivers/staging/rtl8712/drv_types.h
> +++ b/drivers/staging/rtl8712/drv_types.h
> @@ -118,6 +118,11 @@ struct dvobj_priv {
> struct usb_device *pusbdev;
> };
>
> +/**
> + * struct _adapter - the main adapter structure for this device.
> + *
> + * bup: True indicates that the interface is Up.
> + */
> struct _adapter {
> struct dvobj_priv dvobjpriv;
> struct mlme_priv mlmepriv;
> diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
> index 40e6b5c..59bdab1 100644
> --- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
> +++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
> @@ -975,6 +975,13 @@ static int r871x_wx_set_priv(struct net_device *dev,
> * s2. set_802_11_authentication_mode()
> * s3. set_802_11_encryption_mode()
> * s4. set_802_11_bssid()
> + *
> + * This function intends to handle the Set AP command, which specifies the
> + * MAC# of a preferred Access Point.
> + * Currently, the request comes via Wireless Extensions' SIOCSIWAP ioctl.
> + *
> + * For this operation to succeed, there is no need for the interface to be Up.
> + *
> */
> static int r8711_wx_set_wap(struct net_device *dev,
> struct iw_request_info *info,
> @@ -992,8 +999,6 @@ static int r8711_wx_set_wap(struct net_device *dev,
> struct wlan_network *pnetwork = NULL;
> enum NDIS_802_11_AUTHENTICATION_MODE authmode;
>
> - if (padapter->bup == false)
> - return -1;
> if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true)
> return -1;
> if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true)
> @@ -1074,6 +1079,14 @@ static int r871x_wx_set_mlme(struct net_device *dev,
> return ret;
> }
>
> +/**
> + *
> + * This function intends to handle the Set Scan command.
> + * Currently, the request comes via Wireless Extensions' SIOCSIWSCAN ioctl.
> + *
> + * For this operation to succeed, the interface is brought Up beforehand.
> + *
> + */
> static int r8711_wx_set_scan(struct net_device *dev,
> struct iw_request_info *a,
> union iwreq_data *wrqu, char *extra)
> @@ -1169,6 +1182,12 @@ static int r8711_wx_get_scan(struct net_device *dev,
> * s2. set_802_11_authenticaion_mode()
> * s3. set_802_11_encryption_mode()
> * s4. set_802_11_ssid()
> + *
> + * This function intends to handle the Set ESSID command.
> + * Currently, the request comes via the Wireless Extensions' SIOCSIWESSID ioctl.
> + *
> + * For this operation to succeed, there is no need for the interface to be Up.
> + *
> */
> static int r8711_wx_set_essid(struct net_device *dev,
> struct iw_request_info *a,
> @@ -1184,8 +1203,6 @@ static int r8711_wx_set_essid(struct net_device *dev,
> struct list_head *phead;
> u32 len;
>
> - if (padapter->bup == false)
> - return -1;
> if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
> return -1;
> if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))


2011-07-12 15:22:39

by Larry Finger

[permalink] [raw]
Subject: Re: [PATCH 2/2] staging: r8712u: Interface-state not fully tracked.

On 07/12/2011 10:10 AM, Ali Bahar wrote:
> padapter->bup is True when the interface has been
> brought Up. But it was not being reset when the
> interface is taken Down.
> This has not caused a known problem, as other
> state variables may be compensating for it. Never
> the less, it is now properly tracked.
>
> Signed-off-by: Ali Bahar<[email protected]>
> ---
> drivers/staging/rtl8712/os_intfs.c | 14 ++++++++++++++
> 1 files changed, 14 insertions(+), 0 deletions(-)

ACKed-by: Larry Finger <[email protected]>