Search Linux Wireless

Re: [PATCH v6 1/6] mac80211: introduce switch_vif_chanctx op

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

 



On Thu, 2014-05-22 at 16:07 +0200, Michal Kazior wrote:
> This new device driver operation will be used for
> channel context reservation and switching.

Heh. Luca just had some very similar code. But that's not necessarily a
bad thing - we can compare :)

> +	int (*switch_vif_chanctx)(struct ieee80211_hw *hw,
> +				  struct ieee80211_vif **vifs,
> +				  struct ieee80211_chanctx_conf **old_ctx,
> +				  struct ieee80211_chanctx_conf **new_ctx,
> +				  int n_vifs,
> +				  enum ieee80211_chanctx_swmode swmode);

Luca had a struct here with (vif, old, new), I think that makes sense.

> +#define IEEE80211_MAX_NUM_SWITCH_VIFS 8

:-)

That seems artificial though - why not dynamically allocate?

> +static inline int drv_switch_vif_chanctx(struct ieee80211_local *local,
> +					 struct ieee80211_sub_if_data **sdata,
> +					 struct ieee80211_chanctx **old_ctx,
> +					 struct ieee80211_chanctx **new_ctx,
> +					 int n_vifs,
> +					 enum ieee80211_chanctx_swmode swmode)
> +{
> +	struct ieee80211_vif *vifs[IEEE80211_MAX_NUM_SWITCH_VIFS] = {};
> +	struct ieee80211_chanctx_conf *old_conf[IEEE80211_MAX_NUM_SWITCH_VIFS] = {};
> +	struct ieee80211_chanctx_conf *new_conf[IEEE80211_MAX_NUM_SWITCH_VIFS] = {};
> +	int i, ret = 0;

That's a little big for an inline?

> +	if (local->ops->switch_vif_chanctx)
> +		return -EOPNOTSUPP;
> +
> +	for (i = 0; i < n_vifs; i++)
> +		if (!check_sdata_in_driver(sdata[i]))
> +			return -EIO;
> +
> +	for (i = 0; i < n_vifs; i++) {
> +		trace_drv_switch_vif_chanctx(local, sdata[i], old_ctx[i],
> +					     new_ctx[i], n_vifs, swmode, i);

Hmm. This is somewhat ugly since the loop always runs. In theory it's
possible to do this all with dynamic_array() and code in the assign path
of the tracepoint, I think that'd be better. Or even for now just leave
the tracing to have just a subset or something (e.g. at most 2
interfaces)

> +++ b/net/mac80211/main.c
> @@ -502,6 +502,8 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
>  	if (WARN_ON(i != 0 && i != 5))
>  		return NULL;
>  	use_chanctx = i == 5;
> +	if (WARN_ON(!use_chanctx && ops->switch_vif_chanctx))
> +		return NULL;

I don't think this makes sense - we perfectly handle the case right now
by disconnecting (and not advertising switch to userspace, I guess? if
not we should)

Requiring drivers to implement this just makes things more difficult,
and the channel switch isn't really mandatory spec-wise.

> +		__field(u32, old_control_freq)

I believe there's a macro for a chandef?

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux