Search Linux Wireless

Re: [PATCH v2 RESEND] qtnfmac: announcement of new FullMAC driver for Quantenna chipsets

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

 



<igor.mitsyanko.os@xxxxxxxxxxxxx> writes:

> From: Avinash Patil <avinashp@xxxxxxxxxxxxx>
>
> This patch adds support for new FullMAC WiFi driver for Quantenna
> QSR10G chipsets.
>
> QSR10G is Quantenna's 8x8, 160M, 11ac offering.
> QSR10G supports 2 simultaneous WMACs- one 5G and one 2G. 5G WMAC
> supports 160M, 8x8 configuration.
> FW supports 8 concurrent virtual interfaces on each WMAC.
>
> Patch introduces 2 new drivers- qtnfmac.ko for interfacing with
> kernel/cfg80211 and qtnfmac_pcie.ko for PCIe bus interface.
>
> Signed-off-by: Dmitrii Lebed <dlebed@xxxxxxxxxxxxx>
> Signed-off-by: Sergei Maksimenko <smaksimenko@xxxxxxxxxxxxx>
> Signed-off-by: Sergey Matyukevich <smatyukevich@xxxxxxxxxxxxx>
> Signed-off-by: Bindu Therthala <btherthala@xxxxxxxxxxxxx>
> Signed-off-by: Huizhao Wang <hwang@xxxxxxxxxxxxx>
> Signed-off-by: Kamlesh Rath <krath@xxxxxxxxxxxxx>
> Signed-off-by: Avinash Patil <avinashp@xxxxxxxxxxxxx>
> Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@xxxxxxxxxxxxx>

I read this through and looking good. Below are some comments.

I also saw few warnings but I suspect they are because of cfg80211 API
changes (didn't bother to check that now):

drivers/net/wireless/quantenna/qtnfmac/event.c: In function `qtnf_event_handle_scan_complete':
drivers/net/wireless/quantenna/qtnfmac/event.c:342:2: warning: passing argument 2 of `cfg80211_scan_done' makes pointer from integer without a cast [enabled by default]
./include/net/cfg80211.h:4104:6: note: expected `struct cfg80211_scan_info *' but argument is of type `u32'
drivers/net/wireless/quantenna/qtnfmac/cfg80211.c: In function `qtnf_virtual_intf_cleanup':
drivers/net/wireless/quantenna/qtnfmac/cfg80211.c:1093:4: warning: passing argument 2 of `cfg80211_scan_done' makes pointer from integer without a cast [enabled by default]
./include/net/cfg80211.h:4104:6: note: expected `struct cfg80211_scan_info *' but argument is of type `int'

> Resend to correct email kvalo@xxxxxxxxxxxxxx.

BTW, no need to send me directly. I take patches directly from patchwork
so sending them to linux-wireless is enough. Doesn't do any harm to send
them to, I just immediately delete them from my INBOX :)

> Changelist V1->V2:
> 1. Get rid of confidentiality footer.
> 2. Rewrite qlink.h header to make it easier to use, add
> documentation to most of qlink.h definitions.
>
>  MAINTAINERS                                        |    8 +
>  drivers/net/wireless/Kconfig                       |    1 +
>  drivers/net/wireless/Makefile                      |    1 +
>  drivers/net/wireless/quantenna/Kconfig             |   16 +
>  drivers/net/wireless/quantenna/Makefile            |    6 +
>  drivers/net/wireless/quantenna/include/bus.h       |  195 ++
>  .../wireless/quantenna/include/pcie_regs_pearl.h   |  353 ++++
>  drivers/net/wireless/quantenna/include/qlink.h     |  939 ++++++++++
>  .../net/wireless/quantenna/include/qtn_hw_ids.h    |   34 +
>  .../net/wireless/quantenna/include/shm_ipc_defs.h  |   46 +

Is there a particular reason why you have a separate include directory?
There's just one quantenna driver for now so the extra include directory
feels unnecessary. I would prefer to have that only once there are two
quantenna drivers and we know exactly what is shared between the two.

> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -9151,6 +9151,14 @@ L:	qemu-devel@xxxxxxxxxx
>  S:	Maintained
>  F:	drivers/firmware/qemu_fw_cfg.c
>  
> +QUANTENNA QTNFMAC WIRELESS DRIVER
> +M:	Igor Mitsyanko <imitsyanko@xxxxxxxxxxxxx>
> +M:	Avinash Patil <avinashp@xxxxxxxxxxxxx>
> +M:	Sergey Matyukevich <smatyukevich@xxxxxxxxxxxxx>
> +L:	linux-wireless@xxxxxxxxxxxxxxx
> +S:	Maintained
> +F:	drivers/net/wireless/quantenna/qtnfmac

The include directory is not listed.

> +ccflags-y += -D__CHECK_ENDIAN

Very good.

> +/* Supported rates to be advertised to the cfg80211 */
> +static struct ieee80211_rate qtnf_rates[] = {
> +	{.bitrate = 10, .hw_value = 2, },
> +	{.bitrate = 20, .hw_value = 4, },
> +	{.bitrate = 55, .hw_value = 11, },
> +	{.bitrate = 110, .hw_value = 22, },
> +	{.bitrate = 60, .hw_value = 12, },
> +	{.bitrate = 90, .hw_value = 18, },
> +	{.bitrate = 120, .hw_value = 24, },
> +	{.bitrate = 180, .hw_value = 36, },
> +	{.bitrate = 240, .hw_value = 48, },
> +	{.bitrate = 360, .hw_value = 72, },
> +	{.bitrate = 480, .hw_value = 96, },
> +	{.bitrate = 540, .hw_value = 108, },
> +};
> +
> +/* Channel definitions to be advertised to cfg80211 */
> +static struct ieee80211_channel qtnf_channels_2ghz[] = {
> +	{.center_freq = 2412, .hw_value = 1, },
> +	{.center_freq = 2417, .hw_value = 2, },
> +	{.center_freq = 2422, .hw_value = 3, },
> +	{.center_freq = 2427, .hw_value = 4, },
> +	{.center_freq = 2432, .hw_value = 5, },
> +	{.center_freq = 2437, .hw_value = 6, },
> +	{.center_freq = 2442, .hw_value = 7, },
> +	{.center_freq = 2447, .hw_value = 8, },
> +	{.center_freq = 2452, .hw_value = 9, },
> +	{.center_freq = 2457, .hw_value = 10, },
> +	{.center_freq = 2462, .hw_value = 11, },
> +	{.center_freq = 2467, .hw_value = 12, },
> +	{.center_freq = 2472, .hw_value = 13, },
> +	{.center_freq = 2484, .hw_value = 14, },
> +};

I guess some of these static variables could be also const, but didn't
check.

> +MODULE_AUTHOR("Quantenna Communications");
> +MODULE_DESCRIPTION("Quantenna 802.11 wireless LAN FullMAC driver.");
> +MODULE_LICENSE("Dual BSD/GPL");

[...]

> +++ b/drivers/net/wireless/quantenna/qtnfmac/core.h
> @@ -0,0 +1,170 @@
> +/**
> + * Copyright (c) 2015-2016 Quantenna Communications, Inc.
> + * All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + **/

MODULE_LICENSE() doesn't match license in headers, is that correct?

> +static int
> +qtnf_event_handle_sta_assoc(struct qtnf_wmac *mac, struct qtnf_vif *vif,
> +			    const struct qlink_event_sta_assoc *sta_assoc,
> +			    u16 len)
> +{
> +	const u8 *sta_addr;
> +	u16 frame_control;
> +	struct station_info sinfo = { 0 };
> +	size_t payload_len;
> +	u16 tlv_type;
> +	u16 tlv_value_len;
> +	size_t tlv_full_len;
> +	const struct qlink_tlv_hdr *tlv;
> +
> +	if (unlikely(len < sizeof(*sta_assoc))) {
> +		pr_err("%s: payload is too short (%u < %zu)\n", __func__,
> +		       len, sizeof(*sta_assoc));
> +		return -EINVAL;
> +	}

I see unlikely() used a lot, I counted 145 times. Not a big issue but I
don't see the point. In hot path I understand using it, but not
everywhere.

> +/* sysfs knobs: stats and other diagnistics */

Johannes also commented about this. Please use debugfs or some generic
interface.

-- 
Kalle Valo



[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