2014-09-22 16:31:41 +04:00
/*
* Copyright ( c ) 2014 Qualcomm Atheros , Inc .
*
* Permission to use , copy , modify , and / or distribute this software for any
* purpose with or without fee is hereby granted , provided that the above
* copyright notice and this permission notice appear in all copies .
*
* THE SOFTWARE IS PROVIDED " AS IS " AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS . IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL , DIRECT , INDIRECT , OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN
* ACTION OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE .
*/
# include <linux/etherdevice.h>
# include <linux/pci.h>
# include <linux/rtnetlink.h>
# include <net/cfg80211.h>
# include "wil6210.h"
static int wil_ethtoolops_begin ( struct net_device * ndev )
{
struct wil6210_priv * wil = ndev_to_wil ( ndev ) ;
mutex_lock ( & wil - > mutex ) ;
wil_dbg_misc ( wil , " %s() \n " , __func__ ) ;
return 0 ;
}
static void wil_ethtoolops_complete ( struct net_device * ndev )
{
struct wil6210_priv * wil = ndev_to_wil ( ndev ) ;
wil_dbg_misc ( wil , " %s() \n " , __func__ ) ;
mutex_unlock ( & wil - > mutex ) ;
}
static int wil_ethtoolops_get_coalesce ( struct net_device * ndev ,
struct ethtool_coalesce * cp )
{
struct wil6210_priv * wil = ndev_to_wil ( ndev ) ;
2014-12-23 10:47:19 +03:00
u32 tx_itr_en , tx_itr_val = 0 ;
u32 rx_itr_en , rx_itr_val = 0 ;
2014-09-22 16:31:41 +04:00
wil_dbg_misc ( wil , " %s() \n " , __func__ ) ;
2015-07-30 13:52:03 +03:00
tx_itr_en = wil_r ( wil , RGF_DMA_ITR_TX_CNT_CTL ) ;
2015-02-15 15:02:31 +03:00
if ( tx_itr_en & BIT_DMA_ITR_TX_CNT_CTL_EN )
2015-07-30 13:52:03 +03:00
tx_itr_val = wil_r ( wil , RGF_DMA_ITR_TX_CNT_TRSH ) ;
2015-02-15 15:02:31 +03:00
2015-07-30 13:52:03 +03:00
rx_itr_en = wil_r ( wil , RGF_DMA_ITR_RX_CNT_CTL ) ;
2015-02-15 15:02:31 +03:00
if ( rx_itr_en & BIT_DMA_ITR_RX_CNT_CTL_EN )
2015-07-30 13:52:03 +03:00
rx_itr_val = wil_r ( wil , RGF_DMA_ITR_RX_CNT_TRSH ) ;
2014-09-22 16:31:41 +04:00
2014-12-23 10:47:19 +03:00
cp - > tx_coalesce_usecs = tx_itr_val ;
cp - > rx_coalesce_usecs = rx_itr_val ;
2014-09-22 16:31:41 +04:00
return 0 ;
}
static int wil_ethtoolops_set_coalesce ( struct net_device * ndev ,
struct ethtool_coalesce * cp )
{
struct wil6210_priv * wil = ndev_to_wil ( ndev ) ;
2014-12-23 10:47:19 +03:00
wil_dbg_misc ( wil , " %s(rx %d usec, tx %d usec) \n " , __func__ ,
cp - > rx_coalesce_usecs , cp - > tx_coalesce_usecs ) ;
2014-09-22 16:31:41 +04:00
if ( wil - > wdev - > iftype = = NL80211_IFTYPE_MONITOR ) {
wil_dbg_misc ( wil , " No IRQ coalescing in monitor mode \n " ) ;
return - EINVAL ;
}
2014-12-23 10:47:19 +03:00
/* only @rx_coalesce_usecs and @tx_coalesce_usecs supported,
* ignore other parameters
2014-09-22 16:31:41 +04:00
*/
2014-12-23 10:47:19 +03:00
if ( cp - > rx_coalesce_usecs > WIL6210_ITR_TRSH_MAX | |
cp - > tx_coalesce_usecs > WIL6210_ITR_TRSH_MAX )
2014-09-22 16:31:41 +04:00
goto out_bad ;
2014-12-23 10:47:19 +03:00
wil - > tx_max_burst_duration = cp - > tx_coalesce_usecs ;
wil - > rx_max_burst_duration = cp - > rx_coalesce_usecs ;
wil_configure_interrupt_moderation ( wil ) ;
2014-09-22 16:31:41 +04:00
return 0 ;
out_bad :
wil_dbg_misc ( wil , " Unsupported coalescing params. Raw command: \n " ) ;
print_hex_dump_debug ( " DBG[MISC] coal " , DUMP_PREFIX_OFFSET , 16 , 4 ,
cp , sizeof ( * cp ) , false ) ;
return - EINVAL ;
}
static const struct ethtool_ops wil_ethtool_ops = {
. begin = wil_ethtoolops_begin ,
. complete = wil_ethtoolops_complete ,
. get_drvinfo = cfg80211_get_drvinfo ,
. get_coalesce = wil_ethtoolops_get_coalesce ,
. set_coalesce = wil_ethtoolops_set_coalesce ,
} ;
void wil_set_ethtoolops ( struct net_device * ndev )
{
ndev - > ethtool_ops = & wil_ethtool_ops ;
}