Example #1
0
static int __wil_up(struct wil6210_priv *wil)
{
	struct net_device *ndev = wil_to_ndev(wil);
	struct wireless_dev *wdev = wil->wdev;
	int rc;

	WARN_ON(!mutex_is_locked(&wil->mutex));

	rc = wil_reset(wil);
	if (rc)
		return rc;

	/* Rx VRING. After MAC and beacon */
	rc = wil_rx_init(wil);
	if (rc)
		return rc;

	switch (wdev->iftype) {
	case NL80211_IFTYPE_STATION:
		wil_dbg_misc(wil, "type: STATION\n");
		ndev->type = ARPHRD_ETHER;
		break;
	case NL80211_IFTYPE_AP:
		wil_dbg_misc(wil, "type: AP\n");
		ndev->type = ARPHRD_ETHER;
		break;
	case NL80211_IFTYPE_P2P_CLIENT:
		wil_dbg_misc(wil, "type: P2P_CLIENT\n");
		ndev->type = ARPHRD_ETHER;
		break;
	case NL80211_IFTYPE_P2P_GO:
		wil_dbg_misc(wil, "type: P2P_GO\n");
		ndev->type = ARPHRD_ETHER;
		break;
	case NL80211_IFTYPE_MONITOR:
		wil_dbg_misc(wil, "type: Monitor\n");
		ndev->type = ARPHRD_IEEE80211_RADIOTAP;
		/* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_RADIOTAP ? */
		break;
	default:
		return -EOPNOTSUPP;
	}

	/* MAC address - pre-requisite for other commands */
	wmi_set_mac_address(wil, ndev->dev_addr);


	napi_enable(&wil->napi_rx);
	napi_enable(&wil->napi_tx);
	set_bit(wil_status_napi_en, &wil->status);

	return 0;
}
Example #2
0
static int __wil_up(struct wil6210_priv *wil)
{
	struct net_device *ndev = wil_to_ndev(wil);
	struct wireless_dev *wdev = wil->wdev;
	struct ieee80211_channel *channel = wdev->preset_chandef.chan;
	int rc;
	int bi;
	u16 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype);

	rc = wil_reset(wil);
	if (rc)
		return rc;

	/* FIXME Firmware works now in PBSS mode(ToDS=0, FromDS=0) */
	wmi_nettype = wil_iftype_nl2wmi(NL80211_IFTYPE_ADHOC);
	switch (wdev->iftype) {
	case NL80211_IFTYPE_STATION:
		wil_dbg_misc(wil, "type: STATION\n");
		bi = 0;
		ndev->type = ARPHRD_ETHER;
		break;
	case NL80211_IFTYPE_AP:
		wil_dbg_misc(wil, "type: AP\n");
		bi = 100;
		ndev->type = ARPHRD_ETHER;
		break;
	case NL80211_IFTYPE_P2P_CLIENT:
		wil_dbg_misc(wil, "type: P2P_CLIENT\n");
		bi = 0;
		ndev->type = ARPHRD_ETHER;
		break;
	case NL80211_IFTYPE_P2P_GO:
		wil_dbg_misc(wil, "type: P2P_GO\n");
		bi = 100;
		ndev->type = ARPHRD_ETHER;
		break;
	case NL80211_IFTYPE_MONITOR:
		wil_dbg_misc(wil, "type: Monitor\n");
		bi = 0;
		ndev->type = ARPHRD_IEEE80211_RADIOTAP;
		/* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_RADIOTAP ? */
		break;
	default:
		return -EOPNOTSUPP;
	}

	/* Apply profile in the following order: */
	/* SSID and channel for the AP */
	switch (wdev->iftype) {
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_P2P_GO:
		if (wdev->ssid_len == 0) {
			wil_err(wil, "SSID not set\n");
			return -EINVAL;
		}
		rc = wmi_set_ssid(wil, wdev->ssid_len, wdev->ssid);
		if (rc)
			return rc;
		break;
	default:
		break;
	}

	/* MAC address - pre-requisite for other commands */
	wmi_set_mac_address(wil, ndev->dev_addr);

	/* Set up beaconing if required. */
	if (bi > 0) {
		rc = wmi_pcp_start(wil, bi, wmi_nettype,
				   (channel ? channel->hw_value : 0));
		if (rc)
			return rc;
	}

	/* Rx VRING. After MAC and beacon */
	wil_rx_init(wil);

	return 0;
}
Example #3
0
static int wil_cfg80211_start_ap(struct wiphy *wiphy,
                                 struct net_device *ndev,
                                 struct cfg80211_ap_settings *info)
{
    int rc = 0;
    struct wil6210_priv *wil = wiphy_to_wil(wiphy);
    struct wireless_dev *wdev = ndev->ieee80211_ptr;
    struct ieee80211_channel *channel = info->chandef.chan;
    struct cfg80211_beacon_data *bcon = &info->beacon;
    u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype);

    if (!channel) {
        wil_err(wil, "AP: No channel???\n");
        return -EINVAL;
    }

    wil_dbg_misc(wil, "AP on Channel %d %d MHz, %s\n", channel->hw_value,
                 channel->center_freq, info->privacy ? "secure" : "open");
    print_hex_dump_bytes("SSID ", DUMP_PREFIX_OFFSET,
                         info->ssid, info->ssid_len);

    if (wil_fix_bcon(wil, bcon))
        wil_dbg_misc(wil, "Fixed bcon\n");

    mutex_lock(&wil->mutex);

    rc = wil_reset(wil);
    if (rc)
        goto out;

    /* Rx VRING. */
    rc = wil_rx_init(wil);
    if (rc)
        goto out;

    rc = wmi_set_ssid(wil, info->ssid_len, info->ssid);
    if (rc)
        goto out;

    /* MAC address - pre-requisite for other commands */
    wmi_set_mac_address(wil, ndev->dev_addr);

    /* IE's */
    /* bcon 'head IE's are not relevant for 60g band */
    /*
     * FW do not form regular beacon, so bcon IE's are not set
     * For the DMG bcon, when it will be supported, bcon IE's will
     * be reused; add something like:
     * wmi_set_ie(wil, WMI_FRAME_BEACON, bcon->beacon_ies_len,
     * bcon->beacon_ies);
     */
    wmi_set_ie(wil, WMI_FRAME_PROBE_RESP, bcon->proberesp_ies_len,
               bcon->proberesp_ies);
    wmi_set_ie(wil, WMI_FRAME_ASSOC_RESP, bcon->assocresp_ies_len,
               bcon->assocresp_ies);

    wil->secure_pcp = info->privacy;

    rc = wmi_pcp_start(wil, info->beacon_interval, wmi_nettype,
                       channel->hw_value);
    if (rc)
        goto out;


    netif_carrier_on(ndev);

out:
    mutex_unlock(&wil->mutex);
    return rc;
}