mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 04:55:18 +07:00
0290bd291c
This allows incrementing the correct timeout statistic without any mess. Down the road, devices can learn to reset just the specific queue. The patch was generated with the following script: use strict; use warnings; our $^I = '.bak'; my @work = ( ["arch/m68k/emu/nfeth.c", "nfeth_tx_timeout"], ["arch/um/drivers/net_kern.c", "uml_net_tx_timeout"], ["arch/um/drivers/vector_kern.c", "vector_net_tx_timeout"], ["arch/xtensa/platforms/iss/network.c", "iss_net_tx_timeout"], ["drivers/char/pcmcia/synclink_cs.c", "hdlcdev_tx_timeout"], ["drivers/infiniband/ulp/ipoib/ipoib_main.c", "ipoib_timeout"], ["drivers/infiniband/ulp/ipoib/ipoib_main.c", "ipoib_timeout"], ["drivers/message/fusion/mptlan.c", "mpt_lan_tx_timeout"], ["drivers/misc/sgi-xp/xpnet.c", "xpnet_dev_tx_timeout"], ["drivers/net/appletalk/cops.c", "cops_timeout"], ["drivers/net/arcnet/arcdevice.h", "arcnet_timeout"], ["drivers/net/arcnet/arcnet.c", "arcnet_timeout"], ["drivers/net/arcnet/com20020.c", "arcnet_timeout"], ["drivers/net/ethernet/3com/3c509.c", "el3_tx_timeout"], ["drivers/net/ethernet/3com/3c515.c", "corkscrew_timeout"], ["drivers/net/ethernet/3com/3c574_cs.c", "el3_tx_timeout"], ["drivers/net/ethernet/3com/3c589_cs.c", "el3_tx_timeout"], ["drivers/net/ethernet/3com/3c59x.c", "vortex_tx_timeout"], ["drivers/net/ethernet/3com/3c59x.c", "vortex_tx_timeout"], ["drivers/net/ethernet/3com/typhoon.c", "typhoon_tx_timeout"], ["drivers/net/ethernet/8390/8390.h", "ei_tx_timeout"], ["drivers/net/ethernet/8390/8390.h", "eip_tx_timeout"], ["drivers/net/ethernet/8390/8390.c", "ei_tx_timeout"], ["drivers/net/ethernet/8390/8390p.c", "eip_tx_timeout"], ["drivers/net/ethernet/8390/ax88796.c", "ax_ei_tx_timeout"], ["drivers/net/ethernet/8390/axnet_cs.c", "axnet_tx_timeout"], ["drivers/net/ethernet/8390/etherh.c", "__ei_tx_timeout"], ["drivers/net/ethernet/8390/hydra.c", "__ei_tx_timeout"], ["drivers/net/ethernet/8390/mac8390.c", "__ei_tx_timeout"], ["drivers/net/ethernet/8390/mcf8390.c", "__ei_tx_timeout"], ["drivers/net/ethernet/8390/lib8390.c", "__ei_tx_timeout"], ["drivers/net/ethernet/8390/ne2k-pci.c", "ei_tx_timeout"], ["drivers/net/ethernet/8390/pcnet_cs.c", "ei_tx_timeout"], ["drivers/net/ethernet/8390/smc-ultra.c", "ei_tx_timeout"], ["drivers/net/ethernet/8390/wd.c", "ei_tx_timeout"], ["drivers/net/ethernet/8390/zorro8390.c", "__ei_tx_timeout"], ["drivers/net/ethernet/adaptec/starfire.c", "tx_timeout"], ["drivers/net/ethernet/agere/et131x.c", "et131x_tx_timeout"], ["drivers/net/ethernet/allwinner/sun4i-emac.c", "emac_timeout"], ["drivers/net/ethernet/alteon/acenic.c", "ace_watchdog"], ["drivers/net/ethernet/amazon/ena/ena_netdev.c", "ena_tx_timeout"], ["drivers/net/ethernet/amd/7990.h", "lance_tx_timeout"], ["drivers/net/ethernet/amd/7990.c", "lance_tx_timeout"], ["drivers/net/ethernet/amd/a2065.c", "lance_tx_timeout"], ["drivers/net/ethernet/amd/am79c961a.c", "am79c961_timeout"], ["drivers/net/ethernet/amd/amd8111e.c", "amd8111e_tx_timeout"], ["drivers/net/ethernet/amd/ariadne.c", "ariadne_tx_timeout"], ["drivers/net/ethernet/amd/atarilance.c", "lance_tx_timeout"], ["drivers/net/ethernet/amd/au1000_eth.c", "au1000_tx_timeout"], ["drivers/net/ethernet/amd/declance.c", "lance_tx_timeout"], ["drivers/net/ethernet/amd/lance.c", "lance_tx_timeout"], ["drivers/net/ethernet/amd/mvme147.c", "lance_tx_timeout"], ["drivers/net/ethernet/amd/ni65.c", "ni65_timeout"], ["drivers/net/ethernet/amd/nmclan_cs.c", "mace_tx_timeout"], ["drivers/net/ethernet/amd/pcnet32.c", "pcnet32_tx_timeout"], ["drivers/net/ethernet/amd/sunlance.c", "lance_tx_timeout"], ["drivers/net/ethernet/amd/xgbe/xgbe-drv.c", "xgbe_tx_timeout"], ["drivers/net/ethernet/apm/xgene-v2/main.c", "xge_timeout"], ["drivers/net/ethernet/apm/xgene/xgene_enet_main.c", "xgene_enet_timeout"], ["drivers/net/ethernet/apple/macmace.c", "mace_tx_timeout"], ["drivers/net/ethernet/atheros/ag71xx.c", "ag71xx_tx_timeout"], ["drivers/net/ethernet/atheros/alx/main.c", "alx_tx_timeout"], ["drivers/net/ethernet/atheros/atl1c/atl1c_main.c", "atl1c_tx_timeout"], ["drivers/net/ethernet/atheros/atl1e/atl1e_main.c", "atl1e_tx_timeout"], ["drivers/net/ethernet/atheros/atlx/atl.c", "atlx_tx_timeout"], ["drivers/net/ethernet/atheros/atlx/atl1.c", "atlx_tx_timeout"], ["drivers/net/ethernet/atheros/atlx/atl2.c", "atl2_tx_timeout"], ["drivers/net/ethernet/broadcom/b44.c", "b44_tx_timeout"], ["drivers/net/ethernet/broadcom/bcmsysport.c", "bcm_sysport_tx_timeout"], ["drivers/net/ethernet/broadcom/bnx2.c", "bnx2_tx_timeout"], ["drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h", "bnx2x_tx_timeout"], ["drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c", "bnx2x_tx_timeout"], ["drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c", "bnx2x_tx_timeout"], ["drivers/net/ethernet/broadcom/bnxt/bnxt.c", "bnxt_tx_timeout"], ["drivers/net/ethernet/broadcom/genet/bcmgenet.c", "bcmgenet_timeout"], ["drivers/net/ethernet/broadcom/sb1250-mac.c", "sbmac_tx_timeout"], ["drivers/net/ethernet/broadcom/tg3.c", "tg3_tx_timeout"], ["drivers/net/ethernet/calxeda/xgmac.c", "xgmac_tx_timeout"], ["drivers/net/ethernet/cavium/liquidio/lio_main.c", "liquidio_tx_timeout"], ["drivers/net/ethernet/cavium/liquidio/lio_vf_main.c", "liquidio_tx_timeout"], ["drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c", "lio_vf_rep_tx_timeout"], ["drivers/net/ethernet/cavium/thunder/nicvf_main.c", "nicvf_tx_timeout"], ["drivers/net/ethernet/cirrus/cs89x0.c", "net_timeout"], ["drivers/net/ethernet/cisco/enic/enic_main.c", "enic_tx_timeout"], ["drivers/net/ethernet/cisco/enic/enic_main.c", "enic_tx_timeout"], ["drivers/net/ethernet/cortina/gemini.c", "gmac_tx_timeout"], ["drivers/net/ethernet/davicom/dm9000.c", "dm9000_timeout"], ["drivers/net/ethernet/dec/tulip/de2104x.c", "de_tx_timeout"], ["drivers/net/ethernet/dec/tulip/tulip_core.c", "tulip_tx_timeout"], ["drivers/net/ethernet/dec/tulip/winbond-840.c", "tx_timeout"], ["drivers/net/ethernet/dlink/dl2k.c", "rio_tx_timeout"], ["drivers/net/ethernet/dlink/sundance.c", "tx_timeout"], ["drivers/net/ethernet/emulex/benet/be_main.c", "be_tx_timeout"], ["drivers/net/ethernet/ethoc.c", "ethoc_tx_timeout"], ["drivers/net/ethernet/faraday/ftgmac100.c", "ftgmac100_tx_timeout"], ["drivers/net/ethernet/fealnx.c", "fealnx_tx_timeout"], ["drivers/net/ethernet/freescale/dpaa/dpaa_eth.c", "dpaa_tx_timeout"], ["drivers/net/ethernet/freescale/fec_main.c", "fec_timeout"], ["drivers/net/ethernet/freescale/fec_mpc52xx.c", "mpc52xx_fec_tx_timeout"], ["drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c", "fs_timeout"], ["drivers/net/ethernet/freescale/gianfar.c", "gfar_timeout"], ["drivers/net/ethernet/freescale/ucc_geth.c", "ucc_geth_timeout"], ["drivers/net/ethernet/fujitsu/fmvj18x_cs.c", "fjn_tx_timeout"], ["drivers/net/ethernet/google/gve/gve_main.c", "gve_tx_timeout"], ["drivers/net/ethernet/hisilicon/hip04_eth.c", "hip04_timeout"], ["drivers/net/ethernet/hisilicon/hix5hd2_gmac.c", "hix5hd2_net_timeout"], ["drivers/net/ethernet/hisilicon/hns/hns_enet.c", "hns_nic_net_timeout"], ["drivers/net/ethernet/hisilicon/hns3/hns3_enet.c", "hns3_nic_net_timeout"], ["drivers/net/ethernet/huawei/hinic/hinic_main.c", "hinic_tx_timeout"], ["drivers/net/ethernet/i825xx/82596.c", "i596_tx_timeout"], ["drivers/net/ethernet/i825xx/ether1.c", "ether1_timeout"], ["drivers/net/ethernet/i825xx/lib82596.c", "i596_tx_timeout"], ["drivers/net/ethernet/i825xx/sun3_82586.c", "sun3_82586_timeout"], ["drivers/net/ethernet/ibm/ehea/ehea_main.c", "ehea_tx_watchdog"], ["drivers/net/ethernet/ibm/emac/core.c", "emac_tx_timeout"], ["drivers/net/ethernet/ibm/emac/core.c", "emac_tx_timeout"], ["drivers/net/ethernet/ibm/ibmvnic.c", "ibmvnic_tx_timeout"], ["drivers/net/ethernet/intel/e100.c", "e100_tx_timeout"], ["drivers/net/ethernet/intel/e1000/e1000_main.c", "e1000_tx_timeout"], ["drivers/net/ethernet/intel/e1000e/netdev.c", "e1000_tx_timeout"], ["drivers/net/ethernet/intel/fm10k/fm10k_netdev.c", "fm10k_tx_timeout"], ["drivers/net/ethernet/intel/i40e/i40e_main.c", "i40e_tx_timeout"], ["drivers/net/ethernet/intel/iavf/iavf_main.c", "iavf_tx_timeout"], ["drivers/net/ethernet/intel/ice/ice_main.c", "ice_tx_timeout"], ["drivers/net/ethernet/intel/ice/ice_main.c", "ice_tx_timeout"], ["drivers/net/ethernet/intel/igb/igb_main.c", "igb_tx_timeout"], ["drivers/net/ethernet/intel/igbvf/netdev.c", "igbvf_tx_timeout"], ["drivers/net/ethernet/intel/ixgb/ixgb_main.c", "ixgb_tx_timeout"], ["drivers/net/ethernet/intel/ixgbe/ixgbe_debugfs.c", "adapter->netdev->netdev_ops->ndo_tx_timeout(adapter->netdev);"], ["drivers/net/ethernet/intel/ixgbe/ixgbe_main.c", "ixgbe_tx_timeout"], ["drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c", "ixgbevf_tx_timeout"], ["drivers/net/ethernet/jme.c", "jme_tx_timeout"], ["drivers/net/ethernet/korina.c", "korina_tx_timeout"], ["drivers/net/ethernet/lantiq_etop.c", "ltq_etop_tx_timeout"], ["drivers/net/ethernet/marvell/mv643xx_eth.c", "mv643xx_eth_tx_timeout"], ["drivers/net/ethernet/marvell/pxa168_eth.c", "pxa168_eth_tx_timeout"], ["drivers/net/ethernet/marvell/skge.c", "skge_tx_timeout"], ["drivers/net/ethernet/marvell/sky2.c", "sky2_tx_timeout"], ["drivers/net/ethernet/marvell/sky2.c", "sky2_tx_timeout"], ["drivers/net/ethernet/mediatek/mtk_eth_soc.c", "mtk_tx_timeout"], ["drivers/net/ethernet/mellanox/mlx4/en_netdev.c", "mlx4_en_tx_timeout"], ["drivers/net/ethernet/mellanox/mlx4/en_netdev.c", "mlx4_en_tx_timeout"], ["drivers/net/ethernet/mellanox/mlx5/core/en_main.c", "mlx5e_tx_timeout"], ["drivers/net/ethernet/micrel/ks8842.c", "ks8842_tx_timeout"], ["drivers/net/ethernet/micrel/ksz884x.c", "netdev_tx_timeout"], ["drivers/net/ethernet/microchip/enc28j60.c", "enc28j60_tx_timeout"], ["drivers/net/ethernet/microchip/encx24j600.c", "encx24j600_tx_timeout"], ["drivers/net/ethernet/natsemi/sonic.h", "sonic_tx_timeout"], ["drivers/net/ethernet/natsemi/sonic.c", "sonic_tx_timeout"], ["drivers/net/ethernet/natsemi/jazzsonic.c", "sonic_tx_timeout"], ["drivers/net/ethernet/natsemi/macsonic.c", "sonic_tx_timeout"], ["drivers/net/ethernet/natsemi/natsemi.c", "ns_tx_timeout"], ["drivers/net/ethernet/natsemi/ns83820.c", "ns83820_tx_timeout"], ["drivers/net/ethernet/natsemi/xtsonic.c", "sonic_tx_timeout"], ["drivers/net/ethernet/neterion/s2io.h", "s2io_tx_watchdog"], ["drivers/net/ethernet/neterion/s2io.c", "s2io_tx_watchdog"], ["drivers/net/ethernet/neterion/vxge/vxge-main.c", "vxge_tx_watchdog"], ["drivers/net/ethernet/netronome/nfp/nfp_net_common.c", "nfp_net_tx_timeout"], ["drivers/net/ethernet/nvidia/forcedeth.c", "nv_tx_timeout"], ["drivers/net/ethernet/nvidia/forcedeth.c", "nv_tx_timeout"], ["drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c", "pch_gbe_tx_timeout"], ["drivers/net/ethernet/packetengines/hamachi.c", "hamachi_tx_timeout"], ["drivers/net/ethernet/packetengines/yellowfin.c", "yellowfin_tx_timeout"], ["drivers/net/ethernet/pensando/ionic/ionic_lif.c", "ionic_tx_timeout"], ["drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c", "netxen_tx_timeout"], ["drivers/net/ethernet/qlogic/qla3xxx.c", "ql3xxx_tx_timeout"], ["drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c", "qlcnic_tx_timeout"], ["drivers/net/ethernet/qualcomm/emac/emac.c", "emac_tx_timeout"], ["drivers/net/ethernet/qualcomm/qca_spi.c", "qcaspi_netdev_tx_timeout"], ["drivers/net/ethernet/qualcomm/qca_uart.c", "qcauart_netdev_tx_timeout"], ["drivers/net/ethernet/rdc/r6040.c", "r6040_tx_timeout"], ["drivers/net/ethernet/realtek/8139cp.c", "cp_tx_timeout"], ["drivers/net/ethernet/realtek/8139too.c", "rtl8139_tx_timeout"], ["drivers/net/ethernet/realtek/atp.c", "tx_timeout"], ["drivers/net/ethernet/realtek/r8169_main.c", "rtl8169_tx_timeout"], ["drivers/net/ethernet/renesas/ravb_main.c", "ravb_tx_timeout"], ["drivers/net/ethernet/renesas/sh_eth.c", "sh_eth_tx_timeout"], ["drivers/net/ethernet/renesas/sh_eth.c", "sh_eth_tx_timeout"], ["drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c", "sxgbe_tx_timeout"], ["drivers/net/ethernet/seeq/ether3.c", "ether3_timeout"], ["drivers/net/ethernet/seeq/sgiseeq.c", "timeout"], ["drivers/net/ethernet/sfc/efx.c", "efx_watchdog"], ["drivers/net/ethernet/sfc/falcon/efx.c", "ef4_watchdog"], ["drivers/net/ethernet/sgi/ioc3-eth.c", "ioc3_timeout"], ["drivers/net/ethernet/sgi/meth.c", "meth_tx_timeout"], ["drivers/net/ethernet/silan/sc92031.c", "sc92031_tx_timeout"], ["drivers/net/ethernet/sis/sis190.c", "sis190_tx_timeout"], ["drivers/net/ethernet/sis/sis900.c", "sis900_tx_timeout"], ["drivers/net/ethernet/smsc/epic100.c", "epic_tx_timeout"], ["drivers/net/ethernet/smsc/smc911x.c", "smc911x_timeout"], ["drivers/net/ethernet/smsc/smc9194.c", "smc_timeout"], ["drivers/net/ethernet/smsc/smc91c92_cs.c", "smc_tx_timeout"], ["drivers/net/ethernet/smsc/smc91x.c", "smc_timeout"], ["drivers/net/ethernet/stmicro/stmmac/stmmac_main.c", "stmmac_tx_timeout"], ["drivers/net/ethernet/sun/cassini.c", "cas_tx_timeout"], ["drivers/net/ethernet/sun/ldmvsw.c", "sunvnet_tx_timeout_common"], ["drivers/net/ethernet/sun/niu.c", "niu_tx_timeout"], ["drivers/net/ethernet/sun/sunbmac.c", "bigmac_tx_timeout"], ["drivers/net/ethernet/sun/sungem.c", "gem_tx_timeout"], ["drivers/net/ethernet/sun/sunhme.c", "happy_meal_tx_timeout"], ["drivers/net/ethernet/sun/sunqe.c", "qe_tx_timeout"], ["drivers/net/ethernet/sun/sunvnet.c", "sunvnet_tx_timeout_common"], ["drivers/net/ethernet/sun/sunvnet_common.c", "sunvnet_tx_timeout_common"], ["drivers/net/ethernet/sun/sunvnet_common.h", "sunvnet_tx_timeout_common"], ["drivers/net/ethernet/synopsys/dwc-xlgmac-net.c", "xlgmac_tx_timeout"], ["drivers/net/ethernet/ti/cpmac.c", "cpmac_tx_timeout"], ["drivers/net/ethernet/ti/cpsw.c", "cpsw_ndo_tx_timeout"], ["drivers/net/ethernet/ti/cpsw_priv.c", "cpsw_ndo_tx_timeout"], ["drivers/net/ethernet/ti/cpsw_priv.h", "cpsw_ndo_tx_timeout"], ["drivers/net/ethernet/ti/davinci_emac.c", "emac_dev_tx_timeout"], ["drivers/net/ethernet/ti/netcp_core.c", "netcp_ndo_tx_timeout"], ["drivers/net/ethernet/ti/tlan.c", "tlan_tx_timeout"], ["drivers/net/ethernet/toshiba/ps3_gelic_net.h", "gelic_net_tx_timeout"], ["drivers/net/ethernet/toshiba/ps3_gelic_net.c", "gelic_net_tx_timeout"], ["drivers/net/ethernet/toshiba/ps3_gelic_wireless.c", "gelic_net_tx_timeout"], ["drivers/net/ethernet/toshiba/spider_net.c", "spider_net_tx_timeout"], ["drivers/net/ethernet/toshiba/tc35815.c", "tc35815_tx_timeout"], ["drivers/net/ethernet/via/via-rhine.c", "rhine_tx_timeout"], ["drivers/net/ethernet/wiznet/w5100.c", "w5100_tx_timeout"], ["drivers/net/ethernet/wiznet/w5300.c", "w5300_tx_timeout"], ["drivers/net/ethernet/xilinx/xilinx_emaclite.c", "xemaclite_tx_timeout"], ["drivers/net/ethernet/xircom/xirc2ps_cs.c", "xirc_tx_timeout"], ["drivers/net/fjes/fjes_main.c", "fjes_tx_retry"], ["drivers/net/slip/slip.c", "sl_tx_timeout"], ["include/linux/usb/usbnet.h", "usbnet_tx_timeout"], ["drivers/net/usb/aqc111.c", "usbnet_tx_timeout"], ["drivers/net/usb/asix_devices.c", "usbnet_tx_timeout"], ["drivers/net/usb/asix_devices.c", "usbnet_tx_timeout"], ["drivers/net/usb/asix_devices.c", "usbnet_tx_timeout"], ["drivers/net/usb/ax88172a.c", "usbnet_tx_timeout"], ["drivers/net/usb/ax88179_178a.c", "usbnet_tx_timeout"], ["drivers/net/usb/catc.c", "catc_tx_timeout"], ["drivers/net/usb/cdc_mbim.c", "usbnet_tx_timeout"], ["drivers/net/usb/cdc_ncm.c", "usbnet_tx_timeout"], ["drivers/net/usb/dm9601.c", "usbnet_tx_timeout"], ["drivers/net/usb/hso.c", "hso_net_tx_timeout"], ["drivers/net/usb/int51x1.c", "usbnet_tx_timeout"], ["drivers/net/usb/ipheth.c", "ipheth_tx_timeout"], ["drivers/net/usb/kaweth.c", "kaweth_tx_timeout"], ["drivers/net/usb/lan78xx.c", "lan78xx_tx_timeout"], ["drivers/net/usb/mcs7830.c", "usbnet_tx_timeout"], ["drivers/net/usb/pegasus.c", "pegasus_tx_timeout"], ["drivers/net/usb/qmi_wwan.c", "usbnet_tx_timeout"], ["drivers/net/usb/r8152.c", "rtl8152_tx_timeout"], ["drivers/net/usb/rndis_host.c", "usbnet_tx_timeout"], ["drivers/net/usb/rtl8150.c", "rtl8150_tx_timeout"], ["drivers/net/usb/sierra_net.c", "usbnet_tx_timeout"], ["drivers/net/usb/smsc75xx.c", "usbnet_tx_timeout"], ["drivers/net/usb/smsc95xx.c", "usbnet_tx_timeout"], ["drivers/net/usb/sr9700.c", "usbnet_tx_timeout"], ["drivers/net/usb/sr9800.c", "usbnet_tx_timeout"], ["drivers/net/usb/usbnet.c", "usbnet_tx_timeout"], ["drivers/net/vmxnet3/vmxnet3_drv.c", "vmxnet3_tx_timeout"], ["drivers/net/wan/cosa.c", "cosa_net_timeout"], ["drivers/net/wan/farsync.c", "fst_tx_timeout"], ["drivers/net/wan/fsl_ucc_hdlc.c", "uhdlc_tx_timeout"], ["drivers/net/wan/lmc/lmc_main.c", "lmc_driver_timeout"], ["drivers/net/wan/x25_asy.c", "x25_asy_timeout"], ["drivers/net/wimax/i2400m/netdev.c", "i2400m_tx_timeout"], ["drivers/net/wireless/intel/ipw2x00/ipw2100.c", "ipw2100_tx_timeout"], ["drivers/net/wireless/intersil/hostap/hostap_main.c", "prism2_tx_timeout"], ["drivers/net/wireless/intersil/hostap/hostap_main.c", "prism2_tx_timeout"], ["drivers/net/wireless/intersil/hostap/hostap_main.c", "prism2_tx_timeout"], ["drivers/net/wireless/intersil/orinoco/main.c", "orinoco_tx_timeout"], ["drivers/net/wireless/intersil/orinoco/orinoco_usb.c", "orinoco_tx_timeout"], ["drivers/net/wireless/intersil/orinoco/orinoco.h", "orinoco_tx_timeout"], ["drivers/net/wireless/intersil/prism54/islpci_dev.c", "islpci_eth_tx_timeout"], ["drivers/net/wireless/intersil/prism54/islpci_eth.c", "islpci_eth_tx_timeout"], ["drivers/net/wireless/intersil/prism54/islpci_eth.h", "islpci_eth_tx_timeout"], ["drivers/net/wireless/marvell/mwifiex/main.c", "mwifiex_tx_timeout"], ["drivers/net/wireless/quantenna/qtnfmac/core.c", "qtnf_netdev_tx_timeout"], ["drivers/net/wireless/quantenna/qtnfmac/core.h", "qtnf_netdev_tx_timeout"], ["drivers/net/wireless/rndis_wlan.c", "usbnet_tx_timeout"], ["drivers/net/wireless/wl3501_cs.c", "wl3501_tx_timeout"], ["drivers/net/wireless/zydas/zd1201.c", "zd1201_tx_timeout"], ["drivers/s390/net/qeth_core.h", "qeth_tx_timeout"], ["drivers/s390/net/qeth_core_main.c", "qeth_tx_timeout"], ["drivers/s390/net/qeth_l2_main.c", "qeth_tx_timeout"], ["drivers/s390/net/qeth_l2_main.c", "qeth_tx_timeout"], ["drivers/s390/net/qeth_l3_main.c", "qeth_tx_timeout"], ["drivers/s390/net/qeth_l3_main.c", "qeth_tx_timeout"], ["drivers/staging/ks7010/ks_wlan_net.c", "ks_wlan_tx_timeout"], ["drivers/staging/qlge/qlge_main.c", "qlge_tx_timeout"], ["drivers/staging/rtl8192e/rtl8192e/rtl_core.c", "_rtl92e_tx_timeout"], ["drivers/staging/rtl8192u/r8192U_core.c", "tx_timeout"], ["drivers/staging/unisys/visornic/visornic_main.c", "visornic_xmit_timeout"], ["drivers/staging/wlan-ng/p80211netdev.c", "p80211knetdev_tx_timeout"], ["drivers/tty/n_gsm.c", "gsm_mux_net_tx_timeout"], ["drivers/tty/synclink.c", "hdlcdev_tx_timeout"], ["drivers/tty/synclink_gt.c", "hdlcdev_tx_timeout"], ["drivers/tty/synclinkmp.c", "hdlcdev_tx_timeout"], ["net/atm/lec.c", "lec_tx_timeout"], ["net/bluetooth/bnep/netdev.c", "bnep_net_timeout"] ); for my $p (@work) { my @pair = @$p; my $file = $pair[0]; my $func = $pair[1]; print STDERR $file , ": ", $func,"\n"; our @ARGV = ($file); while (<ARGV>) { if (m/($func\s*\(struct\s+net_device\s+\*[A-Za-z_]?[A-Za-z-0-9_]*)(\))/) { print STDERR "found $1+$2 in $file\n"; } if (s/($func\s*\(struct\s+net_device\s+\*[A-Za-z_]?[A-Za-z-0-9_]*)(\))/$1, unsigned int txqueue$2/) { print STDERR "$func found in $file\n"; } print; } } where the list of files and functions is simply from: git grep ndo_tx_timeout, with manual addition of headers in the rare cases where the function is from a header, then manually changing the few places which actually call ndo_tx_timeout. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Heiner Kallweit <hkallweit1@gmail.com> Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com> Acked-by: Shannon Nelson <snelson@pensando.io> Reviewed-by: Martin Habets <mhabets@solarflare.com> changes from v9: fixup a forward declaration changes from v9: more leftovers from v3 change changes from v8: fix up a missing direct call to timeout rebased on net-next changes from v7: fixup leftovers from v3 change changes from v6: fix typo in rtl driver changes from v5: add missing files (allow any net device argument name) changes from v4: add a missing driver header changes from v3: change queue # to unsigned Changes from v2: added headers Changes from v1: Fix errors found by kbuild: generalize the pattern a bit, to pick up a couple of instances missed by the previous version. Signed-off-by: David S. Miller <davem@davemloft.net>
423 lines
10 KiB
C
423 lines
10 KiB
C
/*
|
|
* Copyright (c) 2011, 2012, Qualcomm Atheros Communications Inc.
|
|
* Copyright (c) 2017, I2SE GmbH
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
/* This module implements the Qualcomm Atheros UART protocol for
|
|
* kernel-based UART device; it is essentially an Ethernet-to-UART
|
|
* serial converter;
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/if_arp.h>
|
|
#include <linux/if_ether.h>
|
|
#include <linux/jiffies.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_device.h>
|
|
#include <linux/of_net.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/serdev.h>
|
|
#include <linux/skbuff.h>
|
|
#include <linux/types.h>
|
|
|
|
#include "qca_7k_common.h"
|
|
|
|
#define QCAUART_DRV_VERSION "0.1.0"
|
|
#define QCAUART_DRV_NAME "qcauart"
|
|
#define QCAUART_TX_TIMEOUT (1 * HZ)
|
|
|
|
struct qcauart {
|
|
struct net_device *net_dev;
|
|
spinlock_t lock; /* transmit lock */
|
|
struct work_struct tx_work; /* Flushes transmit buffer */
|
|
|
|
struct serdev_device *serdev;
|
|
struct qcafrm_handle frm_handle;
|
|
struct sk_buff *rx_skb;
|
|
|
|
unsigned char *tx_head; /* pointer to next XMIT byte */
|
|
int tx_left; /* bytes left in XMIT queue */
|
|
unsigned char *tx_buffer;
|
|
};
|
|
|
|
static int
|
|
qca_tty_receive(struct serdev_device *serdev, const unsigned char *data,
|
|
size_t count)
|
|
{
|
|
struct qcauart *qca = serdev_device_get_drvdata(serdev);
|
|
struct net_device *netdev = qca->net_dev;
|
|
struct net_device_stats *n_stats = &netdev->stats;
|
|
size_t i;
|
|
|
|
if (!qca->rx_skb) {
|
|
qca->rx_skb = netdev_alloc_skb_ip_align(netdev,
|
|
netdev->mtu +
|
|
VLAN_ETH_HLEN);
|
|
if (!qca->rx_skb) {
|
|
n_stats->rx_errors++;
|
|
n_stats->rx_dropped++;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < count; i++) {
|
|
s32 retcode;
|
|
|
|
retcode = qcafrm_fsm_decode(&qca->frm_handle,
|
|
qca->rx_skb->data,
|
|
skb_tailroom(qca->rx_skb),
|
|
data[i]);
|
|
|
|
switch (retcode) {
|
|
case QCAFRM_GATHER:
|
|
case QCAFRM_NOHEAD:
|
|
break;
|
|
case QCAFRM_NOTAIL:
|
|
netdev_dbg(netdev, "recv: no RX tail\n");
|
|
n_stats->rx_errors++;
|
|
n_stats->rx_dropped++;
|
|
break;
|
|
case QCAFRM_INVLEN:
|
|
netdev_dbg(netdev, "recv: invalid RX length\n");
|
|
n_stats->rx_errors++;
|
|
n_stats->rx_dropped++;
|
|
break;
|
|
default:
|
|
n_stats->rx_packets++;
|
|
n_stats->rx_bytes += retcode;
|
|
skb_put(qca->rx_skb, retcode);
|
|
qca->rx_skb->protocol = eth_type_trans(
|
|
qca->rx_skb, qca->rx_skb->dev);
|
|
qca->rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
netif_rx_ni(qca->rx_skb);
|
|
qca->rx_skb = netdev_alloc_skb_ip_align(netdev,
|
|
netdev->mtu +
|
|
VLAN_ETH_HLEN);
|
|
if (!qca->rx_skb) {
|
|
netdev_dbg(netdev, "recv: out of RX resources\n");
|
|
n_stats->rx_errors++;
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
/* Write out any remaining transmit buffer. Scheduled when tty is writable */
|
|
static void qcauart_transmit(struct work_struct *work)
|
|
{
|
|
struct qcauart *qca = container_of(work, struct qcauart, tx_work);
|
|
struct net_device_stats *n_stats = &qca->net_dev->stats;
|
|
int written;
|
|
|
|
spin_lock_bh(&qca->lock);
|
|
|
|
/* First make sure we're connected. */
|
|
if (!netif_running(qca->net_dev)) {
|
|
spin_unlock_bh(&qca->lock);
|
|
return;
|
|
}
|
|
|
|
if (qca->tx_left <= 0) {
|
|
/* Now serial buffer is almost free & we can start
|
|
* transmission of another packet
|
|
*/
|
|
n_stats->tx_packets++;
|
|
spin_unlock_bh(&qca->lock);
|
|
netif_wake_queue(qca->net_dev);
|
|
return;
|
|
}
|
|
|
|
written = serdev_device_write_buf(qca->serdev, qca->tx_head,
|
|
qca->tx_left);
|
|
if (written > 0) {
|
|
qca->tx_left -= written;
|
|
qca->tx_head += written;
|
|
}
|
|
spin_unlock_bh(&qca->lock);
|
|
}
|
|
|
|
/* Called by the driver when there's room for more data.
|
|
* Schedule the transmit.
|
|
*/
|
|
static void qca_tty_wakeup(struct serdev_device *serdev)
|
|
{
|
|
struct qcauart *qca = serdev_device_get_drvdata(serdev);
|
|
|
|
schedule_work(&qca->tx_work);
|
|
}
|
|
|
|
static struct serdev_device_ops qca_serdev_ops = {
|
|
.receive_buf = qca_tty_receive,
|
|
.write_wakeup = qca_tty_wakeup,
|
|
};
|
|
|
|
static int qcauart_netdev_open(struct net_device *dev)
|
|
{
|
|
struct qcauart *qca = netdev_priv(dev);
|
|
|
|
netif_start_queue(qca->net_dev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int qcauart_netdev_close(struct net_device *dev)
|
|
{
|
|
struct qcauart *qca = netdev_priv(dev);
|
|
|
|
netif_stop_queue(dev);
|
|
flush_work(&qca->tx_work);
|
|
|
|
spin_lock_bh(&qca->lock);
|
|
qca->tx_left = 0;
|
|
spin_unlock_bh(&qca->lock);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static netdev_tx_t
|
|
qcauart_netdev_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
{
|
|
struct net_device_stats *n_stats = &dev->stats;
|
|
struct qcauart *qca = netdev_priv(dev);
|
|
u8 pad_len = 0;
|
|
int written;
|
|
u8 *pos;
|
|
|
|
spin_lock(&qca->lock);
|
|
|
|
WARN_ON(qca->tx_left);
|
|
|
|
if (!netif_running(dev)) {
|
|
spin_unlock(&qca->lock);
|
|
netdev_warn(qca->net_dev, "xmit: iface is down\n");
|
|
goto out;
|
|
}
|
|
|
|
pos = qca->tx_buffer;
|
|
|
|
if (skb->len < QCAFRM_MIN_LEN)
|
|
pad_len = QCAFRM_MIN_LEN - skb->len;
|
|
|
|
pos += qcafrm_create_header(pos, skb->len + pad_len);
|
|
|
|
memcpy(pos, skb->data, skb->len);
|
|
pos += skb->len;
|
|
|
|
if (pad_len) {
|
|
memset(pos, 0, pad_len);
|
|
pos += pad_len;
|
|
}
|
|
|
|
pos += qcafrm_create_footer(pos);
|
|
|
|
netif_stop_queue(qca->net_dev);
|
|
|
|
written = serdev_device_write_buf(qca->serdev, qca->tx_buffer,
|
|
pos - qca->tx_buffer);
|
|
if (written > 0) {
|
|
qca->tx_left = (pos - qca->tx_buffer) - written;
|
|
qca->tx_head = qca->tx_buffer + written;
|
|
n_stats->tx_bytes += written;
|
|
}
|
|
spin_unlock(&qca->lock);
|
|
|
|
netif_trans_update(dev);
|
|
out:
|
|
dev_kfree_skb_any(skb);
|
|
return NETDEV_TX_OK;
|
|
}
|
|
|
|
static void qcauart_netdev_tx_timeout(struct net_device *dev, unsigned int txqueue)
|
|
{
|
|
struct qcauart *qca = netdev_priv(dev);
|
|
|
|
netdev_info(qca->net_dev, "Transmit timeout at %ld, latency %ld\n",
|
|
jiffies, dev_trans_start(dev));
|
|
dev->stats.tx_errors++;
|
|
dev->stats.tx_dropped++;
|
|
}
|
|
|
|
static int qcauart_netdev_init(struct net_device *dev)
|
|
{
|
|
struct qcauart *qca = netdev_priv(dev);
|
|
size_t len;
|
|
|
|
/* Finish setting up the device info. */
|
|
dev->mtu = QCAFRM_MAX_MTU;
|
|
dev->type = ARPHRD_ETHER;
|
|
|
|
len = QCAFRM_HEADER_LEN + QCAFRM_MAX_LEN + QCAFRM_FOOTER_LEN;
|
|
qca->tx_buffer = devm_kmalloc(&qca->serdev->dev, len, GFP_KERNEL);
|
|
if (!qca->tx_buffer)
|
|
return -ENOMEM;
|
|
|
|
qca->rx_skb = netdev_alloc_skb_ip_align(qca->net_dev,
|
|
qca->net_dev->mtu +
|
|
VLAN_ETH_HLEN);
|
|
if (!qca->rx_skb)
|
|
return -ENOBUFS;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void qcauart_netdev_uninit(struct net_device *dev)
|
|
{
|
|
struct qcauart *qca = netdev_priv(dev);
|
|
|
|
dev_kfree_skb(qca->rx_skb);
|
|
}
|
|
|
|
static const struct net_device_ops qcauart_netdev_ops = {
|
|
.ndo_init = qcauart_netdev_init,
|
|
.ndo_uninit = qcauart_netdev_uninit,
|
|
.ndo_open = qcauart_netdev_open,
|
|
.ndo_stop = qcauart_netdev_close,
|
|
.ndo_start_xmit = qcauart_netdev_xmit,
|
|
.ndo_set_mac_address = eth_mac_addr,
|
|
.ndo_tx_timeout = qcauart_netdev_tx_timeout,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
};
|
|
|
|
static void qcauart_netdev_setup(struct net_device *dev)
|
|
{
|
|
dev->netdev_ops = &qcauart_netdev_ops;
|
|
dev->watchdog_timeo = QCAUART_TX_TIMEOUT;
|
|
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
|
dev->tx_queue_len = 100;
|
|
|
|
/* MTU range: 46 - 1500 */
|
|
dev->min_mtu = QCAFRM_MIN_MTU;
|
|
dev->max_mtu = QCAFRM_MAX_MTU;
|
|
}
|
|
|
|
static const struct of_device_id qca_uart_of_match[] = {
|
|
{
|
|
.compatible = "qca,qca7000",
|
|
},
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(of, qca_uart_of_match);
|
|
|
|
static int qca_uart_probe(struct serdev_device *serdev)
|
|
{
|
|
struct net_device *qcauart_dev = alloc_etherdev(sizeof(struct qcauart));
|
|
struct qcauart *qca;
|
|
const char *mac;
|
|
u32 speed = 115200;
|
|
int ret;
|
|
|
|
if (!qcauart_dev)
|
|
return -ENOMEM;
|
|
|
|
qcauart_netdev_setup(qcauart_dev);
|
|
SET_NETDEV_DEV(qcauart_dev, &serdev->dev);
|
|
|
|
qca = netdev_priv(qcauart_dev);
|
|
if (!qca) {
|
|
pr_err("qca_uart: Fail to retrieve private structure\n");
|
|
ret = -ENOMEM;
|
|
goto free;
|
|
}
|
|
qca->net_dev = qcauart_dev;
|
|
qca->serdev = serdev;
|
|
qcafrm_fsm_init_uart(&qca->frm_handle);
|
|
|
|
spin_lock_init(&qca->lock);
|
|
INIT_WORK(&qca->tx_work, qcauart_transmit);
|
|
|
|
of_property_read_u32(serdev->dev.of_node, "current-speed", &speed);
|
|
|
|
mac = of_get_mac_address(serdev->dev.of_node);
|
|
|
|
if (!IS_ERR(mac))
|
|
ether_addr_copy(qca->net_dev->dev_addr, mac);
|
|
|
|
if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
|
|
eth_hw_addr_random(qca->net_dev);
|
|
dev_info(&serdev->dev, "Using random MAC address: %pM\n",
|
|
qca->net_dev->dev_addr);
|
|
}
|
|
|
|
netif_carrier_on(qca->net_dev);
|
|
serdev_device_set_drvdata(serdev, qca);
|
|
serdev_device_set_client_ops(serdev, &qca_serdev_ops);
|
|
|
|
ret = serdev_device_open(serdev);
|
|
if (ret) {
|
|
dev_err(&serdev->dev, "Unable to open device %s\n",
|
|
qcauart_dev->name);
|
|
goto free;
|
|
}
|
|
|
|
speed = serdev_device_set_baudrate(serdev, speed);
|
|
dev_info(&serdev->dev, "Using baudrate: %u\n", speed);
|
|
|
|
serdev_device_set_flow_control(serdev, false);
|
|
|
|
ret = register_netdev(qcauart_dev);
|
|
if (ret) {
|
|
dev_err(&serdev->dev, "Unable to register net device %s\n",
|
|
qcauart_dev->name);
|
|
serdev_device_close(serdev);
|
|
cancel_work_sync(&qca->tx_work);
|
|
goto free;
|
|
}
|
|
|
|
return 0;
|
|
|
|
free:
|
|
free_netdev(qcauart_dev);
|
|
return ret;
|
|
}
|
|
|
|
static void qca_uart_remove(struct serdev_device *serdev)
|
|
{
|
|
struct qcauart *qca = serdev_device_get_drvdata(serdev);
|
|
|
|
unregister_netdev(qca->net_dev);
|
|
|
|
/* Flush any pending characters in the driver. */
|
|
serdev_device_close(serdev);
|
|
cancel_work_sync(&qca->tx_work);
|
|
|
|
free_netdev(qca->net_dev);
|
|
}
|
|
|
|
static struct serdev_device_driver qca_uart_driver = {
|
|
.probe = qca_uart_probe,
|
|
.remove = qca_uart_remove,
|
|
.driver = {
|
|
.name = QCAUART_DRV_NAME,
|
|
.of_match_table = of_match_ptr(qca_uart_of_match),
|
|
},
|
|
};
|
|
|
|
module_serdev_device_driver(qca_uart_driver);
|
|
|
|
MODULE_DESCRIPTION("Qualcomm Atheros QCA7000 UART Driver");
|
|
MODULE_AUTHOR("Qualcomm Atheros Communications");
|
|
MODULE_AUTHOR("Stefan Wahren <stefan.wahren@i2se.com>");
|
|
MODULE_LICENSE("Dual BSD/GPL");
|
|
MODULE_VERSION(QCAUART_DRV_VERSION);
|