staging: rtl8192e: Remove unused variables from struct rt_stats
v2 cover staging: rtl8192e: Remove unused variables from struct rt_stats
Remove unused variables from struct rt_stats.
Tested with rtl8192e
Transferred this patch over wlan connection of rtl8192e
---
V1-V2: Removed further unused variable preamble_guardinterval from
"Remove unused variables numpacket.. and received_pre.." Removed further unused variables prxsc and rxsc_sgien_exflg from "Remove unused variables num_proc.., recei.. and rxov.."
Philipp Hortmann (11):
staging: rtl8192e: Remove unused variables rxrdu and rxok
staging: rtl8192e: Remove unused variables rxdatacrcerr and
rxmgmtcrcerr
staging: rtl8192e: Remove unused variables rxcrcerrmin and friends
staging: rtl8192e: Remove unused variables numpacket.. and
received_pre..
staging: rtl8192e: Remove unused variables numqry_..
staging: rtl8192e: Remove unused variables num_proc.., recei.. and
rxov..
staging: rtl8192e: Remove unused variables rxint, ints and shints
staging: rtl8192e: Remove unused variables txov.., txbeokint and
txbkokint
staging: rtl8192e: Remove unused variables txviok.., txvook.. and
txbea..
staging: rtl8192e: Remove unused variables txbeac.., txman.. and
txcmdp..
staging: rtl8192e: Remove unused variables txbytes.., txbyt.. and
signa...../staging/rtl8192e/rtl8192e/r8192E_dev.c | 39 +--------------- drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 44 ++----------------- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 31 ------------- 3 files changed, 5 insertions(+), 109 deletions(-)
Signature · 1 line
2.39.1
PATCH v2 1/11 staging: rtl8192e: Remove unused variables rxrdu and rxok
rxrdu and rxok are initialized and increased but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 2 -- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 2 -- 2 files changed, 4 deletions(-)
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +0 -2
@@ -1938,7 +1938,6 @@ static void _rtl92e_rx_normal(struct net_device *dev)if (!rtllib_rx (priv->rtllib, skb, &stats)) {dev_kfree_skb_any (skb); }else { - priv->stats.rxok++;if (unicast_packet) priv->stats.rxbytesunicast += skb_len; }
@@ -2186,7 +2185,6 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev)tasklet_schedule (&priv->irq_prepare_beacon_tasklet);if (inta &IMR_RDU ) { - priv->stats.rxrdu++;rtl92e_writel (dev,INTA_MASK ,rtl92e_readl (dev,INTA_MASK ) & ~IMR_RDU );tasklet_schedule (&priv->irq_rx_tasklet);
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -2
@@ -183,8 +183,6 @@ enum reset_type { };struct rt_stats { -unsigned long rxrdu; -unsigned long rxok;unsigned long rxdatacrcerr;unsigned long rxmgmtcrcerr;unsigned long rxcrcerrmin;
Signature · 1 line
2.39.1
PATCH v2 2/11 staging: rtl8192e: Remove unused variables rxdatacrcerr and rxmgmtcrcerr
In reply to Philipp Hortmannrxdatacrcerr and rxmgmtcrcerr are initialized and increased but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 7 ------- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 2 -- 2 files changed, 9 deletions(-)
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +0 -7
@@ -1926,13 +1926,6 @@ static void _rtl92e_rx_normal(struct net_device *dev) priv->rtllib->LedControlHandler (dev,LED_CTL_RX ); -if (stats.bCRC) { -if (type !=RTLLIB_FTYPE_MGMT ) - priv->stats.rxdatacrcerr++; -else - priv->stats.rxmgmtcrcerr++; - } - skb_len = skb->len;if (!rtllib_rx (priv->rtllib, skb, &stats)) {
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -2
@@ -183,8 +183,6 @@ enum reset_type { };struct rt_stats { -unsigned long rxdatacrcerr; -unsigned long rxmgmtcrcerr;unsigned long rxcrcerrmin;unsigned long rxcrcerrmid;unsigned long rxcrcerrmax;
Signature · 1 line
2.39.1
PATCH v2 3/11 staging: rtl8192e: Remove unused variables rxcrcerrmin and friends
In reply to Philipp Hortmannrxcrcerrmin, rxcrcerrmax and rxcrcerrmid are initialized and increased but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c | 10 ---------- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 2 files changed, 13 deletions(-)
drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c +0 -10
@@ -1812,7 +1812,6 @@ static void _rtl92e_update_received_rate_histogram_stats(bool rtl92e_get_rx_stats (struct net_device *dev,struct rtllib_rx_stats *stats,struct rx_desc *pdesc,struct sk_buff *skb) { -struct r8192_priv *priv =rtllib_priv (dev);struct rx_fwinfo *pDrvInfo =NULL ; stats->bICV = pdesc->ICV;
@@ -1825,15 +1824,6 @@ bool rtl92e_get_rx_stats(struct net_device *dev, struct rtllib_rx_stats *stats,if (stats->bHwError) { stats->bShift = false; - -if (pdesc->CRC32) { -if (pdesc->Length <500 ) - priv->stats.rxcrcerrmin++; -else if (pdesc->Length >1000 ) - priv->stats.rxcrcerrmax++; -else - priv->stats.rxcrcerrmid++; - }return false; }
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -183,9 +183,6 @@ enum reset_type { };struct rt_stats { -unsigned long rxcrcerrmin; -unsigned long rxcrcerrmid; -unsigned long rxcrcerrmax;unsigned long received_rate_histogram[4 ][32 ];unsigned long received_preamble_GI[2 ][32 ];unsigned long numpacket_matchbssid;
Signature · 1 line
2.39.1
PATCH v2 4/11 staging: rtl8192e: Remove unused variables numpacket.. and received_pre..
In reply to Philipp Hortmannnumpacket_toself, numpacket_matchbssid and received_preamble_GI are initialized and increased but never read. Remove dead code. As a result the local variable preamble_guardinterval is unused. Remove it also.
---V1->V2: removed unused variable preamble_guardinterval
--- drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c | 11 ----------- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 2 files changed, 14 deletions(-)
drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c +0 -11
@@ -1685,10 +1685,6 @@ static void _rtl92e_translate_rx_signal_stats(struct net_device *dev,ether_addr_equal (praddr, priv->rtllib->dev->dev_addr);if (WLAN_FC_GET_FRAMETYPE (fc) ==RTLLIB_STYPE_BEACON ) bPacketBeacon = true; -if (bpacket_match_bssid) - priv->stats.numpacket_matchbssid++; -if (bpacket_toself) - priv->stats.numpacket_toself++;_rtl92e_process_phyinfo (priv, tmp_buf, &previous_stats, pstats); _rtl92e_query_rxphystatus(priv, pstats, pdesc, pdrvinfo, &previous_stats, bpacket_match_bssid,
@@ -1703,18 +1699,12 @@ static void _rtl92e_update_received_rate_histogram_stats(struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv (dev);u32 rcvType =1 ;u32 rateIndex; -u32 preamble_guardinterval;if (pstats->bCRC) rcvType =2 ;else if (pstats->bICV) rcvType =3 ; -if (pstats->bShortPreamble) - preamble_guardinterval =1 ; -else - preamble_guardinterval =0 ; -switch (pstats->rate) {case MGN_1M : rateIndex =0 ;
@@ -1804,7 +1794,6 @@ static void _rtl92e_update_received_rate_histogram_stats( rateIndex =28 ;break ; } - priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++; priv->stats.received_rate_histogram[0 ][rateIndex]++; priv->stats.received_rate_histogram[rcvType][rateIndex]++; }
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -184,9 +184,6 @@ enum reset_type {struct rt_stats {unsigned long received_rate_histogram[4 ][32 ]; -unsigned long received_preamble_GI[2 ][32 ]; -unsigned long numpacket_matchbssid; -unsigned long numpacket_toself;unsigned long num_process_phyinfo;unsigned long numqry_phystatus;unsigned long numqry_phystatusCCK;
Signature · 1 line
2.39.1
PATCH v2 5/11 staging: rtl8192e: Remove unused variables numqry_..
In reply to Philipp Hortmannnumqry_phystatus, numqry_phystatusCCK and numqry_phystatusHT are initialized and increased but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c | 4 ---- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 2 files changed, 7 deletions(-)
drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c +0 -4
@@ -1308,8 +1308,6 @@ static void _rtl92e_query_rxphystatus(static u8 check_reg824;static u32 reg824_bit9; - priv->stats.numqry_phystatus++; - is_cck_rate =rx_hal_is_cck_rate (pdrvinfo);memset (precord_stats,0 ,sizeof (struct rtllib_rx_stats )); pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID =
@@ -1341,7 +1339,6 @@ static void _rtl92e_query_rxphystatus(if (is_cck_rate) {u8 report; - priv->stats.numqry_phystatusCCK++;if (!reg824_bit9) { report = pcck_buf->cck_agc_rpt &0xc0 ; report >>=6 ;
@@ -1416,7 +1413,6 @@ static void _rtl92e_query_rxphystatus( precord_stats->RxMIMOSignalQuality[1 ] =-1 ; } }else { - priv->stats.numqry_phystatusHT++;for (i =RF90_PATH_A ; i <RF90_PATH_MAX ; i++) {if (priv->brfpath_rxenable[i]) rf_rx_num++;
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -185,9 +185,6 @@ enum reset_type {struct rt_stats {unsigned long received_rate_histogram[4 ][32 ];unsigned long num_process_phyinfo; -unsigned long numqry_phystatus; -unsigned long numqry_phystatusCCK; -unsigned long numqry_phystatusHT;unsigned long received_bwtype[5 ];unsigned long rxoverflow;unsigned long rxint;
Signature · 1 line
2.39.1
PATCH v2 6/11 staging: rtl8192e: Remove unused variables num_proc.., recei.. and rxov..
In reply to Philipp Hortmannnum_process_phyinfo, received_bwtype and rxoverflow are initialized and increased but never read. Remove dead code. As a result prxsc is unused which in result makes rxsc_sgien_exflg unused. Remove prxsc and rxsc_sgien_exflg as well.
---V1->V2: Remove prxsc and rxsc_sgien_exflg
--- drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c | 13 +------------ drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 4 +--- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 3 files changed, 2 insertions(+), 18 deletions(-)
drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c +1 -12
@@ -1296,9 +1296,8 @@ static void _rtl92e_query_rxphystatus( {struct phy_sts_ofdm_819xpci *pofdm_buf;struct phy_sts_cck_819xpci *pcck_buf; -struct phy_ofdm_rx_status_rxsc_sgien_exintfflag *prxsc;u8 *prxpkt; -u8 i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg; +u8 i, max_spatial_stream, tmp_rxsnr, tmp_rxevm;s8 rx_pwr[4 ], rx_pwr_all =0 ;s8 rx_snrX, rx_evmX;u8 evm, pwdb_all;
@@ -1464,15 +1463,6 @@ static void _rtl92e_query_rxphystatus( precord_stats->RxMIMOSignalQuality[i] = evm &0xff ; } } - - - rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg; - prxsc = (struct phy_ofdm_rx_status_rxsc_sgien_exintfflag *) - &rxsc_sgien_exflg; -if (pdrvinfo->BW) - priv->stats.received_bwtype[1 +prxsc->rxsc]++; -else - priv->stats.received_bwtype[0 ]++; }if (is_cck_rate) {
@@ -1535,7 +1525,6 @@ static void _rtl92e_process_phyinfo(struct r8192_priv *priv, u8 *buffer,if (!bcheck)return ; - priv->stats.num_process_phyinfo++;if (!prev_st->bIsCCK && prev_st->bPacketToSelf) {for (rfpath =RF90_PATH_A ; rfpath <RF90_PATH_C ; rfpath++) {if (!rtl92e_is_legal_rf_path (priv->rtllib->dev, rfpath))
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +1 -3
@@ -2183,10 +2183,8 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev)tasklet_schedule (&priv->irq_rx_tasklet); } -if (inta &IMR_RXFOVW ) { - priv->stats.rxoverflow++; +if (inta &IMR_RXFOVW )tasklet_schedule (&priv->irq_rx_tasklet); - }if (inta &IMR_TXFOVW ) priv->stats.txoverflow++;
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -184,9 +184,6 @@ enum reset_type {struct rt_stats {unsigned long received_rate_histogram[4 ][32 ]; -unsigned long num_process_phyinfo; -unsigned long received_bwtype[5 ]; -unsigned long rxoverflow;unsigned long rxint;unsigned long ints;unsigned long shints;
Signature · 1 line
2.39.1
PATCH v2 7/11 staging: rtl8192e: Remove unused variables rxint, ints and shints
In reply to Philipp Hortmannrxint, ints and shints are initialized and increased but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 7 +------ drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 2 files changed, 1 insertion(+), 9 deletions(-)
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +1 -6
@@ -2123,7 +2123,6 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev)spin_lock_irqsave (&priv->irq_th_lock, flags); priv->ops->interrupt_recognized (dev, &inta, &intb); - priv->stats.shints++;if (!inta) {spin_unlock_irqrestore (&priv->irq_th_lock, flags);
@@ -2135,8 +2134,6 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev) goto done; } - priv->stats.ints++; -if (!netif_running (dev)) {spin_unlock_irqrestore (&priv->irq_th_lock, flags); goto done;
@@ -2169,10 +2166,8 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev)if (inta &IMR_HIGHDOK )_rtl92e_tx_isr (dev,HIGH_QUEUE ); -if (inta &IMR_ROK ) { - priv->stats.rxint++; +if (inta &IMR_ROK )tasklet_schedule (&priv->irq_rx_tasklet); - }if (inta & IMR_BcnInt)tasklet_schedule (&priv->irq_prepare_beacon_tasklet);
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -184,9 +184,6 @@ enum reset_type {struct rt_stats {unsigned long received_rate_histogram[4 ][32 ]; -unsigned long rxint; -unsigned long ints; -unsigned long shints;unsigned long txoverflow;unsigned long txbeokint;unsigned long txbkokint;
Signature · 1 line
2.39.1
PATCH v2 8/11 staging: rtl8192e: Remove unused variables txov.., txbeokint and txbkokint
In reply to Philipp Hortmanntxoverflow, txbeokint and txbkokint are initialized and increased but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 5 ----- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 2 files changed, 8 deletions(-)
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +0 -5
@@ -2181,17 +2181,12 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev)if (inta &IMR_RXFOVW )tasklet_schedule (&priv->irq_rx_tasklet); -if (inta &IMR_TXFOVW ) - priv->stats.txoverflow++; -if (inta &IMR_BKDOK ) { - priv->stats.txbkokint++; priv->rtllib->link_detect_info.NumTxOkInPeriod++;_rtl92e_tx_isr (dev,BK_QUEUE ); }if (inta &IMR_BEDOK ) { - priv->stats.txbeokint++; priv->rtllib->link_detect_info.NumTxOkInPeriod++;_rtl92e_tx_isr (dev,BE_QUEUE ); }
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -184,9 +184,6 @@ enum reset_type {struct rt_stats {unsigned long received_rate_histogram[4 ][32 ]; -unsigned long txoverflow; -unsigned long txbeokint; -unsigned long txbkokint;unsigned long txviokint;unsigned long txvookint;unsigned long txbeaconokint;
Signature · 1 line
2.39.1
PATCH v2 9/11 staging: rtl8192e: Remove unused variables txviok.., txvook.. and txbea..
In reply to Philipp Hortmanntxviokint, txvookint and txbeaconokint are initialized and increased but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 5 ----- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 2 files changed, 8 deletions(-)
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +0 -5
@@ -2139,9 +2139,6 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev) goto done; } -if (inta &IMR_TBDOK ) - priv->stats.txbeaconokint++; -if (inta &IMR_TBDER ) priv->stats.txbeaconerr++;
@@ -2192,13 +2189,11 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev) }if (inta &IMR_VIDOK ) { - priv->stats.txviokint++; priv->rtllib->link_detect_info.NumTxOkInPeriod++;_rtl92e_tx_isr (dev,VI_QUEUE ); }if (inta &IMR_VODOK ) { - priv->stats.txvookint++; priv->rtllib->link_detect_info.NumTxOkInPeriod++;_rtl92e_tx_isr (dev,VO_QUEUE ); }
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -184,9 +184,6 @@ enum reset_type {struct rt_stats {unsigned long received_rate_histogram[4 ][32 ]; -unsigned long txviokint; -unsigned long txvookint; -unsigned long txbeaconokint;unsigned long txbeaconerr;unsigned long txmanageokint;unsigned long txcmdpktokint;
Signature · 1 line
2.39.1
PATCH v2 10/11 staging: rtl8192e: Remove unused variables txbeac.., txman.. and txcmdp..
In reply to Philipp Hortmanntxbeaconerr, txmanageokint and txcmdpktokint are initialized and increased but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 8 +------- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 2 files changed, 1 insertion(+), 10 deletions(-)
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +1 -7
@@ -2139,11 +2139,7 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev) goto done; } -if (inta &IMR_TBDER ) - priv->stats.txbeaconerr++; -if (inta &IMR_MGNTDOK ) { - priv->stats.txmanageokint++;_rtl92e_tx_isr (dev,MGNT_QUEUE );spin_unlock_irqrestore (&priv->irq_th_lock, flags);if (priv->rtllib->ack_tx_to_ieee) {
@@ -2155,10 +2151,8 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev)spin_lock_irqsave (&priv->irq_th_lock, flags); } -if (inta &IMR_COMDOK ) { - priv->stats.txcmdpktokint++; +if (inta &IMR_COMDOK )_rtl92e_tx_isr (dev,TXCMD_QUEUE ); - }if (inta &IMR_HIGHDOK )_rtl92e_tx_isr (dev,HIGH_QUEUE );
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -184,9 +184,6 @@ enum reset_type {struct rt_stats {unsigned long received_rate_histogram[4 ][32 ]; -unsigned long txbeaconerr; -unsigned long txmanageokint; -unsigned long txcmdpktokint;unsigned long txbytesmulticast;unsigned long txbytesbroadcast;unsigned long txbytesunicast;
Signature · 1 line
2.39.1
PATCH v2 11/11 staging: rtl8192e: Remove unused variables txbytes.., txbyt.. and signa..
In reply to Philipp Hortmanntxbytesmulticast, txbytesbroadcast and signal_quality are initialized and increased or set but never read. Remove dead code.
--- drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c | 1 - drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 6 +----- drivers/staging/rtl8192e/rtl8192e/rtl_core.h | 3 --- 3 files changed, 1 insertion(+), 9 deletions(-)
drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c +0 -1
@@ -1613,7 +1613,6 @@ static void _rtl92e_process_phyinfo(struct r8192_priv *priv, u8 *buffer, tmp_val = priv->stats.slide_evm_total / slide_evm_statistics; - priv->stats.signal_quality = tmp_val; priv->stats.last_signal_strength_inpercent = tmp_val; }
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +1 -5
@@ -1616,11 +1616,7 @@ static short _rtl92e_tx(struct net_device *dev, struct sk_buff *skb) type =WLAN_FC_GET_TYPE (fc); pda_addr = header->addr1; -if (is_broadcast_ether_addr (pda_addr)) - priv->stats.txbytesbroadcast += skb->len - fwinfo_size; -else if (is_multicast_ether_addr (pda_addr)) - priv->stats.txbytesmulticast += skb->len - fwinfo_size; -else +if (!is_broadcast_ether_addr (pda_addr) && !is_multicast_ether_addr (pda_addr)) priv->stats.txbytesunicast += skb->len - fwinfo_size;spin_lock_irqsave (&priv->irq_th_lock, flags);
drivers/staging/rtl8192e/rtl8192e/rtl_core.h +0 -3
@@ -184,8 +184,6 @@ enum reset_type {struct rt_stats {unsigned long received_rate_histogram[4 ][32 ]; -unsigned long txbytesmulticast; -unsigned long txbytesbroadcast;unsigned long txbytesunicast;unsigned long rxbytesunicast;unsigned long txretrycount;
@@ -195,7 +193,6 @@ struct rt_stats {unsigned long slide_rssi_total;unsigned long slide_evm_total;long signal_strength; -long signal_quality;long last_signal_strength_inpercent;long recv_signal_power;u8 rx_rssi_percentage[4 ];
Signature · 1 line
2.39.1