Re: [PATCH] staging: brcm80211: bug fix - connection status report

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Oct 6, 2010 at 7:59 PM, nohee ko <noheek@xxxxxxxxxxxx> wrote:
> When brcmfmac fails to connect to AP, it reports failure status to
> cfg80211 plane. Originally this logic was missing.
>
> Signed-off-by: Nohee Ko <noheek@xxxxxxxxxxxx>
> ---
>  drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c |   44 ++++++++++++++++++----
>  1 files changed, 36 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
> index 0c5d5cf..896a6fd 100644
> --- a/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
> +++ b/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
> @@ -142,7 +142,8 @@ static int32 wl_notify_roaming_status(struct wl_priv *wl,
>  static int32 wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev,
>                                   const wl_event_msg_t *e, void *data);
>  static int32 wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev,
> -                                const wl_event_msg_t *e, void *data);
> +                                const wl_event_msg_t *e, void *data,
> +                               bool completed);
>  static int32 wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev,
>                                 const wl_event_msg_t *e, void *data);
>  static int32 wl_notify_mic_status(struct wl_priv *wl, struct net_device *ndev,
> @@ -251,6 +252,7 @@ static bool wl_is_ibssstarter(struct wl_priv *wl);
>  */
>  static bool wl_is_linkdown(struct wl_priv *wl, const wl_event_msg_t *e);
>  static bool wl_is_linkup(struct wl_priv *wl, const wl_event_msg_t *e);
> +static bool wl_is_nonetwork(struct wl_priv *wl, const wl_event_msg_t *e);
>  static void wl_link_up(struct wl_priv *wl);
>  static void wl_link_down(struct wl_priv *wl);
>  static int32 wl_dongle_mode(struct net_device *ndev, int32 iftype);
> @@ -2266,8 +2268,10 @@ static int32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi)
>        freq = ieee80211_channel_to_frequency(notif_bss_info->channel);
>        channel = ieee80211_get_channel(wiphy, freq);
>
> -       WL_DBG(("SSID : \"%s\", rssi (%d), capability : 0x04%x\n", bi->SSID,
> -               notif_bss_info->rssi, mgmt->u.probe_resp.capab_info));
> +       WL_DBG(("SSID : \"%s\", rssi %d, channel %d, capability : 0x04%x\n",
> +               bi->SSID,
> +               notif_bss_info->rssi, notif_bss_info->channel,
> +               mgmt->u.probe_resp.capab_info));
>
>        signal = notif_bss_info->rssi * 100;
>        if (unlikely(!cfg80211_inform_bss_frame(wiphy, channel, mgmt,
> @@ -2320,6 +2324,19 @@ static bool wl_is_linkdown(struct wl_priv *wl, const wl_event_msg_t *e)
>        return FALSE;
>  }
>
> +static bool wl_is_nonetwork(struct wl_priv *wl, const wl_event_msg_t *e)
> +{
> +       uint32 event = ntoh32(e->event_type);
> +       uint32 status = ntoh32(e->status);
> +
> +       if (event == WLC_E_SET_SSID || event == WLC_E_LINK) {
> +               if (status == WLC_E_STATUS_NO_NETWORKS)
> +                       return TRUE;
> +       }
> +
> +       return FALSE;
> +}
> +
>  static int32
>  wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
>                         const wl_event_msg_t *e, void *data)
> @@ -2334,7 +2351,7 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
>                                             GFP_KERNEL);
>                        WL_DBG(("joined in IBSS network\n"));
>                } else {
> -                       wl_bss_connect_done(wl, ndev, e, data);
> +                       wl_bss_connect_done(wl, ndev, e, data, TRUE);
>                        WL_DBG(("joined in BSS network \"%s\"\n",
>                                ((struct wlc_ssid *)
>                                 wl_read_prof(wl, WL_PROF_SSID))->SSID));
> @@ -2346,6 +2363,8 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
>                clear_bit(WL_STATUS_CONNECTED, &wl->status);
>                wl_link_down(wl);
>                wl_init_prof(wl->profile);
> +       } else if (wl_is_nonetwork(wl, e)) {
> +               wl_bss_connect_done(wl, ndev, e, data, FALSE);
>        }
>
>        return err;
> @@ -2522,7 +2541,7 @@ wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev,
>
>  static int32
>  wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev,
> -                   const wl_event_msg_t *e, void *data)
> +                   const wl_event_msg_t *e, void *data, bool completed)
>  {
>        struct wl_connect_info *conn_info = wl_to_conn(wl);
>        int32 err = 0;
> @@ -2537,8 +2556,10 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev,
>                                        conn_info->req_ie_len,
>                                        conn_info->resp_ie,
>                                        conn_info->resp_ie_len,
> -                                       WLAN_STATUS_SUCCESS, GFP_KERNEL);
> -               WL_DBG(("Report connect result\n"));
> +                                       completed ? WLAN_STATUS_SUCCESS : WLAN_STATUS_AUTH_TIMEOUT,
> +                                       GFP_KERNEL);
> +               WL_DBG(("Report connect result - connection %s\n",
> +                       completed ? "succeeded" : "failed"));
>        } else {
>                cfg80211_roamed(ndev,
>                                (u8 *)&wl->bssid,
> @@ -2655,6 +2676,7 @@ static void wl_init_eloop_handler(struct wl_event_loop *el)
>        el->handler[WLC_E_REASSOC_IND] = wl_notify_connect_status;
>        el->handler[WLC_E_ROAM] = wl_notify_roaming_status;
>        el->handler[WLC_E_MIC_ERROR] = wl_notify_mic_status;
> +       el->handler[WLC_E_SET_SSID] = wl_notify_connect_status;
>  }
>
>  static int32 wl_init_priv_mem(struct wl_priv *wl)
> @@ -3790,7 +3812,13 @@ wl_update_prof(struct wl_priv *wl, const wl_event_msg_t *e, void *data,
>
>  void wl_cfg80211_dbg_level(uint32 level)
>  {
> -       wl_dbg_level = level;
> +       /*
> +       * prohibit to change debug level
> +       * by insmod parameter.
> +       * eventually debug level will be configured
> +       * in compile time by using CONFIG_XXX
> +       */
> +       /* wl_dbg_level = level; */

May I ask why? In general, runtime debug level setting is considered
superior to compile-time; see iwlwifi.

>  }
>
>  static bool wl_is_ibssmode(struct wl_priv *wl)
> --
> 1.7.0.4
>
> _______________________________________________
> devel mailing list
> devel@xxxxxxxxxxxxxxxxxxxxxx
> http://driverdev.linuxdriverproject.org/mailman/listinfo/devel
>



-- 
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux