From: Arend van Spriel <arend@broadcom.com>
To: Jahnavi Meher <jahnavi.meher@gmail.com>,
<linux-wireless@vger.kernel.org>
Subject: Re: [PATCH 1/5] Fixes and clean up of code
Date: Fri, 13 Jun 2014 18:45:42 +0200 [thread overview]
Message-ID: <539B2AB6.4040107@broadcom.com> (raw)
In-Reply-To: <1402670645-8853-1-git-send-email-jahnavi.meher@gmail.com>
On 13-06-14 16:44, Jahnavi Meher wrote:
> Changed the SDIO interrupt type variables according to changes
> in firmware, made fixes to auto rate code and radio-caps frame,
> added defines for endpoints and some other minor fixes.
This commit sure changes a lot of stuff all over the place. Would you
mind splitting it up:
> Signed-off-by: Jahnavi Meher <jahnavi.meher@gmail.com>
> ---
> drivers/net/wireless/rsi/rsi_91x_debugfs.c | 10 +-
> drivers/net/wireless/rsi/rsi_91x_mac80211.c | 7 +-
> drivers/net/wireless/rsi/rsi_91x_mgmt.c | 113 ++++++++++++---------------
> drivers/net/wireless/rsi/rsi_91x_pkt.c | 7 ++
> drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 8 +-
> drivers/net/wireless/rsi/rsi_mgmt.h | 21 +++++
> drivers/net/wireless/rsi/rsi_sdio.h | 8 +-
> 7 files changed, 95 insertions(+), 79 deletions(-)
>
> diff --git a/drivers/net/wireless/rsi/rsi_91x_debugfs.c b/drivers/net/wireless/rsi/rsi_91x_debugfs.c
> index c466246..828a042 100644
> --- a/drivers/net/wireless/rsi/rsi_91x_debugfs.c
> +++ b/drivers/net/wireless/rsi/rsi_91x_debugfs.c
> @@ -145,7 +145,7 @@ static int rsi_stats_read(struct seq_file *seq, void *data)
> seq_printf(seq, "total_mgmt_pkt_send : %d\n",
> common->tx_stats.total_tx_pkt_send[MGMT_SOFT_Q]);
> seq_printf(seq, "total_mgmt_pkt_queued : %d\n",
> - skb_queue_len(&common->tx_queue[4]));
> + skb_queue_len(&common->tx_queue[MGMT_SOFT_Q]));
> seq_printf(seq, "total_mgmt_pkt_freed : %d\n",
> common->tx_stats.total_tx_pkt_freed[MGMT_SOFT_Q]);
>
> @@ -153,25 +153,25 @@ static int rsi_stats_read(struct seq_file *seq, void *data)
> seq_printf(seq, "total_data_vo_pkt_send: %8d\t",
> common->tx_stats.total_tx_pkt_send[VO_Q]);
> seq_printf(seq, "total_data_vo_pkt_queued: %8d\t",
> - skb_queue_len(&common->tx_queue[0]));
> + skb_queue_len(&common->tx_queue[VO_Q]));
> seq_printf(seq, "total_vo_pkt_freed: %8d\n",
> common->tx_stats.total_tx_pkt_freed[VO_Q]);
> seq_printf(seq, "total_data_vi_pkt_send: %8d\t",
> common->tx_stats.total_tx_pkt_send[VI_Q]);
> seq_printf(seq, "total_data_vi_pkt_queued: %8d\t",
> - skb_queue_len(&common->tx_queue[1]));
> + skb_queue_len(&common->tx_queue[VI_Q]));
> seq_printf(seq, "total_vi_pkt_freed: %8d\n",
> common->tx_stats.total_tx_pkt_freed[VI_Q]);
> seq_printf(seq, "total_data_be_pkt_send: %8d\t",
> common->tx_stats.total_tx_pkt_send[BE_Q]);
> seq_printf(seq, "total_data_be_pkt_queued: %8d\t",
> - skb_queue_len(&common->tx_queue[2]));
> + skb_queue_len(&common->tx_queue[BE_Q]));
> seq_printf(seq, "total_be_pkt_freed: %8d\n",
> common->tx_stats.total_tx_pkt_freed[BE_Q]);
> seq_printf(seq, "total_data_bk_pkt_send: %8d\t",
> common->tx_stats.total_tx_pkt_send[BK_Q]);
> seq_printf(seq, "total_data_bk_pkt_queued: %8d\t",
> - skb_queue_len(&common->tx_queue[3]));
> + skb_queue_len(&common->tx_queue[BK_Q]));
> seq_printf(seq, "total_bk_pkt_freed: %8d\n",
> common->tx_stats.total_tx_pkt_freed[BK_Q]);
above could be:
rsi: remove magic values in tx index
> diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
> index 54aaeb0..45bdb99 100644
> --- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
> +++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
> @@ -185,7 +185,7 @@ static void rsi_register_rates_channels(struct rsi_hw *adapter, int band)
> }
>
> /**
> - * rsi_mac80211_attach() - This function is used to de-initialize the
> + * rsi_mac80211_detach() - This function is used to de-initialize the
rsi: fix kernel doc
> * Mac80211 stack.
> * @adapter: Pointer to the adapter structure.
> *
> @@ -770,10 +770,7 @@ static void rsi_fill_rx_status(struct ieee80211_hw *hw,
>
> rxs->signal = -(rssi);
>
> - if (channel <= 14)
> - rxs->band = IEEE80211_BAND_2GHZ;
> - else
> - rxs->band = IEEE80211_BAND_5GHZ;
> + rxs->band = common->band;
rsi: use band from rsi_common in rx status
> freq = ieee80211_channel_to_frequency(channel, rxs->band);
>
> diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
> index 2eefbf1..38e7692 100644
> --- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
> +++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
> @@ -217,6 +217,7 @@ static void rsi_set_default_parameters(struct rsi_common *common)
> common->min_rate = 0xffff;
> common->fsm_state = FSM_CARD_NOT_READY;
> common->iface_down = true;
> + common->endpoint = EP_2GHZ_20MHZ;
> }
>
> /**
> @@ -276,7 +277,6 @@ static int rsi_load_radio_caps(struct rsi_common *common)
> {
> struct rsi_radio_caps *radio_caps;
> struct rsi_hw *adapter = common->priv;
> - struct ieee80211_hw *hw = adapter->hw;
> u16 inx = 0;
> u8 ii;
> u8 radio_id = 0;
> @@ -285,7 +285,6 @@ static int rsi_load_radio_caps(struct rsi_common *common)
> 0xf0, 0xf0, 0xf0, 0xf0,
> 0xf0, 0xf0, 0xf0, 0xf0,
> 0xf0, 0xf0, 0xf0, 0xf0};
> - struct ieee80211_conf *conf = &hw->conf;
> struct sk_buff *skb;
>
> rsi_dbg(INFO_ZONE, "%s: Sending rate symbol req frame\n", __func__);
> @@ -307,29 +306,36 @@ static int rsi_load_radio_caps(struct rsi_common *common)
> if (common->channel_width == BW_40MHZ) {
> radio_caps->desc_word[7] |= cpu_to_le16(RSI_LMAC_CLOCK_80MHZ);
> radio_caps->desc_word[7] |= cpu_to_le16(RSI_ENABLE_40MHZ);
> - if (common->channel_width) {
> - radio_caps->desc_word[5] =
> - cpu_to_le16(common->channel_width << 12);
> - radio_caps->desc_word[5] |= cpu_to_le16(FULL40M_ENABLE);
> - }
> -
> - if (conf_is_ht40_minus(conf)) {
> - radio_caps->desc_word[5] = 0;
> - radio_caps->desc_word[5] |=
> - cpu_to_le16(LOWER_20_ENABLE);
> - radio_caps->desc_word[5] |=
> - cpu_to_le16(LOWER_20_ENABLE >> 12);
> - }
>
> - if (conf_is_ht40_plus(conf)) {
> - radio_caps->desc_word[5] = 0;
> - radio_caps->desc_word[5] |=
> - cpu_to_le16(UPPER_20_ENABLE);
> - radio_caps->desc_word[5] |=
> - cpu_to_le16(UPPER_20_ENABLE >> 12);
> + if (common->fsm_state == FSM_MAC_INIT_DONE) {
> + struct ieee80211_hw *hw = adapter->hw;
> + struct ieee80211_conf *conf = &hw->conf;
At first I though you were removing assigned but unused variable
declarations, but I see you moved them inside this if block statement.
The CodingStyle does not complain about this, but I prefer all
declarations at start of the function. Stack scoping brings more hassle
than it solves (personal opinion).
> + if (conf_is_ht40_plus(conf)) {
> + radio_caps->desc_word[5] =
> + cpu_to_le16(LOWER_20_ENABLE);
> + radio_caps->desc_word[5] |=
> + cpu_to_le16(LOWER_20_ENABLE >> 12);
> + } else if (conf_is_ht40_minus(conf)) {
> + radio_caps->desc_word[5] =
> + cpu_to_le16(UPPER_20_ENABLE);
> + radio_caps->desc_word[5] |=
> + cpu_to_le16(UPPER_20_ENABLE >> 12);
> + } else {
> + radio_caps->desc_word[5] =
> + cpu_to_le16(BW_40MHZ << 12);
> + radio_caps->desc_word[5] |=
> + cpu_to_le16(FULL40M_ENABLE);
> + }
the above seems to belong to PATCH 5/5.
> }
> }
>
> + radio_caps->sifs_tx_11n = cpu_to_le16(SIFS_TX_11N_VALUE);
> + radio_caps->sifs_tx_11b = cpu_to_le16(SIFS_TX_11B_VALUE);
> + radio_caps->slot_rx_11n = cpu_to_le16(SHORT_SLOT_VALUE);
> + radio_caps->ofdm_ack_tout = cpu_to_le16(OFDM_ACK_TOUT_VALUE);
> + radio_caps->cck_ack_tout = cpu_to_le16(CCK_ACK_TOUT_VALUE);
> + radio_caps->preamble_type = cpu_to_le16(LONG_PREAMBLE);
> +
> radio_caps->desc_word[7] |= cpu_to_le16(radio_id << 8);
>
> for (ii = 0; ii < MAX_HW_QUEUES; ii++) {
> @@ -359,7 +365,6 @@ static int rsi_load_radio_caps(struct rsi_common *common)
> FRAME_DESC_SZ) |
> (RSI_WIFI_MGMT_Q << 12));
>
> -
> skb_put(skb, (sizeof(struct rsi_radio_caps)));
>
> return rsi_send_internal_mgmt_frame(common, skb);
> @@ -588,7 +593,7 @@ static int rsi_program_bb_rf(struct rsi_common *common)
>
> mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
> mgmt_frame->desc_word[1] = cpu_to_le16(BBP_PROG_IN_TA);
> - mgmt_frame->desc_word[4] = cpu_to_le16(common->endpoint << 8);
> + mgmt_frame->desc_word[4] = cpu_to_le16(common->endpoint);
>
> if (common->rf_reset) {
> mgmt_frame->desc_word[7] = cpu_to_le16(RF_RESET_ENABLE);
> @@ -841,23 +846,6 @@ int rsi_set_channel(struct rsi_common *common, u16 channel)
> rsi_dbg(MGMT_TX_ZONE,
> "%s: Sending scan req frame\n", __func__);
>
> - if (common->band == IEEE80211_BAND_5GHZ) {
> - if ((channel >= 36) && (channel <= 64))
> - channel = ((channel - 32) / 4);
> - else if ((channel > 64) && (channel <= 140))
> - channel = ((channel - 102) / 4) + 8;
> - else if (channel >= 149)
> - channel = ((channel - 151) / 4) + 18;
> - else
> - return -EINVAL;
> - } else {
> - if (channel > 14) {
> - rsi_dbg(ERR_ZONE, "%s: Invalid chno %d, band = %d\n",
> - __func__, channel, common->band);
> - return -EINVAL;
> - }
> - }
> -
> skb = dev_alloc_skb(FRAME_DESC_SZ);
> if (!skb) {
> rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
> @@ -877,6 +865,7 @@ int rsi_set_channel(struct rsi_common *common, u16 channel)
> (RSI_RF_TYPE << 4));
>
> mgmt_frame->desc_word[5] = cpu_to_le16(0x01);
> + mgmt_frame->desc_word[6] = cpu_to_le16(0x12);
>
> if (common->channel_width == BW_40MHZ)
> mgmt_frame->desc_word[5] |= cpu_to_le16(0x1 << 8);
> @@ -950,7 +939,7 @@ static int rsi_send_auto_rate_request(struct rsi_common *common)
> struct ieee80211_hw *hw = common->priv->hw;
> u8 band = hw->conf.chandef.chan->band;
> u8 num_supported_rates = 0;
> - u8 rate_offset = 0;
> + u8 rate_table_offset, rate_offset = 0;
> u32 rate_bitmap = common->bitrate_mask[band];
>
> u16 *selected_rates, min_rate;
> @@ -986,14 +975,18 @@ static int rsi_send_auto_rate_request(struct rsi_common *common)
> if (common->channel_width == BW_40MHZ)
> auto_rate->desc_word[7] |= cpu_to_le16(1);
>
> - if (band == IEEE80211_BAND_2GHZ)
> - min_rate = STD_RATE_01;
> - else
> - min_rate = STD_RATE_06;
> + if (band == IEEE80211_BAND_2GHZ) {
> + min_rate = RSI_RATE_1;
> + rate_table_offset = 0;
> + } else {
> + min_rate = RSI_RATE_6;
> + rate_table_offset = 4;
> + }
>
> for (ii = 0, jj = 0; ii < ARRAY_SIZE(rsi_rates); ii++) {
> if (rate_bitmap & BIT(ii)) {
> - selected_rates[jj++] = (rsi_rates[ii].bitrate / 5);
> + selected_rates[jj++] =
> + (rsi_rates[ii + rate_table_offset].bitrate / 5);
> rate_offset++;
> }
> }
> @@ -1006,13 +999,6 @@ static int rsi_send_auto_rate_request(struct rsi_common *common)
> rate_offset += ARRAY_SIZE(mcs);
> }
>
> - if (rate_offset < (RSI_TBL_SZ / 2) - 1) {
> - for (ii = jj; ii < (RSI_TBL_SZ / 2); ii++) {
> - selected_rates[jj++] = min_rate;
> - rate_offset++;
> - }
> - }
> -
> sort(selected_rates, jj, sizeof(u16), &rsi_compare, NULL);
>
> /* mapping the rates to RSI rates */
> @@ -1028,25 +1014,25 @@ static int rsi_send_auto_rate_request(struct rsi_common *common)
>
> /* loading HT rates in the bottom half of the auto rate table */
> if (common->vif_info[0].is_ht) {
> - if (common->vif_info[0].sgi)
> - auto_rate->supported_rates[rate_offset++] =
> - cpu_to_le16(RSI_RATE_MCS7_SG);
> -
> for (ii = rate_offset, kk = ARRAY_SIZE(rsi_mcsrates) - 1;
> ii < rate_offset + 2 * ARRAY_SIZE(rsi_mcsrates); ii++) {
> - if (common->vif_info[0].sgi)
> + if (common->vif_info[0].sgi ||
> + conf_is_ht40(&common->priv->hw->conf))
> auto_rate->supported_rates[ii++] =
> cpu_to_le16(rsi_mcsrates[kk] | BIT(9));
> auto_rate->supported_rates[ii] =
> cpu_to_le16(rsi_mcsrates[kk--]);
> }
>
> - for (; ii < RSI_TBL_SZ; ii++) {
> + for (; ii < (RSI_TBL_SZ - 1); ii++) {
> auto_rate->supported_rates[ii] =
> cpu_to_le16(rsi_mcsrates[0]);
> }
> }
>
> + for (; ii < RSI_TBL_SZ; ii++)
> + auto_rate->supported_rates[ii] = min_rate;
> +
rsi: change supported rate handling
> auto_rate->num_supported_rates = cpu_to_le16(num_supported_rates * 2);
> auto_rate->moderate_rate_inx = cpu_to_le16(num_supported_rates / 2);
> auto_rate->desc_word[7] |= cpu_to_le16(0 << 8);
> @@ -1164,7 +1150,7 @@ static int rsi_handle_ta_confirm_type(struct rsi_common *common,
> common->fsm_state = FSM_EEPROM_READ_MAC_ADDR;
> }
> } else {
> - rsi_dbg(ERR_ZONE,
> + rsi_dbg(INFO_ZONE,
> "%s: Received bootup params cfm in %d state\n",
> __func__, common->fsm_state);
> return 0;
> @@ -1227,7 +1213,7 @@ static int rsi_handle_ta_confirm_type(struct rsi_common *common,
> __func__);
> }
> } else {
> - rsi_dbg(ERR_ZONE,
> + rsi_dbg(INFO_ZONE,
> "%s: Received radio caps cfm in %d state\n",
> __func__, common->fsm_state);
> return 0;
> @@ -1245,7 +1231,10 @@ static int rsi_handle_ta_confirm_type(struct rsi_common *common,
> return rsi_mac80211_attach(common);
> }
> } else {
> - goto out;
> + rsi_dbg(INFO_ZONE,
> + "%s: Received bbb_rf cfm in %d state\n",
> + __func__, common->fsm_state);
> + return 0;
rsi: lower level for some debug messages
> }
> break;
>
> diff --git a/drivers/net/wireless/rsi/rsi_91x_pkt.c b/drivers/net/wireless/rsi/rsi_91x_pkt.c
> index 8e48e72..2221c23 100644
> --- a/drivers/net/wireless/rsi/rsi_91x_pkt.c
> +++ b/drivers/net/wireless/rsi/rsi_91x_pkt.c
> @@ -81,6 +81,13 @@ int rsi_send_data_pkt(struct rsi_common *common, struct sk_buff *skb)
> /* Send fixed rate */
> frame_desc[3] = cpu_to_le16(RATE_INFO_ENABLE);
> frame_desc[4] = cpu_to_le16(common->min_rate);
> +
> + if (common->vif_info[0].sgi) {
> + if (common->min_rate & 0x100) /* Only MCS rates */
> + frame_desc[4] |=
> + cpu_to_le16(ENABLE_SHORTGI_RATE);
> + }
> +
rsi: use SGI if configured
> }
>
> frame_desc[6] |= cpu_to_le16(seq_num & 0xfff);
> diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
> index 20d11cc..4834a9a 100644
> --- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
> +++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
> @@ -401,14 +401,16 @@ void rsi_interrupt_handler(struct rsi_hw *adapter)
> case BUFFER_AVAILABLE:
> dev->rx_info.watch_bufferfull_count = 0;
> dev->rx_info.buffer_full = false;
> + dev->rx_info.semi_buffer_full = false;
> dev->rx_info.mgmt_buffer_full = false;
> rsi_sdio_ack_intr(common->priv,
> (1 << PKT_BUFF_AVAILABLE));
> - rsi_set_event((&common->tx_thread.event));
> + rsi_set_event(&common->tx_thread.event);
> +
> rsi_dbg(ISR_ZONE,
> - "%s: ==> BUFFER_AVILABLE <==\n",
> + "%s: ==> BUFFER_AVAILABLE <==\n",
> __func__);
> - dev->rx_info.buf_avilable_counter++;
> + dev->rx_info.buf_available_counter++;
> break;
>
> case FIRMWARE_ASSERT_IND:
> diff --git a/drivers/net/wireless/rsi/rsi_mgmt.h b/drivers/net/wireless/rsi/rsi_mgmt.h
> index 225215a..8bff664 100644
> --- a/drivers/net/wireless/rsi/rsi_mgmt.h
> +++ b/drivers/net/wireless/rsi/rsi_mgmt.h
> @@ -69,6 +69,7 @@
>
> #define RSI_LMAC_CLOCK_80MHZ 0x1
> #define RSI_ENABLE_40MHZ (0x1 << 3)
> +#define ENABLE_SHORTGI_RATE BIT(9)
>
> #define RX_BA_INDICATION 1
> #define RSI_TBL_SZ 40
> @@ -123,6 +124,20 @@
> #define BW_20MHZ 0
> #define BW_40MHZ 1
>
> +#define EP_2GHZ_20MHZ 0
> +#define EP_2GHZ_40MHZ 1
> +#define EP_5GHZ_20MHZ 2
> +#define EP_5GHZ_40MHZ 3
> +
> +#define SIFS_TX_11N_VALUE 580
> +#define SIFS_TX_11B_VALUE 346
> +#define SHORT_SLOT_VALUE 360
> +#define LONG_SLOT_VALUE 640
> +#define OFDM_ACK_TOUT_VALUE 2720
> +#define CCK_ACK_TOUT_VALUE 9440
> +#define LONG_PREAMBLE 0x0000
> +#define SHORT_PREAMBLE 0x0001
> +
> #define RSI_SUPP_FILTERS (FIF_ALLMULTI | FIF_PROBE_REQ |\
> FIF_BCN_PRBRESP_PROMISC)
> enum opmode {
> @@ -238,6 +253,12 @@ struct rsi_radio_caps {
> u8 num_11n_rates;
> u8 num_11ac_rates;
> __le16 gcpd_per_rate[20];
> + __le16 sifs_tx_11n;
> + __le16 sifs_tx_11b;
> + __le16 slot_rx_11n;
> + __le16 ofdm_ack_tout;
> + __le16 cck_ack_tout;
> + __le16 preamble_type;
> } __packed;
>
> static inline u32 rsi_get_queueno(u8 *addr, u16 offset)
> diff --git a/drivers/net/wireless/rsi/rsi_sdio.h b/drivers/net/wireless/rsi/rsi_sdio.h
> index df4b5e2..c7e8f2b 100644
> --- a/drivers/net/wireless/rsi/rsi_sdio.h
> +++ b/drivers/net/wireless/rsi/rsi_sdio.h
> @@ -30,7 +30,7 @@
>
> enum sdio_interrupt_type {
> BUFFER_FULL = 0x0,
> - BUFFER_AVAILABLE = 0x1,
> + BUFFER_AVAILABLE = 0x2,
> FIRMWARE_ASSERT_IND = 0x3,
> MSDU_PACKET_PENDING = 0x4,
> UNKNOWN_INT = 0XE
> @@ -42,7 +42,7 @@ enum sdio_interrupt_type {
> #define PKT_MGMT_BUFF_FULL 2
> #define MSDU_PKT_PENDING 3
> /* Interrupt Bit Related Macros */
> -#define PKT_BUFF_AVAILABLE 0
> +#define PKT_BUFF_AVAILABLE 1
rsi: change interrupt definitions
> #define FW_ASSERT_IND 2
>
> #define RSI_DEVICE_BUFFER_STATUS_REGISTER 0xf3
> @@ -84,7 +84,7 @@ enum sdio_interrupt_type {
> #define TA_HOLD_THREAD_VALUE cpu_to_le32(0xF)
> #define TA_RELEASE_THREAD_VALUE cpu_to_le32(0xF)
> #define TA_BASE_ADDR 0x2200
> -#define MISC_CFG_BASE_ADDR 0x4150
> +#define MISC_CFG_BASE_ADDR 0x4105
>
> struct receive_info {
> bool buffer_full;
> @@ -98,7 +98,7 @@ struct receive_info {
> u32 total_sdio_msdu_pending_intr;
> u32 total_sdio_unknown_intr;
> u32 buf_full_counter;
> - u32 buf_avilable_counter;
> + u32 buf_available_counter;
> };
>
> struct rsi_91x_sdiodev {
>
Regards,
Arend
prev parent reply other threads:[~2014-06-13 16:45 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-13 14:44 [PATCH 1/5] Fixes and clean up of code Jahnavi Meher
2014-06-13 16:45 ` Arend van Spriel [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=539B2AB6.4040107@broadcom.com \
--to=arend@broadcom.com \
--cc=jahnavi.meher@gmail.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.