Search Linux Wireless

RE: [PATCH 03/24] rtw89: add core and trx files

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

 



> -----Original Message-----
> From: Oleksij Rempel [mailto:o.rempel@xxxxxxxxxxxxxx]
> Sent: Saturday, July 10, 2021 1:32 AM
> To: Pkshih
> Cc: kvalo@xxxxxxxxxxxxxx; linux-wireless@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH 03/24] rtw89: add core and trx files
> 
> On Fri, Jun 18, 2021 at 02:46:04PM +0800, Ping-Ke Shih wrote:
> > Implement main flows that contains register/unregister mac80211 hw with
> > hardware capability, power on/off sequence, STA state actions, and
> > TX/RX path.
> >
> > The chip info is read from efuse while probing PCI, and then it can be
> > used to induce supported channel, band, bitrate, ht/vht/he capability,
> > and etc. Then, we register hardware with these capabilities.
> >
> > When network interface is up, driver does power-on sequence to enable MAC,
> > BB and RF function blocks. Oppositely, do power-off sequence when
> > interface is going to down.
> >
> > To maintain STA state, five callbacks are implemented -- add, assoc,
> > disassoc, disconnect and remove. In which state, driver tells firmware STA
> > info via H2C.
> >
> > TX flow:
> > When a SKB is going to be transmitted, we must know its type first. If
> > the type is mgmt or fwcmd made by driver, SKB is queued into corresponding
> > DMA channel and PCI ring. The other type is data frame that is more
> > complex, because it needs to establish BA session to have better throughput
> > with AMPDU and AMSDU.
> > In order to have better PCI DMA efficiency, we don't kick off DMA every
> > SKB. With wake TX queue, kick off DMA after a bunch of SKBs are written.
> > To achieve this, we have two HCI ops -- tx_write and tx_kick_off.
> >
> > BA establishment work:
> > For data frames, we start to establish BA session if the STA is associated
> > with APMDU capability and the TID session isn't established, and then the
> > BA work is used to ask mac80211 to start AMPDU actions. Driver implements
> > AMPDU action callbacks to know the session is established, so that we can
> > set AGG_EN bit in TX descriptor to enable AMPDU.
> >
> > RX flow:
> > When a RX SKB is delivered from PCI, rtw89_core_rx() process it depneds on
> > its type -- WIFI, C2H or PPDU. If type is C2H, it's queued into a C2H
> > queue, and wake a work to handle the C2H packet. If type is WIFI, it's a
> > normal RX packet. When mgmt or data frame is received, it is queued
> > into pending RX SKB queue to wait for corresponding PPDU packet (another
> > RX packet with PPDU type) to fill its rx_status, like RSSI. And, then
> > indicate this packet to mac80211. When control frame is received, indicate
> > it to mac80211 immediately.
> >
> > Track work:
> > Use track work to monitor PHY status to know the changes of environment,
> > and then update RA status or do RFK accordingly.
> >
> > Signed-off-by: Ping-Ke Shih <pkshih@xxxxxxxxxxx>
> > ---
> >  drivers/net/wireless/realtek/rtw89/core.c | 2359 +++++++++++++++
> >  drivers/net/wireless/realtek/rtw89/core.h | 3336 +++++++++++++++++++++
> >  drivers/net/wireless/realtek/rtw89/txrx.h |  393 +++
> >  drivers/net/wireless/realtek/rtw89/util.c |   37 +
> >  drivers/net/wireless/realtek/rtw89/util.h |   31 +
> >  5 files changed, 6156 insertions(+)
> >  create mode 100644 drivers/net/wireless/realtek/rtw89/core.c
> >  create mode 100644 drivers/net/wireless/realtek/rtw89/core.h
> >  create mode 100644 drivers/net/wireless/realtek/rtw89/txrx.h
> >  create mode 100644 drivers/net/wireless/realtek/rtw89/util.c
> >  create mode 100644 drivers/net/wireless/realtek/rtw89/util.h
> >
> > diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
> > new file mode 100644
> > index 000000000000..3bd31e669aea
> > --- /dev/null
> > +++ b/drivers/net/wireless/realtek/rtw89/core.c
> > @@ -0,0 +1,2359 @@

[...]

> > +
> > +static enum rtw89_ps_mode rtw89_update_ps_mode(struct rtw89_dev *rtwdev)
> > +{
> > +	const struct rtw89_chip_info *chip = rtwdev->chip;
> > +
> > +	if (rtw89_disable_ps_mode || !chip->ps_mode_supported)
> > +		return RTW89_PS_MODE_NONE;
> > +
> > +	if (chip->ps_mode_supported & BIT(RTW89_PS_MODE_PWR_GATED))
> > +		return RTW89_PS_MODE_PWR_GATED;
> 
> Current driver support only one chip with RTW89_PS_MODE_PWR_GATED,
> RTW89_PS_MODE_CLK_GATED and RTW89_PS_MODE_RFOFF.
> 
> According to this code, only RTW89_PS_MODE_PWR_GATED will return. Please
> remove all other modes to reduce review overhead.
> 

They are not only list of modes, but also the priority. So, I'd like to
preserve the code to change the priority easier. And, I think the logic
is very easy that there's no too much overhead.

[...]

> > +
> > +int rtw89_core_power_on(struct rtw89_dev *rtwdev)
> > +{
> > +	int ret;
> > +
> > +	ret = rtw89_mac_pwr_on(rtwdev);
> > +	if (ret) {
> > +		rtw89_err(rtwdev, "failed to start power sequence\n");
> > +		goto err;
> > +	}
> > +
> > +	return 0;
> > +
> > +err:
> > +	return ret;
> > +}
> 
> rtw89_core_power_on() is not used. please remote it to avoid review
> overhead.
> 

Removed.

> > +u8 rtw89_core_acquire_bit_map(unsigned long *addr, unsigned long size)
> > +{
> > +	unsigned long bit;
> > +
> > +	bit = find_first_zero_bit(addr, size);
> > +	if (bit < size)
> > +		set_bit(bit, addr);
> > +
> > +	return bit;
> > +}
> > +
> > +void rtw89_core_release_bit_map(unsigned long *addr, u8 bit)
> > +{
> > +	clear_bit(bit, addr);
> > +}
> > +
> > +void rtw89_core_release_all_bits_map(unsigned long *addr, unsigned int nbits)
> > +{
> > +	bitmap_zero(addr, nbits);
> > +}
> > +
> > +#define RTW89_TYPE_MAPPING(_type)	\
> > +	case NL80211_IFTYPE_ ## _type:	\
> > +		rtwvif->wifi_role = RTW89_WIFI_ROLE_ ## _type;	\
> > +		break
> > +void rtw89_vif_type_mapping(struct ieee80211_vif *vif, bool assoc)
> > +{
> > +	struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
> > +
> > +	switch (vif->type) {
> > +	RTW89_TYPE_MAPPING(ADHOC);
> > +	RTW89_TYPE_MAPPING(STATION);
> > +	RTW89_TYPE_MAPPING(AP);
> > +	RTW89_TYPE_MAPPING(AP_VLAN);
> > +	RTW89_TYPE_MAPPING(MONITOR);
> > +	RTW89_TYPE_MAPPING(MESH_POINT);
> > +	RTW89_TYPE_MAPPING(P2P_CLIENT);
> > +	RTW89_TYPE_MAPPING(P2P_GO);
> > +	RTW89_TYPE_MAPPING(P2P_DEVICE);
> > +	RTW89_TYPE_MAPPING(NAN);
> > +	default:
> > +		WARN_ON(1);
> > +		break;
> > +	}
> 
> This switch statement makes no sense. Only NL80211_IFTYPE_AP,
> NL80211_IFTYPE_MESH_POINT, NL80211_IFTYPE_ADHOC and
> NL80211_IFTYPE_STATION are supported. Please remove this mapping
> open code rtwvif->wifi_role in the following switch
> 

Removed.

> > +	switch (vif->type) {
> > +	case NL80211_IFTYPE_AP:
> > +	case NL80211_IFTYPE_MESH_POINT:
> > +		rtwvif->net_type = RTW89_NET_TYPE_AP_MODE;
> > +		rtwvif->self_role = RTW89_SELF_ROLE_AP;
> > +		break;
> > +	case NL80211_IFTYPE_ADHOC:
> > +		rtwvif->net_type = RTW89_NET_TYPE_AD_HOC;
> 
> Please set rtwvif->self_role here, to make it easy to read.
> 

Will add it.

[...]






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

  Powered by Linux