diff options
Diffstat (limited to 'drivers/net')
424 files changed, 2579 insertions, 1155 deletions
| diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 8dff900085d6..676a75f4182a 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Linux network device drivers.  # diff --git a/drivers/net/appletalk/cops.h b/drivers/net/appletalk/cops.h index fd2750b269c8..7a0bfb351929 100644 --- a/drivers/net/appletalk/cops.h +++ b/drivers/net/appletalk/cops.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*      cops.h: LocalTalk driver for Linux.   *   *      Authors: diff --git a/drivers/net/appletalk/ipddp.h b/drivers/net/appletalk/ipddp.h index 531519da99a3..9a8e45a46925 100644 --- a/drivers/net/appletalk/ipddp.h +++ b/drivers/net/appletalk/ipddp.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   *	ipddp.h: Header for IP-over-DDP driver for Linux.   */ diff --git a/drivers/net/appletalk/ltpc.h b/drivers/net/appletalk/ltpc.h index cd30544a3729..58cf945732a4 100644 --- a/drivers/net/appletalk/ltpc.h +++ b/drivers/net/appletalk/ltpc.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /***   ltpc.h   *   * diff --git a/drivers/net/arcnet/Makefile b/drivers/net/arcnet/Makefile index 5ce8ee63e435..53525e8ea130 100644 --- a/drivers/net/arcnet/Makefile +++ b/drivers/net/arcnet/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # Makefile for linux/drivers/net/arcnet  # diff --git a/drivers/net/arcnet/com9026.h b/drivers/net/arcnet/com9026.h index efcaf6707214..6adbc18711e0 100644 --- a/drivers/net/arcnet/com9026.h +++ b/drivers/net/arcnet/com9026.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __COM9026_H  #define __COM9026_H diff --git a/drivers/net/bonding/bond_debugfs.c b/drivers/net/bonding/bond_debugfs.c index e52e25a977fa..3868e1a5126d 100644 --- a/drivers/net/bonding/bond_debugfs.c +++ b/drivers/net/bonding/bond_debugfs.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/device.h> diff --git a/drivers/net/bonding/bond_procfs.c b/drivers/net/bonding/bond_procfs.c index d8d4ada034b7..f7799321dffb 100644 --- a/drivers/net/bonding/bond_procfs.c +++ b/drivers/net/bonding/bond_procfs.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/proc_fs.h>  #include <linux/export.h>  #include <net/net_namespace.h> diff --git a/drivers/net/caif/Makefile b/drivers/net/caif/Makefile index 9bbd45391f6c..54ae1165d60a 100644 --- a/drivers/net/caif/Makefile +++ b/drivers/net/caif/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  ccflags-$(CONFIG_CAIF_DEBUG) := -DDEBUG  # Serial interface diff --git a/drivers/net/can/Makefile b/drivers/net/can/Makefile index 4aabbee133b8..02b8ed794564 100644 --- a/drivers/net/can/Makefile +++ b/drivers/net/can/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  #  Makefile for the Linux Controller Area Network drivers.  # diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 13f0f219d8aa..a13a4896a8bd 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -182,22 +182,23 @@  /* FLEXCAN hardware feature flags   *   * Below is some version info we got: - *    SOC   Version   IP-Version  Glitch- [TR]WRN_INT Memory err RTR re- - *                                Filter? connected?  detection  ception in MB - *   MX25  FlexCAN2  03.00.00.00     no        no         no        no - *   MX28  FlexCAN2  03.00.04.00    yes       yes         no        no - *   MX35  FlexCAN2  03.00.00.00     no        no         no        no - *   MX53  FlexCAN2  03.00.00.00    yes        no         no        no - *   MX6s  FlexCAN3  10.00.12.00    yes       yes         no       yes - *   VF610 FlexCAN3  ?               no       yes        yes       yes? + *    SOC   Version   IP-Version  Glitch- [TR]WRN_INT IRQ Err Memory err RTR re- + *                                Filter? connected?  Passive detection  ception in MB + *   MX25  FlexCAN2  03.00.00.00     no        no         ?       no        no + *   MX28  FlexCAN2  03.00.04.00    yes       yes        no       no        no + *   MX35  FlexCAN2  03.00.00.00     no        no         ?       no        no + *   MX53  FlexCAN2  03.00.00.00    yes        no        no       no        no + *   MX6s  FlexCAN3  10.00.12.00    yes       yes        no       no       yes + *   VF610 FlexCAN3  ?               no       yes         ?      yes       yes?   *   * Some SOCs do not have the RX_WARN & TX_WARN interrupt line connected.   */ -#define FLEXCAN_QUIRK_BROKEN_ERR_STATE	BIT(1) /* [TR]WRN_INT not connected */ +#define FLEXCAN_QUIRK_BROKEN_WERR_STATE	BIT(1) /* [TR]WRN_INT not connected */  #define FLEXCAN_QUIRK_DISABLE_RXFG	BIT(2) /* Disable RX FIFO Global mask */  #define FLEXCAN_QUIRK_ENABLE_EACEN_RRS	BIT(3) /* Enable EACEN and RRS bit in ctrl2 */  #define FLEXCAN_QUIRK_DISABLE_MECR	BIT(4) /* Disable Memory error detection */  #define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP	BIT(5) /* Use timestamp based offloading */ +#define FLEXCAN_QUIRK_BROKEN_PERR_STATE	BIT(6) /* No interrupt for error passive */  /* Structure of the message buffer */  struct flexcan_mb { @@ -281,14 +282,17 @@ struct flexcan_priv {  };  static const struct flexcan_devtype_data fsl_p1010_devtype_data = { -	.quirks = FLEXCAN_QUIRK_BROKEN_ERR_STATE, +	.quirks = FLEXCAN_QUIRK_BROKEN_WERR_STATE | +		FLEXCAN_QUIRK_BROKEN_PERR_STATE,  }; -static const struct flexcan_devtype_data fsl_imx28_devtype_data; +static const struct flexcan_devtype_data fsl_imx28_devtype_data = { +	.quirks = FLEXCAN_QUIRK_BROKEN_PERR_STATE, +};  static const struct flexcan_devtype_data fsl_imx6q_devtype_data = {  	.quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS | -		FLEXCAN_QUIRK_USE_OFF_TIMESTAMP, +		FLEXCAN_QUIRK_USE_OFF_TIMESTAMP | FLEXCAN_QUIRK_BROKEN_PERR_STATE,  };  static const struct flexcan_devtype_data fsl_vf610_devtype_data = { @@ -335,6 +339,22 @@ static inline void flexcan_write(u32 val, void __iomem *addr)  }  #endif +static inline void flexcan_error_irq_enable(const struct flexcan_priv *priv) +{ +	struct flexcan_regs __iomem *regs = priv->regs; +	u32 reg_ctrl = (priv->reg_ctrl_default | FLEXCAN_CTRL_ERR_MSK); + +	flexcan_write(reg_ctrl, ®s->ctrl); +} + +static inline void flexcan_error_irq_disable(const struct flexcan_priv *priv) +{ +	struct flexcan_regs __iomem *regs = priv->regs; +	u32 reg_ctrl = (priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_MSK); + +	flexcan_write(reg_ctrl, ®s->ctrl); +} +  static inline int flexcan_transceiver_enable(const struct flexcan_priv *priv)  {  	if (!priv->reg_xceiver) @@ -713,6 +733,7 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)  	struct flexcan_regs __iomem *regs = priv->regs;  	irqreturn_t handled = IRQ_NONE;  	u32 reg_iflag1, reg_esr; +	enum can_state last_state = priv->can.state;  	reg_iflag1 = flexcan_read(®s->iflag1); @@ -765,8 +786,10 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)  		flexcan_write(reg_esr & FLEXCAN_ESR_ALL_INT, ®s->esr);  	} -	/* state change interrupt */ -	if (reg_esr & FLEXCAN_ESR_ERR_STATE) +	/* state change interrupt or broken error state quirk fix is enabled */ +	if ((reg_esr & FLEXCAN_ESR_ERR_STATE) || +	    (priv->devtype_data->quirks & (FLEXCAN_QUIRK_BROKEN_WERR_STATE | +	                                   FLEXCAN_QUIRK_BROKEN_PERR_STATE)))  		flexcan_irq_state(dev, reg_esr);  	/* bus error IRQ - handle if bus error reporting is activated */ @@ -774,6 +797,44 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)  	    (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))  		flexcan_irq_bus_err(dev, reg_esr); +	/* availability of error interrupt among state transitions in case +	 * bus error reporting is de-activated and +	 * FLEXCAN_QUIRK_BROKEN_PERR_STATE is enabled: +	 *  +--------------------------------------------------------------+ +	 *  | +----------------------------------------------+ [stopped /  | +	 *  | |                                              |  sleeping] -+ +	 *  +-+-> active <-> warning <-> passive -> bus off -+ +	 *        ___________^^^^^^^^^^^^_______________________________ +	 *        disabled(1)  enabled             disabled +	 * +	 * (1): enabled if FLEXCAN_QUIRK_BROKEN_WERR_STATE is enabled +	 */ +	if ((last_state != priv->can.state) && +	    (priv->devtype_data->quirks & FLEXCAN_QUIRK_BROKEN_PERR_STATE) && +	    !(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)) { +		switch (priv->can.state) { +		case CAN_STATE_ERROR_ACTIVE: +			if (priv->devtype_data->quirks & +			    FLEXCAN_QUIRK_BROKEN_WERR_STATE) +				flexcan_error_irq_enable(priv); +			else +				flexcan_error_irq_disable(priv); +			break; + +		case CAN_STATE_ERROR_WARNING: +			flexcan_error_irq_enable(priv); +			break; + +		case CAN_STATE_ERROR_PASSIVE: +		case CAN_STATE_BUS_OFF: +			flexcan_error_irq_disable(priv); +			break; + +		default: +			break; +		} +	} +  	return handled;  } @@ -887,7 +948,7 @@ static int flexcan_chip_start(struct net_device *dev)  	 * on most Flexcan cores, too. Otherwise we don't get  	 * any error warning or passive interrupts.  	 */ -	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_BROKEN_ERR_STATE || +	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_BROKEN_WERR_STATE ||  	    priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)  		reg_ctrl |= FLEXCAN_CTRL_ERR_MSK;  	else diff --git a/drivers/net/can/sja1000/Makefile b/drivers/net/can/sja1000/Makefile index be11ddd11b87..9253aaf9e739 100644 --- a/drivers/net/can/sja1000/Makefile +++ b/drivers/net/can/sja1000/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  #  Makefile for the SJA1000 CAN controller drivers.  # diff --git a/drivers/net/can/softing/softing.h b/drivers/net/can/softing/softing.h index 35f062282dbd..2893007ea05e 100644 --- a/drivers/net/can/softing/softing.h +++ b/drivers/net/can/softing/softing.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * softing common interfaces   * diff --git a/drivers/net/can/softing/softing_platform.h b/drivers/net/can/softing/softing_platform.h index ebbf69815623..68a161547644 100644 --- a/drivers/net/can/softing/softing_platform.h +++ b/drivers/net/can/softing/softing_platform.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <linux/platform_device.h> diff --git a/drivers/net/can/sun4i_can.c b/drivers/net/can/sun4i_can.c index 68ef0a4cd821..b0c80859f746 100644 --- a/drivers/net/can/sun4i_can.c +++ b/drivers/net/can/sun4i_can.c @@ -342,7 +342,7 @@ static int sun4i_can_start(struct net_device *dev)  	/* enter the selected mode */  	mod_reg_val = readl(priv->base + SUN4I_REG_MSEL_ADDR); -	if (priv->can.ctrlmode & CAN_CTRLMODE_PRESUME_ACK) +	if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)  		mod_reg_val |= SUN4I_MSEL_LOOPBACK_MODE;  	else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)  		mod_reg_val |= SUN4I_MSEL_LISTEN_ONLY_MODE; @@ -811,7 +811,6 @@ static int sun4ican_probe(struct platform_device *pdev)  	priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING |  				       CAN_CTRLMODE_LISTENONLY |  				       CAN_CTRLMODE_LOOPBACK | -				       CAN_CTRLMODE_PRESUME_ACK |  				       CAN_CTRLMODE_3_SAMPLES;  	priv->base = addr;  	priv->clk = clk; diff --git a/drivers/net/can/usb/Makefile b/drivers/net/can/usb/Makefile index 164453fd55d0..49ac7b99ba32 100644 --- a/drivers/net/can/usb/Makefile +++ b/drivers/net/can/usb/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  #  Makefile for the Linux Controller Area Network USB drivers.  # diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c index be928ce62d32..9fdb0f0bfa06 100644 --- a/drivers/net/can/usb/esd_usb2.c +++ b/drivers/net/can/usb/esd_usb2.c @@ -333,7 +333,7 @@ static void esd_usb2_rx_can_msg(struct esd_usb2_net_priv *priv,  		}  		cf->can_id = id & ESD_IDMASK; -		cf->can_dlc = get_can_dlc(msg->msg.rx.dlc); +		cf->can_dlc = get_can_dlc(msg->msg.rx.dlc & ~ESD_RTR);  		if (id & ESD_EXTID)  			cf->can_id |= CAN_EFF_FLAG; diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index afcc1312dbaf..68ac3e88a8ce 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -375,6 +375,8 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)  		gs_free_tx_context(txc); +		atomic_dec(&dev->active_tx_urbs); +  		netif_wake_queue(netdev);  	} @@ -463,14 +465,6 @@ static void gs_usb_xmit_callback(struct urb *urb)  			  urb->transfer_buffer_length,  			  urb->transfer_buffer,  			  urb->transfer_dma); - -	atomic_dec(&dev->active_tx_urbs); - -	if (!netif_device_present(netdev)) -		return; - -	if (netif_queue_stopped(netdev)) -		netif_wake_queue(netdev);  }  static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 18cc529fb807..9b18d96ef526 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c @@ -137,6 +137,7 @@ static inline bool kvaser_is_usbcan(const struct usb_device_id *id)  #define CMD_RESET_ERROR_COUNTER		49  #define CMD_TX_ACKNOWLEDGE		50  #define CMD_CAN_ERROR_EVENT		51 +#define CMD_FLUSH_QUEUE_REPLY		68  #define CMD_LEAF_USB_THROTTLE		77  #define CMD_LEAF_LOG_MESSAGE		106 @@ -1301,6 +1302,11 @@ static void kvaser_usb_handle_message(const struct kvaser_usb *dev,  			goto warn;  		break; +	case CMD_FLUSH_QUEUE_REPLY: +		if (dev->family != KVASER_LEAF) +			goto warn; +		break; +  	default:  warn:		dev_warn(dev->udev->dev.parent,  			 "Unhandled message (%d)\n", msg->id); @@ -1609,7 +1615,8 @@ static int kvaser_usb_close(struct net_device *netdev)  	if (err)  		netdev_warn(netdev, "Cannot flush queue, error %d\n", err); -	if (kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, priv->channel)) +	err = kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, priv->channel); +	if (err)  		netdev_warn(netdev, "Cannot reset card, error %d\n", err);  	err = kvaser_usb_stop_chip(priv); diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c index 017f48cdcab9..1cbca8e5741e 100644 --- a/drivers/net/cris/eth_v10.c +++ b/drivers/net/cris/eth_v10.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * e100net.c: A network driver for the ETRAX 100LX network controller.   * diff --git a/drivers/net/dsa/Makefile b/drivers/net/dsa/Makefile index 4a5b5bd297ee..d040aeb45172 100644 --- a/drivers/net/dsa/Makefile +++ b/drivers/net/dsa/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_NET_DSA_BCM_SF2)	+= bcm-sf2.o  bcm-sf2-objs			:= bcm_sf2.o bcm_sf2_cfp.o  obj-$(CONFIG_NET_DSA_LOOP)	+= dsa_loop.o dsa_loop_bdinfo.o diff --git a/drivers/net/dsa/b53/Makefile b/drivers/net/dsa/b53/Makefile index 7e6f9a8bfd75..4256fb42a4dd 100644 --- a/drivers/net/dsa/b53/Makefile +++ b/drivers/net/dsa/b53/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_B53)		+= b53_common.o  obj-$(CONFIG_B53_SPI_DRIVER)	+= b53_spi.o diff --git a/drivers/net/dsa/dsa_loop.h b/drivers/net/dsa/dsa_loop.h index dc396877fc95..93e5c15d0efd 100644 --- a/drivers/net/dsa/dsa_loop.h +++ b/drivers/net/dsa/dsa_loop.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __DSA_LOOP_H  #define __DSA_LOOP_H diff --git a/drivers/net/dsa/lan9303.h b/drivers/net/dsa/lan9303.h index 4d8be555ff4d..7df2ac77fc8f 100644 --- a/drivers/net/dsa/lan9303.h +++ b/drivers/net/dsa/lan9303.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <linux/regmap.h>  #include <linux/device.h>  #include <net/dsa.h> diff --git a/drivers/net/dsa/mv88e6060.c b/drivers/net/dsa/mv88e6060.c index dce7fa57eb55..f123ed57630d 100644 --- a/drivers/net/dsa/mv88e6060.c +++ b/drivers/net/dsa/mv88e6060.c @@ -214,8 +214,14 @@ static int mv88e6060_setup(struct dsa_switch *ds)  static int mv88e6060_set_addr(struct dsa_switch *ds, u8 *addr)  { -	/* Use the same MAC Address as FD Pause frames for all ports */ -	REG_WRITE(REG_GLOBAL, GLOBAL_MAC_01, (addr[0] << 9) | addr[1]); +	u16 val = addr[0] << 8 | addr[1]; + +	/* The multicast bit is always transmitted as a zero, so the switch uses +	 * bit 8 for "DiffAddr", where 0 means all ports transmit the same SA. +	 */ +	val &= 0xfeff; + +	REG_WRITE(REG_GLOBAL, GLOBAL_MAC_01, val);  	REG_WRITE(REG_GLOBAL, GLOBAL_MAC_23, (addr[2] << 8) | addr[3]);  	REG_WRITE(REG_GLOBAL, GLOBAL_MAC_45, (addr[4] << 8) | addr[5]); diff --git a/drivers/net/dsa/mv88e6xxx/Makefile b/drivers/net/dsa/mv88e6xxx/Makefile index 5cd5551461e3..58a4a0014e59 100644 --- a/drivers/net/dsa/mv88e6xxx/Makefile +++ b/drivers/net/dsa/mv88e6xxx/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o  mv88e6xxx-objs := chip.o  mv88e6xxx-objs += global1.o diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index c6678aa9b4ef..d74c7335c512 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -1100,6 +1100,10 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,  	};  	int i, err; +	/* DSA and CPU ports have to be members of multiple vlans */ +	if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port)) +		return 0; +  	if (!vid_begin)  		return -EOPNOTSUPP; @@ -3947,7 +3951,9 @@ static void mv88e6xxx_remove(struct mdio_device *mdiodev)  	if (chip->irq > 0) {  		if (chip->info->g2_irqs > 0)  			mv88e6xxx_g2_irq_free(chip); +		mutex_lock(&chip->reg_lock);  		mv88e6xxx_g1_irq_free(chip); +		mutex_unlock(&chip->reg_lock);  	}  } diff --git a/drivers/net/ethernet/3com/Makefile b/drivers/net/ethernet/3com/Makefile index 74046afab993..f8b73babc510 100644 --- a/drivers/net/ethernet/3com/Makefile +++ b/drivers/net/ethernet/3com/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the 3Com Ethernet device drivers  # diff --git a/drivers/net/ethernet/8390/Makefile b/drivers/net/ethernet/8390/Makefile index ff3b31894188..f975c2fc88a3 100644 --- a/drivers/net/ethernet/8390/Makefile +++ b/drivers/net/ethernet/8390/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the 8390 network device drivers.  # diff --git a/drivers/net/ethernet/Makefile b/drivers/net/ethernet/Makefile index a0a03d4d939a..39f6273358ed 100644 --- a/drivers/net/ethernet/Makefile +++ b/drivers/net/ethernet/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Linux network Ethernet device drivers.  # diff --git a/drivers/net/ethernet/aeroflex/greth.h b/drivers/net/ethernet/aeroflex/greth.h index 9c07140a5d8d..a1e04c9e932e 100644 --- a/drivers/net/ethernet/aeroflex/greth.h +++ b/drivers/net/ethernet/aeroflex/greth.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef GRETH_H  #define GRETH_H diff --git a/drivers/net/ethernet/alacritech/slic.h b/drivers/net/ethernet/alacritech/slic.h index 08931b4afc96..d0c388cfd52f 100644 --- a/drivers/net/ethernet/alacritech/slic.h +++ b/drivers/net/ethernet/alacritech/slic.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _SLIC_H  #define _SLIC_H diff --git a/drivers/net/ethernet/alteon/acenic.h b/drivers/net/ethernet/alteon/acenic.h index 51c486cfbb8c..c670067b1541 100644 --- a/drivers/net/ethernet/alteon/acenic.h +++ b/drivers/net/ethernet/alteon/acenic.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _ACENIC_H_  #define _ACENIC_H_  #include <linux/interrupt.h> diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/ethernet/amazon/ena/ena_ethtool.c index b1212debc2e1..967020fb26ee 100644 --- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c +++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c @@ -742,8 +742,8 @@ static void ena_get_channels(struct net_device *netdev,  {  	struct ena_adapter *adapter = netdev_priv(netdev); -	channels->max_rx = ENA_MAX_NUM_IO_QUEUES; -	channels->max_tx = ENA_MAX_NUM_IO_QUEUES; +	channels->max_rx = adapter->num_queues; +	channels->max_tx = adapter->num_queues;  	channels->max_other = 0;  	channels->max_combined = 0;  	channels->rx_count = adapter->num_queues; diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c index f7dc22f65d9f..c6bd5e24005d 100644 --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c @@ -966,7 +966,7 @@ static inline void ena_rx_checksum(struct ena_ring *rx_ring,  		u64_stats_update_begin(&rx_ring->syncp);  		rx_ring->rx_stats.bad_csum++;  		u64_stats_update_end(&rx_ring->syncp); -		netif_err(rx_ring->adapter, rx_err, rx_ring->netdev, +		netif_dbg(rx_ring->adapter, rx_err, rx_ring->netdev,  			  "RX IPv4 header checksum error\n");  		return;  	} @@ -979,7 +979,7 @@ static inline void ena_rx_checksum(struct ena_ring *rx_ring,  			u64_stats_update_begin(&rx_ring->syncp);  			rx_ring->rx_stats.bad_csum++;  			u64_stats_update_end(&rx_ring->syncp); -			netif_err(rx_ring->adapter, rx_err, rx_ring->netdev, +			netif_dbg(rx_ring->adapter, rx_err, rx_ring->netdev,  				  "RX L4 checksum error\n");  			skb->ip_summed = CHECKSUM_NONE;  			return; @@ -3064,7 +3064,8 @@ static void ena_release_bars(struct ena_com_dev *ena_dev, struct pci_dev *pdev)  	if (ena_dev->mem_bar)  		devm_iounmap(&pdev->dev, ena_dev->mem_bar); -	devm_iounmap(&pdev->dev, ena_dev->reg_bar); +	if (ena_dev->reg_bar) +		devm_iounmap(&pdev->dev, ena_dev->reg_bar);  	release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;  	pci_release_selected_regions(pdev, release_bars); diff --git a/drivers/net/ethernet/amd/7990.h b/drivers/net/ethernet/amd/7990.h index e9e0be313804..741cdc392c6b 100644 --- a/drivers/net/ethernet/amd/7990.h +++ b/drivers/net/ethernet/amd/7990.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * 7990.h -- LANCE ethernet IC generic routines.   * This is an attempt to separate out the bits of various ethernet diff --git a/drivers/net/ethernet/amd/Makefile b/drivers/net/ethernet/amd/Makefile index a38a2dce3eb3..45f86822a5f7 100644 --- a/drivers/net/ethernet/amd/Makefile +++ b/drivers/net/ethernet/amd/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the AMD network device drivers.  # diff --git a/drivers/net/ethernet/amd/hplance.h b/drivers/net/ethernet/amd/hplance.h index 04aee9e0376a..bc845a2c60c1 100644 --- a/drivers/net/ethernet/amd/hplance.h +++ b/drivers/net/ethernet/amd/hplance.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* Random defines and structures for the HP Lance driver.   * Copyright (C) 05/1998 Peter Maydell <[email protected]>   * Based on the Sun Lance driver and the NetBSD HP Lance driver diff --git a/drivers/net/ethernet/amd/xgbe/Makefile b/drivers/net/ethernet/amd/xgbe/Makefile index 0dea8f5da899..620785ffbd51 100644 --- a/drivers/net/ethernet/amd/xgbe/Makefile +++ b/drivers/net/ethernet/amd/xgbe/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_AMD_XGBE) += amd-xgbe.o  amd-xgbe-objs := xgbe-main.o xgbe-drv.o xgbe-dev.o \ diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h index 214986436ece..57e796870595 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h @@ -22,8 +22,12 @@  #define AQ_CFG_FORCE_LEGACY_INT 0U -#define AQ_CFG_IS_INTERRUPT_MODERATION_DEF   1U -#define AQ_CFG_INTERRUPT_MODERATION_RATE_DEF 0xFFFFU +#define AQ_CFG_INTERRUPT_MODERATION_OFF		0 +#define AQ_CFG_INTERRUPT_MODERATION_ON		1 +#define AQ_CFG_INTERRUPT_MODERATION_AUTO	0xFFFFU + +#define AQ_CFG_INTERRUPT_MODERATION_USEC_MAX (0x1FF * 2) +  #define AQ_CFG_IRQ_MASK                      0x1FFU  #define AQ_CFG_VECS_MAX   8U @@ -51,6 +55,10 @@  #define AQ_CFG_SKB_FRAGS_MAX   32U +/* Number of descriptors available in one ring to resume this ring queue + */ +#define AQ_CFG_RESTART_DESC_THRES   (AQ_CFG_SKB_FRAGS_MAX * 2) +  #define AQ_CFG_NAPI_WEIGHT     64U  #define AQ_CFG_MULTICAST_ADDRESS_MAX     32U diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c index a761e91471df..d5e99b468870 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c @@ -56,10 +56,6 @@ aq_ethtool_set_link_ksettings(struct net_device *ndev,  	return aq_nic_set_link_ksettings(aq_nic, cmd);  } -/* there "5U" is number of queue[#] stats lines (InPackets+...+InErrors) */ -static const unsigned int aq_ethtool_stat_queue_lines = 5U; -static const unsigned int aq_ethtool_stat_queue_chars = -	5U * ETH_GSTRING_LEN;  static const char aq_ethtool_stat_names[][ETH_GSTRING_LEN] = {  	"InPackets",  	"InUCast", @@ -83,56 +79,26 @@ static const char aq_ethtool_stat_names[][ETH_GSTRING_LEN] = {  	"InOctetsDma",  	"OutOctetsDma",  	"InDroppedDma", -	"Queue[0] InPackets", -	"Queue[0] OutPackets", -	"Queue[0] InJumboPackets", -	"Queue[0] InLroPackets", -	"Queue[0] InErrors", -	"Queue[1] InPackets", -	"Queue[1] OutPackets", -	"Queue[1] InJumboPackets", -	"Queue[1] InLroPackets", -	"Queue[1] InErrors", -	"Queue[2] InPackets", -	"Queue[2] OutPackets", -	"Queue[2] InJumboPackets", -	"Queue[2] InLroPackets", -	"Queue[2] InErrors", -	"Queue[3] InPackets", -	"Queue[3] OutPackets", -	"Queue[3] InJumboPackets", -	"Queue[3] InLroPackets", -	"Queue[3] InErrors", -	"Queue[4] InPackets", -	"Queue[4] OutPackets", -	"Queue[4] InJumboPackets", -	"Queue[4] InLroPackets", -	"Queue[4] InErrors", -	"Queue[5] InPackets", -	"Queue[5] OutPackets", -	"Queue[5] InJumboPackets", -	"Queue[5] InLroPackets", -	"Queue[5] InErrors", -	"Queue[6] InPackets", -	"Queue[6] OutPackets", -	"Queue[6] InJumboPackets", -	"Queue[6] InLroPackets", -	"Queue[6] InErrors", -	"Queue[7] InPackets", -	"Queue[7] OutPackets", -	"Queue[7] InJumboPackets", -	"Queue[7] InLroPackets", -	"Queue[7] InErrors", +}; + +static const char aq_ethtool_queue_stat_names[][ETH_GSTRING_LEN] = { +	"Queue[%d] InPackets", +	"Queue[%d] OutPackets", +	"Queue[%d] Restarts", +	"Queue[%d] InJumboPackets", +	"Queue[%d] InLroPackets", +	"Queue[%d] InErrors",  };  static void aq_ethtool_stats(struct net_device *ndev,  			     struct ethtool_stats *stats, u64 *data)  {  	struct aq_nic_s *aq_nic = netdev_priv(ndev); +	struct aq_nic_cfg_s *cfg = aq_nic_get_cfg(aq_nic); -/* ASSERT: Need add lines to aq_ethtool_stat_names if AQ_CFG_VECS_MAX > 8 */ -	BUILD_BUG_ON(AQ_CFG_VECS_MAX > 8); -	memset(data, 0, ARRAY_SIZE(aq_ethtool_stat_names) * sizeof(u64)); +	memset(data, 0, (ARRAY_SIZE(aq_ethtool_stat_names) + +				ARRAY_SIZE(aq_ethtool_queue_stat_names) * +				cfg->vecs) * sizeof(u64));  	aq_nic_get_stats(aq_nic, data);  } @@ -154,8 +120,8 @@ static void aq_ethtool_get_drvinfo(struct net_device *ndev,  	strlcpy(drvinfo->bus_info, pdev ? pci_name(pdev) : "",  		sizeof(drvinfo->bus_info)); -	drvinfo->n_stats = ARRAY_SIZE(aq_ethtool_stat_names) - -		(AQ_CFG_VECS_MAX - cfg->vecs) * aq_ethtool_stat_queue_lines; +	drvinfo->n_stats = ARRAY_SIZE(aq_ethtool_stat_names) + +		cfg->vecs * ARRAY_SIZE(aq_ethtool_queue_stat_names);  	drvinfo->testinfo_len = 0;  	drvinfo->regdump_len = regs_count;  	drvinfo->eedump_len = 0; @@ -164,14 +130,25 @@ static void aq_ethtool_get_drvinfo(struct net_device *ndev,  static void aq_ethtool_get_strings(struct net_device *ndev,  				   u32 stringset, u8 *data)  { +	int i, si;  	struct aq_nic_s *aq_nic = netdev_priv(ndev);  	struct aq_nic_cfg_s *cfg = aq_nic_get_cfg(aq_nic); - -	if (stringset == ETH_SS_STATS) -		memcpy(data, *aq_ethtool_stat_names, -		       sizeof(aq_ethtool_stat_names) - -		       (AQ_CFG_VECS_MAX - cfg->vecs) * -		       aq_ethtool_stat_queue_chars); +	u8 *p = data; + +	if (stringset == ETH_SS_STATS) { +		memcpy(p, *aq_ethtool_stat_names, +		       sizeof(aq_ethtool_stat_names)); +		p = p + sizeof(aq_ethtool_stat_names); +		for (i = 0; i < cfg->vecs; i++) { +			for (si = 0; +				si < ARRAY_SIZE(aq_ethtool_queue_stat_names); +				si++) { +				snprintf(p, ETH_GSTRING_LEN, +					 aq_ethtool_queue_stat_names[si], i); +				p += ETH_GSTRING_LEN; +			} +		} +	}  }  static int aq_ethtool_get_sset_count(struct net_device *ndev, int stringset) @@ -182,9 +159,8 @@ static int aq_ethtool_get_sset_count(struct net_device *ndev, int stringset)  	switch (stringset) {  	case ETH_SS_STATS: -		ret = ARRAY_SIZE(aq_ethtool_stat_names) - -			(AQ_CFG_VECS_MAX - cfg->vecs) * -			aq_ethtool_stat_queue_lines; +		ret = ARRAY_SIZE(aq_ethtool_stat_names) + +			cfg->vecs * ARRAY_SIZE(aq_ethtool_queue_stat_names);  		break;  	default:  		ret = -EOPNOTSUPP; @@ -245,6 +221,69 @@ static int aq_ethtool_get_rxnfc(struct net_device *ndev,  	return err;  } +int aq_ethtool_get_coalesce(struct net_device *ndev, +			    struct ethtool_coalesce *coal) +{ +	struct aq_nic_s *aq_nic = netdev_priv(ndev); +	struct aq_nic_cfg_s *cfg = aq_nic_get_cfg(aq_nic); + +	if (cfg->itr == AQ_CFG_INTERRUPT_MODERATION_ON || +	    cfg->itr == AQ_CFG_INTERRUPT_MODERATION_AUTO) { +		coal->rx_coalesce_usecs = cfg->rx_itr; +		coal->tx_coalesce_usecs = cfg->tx_itr; +		coal->rx_max_coalesced_frames = 0; +		coal->tx_max_coalesced_frames = 0; +	} else { +		coal->rx_coalesce_usecs = 0; +		coal->tx_coalesce_usecs = 0; +		coal->rx_max_coalesced_frames = 1; +		coal->tx_max_coalesced_frames = 1; +	} +	return 0; +} + +int aq_ethtool_set_coalesce(struct net_device *ndev, +			    struct ethtool_coalesce *coal) +{ +	struct aq_nic_s *aq_nic = netdev_priv(ndev); +	struct aq_nic_cfg_s *cfg = aq_nic_get_cfg(aq_nic); + +	/* This is not yet supported +	 */ +	if (coal->use_adaptive_rx_coalesce || coal->use_adaptive_tx_coalesce) +		return -EOPNOTSUPP; + +	/* Atlantic only supports timing based coalescing +	 */ +	if (coal->rx_max_coalesced_frames > 1 || +	    coal->rx_coalesce_usecs_irq || +	    coal->rx_max_coalesced_frames_irq) +		return -EOPNOTSUPP; + +	if (coal->tx_max_coalesced_frames > 1 || +	    coal->tx_coalesce_usecs_irq || +	    coal->tx_max_coalesced_frames_irq) +		return -EOPNOTSUPP; + +	/* We do not support frame counting. Check this +	 */ +	if (!(coal->rx_max_coalesced_frames == !coal->rx_coalesce_usecs)) +		return -EOPNOTSUPP; +	if (!(coal->tx_max_coalesced_frames == !coal->tx_coalesce_usecs)) +		return -EOPNOTSUPP; + +	if (coal->rx_coalesce_usecs > AQ_CFG_INTERRUPT_MODERATION_USEC_MAX || +	    coal->tx_coalesce_usecs > AQ_CFG_INTERRUPT_MODERATION_USEC_MAX) +		return -EINVAL; + +	cfg->itr = AQ_CFG_INTERRUPT_MODERATION_ON; + +	cfg->rx_itr = coal->rx_coalesce_usecs; +	cfg->tx_itr = coal->tx_coalesce_usecs; + +	return aq_nic_update_interrupt_moderation_settings(aq_nic); +} +  const struct ethtool_ops aq_ethtool_ops = {  	.get_link            = aq_ethtool_get_link,  	.get_regs_len        = aq_ethtool_get_regs_len, @@ -259,4 +298,6 @@ const struct ethtool_ops aq_ethtool_ops = {  	.get_ethtool_stats   = aq_ethtool_stats,  	.get_link_ksettings  = aq_ethtool_get_link_ksettings,  	.set_link_ksettings  = aq_ethtool_set_link_ksettings, +	.get_coalesce	     = aq_ethtool_get_coalesce, +	.set_coalesce	     = aq_ethtool_set_coalesce,  }; diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h index bf9b3f020e10..0207927dc8a6 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h @@ -151,8 +151,7 @@ struct aq_hw_ops {  				     [ETH_ALEN],  				     u32 count); -	int (*hw_interrupt_moderation_set)(struct aq_hw_s *self, -					   bool itr_enabled); +	int (*hw_interrupt_moderation_set)(struct aq_hw_s *self);  	int (*hw_rss_set)(struct aq_hw_s *self,  			  struct aq_rss_parameters *rss_params); @@ -163,6 +162,8 @@ struct aq_hw_ops {  	int (*hw_get_regs)(struct aq_hw_s *self,  			   struct aq_hw_caps_s *aq_hw_caps, u32 *regs_buff); +	int (*hw_update_stats)(struct aq_hw_s *self); +  	int (*hw_get_hw_stats)(struct aq_hw_s *self, u64 *data,  			       unsigned int *p_count); diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 6ac9e2602d6d..483e97691eea 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c @@ -16,6 +16,7 @@  #include "aq_pci_func.h"  #include "aq_nic_internal.h" +#include <linux/moduleparam.h>  #include <linux/netdevice.h>  #include <linux/etherdevice.h>  #include <linux/timer.h> @@ -24,6 +25,18 @@  #include <linux/tcp.h>  #include <net/ip.h> +static unsigned int aq_itr = AQ_CFG_INTERRUPT_MODERATION_AUTO; +module_param_named(aq_itr, aq_itr, uint, 0644); +MODULE_PARM_DESC(aq_itr, "Interrupt throttling mode"); + +static unsigned int aq_itr_tx; +module_param_named(aq_itr_tx, aq_itr_tx, uint, 0644); +MODULE_PARM_DESC(aq_itr_tx, "TX interrupt throttle rate"); + +static unsigned int aq_itr_rx; +module_param_named(aq_itr_rx, aq_itr_rx, uint, 0644); +MODULE_PARM_DESC(aq_itr_rx, "RX interrupt throttle rate"); +  static void aq_nic_rss_init(struct aq_nic_s *self, unsigned int num_rss_queues)  {  	struct aq_nic_cfg_s *cfg = &self->aq_nic_cfg; @@ -61,9 +74,9 @@ static void aq_nic_cfg_init_defaults(struct aq_nic_s *self)  	cfg->is_polling = AQ_CFG_IS_POLLING_DEF; -	cfg->is_interrupt_moderation = AQ_CFG_IS_INTERRUPT_MODERATION_DEF; -	cfg->itr = cfg->is_interrupt_moderation ? -		AQ_CFG_INTERRUPT_MODERATION_RATE_DEF : 0U; +	cfg->itr = aq_itr; +	cfg->tx_itr = aq_itr_tx; +	cfg->rx_itr = aq_itr_rx;  	cfg->is_rss = AQ_CFG_IS_RSS_DEF;  	cfg->num_rss_queues = AQ_CFG_NUM_RSS_QUEUES_DEF; @@ -119,6 +132,37 @@ int aq_nic_cfg_start(struct aq_nic_s *self)  	return 0;  } +static int aq_nic_update_link_status(struct aq_nic_s *self) +{ +	int err = self->aq_hw_ops.hw_get_link_status(self->aq_hw); + +	if (err) +		return err; + +	if (self->link_status.mbps != self->aq_hw->aq_link_status.mbps) { +		pr_info("%s: link change old %d new %d\n", +			AQ_CFG_DRV_NAME, self->link_status.mbps, +			self->aq_hw->aq_link_status.mbps); +		aq_nic_update_interrupt_moderation_settings(self); +	} + +	self->link_status = self->aq_hw->aq_link_status; +	if (!netif_carrier_ok(self->ndev) && self->link_status.mbps) { +		aq_utils_obj_set(&self->header.flags, +				 AQ_NIC_FLAG_STARTED); +		aq_utils_obj_clear(&self->header.flags, +				   AQ_NIC_LINK_DOWN); +		netif_carrier_on(self->ndev); +		netif_tx_wake_all_queues(self->ndev); +	} +	if (netif_carrier_ok(self->ndev) && !self->link_status.mbps) { +		netif_carrier_off(self->ndev); +		netif_tx_disable(self->ndev); +		aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN); +	} +	return 0; +} +  static void aq_nic_service_timer_cb(unsigned long param)  {  	struct aq_nic_s *self = (struct aq_nic_s *)param; @@ -131,25 +175,12 @@ static void aq_nic_service_timer_cb(unsigned long param)  	if (aq_utils_obj_test(&self->header.flags, AQ_NIC_FLAGS_IS_NOT_READY))  		goto err_exit; -	err = self->aq_hw_ops.hw_get_link_status(self->aq_hw); -	if (err < 0) +	err = aq_nic_update_link_status(self); +	if (err)  		goto err_exit; -	self->link_status = self->aq_hw->aq_link_status; - -	self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw, -		    self->aq_nic_cfg.is_interrupt_moderation); - -	if (self->link_status.mbps) { -		aq_utils_obj_set(&self->header.flags, -				 AQ_NIC_FLAG_STARTED); -		aq_utils_obj_clear(&self->header.flags, -				   AQ_NIC_LINK_DOWN); -		netif_carrier_on(self->ndev); -	} else { -		netif_carrier_off(self->ndev); -		aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN); -	} +	if (self->aq_hw_ops.hw_update_stats) +		self->aq_hw_ops.hw_update_stats(self->aq_hw);  	memset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s));  	memset(&stats_tx, 0U, sizeof(struct aq_ring_stats_tx_s)); @@ -214,7 +245,6 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,  	SET_NETDEV_DEV(ndev, dev);  	ndev->if_port = port; -	ndev->min_mtu = ETH_MIN_MTU;  	self->ndev = ndev;  	self->aq_pci_func = aq_pci_func; @@ -241,7 +271,6 @@ err_exit:  int aq_nic_ndev_register(struct aq_nic_s *self)  {  	int err = 0; -	unsigned int i = 0U;  	if (!self->ndev) {  		err = -EINVAL; @@ -263,8 +292,7 @@ int aq_nic_ndev_register(struct aq_nic_s *self)  	netif_carrier_off(self->ndev); -	for (i = AQ_CFG_VECS_MAX; i--;) -		aq_nic_ndev_queue_stop(self, i); +	netif_tx_disable(self->ndev);  	err = register_netdev(self->ndev);  	if (err < 0) @@ -283,6 +311,7 @@ int aq_nic_ndev_init(struct aq_nic_s *self)  	self->ndev->features = aq_hw_caps->hw_features;  	self->ndev->priv_flags = aq_hw_caps->hw_priv_flags;  	self->ndev->mtu = aq_nic_cfg->mtu - ETH_HLEN; +	self->ndev->max_mtu = self->aq_hw_caps.mtu - ETH_FCS_LEN - ETH_HLEN;  	return 0;  } @@ -318,12 +347,9 @@ struct aq_nic_s *aq_nic_alloc_hot(struct net_device *ndev)  		err = -EINVAL;  		goto err_exit;  	} -	if (netif_running(ndev)) { -		unsigned int i; - -		for (i = AQ_CFG_VECS_MAX; i--;) -			netif_stop_subqueue(ndev, i); -	} +	if (netif_running(ndev)) +		netif_tx_disable(ndev); +	netif_carrier_off(self->ndev);  	for (self->aq_vecs = 0; self->aq_vecs < self->aq_nic_cfg.vecs;  		self->aq_vecs++) { @@ -383,16 +409,6 @@ err_exit:  	return err;  } -void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx) -{ -	netif_start_subqueue(self->ndev, idx); -} - -void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx) -{ -	netif_stop_subqueue(self->ndev, idx); -} -  int aq_nic_start(struct aq_nic_s *self)  {  	struct aq_vec_s *aq_vec = NULL; @@ -421,9 +437,8 @@ int aq_nic_start(struct aq_nic_s *self)  	if (err < 0)  		goto err_exit; -	err = self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw, -			    self->aq_nic_cfg.is_interrupt_moderation); -	if (err < 0) +	err = aq_nic_update_interrupt_moderation_settings(self); +	if (err)  		goto err_exit;  	setup_timer(&self->service_timer, &aq_nic_service_timer_cb,  		    (unsigned long)self); @@ -451,10 +466,6 @@ int aq_nic_start(struct aq_nic_s *self)  			goto err_exit;  	} -	for (i = 0U, aq_vec = self->aq_vec[0]; -		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) -		aq_nic_ndev_queue_start(self, i); -  	err = netif_set_real_num_tx_queues(self->ndev, self->aq_vecs);  	if (err < 0)  		goto err_exit; @@ -463,6 +474,8 @@ int aq_nic_start(struct aq_nic_s *self)  	if (err < 0)  		goto err_exit; +	netif_tx_start_all_queues(self->ndev); +  err_exit:  	return err;  } @@ -475,6 +488,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,  	unsigned int nr_frags = skb_shinfo(skb)->nr_frags;  	unsigned int frag_count = 0U;  	unsigned int dx = ring->sw_tail; +	struct aq_ring_buff_s *first = NULL;  	struct aq_ring_buff_s *dx_buff = &ring->buff_ring[dx];  	if (unlikely(skb_is_gso(skb))) { @@ -485,6 +499,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,  		dx_buff->len_l4 = tcp_hdrlen(skb);  		dx_buff->mss = skb_shinfo(skb)->gso_size;  		dx_buff->is_txc = 1U; +		dx_buff->eop_index = 0xffffU;  		dx_buff->is_ipv6 =  			(ip_hdr(skb)->version == 6) ? 1U : 0U; @@ -504,6 +519,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,  	if (unlikely(dma_mapping_error(aq_nic_get_dev(self), dx_buff->pa)))  		goto exit; +	first = dx_buff;  	dx_buff->len_pkt = skb->len;  	dx_buff->is_sop = 1U;  	dx_buff->is_mapped = 1U; @@ -532,40 +548,46 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,  	for (; nr_frags--; ++frag_count) {  		unsigned int frag_len = 0U; +		unsigned int buff_offset = 0U; +		unsigned int buff_size = 0U;  		dma_addr_t frag_pa;  		skb_frag_t *frag = &skb_shinfo(skb)->frags[frag_count];  		frag_len = skb_frag_size(frag); -		frag_pa = skb_frag_dma_map(aq_nic_get_dev(self), frag, 0, -					   frag_len, DMA_TO_DEVICE); -		if (unlikely(dma_mapping_error(aq_nic_get_dev(self), frag_pa))) -			goto mapping_error; +		while (frag_len) { +			if (frag_len > AQ_CFG_TX_FRAME_MAX) +				buff_size = AQ_CFG_TX_FRAME_MAX; +			else +				buff_size = frag_len; + +			frag_pa = skb_frag_dma_map(aq_nic_get_dev(self), +						   frag, +						   buff_offset, +						   buff_size, +						   DMA_TO_DEVICE); + +			if (unlikely(dma_mapping_error(aq_nic_get_dev(self), +						       frag_pa))) +				goto mapping_error; -		while (frag_len > AQ_CFG_TX_FRAME_MAX) {  			dx = aq_ring_next_dx(ring, dx);  			dx_buff = &ring->buff_ring[dx];  			dx_buff->flags = 0U; -			dx_buff->len = AQ_CFG_TX_FRAME_MAX; +			dx_buff->len = buff_size;  			dx_buff->pa = frag_pa;  			dx_buff->is_mapped = 1U; +			dx_buff->eop_index = 0xffffU; + +			frag_len -= buff_size; +			buff_offset += buff_size; -			frag_len -= AQ_CFG_TX_FRAME_MAX; -			frag_pa += AQ_CFG_TX_FRAME_MAX;  			++ret;  		} - -		dx = aq_ring_next_dx(ring, dx); -		dx_buff = &ring->buff_ring[dx]; - -		dx_buff->flags = 0U; -		dx_buff->len = frag_len; -		dx_buff->pa = frag_pa; -		dx_buff->is_mapped = 1U; -		++ret;  	} +	first->eop_index = dx;  	dx_buff->is_eop = 1U;  	dx_buff->skb = skb;  	goto exit; @@ -602,7 +624,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)  	unsigned int vec = skb->queue_mapping % self->aq_nic_cfg.vecs;  	unsigned int tc = 0U;  	int err = NETDEV_TX_OK; -	bool is_nic_in_bad_state;  	frags = skb_shinfo(skb)->nr_frags + 1; @@ -613,13 +634,10 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)  		goto err_exit;  	} -	is_nic_in_bad_state = aq_utils_obj_test(&self->header.flags, -						AQ_NIC_FLAGS_IS_NOT_TX_READY) || -						(aq_ring_avail_dx(ring) < -						AQ_CFG_SKB_FRAGS_MAX); +	aq_ring_update_queue_state(ring); -	if (is_nic_in_bad_state) { -		aq_nic_ndev_queue_stop(self, ring->idx); +	/* Above status update may stop the queue. Check this. */ +	if (__netif_subqueue_stopped(self->ndev, ring->idx)) {  		err = NETDEV_TX_BUSY;  		goto err_exit;  	} @@ -631,9 +649,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)  						      ring,  						      frags);  		if (err >= 0) { -			if (aq_ring_avail_dx(ring) < AQ_CFG_SKB_FRAGS_MAX + 1) -				aq_nic_ndev_queue_stop(self, ring->idx); -  			++ring->stats.tx.packets;  			ring->stats.tx.bytes += skb->len;  		} @@ -645,6 +660,11 @@ err_exit:  	return err;  } +int aq_nic_update_interrupt_moderation_settings(struct aq_nic_s *self) +{ +	return self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw); +} +  int aq_nic_set_packet_filter(struct aq_nic_s *self, unsigned int flags)  {  	int err = 0; @@ -693,16 +713,9 @@ int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)  int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu)  { -	int err = 0; - -	if (new_mtu > self->aq_hw_caps.mtu) { -		err = -EINVAL; -		goto err_exit; -	}  	self->aq_nic_cfg.mtu = new_mtu; -err_exit: -	return err; +	return 0;  }  int aq_nic_set_mac(struct aq_nic_s *self, struct net_device *ndev) @@ -905,9 +918,8 @@ int aq_nic_stop(struct aq_nic_s *self)  	struct aq_vec_s *aq_vec = NULL;  	unsigned int i = 0U; -	for (i = 0U, aq_vec = self->aq_vec[0]; -		self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) -		aq_nic_ndev_queue_stop(self, i); +	netif_tx_disable(self->ndev); +	netif_carrier_off(self->ndev);  	del_timer_sync(&self->service_timer); diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h index 7fc2a5ecb2b7..4309983acdd6 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h @@ -40,6 +40,8 @@ struct aq_nic_cfg_s {  	u32 vecs;		/* vecs==allocated irqs */  	u32 irq_type;  	u32 itr; +	u16 rx_itr; +	u16 tx_itr;  	u32 num_rss_queues;  	u32 mtu;  	u32 ucp_0x364; @@ -49,7 +51,6 @@ struct aq_nic_cfg_s {  	u16 is_mc_list_enabled;  	u16 mc_list_count;  	bool is_autoneg; -	bool is_interrupt_moderation;  	bool is_polling;  	bool is_rss;  	bool is_lro; @@ -83,8 +84,6 @@ struct net_device *aq_nic_get_ndev(struct aq_nic_s *self);  int aq_nic_init(struct aq_nic_s *self);  int aq_nic_cfg_start(struct aq_nic_s *self);  int aq_nic_ndev_register(struct aq_nic_s *self); -void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx); -void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx);  void aq_nic_ndev_free(struct aq_nic_s *self);  int aq_nic_start(struct aq_nic_s *self);  int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb); @@ -106,5 +105,6 @@ int aq_nic_set_link_ksettings(struct aq_nic_s *self,  struct aq_nic_cfg_s *aq_nic_get_cfg(struct aq_nic_s *self);  u32 aq_nic_get_fw_version(struct aq_nic_s *self);  int aq_nic_change_pm_state(struct aq_nic_s *self, pm_message_t *pm_msg); +int aq_nic_update_interrupt_moderation_settings(struct aq_nic_s *self);  #endif /* AQ_NIC_H */ diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c index 4c6c882c6a1c..cadaa646c89f 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c @@ -85,6 +85,7 @@ int aq_pci_func_init(struct aq_pci_func_s *self)  	int err = 0;  	unsigned int bar = 0U;  	unsigned int port = 0U; +	unsigned int numvecs = 0U;  	err = pci_enable_device(self->pdev);  	if (err < 0) @@ -142,10 +143,12 @@ int aq_pci_func_init(struct aq_pci_func_s *self)  		}  	} -	/*enable interrupts */ +	numvecs = min((u8)AQ_CFG_VECS_DEF, self->aq_hw_caps.msix_irqs); +	numvecs = min(numvecs, num_online_cpus()); + +	/* enable interrupts */  #if !AQ_CFG_FORCE_LEGACY_INT -	err = pci_alloc_irq_vectors(self->pdev, self->aq_hw_caps.msix_irqs, -			      self->aq_hw_caps.msix_irqs, PCI_IRQ_MSIX); +	err = pci_alloc_irq_vectors(self->pdev, numvecs, numvecs, PCI_IRQ_MSIX);  	if (err < 0) {  		err = pci_alloc_irq_vectors(self->pdev, 1, 1, @@ -153,7 +156,7 @@ int aq_pci_func_init(struct aq_pci_func_s *self)  		if (err < 0)  			goto err_exit;  	} -#endif +#endif /* AQ_CFG_FORCE_LEGACY_INT */  	/* net device init */  	for (port = 0; port < self->ports; ++port) { @@ -265,6 +268,9 @@ void aq_pci_func_free(struct aq_pci_func_s *self)  		aq_nic_ndev_free(self->port[port]);  	} +	if (self->mmio) +		iounmap(self->mmio); +  	kfree(self);  err_exit:; diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c index 4eee1996a825..0654e0c76bc2 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c @@ -104,6 +104,38 @@ int aq_ring_init(struct aq_ring_s *self)  	return 0;  } +static inline bool aq_ring_dx_in_range(unsigned int h, unsigned int i, +				       unsigned int t) +{ +	return (h < t) ? ((h < i) && (i < t)) : ((h < i) || (i < t)); +} + +void aq_ring_update_queue_state(struct aq_ring_s *ring) +{ +	if (aq_ring_avail_dx(ring) <= AQ_CFG_SKB_FRAGS_MAX) +		aq_ring_queue_stop(ring); +	else if (aq_ring_avail_dx(ring) > AQ_CFG_RESTART_DESC_THRES) +		aq_ring_queue_wake(ring); +} + +void aq_ring_queue_wake(struct aq_ring_s *ring) +{ +	struct net_device *ndev = aq_nic_get_ndev(ring->aq_nic); + +	if (__netif_subqueue_stopped(ndev, ring->idx)) { +		netif_wake_subqueue(ndev, ring->idx); +		ring->stats.tx.queue_restarts++; +	} +} + +void aq_ring_queue_stop(struct aq_ring_s *ring) +{ +	struct net_device *ndev = aq_nic_get_ndev(ring->aq_nic); + +	if (!__netif_subqueue_stopped(ndev, ring->idx)) +		netif_stop_subqueue(ndev, ring->idx); +} +  void aq_ring_tx_clean(struct aq_ring_s *self)  {  	struct device *dev = aq_nic_get_dev(self->aq_nic); @@ -113,23 +145,28 @@ void aq_ring_tx_clean(struct aq_ring_s *self)  		struct aq_ring_buff_s *buff = &self->buff_ring[self->sw_head];  		if (likely(buff->is_mapped)) { -			if (unlikely(buff->is_sop)) +			if (unlikely(buff->is_sop)) { +				if (!buff->is_eop && +				    buff->eop_index != 0xffffU && +				    (!aq_ring_dx_in_range(self->sw_head, +						buff->eop_index, +						self->hw_head))) +					break; +  				dma_unmap_single(dev, buff->pa, buff->len,  						 DMA_TO_DEVICE); -			else +			} else {  				dma_unmap_page(dev, buff->pa, buff->len,  					       DMA_TO_DEVICE); +			}  		}  		if (unlikely(buff->is_eop))  			dev_kfree_skb_any(buff->skb); -	} -} -static inline unsigned int aq_ring_dx_in_range(unsigned int h, unsigned int i, -					       unsigned int t) -{ -	return (h < t) ? ((h < i) && (i < t)) : ((h < i) || (i < t)); +		buff->pa = 0U; +		buff->eop_index = 0xffffU; +	}  }  #define AQ_SKB_ALIGN SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h index 782176c5f4f8..5844078764bd 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h @@ -65,7 +65,7 @@ struct __packed aq_ring_buff_s {  	};  	union {  		struct { -			u32 len:16; +			u16 len;  			u32 is_ip_cso:1;  			u32 is_udp_cso:1;  			u32 is_tcp_cso:1; @@ -77,8 +77,10 @@ struct __packed aq_ring_buff_s {  			u32 is_cleaned:1;  			u32 is_error:1;  			u32 rsvd3:6; +			u16 eop_index; +			u16 rsvd4;  		}; -		u32 flags; +		u64 flags;  	};  }; @@ -94,6 +96,7 @@ struct aq_ring_stats_tx_s {  	u64 errors;  	u64 packets;  	u64 bytes; +	u64 queue_restarts;  };  union aq_ring_stats_s { @@ -147,6 +150,9 @@ struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,  int aq_ring_init(struct aq_ring_s *self);  void aq_ring_rx_deinit(struct aq_ring_s *self);  void aq_ring_free(struct aq_ring_s *self); +void aq_ring_update_queue_state(struct aq_ring_s *ring); +void aq_ring_queue_wake(struct aq_ring_s *ring); +void aq_ring_queue_stop(struct aq_ring_s *ring);  void aq_ring_tx_clean(struct aq_ring_s *self);  int aq_ring_rx_clean(struct aq_ring_s *self,  		     struct napi_struct *napi, diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c index ebf588004c46..5fecc9a099ef 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c @@ -59,12 +59,7 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)  			if (ring[AQ_VEC_TX_ID].sw_head !=  			    ring[AQ_VEC_TX_ID].hw_head) {  				aq_ring_tx_clean(&ring[AQ_VEC_TX_ID]); - -				if (aq_ring_avail_dx(&ring[AQ_VEC_TX_ID]) > -				    AQ_CFG_SKB_FRAGS_MAX) { -					aq_nic_ndev_queue_start(self->aq_nic, -						ring[AQ_VEC_TX_ID].idx); -				} +				aq_ring_update_queue_state(&ring[AQ_VEC_TX_ID]);  				was_tx_cleaned = true;  			} @@ -364,6 +359,7 @@ void aq_vec_add_stats(struct aq_vec_s *self,  		stats_tx->packets += tx->packets;  		stats_tx->bytes += tx->bytes;  		stats_tx->errors += tx->errors; +		stats_tx->queue_restarts += tx->queue_restarts;  	}  } @@ -377,8 +373,11 @@ int aq_vec_get_sw_stats(struct aq_vec_s *self, u64 *data, unsigned int *p_count)  	memset(&stats_tx, 0U, sizeof(struct aq_ring_stats_tx_s));  	aq_vec_add_stats(self, &stats_rx, &stats_tx); +	/* This data should mimic aq_ethtool_queue_stat_names structure +	 */  	data[count] += stats_rx.packets;  	data[++count] += stats_tx.packets; +	data[++count] += stats_tx.queue_restarts;  	data[++count] += stats_rx.jumbo_packets;  	data[++count] += stats_rx.lro_packets;  	data[++count] += stats_rx.errors; diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c index c5a02df7a48b..07b3c49a16a4 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c @@ -765,24 +765,23 @@ err_exit:  	return err;  } -static int hw_atl_a0_hw_interrupt_moderation_set(struct aq_hw_s *self, -						 bool itr_enabled) +static int hw_atl_a0_hw_interrupt_moderation_set(struct aq_hw_s *self)  {  	unsigned int i = 0U; +	u32 itr_rx; -	if (itr_enabled && self->aq_nic_cfg->itr) { -		if (self->aq_nic_cfg->itr != 0xFFFFU) { +	if (self->aq_nic_cfg->itr) { +		if (self->aq_nic_cfg->itr != AQ_CFG_INTERRUPT_MODERATION_AUTO) {  			u32 itr_ = (self->aq_nic_cfg->itr >> 1);  			itr_ = min(AQ_CFG_IRQ_MASK, itr_); -			PHAL_ATLANTIC_A0->itr_rx = 0x80000000U | -					(itr_ << 0x10); +			itr_rx = 0x80000000U | (itr_ << 0x10);  		} else  {  			u32 n = 0xFFFFU & aq_hw_read_reg(self, 0x00002A00U);  			if (n < self->aq_link_status.mbps) { -				PHAL_ATLANTIC_A0->itr_rx = 0U; +				itr_rx = 0U;  			} else {  				static unsigned int hw_timers_tbl_[] = {  					0x01CU, /* 10Gbit */ @@ -797,8 +796,7 @@ static int hw_atl_a0_hw_interrupt_moderation_set(struct aq_hw_s *self,  					hw_atl_utils_mbps_2_speed_index(  						self->aq_link_status.mbps); -				PHAL_ATLANTIC_A0->itr_rx = -					0x80000000U | +				itr_rx = 0x80000000U |  					(hw_timers_tbl_[speed_index] << 0x10U);  			} @@ -806,11 +804,11 @@ static int hw_atl_a0_hw_interrupt_moderation_set(struct aq_hw_s *self,  			aq_hw_write_reg(self, 0x00002A00U, 0x8D000000U);  		}  	} else { -		PHAL_ATLANTIC_A0->itr_rx = 0U; +		itr_rx = 0U;  	}  	for (i = HW_ATL_A0_RINGS_MAX; i--;) -		reg_irq_thr_set(self, PHAL_ATLANTIC_A0->itr_rx, i); +		reg_irq_thr_set(self, itr_rx, i);  	return aq_hw_err_from_flags(self);  } @@ -885,6 +883,7 @@ static struct aq_hw_ops hw_atl_ops_ = {  	.hw_rss_set                  = hw_atl_a0_hw_rss_set,  	.hw_rss_hash_set             = hw_atl_a0_hw_rss_hash_set,  	.hw_get_regs                 = hw_atl_utils_hw_get_regs, +	.hw_update_stats             = hw_atl_utils_update_stats,  	.hw_get_hw_stats             = hw_atl_utils_get_hw_stats,  	.hw_get_fw_version           = hw_atl_utils_get_fw_version,  }; diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c index 21784cc39dab..ec68c20efcbd 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c @@ -788,39 +788,45 @@ err_exit:  	return err;  } -static int hw_atl_b0_hw_interrupt_moderation_set(struct aq_hw_s *self, -						 bool itr_enabled) +static int hw_atl_b0_hw_interrupt_moderation_set(struct aq_hw_s *self)  {  	unsigned int i = 0U; +	u32 itr_tx = 2U; +	u32 itr_rx = 2U; -	if (itr_enabled && self->aq_nic_cfg->itr) { +	switch (self->aq_nic_cfg->itr) { +	case  AQ_CFG_INTERRUPT_MODERATION_ON: +	case  AQ_CFG_INTERRUPT_MODERATION_AUTO:  		tdm_tx_desc_wr_wb_irq_en_set(self, 0U);  		tdm_tdm_intr_moder_en_set(self, 1U);  		rdm_rx_desc_wr_wb_irq_en_set(self, 0U);  		rdm_rdm_intr_moder_en_set(self, 1U); -		PHAL_ATLANTIC_B0->itr_tx = 2U; -		PHAL_ATLANTIC_B0->itr_rx = 2U; +		if (self->aq_nic_cfg->itr == AQ_CFG_INTERRUPT_MODERATION_ON) { +			/* HW timers are in 2us units */ +			int tx_max_timer = self->aq_nic_cfg->tx_itr / 2; +			int tx_min_timer = tx_max_timer / 2; -		if (self->aq_nic_cfg->itr != 0xFFFFU) { -			unsigned int max_timer = self->aq_nic_cfg->itr / 2U; -			unsigned int min_timer = self->aq_nic_cfg->itr / 32U; +			int rx_max_timer = self->aq_nic_cfg->rx_itr / 2; +			int rx_min_timer = rx_max_timer / 2; -			max_timer = min(0x1FFU, max_timer); -			min_timer = min(0xFFU, min_timer); +			tx_max_timer = min(HW_ATL_INTR_MODER_MAX, tx_max_timer); +			tx_min_timer = min(HW_ATL_INTR_MODER_MIN, tx_min_timer); +			rx_max_timer = min(HW_ATL_INTR_MODER_MAX, rx_max_timer); +			rx_min_timer = min(HW_ATL_INTR_MODER_MIN, rx_min_timer); -			PHAL_ATLANTIC_B0->itr_tx |= min_timer << 0x8U; -			PHAL_ATLANTIC_B0->itr_tx |= max_timer << 0x10U; -			PHAL_ATLANTIC_B0->itr_rx |= min_timer << 0x8U; -			PHAL_ATLANTIC_B0->itr_rx |= max_timer << 0x10U; +			itr_tx |= tx_min_timer << 0x8U; +			itr_tx |= tx_max_timer << 0x10U; +			itr_rx |= rx_min_timer << 0x8U; +			itr_rx |= rx_max_timer << 0x10U;  		} else {  			static unsigned int hw_atl_b0_timers_table_tx_[][2] = { -				{0xffU, 0xffU}, /* 10Gbit */ -				{0xffU, 0x1ffU}, /* 5Gbit */ -				{0xffU, 0x1ffU}, /* 5Gbit 5GS */ -				{0xffU, 0x1ffU}, /* 2.5Gbit */ -				{0xffU, 0x1ffU}, /* 1Gbit */ -				{0xffU, 0x1ffU}, /* 100Mbit */ +				{0xfU, 0xffU}, /* 10Gbit */ +				{0xfU, 0x1ffU}, /* 5Gbit */ +				{0xfU, 0x1ffU}, /* 5Gbit 5GS */ +				{0xfU, 0x1ffU}, /* 2.5Gbit */ +				{0xfU, 0x1ffU}, /* 1Gbit */ +				{0xfU, 0x1ffU}, /* 100Mbit */  			};  			static unsigned int hw_atl_b0_timers_table_rx_[][2] = { @@ -836,34 +842,36 @@ static int hw_atl_b0_hw_interrupt_moderation_set(struct aq_hw_s *self,  					hw_atl_utils_mbps_2_speed_index(  						self->aq_link_status.mbps); -			PHAL_ATLANTIC_B0->itr_tx |= -				hw_atl_b0_timers_table_tx_[speed_index] -				[0] << 0x8U; /* set min timer value */ -			PHAL_ATLANTIC_B0->itr_tx |= -				hw_atl_b0_timers_table_tx_[speed_index] -				[1] << 0x10U; /* set max timer value */ - -			PHAL_ATLANTIC_B0->itr_rx |= -				hw_atl_b0_timers_table_rx_[speed_index] -				[0] << 0x8U; /* set min timer value */ -			PHAL_ATLANTIC_B0->itr_rx |= -				hw_atl_b0_timers_table_rx_[speed_index] -				[1] << 0x10U; /* set max timer value */ +			/* Update user visible ITR settings */ +			self->aq_nic_cfg->tx_itr = hw_atl_b0_timers_table_tx_ +							[speed_index][1] * 2; +			self->aq_nic_cfg->rx_itr = hw_atl_b0_timers_table_rx_ +							[speed_index][1] * 2; + +			itr_tx |= hw_atl_b0_timers_table_tx_ +						[speed_index][0] << 0x8U; +			itr_tx |= hw_atl_b0_timers_table_tx_ +						[speed_index][1] << 0x10U; + +			itr_rx |= hw_atl_b0_timers_table_rx_ +						[speed_index][0] << 0x8U; +			itr_rx |= hw_atl_b0_timers_table_rx_ +						[speed_index][1] << 0x10U;  		} -	} else { +		break; +	case AQ_CFG_INTERRUPT_MODERATION_OFF:  		tdm_tx_desc_wr_wb_irq_en_set(self, 1U);  		tdm_tdm_intr_moder_en_set(self, 0U);  		rdm_rx_desc_wr_wb_irq_en_set(self, 1U);  		rdm_rdm_intr_moder_en_set(self, 0U); -		PHAL_ATLANTIC_B0->itr_tx = 0U; -		PHAL_ATLANTIC_B0->itr_rx = 0U; +		itr_tx = 0U; +		itr_rx = 0U; +		break;  	}  	for (i = HW_ATL_B0_RINGS_MAX; i--;) { -		reg_tx_intr_moder_ctrl_set(self, -					   PHAL_ATLANTIC_B0->itr_tx, i); -		reg_rx_intr_moder_ctrl_set(self, -					   PHAL_ATLANTIC_B0->itr_rx, i); +		reg_tx_intr_moder_ctrl_set(self, itr_tx, i); +		reg_rx_intr_moder_ctrl_set(self, itr_rx, i);  	}  	return aq_hw_err_from_flags(self); @@ -939,6 +947,7 @@ static struct aq_hw_ops hw_atl_ops_ = {  	.hw_rss_set                  = hw_atl_b0_hw_rss_set,  	.hw_rss_hash_set             = hw_atl_b0_hw_rss_hash_set,  	.hw_get_regs                 = hw_atl_utils_hw_get_regs, +	.hw_update_stats             = hw_atl_utils_update_stats,  	.hw_get_hw_stats             = hw_atl_utils_get_hw_stats,  	.hw_get_fw_version           = hw_atl_utils_get_fw_version,  }; diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h index f3957e930340..9aa2c6edfca2 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h @@ -16,7 +16,7 @@  #include "../aq_common.h" -#define HW_ATL_B0_MTU_JUMBO (16000U) +#define HW_ATL_B0_MTU_JUMBO  16352U  #define HW_ATL_B0_MTU        1514U  #define HW_ATL_B0_TX_RINGS 4U @@ -139,6 +139,9 @@  #define HW_ATL_B0_FW_VER_EXPECTED 0x01050006U +#define HW_ATL_INTR_MODER_MAX  0x1FF +#define HW_ATL_INTR_MODER_MIN  0xFF +  /* Hardware tx descriptor */  struct __packed hw_atl_txd_s {  	u64 buf_addr; diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c index 4f5ec9a0fbfb..1fe016fc4bc7 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c @@ -255,6 +255,15 @@ err_exit:  	return err;  } +int hw_atl_utils_mpi_read_mbox(struct aq_hw_s *self, +			       struct hw_aq_atl_utils_mbox_header *pmbox) +{ +	return hw_atl_utils_fw_downld_dwords(self, +				      PHAL_ATLANTIC->mbox_addr, +				      (u32 *)(void *)pmbox, +				      sizeof(*pmbox) / sizeof(u32)); +} +  void hw_atl_utils_mpi_read_stats(struct aq_hw_s *self,  				 struct hw_aq_atl_utils_mbox *pmbox)  { @@ -267,9 +276,6 @@ void hw_atl_utils_mpi_read_stats(struct aq_hw_s *self,  	if (err < 0)  		goto err_exit; -	if (pmbox != &PHAL_ATLANTIC->mbox) -		memcpy(pmbox, &PHAL_ATLANTIC->mbox, sizeof(*pmbox)); -  	if (IS_CHIP_FEATURE(REVISION_A0)) {  		unsigned int mtu = self->aq_nic_cfg ?  					self->aq_nic_cfg->mtu : 1514U; @@ -299,17 +305,17 @@ void hw_atl_utils_mpi_set(struct aq_hw_s *self,  {  	int err = 0;  	u32 transaction_id = 0; +	struct hw_aq_atl_utils_mbox_header mbox;  	if (state == MPI_RESET) { -		hw_atl_utils_mpi_read_stats(self, &PHAL_ATLANTIC->mbox); +		hw_atl_utils_mpi_read_mbox(self, &mbox); -		transaction_id = PHAL_ATLANTIC->mbox.transaction_id; +		transaction_id = mbox.transaction_id;  		AQ_HW_WAIT_FOR(transaction_id != -				(hw_atl_utils_mpi_read_stats -					(self, &PHAL_ATLANTIC->mbox), -					PHAL_ATLANTIC->mbox.transaction_id), -					1000U, 100U); +				(hw_atl_utils_mpi_read_mbox(self, &mbox), +				 mbox.transaction_id), +			       1000U, 100U);  		if (err < 0)  			goto err_exit;  	} @@ -351,8 +357,7 @@ int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self)  			break;  		default: -			link_status->mbps = 0U; -			break; +			return -EBUSY;  		}  	} @@ -493,16 +498,51 @@ int hw_atl_utils_hw_set_power(struct aq_hw_s *self,  	return 0;  } +int hw_atl_utils_update_stats(struct aq_hw_s *self) +{ +	struct hw_atl_s *hw_self = PHAL_ATLANTIC; +	struct hw_aq_atl_utils_mbox mbox; + +	if (!self->aq_link_status.mbps) +		return 0; + +	hw_atl_utils_mpi_read_stats(self, &mbox); + +#define AQ_SDELTA(_N_) (hw_self->curr_stats._N_ += \ +			mbox.stats._N_ - hw_self->last_stats._N_) + +	AQ_SDELTA(uprc); +	AQ_SDELTA(mprc); +	AQ_SDELTA(bprc); +	AQ_SDELTA(erpt); + +	AQ_SDELTA(uptc); +	AQ_SDELTA(mptc); +	AQ_SDELTA(bptc); +	AQ_SDELTA(erpr); + +	AQ_SDELTA(ubrc); +	AQ_SDELTA(ubtc); +	AQ_SDELTA(mbrc); +	AQ_SDELTA(mbtc); +	AQ_SDELTA(bbrc); +	AQ_SDELTA(bbtc); +	AQ_SDELTA(dpc); + +#undef AQ_SDELTA + +	memcpy(&hw_self->last_stats, &mbox.stats, sizeof(mbox.stats)); + +	return 0; +} +  int hw_atl_utils_get_hw_stats(struct aq_hw_s *self,  			      u64 *data, unsigned int *p_count)  { -	struct hw_atl_stats_s *stats = NULL; +	struct hw_atl_s *hw_self = PHAL_ATLANTIC; +	struct hw_atl_stats_s *stats = &hw_self->curr_stats;  	int i = 0; -	hw_atl_utils_mpi_read_stats(self, &PHAL_ATLANTIC->mbox); - -	stats = &PHAL_ATLANTIC->mbox.stats; -  	data[i] = stats->uprc + stats->mprc + stats->bprc;  	data[++i] = stats->uprc;  	data[++i] = stats->mprc; diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h index e0360a6b2202..c99cc690e425 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h @@ -115,19 +115,22 @@ struct __packed hw_aq_atl_utils_fw_rpc {  	};  }; -struct __packed hw_aq_atl_utils_mbox { +struct __packed hw_aq_atl_utils_mbox_header {  	u32 version;  	u32 transaction_id; -	int error; +	u32 error; +}; + +struct __packed hw_aq_atl_utils_mbox { +	struct hw_aq_atl_utils_mbox_header header;  	struct hw_atl_stats_s stats;  };  struct __packed hw_atl_s {  	struct aq_hw_s base; -	struct hw_aq_atl_utils_mbox mbox; +	struct hw_atl_stats_s last_stats; +	struct hw_atl_stats_s curr_stats;  	u64 speed; -	u32 itr_tx; -	u32 itr_rx;  	unsigned int chip_features;  	u32 fw_ver_actual;  	atomic_t dpc; @@ -170,6 +173,9 @@ enum hal_atl_utils_fw_state_e {  void hw_atl_utils_hw_chip_features_init(struct aq_hw_s *self, u32 *p); +int hw_atl_utils_mpi_read_mbox(struct aq_hw_s *self, +			       struct hw_aq_atl_utils_mbox_header *pmbox); +  void hw_atl_utils_mpi_read_stats(struct aq_hw_s *self,  				 struct hw_aq_atl_utils_mbox *pmbox); @@ -199,6 +205,8 @@ int hw_atl_utils_hw_deinit(struct aq_hw_s *self);  int hw_atl_utils_get_fw_version(struct aq_hw_s *self, u32 *fw_version); +int hw_atl_utils_update_stats(struct aq_hw_s *self); +  int hw_atl_utils_get_hw_stats(struct aq_hw_s *self,  			      u64 *data,  			      unsigned int *p_count); diff --git a/drivers/net/ethernet/arc/emac.h b/drivers/net/ethernet/arc/emac.h index e4feb712d4f2..3c63b16d485f 100644 --- a/drivers/net/ethernet/arc/emac.h +++ b/drivers/net/ethernet/arc/emac.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Copyright (C) 2004-2013 Synopsys, Inc. (www.synopsys.com)   * diff --git a/drivers/net/ethernet/arc/emac_mdio.c b/drivers/net/ethernet/arc/emac_mdio.c index a22403c688c9..0187dbf3b87d 100644 --- a/drivers/net/ethernet/arc/emac_mdio.c +++ b/drivers/net/ethernet/arc/emac_mdio.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Copyright (C) 2004-2013 Synopsys, Inc. (www.synopsys.com)   * diff --git a/drivers/net/ethernet/atheros/Makefile b/drivers/net/ethernet/atheros/Makefile index 5cf1c65bbce9..aa3d394b87e6 100644 --- a/drivers/net/ethernet/atheros/Makefile +++ b/drivers/net/ethernet/atheros/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Atheros network device drivers.  # diff --git a/drivers/net/ethernet/aurora/nb8800.h b/drivers/net/ethernet/aurora/nb8800.h index 6ec4a956e1e5..aacc3cce2cc0 100644 --- a/drivers/net/ethernet/aurora/nb8800.h +++ b/drivers/net/ethernet/aurora/nb8800.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _NB8800_H_  #define _NB8800_H_ diff --git a/drivers/net/ethernet/broadcom/Makefile b/drivers/net/ethernet/broadcom/Makefile index 79f2372c66ec..7046ad6d3d0e 100644 --- a/drivers/net/ethernet/broadcom/Makefile +++ b/drivers/net/ethernet/broadcom/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Broadcom network device drivers.  # diff --git a/drivers/net/ethernet/broadcom/b44.h b/drivers/net/ethernet/broadcom/b44.h index 89d2cf341163..b3e36ca0fd19 100644 --- a/drivers/net/ethernet/broadcom/b44.h +++ b/drivers/net/ethernet/broadcom/b44.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _B44_H  #define _B44_H diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.h b/drivers/net/ethernet/broadcom/bcm63xx_enet.h index 0a1b7b2e55bd..c6f6f14e87ca 100644 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.h +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef BCM63XX_ENET_H_  #define BCM63XX_ENET_H_ diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index c3c53f6cd9e6..eb441e5e2cd8 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c @@ -432,6 +432,27 @@ static void bcm_sysport_update_mib_counters(struct bcm_sysport_priv *priv)  	netif_dbg(priv, hw, priv->netdev, "updated MIB counters\n");  } +static void bcm_sysport_update_tx_stats(struct bcm_sysport_priv *priv, +					u64 *tx_bytes, u64 *tx_packets) +{ +	struct bcm_sysport_tx_ring *ring; +	u64 bytes = 0, packets = 0; +	unsigned int start; +	unsigned int q; + +	for (q = 0; q < priv->netdev->num_tx_queues; q++) { +		ring = &priv->tx_rings[q]; +		do { +			start = u64_stats_fetch_begin_irq(&priv->syncp); +			bytes = ring->bytes; +			packets = ring->packets; +		} while (u64_stats_fetch_retry_irq(&priv->syncp, start)); + +		*tx_bytes += bytes; +		*tx_packets += packets; +	} +} +  static void bcm_sysport_get_stats(struct net_device *dev,  				  struct ethtool_stats *stats, u64 *data)  { @@ -439,11 +460,16 @@ static void bcm_sysport_get_stats(struct net_device *dev,  	struct bcm_sysport_stats64 *stats64 = &priv->stats64;  	struct u64_stats_sync *syncp = &priv->syncp;  	struct bcm_sysport_tx_ring *ring; +	u64 tx_bytes = 0, tx_packets = 0;  	unsigned int start;  	int i, j; -	if (netif_running(dev)) +	if (netif_running(dev)) {  		bcm_sysport_update_mib_counters(priv); +		bcm_sysport_update_tx_stats(priv, &tx_bytes, &tx_packets); +		stats64->tx_bytes = tx_bytes; +		stats64->tx_packets = tx_packets; +	}  	for (i =  0, j = 0; i < BCM_SYSPORT_STATS_LEN; i++) {  		const struct bcm_sysport_stats *s; @@ -461,12 +487,13 @@ static void bcm_sysport_get_stats(struct net_device *dev,  			continue;  		p += s->stat_offset; -		if (s->stat_sizeof == sizeof(u64)) +		if (s->stat_sizeof == sizeof(u64) && +		    s->type == BCM_SYSPORT_STAT_NETDEV64) {  			do {  				start = u64_stats_fetch_begin_irq(syncp);  				data[i] = *(u64 *)p;  			} while (u64_stats_fetch_retry_irq(syncp, start)); -		else +		} else  			data[i] = *(u32 *)p;  		j++;  	} @@ -1716,27 +1743,12 @@ static void bcm_sysport_get_stats64(struct net_device *dev,  {  	struct bcm_sysport_priv *priv = netdev_priv(dev);  	struct bcm_sysport_stats64 *stats64 = &priv->stats64; -	struct bcm_sysport_tx_ring *ring; -	u64 tx_packets = 0, tx_bytes = 0;  	unsigned int start; -	unsigned int q;  	netdev_stats_to_stats64(stats, &dev->stats); -	for (q = 0; q < dev->num_tx_queues; q++) { -		ring = &priv->tx_rings[q]; -		do { -			start = u64_stats_fetch_begin_irq(&priv->syncp); -			tx_bytes = ring->bytes; -			tx_packets = ring->packets; -		} while (u64_stats_fetch_retry_irq(&priv->syncp, start)); - -		stats->tx_bytes += tx_bytes; -		stats->tx_packets += tx_packets; -	} - -	stats64->tx_bytes = stats->tx_bytes; -	stats64->tx_packets = stats->tx_packets; +	bcm_sysport_update_tx_stats(priv, &stats->tx_bytes, +				    &stats->tx_packets);  	do {  		start = u64_stats_fetch_begin_irq(&priv->syncp); @@ -1797,15 +1809,17 @@ static inline void bcm_sysport_mask_all_intrs(struct bcm_sysport_priv *priv)  static inline void gib_set_pad_extension(struct bcm_sysport_priv *priv)  { -	u32 __maybe_unused reg; +	u32 reg; -	/* Include Broadcom tag in pad extension */ +	reg = gib_readl(priv, GIB_CONTROL); +	/* Include Broadcom tag in pad extension and fix up IPG_LENGTH */  	if (netdev_uses_dsa(priv->netdev)) { -		reg = gib_readl(priv, GIB_CONTROL);  		reg &= ~(GIB_PAD_EXTENSION_MASK << GIB_PAD_EXTENSION_SHIFT);  		reg |= ENET_BRCM_TAG_LEN << GIB_PAD_EXTENSION_SHIFT; -		gib_writel(priv, reg, GIB_CONTROL);  	} +	reg &= ~(GIB_IPG_LEN_MASK << GIB_IPG_LEN_SHIFT); +	reg |= 12 << GIB_IPG_LEN_SHIFT; +	gib_writel(priv, reg, GIB_CONTROL);  }  static int bcm_sysport_open(struct net_device *dev) diff --git a/drivers/net/ethernet/broadcom/bgmac.h b/drivers/net/ethernet/broadcom/bgmac.h index 443d57b10264..4040d846da8e 100644 --- a/drivers/net/ethernet/broadcom/bgmac.h +++ b/drivers/net/ethernet/broadcom/bgmac.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _BGMAC_H  #define _BGMAC_H diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index aacec8bc19d5..dc5de275352a 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -214,6 +214,8 @@ static const u16 bnxt_async_events_arr[] = {  	ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE,  }; +static struct workqueue_struct *bnxt_pf_wq; +  static bool bnxt_vf_pciid(enum board_idx idx)  {  	return (idx == NETXTREME_C_VF || idx == NETXTREME_E_VF); @@ -1024,12 +1026,28 @@ static int bnxt_discard_rx(struct bnxt *bp, struct bnxt_napi *bnapi,  	return 0;  } +static void bnxt_queue_sp_work(struct bnxt *bp) +{ +	if (BNXT_PF(bp)) +		queue_work(bnxt_pf_wq, &bp->sp_task); +	else +		schedule_work(&bp->sp_task); +} + +static void bnxt_cancel_sp_work(struct bnxt *bp) +{ +	if (BNXT_PF(bp)) +		flush_workqueue(bnxt_pf_wq); +	else +		cancel_work_sync(&bp->sp_task); +} +  static void bnxt_sched_reset(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)  {  	if (!rxr->bnapi->in_reset) {  		rxr->bnapi->in_reset = true;  		set_bit(BNXT_RESET_TASK_SP_EVENT, &bp->sp_event); -		schedule_work(&bp->sp_task); +		bnxt_queue_sp_work(bp);  	}  	rxr->rx_next_cons = 0xffff;  } @@ -1717,7 +1735,7 @@ static int bnxt_async_event_process(struct bnxt *bp,  	default:  		goto async_event_process_exit;  	} -	schedule_work(&bp->sp_task); +	bnxt_queue_sp_work(bp);  async_event_process_exit:  	bnxt_ulp_async_events(bp, cmpl);  	return 0; @@ -1751,7 +1769,7 @@ static int bnxt_hwrm_handler(struct bnxt *bp, struct tx_cmp *txcmp)  		set_bit(vf_id - bp->pf.first_vf_id, bp->pf.vf_event_bmap);  		set_bit(BNXT_HWRM_EXEC_FWD_REQ_SP_EVENT, &bp->sp_event); -		schedule_work(&bp->sp_task); +		bnxt_queue_sp_work(bp);  		break;  	case CMPL_BASE_TYPE_HWRM_ASYNC_EVENT: @@ -3448,6 +3466,12 @@ int _hwrm_send_message(struct bnxt *bp, void *msg, u32 msg_len, int timeout)  	return bnxt_hwrm_do_send_msg(bp, msg, msg_len, timeout, false);  } +int _hwrm_send_message_silent(struct bnxt *bp, void *msg, u32 msg_len, +			      int timeout) +{ +	return bnxt_hwrm_do_send_msg(bp, msg, msg_len, timeout, true); +} +  int hwrm_send_message(struct bnxt *bp, void *msg, u32 msg_len, int timeout)  {  	int rc; @@ -6327,7 +6351,9 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)  	}  	if (link_re_init) { +		mutex_lock(&bp->link_lock);  		rc = bnxt_update_phy_setting(bp); +		mutex_unlock(&bp->link_lock);  		if (rc)  			netdev_warn(bp->dev, "failed to update phy settings\n");  	} @@ -6647,7 +6673,7 @@ static void bnxt_set_rx_mode(struct net_device *dev)  		vnic->rx_mask = mask;  		set_bit(BNXT_RX_MASK_SP_EVENT, &bp->sp_event); -		schedule_work(&bp->sp_task); +		bnxt_queue_sp_work(bp);  	}  } @@ -6920,7 +6946,7 @@ static void bnxt_tx_timeout(struct net_device *dev)  	netdev_err(bp->dev,  "TX timeout detected, starting reset task!\n");  	set_bit(BNXT_RESET_TASK_SP_EVENT, &bp->sp_event); -	schedule_work(&bp->sp_task); +	bnxt_queue_sp_work(bp);  }  #ifdef CONFIG_NET_POLL_CONTROLLER @@ -6952,7 +6978,7 @@ static void bnxt_timer(unsigned long data)  	if (bp->link_info.link_up && (bp->flags & BNXT_FLAG_PORT_STATS) &&  	    bp->stats_coal_ticks) {  		set_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event); -		schedule_work(&bp->sp_task); +		bnxt_queue_sp_work(bp);  	}  bnxt_restart_timer:  	mod_timer(&bp->timer, jiffies + bp->current_interval); @@ -7025,30 +7051,28 @@ static void bnxt_sp_task(struct work_struct *work)  	if (test_and_clear_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event))  		bnxt_hwrm_port_qstats(bp); -	/* These functions below will clear BNXT_STATE_IN_SP_TASK.  They -	 * must be the last functions to be called before exiting. -	 */  	if (test_and_clear_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event)) { -		int rc = 0; +		int rc; +		mutex_lock(&bp->link_lock);  		if (test_and_clear_bit(BNXT_LINK_SPEED_CHNG_SP_EVENT,  				       &bp->sp_event))  			bnxt_hwrm_phy_qcaps(bp); -		bnxt_rtnl_lock_sp(bp); -		if (test_bit(BNXT_STATE_OPEN, &bp->state)) -			rc = bnxt_update_link(bp, true); -		bnxt_rtnl_unlock_sp(bp); +		rc = bnxt_update_link(bp, true); +		mutex_unlock(&bp->link_lock);  		if (rc)  			netdev_err(bp->dev, "SP task can't update link (rc: %x)\n",  				   rc);  	}  	if (test_and_clear_bit(BNXT_HWRM_PORT_MODULE_SP_EVENT, &bp->sp_event)) { -		bnxt_rtnl_lock_sp(bp); -		if (test_bit(BNXT_STATE_OPEN, &bp->state)) -			bnxt_get_port_module_status(bp); -		bnxt_rtnl_unlock_sp(bp); +		mutex_lock(&bp->link_lock); +		bnxt_get_port_module_status(bp); +		mutex_unlock(&bp->link_lock);  	} +	/* These functions below will clear BNXT_STATE_IN_SP_TASK.  They +	 * must be the last functions to be called before exiting. +	 */  	if (test_and_clear_bit(BNXT_RESET_TASK_SP_EVENT, &bp->sp_event))  		bnxt_reset(bp, false); @@ -7433,7 +7457,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,  	spin_unlock_bh(&bp->ntp_fltr_lock);  	set_bit(BNXT_RX_NTP_FLTR_SP_EVENT, &bp->sp_event); -	schedule_work(&bp->sp_task); +	bnxt_queue_sp_work(bp);  	return new_fltr->sw_id; @@ -7516,7 +7540,7 @@ static void bnxt_udp_tunnel_add(struct net_device *dev,  		if (bp->vxlan_port_cnt == 1) {  			bp->vxlan_port = ti->port;  			set_bit(BNXT_VXLAN_ADD_PORT_SP_EVENT, &bp->sp_event); -			schedule_work(&bp->sp_task); +			bnxt_queue_sp_work(bp);  		}  		break;  	case UDP_TUNNEL_TYPE_GENEVE: @@ -7533,7 +7557,7 @@ static void bnxt_udp_tunnel_add(struct net_device *dev,  		return;  	} -	schedule_work(&bp->sp_task); +	bnxt_queue_sp_work(bp);  }  static void bnxt_udp_tunnel_del(struct net_device *dev, @@ -7572,7 +7596,7 @@ static void bnxt_udp_tunnel_del(struct net_device *dev,  		return;  	} -	schedule_work(&bp->sp_task); +	bnxt_queue_sp_work(bp);  }  static int bnxt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, @@ -7720,7 +7744,7 @@ static void bnxt_remove_one(struct pci_dev *pdev)  	pci_disable_pcie_error_reporting(pdev);  	unregister_netdev(dev);  	bnxt_shutdown_tc(bp); -	cancel_work_sync(&bp->sp_task); +	bnxt_cancel_sp_work(bp);  	bp->sp_event = 0;  	bnxt_clear_int_mode(bp); @@ -7748,6 +7772,7 @@ static int bnxt_probe_phy(struct bnxt *bp)  			   rc);  		return rc;  	} +	mutex_init(&bp->link_lock);  	rc = bnxt_update_link(bp, false);  	if (rc) { @@ -7946,7 +7971,7 @@ static void bnxt_parse_log_pcie_link(struct bnxt *bp)  	enum pcie_link_width width = PCIE_LNK_WIDTH_UNKNOWN;  	enum pci_bus_speed speed = PCI_SPEED_UNKNOWN; -	if (pcie_get_minimum_link(bp->pdev, &speed, &width) || +	if (pcie_get_minimum_link(pci_physfn(bp->pdev), &speed, &width) ||  	    speed == PCI_SPEED_UNKNOWN || width == PCIE_LNK_WIDTH_UNKNOWN)  		netdev_info(bp->dev, "Failed to determine PCIe Link Info\n");  	else @@ -8138,8 +8163,17 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	else  		device_set_wakeup_capable(&pdev->dev, false); -	if (BNXT_PF(bp)) +	if (BNXT_PF(bp)) { +		if (!bnxt_pf_wq) { +			bnxt_pf_wq = +				create_singlethread_workqueue("bnxt_pf_wq"); +			if (!bnxt_pf_wq) { +				dev_err(&pdev->dev, "Unable to create workqueue.\n"); +				goto init_err_pci_clean; +			} +		}  		bnxt_init_tc(bp); +	}  	rc = register_netdev(dev);  	if (rc) @@ -8375,4 +8409,17 @@ static struct pci_driver bnxt_pci_driver = {  #endif  }; -module_pci_driver(bnxt_pci_driver); +static int __init bnxt_init(void) +{ +	return pci_register_driver(&bnxt_pci_driver); +} + +static void __exit bnxt_exit(void) +{ +	pci_unregister_driver(&bnxt_pci_driver); +	if (bnxt_pf_wq) +		destroy_workqueue(bnxt_pf_wq); +} + +module_init(bnxt_init); +module_exit(bnxt_exit); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 7b888d4b2b55..c911e69ff25f 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -1290,6 +1290,10 @@ struct bnxt {  	unsigned long		*ntp_fltr_bmap;  	int			ntp_fltr_count; +	/* To protect link related settings during link changes and +	 * ethtool settings changes. +	 */ +	struct mutex		link_lock;  	struct bnxt_link_info	link_info;  	struct ethtool_eee	eee;  	u32			lpi_tmr_lo; @@ -1358,6 +1362,7 @@ void bnxt_set_ring_params(struct bnxt *);  int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode);  void bnxt_hwrm_cmd_hdr_init(struct bnxt *, void *, u16, u16, u16);  int _hwrm_send_message(struct bnxt *, void *, u32, int); +int _hwrm_send_message_silent(struct bnxt *bp, void *msg, u32 len, int timeout);  int hwrm_send_message(struct bnxt *, void *, u32, int);  int hwrm_send_message_silent(struct bnxt *, void *, u32, int);  int bnxt_hwrm_func_rgtr_async_events(struct bnxt *bp, unsigned long *bmap, diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c index aa1f3a2c7a78..fed37cd9ae1d 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c @@ -50,7 +50,9 @@ static int bnxt_hwrm_queue_pri2cos_qcfg(struct bnxt *bp, struct ieee_ets *ets)  	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_QUEUE_PRI2COS_QCFG, -1, -1);  	req.flags = cpu_to_le32(QUEUE_PRI2COS_QCFG_REQ_FLAGS_IVLAN); -	rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + +	mutex_lock(&bp->hwrm_cmd_lock); +	rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);  	if (!rc) {  		u8 *pri2cos = &resp->pri0_cos_queue_id;  		int i, j; @@ -66,6 +68,7 @@ static int bnxt_hwrm_queue_pri2cos_qcfg(struct bnxt *bp, struct ieee_ets *ets)  			}  		}  	} +	mutex_unlock(&bp->hwrm_cmd_lock);  	return rc;  } @@ -119,9 +122,13 @@ static int bnxt_hwrm_queue_cos2bw_qcfg(struct bnxt *bp, struct ieee_ets *ets)  	int rc, i;  	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_QUEUE_COS2BW_QCFG, -1, -1); -	rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); -	if (rc) + +	mutex_lock(&bp->hwrm_cmd_lock); +	rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +	if (rc) { +		mutex_unlock(&bp->hwrm_cmd_lock);  		return rc; +	}  	data = &resp->queue_id0 + offsetof(struct bnxt_cos2bw_cfg, queue_id);  	for (i = 0; i < bp->max_tc; i++, data += sizeof(cos2bw) - 4) { @@ -143,6 +150,7 @@ static int bnxt_hwrm_queue_cos2bw_qcfg(struct bnxt *bp, struct ieee_ets *ets)  			}  		}  	} +	mutex_unlock(&bp->hwrm_cmd_lock);  	return 0;  } @@ -240,12 +248,17 @@ static int bnxt_hwrm_queue_pfc_qcfg(struct bnxt *bp, struct ieee_pfc *pfc)  	int rc;  	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_QUEUE_PFCENABLE_QCFG, -1, -1); -	rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); -	if (rc) + +	mutex_lock(&bp->hwrm_cmd_lock); +	rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +	if (rc) { +		mutex_unlock(&bp->hwrm_cmd_lock);  		return rc; +	}  	pri_mask = le32_to_cpu(resp->flags);  	pfc->pfc_en = pri_mask; +	mutex_unlock(&bp->hwrm_cmd_lock);  	return 0;  } diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index 8eff05a3e0e4..3cbe771b3352 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -1052,6 +1052,7 @@ static int bnxt_get_link_ksettings(struct net_device *dev,  	u32 ethtool_speed;  	ethtool_link_ksettings_zero_link_mode(lk_ksettings, supported); +	mutex_lock(&bp->link_lock);  	bnxt_fw_to_ethtool_support_spds(link_info, lk_ksettings);  	ethtool_link_ksettings_zero_link_mode(lk_ksettings, advertising); @@ -1099,6 +1100,7 @@ static int bnxt_get_link_ksettings(struct net_device *dev,  			base->port = PORT_FIBRE;  	}  	base->phy_address = link_info->phy_addr; +	mutex_unlock(&bp->link_lock);  	return 0;  } @@ -1190,6 +1192,7 @@ static int bnxt_set_link_ksettings(struct net_device *dev,  	if (!BNXT_SINGLE_PF(bp))  		return -EOPNOTSUPP; +	mutex_lock(&bp->link_lock);  	if (base->autoneg == AUTONEG_ENABLE) {  		BNXT_ETHTOOL_TO_FW_SPDS(fw_advertising, lk_ksettings,  					advertising); @@ -1234,6 +1237,7 @@ static int bnxt_set_link_ksettings(struct net_device *dev,  		rc = bnxt_hwrm_set_link_setting(bp, set_pause, false);  set_setting_exit: +	mutex_unlock(&bp->link_lock);  	return rc;  } @@ -1805,7 +1809,8 @@ static int bnxt_find_nvram_item(struct net_device *dev, u16 type, u16 ordinal,  	req.dir_ordinal = cpu_to_le16(ordinal);  	req.dir_ext = cpu_to_le16(ext);  	req.opt_ordinal = NVM_FIND_DIR_ENTRY_REQ_OPT_ORDINAL_EQ; -	rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +	mutex_lock(&bp->hwrm_cmd_lock); +	rc = _hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);  	if (rc == 0) {  		if (index)  			*index = le16_to_cpu(output->dir_idx); @@ -1814,6 +1819,7 @@ static int bnxt_find_nvram_item(struct net_device *dev, u16 type, u16 ordinal,  		if (data_length)  			*data_length = le32_to_cpu(output->dir_data_length);  	} +	mutex_unlock(&bp->hwrm_cmd_lock);  	return rc;  } diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c index d37925a8a65b..5ee18660bc33 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c @@ -502,6 +502,7 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs)  	int rc = 0, vfs_supported;  	int min_rx_rings, min_tx_rings, min_rss_ctxs;  	int tx_ok = 0, rx_ok = 0, rss_ok = 0; +	int avail_cp, avail_stat;  	/* Check if we can enable requested num of vf's. At a mininum  	 * we require 1 RX 1 TX rings for each VF. In this minimum conf @@ -509,6 +510,10 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs)  	 */  	vfs_supported = *num_vfs; +	avail_cp = bp->pf.max_cp_rings - bp->cp_nr_rings; +	avail_stat = bp->pf.max_stat_ctxs - bp->num_stat_ctxs; +	avail_cp = min_t(int, avail_cp, avail_stat); +  	while (vfs_supported) {  		min_rx_rings = vfs_supported;  		min_tx_rings = vfs_supported; @@ -523,10 +528,12 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs)  			    min_rx_rings)  				rx_ok = 1;  		} -		if (bp->pf.max_vnics - bp->nr_vnics < min_rx_rings) +		if (bp->pf.max_vnics - bp->nr_vnics < min_rx_rings || +		    avail_cp < min_rx_rings)  			rx_ok = 0; -		if (bp->pf.max_tx_rings - bp->tx_nr_rings >= min_tx_rings) +		if (bp->pf.max_tx_rings - bp->tx_nr_rings >= min_tx_rings && +		    avail_cp >= min_tx_rings)  			tx_ok = 1;  		if (bp->pf.max_rsscos_ctxs - bp->rsscos_nr_ctxs >= min_rss_ctxs) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c index ccd699fb2d70..7dd3d131043a 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c @@ -750,6 +750,10 @@ int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,  {  	int rc = 0; +	if (!is_classid_clsact_ingress(cls_flower->common.classid) || +	    cls_flower->common.chain_index) +		return -EOPNOTSUPP; +  	switch (cls_flower->command) {  	case TC_CLSFLOWER_REPLACE:  		rc = bnxt_tc_add_flow(bp, src_fid, cls_flower); diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c index cec94bbb2ea5..8bc126a156e8 100644 --- a/drivers/net/ethernet/broadcom/cnic.c +++ b/drivers/net/ethernet/broadcom/cnic.c @@ -1278,7 +1278,7 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)  	ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0);  	if (ret) -		return -ENOMEM; +		goto error;  	n = CNIC_PAGE_SIZE / CNIC_KWQ16_DATA_SIZE;  	for (i = 0, j = 0; i < cp->max_cid_space; i++) { diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index 3b5e98ecba00..c2d02d02d1e6 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Id: tg3.h,v 1.37.2.32 2002/03/11 12:18:18 davem Exp $   * tg3.h: Definitions for Broadcom Tigon3 ethernet driver.   * diff --git a/drivers/net/ethernet/cadence/Makefile b/drivers/net/ethernet/cadence/Makefile index 1d66ddb68969..1f33cdca9a3c 100644 --- a/drivers/net/ethernet/cadence/Makefile +++ b/drivers/net/ethernet/cadence/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Atmel network device drivers.  # diff --git a/drivers/net/ethernet/cavium/liquidio/Makefile b/drivers/net/ethernet/cavium/liquidio/Makefile index c4d411d1aa28..b802896bb2e0 100644 --- a/drivers/net/ethernet/cavium/liquidio/Makefile +++ b/drivers/net/ethernet/cavium/liquidio/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Cavium Liquidio ethernet device driver  # diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c index e7f54948173f..5b19826a7e16 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -1847,7 +1847,7 @@ static int liquidio_ptp_settime(struct ptp_clock_info *ptp,  	struct lio *lio = container_of(ptp, struct lio, ptp_info);  	struct octeon_device *oct = (struct octeon_device *)lio->oct_dev; -	ns = timespec_to_ns(ts); +	ns = timespec64_to_ns(ts);  	spin_lock_irqsave(&lio->ptp_lock, flags);  	lio_pci_writeq(oct, ns, CN6XXX_MIO_PTP_CLOCK_HI); diff --git a/drivers/net/ethernet/cavium/thunder/Makefile b/drivers/net/ethernet/cavium/thunder/Makefile index 6b4d4add7353..2fc6142d1634 100644 --- a/drivers/net/ethernet/cavium/thunder/Makefile +++ b/drivers/net/ethernet/cavium/thunder/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for Cavium's Thunder ethernet device  # diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c index 49b80da51ba7..805ab45e9b5a 100644 --- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c +++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c @@ -565,8 +565,10 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct bpf_prog *prog,  		return true;  	default:  		bpf_warn_invalid_xdp_action(action); +		/* fall through */  	case XDP_ABORTED:  		trace_xdp_exception(nic->netdev, prog, action); +		/* fall through */  	case XDP_DROP:  		/* Check if it's a recycled page, if not  		 * unmap the DMA mapping. diff --git a/drivers/net/ethernet/chelsio/Makefile b/drivers/net/ethernet/chelsio/Makefile index b6a5eec6ed8e..c0f978d2e8a7 100644 --- a/drivers/net/ethernet/chelsio/Makefile +++ b/drivers/net/ethernet/chelsio/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Chelsio network device drivers.  # diff --git a/drivers/net/ethernet/chelsio/cxgb/fpga_defs.h b/drivers/net/ethernet/chelsio/cxgb/fpga_defs.h index ccdb2bc9ae98..e9c65d812c4e 100644 --- a/drivers/net/ethernet/chelsio/cxgb/fpga_defs.h +++ b/drivers/net/ethernet/chelsio/cxgb/fpga_defs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Date: 2005/03/07 23:59:05 $ $RCSfile: fpga_defs.h,v $ $Revision: 1.4 $ */  /* diff --git a/drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.c b/drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.c index 76ce6e538326..30b003484fc1 100644 --- a/drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.c +++ b/drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* $Date: 2005/10/24 23:18:13 $ $RCSfile: mv88e1xxx.c,v $ $Revision: 1.49 $ */  #include "common.h"  #include "mv88e1xxx.h" diff --git a/drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.h b/drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.h index 967cc4286359..11bf0f7c2f90 100644 --- a/drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.h +++ b/drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Date: 2005/03/07 23:59:05 $ $RCSfile: mv88e1xxx.h,v $ $Revision: 1.13 $ */  #ifndef CHELSIO_MV8E1XXX_H  #define CHELSIO_MV8E1XXX_H diff --git a/drivers/net/ethernet/chelsio/cxgb/my3126.c b/drivers/net/ethernet/chelsio/cxgb/my3126.c index d546f46c8ef7..20c09cc4b323 100644 --- a/drivers/net/ethernet/chelsio/cxgb/my3126.c +++ b/drivers/net/ethernet/chelsio/cxgb/my3126.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* $Date: 2005/11/12 02:13:49 $ $RCSfile: my3126.c,v $ $Revision: 1.15 $ */  #include "cphy.h"  #include "elmer0.h" diff --git a/drivers/net/ethernet/chelsio/cxgb/tp.c b/drivers/net/ethernet/chelsio/cxgb/tp.c index b146acabf982..4337cee0763e 100644 --- a/drivers/net/ethernet/chelsio/cxgb/tp.c +++ b/drivers/net/ethernet/chelsio/cxgb/tp.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* $Date: 2006/02/07 04:21:54 $ $RCSfile: tp.c,v $ $Revision: 1.73 $ */  #include "common.h"  #include "regs.h" diff --git a/drivers/net/ethernet/chelsio/cxgb/tp.h b/drivers/net/ethernet/chelsio/cxgb/tp.h index dfd8ce25106a..ba15675d56df 100644 --- a/drivers/net/ethernet/chelsio/cxgb/tp.h +++ b/drivers/net/ethernet/chelsio/cxgb/tp.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Date: 2005/03/07 23:59:05 $ $RCSfile: tp.h,v $ $Revision: 1.20 $ */  #ifndef CHELSIO_TP_H  #define CHELSIO_TP_H diff --git a/drivers/net/ethernet/chelsio/cxgb/vsc7326.c b/drivers/net/ethernet/chelsio/cxgb/vsc7326.c index bdc895bd2a46..873c1c7b4ca0 100644 --- a/drivers/net/ethernet/chelsio/cxgb/vsc7326.c +++ b/drivers/net/ethernet/chelsio/cxgb/vsc7326.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* $Date: 2006/04/28 19:20:06 $ $RCSfile: vsc7326.c,v $ $Revision: 1.19 $ */  /* Driver for Vitesse VSC7326 (Schaumburg) MAC */ diff --git a/drivers/net/ethernet/chelsio/cxgb/vsc7326_reg.h b/drivers/net/ethernet/chelsio/cxgb/vsc7326_reg.h index 479edbcabe68..04503857c6a9 100644 --- a/drivers/net/ethernet/chelsio/cxgb/vsc7326_reg.h +++ b/drivers/net/ethernet/chelsio/cxgb/vsc7326_reg.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Date: 2006/04/28 19:20:17 $ $RCSfile: vsc7326_reg.h,v $ $Revision: 1.5 $ */  #ifndef _VSC7321_REG_H_  #define _VSC7321_REG_H_ diff --git a/drivers/net/ethernet/chelsio/cxgb3/regs.h b/drivers/net/ethernet/chelsio/cxgb3/regs.h index 81029b872bdd..174eb45100a4 100644 --- a/drivers/net/ethernet/chelsio/cxgb3/regs.h +++ b/drivers/net/ethernet/chelsio/cxgb3/regs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #define A_SG_CONTROL 0x0  #define S_CONGMODE    29 diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge_defs.h b/drivers/net/ethernet/chelsio/cxgb3/sge_defs.h index 29b6c800b238..c31ce8dc95fb 100644 --- a/drivers/net/ethernet/chelsio/cxgb3/sge_defs.h +++ b/drivers/net/ethernet/chelsio/cxgb3/sge_defs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * This file is automatically generated --- any changes will be lost.   */ diff --git a/drivers/net/ethernet/chelsio/cxgb4/Makefile b/drivers/net/ethernet/chelsio/cxgb4/Makefile index 817212702f0a..24143c8abfdb 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/Makefile +++ b/drivers/net/ethernet/chelsio/cxgb4/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Chelsio T4 driver  # diff --git a/drivers/net/ethernet/cisco/enic/enic_clsf.c b/drivers/net/ethernet/cisco/enic/enic_clsf.c index 3c677ed3c29e..8dc21c9f9716 100644 --- a/drivers/net/ethernet/cisco/enic/enic_clsf.c +++ b/drivers/net/ethernet/cisco/enic/enic_clsf.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/if.h>  #include <linux/if_ether.h>  #include <linux/if_link.h> diff --git a/drivers/net/ethernet/cisco/enic/enic_clsf.h b/drivers/net/ethernet/cisco/enic/enic_clsf.h index 6aa9f89d073b..d3c4a1cb0610 100644 --- a/drivers/net/ethernet/cisco/enic/enic_clsf.h +++ b/drivers/net/ethernet/cisco/enic/enic_clsf.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _ENIC_CLSF_H_  #define _ENIC_CLSF_H_ diff --git a/drivers/net/ethernet/davicom/dm9000.h b/drivers/net/ethernet/davicom/dm9000.h index 9ce058adabab..581b35ad44ef 100644 --- a/drivers/net/ethernet/davicom/dm9000.h +++ b/drivers/net/ethernet/davicom/dm9000.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * dm9000 Ethernet   */ diff --git a/drivers/net/ethernet/dec/tulip/Makefile b/drivers/net/ethernet/dec/tulip/Makefile index 5e8be38b45bb..8aab37564d5d 100644 --- a/drivers/net/ethernet/dec/tulip/Makefile +++ b/drivers/net/ethernet/dec/tulip/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Linux "Tulip" family network device drivers.  # diff --git a/drivers/net/ethernet/freescale/Makefile b/drivers/net/ethernet/freescale/Makefile index c46df5c82af5..ed8ad0fefbda 100644 --- a/drivers/net/ethernet/freescale/Makefile +++ b/drivers/net/ethernet/freescale/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Freescale network device drivers.  # diff --git a/drivers/net/ethernet/freescale/dpaa/Makefile b/drivers/net/ethernet/freescale/dpaa/Makefile index 7db50bccb137..4f23e79232fa 100644 --- a/drivers/net/ethernet/freescale/dpaa/Makefile +++ b/drivers/net/ethernet/freescale/dpaa/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Freescale DPAA Ethernet controllers  # diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 38c7b21e5d63..44720f83af27 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /****************************************************************************/  /* @@ -374,8 +375,8 @@ struct bufdesc_ex {  #define FEC_ENET_TS_AVAIL       ((uint)0x00010000)  #define FEC_ENET_TS_TIMER       ((uint)0x00008000) -#define FEC_DEFAULT_IMASK (FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII | FEC_ENET_TS_TIMER) -#define FEC_NAPI_IMASK	(FEC_ENET_MII | FEC_ENET_TS_TIMER) +#define FEC_DEFAULT_IMASK (FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII) +#define FEC_NAPI_IMASK	FEC_ENET_MII  #define FEC_RX_DISABLED_IMASK (FEC_DEFAULT_IMASK & (~FEC_ENET_RXF))  /* ENET interrupt coalescing macro define */ diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 56f56d6ada9c..3dc2d771a222 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1559,14 +1559,14 @@ fec_enet_collect_events(struct fec_enet_private *fep, uint int_events)  	if (int_events == 0)  		return false; -	if (int_events & FEC_ENET_RXF) +	if (int_events & FEC_ENET_RXF_0)  		fep->work_rx |= (1 << 2);  	if (int_events & FEC_ENET_RXF_1)  		fep->work_rx |= (1 << 0);  	if (int_events & FEC_ENET_RXF_2)  		fep->work_rx |= (1 << 1); -	if (int_events & FEC_ENET_TXF) +	if (int_events & FEC_ENET_TXF_0)  		fep->work_tx |= (1 << 2);  	if (int_events & FEC_ENET_TXF_1)  		fep->work_tx |= (1 << 0); @@ -1604,8 +1604,8 @@ fec_enet_interrupt(int irq, void *dev_id)  	}  	if (fep->ptp_clock) -		fec_ptp_check_pps_event(fep); - +		if (fec_ptp_check_pps_event(fep)) +			ret = IRQ_HANDLED;  	return ret;  } diff --git a/drivers/net/ethernet/freescale/fman/Makefile b/drivers/net/ethernet/freescale/fman/Makefile index 2c38119b172c..f83a3653b63b 100644 --- a/drivers/net/ethernet/freescale/fman/Makefile +++ b/drivers/net/ethernet/freescale/fman/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  subdir-ccflags-y +=  -I$(srctree)/drivers/net/ethernet/freescale/fman  obj-$(CONFIG_FSL_FMAN) += fsl_fman.o diff --git a/drivers/net/ethernet/freescale/fs_enet/Makefile b/drivers/net/ethernet/freescale/fs_enet/Makefile index d4a305ee3455..1821f94ef619 100644 --- a/drivers/net/ethernet/freescale/fs_enet/Makefile +++ b/drivers/net/ethernet/freescale/fs_enet/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Freescale Ethernet controllers  # diff --git a/drivers/net/ethernet/freescale/fs_enet/fec.h b/drivers/net/ethernet/freescale/fs_enet/fec.h index b9fe5bde432a..7832db71dcb9 100644 --- a/drivers/net/ethernet/freescale/fs_enet/fec.h +++ b/drivers/net/ethernet/freescale/fs_enet/fec.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef FS_ENET_FEC_H  #define FS_ENET_FEC_H diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet.h b/drivers/net/ethernet/freescale/fs_enet/fs_enet.h index 5ce516c8a62a..168e10ea487f 100644 --- a/drivers/net/ethernet/freescale/fs_enet/fs_enet.h +++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef FS_ENET_H  #define FS_ENET_H diff --git a/drivers/net/ethernet/hisilicon/Makefile b/drivers/net/ethernet/hisilicon/Makefile index 3828c435c18f..7f76d412047a 100644 --- a/drivers/net/ethernet/hisilicon/Makefile +++ b/drivers/net/ethernet/hisilicon/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the HISILICON network device drivers.  # diff --git a/drivers/net/ethernet/hisilicon/hns/Makefile b/drivers/net/ethernet/hisilicon/hns/Makefile index 6010c83e38d8..7aa623b9c82a 100644 --- a/drivers/net/ethernet/hisilicon/hns/Makefile +++ b/drivers/net/ethernet/hisilicon/hns/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the HISILICON network device drivers.  # diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c index 36520634c96a..e77192683dba 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c @@ -2369,8 +2369,8 @@ static int hns_nic_dev_probe(struct platform_device *pdev)  			priv->enet_ver = AE_VERSION_2;  		ae_node = of_parse_phandle(dev->of_node, "ae-handle", 0); -		if (IS_ERR_OR_NULL(ae_node)) { -			ret = PTR_ERR(ae_node); +		if (!ae_node) { +			ret = -ENODEV;  			dev_err(dev, "not find ae-handle\n");  			goto out_read_prop_fail;  		} diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c index 59efbd605416..5bcb2238acb2 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c @@ -37,20 +37,15 @@ static bool hnae3_client_match(enum hnae3_client_type client_type,  }  static int hnae3_match_n_instantiate(struct hnae3_client *client, -				     struct hnae3_ae_dev *ae_dev, -				     bool is_reg, bool *matched) +				     struct hnae3_ae_dev *ae_dev, bool is_reg)  {  	int ret; -	*matched = false; -  	/* check if this client matches the type of ae_dev */  	if (!(hnae3_client_match(client->type, ae_dev->dev_type) &&  	      hnae_get_bit(ae_dev->flag, HNAE3_DEV_INITED_B))) {  		return 0;  	} -	/* there is a match of client and dev */ -	*matched = true;  	/* now, (un-)instantiate client by calling lower layer */  	if (is_reg) { @@ -69,7 +64,6 @@ int hnae3_register_client(struct hnae3_client *client)  {  	struct hnae3_client *client_tmp;  	struct hnae3_ae_dev *ae_dev; -	bool matched;  	int ret = 0;  	mutex_lock(&hnae3_common_lock); @@ -86,7 +80,7 @@ int hnae3_register_client(struct hnae3_client *client)  		/* if the client could not be initialized on current port, for  		 * any error reasons, move on to next available port  		 */ -		ret = hnae3_match_n_instantiate(client, ae_dev, true, &matched); +		ret = hnae3_match_n_instantiate(client, ae_dev, true);  		if (ret)  			dev_err(&ae_dev->pdev->dev,  				"match and instantiation failed for port\n"); @@ -102,12 +96,11 @@ EXPORT_SYMBOL(hnae3_register_client);  void hnae3_unregister_client(struct hnae3_client *client)  {  	struct hnae3_ae_dev *ae_dev; -	bool matched;  	mutex_lock(&hnae3_common_lock);  	/* un-initialize the client on every matched port */  	list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) { -		hnae3_match_n_instantiate(client, ae_dev, false, &matched); +		hnae3_match_n_instantiate(client, ae_dev, false);  	}  	list_del(&client->node); @@ -124,7 +117,6 @@ int hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo)  	const struct pci_device_id *id;  	struct hnae3_ae_dev *ae_dev;  	struct hnae3_client *client; -	bool matched;  	int ret = 0;  	mutex_lock(&hnae3_common_lock); @@ -151,13 +143,10 @@ int hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo)  		 * initialize the figure out client instance  		 */  		list_for_each_entry(client, &hnae3_client_list, node) { -			ret = hnae3_match_n_instantiate(client, ae_dev, true, -							&matched); +			ret = hnae3_match_n_instantiate(client, ae_dev, true);  			if (ret)  				dev_err(&ae_dev->pdev->dev,  					"match and instantiation failed\n"); -			if (matched) -				break;  		}  	} @@ -175,7 +164,6 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo)  	const struct pci_device_id *id;  	struct hnae3_ae_dev *ae_dev;  	struct hnae3_client *client; -	bool matched;  	mutex_lock(&hnae3_common_lock);  	/* Check if there are matched ae_dev */ @@ -187,12 +175,8 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo)  		/* check the client list for the match with this ae_dev type and  		 * un-initialize the figure out client instance  		 */ -		list_for_each_entry(client, &hnae3_client_list, node) { -			hnae3_match_n_instantiate(client, ae_dev, false, -						  &matched); -			if (matched) -				break; -		} +		list_for_each_entry(client, &hnae3_client_list, node) +			hnae3_match_n_instantiate(client, ae_dev, false);  		ae_algo->ops->uninit_ae_dev(ae_dev);  		hnae_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0); @@ -212,7 +196,6 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev)  	const struct pci_device_id *id;  	struct hnae3_ae_algo *ae_algo;  	struct hnae3_client *client; -	bool matched;  	int ret = 0;  	mutex_lock(&hnae3_common_lock); @@ -246,13 +229,10 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev)  	 * initialize the figure out client instance  	 */  	list_for_each_entry(client, &hnae3_client_list, node) { -		ret = hnae3_match_n_instantiate(client, ae_dev, true, -						&matched); +		ret = hnae3_match_n_instantiate(client, ae_dev, true);  		if (ret)  			dev_err(&ae_dev->pdev->dev,  				"match and instantiation failed\n"); -		if (matched) -			break;  	}  out_err: @@ -270,7 +250,6 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev)  	const struct pci_device_id *id;  	struct hnae3_ae_algo *ae_algo;  	struct hnae3_client *client; -	bool matched;  	mutex_lock(&hnae3_common_lock);  	/* Check if there are matched ae_algo */ @@ -279,12 +258,8 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev)  		if (!id)  			continue; -		list_for_each_entry(client, &hnae3_client_list, node) { -			hnae3_match_n_instantiate(client, ae_dev, false, -						  &matched); -			if (matched) -				break; -		} +		list_for_each_entry(client, &hnae3_client_list, node) +			hnae3_match_n_instantiate(client, ae_dev, false);  		ae_algo->ops->uninit_ae_dev(ae_dev);  		hnae_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0); diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h index b2f28ae81273..1a01cadfe5f3 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h @@ -49,7 +49,17 @@  #define HNAE3_CLASS_NAME_SIZE 16  #define HNAE3_DEV_INITED_B			0x0 -#define HNAE_DEV_SUPPORT_ROCE_B			0x1 +#define HNAE3_DEV_SUPPORT_ROCE_B		0x1 +#define HNAE3_DEV_SUPPORT_DCB_B			0x2 + +#define HNAE3_DEV_SUPPORT_ROCE_DCB_BITS (BIT(HNAE3_DEV_SUPPORT_DCB_B) |\ +		BIT(HNAE3_DEV_SUPPORT_ROCE_B)) + +#define hnae3_dev_roce_supported(hdev) \ +	hnae_get_bit(hdev->ae_dev->flag, HNAE3_DEV_SUPPORT_ROCE_B) + +#define hnae3_dev_dcb_supported(hdev) \ +	hnae_get_bit(hdev->ae_dev->flag, HNAE3_DEV_SUPPORT_DCB_B)  #define ring_ptr_move_fw(ring, p) \  	((ring)->p = ((ring)->p + 1) % (ring)->desc_num) @@ -366,12 +376,12 @@ struct hnae3_ae_algo {  struct hnae3_tc_info {  	u16	tqp_offset;	/* TQP offset from base TQP */  	u16	tqp_count;	/* Total TQPs */ -	u8	up;		/* user priority */  	u8	tc;		/* TC index */  	bool	enable;		/* If this TC is enable or not */  };  #define HNAE3_MAX_TC		8 +#define HNAE3_MAX_USER_PRIO	8  struct hnae3_knic_private_info {  	struct net_device *netdev; /* Set by KNIC client when init instance */  	u16 rss_size;		   /* Allocated RSS queues */ @@ -379,6 +389,7 @@ struct hnae3_knic_private_info {  	u16 num_desc;  	u8 num_tc;		   /* Total number of enabled TCs */ +	u8 prio_tc[HNAE3_MAX_USER_PRIO];  /* TC indexed by prio */  	struct hnae3_tc_info tc_info[HNAE3_MAX_TC]; /* Idx of array is HW TC */  	u16 num_tqps;		  /* total number of TQPs in this handle */ diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h index 91ae0135ee50..758cf3948131 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h @@ -238,7 +238,7 @@ struct hclge_tqp_map {  	u8 rsv[18];  }; -#define HCLGE_VECTOR_ELEMENTS_PER_CMD	11 +#define HCLGE_VECTOR_ELEMENTS_PER_CMD	10  enum hclge_int_type {  	HCLGE_INT_TX, @@ -252,8 +252,12 @@ struct hclge_ctrl_vector_chain {  #define HCLGE_INT_TYPE_S	0  #define HCLGE_INT_TYPE_M	0x3  #define HCLGE_TQP_ID_S		2 -#define HCLGE_TQP_ID_M		(0x3fff << HCLGE_TQP_ID_S) +#define HCLGE_TQP_ID_M		(0x7ff << HCLGE_TQP_ID_S) +#define HCLGE_INT_GL_IDX_S	13 +#define HCLGE_INT_GL_IDX_M	(0x3 << HCLGE_INT_GL_IDX_S)  	__le16 tqp_type_and_id[HCLGE_VECTOR_ELEMENTS_PER_CMD]; +	u8 vfid; +	u8 rsv;  };  #define HCLGE_TC_NUM		8 @@ -266,7 +270,8 @@ struct hclge_tx_buff_alloc {  struct hclge_rx_priv_buff {  	__le16 buf_num[HCLGE_TC_NUM]; -	u8 rsv[8]; +	__le16 shared_buf; +	u8 rsv[6];  };  struct hclge_query_version { @@ -684,6 +689,7 @@ struct hclge_reset_tqp_queue {  #define HCLGE_DEFAULT_TX_BUF		0x4000	 /* 16k  bytes */  #define HCLGE_TOTAL_PKT_BUF		0x108000 /* 1.03125M bytes */  #define HCLGE_DEFAULT_DV		0xA000	 /* 40k byte */ +#define HCLGE_DEFAULT_NON_DCB_DV	0x7800	/* 30K byte */  #define HCLGE_TYPE_CRQ			0  #define HCLGE_TYPE_CSQ			1 diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index bb45365fb817..c1cdbfd83bdb 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -46,17 +46,7 @@ static const struct pci_device_id ae_algo_pci_tbl[] = {  	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA), 0},  	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), 0},  	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), 0}, -	/* Required last entry */ -	{0, } -}; - -static const struct pci_device_id roce_pci_tbl[] = { -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA_MACSEC), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), 0}, -	/* Required last entry */ +	/* required last entry */  	{0, }  }; @@ -894,7 +884,7 @@ static int hclge_query_pf_resource(struct hclge_dev *hdev)  	hdev->num_tqps = __le16_to_cpu(req->tqp_num);  	hdev->pkt_buf_size = __le16_to_cpu(req->buf_size) << HCLGE_BUF_UNIT_S; -	if (hnae_get_bit(hdev->ae_dev->flag, HNAE_DEV_SUPPORT_ROCE_B)) { +	if (hnae3_dev_roce_supported(hdev)) {  		hdev->num_roce_msix =  		hnae_get_field(__le16_to_cpu(req->pf_intr_vector_number),  			       HCLGE_PF_VEC_NUM_M, HCLGE_PF_VEC_NUM_S); @@ -1063,9 +1053,9 @@ static int hclge_configure(struct hclge_dev *hdev)  	hdev->base_tqp_pid = 0;  	hdev->rss_size_max = 1;  	hdev->rx_buf_len = cfg.rx_buf_len; -	for (i = 0; i < ETH_ALEN; i++) -		hdev->hw.mac.mac_addr[i] = cfg.mac_addr[i]; +	ether_addr_copy(hdev->hw.mac.mac_addr, cfg.mac_addr);  	hdev->hw.mac.media_type = cfg.media_type; +	hdev->hw.mac.phy_addr = cfg.phy_addr;  	hdev->num_desc = cfg.tqp_desc_num;  	hdev->tm_info.num_pg = 1;  	hdev->tm_info.num_tc = cfg.tc_num; @@ -1454,7 +1444,11 @@ static bool  hclge_is_rx_buf_ok(struct hclge_dev *hdev, u32 rx_all)  	tc_num = hclge_get_tc_num(hdev);  	pfc_enable_num = hclge_get_pfc_enalbe_num(hdev); -	shared_buf_min = 2 * hdev->mps + HCLGE_DEFAULT_DV; +	if (hnae3_dev_dcb_supported(hdev)) +		shared_buf_min = 2 * hdev->mps + HCLGE_DEFAULT_DV; +	else +		shared_buf_min = 2 * hdev->mps + HCLGE_DEFAULT_NON_DCB_DV; +  	shared_buf_tc = pfc_enable_num * hdev->mps +  			(tc_num - pfc_enable_num) * hdev->mps / 2 +  			hdev->mps; @@ -1495,6 +1489,16 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)  	struct hclge_priv_buf *priv;  	int i; +	/* When DCB is not supported, rx private +	 * buffer is not allocated. +	 */ +	if (!hnae3_dev_dcb_supported(hdev)) { +		if (!hclge_is_rx_buf_ok(hdev, rx_all)) +			return -ENOMEM; + +		return 0; +	} +  	/* step 1, try to alloc private buffer for all enabled tc */  	for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {  		priv = &hdev->priv_buf[i]; @@ -1510,6 +1514,11 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)  				priv->wl.high = 2 * hdev->mps;  				priv->buf_size = priv->wl.high;  			} +		} else { +			priv->enable = 0; +			priv->wl.low = 0; +			priv->wl.high = 0; +			priv->buf_size = 0;  		}  	} @@ -1522,8 +1531,15 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)  	for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {  		priv = &hdev->priv_buf[i]; -		if (hdev->hw_tc_map & BIT(i)) -			priv->enable = 1; +		priv->enable = 0; +		priv->wl.low = 0; +		priv->wl.high = 0; +		priv->buf_size = 0; + +		if (!(hdev->hw_tc_map & BIT(i))) +			continue; + +		priv->enable = 1;  		if (hdev->tm_info.hw_pfc_map & BIT(i)) {  			priv->wl.low = 128; @@ -1616,6 +1632,10 @@ static int hclge_rx_priv_buf_alloc(struct hclge_dev *hdev)  			cpu_to_le16(true << HCLGE_TC0_PRI_BUF_EN_B);  	} +	req->shared_buf = +		cpu_to_le16((hdev->s_buf.buf_size >> HCLGE_BUF_UNIT_S) | +			    (1 << HCLGE_TC0_PRI_BUF_EN_B)); +  	ret = hclge_cmd_send(&hdev->hw, &desc, 1);  	if (ret) {  		dev_err(&hdev->pdev->dev, @@ -1782,18 +1802,22 @@ int hclge_buffer_alloc(struct hclge_dev *hdev)  		return ret;  	} -	ret = hclge_rx_priv_wl_config(hdev); -	if (ret) { -		dev_err(&hdev->pdev->dev, -			"could not configure rx private waterline %d\n", ret); -		return ret; -	} +	if (hnae3_dev_dcb_supported(hdev)) { +		ret = hclge_rx_priv_wl_config(hdev); +		if (ret) { +			dev_err(&hdev->pdev->dev, +				"could not configure rx private waterline %d\n", +				ret); +			return ret; +		} -	ret = hclge_common_thrd_config(hdev); -	if (ret) { -		dev_err(&hdev->pdev->dev, -			"could not configure common threshold %d\n", ret); -		return ret; +		ret = hclge_common_thrd_config(hdev); +		if (ret) { +			dev_err(&hdev->pdev->dev, +				"could not configure common threshold %d\n", +				ret); +			return ret; +		}  	}  	ret = hclge_common_wl_config(hdev); @@ -2582,6 +2606,7 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)  	u16 tc_valid[HCLGE_MAX_TC_NUM];  	u16 tc_size[HCLGE_MAX_TC_NUM];  	u32 *rss_indir = NULL; +	u16 rss_size = 0, roundup_size;  	const u8 *key;  	int i, ret, j; @@ -2596,7 +2621,13 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)  	for (j = 0; j < hdev->num_vmdq_vport + 1; j++) {  		for (i = 0; i < HCLGE_RSS_IND_TBL_SIZE; i++) {  			vport[j].rss_indirection_tbl[i] = -				i % hdev->rss_size_max; +				i % vport[j].alloc_rss_size; + +			/* vport 0 is for PF */ +			if (j != 0) +				continue; + +			rss_size = vport[j].alloc_rss_size;  			rss_indir[i] = vport[j].rss_indirection_tbl[i];  		}  	} @@ -2613,42 +2644,32 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)  	if (ret)  		goto err; +	/* Each TC have the same queue size, and tc_size set to hardware is +	 * the log2 of roundup power of two of rss_size, the acutal queue +	 * size is limited by indirection table. +	 */ +	if (rss_size > HCLGE_RSS_TC_SIZE_7 || rss_size == 0) { +		dev_err(&hdev->pdev->dev, +			"Configure rss tc size failed, invalid TC_SIZE = %d\n", +			rss_size); +		ret = -EINVAL; +		goto err; +	} + +	roundup_size = roundup_pow_of_two(rss_size); +	roundup_size = ilog2(roundup_size); +  	for (i = 0; i < HCLGE_MAX_TC_NUM; i++) { -		if (hdev->hw_tc_map & BIT(i)) -			tc_valid[i] = 1; -		else -			tc_valid[i] = 0; +		tc_valid[i] = 0; -		switch (hdev->rss_size_max) { -		case HCLGE_RSS_TC_SIZE_0: -			tc_size[i] = 0; -			break; -		case HCLGE_RSS_TC_SIZE_1: -			tc_size[i] = 1; -			break; -		case HCLGE_RSS_TC_SIZE_2: -			tc_size[i] = 2; -			break; -		case HCLGE_RSS_TC_SIZE_3: -			tc_size[i] = 3; -			break; -		case HCLGE_RSS_TC_SIZE_4: -			tc_size[i] = 4; -			break; -		case HCLGE_RSS_TC_SIZE_5: -			tc_size[i] = 5; -			break; -		case HCLGE_RSS_TC_SIZE_6: -			tc_size[i] = 6; -			break; -		case HCLGE_RSS_TC_SIZE_7: -			tc_size[i] = 7; -			break; -		default: -			break; -		} -		tc_offset[i] = hdev->rss_size_max * i; +		if (!(hdev->hw_tc_map & BIT(i))) +			continue; + +		tc_valid[i] = 1; +		tc_size[i] = roundup_size; +		tc_offset[i] = rss_size * i;  	} +  	ret = hclge_set_rss_tc_mode(hdev, tc_valid, tc_size, tc_offset);  err: @@ -2679,7 +2700,11 @@ int hclge_map_vport_ring_to_vector(struct hclge_vport *vport, int vector_id,  			       hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));  		hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M,  			       HCLGE_TQP_ID_S,	node->tqp_index); +		hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_GL_IDX_M, +			       HCLGE_INT_GL_IDX_S, +			       hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));  		req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]); +		req->vfid = vport->vport_id;  		if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) {  			req->int_cause_num = HCLGE_VECTOR_ELEMENTS_PER_CMD; @@ -2763,8 +2788,12 @@ static int hclge_unmap_ring_from_vector(  			       hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));  		hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M,  			       HCLGE_TQP_ID_S,	node->tqp_index); +		hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_GL_IDX_M, +			       HCLGE_INT_GL_IDX_S, +			       hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));  		req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]); +		req->vfid = vport->vport_id;  		if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) {  			req->int_cause_num = HCLGE_VECTOR_ELEMENTS_PER_CMD; @@ -2778,7 +2807,7 @@ static int hclge_unmap_ring_from_vector(  			}  			i = 0;  			hclge_cmd_setup_basic_desc(&desc, -						   HCLGE_OPC_ADD_RING_TO_VECTOR, +						   HCLGE_OPC_DEL_RING_TO_VECTOR,  						   false);  			req->int_vector_id = vector_id;  		} @@ -3665,6 +3694,7 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)  {  #define HCLGE_VLAN_TYPE_VF_TABLE   0  #define HCLGE_VLAN_TYPE_PORT_TABLE 1 +	struct hnae3_handle *handle;  	int ret;  	ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_VLAN_TYPE_VF_TABLE, @@ -3674,8 +3704,11 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)  	ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_VLAN_TYPE_PORT_TABLE,  					 true); +	if (ret) +		return ret; -	return ret; +	handle = &hdev->vport[0].nic; +	return hclge_set_port_vlan_filter(handle, htons(ETH_P_8021Q), 0, false);  }  static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu) @@ -3920,8 +3953,7 @@ static int hclge_init_client_instance(struct hnae3_client *client,  				goto err;  			if (hdev->roce_client && -			    hnae_get_bit(hdev->ae_dev->flag, -					 HNAE_DEV_SUPPORT_ROCE_B)) { +			    hnae3_dev_roce_supported(hdev)) {  				struct hnae3_client *rc = hdev->roce_client;  				ret = hclge_init_roce_base_info(vport); @@ -3944,8 +3976,7 @@ static int hclge_init_client_instance(struct hnae3_client *client,  			break;  		case HNAE3_CLIENT_ROCE: -			if (hnae_get_bit(hdev->ae_dev->flag, -					 HNAE_DEV_SUPPORT_ROCE_B)) { +			if (hnae3_dev_roce_supported(hdev)) {  				hdev->roce_client = client;  				vport->roce.client = client;  			} @@ -4057,7 +4088,6 @@ static void hclge_pci_uninit(struct hclge_dev *hdev)  static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)  {  	struct pci_dev *pdev = ae_dev->pdev; -	const struct pci_device_id *id;  	struct hclge_dev *hdev;  	int ret; @@ -4072,10 +4102,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)  	hdev->ae_dev = ae_dev;  	ae_dev->priv = hdev; -	id = pci_match_id(roce_pci_tbl, ae_dev->pdev); -	if (id) -		hnae_set_bit(ae_dev->flag, HNAE_DEV_SUPPORT_ROCE_B, 1); -  	ret = hclge_pci_init(hdev);  	if (ret) {  		dev_err(&pdev->dev, "PCI init failed\n"); @@ -4138,12 +4164,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)  		return ret;  	} -	ret = hclge_rss_init_hw(hdev); -	if (ret) { -		dev_err(&pdev->dev, "Rss init fail, ret =%d\n", ret); -		return  ret; -	} -  	ret = hclge_init_vlan_config(hdev);  	if (ret) {  		dev_err(&pdev->dev, "VLAN init fail, ret =%d\n", ret); @@ -4156,6 +4176,12 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)  		return ret;  	} +	ret = hclge_rss_init_hw(hdev); +	if (ret) { +		dev_err(&pdev->dev, "Rss init fail, ret =%d\n", ret); +		return ret; +	} +  	setup_timer(&hdev->service_timer, hclge_service_timer,  		    (unsigned long)hdev);  	INIT_WORK(&hdev->service_task, hclge_service_task); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h index edb10ad075eb..9fcfd9395424 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h @@ -176,7 +176,6 @@ struct hclge_pg_info {  struct hclge_tc_info {  	u8 tc_id;  	u8 tc_sch_mode;		/* 0: sp; 1: dwrr */ -	u8 up;  	u8 pgid;  	u32 bw_limit;  }; @@ -197,6 +196,7 @@ struct hclge_tm_info {  	u8 num_tc;  	u8 num_pg;      /* It must be 1 if vNET-Base schd */  	u8 pg_dwrr[HCLGE_PG_NUM]; +	u8 prio_tc[HNAE3_MAX_USER_PRIO];  	struct hclge_pg_info pg_info[HCLGE_PG_NUM];  	struct hclge_tc_info tc_info[HNAE3_MAX_TC];  	enum hclge_fc_mode fc_mode; @@ -477,6 +477,7 @@ struct hclge_vport {  	u8  rss_hash_key[HCLGE_RSS_KEY_SIZE]; /* User configured hash keys */  	/* User configured lookup table entries */  	u8  rss_indirection_tbl[HCLGE_RSS_IND_TBL_SIZE]; +	u16 alloc_rss_size;  	u16 qs_offset;  	u16 bw_limit;		/* VSI BW Limit (0 = disabled) */ diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c index 1c577d268f00..73a75d7cc551 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c @@ -128,9 +128,7 @@ static int hclge_fill_pri_array(struct hclge_dev *hdev, u8 *pri, u8 pri_id)  {  	u8 tc; -	for (tc = 0; tc < hdev->tm_info.num_tc; tc++) -		if (hdev->tm_info.tc_info[tc].up == pri_id) -			break; +	tc = hdev->tm_info.prio_tc[pri_id];  	if (tc >= hdev->tm_info.num_tc)  		return -EINVAL; @@ -158,7 +156,7 @@ static int hclge_up_to_tc_map(struct hclge_dev *hdev)  	hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PRI_TO_TC_MAPPING, false); -	for (pri_id = 0; pri_id < hdev->tm_info.num_tc; pri_id++) { +	for (pri_id = 0; pri_id < HNAE3_MAX_USER_PRIO; pri_id++) {  		ret = hclge_fill_pri_array(hdev, pri, pri_id);  		if (ret)  			return ret; @@ -280,11 +278,11 @@ static int hclge_tm_pg_shapping_cfg(struct hclge_dev *hdev,  	shap_cfg_cmd->pg_id = pg_id; -	hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, IR_B, ir_b); -	hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, IR_U, ir_u); -	hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, IR_S, ir_s); -	hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, BS_B, bs_b); -	hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, BS_S, bs_s); +	hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, IR_B, ir_b); +	hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, IR_U, ir_u); +	hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, IR_S, ir_s); +	hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, BS_B, bs_b); +	hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, BS_S, bs_s);  	return hclge_cmd_send(&hdev->hw, &desc, 1);  } @@ -307,11 +305,11 @@ static int hclge_tm_pri_shapping_cfg(struct hclge_dev *hdev,  	shap_cfg_cmd->pri_id = pri_id; -	hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, IR_B, ir_b); -	hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, IR_U, ir_u); -	hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, IR_S, ir_s); -	hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, BS_B, bs_b); -	hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, BS_S, bs_s); +	hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, IR_B, ir_b); +	hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, IR_U, ir_u); +	hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, IR_S, ir_s); +	hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, BS_B, bs_b); +	hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, BS_S, bs_s);  	return hclge_cmd_send(&hdev->hw, &desc, 1);  } @@ -397,6 +395,7 @@ static void hclge_tm_vport_tc_info_update(struct hclge_vport *vport)  			kinfo->num_tqps / kinfo->num_tc);  	vport->qs_offset = hdev->tm_info.num_tc * vport->vport_id;  	vport->dwrr = 100;  /* 100 percent as init */ +	vport->alloc_rss_size = kinfo->rss_size;  	for (i = 0; i < kinfo->num_tc; i++) {  		if (hdev->hw_tc_map & BIT(i)) { @@ -404,16 +403,17 @@ static void hclge_tm_vport_tc_info_update(struct hclge_vport *vport)  			kinfo->tc_info[i].tqp_offset = i * kinfo->rss_size;  			kinfo->tc_info[i].tqp_count = kinfo->rss_size;  			kinfo->tc_info[i].tc = i; -			kinfo->tc_info[i].up = hdev->tm_info.tc_info[i].up;  		} else {  			/* Set to default queue if TC is disable */  			kinfo->tc_info[i].enable = false;  			kinfo->tc_info[i].tqp_offset = 0;  			kinfo->tc_info[i].tqp_count = 1;  			kinfo->tc_info[i].tc = 0; -			kinfo->tc_info[i].up = 0;  		}  	} + +	memcpy(kinfo->prio_tc, hdev->tm_info.prio_tc, +	       FIELD_SIZEOF(struct hnae3_knic_private_info, prio_tc));  }  static void hclge_tm_vport_info_update(struct hclge_dev *hdev) @@ -435,12 +435,15 @@ static void hclge_tm_tc_info_init(struct hclge_dev *hdev)  	for (i = 0; i < hdev->tm_info.num_tc; i++) {  		hdev->tm_info.tc_info[i].tc_id = i;  		hdev->tm_info.tc_info[i].tc_sch_mode = HCLGE_SCH_MODE_DWRR; -		hdev->tm_info.tc_info[i].up = i;  		hdev->tm_info.tc_info[i].pgid = 0;  		hdev->tm_info.tc_info[i].bw_limit =  			hdev->tm_info.pg_info[0].bw_limit;  	} +	for (i = 0; i < HNAE3_MAX_USER_PRIO; i++) +		hdev->tm_info.prio_tc[i] = +			(i >= hdev->tm_info.num_tc) ? 0 : i; +  	hdev->flag &= ~HCLGE_FLAG_DCB_ENABLE;  } @@ -976,6 +979,10 @@ int hclge_pause_setup_hw(struct hclge_dev *hdev)  	if (ret)  		return ret; +	/* Only DCB-supported dev supports qset back pressure setting */ +	if (!hnae3_dev_dcb_supported(hdev)) +		return 0; +  	for (i = 0; i < hdev->tm_info.num_tc; i++) {  		ret = hclge_tm_qs_bp_cfg(hdev, i);  		if (ret) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h index 7e67337dfaf2..85158b0d73fe 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h @@ -94,10 +94,10 @@ struct hclge_bp_to_qs_map_cmd {  	u32 rsvd1;  }; -#define hclge_tm_set_feild(dest, string, val) \ +#define hclge_tm_set_field(dest, string, val) \  			hnae_set_field((dest), (HCLGE_TM_SHAP_##string##_MSK), \  				       (HCLGE_TM_SHAP_##string##_LSH), val) -#define hclge_tm_get_feild(src, string) \ +#define hclge_tm_get_field(src, string) \  			hnae_get_field((src), (HCLGE_TM_SHAP_##string##_MSK), \  				       (HCLGE_TM_SHAP_##string##_LSH)) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c index 1c3e29447891..35369e1c8036 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c @@ -41,11 +41,16 @@ static struct hnae3_client client;  static const struct pci_device_id hns3_pci_tbl[] = {  	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_GE), 0},  	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA_MACSEC), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), 0}, -	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), 0}, +	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA), +	 HNAE3_DEV_SUPPORT_ROCE_DCB_BITS}, +	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA_MACSEC), +	 HNAE3_DEV_SUPPORT_ROCE_DCB_BITS}, +	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA), +	 HNAE3_DEV_SUPPORT_ROCE_DCB_BITS}, +	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), +	 HNAE3_DEV_SUPPORT_ROCE_DCB_BITS}, +	{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), +	 HNAE3_DEV_SUPPORT_ROCE_DCB_BITS},  	/* required last entry */  	{0, }  }; @@ -1348,6 +1353,7 @@ static int hns3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	}  	ae_dev->pdev = pdev; +	ae_dev->flag = ent->driver_data;  	ae_dev->dev_type = HNAE3_DEV_KNIC;  	pci_set_drvdata(pdev, ae_dev); @@ -2705,10 +2711,11 @@ static void hns3_init_mac_addr(struct net_device *netdev)  		eth_hw_addr_random(netdev);  		dev_warn(priv->dev, "using random MAC address %pM\n",  			 netdev->dev_addr); -		/* Also copy this new MAC address into hdev */ -		if (h->ae_algo->ops->set_mac_addr) -			h->ae_algo->ops->set_mac_addr(h, netdev->dev_addr);  	} + +	if (h->ae_algo->ops->set_mac_addr) +		h->ae_algo->ops->set_mac_addr(h, netdev->dev_addr); +  }  static void hns3_nic_set_priv_ops(struct net_device *netdev) diff --git a/drivers/net/ethernet/i825xx/Makefile b/drivers/net/ethernet/i825xx/Makefile index 8c8dcd29c40d..422a19a5d94f 100644 --- a/drivers/net/ethernet/i825xx/Makefile +++ b/drivers/net/ethernet/i825xx/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Intel 82586/82593/82596 chipset device drivers.  # diff --git a/drivers/net/ethernet/ibm/emac/Makefile b/drivers/net/ethernet/ibm/emac/Makefile index 98768ba0955a..ddf1ce3c8cca 100644 --- a/drivers/net/ethernet/ibm/emac/Makefile +++ b/drivers/net/ethernet/ibm/emac/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the PowerPC 4xx on-chip ethernet driver  # diff --git a/drivers/net/ethernet/ibm/emac/mal.c b/drivers/net/ethernet/ibm/emac/mal.c index 2c74baa2398a..fff09dcf9e34 100644 --- a/drivers/net/ethernet/ibm/emac/mal.c +++ b/drivers/net/ethernet/ibm/emac/mal.c @@ -402,7 +402,7 @@ static int mal_poll(struct napi_struct *napi, int budget)  	unsigned long flags;  	MAL_DBG2(mal, "poll(%d)" NL, budget); - again: +  	/* Process TX skbs */  	list_for_each(l, &mal->poll_list) {  		struct mal_commac *mc = @@ -451,7 +451,6 @@ static int mal_poll(struct napi_struct *napi, int budget)  			spin_lock_irqsave(&mal->lock, flags);  			mal_disable_eob_irq(mal);  			spin_unlock_irqrestore(&mal->lock, flags); -			goto again;  		}  		mc->ops->poll_tx(mc->dev);  	} diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index cb8182f4fdfa..c66abd476023 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -1093,11 +1093,12 @@ static int build_hdr_data(u8 hdr_field, struct sk_buff *skb,   * places them in a descriptor array, scrq_arr   */ -static void create_hdr_descs(u8 hdr_field, u8 *hdr_data, int len, int *hdr_len, -			     union sub_crq *scrq_arr) +static int create_hdr_descs(u8 hdr_field, u8 *hdr_data, int len, int *hdr_len, +			    union sub_crq *scrq_arr)  {  	union sub_crq hdr_desc;  	int tmp_len = len; +	int num_descs = 0;  	u8 *data, *cur;  	int tmp; @@ -1126,7 +1127,10 @@ static void create_hdr_descs(u8 hdr_field, u8 *hdr_data, int len, int *hdr_len,  		tmp_len -= tmp;  		*scrq_arr = hdr_desc;  		scrq_arr++; +		num_descs++;  	} + +	return num_descs;  }  /** @@ -1144,16 +1148,12 @@ static void build_hdr_descs_arr(struct ibmvnic_tx_buff *txbuff,  				int *num_entries, u8 hdr_field)  {  	int hdr_len[3] = {0, 0, 0}; -	int tot_len, len; +	int tot_len;  	u8 *hdr_data = txbuff->hdr_data;  	tot_len = build_hdr_data(hdr_field, txbuff->skb, hdr_len,  				 txbuff->hdr_data); -	len = tot_len; -	len -= 24; -	if (len > 0) -		num_entries += len % 29 ? len / 29 + 1 : len / 29; -	create_hdr_descs(hdr_field, hdr_data, tot_len, hdr_len, +	*num_entries += create_hdr_descs(hdr_field, hdr_data, tot_len, hdr_len,  			 txbuff->indir_arr + 1);  } diff --git a/drivers/net/ethernet/intel/Makefile b/drivers/net/ethernet/intel/Makefile index 5ea764d85ec3..90af7757a885 100644 --- a/drivers/net/ethernet/intel/Makefile +++ b/drivers/net/ethernet/intel/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Intel network device drivers.  # diff --git a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c index ec8aa4562cc9..3b3983a1ffbb 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c +++ b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c @@ -1824,11 +1824,12 @@ static void e1000_get_ethtool_stats(struct net_device *netdev,  {  	struct e1000_adapter *adapter = netdev_priv(netdev);  	int i; -	char *p = NULL;  	const struct e1000_stats *stat = e1000_gstrings_stats;  	e1000_update_stats(adapter); -	for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++) { +	for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++, stat++) { +		char *p; +  		switch (stat->type) {  		case NETDEV_STATS:  			p = (char *)netdev + stat->stat_offset; @@ -1839,15 +1840,13 @@ static void e1000_get_ethtool_stats(struct net_device *netdev,  		default:  			WARN_ONCE(1, "Invalid E1000 stat type: %u index %d\n",  				  stat->type, i); -			break; +			continue;  		}  		if (stat->sizeof_stat == sizeof(u64))  			data[i] = *(u64 *)p;  		else  			data[i] = *(u32 *)p; - -		stat++;  	}  /* BUG_ON(i != E1000_STATS_LEN); */  } diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 98375e1e1185..1982f7917a8d 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -520,8 +520,6 @@ void e1000_down(struct e1000_adapter *adapter)  	struct net_device *netdev = adapter->netdev;  	u32 rctl, tctl; -	netif_carrier_off(netdev); -  	/* disable receives in the hardware */  	rctl = er32(RCTL);  	ew32(RCTL, rctl & ~E1000_RCTL_EN); @@ -537,6 +535,15 @@ void e1000_down(struct e1000_adapter *adapter)  	E1000_WRITE_FLUSH();  	msleep(10); +	/* Set the carrier off after transmits have been disabled in the +	 * hardware, to avoid race conditions with e1000_watchdog() (which +	 * may be running concurrently to us, checking for the carrier +	 * bit to decide whether it should enable transmits again). Such +	 * a race condition would result into transmission being disabled +	 * in the hardware until the next IFF_DOWN+IFF_UP cycle. +	 */ +	netif_carrier_off(netdev); +  	napi_disable(&adapter->napi);  	e1000_irq_disable(adapter); diff --git a/drivers/net/ethernet/intel/i40e/i40e_nvm.c b/drivers/net/ethernet/intel/i40e/i40e_nvm.c index 57505b1df98d..d591b3e6bd7c 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_nvm.c +++ b/drivers/net/ethernet/intel/i40e/i40e_nvm.c @@ -298,7 +298,7 @@ static i40e_status i40e_read_nvm_word_aq(struct i40e_hw *hw, u16 offset,  }  /** - * __i40e_read_nvm_word - Reads nvm word, assumes called does the locking + * __i40e_read_nvm_word - Reads nvm word, assumes caller does the locking   * @hw: pointer to the HW structure   * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)   * @data: word read from the Shadow RAM diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index 1519dfb851d0..120c68f78951 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c @@ -1038,6 +1038,32 @@ reset_latency:  }  /** + * i40e_reuse_rx_page - page flip buffer and store it back on the ring + * @rx_ring: rx descriptor ring to store buffers on + * @old_buff: donor buffer to have page reused + * + * Synchronizes page for reuse by the adapter + **/ +static void i40e_reuse_rx_page(struct i40e_ring *rx_ring, +			       struct i40e_rx_buffer *old_buff) +{ +	struct i40e_rx_buffer *new_buff; +	u16 nta = rx_ring->next_to_alloc; + +	new_buff = &rx_ring->rx_bi[nta]; + +	/* update, and store next to alloc */ +	nta++; +	rx_ring->next_to_alloc = (nta < rx_ring->count) ? nta : 0; + +	/* transfer page from old buffer to new buffer */ +	new_buff->dma		= old_buff->dma; +	new_buff->page		= old_buff->page; +	new_buff->page_offset	= old_buff->page_offset; +	new_buff->pagecnt_bias	= old_buff->pagecnt_bias; +} + +/**   * i40e_rx_is_programming_status - check for programming status descriptor   * @qw: qword representing status_error_len in CPU ordering   * @@ -1071,15 +1097,24 @@ static void i40e_clean_programming_status(struct i40e_ring *rx_ring,  					  union i40e_rx_desc *rx_desc,  					  u64 qw)  { -	u32 ntc = rx_ring->next_to_clean + 1; +	struct i40e_rx_buffer *rx_buffer; +	u32 ntc = rx_ring->next_to_clean;  	u8 id;  	/* fetch, update, and store next to clean */ +	rx_buffer = &rx_ring->rx_bi[ntc++];  	ntc = (ntc < rx_ring->count) ? ntc : 0;  	rx_ring->next_to_clean = ntc;  	prefetch(I40E_RX_DESC(rx_ring, ntc)); +	/* place unused page back on the ring */ +	i40e_reuse_rx_page(rx_ring, rx_buffer); +	rx_ring->rx_stats.page_reuse_count++; + +	/* clear contents of buffer_info */ +	rx_buffer->page = NULL; +  	id = (qw & I40E_RX_PROG_STATUS_DESC_QW1_PROGID_MASK) >>  		  I40E_RX_PROG_STATUS_DESC_QW1_PROGID_SHIFT; @@ -1639,32 +1674,6 @@ static bool i40e_cleanup_headers(struct i40e_ring *rx_ring, struct sk_buff *skb,  }  /** - * i40e_reuse_rx_page - page flip buffer and store it back on the ring - * @rx_ring: rx descriptor ring to store buffers on - * @old_buff: donor buffer to have page reused - * - * Synchronizes page for reuse by the adapter - **/ -static void i40e_reuse_rx_page(struct i40e_ring *rx_ring, -			       struct i40e_rx_buffer *old_buff) -{ -	struct i40e_rx_buffer *new_buff; -	u16 nta = rx_ring->next_to_alloc; - -	new_buff = &rx_ring->rx_bi[nta]; - -	/* update, and store next to alloc */ -	nta++; -	rx_ring->next_to_alloc = (nta < rx_ring->count) ? nta : 0; - -	/* transfer page from old buffer to new buffer */ -	new_buff->dma		= old_buff->dma; -	new_buff->page		= old_buff->page; -	new_buff->page_offset	= old_buff->page_offset; -	new_buff->pagecnt_bias	= old_buff->pagecnt_bias; -} - -/**   * i40e_page_is_reusable - check if any reuse is possible   * @page: page struct to check   * @@ -2093,6 +2102,7 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)  		if (unlikely(i40e_rx_is_programming_status(qword))) {  			i40e_clean_programming_status(rx_ring, rx_desc, qword); +			cleaned_count++;  			continue;  		}  		size = (qword & I40E_RXD_QW1_LENGTH_PBUF_MASK) >> @@ -2260,7 +2270,7 @@ static inline void i40e_update_enable_itr(struct i40e_vsi *vsi,  		goto enable_int;  	} -	if (ITR_IS_DYNAMIC(tx_itr_setting)) { +	if (ITR_IS_DYNAMIC(rx_itr_setting)) {  		rx = i40e_set_new_dynamic_itr(&q_vector->rx);  		rxval = i40e_buildreg_itr(I40E_RX_ITR, q_vector->rx.itr);  	} diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_client.c b/drivers/net/ethernet/intel/i40evf/i40evf_client.c index 93cf5fd17d91..d8131139565e 100644 --- a/drivers/net/ethernet/intel/i40evf/i40evf_client.c +++ b/drivers/net/ethernet/intel/i40evf/i40evf_client.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/list.h>  #include <linux/errno.h> diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_client.h b/drivers/net/ethernet/intel/i40evf/i40evf_client.h index 7d283c7506a5..15a10da5bd4a 100644 --- a/drivers/net/ethernet/intel/i40evf/i40evf_client.h +++ b/drivers/net/ethernet/intel/i40evf/i40evf_client.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _I40E_CLIENT_H_  #define _I40E_CLIENT_H_ diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index fd4a46b03cc8..ea69af267d63 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -5326,7 +5326,7 @@ dma_error:  				       DMA_TO_DEVICE);  		dma_unmap_len_set(tx_buffer, len, 0); -		if (i--) +		if (i-- == 0)  			i += tx_ring->count;  		tx_buffer = &tx_ring->tx_buffer_info[i];  	} diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c index 523f9d05a810..8a32eb7d47b9 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c @@ -175,31 +175,9 @@ static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)   **/  static s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)  { -#ifndef CONFIG_SPARC -	u32 regval; -	u32 i; -#endif  	s32 ret_val;  	ret_val = ixgbe_start_hw_generic(hw); - -#ifndef CONFIG_SPARC -	/* Disable relaxed ordering */ -	for (i = 0; ((i < hw->mac.max_tx_queues) && -	     (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { -		regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i)); -		regval &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN; -		IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval); -	} - -	for (i = 0; ((i < hw->mac.max_rx_queues) && -	     (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { -		regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); -		regval &= ~(IXGBE_DCA_RXCTRL_DATA_WRO_EN | -			    IXGBE_DCA_RXCTRL_HEAD_WRO_EN); -		IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); -	} -#endif  	if (ret_val)  		return ret_val; diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index 2c19070d2a0b..6e6ab6f6875e 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c @@ -366,25 +366,6 @@ s32 ixgbe_start_hw_gen2(struct ixgbe_hw *hw)  	}  	IXGBE_WRITE_FLUSH(hw); -#ifndef CONFIG_ARCH_WANT_RELAX_ORDER -	/* Disable relaxed ordering */ -	for (i = 0; i < hw->mac.max_tx_queues; i++) { -		u32 regval; - -		regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i)); -		regval &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN; -		IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(i), regval); -	} - -	for (i = 0; i < hw->mac.max_rx_queues; i++) { -		u32 regval; - -		regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); -		regval &= ~(IXGBE_DCA_RXCTRL_DATA_WRO_EN | -			    IXGBE_DCA_RXCTRL_HEAD_WRO_EN); -		IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); -	} -#endif  	return 0;  } diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index 72c565712a5f..c3e7a8191128 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c @@ -1048,7 +1048,7 @@ static int ixgbe_set_ringparam(struct net_device *netdev,  {  	struct ixgbe_adapter *adapter = netdev_priv(netdev);  	struct ixgbe_ring *temp_ring; -	int i, err = 0; +	int i, j, err = 0;  	u32 new_rx_count, new_tx_count;  	if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) @@ -1085,8 +1085,8 @@ static int ixgbe_set_ringparam(struct net_device *netdev,  	}  	/* allocate temporary buffer to store rings in */ -	i = max_t(int, adapter->num_tx_queues, adapter->num_rx_queues); -	i = max_t(int, i, adapter->num_xdp_queues); +	i = max_t(int, adapter->num_tx_queues + adapter->num_xdp_queues, +		  adapter->num_rx_queues);  	temp_ring = vmalloc(i * sizeof(struct ixgbe_ring));  	if (!temp_ring) { @@ -1118,8 +1118,8 @@ static int ixgbe_set_ringparam(struct net_device *netdev,  			}  		} -		for (i = 0; i < adapter->num_xdp_queues; i++) { -			memcpy(&temp_ring[i], adapter->xdp_ring[i], +		for (j = 0; j < adapter->num_xdp_queues; j++, i++) { +			memcpy(&temp_ring[i], adapter->xdp_ring[j],  			       sizeof(struct ixgbe_ring));  			temp_ring[i].count = new_tx_count; @@ -1139,10 +1139,10 @@ static int ixgbe_set_ringparam(struct net_device *netdev,  			memcpy(adapter->tx_ring[i], &temp_ring[i],  			       sizeof(struct ixgbe_ring));  		} -		for (i = 0; i < adapter->num_xdp_queues; i++) { -			ixgbe_free_tx_resources(adapter->xdp_ring[i]); +		for (j = 0; j < adapter->num_xdp_queues; j++, i++) { +			ixgbe_free_tx_resources(adapter->xdp_ring[j]); -			memcpy(adapter->xdp_ring[i], &temp_ring[i], +			memcpy(adapter->xdp_ring[j], &temp_ring[i],  			       sizeof(struct ixgbe_ring));  		} diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index d962368d08d0..6d5f31e94358 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -4881,7 +4881,7 @@ static void ixgbe_clear_udp_tunnel_port(struct ixgbe_adapter *adapter, u32 mask)  				IXGBE_FLAG_GENEVE_OFFLOAD_CAPABLE)))  		return; -	vxlanctrl = IXGBE_READ_REG(hw, IXGBE_VXLANCTRL) && ~mask; +	vxlanctrl = IXGBE_READ_REG(hw, IXGBE_VXLANCTRL) & ~mask;  	IXGBE_WRITE_REG(hw, IXGBE_VXLANCTRL, vxlanctrl);  	if (mask & IXGBE_VXLANCTRL_VXLAN_UDPPORT_MASK) @@ -8020,29 +8020,23 @@ static int ixgbe_tx_map(struct ixgbe_ring *tx_ring,  	return 0;  dma_error:  	dev_err(tx_ring->dev, "TX DMA map failed\n"); -	tx_buffer = &tx_ring->tx_buffer_info[i];  	/* clear dma mappings for failed tx_buffer_info map */ -	while (tx_buffer != first) { +	for (;;) { +		tx_buffer = &tx_ring->tx_buffer_info[i];  		if (dma_unmap_len(tx_buffer, len))  			dma_unmap_page(tx_ring->dev,  				       dma_unmap_addr(tx_buffer, dma),  				       dma_unmap_len(tx_buffer, len),  				       DMA_TO_DEVICE);  		dma_unmap_len_set(tx_buffer, len, 0); - -		if (i--) +		if (tx_buffer == first) +			break; +		if (i == 0)  			i += tx_ring->count; -		tx_buffer = &tx_ring->tx_buffer_info[i]; +		i--;  	} -	if (dma_unmap_len(tx_buffer, len)) -		dma_unmap_single(tx_ring->dev, -				 dma_unmap_addr(tx_buffer, dma), -				 dma_unmap_len(tx_buffer, len), -				 DMA_TO_DEVICE); -	dma_unmap_len_set(tx_buffer, len, 0); -  	dev_kfree_skb_any(first->skb);  	first->skb = NULL; @@ -8529,6 +8523,10 @@ static int ixgbe_ioctl(struct net_device *netdev, struct ifreq *req, int cmd)  		return ixgbe_ptp_set_ts_config(adapter, req);  	case SIOCGHWTSTAMP:  		return ixgbe_ptp_get_ts_config(adapter, req); +	case SIOCGMIIPHY: +		if (!adapter->hw.phy.ops.read_reg) +			return -EOPNOTSUPP; +		/* fall through */  	default:  		return mdio_mii_ioctl(&adapter->hw.phy.mdio, if_mii(req), cmd);  	} diff --git a/drivers/net/ethernet/marvell/Makefile b/drivers/net/ethernet/marvell/Makefile index ff1bffa74803..9498ed26dbe5 100644 --- a/drivers/net/ethernet/marvell/Makefile +++ b/drivers/net/ethernet/marvell/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Marvell device drivers.  # diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c index dd0ee2691c86..a37af5813f33 100644 --- a/drivers/net/ethernet/marvell/mvpp2.c +++ b/drivers/net/ethernet/marvell/mvpp2.c @@ -333,7 +333,7 @@  #define     MVPP2_GMAC_INBAND_AN_MASK		BIT(0)  #define     MVPP2_GMAC_FLOW_CTRL_MASK		GENMASK(2, 1)  #define     MVPP2_GMAC_PCS_ENABLE_MASK		BIT(3) -#define     MVPP2_GMAC_PORT_RGMII_MASK		BIT(4) +#define     MVPP2_GMAC_INTERNAL_CLK_MASK	BIT(4)  #define     MVPP2_GMAC_DISABLE_PADDING		BIT(5)  #define     MVPP2_GMAC_PORT_RESET_MASK		BIT(6)  #define MVPP2_GMAC_AUTONEG_CONFIG		0xc @@ -676,6 +676,7 @@ enum mvpp2_tag_type {  #define MVPP2_PRS_RI_L3_MCAST			BIT(15)  #define MVPP2_PRS_RI_L3_BCAST			(BIT(15) | BIT(16))  #define MVPP2_PRS_RI_IP_FRAG_MASK		0x20000 +#define MVPP2_PRS_RI_IP_FRAG_TRUE		BIT(17)  #define MVPP2_PRS_RI_UDF3_MASK			0x300000  #define MVPP2_PRS_RI_UDF3_RX_SPECIAL		BIT(21)  #define MVPP2_PRS_RI_L4_PROTO_MASK		0x1c00000 @@ -792,6 +793,7 @@ struct mvpp2 {  	struct clk *pp_clk;  	struct clk *gop_clk;  	struct clk *mg_clk; +	struct clk *axi_clk;  	/* List of pointers to port structures */  	struct mvpp2_port **port_list; @@ -1165,6 +1167,11 @@ struct mvpp2_bm_pool {  	u32 port_map;  }; +#define IS_TSO_HEADER(txq_pcpu, addr) \ +	((addr) >= (txq_pcpu)->tso_headers_dma && \ +	 (addr) < (txq_pcpu)->tso_headers_dma + \ +	 (txq_pcpu)->size * TSO_HEADER_SIZE) +  /* Queue modes */  #define MVPP2_QDIST_SINGLE_MODE	0  #define MVPP2_QDIST_MULTI_MODE	1 @@ -1532,7 +1539,7 @@ static bool mvpp2_prs_tcam_data_cmp(struct mvpp2_prs_entry *pe, int offs,  	int off = MVPP2_PRS_TCAM_DATA_BYTE(offs);  	u16 tcam_data; -	tcam_data = (8 << pe->tcam.byte[off + 1]) | pe->tcam.byte[off]; +	tcam_data = (pe->tcam.byte[off + 1] << 8) | pe->tcam.byte[off];  	if (tcam_data != data)  		return false;  	return true; @@ -2315,7 +2322,7 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,  	    (proto != IPPROTO_IGMP))  		return -EINVAL; -	/* Fragmented packet */ +	/* Not fragmented packet */  	tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,  					MVPP2_PE_LAST_FREE_TID);  	if (tid < 0) @@ -2334,8 +2341,12 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,  				  MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);  	mvpp2_prs_sram_ai_update(&pe, MVPP2_PRS_IPV4_DIP_AI_BIT,  				 MVPP2_PRS_IPV4_DIP_AI_BIT); -	mvpp2_prs_sram_ri_update(&pe, ri | MVPP2_PRS_RI_IP_FRAG_MASK, -				 ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK); +	mvpp2_prs_sram_ri_update(&pe, ri, ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK); + +	mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00, +				     MVPP2_PRS_TCAM_PROTO_MASK_L); +	mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00, +				     MVPP2_PRS_TCAM_PROTO_MASK);  	mvpp2_prs_tcam_data_byte_set(&pe, 5, proto, MVPP2_PRS_TCAM_PROTO_MASK);  	mvpp2_prs_tcam_ai_update(&pe, 0, MVPP2_PRS_IPV4_DIP_AI_BIT); @@ -2346,7 +2357,7 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,  	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_IP4);  	mvpp2_prs_hw_write(priv, &pe); -	/* Not fragmented packet */ +	/* Fragmented packet */  	tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,  					MVPP2_PE_LAST_FREE_TID);  	if (tid < 0) @@ -2358,8 +2369,11 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,  	pe.sram.word[MVPP2_PRS_SRAM_RI_CTRL_WORD] = 0x0;  	mvpp2_prs_sram_ri_update(&pe, ri, ri_mask); -	mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00, MVPP2_PRS_TCAM_PROTO_MASK_L); -	mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00, MVPP2_PRS_TCAM_PROTO_MASK); +	mvpp2_prs_sram_ri_update(&pe, ri | MVPP2_PRS_RI_IP_FRAG_TRUE, +				 ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK); + +	mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00, 0x0); +	mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00, 0x0);  	/* Update shadow table and hw entry */  	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_IP4); @@ -2600,8 +2614,8 @@ static void mvpp2_prs_mac_init(struct mvpp2 *priv)  	/* place holders only - no ports */  	mvpp2_prs_mac_drop_all_set(priv, 0, false);  	mvpp2_prs_mac_promisc_set(priv, 0, false); -	mvpp2_prs_mac_multi_set(priv, MVPP2_PE_MAC_MC_ALL, 0, false); -	mvpp2_prs_mac_multi_set(priv, MVPP2_PE_MAC_MC_IP6, 0, false); +	mvpp2_prs_mac_multi_set(priv, 0, MVPP2_PE_MAC_MC_ALL, false); +	mvpp2_prs_mac_multi_set(priv, 0, MVPP2_PE_MAC_MC_IP6, false);  }  /* Set default entries for various types of dsa packets */ @@ -3382,7 +3396,7 @@ mvpp2_prs_mac_da_range_find(struct mvpp2 *priv, int pmap, const u8 *da,  	struct mvpp2_prs_entry *pe;  	int tid; -	pe = kzalloc(sizeof(*pe), GFP_KERNEL); +	pe = kzalloc(sizeof(*pe), GFP_ATOMIC);  	if (!pe)  		return NULL;  	mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_MAC); @@ -3444,7 +3458,7 @@ static int mvpp2_prs_mac_da_accept(struct mvpp2 *priv, int port,  		if (tid < 0)  			return tid; -		pe = kzalloc(sizeof(*pe), GFP_KERNEL); +		pe = kzalloc(sizeof(*pe), GFP_ATOMIC);  		if (!pe)  			return -ENOMEM;  		mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_MAC); @@ -4591,7 +4605,6 @@ static void mvpp2_port_mii_gmac_configure(struct mvpp2_port *port)  	        val |= MVPP2_GMAC_INBAND_AN_MASK | MVPP2_GMAC_PCS_ENABLE_MASK;  	} else if (phy_interface_mode_is_rgmii(port->phy_interface)) {  		val &= ~MVPP2_GMAC_PCS_ENABLE_MASK; -		val |= MVPP2_GMAC_PORT_RGMII_MASK;  	}  	writel(val, port->base + MVPP2_GMAC_CTRL_2_REG); @@ -5313,8 +5326,9 @@ static void mvpp2_txq_bufs_free(struct mvpp2_port *port,  		struct mvpp2_txq_pcpu_buf *tx_buf =  			txq_pcpu->buffs + txq_pcpu->txq_get_index; -		dma_unmap_single(port->dev->dev.parent, tx_buf->dma, -				 tx_buf->size, DMA_TO_DEVICE); +		if (!IS_TSO_HEADER(txq_pcpu, tx_buf->dma)) +			dma_unmap_single(port->dev->dev.parent, tx_buf->dma, +					 tx_buf->size, DMA_TO_DEVICE);  		if (tx_buf->skb)  			dev_kfree_skb_any(tx_buf->skb); @@ -5601,7 +5615,7 @@ static int mvpp2_txq_init(struct mvpp2_port *port,  		txq_pcpu->tso_headers =  			dma_alloc_coherent(port->dev->dev.parent, -					   MVPP2_AGGR_TXQ_SIZE * TSO_HEADER_SIZE, +					   txq_pcpu->size * TSO_HEADER_SIZE,  					   &txq_pcpu->tso_headers_dma,  					   GFP_KERNEL);  		if (!txq_pcpu->tso_headers) @@ -5615,7 +5629,7 @@ cleanup:  		kfree(txq_pcpu->buffs);  		dma_free_coherent(port->dev->dev.parent, -				  MVPP2_AGGR_TXQ_SIZE * MVPP2_DESC_ALIGNED_SIZE, +				  txq_pcpu->size * TSO_HEADER_SIZE,  				  txq_pcpu->tso_headers,  				  txq_pcpu->tso_headers_dma);  	} @@ -5639,7 +5653,7 @@ static void mvpp2_txq_deinit(struct mvpp2_port *port,  		kfree(txq_pcpu->buffs);  		dma_free_coherent(port->dev->dev.parent, -				  MVPP2_AGGR_TXQ_SIZE * MVPP2_DESC_ALIGNED_SIZE, +				  txq_pcpu->size * TSO_HEADER_SIZE,  				  txq_pcpu->tso_headers,  				  txq_pcpu->tso_headers_dma);  	} @@ -6204,12 +6218,15 @@ static inline void  tx_desc_unmap_put(struct mvpp2_port *port, struct mvpp2_tx_queue *txq,  		  struct mvpp2_tx_desc *desc)  { +	struct mvpp2_txq_pcpu *txq_pcpu = this_cpu_ptr(txq->pcpu); +  	dma_addr_t buf_dma_addr =  		mvpp2_txdesc_dma_addr_get(port, desc);  	size_t buf_sz =  		mvpp2_txdesc_size_get(port, desc); -	dma_unmap_single(port->dev->dev.parent, buf_dma_addr, -			 buf_sz, DMA_TO_DEVICE); +	if (!IS_TSO_HEADER(txq_pcpu, buf_dma_addr)) +		dma_unmap_single(port->dev->dev.parent, buf_dma_addr, +				 buf_sz, DMA_TO_DEVICE);  	mvpp2_txq_desc_put(txq);  } @@ -6482,7 +6499,7 @@ out:  	}  	/* Finalize TX processing */ -	if (txq_pcpu->count >= txq->done_pkts_coal) +	if (!port->has_tx_irqs && txq_pcpu->count >= txq->done_pkts_coal)  		mvpp2_txq_done(port, txq, txq_pcpu);  	/* Set the timer in case not all frags were processed */ @@ -7496,7 +7513,7 @@ static void mvpp2_port_copy_mac_addr(struct net_device *dev, struct mvpp2 *priv,  /* Ports initialization */  static int mvpp2_port_probe(struct platform_device *pdev,  			    struct device_node *port_node, -			    struct mvpp2 *priv) +			    struct mvpp2 *priv, int index)  {  	struct device_node *phy_node;  	struct phy *comphy; @@ -7670,7 +7687,7 @@ static int mvpp2_port_probe(struct platform_device *pdev,  	}  	netdev_info(dev, "Using %s mac address %pM\n", mac_from, dev->dev_addr); -	priv->port_list[id] = port; +	priv->port_list[index] = port;  	return 0;  err_free_port_pcpu: @@ -7963,6 +7980,18 @@ static int mvpp2_probe(struct platform_device *pdev)  		err = clk_prepare_enable(priv->mg_clk);  		if (err < 0)  			goto err_gop_clk; + +		priv->axi_clk = devm_clk_get(&pdev->dev, "axi_clk"); +		if (IS_ERR(priv->axi_clk)) { +			err = PTR_ERR(priv->axi_clk); +			if (err == -EPROBE_DEFER) +				goto err_gop_clk; +			priv->axi_clk = NULL; +		} else { +			err = clk_prepare_enable(priv->axi_clk); +			if (err < 0) +				goto err_gop_clk; +		}  	}  	/* Get system's tclk rate */ @@ -8005,16 +8034,19 @@ static int mvpp2_probe(struct platform_device *pdev)  	}  	/* Initialize ports */ +	i = 0;  	for_each_available_child_of_node(dn, port_node) { -		err = mvpp2_port_probe(pdev, port_node, priv); +		err = mvpp2_port_probe(pdev, port_node, priv, i);  		if (err < 0)  			goto err_mg_clk; +		i++;  	}  	platform_set_drvdata(pdev, priv);  	return 0;  err_mg_clk: +	clk_disable_unprepare(priv->axi_clk);  	if (priv->hw_version == MVPP22)  		clk_disable_unprepare(priv->mg_clk);  err_gop_clk: @@ -8052,6 +8084,7 @@ static int mvpp2_remove(struct platform_device *pdev)  				  aggr_txq->descs_dma);  	} +	clk_disable_unprepare(priv->axi_clk);  	clk_disable_unprepare(priv->mg_clk);  	clk_disable_unprepare(priv->pp_clk);  	clk_disable_unprepare(priv->gop_clk); diff --git a/drivers/net/ethernet/marvell/skge.h b/drivers/net/ethernet/marvell/skge.h index 3ea151ff9c43..6fa7b6a34c08 100644 --- a/drivers/net/ethernet/marvell/skge.h +++ b/drivers/net/ethernet/marvell/skge.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Definitions for the new Marvell Yukon / SysKonnect driver.   */ diff --git a/drivers/net/ethernet/marvell/sky2.h b/drivers/net/ethernet/marvell/sky2.h index 0fe160796842..b02b6523083c 100644 --- a/drivers/net/ethernet/marvell/sky2.h +++ b/drivers/net/ethernet/marvell/sky2.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Definitions for the new Marvell Yukon 2 driver.   */ diff --git a/drivers/net/ethernet/mellanox/mlx4/Makefile b/drivers/net/ethernet/mellanox/mlx4/Makefile index c82217e0d22d..16b10d01fcf4 100644 --- a/drivers/net/ethernet/mellanox/mlx4/Makefile +++ b/drivers/net/ethernet/mellanox/mlx4/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_MLX4_CORE)		+= mlx4_core.o  mlx4_core-y :=	alloc.o catas.o cmd.o cq.o eq.o fw.o fw_qos.o icm.o intf.o \ diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h index 926f3c3f3665..aab28eb27a30 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _MLX4_STATS_  #define _MLX4_STATS_ diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile index 87a3099808f3..714dd0dc5eef 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile +++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_MLX5_CORE)		+= mlx5_core.o  subdir-ccflags-y += -I$(src) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/dev.c b/drivers/net/ethernet/mellanox/mlx5/core/dev.c index ff60cf7342ca..fc281712869b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/dev.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/dev.c @@ -77,35 +77,41 @@ static void add_delayed_event(struct mlx5_priv *priv,  	list_add_tail(&delayed_event->list, &priv->waiting_events_list);  } -static void fire_delayed_event_locked(struct mlx5_device_context *dev_ctx, -				      struct mlx5_core_dev *dev, -				      struct mlx5_priv *priv) +static void delayed_event_release(struct mlx5_device_context *dev_ctx, +				  struct mlx5_priv *priv)  { +	struct mlx5_core_dev *dev = container_of(priv, struct mlx5_core_dev, priv);  	struct mlx5_delayed_event *de;  	struct mlx5_delayed_event *n; +	struct list_head temp; -	/* stop delaying events */ -	priv->is_accum_events = false; +	INIT_LIST_HEAD(&temp); + +	spin_lock_irq(&priv->ctx_lock); -	/* fire all accumulated events before new event comes */ -	list_for_each_entry_safe(de, n, &priv->waiting_events_list, list) { +	priv->is_accum_events = false; +	list_splice_init(&priv->waiting_events_list, &temp); +	if (!dev_ctx->context) +		goto out; +	list_for_each_entry_safe(de, n, &priv->waiting_events_list, list)  		dev_ctx->intf->event(dev, dev_ctx->context, de->event, de->param); + +out: +	spin_unlock_irq(&priv->ctx_lock); + +	list_for_each_entry_safe(de, n, &temp, list) {  		list_del(&de->list);  		kfree(de);  	}  } -static void cleanup_delayed_evets(struct mlx5_priv *priv) +/* accumulating events that can come after mlx5_ib calls to + * ib_register_device, till adding that interface to the events list. + */ +static void delayed_event_start(struct mlx5_priv *priv)  { -	struct mlx5_delayed_event *de; -	struct mlx5_delayed_event *n; -  	spin_lock_irq(&priv->ctx_lock); -	priv->is_accum_events = false; -	list_for_each_entry_safe(de, n, &priv->waiting_events_list, list) { -		list_del(&de->list); -		kfree(de); -	} +	priv->is_accum_events = true;  	spin_unlock_irq(&priv->ctx_lock);  } @@ -122,11 +128,8 @@ void mlx5_add_device(struct mlx5_interface *intf, struct mlx5_priv *priv)  		return;  	dev_ctx->intf = intf; -	/* accumulating events that can come after mlx5_ib calls to -	 * ib_register_device, till adding that interface to the events list. -	 */ -	priv->is_accum_events = true; +	delayed_event_start(priv);  	dev_ctx->context = intf->add(dev);  	set_bit(MLX5_INTERFACE_ADDED, &dev_ctx->state); @@ -137,8 +140,6 @@ void mlx5_add_device(struct mlx5_interface *intf, struct mlx5_priv *priv)  		spin_lock_irq(&priv->ctx_lock);  		list_add_tail(&dev_ctx->list, &priv->ctx_list); -		fire_delayed_event_locked(dev_ctx, dev, priv); -  #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING  		if (dev_ctx->intf->pfault) {  			if (priv->pfault) { @@ -150,11 +151,12 @@ void mlx5_add_device(struct mlx5_interface *intf, struct mlx5_priv *priv)  		}  #endif  		spin_unlock_irq(&priv->ctx_lock); -	} else { -		kfree(dev_ctx); -		 /* delete all accumulated events */ -		cleanup_delayed_evets(priv);  	} + +	delayed_event_release(dev_ctx, priv); + +	if (!dev_ctx->context) +		kfree(dev_ctx);  }  static struct mlx5_device_context *mlx5_get_device(struct mlx5_interface *intf, @@ -205,17 +207,21 @@ static void mlx5_attach_interface(struct mlx5_interface *intf, struct mlx5_priv  	if (!dev_ctx)  		return; +	delayed_event_start(priv);  	if (intf->attach) {  		if (test_bit(MLX5_INTERFACE_ATTACHED, &dev_ctx->state)) -			return; +			goto out;  		intf->attach(dev, dev_ctx->context);  		set_bit(MLX5_INTERFACE_ATTACHED, &dev_ctx->state);  	} else {  		if (test_bit(MLX5_INTERFACE_ADDED, &dev_ctx->state)) -			return; +			goto out;  		dev_ctx->context = intf->add(dev);  		set_bit(MLX5_INTERFACE_ADDED, &dev_ctx->state);  	} + +out: +	delayed_event_release(dev_ctx, priv);  }  void mlx5_attach_device(struct mlx5_core_dev *dev) @@ -414,8 +420,14 @@ void mlx5_core_event(struct mlx5_core_dev *dev, enum mlx5_dev_event event,  	if (priv->is_accum_events)  		add_delayed_event(priv, dev, event, param); +	/* After mlx5_detach_device, the dev_ctx->intf is still set and dev_ctx is +	 * still in priv->ctx_list. In this case, only notify the dev_ctx if its +	 * ADDED or ATTACHED bit are set. +	 */  	list_for_each_entry(dev_ctx, &priv->ctx_list, list) -		if (dev_ctx->intf->event) +		if (dev_ctx->intf->event && +		    (test_bit(MLX5_INTERFACE_ADDED, &dev_ctx->state) || +		     test_bit(MLX5_INTERFACE_ATTACHED, &dev_ctx->state)))  			dev_ctx->intf->event(dev, dev_ctx->context, event, param);  	spin_unlock_irqrestore(&priv->ctx_lock, flags); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h b/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h index 1e3a6c3e4132..80eef4163f52 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h @@ -139,7 +139,7 @@ TRACE_EVENT(mlx5_fs_del_fg,  	{MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO, "NEXT_PRIO"}  TRACE_EVENT(mlx5_fs_set_fte, -	    TP_PROTO(const struct fs_fte *fte, bool new_fte), +	    TP_PROTO(const struct fs_fte *fte, int new_fte),  	    TP_ARGS(fte, new_fte),  	    TP_STRUCT__entry(  		__field(const struct fs_fte *, fte) @@ -149,7 +149,7 @@ TRACE_EVENT(mlx5_fs_set_fte,  		__field(u32, action)  		__field(u32, flow_tag)  		__field(u8,  mask_enable) -		__field(bool, new_fte) +		__field(int, new_fte)  		__array(u32, mask_outer, MLX5_ST_SZ_DW(fte_match_set_lyr_2_4))  		__array(u32, mask_inner, MLX5_ST_SZ_DW(fte_match_set_lyr_2_4))  		__array(u32, mask_misc, MLX5_ST_SZ_DW(fte_match_set_misc)) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c index c1d384fca4dc..51c4cc00a186 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c @@ -41,6 +41,11 @@  #define MLX5E_CEE_STATE_UP    1  #define MLX5E_CEE_STATE_DOWN  0 +enum { +	MLX5E_VENDOR_TC_GROUP_NUM = 7, +	MLX5E_LOWEST_PRIO_GROUP   = 0, +}; +  /* If dcbx mode is non-host set the dcbx mode to host.   */  static int mlx5e_dcbnl_set_dcbx_mode(struct mlx5e_priv *priv, @@ -85,6 +90,9 @@ static int mlx5e_dcbnl_ieee_getets(struct net_device *netdev,  {  	struct mlx5e_priv *priv = netdev_priv(netdev);  	struct mlx5_core_dev *mdev = priv->mdev; +	u8 tc_group[IEEE_8021QAZ_MAX_TCS]; +	bool is_tc_group_6_exist = false; +	bool is_zero_bw_ets_tc = false;  	int err = 0;  	int i; @@ -96,37 +104,64 @@ static int mlx5e_dcbnl_ieee_getets(struct net_device *netdev,  		err = mlx5_query_port_prio_tc(mdev, i, &ets->prio_tc[i]);  		if (err)  			return err; -	} -	for (i = 0; i < ets->ets_cap; i++) { +		err = mlx5_query_port_tc_group(mdev, i, &tc_group[i]); +		if (err) +			return err; +  		err = mlx5_query_port_tc_bw_alloc(mdev, i, &ets->tc_tx_bw[i]);  		if (err)  			return err; + +		if (ets->tc_tx_bw[i] < MLX5E_MAX_BW_ALLOC && +		    tc_group[i] == (MLX5E_LOWEST_PRIO_GROUP + 1)) +			is_zero_bw_ets_tc = true; + +		if (tc_group[i] == (MLX5E_VENDOR_TC_GROUP_NUM - 1)) +			is_tc_group_6_exist = true; +	} + +	/* Report 0% ets tc if exits*/ +	if (is_zero_bw_ets_tc) { +		for (i = 0; i < ets->ets_cap; i++) +			if (tc_group[i] == MLX5E_LOWEST_PRIO_GROUP) +				ets->tc_tx_bw[i] = 0; +	} + +	/* Update tc_tsa based on fw setting*/ +	for (i = 0; i < ets->ets_cap; i++) {  		if (ets->tc_tx_bw[i] < MLX5E_MAX_BW_ALLOC)  			priv->dcbx.tc_tsa[i] = IEEE_8021QAZ_TSA_ETS; +		else if (tc_group[i] == MLX5E_VENDOR_TC_GROUP_NUM && +			 !is_tc_group_6_exist) +			priv->dcbx.tc_tsa[i] = IEEE_8021QAZ_TSA_VENDOR;  	} -  	memcpy(ets->tc_tsa, priv->dcbx.tc_tsa, sizeof(ets->tc_tsa));  	return err;  } -enum { -	MLX5E_VENDOR_TC_GROUP_NUM = 7, -	MLX5E_ETS_TC_GROUP_NUM    = 0, -}; -  static void mlx5e_build_tc_group(struct ieee_ets *ets, u8 *tc_group, int max_tc)  {  	bool any_tc_mapped_to_ets = false; +	bool ets_zero_bw = false;  	int strict_group;  	int i; -	for (i = 0; i <= max_tc; i++) -		if (ets->tc_tsa[i] == IEEE_8021QAZ_TSA_ETS) +	for (i = 0; i <= max_tc; i++) { +		if (ets->tc_tsa[i] == IEEE_8021QAZ_TSA_ETS) {  			any_tc_mapped_to_ets = true; +			if (!ets->tc_tx_bw[i]) +				ets_zero_bw = true; +		} +	} -	strict_group = any_tc_mapped_to_ets ? 1 : 0; +	/* strict group has higher priority than ets group */ +	strict_group = MLX5E_LOWEST_PRIO_GROUP; +	if (any_tc_mapped_to_ets) +		strict_group++; +	if (ets_zero_bw) +		strict_group++;  	for (i = 0; i <= max_tc; i++) {  		switch (ets->tc_tsa[i]) { @@ -137,7 +172,9 @@ static void mlx5e_build_tc_group(struct ieee_ets *ets, u8 *tc_group, int max_tc)  			tc_group[i] = strict_group++;  			break;  		case IEEE_8021QAZ_TSA_ETS: -			tc_group[i] = MLX5E_ETS_TC_GROUP_NUM; +			tc_group[i] = MLX5E_LOWEST_PRIO_GROUP; +			if (ets->tc_tx_bw[i] && ets_zero_bw) +				tc_group[i] = MLX5E_LOWEST_PRIO_GROUP + 1;  			break;  		}  	} @@ -146,9 +183,23 @@ static void mlx5e_build_tc_group(struct ieee_ets *ets, u8 *tc_group, int max_tc)  static void mlx5e_build_tc_tx_bw(struct ieee_ets *ets, u8 *tc_tx_bw,  				 u8 *tc_group, int max_tc)  { +	int bw_for_ets_zero_bw_tc = 0; +	int last_ets_zero_bw_tc = -1; +	int num_ets_zero_bw = 0;  	int i;  	for (i = 0; i <= max_tc; i++) { +		if (ets->tc_tsa[i] == IEEE_8021QAZ_TSA_ETS && +		    !ets->tc_tx_bw[i]) { +			num_ets_zero_bw++; +			last_ets_zero_bw_tc = i; +		} +	} + +	if (num_ets_zero_bw) +		bw_for_ets_zero_bw_tc = MLX5E_MAX_BW_ALLOC / num_ets_zero_bw; + +	for (i = 0; i <= max_tc; i++) {  		switch (ets->tc_tsa[i]) {  		case IEEE_8021QAZ_TSA_VENDOR:  			tc_tx_bw[i] = MLX5E_MAX_BW_ALLOC; @@ -157,12 +208,26 @@ static void mlx5e_build_tc_tx_bw(struct ieee_ets *ets, u8 *tc_tx_bw,  			tc_tx_bw[i] = MLX5E_MAX_BW_ALLOC;  			break;  		case IEEE_8021QAZ_TSA_ETS: -			tc_tx_bw[i] = ets->tc_tx_bw[i]; +			tc_tx_bw[i] = ets->tc_tx_bw[i] ? +				      ets->tc_tx_bw[i] : +				      bw_for_ets_zero_bw_tc;  			break;  		}  	} + +	/* Make sure the total bw for ets zero bw group is 100% */ +	if (last_ets_zero_bw_tc != -1) +		tc_tx_bw[last_ets_zero_bw_tc] += +			MLX5E_MAX_BW_ALLOC % num_ets_zero_bw;  } +/* If there are ETS BW 0, + *   Set ETS group # to 1 for all ETS non zero BW tcs. Their sum must be 100%. + *   Set group #0 to all the ETS BW 0 tcs and + *     equally splits the 100% BW between them + *   Report both group #0 and #1 as ETS type. + *     All the tcs in group #0 will be reported with 0% BW. + */  int mlx5e_dcbnl_ieee_setets_core(struct mlx5e_priv *priv, struct ieee_ets *ets)  {  	struct mlx5_core_dev *mdev = priv->mdev; @@ -188,7 +253,6 @@ int mlx5e_dcbnl_ieee_setets_core(struct mlx5e_priv *priv, struct ieee_ets *ets)  		return err;  	memcpy(priv->dcbx.tc_tsa, ets->tc_tsa, sizeof(ets->tc_tsa)); -  	return err;  } @@ -209,17 +273,9 @@ static int mlx5e_dbcnl_validate_ets(struct net_device *netdev,  	}  	/* Validate Bandwidth Sum */ -	for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { -		if (ets->tc_tsa[i] == IEEE_8021QAZ_TSA_ETS) { -			if (!ets->tc_tx_bw[i]) { -				netdev_err(netdev, -					   "Failed to validate ETS: BW 0 is illegal\n"); -				return -EINVAL; -			} - +	for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) +		if (ets->tc_tsa[i] == IEEE_8021QAZ_TSA_ETS)  			bw_sum += ets->tc_tx_bw[i]; -		} -	}  	if (bw_sum != 0 && bw_sum != 100) {  		netdev_err(netdev, @@ -533,8 +589,7 @@ static void mlx5e_dcbnl_getpgtccfgtx(struct net_device *netdev,  static void mlx5e_dcbnl_getpgbwgcfgtx(struct net_device *netdev,  				      int pgid, u8 *bw_pct)  { -	struct mlx5e_priv *priv = netdev_priv(netdev); -	struct mlx5_core_dev *mdev = priv->mdev; +	struct ieee_ets ets;  	if (pgid >= CEE_DCBX_MAX_PGS) {  		netdev_err(netdev, @@ -542,8 +597,8 @@ static void mlx5e_dcbnl_getpgbwgcfgtx(struct net_device *netdev,  		return;  	} -	if (mlx5_query_port_tc_bw_alloc(mdev, pgid, bw_pct)) -		*bw_pct = 0; +	mlx5e_dcbnl_ieee_getets(netdev, &ets); +	*bw_pct = ets.tc_tx_bw[pgid];  }  static void mlx5e_dcbnl_setpfccfg(struct net_device *netdev, @@ -739,8 +794,6 @@ static void mlx5e_ets_init(struct mlx5e_priv *priv)  		ets.prio_tc[i] = i;  	} -	memcpy(priv->dcbx.tc_tsa, ets.tc_tsa, sizeof(ets.tc_tsa)); -  	/* tclass[prio=0]=1, tclass[prio=1]=0, tclass[prio=i]=i (for i>1) */  	ets.prio_tc[0] = 1;  	ets.prio_tc[1] = 0; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c index f11fd07ac4dd..850cdc980ab5 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c @@ -291,7 +291,7 @@ void mlx5e_enable_vlan_filter(struct mlx5e_priv *priv)  	priv->fs.vlan.filter_disabled = false;  	if (priv->netdev->flags & IFF_PROMISC)  		return; -	mlx5e_del_any_vid_rules(priv); +	mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_CTAG_VID, 0);  }  void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv) @@ -302,7 +302,7 @@ void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv)  	priv->fs.vlan.filter_disabled = true;  	if (priv->netdev->flags & IFF_PROMISC)  		return; -	mlx5e_add_any_vid_rules(priv); +	mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_CTAG_VID, 0);  }  int mlx5e_vlan_rx_add_vid(struct net_device *dev, __always_unused __be16 proto, diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index dfc29720ab77..cc11bbbd0309 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -184,7 +184,6 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)  	struct mlx5e_sw_stats temp, *s = &temp;  	struct mlx5e_rq_stats *rq_stats;  	struct mlx5e_sq_stats *sq_stats; -	u64 tx_offload_none = 0;  	int i, j;  	memset(s, 0, sizeof(*s)); @@ -199,6 +198,7 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)  		s->rx_lro_bytes	+= rq_stats->lro_bytes;  		s->rx_csum_none	+= rq_stats->csum_none;  		s->rx_csum_complete += rq_stats->csum_complete; +		s->rx_csum_unnecessary += rq_stats->csum_unnecessary;  		s->rx_csum_unnecessary_inner += rq_stats->csum_unnecessary_inner;  		s->rx_xdp_drop += rq_stats->xdp_drop;  		s->rx_xdp_tx += rq_stats->xdp_tx; @@ -229,14 +229,11 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)  			s->tx_queue_dropped	+= sq_stats->dropped;  			s->tx_xmit_more		+= sq_stats->xmit_more;  			s->tx_csum_partial_inner += sq_stats->csum_partial_inner; -			tx_offload_none		+= sq_stats->csum_none; +			s->tx_csum_none		+= sq_stats->csum_none; +			s->tx_csum_partial	+= sq_stats->csum_partial;  		}  	} -	/* Update calculated offload counters */ -	s->tx_csum_partial = s->tx_packets - tx_offload_none - s->tx_csum_partial_inner; -	s->rx_csum_unnecessary = s->rx_packets - s->rx_csum_none - s->rx_csum_complete; -  	s->link_down_events_phy = MLX5_GET(ppcnt_reg,  				priv->stats.pport.phy_counters,  				counter_set.phys_layer_cntrs.link_down_events); @@ -3333,8 +3330,8 @@ static int mlx5e_handle_feature(struct net_device *netdev,  	err = feature_handler(netdev, enable);  	if (err) { -		netdev_err(netdev, "%s feature 0x%llx failed err %d\n", -			   enable ? "Enable" : "Disable", feature, err); +		netdev_err(netdev, "%s feature %pNF failed, err %d\n", +			   enable ? "Enable" : "Disable", &feature, err);  		return err;  	} diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index f1dd638384d3..15a1687483cc 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c @@ -627,6 +627,7 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,  	if (lro) {  		skb->ip_summed = CHECKSUM_UNNECESSARY; +		rq->stats.csum_unnecessary++;  		return;  	} @@ -644,7 +645,9 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,  			skb->csum_level = 1;  			skb->encapsulation = 1;  			rq->stats.csum_unnecessary_inner++; +			return;  		} +		rq->stats.csum_unnecessary++;  		return;  	}  csum_none: diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h index 6d199ffb1c0b..f8637213afc0 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h @@ -68,6 +68,7 @@ struct mlx5e_sw_stats {  	u64 rx_xdp_drop;  	u64 rx_xdp_tx;  	u64 rx_xdp_tx_full; +	u64 tx_csum_none;  	u64 tx_csum_partial;  	u64 tx_csum_partial_inner;  	u64 tx_queue_stopped; @@ -108,6 +109,7 @@ static const struct counter_desc sw_stats_desc[] = {  	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) },  	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx) },  	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_full) }, +	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_none) },  	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) },  	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) },  	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) }, @@ -339,6 +341,7 @@ struct mlx5e_rq_stats {  	u64 packets;  	u64 bytes;  	u64 csum_complete; +	u64 csum_unnecessary;  	u64 csum_unnecessary_inner;  	u64 csum_none;  	u64 lro_packets; @@ -363,6 +366,7 @@ static const struct counter_desc rq_stats_desc[] = {  	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) },  	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) },  	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) }, +	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary) },  	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },  	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) },  	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_drop) }, @@ -392,6 +396,7 @@ struct mlx5e_sq_stats {  	u64 tso_bytes;  	u64 tso_inner_packets;  	u64 tso_inner_bytes; +	u64 csum_partial;  	u64 csum_partial_inner;  	u64 nop;  	/* less likely accessed in data path */ @@ -408,6 +413,7 @@ static const struct counter_desc sq_stats_desc[] = {  	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },  	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },  	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) }, +	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial) },  	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },  	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, nop) },  	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_none) }, diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index da503e6411da..9ba1f72060aa 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -78,9 +78,11 @@ struct mlx5e_tc_flow {  };  struct mlx5e_tc_flow_parse_attr { +	struct ip_tunnel_info tun_info;  	struct mlx5_flow_spec spec;  	int num_mod_hdr_actions;  	void *mod_hdr_actions; +	int mirred_ifindex;  };  enum { @@ -322,6 +324,12 @@ static void mlx5e_tc_del_nic_flow(struct mlx5e_priv *priv,  static void mlx5e_detach_encap(struct mlx5e_priv *priv,  			       struct mlx5e_tc_flow *flow); +static int mlx5e_attach_encap(struct mlx5e_priv *priv, +			      struct ip_tunnel_info *tun_info, +			      struct net_device *mirred_dev, +			      struct net_device **encap_dev, +			      struct mlx5e_tc_flow *flow); +  static struct mlx5_flow_handle *  mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,  		      struct mlx5e_tc_flow_parse_attr *parse_attr, @@ -329,9 +337,27 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,  {  	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;  	struct mlx5_esw_flow_attr *attr = flow->esw_attr; -	struct mlx5_flow_handle *rule; +	struct net_device *out_dev, *encap_dev = NULL; +	struct mlx5_flow_handle *rule = NULL; +	struct mlx5e_rep_priv *rpriv; +	struct mlx5e_priv *out_priv;  	int err; +	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP) { +		out_dev = __dev_get_by_index(dev_net(priv->netdev), +					     attr->parse_attr->mirred_ifindex); +		err = mlx5e_attach_encap(priv, &parse_attr->tun_info, +					 out_dev, &encap_dev, flow); +		if (err) { +			rule = ERR_PTR(err); +			if (err != -EAGAIN) +				goto err_attach_encap; +		} +		out_priv = netdev_priv(encap_dev); +		rpriv = out_priv->ppriv; +		attr->out_rep = rpriv->rep; +	} +  	err = mlx5_eswitch_add_vlan_action(esw, attr);  	if (err) {  		rule = ERR_PTR(err); @@ -347,10 +373,14 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,  		}  	} -	rule = mlx5_eswitch_add_offloaded_rule(esw, &parse_attr->spec, attr); -	if (IS_ERR(rule)) -		goto err_add_rule; - +	/* we get here if (1) there's no error (rule being null) or when +	 * (2) there's an encap action and we're on -EAGAIN (no valid neigh) +	 */ +	if (rule != ERR_PTR(-EAGAIN)) { +		rule = mlx5_eswitch_add_offloaded_rule(esw, &parse_attr->spec, attr); +		if (IS_ERR(rule)) +			goto err_add_rule; +	}  	return rule;  err_add_rule: @@ -361,6 +391,7 @@ err_mod_hdr:  err_add_vlan:  	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)  		mlx5e_detach_encap(priv, flow); +err_attach_encap:  	return rule;  } @@ -389,6 +420,8 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,  void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,  			      struct mlx5e_encap_entry *e)  { +	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; +	struct mlx5_esw_flow_attr *esw_attr;  	struct mlx5e_tc_flow *flow;  	int err; @@ -404,10 +437,9 @@ void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,  	mlx5e_rep_queue_neigh_stats_work(priv);  	list_for_each_entry(flow, &e->flows, encap) { -		flow->esw_attr->encap_id = e->encap_id; -		flow->rule = mlx5e_tc_add_fdb_flow(priv, -						   flow->esw_attr->parse_attr, -						   flow); +		esw_attr = flow->esw_attr; +		esw_attr->encap_id = e->encap_id; +		flow->rule = mlx5_eswitch_add_offloaded_rule(esw, &esw_attr->parse_attr->spec, esw_attr);  		if (IS_ERR(flow->rule)) {  			err = PTR_ERR(flow->rule);  			mlx5_core_warn(priv->mdev, "Failed to update cached encapsulation flow, %d\n", @@ -421,15 +453,13 @@ void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,  void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv,  			      struct mlx5e_encap_entry *e)  { +	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;  	struct mlx5e_tc_flow *flow; -	struct mlx5_fc *counter;  	list_for_each_entry(flow, &e->flows, encap) {  		if (flow->flags & MLX5E_TC_FLOW_OFFLOADED) {  			flow->flags &= ~MLX5E_TC_FLOW_OFFLOADED; -			counter = mlx5_flow_rule_counter(flow->rule); -			mlx5_del_flow_rules(flow->rule); -			mlx5_fc_destroy(priv->mdev, counter); +			mlx5_eswitch_del_offloaded_rule(esw, flow->rule, flow->esw_attr);  		}  	} @@ -1317,6 +1347,69 @@ static bool csum_offload_supported(struct mlx5e_priv *priv, u32 action, u32 upda  	return true;  } +static bool modify_header_match_supported(struct mlx5_flow_spec *spec, +					  struct tcf_exts *exts) +{ +	const struct tc_action *a; +	bool modify_ip_header; +	LIST_HEAD(actions); +	u8 htype, ip_proto; +	void *headers_v; +	u16 ethertype; +	int nkeys, i; + +	headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, outer_headers); +	ethertype = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ethertype); + +	/* for non-IP we only re-write MACs, so we're okay */ +	if (ethertype != ETH_P_IP && ethertype != ETH_P_IPV6) +		goto out_ok; + +	modify_ip_header = false; +	tcf_exts_to_list(exts, &actions); +	list_for_each_entry(a, &actions, list) { +		if (!is_tcf_pedit(a)) +			continue; + +		nkeys = tcf_pedit_nkeys(a); +		for (i = 0; i < nkeys; i++) { +			htype = tcf_pedit_htype(a, i); +			if (htype == TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 || +			    htype == TCA_PEDIT_KEY_EX_HDR_TYPE_IP6) { +				modify_ip_header = true; +				break; +			} +		} +	} + +	ip_proto = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ip_protocol); +	if (modify_ip_header && ip_proto != IPPROTO_TCP && ip_proto != IPPROTO_UDP) { +		pr_info("can't offload re-write of ip proto %d\n", ip_proto); +		return false; +	} + +out_ok: +	return true; +} + +static bool actions_match_supported(struct mlx5e_priv *priv, +				    struct tcf_exts *exts, +				    struct mlx5e_tc_flow_parse_attr *parse_attr, +				    struct mlx5e_tc_flow *flow) +{ +	u32 actions; + +	if (flow->flags & MLX5E_TC_FLOW_ESWITCH) +		actions = flow->esw_attr->action; +	else +		actions = flow->nic_attr->action; + +	if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) +		return modify_header_match_supported(&parse_attr->spec, exts); + +	return true; +} +  static int parse_tc_nic_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,  				struct mlx5e_tc_flow_parse_attr *parse_attr,  				struct mlx5e_tc_flow *flow) @@ -1378,6 +1471,9 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,  		return -EINVAL;  	} +	if (!actions_match_supported(priv, exts, parse_attr, flow)) +		return -EOPNOTSUPP; +  	return 0;  } @@ -1564,7 +1660,7 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,  		break;  	default:  		err = -EOPNOTSUPP; -		goto out; +		goto free_encap;  	}  	fl4.flowi4_tos = tun_key->tos;  	fl4.daddr = tun_key->u.ipv4.dst; @@ -1573,7 +1669,7 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,  	err = mlx5e_route_lookup_ipv4(priv, mirred_dev, &out_dev,  				      &fl4, &n, &ttl);  	if (err) -		goto out; +		goto free_encap;  	/* used by mlx5e_detach_encap to lookup a neigh hash table  	 * entry in the neigh hash table when a user deletes a rule @@ -1590,7 +1686,7 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,  	 */  	err = mlx5e_rep_encap_entry_attach(netdev_priv(out_dev), e);  	if (err) -		goto out; +		goto free_encap;  	read_lock_bh(&n->lock);  	nud_state = n->nud_state; @@ -1630,8 +1726,9 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,  destroy_neigh_entry:  	mlx5e_rep_encap_entry_detach(netdev_priv(e->out_dev), e); -out: +free_encap:  	kfree(encap_header); +out:  	if (n)  		neigh_release(n);  	return err; @@ -1668,7 +1765,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,  		break;  	default:  		err = -EOPNOTSUPP; -		goto out; +		goto free_encap;  	}  	fl6.flowlabel = ip6_make_flowinfo(RT_TOS(tun_key->tos), tun_key->label); @@ -1678,7 +1775,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,  	err = mlx5e_route_lookup_ipv6(priv, mirred_dev, &out_dev,  				      &fl6, &n, &ttl);  	if (err) -		goto out; +		goto free_encap;  	/* used by mlx5e_detach_encap to lookup a neigh hash table  	 * entry in the neigh hash table when a user deletes a rule @@ -1695,7 +1792,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,  	 */  	err = mlx5e_rep_encap_entry_attach(netdev_priv(out_dev), e);  	if (err) -		goto out; +		goto free_encap;  	read_lock_bh(&n->lock);  	nud_state = n->nud_state; @@ -1736,8 +1833,9 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,  destroy_neigh_entry:  	mlx5e_rep_encap_entry_detach(netdev_priv(e->out_dev), e); -out: +free_encap:  	kfree(encap_header); +out:  	if (n)  		neigh_release(n);  	return err; @@ -1791,6 +1889,7 @@ vxlan_encap_offload_err:  		}  	} +	/* must verify if encap is valid or not */  	if (found)  		goto attach_flow; @@ -1817,6 +1916,8 @@ attach_flow:  	*encap_dev = e->out_dev;  	if (e->flags & MLX5_ENCAP_ENTRY_VALID)  		attr->encap_id = e->encap_id; +	else +		err = -EAGAIN;  	return err; @@ -1871,7 +1972,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,  		if (is_tcf_mirred_egress_redirect(a)) {  			int ifindex = tcf_mirred_ifindex(a); -			struct net_device *out_dev, *encap_dev = NULL; +			struct net_device *out_dev;  			struct mlx5e_priv *out_priv;  			out_dev = __dev_get_by_index(dev_net(priv->netdev), ifindex); @@ -1884,17 +1985,13 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,  				rpriv = out_priv->ppriv;  				attr->out_rep = rpriv->rep;  			} else if (encap) { -				err = mlx5e_attach_encap(priv, info, -							 out_dev, &encap_dev, flow); -				if (err && err != -EAGAIN) -					return err; +				parse_attr->mirred_ifindex = ifindex; +				parse_attr->tun_info = *info; +				attr->parse_attr = parse_attr;  				attr->action |= MLX5_FLOW_CONTEXT_ACTION_ENCAP |  					MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |  					MLX5_FLOW_CONTEXT_ACTION_COUNT; -				out_priv = netdev_priv(encap_dev); -				rpriv = out_priv->ppriv; -				attr->out_rep = rpriv->rep; -				attr->parse_attr = parse_attr; +				/* attr->out_rep is resolved when we handle encap */  			} else {  				pr_err("devices %s %s not on same switch HW, can't offload forwarding\n",  				       priv->netdev->name, out_dev->name); @@ -1934,6 +2031,10 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,  		return -EINVAL;  	} + +	if (!actions_match_supported(priv, exts, parse_attr, flow)) +		return -EOPNOTSUPP; +  	return err;  } @@ -1972,7 +2073,7 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv,  	if (flow->flags & MLX5E_TC_FLOW_ESWITCH) {  		err = parse_tc_fdb_actions(priv, f->exts, parse_attr, flow);  		if (err < 0) -			goto err_handle_encap_flow; +			goto err_free;  		flow->rule = mlx5e_tc_add_fdb_flow(priv, parse_attr, flow);  	} else {  		err = parse_tc_nic_actions(priv, f->exts, parse_attr, flow); @@ -1983,10 +2084,13 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv,  	if (IS_ERR(flow->rule)) {  		err = PTR_ERR(flow->rule); -		goto err_free; +		if (err != -EAGAIN) +			goto err_free;  	} -	flow->flags |= MLX5E_TC_FLOW_OFFLOADED; +	if (err != -EAGAIN) +		flow->flags |= MLX5E_TC_FLOW_OFFLOADED; +  	err = rhashtable_insert_fast(&tc->ht, &flow->node,  				     tc->ht_params);  	if (err) @@ -2000,16 +2104,6 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv,  err_del_rule:  	mlx5e_tc_del_flow(priv, flow); -err_handle_encap_flow: -	if (err == -EAGAIN) { -		err = rhashtable_insert_fast(&tc->ht, &flow->node, -					     tc->ht_params); -		if (err) -			mlx5e_tc_del_flow(priv, flow); -		else -			return 0; -	} -  err_free:  	kvfree(parse_attr);  	kfree(flow); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c index fee43e40fa16..1d6925d4369a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c @@ -193,6 +193,7 @@ mlx5e_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb, struct  			sq->stats.csum_partial_inner++;  		} else {  			eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM; +			sq->stats.csum_partial++;  		}  	} else  		sq->stats.csum_none++; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c index e37453d838db..c0fd2212e890 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c @@ -71,11 +71,11 @@ int mlx5_fpga_access_reg(struct mlx5_core_dev *dev, u8 size, u64 addr,  	return 0;  } -int mlx5_fpga_caps(struct mlx5_core_dev *dev, u32 *caps) +int mlx5_fpga_caps(struct mlx5_core_dev *dev)  {  	u32 in[MLX5_ST_SZ_DW(fpga_cap)] = {0}; -	return mlx5_core_access_reg(dev, in, sizeof(in), caps, +	return mlx5_core_access_reg(dev, in, sizeof(in), dev->caps.fpga,  				    MLX5_ST_SZ_BYTES(fpga_cap),  				    MLX5_REG_FPGA_CAP, 0, 0);  } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h b/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h index 94bdfd47c3f0..d05233c9b4f6 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h @@ -65,7 +65,7 @@ struct mlx5_fpga_qp_counters {  	u64 rx_total_drop;  }; -int mlx5_fpga_caps(struct mlx5_core_dev *dev, u32 *caps); +int mlx5_fpga_caps(struct mlx5_core_dev *dev);  int mlx5_fpga_query(struct mlx5_core_dev *dev, struct mlx5_fpga_query *query);  int mlx5_fpga_ctrl_op(struct mlx5_core_dev *dev, u8 op);  int mlx5_fpga_access_reg(struct mlx5_core_dev *dev, u8 size, u64 addr, diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c b/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c index 9034e9960a76..dc8970346521 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c @@ -139,8 +139,7 @@ int mlx5_fpga_device_start(struct mlx5_core_dev *mdev)  	if (err)  		goto out; -	err = mlx5_fpga_caps(fdev->mdev, -			     fdev->mdev->caps.hca_cur[MLX5_CAP_FPGA]); +	err = mlx5_fpga_caps(fdev->mdev);  	if (err)  		goto out; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c index e0d0efd903bc..36ecc2b2e187 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c @@ -293,6 +293,9 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,  	}  	if (fte->action & MLX5_FLOW_CONTEXT_ACTION_COUNT) { +		int max_list_size = BIT(MLX5_CAP_FLOWTABLE_TYPE(dev, +					log_max_flow_counter, +					ft->type));  		int list_size = 0;  		list_for_each_entry(dst, &fte->node.children, node.list) { @@ -305,12 +308,17 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,  			in_dests += MLX5_ST_SZ_BYTES(dest_format_struct);  			list_size++;  		} +		if (list_size > max_list_size) { +			err = -EINVAL; +			goto err_out; +		}  		MLX5_SET(flow_context, in_flow_context, flow_counter_list_size,  			 list_size);  	}  	err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out)); +err_out:  	kvfree(in);  	return err;  } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h index 5509a752f98e..48dd78975062 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h @@ -52,6 +52,7 @@ enum fs_flow_table_type {  	FS_FT_FDB             = 0X4,  	FS_FT_SNIFFER_RX	= 0X5,  	FS_FT_SNIFFER_TX	= 0X6, +	FS_FT_MAX_TYPE = FS_FT_SNIFFER_TX,  };  enum fs_flow_table_op_mod { @@ -260,4 +261,14 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev);  #define fs_for_each_dst(pos, fte)			\  	fs_list_for_each_entry(pos, &(fte)->node.children) +#define MLX5_CAP_FLOWTABLE_TYPE(mdev, cap, type) (		\ +	(type == FS_FT_NIC_RX) ? MLX5_CAP_FLOWTABLE_NIC_RX(mdev, cap) :		\ +	(type == FS_FT_ESW_EGRESS_ACL) ? MLX5_CAP_ESW_EGRESS_ACL(mdev, cap) :		\ +	(type == FS_FT_ESW_INGRESS_ACL) ? MLX5_CAP_ESW_INGRESS_ACL(mdev, cap) :		\ +	(type == FS_FT_FDB) ? MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, cap) :		\ +	(type == FS_FT_SNIFFER_RX) ? MLX5_CAP_FLOWTABLE_SNIFFER_RX(mdev, cap) :		\ +	(type == FS_FT_SNIFFER_TX) ? MLX5_CAP_FLOWTABLE_SNIFFER_TX(mdev, cap) :		\ +	(BUILD_BUG_ON_ZERO(FS_FT_SNIFFER_TX != FS_FT_MAX_TYPE))\ +	) +  #endif diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c index 8aea0a065e56..db86e1506c8b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/health.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c @@ -356,10 +356,11 @@ void mlx5_drain_health_wq(struct mlx5_core_dev *dev)  void mlx5_drain_health_recovery(struct mlx5_core_dev *dev)  {  	struct mlx5_core_health *health = &dev->priv.health; +	unsigned long flags; -	spin_lock(&health->wq_lock); +	spin_lock_irqsave(&health->wq_lock, flags);  	set_bit(MLX5_DROP_NEW_RECOVERY_WORK, &health->flags); -	spin_unlock(&health->wq_lock); +	spin_unlock_irqrestore(&health->wq_lock, flags);  	cancel_delayed_work_sync(&dev->priv.health.recover_work);  } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c index 85298051a3e4..145e392ab849 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c @@ -572,12 +572,13 @@ void mlx5_rdma_netdev_free(struct net_device *netdev)  {  	struct mlx5e_priv          *priv    = mlx5i_epriv(netdev);  	const struct mlx5e_profile *profile = priv->profile; +	struct mlx5_core_dev       *mdev    = priv->mdev;  	mlx5e_detach_netdev(priv);  	profile->cleanup(priv);  	destroy_workqueue(priv->wq);  	free_netdev(netdev); -	mlx5e_destroy_mdev_resources(priv->mdev); +	mlx5e_destroy_mdev_resources(mdev);  }  EXPORT_SYMBOL(mlx5_rdma_netdev_free); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/port.c b/drivers/net/ethernet/mellanox/mlx5/core/port.c index 1975d4388d4f..e07061f565d6 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/port.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/port.c @@ -677,6 +677,27 @@ int mlx5_set_port_tc_group(struct mlx5_core_dev *mdev, u8 *tc_group)  }  EXPORT_SYMBOL_GPL(mlx5_set_port_tc_group); +int mlx5_query_port_tc_group(struct mlx5_core_dev *mdev, +			     u8 tc, u8 *tc_group) +{ +	u32 out[MLX5_ST_SZ_DW(qetc_reg)]; +	void *ets_tcn_conf; +	int err; + +	err = mlx5_query_port_qetcr_reg(mdev, out, sizeof(out)); +	if (err) +		return err; + +	ets_tcn_conf = MLX5_ADDR_OF(qetc_reg, out, +				    tc_configuration[tc]); + +	*tc_group = MLX5_GET(ets_tcn_config_reg, ets_tcn_conf, +			     group); + +	return 0; +} +EXPORT_SYMBOL_GPL(mlx5_query_port_tc_group); +  int mlx5_set_port_tc_bw_alloc(struct mlx5_core_dev *mdev, u8 *tc_bw)  {  	u32 in[MLX5_ST_SZ_DW(qetc_reg)] = {0}; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/sriov.c b/drivers/net/ethernet/mellanox/mlx5/core/sriov.c index 6c48e9959b65..2a8b529ce6dd 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/sriov.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/sriov.c @@ -109,7 +109,7 @@ static int mlx5_device_enable_sriov(struct mlx5_core_dev *dev, int num_vfs)  				mlx5_core_warn(dev,  					       "failed to restore VF %d settings, err %d\n",  					       vf, err); -			continue; +				continue;  			}  		}  		mlx5_core_dbg(dev, "successfully enabled VF* %d\n", vf); diff --git a/drivers/net/ethernet/mellanox/mlxsw/Makefile b/drivers/net/ethernet/mellanox/mlxsw/Makefile index 891ff418bb5e..9a5a1cc877b6 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/Makefile +++ b/drivers/net/ethernet/mellanox/mlxsw/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_MLXSW_CORE)	+= mlxsw_core.o  mlxsw_core-objs			:= core.o core_acl_flex_keys.o \  				   core_acl_flex_actions.o diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c index 9d5e7cf288be..f3315bc874ad 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c @@ -96,6 +96,7 @@ struct mlxsw_core {  	const struct mlxsw_bus *bus;  	void *bus_priv;  	const struct mlxsw_bus_info *bus_info; +	struct workqueue_struct *emad_wq;  	struct list_head rx_listener_list;  	struct list_head event_listener_list;  	struct { @@ -465,7 +466,7 @@ static void mlxsw_emad_trans_timeout_schedule(struct mlxsw_reg_trans *trans)  {  	unsigned long timeout = msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_MS); -	mlxsw_core_schedule_dw(&trans->timeout_dw, timeout); +	queue_delayed_work(trans->core->emad_wq, &trans->timeout_dw, timeout);  }  static int mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core, @@ -587,12 +588,18 @@ static const struct mlxsw_listener mlxsw_emad_rx_listener =  static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)  { +	struct workqueue_struct *emad_wq;  	u64 tid;  	int err;  	if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX))  		return 0; +	emad_wq = alloc_workqueue("mlxsw_core_emad", WQ_MEM_RECLAIM, 0); +	if (!emad_wq) +		return -ENOMEM; +	mlxsw_core->emad_wq = emad_wq; +  	/* Set the upper 32 bits of the transaction ID field to a random  	 * number. This allows us to discard EMADs addressed to other  	 * devices. @@ -619,6 +626,7 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)  err_emad_trap_set:  	mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,  				   mlxsw_core); +	destroy_workqueue(mlxsw_core->emad_wq);  	return err;  } @@ -631,6 +639,7 @@ static void mlxsw_emad_fini(struct mlxsw_core *mlxsw_core)  	mlxsw_core->emad.use_emad = false;  	mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,  				   mlxsw_core); +	destroy_workqueue(mlxsw_core->emad_wq);  }  static struct sk_buff *mlxsw_emad_alloc(const struct mlxsw_core *mlxsw_core, diff --git a/drivers/net/ethernet/mellanox/mlxsw/i2c.c b/drivers/net/ethernet/mellanox/mlxsw/i2c.c index 12c3a4449120..c0dcfa05b077 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/i2c.c +++ b/drivers/net/ethernet/mellanox/mlxsw/i2c.c @@ -294,7 +294,7 @@ mlxsw_i2c_write(struct device *dev, size_t in_mbox_size, u8 *in_mbox, int num,  		write_tran.len = MLXSW_I2C_ADDR_WIDTH + chunk_size;  		mlxsw_i2c_set_slave_addr(tran_buf, off);  		memcpy(&tran_buf[MLXSW_I2C_ADDR_BUF_SIZE], in_mbox + -		       chunk_size * i, chunk_size); +		       MLXSW_I2C_BLK_MAX * i, chunk_size);  		j = 0;  		end = jiffies + timeout; diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h index cc27c5de5a1d..5acfbe5b8b9d 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/reg.h +++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h @@ -5827,6 +5827,29 @@ MLXSW_ITEM32(reg, mtmp, mtr, 0x08, 30, 1);   */  MLXSW_ITEM32(reg, mtmp, max_temperature, 0x08, 0, 16); +/* reg_mtmp_tee + * Temperature Event Enable. + * 0 - Do not generate event + * 1 - Generate event + * 2 - Generate single event + * Access: RW + */ +MLXSW_ITEM32(reg, mtmp, tee, 0x0C, 30, 2); + +#define MLXSW_REG_MTMP_THRESH_HI 0x348	/* 105 Celsius */ + +/* reg_mtmp_temperature_threshold_hi + * High threshold for Temperature Warning Event. In 0.125 Celsius. + * Access: RW + */ +MLXSW_ITEM32(reg, mtmp, temperature_threshold_hi, 0x0C, 0, 16); + +/* reg_mtmp_temperature_threshold_lo + * Low threshold for Temperature Warning Event. In 0.125 Celsius. + * Access: RW + */ +MLXSW_ITEM32(reg, mtmp, temperature_threshold_lo, 0x10, 0, 16); +  #define MLXSW_REG_MTMP_SENSOR_NAME_SIZE 8  /* reg_mtmp_sensor_name @@ -5843,6 +5866,8 @@ static inline void mlxsw_reg_mtmp_pack(char *payload, u8 sensor_index,  	mlxsw_reg_mtmp_sensor_index_set(payload, sensor_index);  	mlxsw_reg_mtmp_mte_set(payload, max_temp_enable);  	mlxsw_reg_mtmp_mtr_set(payload, max_temp_reset); +	mlxsw_reg_mtmp_temperature_threshold_hi_set(payload, +						    MLXSW_REG_MTMP_THRESH_HI);  }  static inline void mlxsw_reg_mtmp_unpack(char *payload, unsigned int *p_temp, @@ -6401,6 +6426,36 @@ static inline void mlxsw_reg_mgpc_pack(char *payload, u32 counter_index,  	mlxsw_reg_mgpc_opcode_set(payload, opcode);  } +/* TIGCR - Tunneling IPinIP General Configuration Register + * ------------------------------------------------------- + * The TIGCR register is used for setting up the IPinIP Tunnel configuration. + */ +#define MLXSW_REG_TIGCR_ID 0xA801 +#define MLXSW_REG_TIGCR_LEN 0x10 + +MLXSW_REG_DEFINE(tigcr, MLXSW_REG_TIGCR_ID, MLXSW_REG_TIGCR_LEN); + +/* reg_tigcr_ipip_ttlc + * For IPinIP Tunnel encapsulation: whether to copy the ttl from the packet + * header. + * Access: RW + */ +MLXSW_ITEM32(reg, tigcr, ttlc, 0x04, 8, 1); + +/* reg_tigcr_ipip_ttl_uc + * The TTL for IPinIP Tunnel encapsulation of unicast packets if + * reg_tigcr_ipip_ttlc is unset. + * Access: RW + */ +MLXSW_ITEM32(reg, tigcr, ttl_uc, 0x04, 0, 8); + +static inline void mlxsw_reg_tigcr_pack(char *payload, bool ttlc, u8 ttl_uc) +{ +	MLXSW_REG_ZERO(tigcr, payload); +	mlxsw_reg_tigcr_ttlc_set(payload, ttlc); +	mlxsw_reg_tigcr_ttl_uc_set(payload, ttl_uc); +} +  /* SBPR - Shared Buffer Pools Register   * -----------------------------------   * The SBPR configures and retrieves the shared buffer pools and configuration. @@ -6881,6 +6936,7 @@ static const struct mlxsw_reg_info *mlxsw_reg_infos[] = {  	MLXSW_REG(mcc),  	MLXSW_REG(mcda),  	MLXSW_REG(mgpc), +	MLXSW_REG(tigcr),  	MLXSW_REG(sbpr),  	MLXSW_REG(sbcm),  	MLXSW_REG(sbpm), diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 2cfb3f5d092d..5189022a1c8c 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -2723,6 +2723,7 @@ static void mlxsw_sp_nexthop_type_fini(struct mlxsw_sp *mlxsw_sp,  		mlxsw_sp_nexthop_rif_fini(nh);  		break;  	case MLXSW_SP_NEXTHOP_TYPE_IPIP: +		mlxsw_sp_nexthop_rif_fini(nh);  		mlxsw_sp_nexthop_ipip_fini(mlxsw_sp, nh);  		break;  	} @@ -2742,7 +2743,11 @@ static int mlxsw_sp_nexthop4_type_init(struct mlxsw_sp *mlxsw_sp,  	    router->ipip_ops_arr[ipipt]->can_offload(mlxsw_sp, dev,  						     MLXSW_SP_L3_PROTO_IPV4)) {  		nh->type = MLXSW_SP_NEXTHOP_TYPE_IPIP; -		return mlxsw_sp_nexthop_ipip_init(mlxsw_sp, ipipt, nh, dev); +		err = mlxsw_sp_nexthop_ipip_init(mlxsw_sp, ipipt, nh, dev); +		if (err) +			return err; +		mlxsw_sp_nexthop_rif_init(nh, &nh->ipip_entry->ol_lb->common); +		return 0;  	}  	nh->type = MLXSW_SP_NEXTHOP_TYPE_ETH; @@ -3500,20 +3505,6 @@ static int mlxsw_sp_fib_lpm_tree_link(struct mlxsw_sp *mlxsw_sp,  static void mlxsw_sp_fib_lpm_tree_unlink(struct mlxsw_sp *mlxsw_sp,  					 struct mlxsw_sp_fib *fib)  { -	struct mlxsw_sp_prefix_usage req_prefix_usage = {{ 0 } }; -	struct mlxsw_sp_lpm_tree *lpm_tree; - -	/* Aggregate prefix lengths across all virtual routers to make -	 * sure we only have used prefix lengths in the LPM tree. -	 */ -	mlxsw_sp_vrs_prefixes(mlxsw_sp, fib->proto, &req_prefix_usage); -	lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage, -					 fib->proto); -	if (IS_ERR(lpm_tree)) -		goto err_tree_get; -	mlxsw_sp_vrs_lpm_tree_replace(mlxsw_sp, fib, lpm_tree); - -err_tree_get:  	if (!mlxsw_sp_prefix_usage_none(&fib->prefix_usage))  		return;  	mlxsw_sp_vr_lpm_tree_unbind(mlxsw_sp, fib); @@ -4009,7 +4000,11 @@ static int mlxsw_sp_nexthop6_type_init(struct mlxsw_sp *mlxsw_sp,  	    router->ipip_ops_arr[ipipt]->can_offload(mlxsw_sp, dev,  						     MLXSW_SP_L3_PROTO_IPV6)) {  		nh->type = MLXSW_SP_NEXTHOP_TYPE_IPIP; -		return mlxsw_sp_nexthop_ipip_init(mlxsw_sp, ipipt, nh, dev); +		err = mlxsw_sp_nexthop_ipip_init(mlxsw_sp, ipipt, nh, dev); +		if (err) +			return err; +		mlxsw_sp_nexthop_rif_init(nh, &nh->ipip_entry->ol_lb->common); +		return 0;  	}  	nh->type = MLXSW_SP_NEXTHOP_TYPE_ETH; @@ -5068,6 +5063,7 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,  	vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id ? : RT_TABLE_MAIN);  	if (IS_ERR(vr))  		return ERR_CAST(vr); +	vr->rif_count++;  	err = mlxsw_sp_rif_index_alloc(mlxsw_sp, &rif_index);  	if (err) @@ -5099,7 +5095,6 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,  	mlxsw_sp_rif_counters_alloc(rif);  	mlxsw_sp->router->rifs[rif_index] = rif; -	vr->rif_count++;  	return rif; @@ -5110,6 +5105,7 @@ err_fid_get:  	kfree(rif);  err_rif_alloc:  err_rif_index_alloc: +	vr->rif_count--;  	mlxsw_sp_vr_put(vr);  	return ERR_PTR(err);  } @@ -5124,7 +5120,6 @@ void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)  	mlxsw_sp_router_rif_gone_sync(mlxsw_sp, rif);  	vr = &mlxsw_sp->router->vrs[rif->vr_id]; -	vr->rif_count--;  	mlxsw_sp->router->rifs[rif->rif_index] = NULL;  	mlxsw_sp_rif_counters_free(rif);  	ops->deconfigure(rif); @@ -5132,6 +5127,7 @@ void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)  		/* Loopback RIFs are not associated with a FID. */  		mlxsw_sp_fid_put(fid);  	kfree(rif); +	vr->rif_count--;  	mlxsw_sp_vr_put(vr);  } @@ -5900,11 +5896,20 @@ static void mlxsw_sp_rifs_fini(struct mlxsw_sp *mlxsw_sp)  	kfree(mlxsw_sp->router->rifs);  } +static int +mlxsw_sp_ipip_config_tigcr(struct mlxsw_sp *mlxsw_sp) +{ +	char tigcr_pl[MLXSW_REG_TIGCR_LEN]; + +	mlxsw_reg_tigcr_pack(tigcr_pl, true, 0); +	return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(tigcr), tigcr_pl); +} +  static int mlxsw_sp_ipips_init(struct mlxsw_sp *mlxsw_sp)  {  	mlxsw_sp->router->ipip_ops_arr = mlxsw_sp_ipip_ops_arr;  	INIT_LIST_HEAD(&mlxsw_sp->router->ipip_list); -	return 0; +	return mlxsw_sp_ipip_config_tigcr(mlxsw_sp);  }  static void mlxsw_sp_ipips_fini(struct mlxsw_sp *mlxsw_sp) diff --git a/drivers/net/ethernet/micrel/Makefile b/drivers/net/ethernet/micrel/Makefile index c83e4bc50c73..848fc1c5a5dc 100644 --- a/drivers/net/ethernet/micrel/Makefile +++ b/drivers/net/ethernet/micrel/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Micrel network device drivers.  # diff --git a/drivers/net/ethernet/micrel/ks8695net.h b/drivers/net/ethernet/micrel/ks8695net.h index 80eff6ea5163..b18fad4ad5fd 100644 --- a/drivers/net/ethernet/micrel/ks8695net.h +++ b/drivers/net/ethernet/micrel/ks8695net.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Micrel KS8695 (Centaur) Ethernet.   * diff --git a/drivers/net/ethernet/microchip/enc28j60_hw.h b/drivers/net/ethernet/microchip/enc28j60_hw.h index 25b41de49f0e..da4ab172527d 100644 --- a/drivers/net/ethernet/microchip/enc28j60_hw.h +++ b/drivers/net/ethernet/microchip/enc28j60_hw.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * enc28j60_hw.h: EDTP FrameThrower style enc28j60 registers   * diff --git a/drivers/net/ethernet/microchip/encx24j600_hw.h b/drivers/net/ethernet/microchip/encx24j600_hw.h index 4be73d5553f8..f604a260ede7 100644 --- a/drivers/net/ethernet/microchip/encx24j600_hw.h +++ b/drivers/net/ethernet/microchip/encx24j600_hw.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /**   * encx24j600_hw.h: Register definitions   * diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp.h b/drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp.h index b7fc26c4f738..cf73810608a2 100644 --- a/drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp.h +++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __MYRI10GE_MCP_H__  #define __MYRI10GE_MCP_H__ diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp_gen_header.h b/drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp_gen_header.h index 75ec5e7cf50d..95a0095a4a75 100644 --- a/drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp_gen_header.h +++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp_gen_header.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __MYRI10GE_MCP_GEN_HEADER_H__  #define __MYRI10GE_MCP_GEN_HEADER_H__ diff --git a/drivers/net/ethernet/natsemi/Makefile b/drivers/net/ethernet/natsemi/Makefile index 764c532a96d1..cc664977596e 100644 --- a/drivers/net/ethernet/natsemi/Makefile +++ b/drivers/net/ethernet/natsemi/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the National Semi-conductor Sonic devices.  # diff --git a/drivers/net/ethernet/natsemi/jazzsonic.c b/drivers/net/ethernet/natsemi/jazzsonic.c index a6caeb567c0d..d5b28884e21e 100644 --- a/drivers/net/ethernet/natsemi/jazzsonic.c +++ b/drivers/net/ethernet/natsemi/jazzsonic.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * jazzsonic.c   * diff --git a/drivers/net/ethernet/natsemi/macsonic.c b/drivers/net/ethernet/natsemi/macsonic.c index 3ca6ae7caf55..a42433fb6949 100644 --- a/drivers/net/ethernet/natsemi/macsonic.c +++ b/drivers/net/ethernet/natsemi/macsonic.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * macsonic.c   * diff --git a/drivers/net/ethernet/natsemi/sonic.h b/drivers/net/ethernet/natsemi/sonic.h index 7b0a8db57af9..421b1a283fed 100644 --- a/drivers/net/ethernet/natsemi/sonic.h +++ b/drivers/net/ethernet/natsemi/sonic.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Header file for sonic.c   * diff --git a/drivers/net/ethernet/natsemi/xtsonic.c b/drivers/net/ethernet/natsemi/xtsonic.c index 9ee0f69a83c0..1817deea98a4 100644 --- a/drivers/net/ethernet/natsemi/xtsonic.c +++ b/drivers/net/ethernet/natsemi/xtsonic.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * xtsonic.c   * diff --git a/drivers/net/ethernet/netronome/nfp/Makefile b/drivers/net/ethernet/netronome/nfp/Makefile index 96e579a15cbe..3cafa3d15082 100644 --- a/drivers/net/ethernet/netronome/nfp/Makefile +++ b/drivers/net/ethernet/netronome/nfp/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_NFP)	+= nfp.o  nfp-objs := \ diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c b/drivers/net/ethernet/netronome/nfp/flower/action.c index db9750695dc7..8ea9320014ee 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/action.c +++ b/drivers/net/ethernet/netronome/nfp/flower/action.c @@ -110,6 +110,8 @@ nfp_fl_output(struct nfp_fl_output *output, const struct tc_action *action,  	 */  	if (!switchdev_port_same_parent_id(in_dev, out_dev))  		return -EOPNOTSUPP; +	if (!nfp_netdev_is_nfp_repr(out_dev)) +		return -EOPNOTSUPP;  	output->port = cpu_to_be32(nfp_repr_get_port_id(out_dev));  	if (!output->port) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 1c0187f0af51..e118b5f23996 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -1180,10 +1180,14 @@ static void *nfp_net_rx_alloc_one(struct nfp_net_dp *dp, dma_addr_t *dma_addr)  {  	void *frag; -	if (!dp->xdp_prog) +	if (!dp->xdp_prog) {  		frag = netdev_alloc_frag(dp->fl_bufsz); -	else -		frag = page_address(alloc_page(GFP_KERNEL | __GFP_COLD)); +	} else { +		struct page *page; + +		page = alloc_page(GFP_KERNEL | __GFP_COLD); +		frag = page ? page_address(page) : NULL; +	}  	if (!frag) {  		nn_dp_warn(dp, "Failed to alloc receive page frag\n");  		return NULL; @@ -1203,10 +1207,14 @@ static void *nfp_net_napi_alloc_one(struct nfp_net_dp *dp, dma_addr_t *dma_addr)  {  	void *frag; -	if (!dp->xdp_prog) +	if (!dp->xdp_prog) {  		frag = napi_alloc_frag(dp->fl_bufsz); -	else -		frag = page_address(alloc_page(GFP_ATOMIC | __GFP_COLD)); +	} else { +		struct page *page; + +		page = alloc_page(GFP_ATOMIC | __GFP_COLD); +		frag = page ? page_address(page) : NULL; +	}  	if (!frag) {  		nn_dp_warn(dp, "Failed to alloc receive page frag\n");  		return NULL; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c index 07969f06df10..dc016dfec64d 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c @@ -464,7 +464,7 @@ static u64 *nfp_vnic_get_sw_stats(struct net_device *netdev, u64 *data)  		do {  			start = u64_stats_fetch_begin(&nn->r_vecs[i].rx_sync); -			*data++ = nn->r_vecs[i].rx_pkts; +			data[0] = nn->r_vecs[i].rx_pkts;  			tmp[0] = nn->r_vecs[i].hw_csum_rx_ok;  			tmp[1] = nn->r_vecs[i].hw_csum_rx_inner_ok;  			tmp[2] = nn->r_vecs[i].hw_csum_rx_error; @@ -472,14 +472,16 @@ static u64 *nfp_vnic_get_sw_stats(struct net_device *netdev, u64 *data)  		do {  			start = u64_stats_fetch_begin(&nn->r_vecs[i].tx_sync); -			*data++ = nn->r_vecs[i].tx_pkts; -			*data++ = nn->r_vecs[i].tx_busy; +			data[1] = nn->r_vecs[i].tx_pkts; +			data[2] = nn->r_vecs[i].tx_busy;  			tmp[3] = nn->r_vecs[i].hw_csum_tx;  			tmp[4] = nn->r_vecs[i].hw_csum_tx_inner;  			tmp[5] = nn->r_vecs[i].tx_gather;  			tmp[6] = nn->r_vecs[i].tx_lso;  		} while (u64_stats_fetch_retry(&nn->r_vecs[i].tx_sync, start)); +		data += 3; +  		for (j = 0; j < NN_ET_RVEC_GATHER_STATS; j++)  			gathered_stats[j] += tmp[j];  	} diff --git a/drivers/net/ethernet/qlogic/Makefile b/drivers/net/ethernet/qlogic/Makefile index cee90e05beb8..6cd2e333a5fc 100644 --- a/drivers/net/ethernet/qlogic/Makefile +++ b/drivers/net/ethernet/qlogic/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the QLogic network device drivers.  # diff --git a/drivers/net/ethernet/qlogic/qed/Makefile b/drivers/net/ethernet/qlogic/qed/Makefile index 82dd47068e18..82a0b90185df 100644 --- a/drivers/net/ethernet/qlogic/qed/Makefile +++ b/drivers/net/ethernet/qlogic/qed/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_QED) := qed.o  qed-y := qed_cxt.o qed_dev.o qed_hw.o qed_init_fw_funcs.o qed_init_ops.o \ diff --git a/drivers/net/ethernet/qlogic/qed/qed_selftest.h b/drivers/net/ethernet/qlogic/qed/qed_selftest.h index 739ddb730967..ad00d082fec8 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_selftest.h +++ b/drivers/net/ethernet/qlogic/qed/qed_selftest.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _QED_SELFTEST_API_H  #define _QED_SELFTEST_API_H  #include <linux/types.h> diff --git a/drivers/net/ethernet/qlogic/qlcnic/Makefile b/drivers/net/ethernet/qlogic/qlcnic/Makefile index 3c2c2c7c1559..dbaeab344667 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/Makefile +++ b/drivers/net/ethernet/qlogic/qlcnic/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for Qlogic 1G/10G Ethernet Driver for CNA devices  # diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c b/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c index fe2599b83d09..31389ab8bdf7 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt  #include <linux/slab.h> diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c b/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c index 31f40148fa5c..5edbd532127d 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/module.h> diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_mpi.c b/drivers/net/ethernet/qlogic/qlge/qlge_mpi.c index 7ad146080c36..384c8bc874f3 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_mpi.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_mpi.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include "qlge.h"  int ql_unpause_mpi_risc(struct ql_adapter *qdev) diff --git a/drivers/net/ethernet/qualcomm/Makefile b/drivers/net/ethernet/qualcomm/Makefile index 1847350f48a7..9250976dd884 100644 --- a/drivers/net/ethernet/qualcomm/Makefile +++ b/drivers/net/ethernet/qualcomm/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Qualcomm network device drivers.  # diff --git a/drivers/net/ethernet/qualcomm/emac/emac-ethtool.c b/drivers/net/ethernet/qualcomm/emac/emac-ethtool.c index bbe24639aa5a..c8c6231b87f3 100644 --- a/drivers/net/ethernet/qualcomm/emac/emac-ethtool.c +++ b/drivers/net/ethernet/qualcomm/emac/emac-ethtool.c @@ -88,6 +88,8 @@ static void emac_set_msglevel(struct net_device *netdev, u32 data)  static int emac_get_sset_count(struct net_device *netdev, int sset)  {  	switch (sset) { +	case ETH_SS_PRIV_FLAGS: +		return 1;  	case ETH_SS_STATS:  		return EMAC_STATS_LEN;  	default: @@ -100,6 +102,10 @@ static void emac_get_strings(struct net_device *netdev, u32 stringset, u8 *data)  	unsigned int i;  	switch (stringset) { +	case ETH_SS_PRIV_FLAGS: +		strcpy(data, "single-pause-mode"); +		break; +  	case ETH_SS_STATS:  		for (i = 0; i < EMAC_STATS_LEN; i++) {  			strlcpy(data, emac_ethtool_stat_strings[i], @@ -230,6 +236,27 @@ static int emac_get_regs_len(struct net_device *netdev)  	return EMAC_MAX_REG_SIZE * sizeof(u32);  } +#define EMAC_PRIV_ENABLE_SINGLE_PAUSE	BIT(0) + +static int emac_set_priv_flags(struct net_device *netdev, u32 flags) +{ +	struct emac_adapter *adpt = netdev_priv(netdev); + +	adpt->single_pause_mode = !!(flags & EMAC_PRIV_ENABLE_SINGLE_PAUSE); + +	if (netif_running(netdev)) +		return emac_reinit_locked(adpt); + +	return 0; +} + +static u32 emac_get_priv_flags(struct net_device *netdev) +{ +	struct emac_adapter *adpt = netdev_priv(netdev); + +	return adpt->single_pause_mode ? EMAC_PRIV_ENABLE_SINGLE_PAUSE : 0; +} +  static const struct ethtool_ops emac_ethtool_ops = {  	.get_link_ksettings = phy_ethtool_get_link_ksettings,  	.set_link_ksettings = phy_ethtool_set_link_ksettings, @@ -253,6 +280,9 @@ static const struct ethtool_ops emac_ethtool_ops = {  	.get_regs_len    = emac_get_regs_len,  	.get_regs        = emac_get_regs, + +	.set_priv_flags = emac_set_priv_flags, +	.get_priv_flags = emac_get_priv_flags,  };  void emac_set_ethtool_ops(struct net_device *netdev) diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.c b/drivers/net/ethernet/qualcomm/emac/emac-mac.c index bcd4708b3745..3ed9033e56db 100644 --- a/drivers/net/ethernet/qualcomm/emac/emac-mac.c +++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.c @@ -551,6 +551,28 @@ static void emac_mac_start(struct emac_adapter *adpt)  	mac &= ~(HUGEN | VLAN_STRIP | TPAUSE | SIMR | HUGE | MULTI_ALL |  		 DEBUG_MODE | SINGLE_PAUSE_MODE); +	/* Enable single-pause-frame mode if requested. +	 * +	 * If enabled, the EMAC will send a single pause frame when the RX +	 * queue is full.  This normally leads to packet loss because +	 * the pause frame disables the remote MAC only for 33ms (the quanta), +	 * and then the remote MAC continues sending packets even though +	 * the RX queue is still full. +	 * +	 * If disabled, the EMAC sends a pause frame every 31ms until the RX +	 * queue is no longer full.  Normally, this is the preferred +	 * method of operation.  However, when the system is hung (e.g. +	 * cores are halted), the EMAC interrupt handler is never called +	 * and so the RX queue fills up quickly and stays full.  The resuling +	 * non-stop "flood" of pause frames sometimes has the effect of +	 * disabling nearby switches.  In some cases, other nearby switches +	 * are also affected, shutting down the entire network. +	 * +	 * The user can enable or disable single-pause-frame mode +	 * via ethtool. +	 */ +	mac |= adpt->single_pause_mode ? SINGLE_PAUSE_MODE : 0; +  	writel_relaxed(csr1, adpt->csr + EMAC_EMAC_WRAPPER_CSR1);  	writel_relaxed(mac, adpt->base + EMAC_MAC_CTRL); @@ -876,7 +898,8 @@ static void emac_mac_rx_descs_refill(struct emac_adapter *adpt,  		curr_rxbuf->dma_addr =  			dma_map_single(adpt->netdev->dev.parent, skb->data, -				       curr_rxbuf->length, DMA_FROM_DEVICE); +				       adpt->rxbuf_size, DMA_FROM_DEVICE); +  		ret = dma_mapping_error(adpt->netdev->dev.parent,  					curr_rxbuf->dma_addr);  		if (ret) { diff --git a/drivers/net/ethernet/qualcomm/emac/emac.c b/drivers/net/ethernet/qualcomm/emac/emac.c index 60850bfa3d32..759543512117 100644 --- a/drivers/net/ethernet/qualcomm/emac/emac.c +++ b/drivers/net/ethernet/qualcomm/emac/emac.c @@ -443,6 +443,9 @@ static void emac_init_adapter(struct emac_adapter *adpt)  	/* default to automatic flow control */  	adpt->automatic = true; + +	/* Disable single-pause-frame mode by default */ +	adpt->single_pause_mode = false;  }  /* Get the clock */ diff --git a/drivers/net/ethernet/qualcomm/emac/emac.h b/drivers/net/ethernet/qualcomm/emac/emac.h index 8ee4ec6aef2e..d7c9f44209d4 100644 --- a/drivers/net/ethernet/qualcomm/emac/emac.h +++ b/drivers/net/ethernet/qualcomm/emac/emac.h @@ -363,6 +363,9 @@ struct emac_adapter {  	bool				tx_flow_control;  	bool				rx_flow_control; +	/* True == use single-pause-frame mode. */ +	bool				single_pause_mode; +  	/* Ring parameter */  	u8				tpd_burst;  	u8				rfd_burst; diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index 98f22551eb45..1e33aea59f50 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -51,10 +51,7 @@ struct rmnet_walk_data {  static int rmnet_is_real_dev_registered(const struct net_device *real_dev)  { -	rx_handler_func_t *rx_handler; - -	rx_handler = rcu_dereference(real_dev->rx_handler); -	return (rx_handler == rmnet_rx_handler); +	return rcu_access_pointer(real_dev->rx_handler) == rmnet_rx_handler;  }  /* Needs rtnl lock */ diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c index ca22f2898664..d24b47b8e0b2 100644 --- a/drivers/net/ethernet/realtek/8139too.c +++ b/drivers/net/ethernet/realtek/8139too.c @@ -2135,11 +2135,12 @@ static int rtl8139_poll(struct napi_struct *napi, int budget)  	if (likely(RTL_R16(IntrStatus) & RxAckBits))  		work_done += rtl8139_rx(dev, tp, budget); -	if (work_done < budget && napi_complete_done(napi, work_done)) { +	if (work_done < budget) {  		unsigned long flags;  		spin_lock_irqsave(&tp->lock, flags); -		RTL_W16_F(IntrMask, rtl8139_intr_mask); +		if (napi_complete_done(napi, work_done)) +			RTL_W16_F(IntrMask, rtl8139_intr_mask);  		spin_unlock_irqrestore(&tp->lock, flags);  	}  	spin_unlock(&tp->rx_lock); diff --git a/drivers/net/ethernet/realtek/atp.h b/drivers/net/ethernet/realtek/atp.h index 32497f0e537c..63f0d2d0e87b 100644 --- a/drivers/net/ethernet/realtek/atp.h +++ b/drivers/net/ethernet/realtek/atp.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* Linux header file for the ATP pocket ethernet adapter. */  /* v1.09 8/9/2000 [email protected]. */ diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index e03fcf914690..a3c949ea7d1a 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -8491,8 +8491,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  		rtl8168_driver_start(tp);  	} -	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL); -  	if (pci_dev_run_wake(pdev))  		pm_runtime_put_noidle(&pdev->dev); diff --git a/drivers/net/ethernet/rocker/rocker_tlv.h b/drivers/net/ethernet/rocker/rocker_tlv.h index a63ef82e7c72..dfae3c9d57c6 100644 --- a/drivers/net/ethernet/rocker/rocker_tlv.h +++ b/drivers/net/ethernet/rocker/rocker_tlv.h @@ -139,40 +139,52 @@ rocker_tlv_start(struct rocker_desc_info *desc_info)  int rocker_tlv_put(struct rocker_desc_info *desc_info,  		   int attrtype, int attrlen, const void *data); -static inline int rocker_tlv_put_u8(struct rocker_desc_info *desc_info, -				    int attrtype, u8 value) +static inline int +rocker_tlv_put_u8(struct rocker_desc_info *desc_info, int attrtype, u8 value)  { -	return rocker_tlv_put(desc_info, attrtype, sizeof(u8), &value); +	u8 tmp = value; /* work around GCC PR81715 */ + +	return rocker_tlv_put(desc_info, attrtype, sizeof(u8), &tmp);  } -static inline int rocker_tlv_put_u16(struct rocker_desc_info *desc_info, -				     int attrtype, u16 value) +static inline int +rocker_tlv_put_u16(struct rocker_desc_info *desc_info, int attrtype, u16 value)  { -	return rocker_tlv_put(desc_info, attrtype, sizeof(u16), &value); +	u16 tmp = value; + +	return rocker_tlv_put(desc_info, attrtype, sizeof(u16), &tmp);  } -static inline int rocker_tlv_put_be16(struct rocker_desc_info *desc_info, -				      int attrtype, __be16 value) +static inline int +rocker_tlv_put_be16(struct rocker_desc_info *desc_info, int attrtype, __be16 value)  { -	return rocker_tlv_put(desc_info, attrtype, sizeof(__be16), &value); +	__be16 tmp = value; + +	return rocker_tlv_put(desc_info, attrtype, sizeof(__be16), &tmp);  } -static inline int rocker_tlv_put_u32(struct rocker_desc_info *desc_info, -				     int attrtype, u32 value) +static inline int +rocker_tlv_put_u32(struct rocker_desc_info *desc_info, int attrtype, u32 value)  { -	return rocker_tlv_put(desc_info, attrtype, sizeof(u32), &value); +	u32 tmp = value; + +	return rocker_tlv_put(desc_info, attrtype, sizeof(u32), &tmp);  } -static inline int rocker_tlv_put_be32(struct rocker_desc_info *desc_info, -				      int attrtype, __be32 value) +static inline int +rocker_tlv_put_be32(struct rocker_desc_info *desc_info, int attrtype, __be32 value)  { -	return rocker_tlv_put(desc_info, attrtype, sizeof(__be32), &value); +	__be32 tmp = value; + +	return rocker_tlv_put(desc_info, attrtype, sizeof(__be32), &tmp);  } -static inline int rocker_tlv_put_u64(struct rocker_desc_info *desc_info, -				     int attrtype, u64 value) +static inline int +rocker_tlv_put_u64(struct rocker_desc_info *desc_info, int attrtype, u64 value)  { -	return rocker_tlv_put(desc_info, attrtype, sizeof(u64), &value); +	u64 tmp = value; + +	return rocker_tlv_put(desc_info, attrtype, sizeof(u64), &tmp);  }  static inline struct rocker_tlv * diff --git a/drivers/net/ethernet/seeq/sgiseeq.h b/drivers/net/ethernet/seeq/sgiseeq.h index 2211e2987a8d..2f65c55608df 100644 --- a/drivers/net/ethernet/seeq/sgiseeq.h +++ b/drivers/net/ethernet/seeq/sgiseeq.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * sgiseeq.h: Defines for the Seeq8003 ethernet controller.   * diff --git a/drivers/net/ethernet/sfc/Makefile b/drivers/net/ethernet/sfc/Makefile index 520cfcc17785..3bac58d0f88b 100644 --- a/drivers/net/ethernet/sfc/Makefile +++ b/drivers/net/ethernet/sfc/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  sfc-y			+= efx.o nic.o farch.o siena.o ef10.o tx.o rx.o \  			   selftest.o ethtool.o ptp.o tx_tso.o \  			   mcdi.o mcdi_port.o mcdi_mon.o diff --git a/drivers/net/ethernet/sfc/falcon/Makefile b/drivers/net/ethernet/sfc/falcon/Makefile index aa1b45979ca4..39448e5b7f1e 100644 --- a/drivers/net/ethernet/sfc/falcon/Makefile +++ b/drivers/net/ethernet/sfc/falcon/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  sfc-falcon-y		+= efx.o nic.o farch.o falcon.o tx.o rx.o selftest.o \  			   ethtool.o qt202x_phy.o mdio_10g.o tenxpress.o \  			   txc43128_phy.o falcon_boards.o diff --git a/drivers/net/ethernet/sis/sis900.h b/drivers/net/ethernet/sis/sis900.h index f0da3dc52c01..66e4bf38770f 100644 --- a/drivers/net/ethernet/sis/sis900.h +++ b/drivers/net/ethernet/sis/sis900.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* sis900.h Definitions for SiS ethernet controllers including 7014/7016 and 900   * Copyright 1999 Silicon Integrated System Corporation   * References: diff --git a/drivers/net/ethernet/smsc/Makefile b/drivers/net/ethernet/smsc/Makefile index f3438dec9d90..4105912b1629 100644 --- a/drivers/net/ethernet/smsc/Makefile +++ b/drivers/net/ethernet/smsc/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the SMSC network device drivers.  # diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile index 238307fadcdb..ff3f83b86d10 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Makefile +++ b/drivers/net/ethernet/stmicro/stmmac/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_STMMAC_ETH) += stmmac.o  stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o	\  	      chain_mode.o dwmac_lib.o dwmac1000_core.o dwmac1000_dma.o	\ diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c index dd6a2f9791cc..3256e5cbad27 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c @@ -74,7 +74,7 @@ static int dwc_eth_dwmac_config_dt(struct platform_device *pdev,  		plat_dat->axi->axi_wr_osr_lmt--;  	} -	if (of_property_read_u32(np, "read,read-requests", +	if (of_property_read_u32(np, "snps,read-requests",  				 &plat_dat->axi->axi_rd_osr_lmt)) {  		/**  		 * Since the register has a reset value of 1, if property @@ -511,6 +511,7 @@ static struct platform_driver dwc_eth_dwmac_driver = {  	.remove = dwc_eth_dwmac_remove,  	.driver = {  		.name           = "dwc-eth-dwmac", +		.pm             = &stmmac_pltfr_pm_ops,  		.of_match_table = dwc_eth_dwmac_match,  	},  }; diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index 99823f54696a..13133b30b575 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c @@ -83,6 +83,117 @@ struct rk_priv_data {  	(((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \  	 ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE)) +#define RK3128_GRF_MAC_CON0	0x0168 +#define RK3128_GRF_MAC_CON1	0x016c + +/* RK3128_GRF_MAC_CON0 */ +#define RK3128_GMAC_TXCLK_DLY_ENABLE   GRF_BIT(14) +#define RK3128_GMAC_TXCLK_DLY_DISABLE  GRF_CLR_BIT(14) +#define RK3128_GMAC_RXCLK_DLY_ENABLE   GRF_BIT(15) +#define RK3128_GMAC_RXCLK_DLY_DISABLE  GRF_CLR_BIT(15) +#define RK3128_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7) +#define RK3128_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) + +/* RK3128_GRF_MAC_CON1 */ +#define RK3128_GMAC_PHY_INTF_SEL_RGMII	\ +		(GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8)) +#define RK3128_GMAC_PHY_INTF_SEL_RMII	\ +		(GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8)) +#define RK3128_GMAC_FLOW_CTRL          GRF_BIT(9) +#define RK3128_GMAC_FLOW_CTRL_CLR      GRF_CLR_BIT(9) +#define RK3128_GMAC_SPEED_10M          GRF_CLR_BIT(10) +#define RK3128_GMAC_SPEED_100M         GRF_BIT(10) +#define RK3128_GMAC_RMII_CLK_25M       GRF_BIT(11) +#define RK3128_GMAC_RMII_CLK_2_5M      GRF_CLR_BIT(11) +#define RK3128_GMAC_CLK_125M           (GRF_CLR_BIT(12) | GRF_CLR_BIT(13)) +#define RK3128_GMAC_CLK_25M            (GRF_BIT(12) | GRF_BIT(13)) +#define RK3128_GMAC_CLK_2_5M           (GRF_CLR_BIT(12) | GRF_BIT(13)) +#define RK3128_GMAC_RMII_MODE          GRF_BIT(14) +#define RK3128_GMAC_RMII_MODE_CLR      GRF_CLR_BIT(14) + +static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv, +				int tx_delay, int rx_delay) +{ +	struct device *dev = &bsp_priv->pdev->dev; + +	if (IS_ERR(bsp_priv->grf)) { +		dev_err(dev, "Missing rockchip,grf property\n"); +		return; +	} + +	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, +		     RK3128_GMAC_PHY_INTF_SEL_RGMII | +		     RK3128_GMAC_RMII_MODE_CLR); +	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0, +		     DELAY_ENABLE(RK3128, tx_delay, rx_delay) | +		     RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) | +		     RK3128_GMAC_CLK_TX_DL_CFG(tx_delay)); +} + +static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv) +{ +	struct device *dev = &bsp_priv->pdev->dev; + +	if (IS_ERR(bsp_priv->grf)) { +		dev_err(dev, "Missing rockchip,grf property\n"); +		return; +	} + +	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, +		     RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE); +} + +static void rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed) +{ +	struct device *dev = &bsp_priv->pdev->dev; + +	if (IS_ERR(bsp_priv->grf)) { +		dev_err(dev, "Missing rockchip,grf property\n"); +		return; +	} + +	if (speed == 10) +		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, +			     RK3128_GMAC_CLK_2_5M); +	else if (speed == 100) +		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, +			     RK3128_GMAC_CLK_25M); +	else if (speed == 1000) +		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, +			     RK3128_GMAC_CLK_125M); +	else +		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed); +} + +static void rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) +{ +	struct device *dev = &bsp_priv->pdev->dev; + +	if (IS_ERR(bsp_priv->grf)) { +		dev_err(dev, "Missing rockchip,grf property\n"); +		return; +	} + +	if (speed == 10) { +		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, +			     RK3128_GMAC_RMII_CLK_2_5M | +			     RK3128_GMAC_SPEED_10M); +	} else if (speed == 100) { +		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1, +			     RK3128_GMAC_RMII_CLK_25M | +			     RK3128_GMAC_SPEED_100M); +	} else { +		dev_err(dev, "unknown speed value for RMII! speed=%d", speed); +	} +} + +static const struct rk_gmac_ops rk3128_ops = { +	.set_to_rgmii = rk3128_set_to_rgmii, +	.set_to_rmii = rk3128_set_to_rmii, +	.set_rgmii_speed = rk3128_set_rgmii_speed, +	.set_rmii_speed = rk3128_set_rmii_speed, +}; +  #define RK3228_GRF_MAC_CON0	0x0900  #define RK3228_GRF_MAC_CON1	0x0904 @@ -1313,6 +1424,7 @@ static int rk_gmac_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);  static const struct of_device_id rk_gmac_dwmac_match[] = { +	{ .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops },  	{ .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },  	{ .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },  	{ .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops }, diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c index c4407e8e39a3..2f7d7ec59962 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c @@ -296,6 +296,7 @@ static void dwmac4_pmt(struct mac_device_info *hw, unsigned long mode)  {  	void __iomem *ioaddr = hw->pcsr;  	unsigned int pmt = 0; +	u32 config;  	if (mode & WAKE_MAGIC) {  		pr_debug("GMAC: WOL Magic frame\n"); @@ -306,6 +307,12 @@ static void dwmac4_pmt(struct mac_device_info *hw, unsigned long mode)  		pmt |= power_down | global_unicast | wake_up_frame_en;  	} +	if (pmt) { +		/* The receiver must be enabled for WOL before powering down */ +		config = readl(ioaddr + GMAC_CONFIG); +		config |= GMAC_CONFIG_RE; +		writel(config, ioaddr + GMAC_CONFIG); +	}  	writel(pmt, ioaddr + GMAC_PMT);  } diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c index e0ef02f9503b..4b286e27c4ca 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c @@ -275,7 +275,7 @@ static int dwmac4_wrback_get_rx_timestamp_status(void *desc, u32 ats)  					goto exit;  				i++; -			} while ((ret == 1) || (i < 10)); +			} while ((ret == 1) && (i < 10));  			if (i == 10)  				ret = -EBUSY; diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c b/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c index 67af0bdd7f10..7516ca210855 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c @@ -34,7 +34,7 @@ int dwmac_dma_reset(void __iomem *ioaddr)  	err = readl_poll_timeout(ioaddr + DMA_BUS_MODE, value,  				 !(value & DMA_BUS_MODE_SFT_RESET), -				 100000, 10000); +				 10000, 100000);  	if (err)  		return -EBUSY; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 1763e48c84e2..16bd50929084 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -473,19 +473,18 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,  				   struct dma_desc *np, struct sk_buff *skb)  {  	struct skb_shared_hwtstamps *shhwtstamp = NULL; +	struct dma_desc *desc = p;  	u64 ns;  	if (!priv->hwts_rx_en)  		return; +	/* For GMAC4, the valid timestamp is from CTX next desc. */ +	if (priv->plat->has_gmac4) +		desc = np;  	/* Check if timestamp is available */ -	if (priv->hw->desc->get_rx_timestamp_status(p, priv->adv_ts)) { -		/* For GMAC4, the valid timestamp is from CTX next desc. */ -		if (priv->plat->has_gmac4) -			ns = priv->hw->desc->get_timestamp(np, priv->adv_ts); -		else -			ns = priv->hw->desc->get_timestamp(p, priv->adv_ts); - +	if (priv->hw->desc->get_rx_timestamp_status(desc, priv->adv_ts)) { +		ns = priv->hw->desc->get_timestamp(desc, priv->adv_ts);  		netdev_dbg(priv->dev, "get valid RX hw timestamp %llu\n", ns);  		shhwtstamp = skb_hwtstamps(skb);  		memset(shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps)); @@ -1800,12 +1799,13 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue)  {  	struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue];  	unsigned int bytes_compl = 0, pkts_compl = 0; -	unsigned int entry = tx_q->dirty_tx; +	unsigned int entry;  	netif_tx_lock(priv->dev);  	priv->xstats.tx_clean++; +	entry = tx_q->dirty_tx;  	while (entry != tx_q->cur_tx) {  		struct sk_buff *skb = tx_q->tx_skbuff[entry];  		struct dma_desc *p; @@ -3333,6 +3333,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)  				 * them in stmmac_rx_refill() function so that  				 * device can reuse it.  				 */ +				dev_kfree_skb_any(rx_q->rx_skbuff[entry]);  				rx_q->rx_skbuff[entry] = NULL;  				dma_unmap_single(priv->device,  						 rx_q->rx_skbuff_dma[entry], diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index a366b3747eeb..195eb7e71473 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -150,6 +150,13 @@ static void stmmac_mtl_setup(struct platform_device *pdev,  	plat->rx_queues_to_use = 1;  	plat->tx_queues_to_use = 1; +	/* First Queue must always be in DCB mode. As MTL_QUEUE_DCB = 1 we need +	 * to always set this, otherwise Queue will be classified as AVB +	 * (because MTL_QUEUE_AVB = 0). +	 */ +	plat->rx_queues_cfg[0].mode_to_use = MTL_QUEUE_DCB; +	plat->tx_queues_cfg[0].mode_to_use = MTL_QUEUE_DCB; +  	rx_node = of_parse_phandle(pdev->dev.of_node, "snps,mtl-rx-config", 0);  	if (!rx_node)  		return; @@ -161,8 +168,8 @@ static void stmmac_mtl_setup(struct platform_device *pdev,  	}  	/* Processing RX queues common config */ -	if (of_property_read_u8(rx_node, "snps,rx-queues-to-use", -				&plat->rx_queues_to_use)) +	if (of_property_read_u32(rx_node, "snps,rx-queues-to-use", +				 &plat->rx_queues_to_use))  		plat->rx_queues_to_use = 1;  	if (of_property_read_bool(rx_node, "snps,rx-sched-sp")) @@ -184,8 +191,8 @@ static void stmmac_mtl_setup(struct platform_device *pdev,  		else  			plat->rx_queues_cfg[queue].mode_to_use = MTL_QUEUE_DCB; -		if (of_property_read_u8(q_node, "snps,map-to-dma-channel", -					&plat->rx_queues_cfg[queue].chan)) +		if (of_property_read_u32(q_node, "snps,map-to-dma-channel", +					 &plat->rx_queues_cfg[queue].chan))  			plat->rx_queues_cfg[queue].chan = queue;  		/* TODO: Dynamic mapping to be included in the future */ @@ -215,8 +222,8 @@ static void stmmac_mtl_setup(struct platform_device *pdev,  	}  	/* Processing TX queues common config */ -	if (of_property_read_u8(tx_node, "snps,tx-queues-to-use", -				&plat->tx_queues_to_use)) +	if (of_property_read_u32(tx_node, "snps,tx-queues-to-use", +				 &plat->tx_queues_to_use))  		plat->tx_queues_to_use = 1;  	if (of_property_read_bool(tx_node, "snps,tx-sched-wrr")) @@ -237,8 +244,8 @@ static void stmmac_mtl_setup(struct platform_device *pdev,  		if (queue >= plat->tx_queues_to_use)  			break; -		if (of_property_read_u8(q_node, "snps,weight", -					&plat->tx_queues_cfg[queue].weight)) +		if (of_property_read_u32(q_node, "snps,weight", +					 &plat->tx_queues_cfg[queue].weight))  			plat->tx_queues_cfg[queue].weight = 0x10 + queue;  		if (of_property_read_bool(q_node, "snps,dcb-algorithm")) { @@ -315,6 +322,7 @@ static int stmmac_dt_phy(struct plat_stmmacenet_data *plat,  		{ .compatible = "allwinner,sun8i-h3-emac" },  		{ .compatible = "allwinner,sun8i-v3s-emac" },  		{ .compatible = "allwinner,sun50i-a64-emac" }, +		{},  	};  	/* If phy-handle property is passed from DT, use it as the PHY */ diff --git a/drivers/net/ethernet/sun/Makefile b/drivers/net/ethernet/sun/Makefile index 37855438b3cb..9a5249dee56e 100644 --- a/drivers/net/ethernet/sun/Makefile +++ b/drivers/net/ethernet/sun/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Sun network device drivers.  # diff --git a/drivers/net/ethernet/sun/niu.h b/drivers/net/ethernet/sun/niu.h index 51e177e1860d..04c215f91fc0 100644 --- a/drivers/net/ethernet/sun/niu.h +++ b/drivers/net/ethernet/sun/niu.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* niu.h: Definitions for Neptune ethernet driver.   *   * Copyright (C) 2007 David S. Miller ([email protected]) diff --git a/drivers/net/ethernet/sun/sunbmac.h b/drivers/net/ethernet/sun/sunbmac.h index ee56930475a8..d379bd407eca 100644 --- a/drivers/net/ethernet/sun/sunbmac.h +++ b/drivers/net/ethernet/sun/sunbmac.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Id: sunbmac.h,v 1.7 2000/07/11 22:35:22 davem Exp $   * sunbmac.h: Defines for the Sun "Big MAC" 100baseT ethernet cards.   * diff --git a/drivers/net/ethernet/sun/sungem.h b/drivers/net/ethernet/sun/sungem.h index 835ce1b3cb9f..626302a9bc89 100644 --- a/drivers/net/ethernet/sun/sungem.h +++ b/drivers/net/ethernet/sun/sungem.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Id: sungem.h,v 1.10.2.4 2002/03/11 08:54:48 davem Exp $   * sungem.h: Definitions for Sun GEM ethernet driver.   * diff --git a/drivers/net/ethernet/sun/sunhme.h b/drivers/net/ethernet/sun/sunhme.h index fca1bca7f69d..9118c60c9426 100644 --- a/drivers/net/ethernet/sun/sunhme.h +++ b/drivers/net/ethernet/sun/sunhme.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Id: sunhme.h,v 1.33 2001/08/03 06:23:04 davem Exp $   * sunhme.h: Definitions for Sparc HME/BigMac 10/100baseT ethernet driver.   *           Also known as the "Happy Meal". diff --git a/drivers/net/ethernet/sun/sunqe.h b/drivers/net/ethernet/sun/sunqe.h index ae190b77431b..0daed05b7c83 100644 --- a/drivers/net/ethernet/sun/sunqe.h +++ b/drivers/net/ethernet/sun/sunqe.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* $Id: sunqe.h,v 1.13 2000/02/09 11:15:42 davem Exp $   * sunqe.h: Definitions for the Sun QuadEthernet driver.   * diff --git a/drivers/net/ethernet/sun/sunvnet_common.h b/drivers/net/ethernet/sun/sunvnet_common.h index b20d6fa7ef25..6a4dd1fb19bf 100644 --- a/drivers/net/ethernet/sun/sunvnet_common.h +++ b/drivers/net/ethernet/sun/sunvnet_common.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _SUNVNETCOMMON_H  #define _SUNVNETCOMMON_H diff --git a/drivers/net/ethernet/synopsys/Makefile b/drivers/net/ethernet/synopsys/Makefile index 0ad01916f11e..7a46393abf26 100644 --- a/drivers/net/ethernet/synopsys/Makefile +++ b/drivers/net/ethernet/synopsys/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Synopsys network device drivers.  # diff --git a/drivers/net/ethernet/ti/Makefile b/drivers/net/ethernet/ti/Makefile index 10e6b0ce51ba..0be551de821c 100644 --- a/drivers/net/ethernet/ti/Makefile +++ b/drivers/net/ethernet/ti/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the TI network device drivers.  # diff --git a/drivers/net/ethernet/tile/Makefile b/drivers/net/ethernet/tile/Makefile index 0ef9eefd3211..3d0ae1f07fc9 100644 --- a/drivers/net/ethernet/tile/Makefile +++ b/drivers/net/ethernet/tile/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the TILE on-chip networking support.  # diff --git a/drivers/net/ethernet/toshiba/Makefile b/drivers/net/ethernet/toshiba/Makefile index a5069008435b..f434fd0f429e 100644 --- a/drivers/net/ethernet/toshiba/Makefile +++ b/drivers/net/ethernet/toshiba/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Toshiba network device drivers.  # diff --git a/drivers/net/ethernet/xilinx/Makefile b/drivers/net/ethernet/xilinx/Makefile index 214205e975e3..7d7dc1771423 100644 --- a/drivers/net/ethernet/xilinx/Makefile +++ b/drivers/net/ethernet/xilinx/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Xilink network device drivers.  # diff --git a/drivers/net/ethernet/xilinx/ll_temac.h b/drivers/net/ethernet/xilinx/ll_temac.h index 7d06e3e1abac..107575225383 100644 --- a/drivers/net/ethernet/xilinx/ll_temac.h +++ b/drivers/net/ethernet/xilinx/ll_temac.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef XILINX_LL_TEMAC_H  #define XILINX_LL_TEMAC_H diff --git a/drivers/net/ethernet/xilinx/ll_temac_mdio.c b/drivers/net/ethernet/xilinx/ll_temac_mdio.c index 7714aff78b7d..f5e83ac6f7e2 100644 --- a/drivers/net/ethernet/xilinx/ll_temac_mdio.c +++ b/drivers/net/ethernet/xilinx/ll_temac_mdio.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * MDIO bus driver for the Xilinx TEMAC device   * diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet.h b/drivers/net/ethernet/xilinx/xilinx_axienet.h index 5ef626331f85..c337400485da 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet.h +++ b/drivers/net/ethernet/xilinx/xilinx_axienet.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Definitions for Xilinx Axi Ethernet device driver.   * diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c b/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c index 63307ea97846..16c3bfbe1992 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * MDIO bus driver for the Xilinx Axi Ethernet device   * diff --git a/drivers/net/fddi/skfp/Makefile b/drivers/net/fddi/skfp/Makefile index a957a1c7e5ba..875eac8a76f3 100644 --- a/drivers/net/fddi/skfp/Makefile +++ b/drivers/net/fddi/skfp/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the SysKonnect FDDI PCI adapter driver  # diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index f6404074b7b0..ed51018a813e 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -113,13 +113,7 @@ static void tunnel_id_to_vni(__be64 tun_id, __u8 *vni)  static bool eq_tun_id_and_vni(u8 *tun_id, u8 *vni)  { -#ifdef __BIG_ENDIAN -	return (vni[0] == tun_id[2]) && -	       (vni[1] == tun_id[1]) && -	       (vni[2] == tun_id[0]); -#else  	return !memcmp(vni, &tun_id[5], 3); -#endif  }  static sa_family_t geneve_get_sk_family(struct geneve_sock *gs) diff --git a/drivers/net/hamradio/Makefile b/drivers/net/hamradio/Makefile index 104096070026..7a1518d763e3 100644 --- a/drivers/net/hamradio/Makefile +++ b/drivers/net/hamradio/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Linux AX.25 and HFMODEM device drivers.  # diff --git a/drivers/net/hamradio/z8530.h b/drivers/net/hamradio/z8530.h index 8bef548572aa..1655901d713b 100644 --- a/drivers/net/hamradio/z8530.h +++ b/drivers/net/hamradio/z8530.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* 8530 Serial Communications Controller Register definitions */  #define	FLAG	0x7e diff --git a/drivers/net/hippi/rrunner.h b/drivers/net/hippi/rrunner.h index 28169043ae49..87533784604f 100644 --- a/drivers/net/hippi/rrunner.h +++ b/drivers/net/hippi/rrunner.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _RRUNNER_H_  #define _RRUNNER_H_ diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h index d98cdfb1536b..5176be76ca7d 100644 --- a/drivers/net/hyperv/hyperv_net.h +++ b/drivers/net/hyperv/hyperv_net.h @@ -150,6 +150,8 @@ struct netvsc_device_info {  	u32  num_chn;  	u32  send_sections;  	u32  recv_sections; +	u32  send_section_size; +	u32  recv_section_size;  };  enum rndis_device_state { diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index a5511b7326af..8d5077fb0492 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -76,9 +76,6 @@ static struct netvsc_device *alloc_net_device(void)  	net_device->max_pkt = RNDIS_MAX_PKT_DEFAULT;  	net_device->pkt_align = RNDIS_PKT_ALIGN_DEFAULT; -	net_device->recv_section_size = NETVSC_RECV_SECTION_SIZE; -	net_device->send_section_size = NETVSC_SEND_SECTION_SIZE; -  	init_completion(&net_device->channel_init_wait);  	init_waitqueue_head(&net_device->subchan_open);  	INIT_WORK(&net_device->subchan_work, rndis_set_subchannel); @@ -262,7 +259,7 @@ static int netvsc_init_buf(struct hv_device *device,  	int ret = 0;  	/* Get receive buffer area. */ -	buf_size = device_info->recv_sections * net_device->recv_section_size; +	buf_size = device_info->recv_sections * device_info->recv_section_size;  	buf_size = roundup(buf_size, PAGE_SIZE);  	net_device->recv_buf = vzalloc(buf_size); @@ -344,7 +341,7 @@ static int netvsc_init_buf(struct hv_device *device,  		goto cleanup;  	/* Now setup the send buffer. */ -	buf_size = device_info->send_sections * net_device->send_section_size; +	buf_size = device_info->send_sections * device_info->send_section_size;  	buf_size = round_up(buf_size, PAGE_SIZE);  	net_device->send_buf = vzalloc(buf_size); diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index d4902ee5f260..a32ae02e1b6c 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -848,7 +848,9 @@ static int netvsc_set_channels(struct net_device *net,  	device_info.num_chn = count;  	device_info.ring_size = ring_size;  	device_info.send_sections = nvdev->send_section_cnt; +	device_info.send_section_size = nvdev->send_section_size;  	device_info.recv_sections = nvdev->recv_section_cnt; +	device_info.recv_section_size = nvdev->recv_section_size;  	rndis_filter_device_remove(dev, nvdev); @@ -963,7 +965,9 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)  	device_info.ring_size = ring_size;  	device_info.num_chn = nvdev->num_chn;  	device_info.send_sections = nvdev->send_section_cnt; +	device_info.send_section_size = nvdev->send_section_size;  	device_info.recv_sections = nvdev->recv_section_cnt; +	device_info.recv_section_size = nvdev->recv_section_size;  	rndis_filter_device_remove(hdev, nvdev); @@ -1485,7 +1489,9 @@ static int netvsc_set_ringparam(struct net_device *ndev,  	device_info.num_chn = nvdev->num_chn;  	device_info.ring_size = ring_size;  	device_info.send_sections = new_tx; +	device_info.send_section_size = nvdev->send_section_size;  	device_info.recv_sections = new_rx; +	device_info.recv_section_size = nvdev->recv_section_size;  	netif_device_detach(ndev);  	was_opened = rndis_filter_opened(nvdev); @@ -1934,7 +1940,9 @@ static int netvsc_probe(struct hv_device *dev,  	device_info.ring_size = ring_size;  	device_info.num_chn = VRSS_CHANNEL_DEFAULT;  	device_info.send_sections = NETVSC_DEFAULT_TX; +	device_info.send_section_size = NETVSC_SEND_SECTION_SIZE;  	device_info.recv_sections = NETVSC_DEFAULT_RX; +	device_info.recv_section_size = NETVSC_RECV_SECTION_SIZE;  	nvdev = rndis_filter_device_add(dev, &device_info);  	if (IS_ERR(nvdev)) { diff --git a/drivers/net/ieee802154/Makefile b/drivers/net/ieee802154/Makefile index 8374bb44a145..bea1de5e726c 100644 --- a/drivers/net/ieee802154/Makefile +++ b/drivers/net/ieee802154/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_IEEE802154_FAKELB) += fakelb.o  obj-$(CONFIG_IEEE802154_AT86RF230) += at86rf230.o  obj-$(CONFIG_IEEE802154_MRF24J40) += mrf24j40.o diff --git a/drivers/net/ipvlan/ipvtap.c b/drivers/net/ipvlan/ipvtap.c index 5dea2063dbc8..0bcc07f346c3 100644 --- a/drivers/net/ipvlan/ipvtap.c +++ b/drivers/net/ipvlan/ipvtap.c @@ -197,8 +197,8 @@ static int ipvtap_init(void)  {  	int err; -	err = tap_create_cdev(&ipvtap_cdev, &ipvtap_major, "ipvtap"); - +	err = tap_create_cdev(&ipvtap_cdev, &ipvtap_major, "ipvtap", +			      THIS_MODULE);  	if (err)  		goto out1; diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 98e4deaa3a6a..5ab1b8849c30 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -742,6 +742,7 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb,  	sg_init_table(sg, ret);  	ret = skb_to_sgvec(skb, sg, 0, skb->len);  	if (unlikely(ret < 0)) { +		aead_request_free(req);  		macsec_txsa_put(tx_sa);  		kfree_skb(skb);  		return ERR_PTR(ret); @@ -954,6 +955,7 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,  	sg_init_table(sg, ret);  	ret = skb_to_sgvec(skb, sg, 0, skb->len);  	if (unlikely(ret < 0)) { +		aead_request_free(req);  		kfree_skb(skb);  		return ERR_PTR(ret);  	} diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index c2d0ea2fb019..cba5cb3b849a 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c @@ -204,8 +204,8 @@ static int macvtap_init(void)  {  	int err; -	err = tap_create_cdev(&macvtap_cdev, &macvtap_major, "macvtap"); - +	err = tap_create_cdev(&macvtap_cdev, &macvtap_major, "macvtap", +			      THIS_MODULE);  	if (err)  		goto out1; diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index a9d16a3af514..cd931cf9dcc2 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -160,15 +160,6 @@ config MDIO_XGENE  endif -menuconfig PHYLIB -	tristate "PHY Device support and infrastructure" -	depends on NETDEVICES -	select MDIO_DEVICE -	help -	  Ethernet controllers are usually attached to PHY -	  devices.  This option provides infrastructure for -	  managing PHY devices. -  config PHYLINK  	tristate  	depends on NETDEVICES @@ -179,6 +170,15 @@ config PHYLINK  	  configuration links, PHYs, and Serdes links with MAC level  	  autonegotiation modes. +menuconfig PHYLIB +	tristate "PHY Device support and infrastructure" +	depends on NETDEVICES +	select MDIO_DEVICE +	help +	  Ethernet controllers are usually attached to PHY +	  devices.  This option provides infrastructure for +	  managing PHY devices. +  if PHYLIB  config SWPHY diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 416df92fbf4f..00f097e18c68 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # Makefile for Linux PHY drivers and MDIO bus drivers  libphy-y			:= phy.o phy-c45.o phy-core.o phy_device.o diff --git a/drivers/net/phy/dp83640_reg.h b/drivers/net/phy/dp83640_reg.h index e7fe41117003..21aa24c741b9 100644 --- a/drivers/net/phy/dp83640_reg.h +++ b/drivers/net/phy/dp83640_reg.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* dp83640_reg.h   * Generated by regen.tcl on Thu Feb 17 10:02:48 AM CET 2011   */ diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index 15cbcdba618a..4d02b27df044 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -681,9 +681,11 @@ static int m88e1116r_config_init(struct phy_device *phydev)  	if (err < 0)  		return err; -	err = m88e1121_config_aneg_rgmii_delays(phydev); -	if (err < 0) -		return err; +	if (phy_interface_is_rgmii(phydev)) { +		err = m88e1121_config_aneg_rgmii_delays(phydev); +		if (err < 0) +			return err; +	}  	err = genphy_soft_reset(phydev);  	if (err < 0) diff --git a/drivers/net/phy/mdio-boardinfo.h b/drivers/net/phy/mdio-boardinfo.h index 3a7f143904e8..773bb51399be 100644 --- a/drivers/net/phy/mdio-boardinfo.h +++ b/drivers/net/phy/mdio-boardinfo.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * mdio-boardinfo.h - board info interface internal to the mdio_bus   * component diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index e842d2cd1ee7..2b1e67bc1e73 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -373,7 +373,8 @@ void phy_ethtool_ksettings_get(struct phy_device *phydev,  		cmd->base.port = PORT_BNC;  	else  		cmd->base.port = PORT_MII; - +	cmd->base.transceiver = phy_is_internal(phydev) ? +				XCVR_INTERNAL : XCVR_EXTERNAL;  	cmd->base.phy_address = phydev->mdio.addr;  	cmd->base.autoneg = phydev->autoneg;  	cmd->base.eth_tp_mdix_ctrl = phydev->mdix_ctrl; diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 8cf0c5901f95..67f25ac29025 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -879,7 +879,7 @@ void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)  {  	const char *drv_name = phydev->drv ? phydev->drv->name : "unbound";  	char *irq_str; -	char irq_num[4]; +	char irq_num[8];  	switch(phydev->irq) {  	case PHY_POLL: diff --git a/drivers/net/phy/swphy.h b/drivers/net/phy/swphy.h index 2f09ac324e18..3668ab8c901a 100644 --- a/drivers/net/phy/swphy.h +++ b/drivers/net/phy/swphy.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef SWPHY_H  #define SWPHY_H diff --git a/drivers/net/phy/xilinx_gmii2rgmii.c b/drivers/net/phy/xilinx_gmii2rgmii.c index d15dd3938ba8..2e5150b0b8d5 100644 --- a/drivers/net/phy/xilinx_gmii2rgmii.c +++ b/drivers/net/phy/xilinx_gmii2rgmii.c @@ -44,7 +44,7 @@ static int xgmiitorgmii_read_status(struct phy_device *phydev)  	priv->phy_drv->read_status(phydev);  	val = mdiobus_read(phydev->mdio.bus, priv->addr, XILINX_GMII2RGMII_REG); -	val &= XILINX_GMII2RGMII_SPEED_MASK; +	val &= ~XILINX_GMII2RGMII_SPEED_MASK;  	if (phydev->speed == SPEED_1000)  		val |= BMCR_SPEED1000; diff --git a/drivers/net/ppp/Makefile b/drivers/net/ppp/Makefile index a6b6297b0066..16c457d6b324 100644 --- a/drivers/net/ppp/Makefile +++ b/drivers/net/ppp/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Linux PPP network device drivers.  # diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index a404552555d4..e365866600ba 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c @@ -120,7 +120,7 @@ struct ppp {  	int		n_channels;	/* how many channels are attached 54 */  	spinlock_t	rlock;		/* lock for receive side 58 */  	spinlock_t	wlock;		/* lock for transmit side 5c */ -	int		*xmit_recursion __percpu; /* xmit recursion detect */ +	int __percpu	*xmit_recursion; /* xmit recursion detect */  	int		mru;		/* max receive unit 60 */  	unsigned int	flags;		/* control bits 64 */  	unsigned int	xstate;		/* transmit state bits 68 */ @@ -1339,7 +1339,17 @@ ppp_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats64)  static int ppp_dev_init(struct net_device *dev)  { +	struct ppp *ppp; +  	netdev_lockdep_set_classes(dev); + +	ppp = netdev_priv(dev); +	/* Let the netdevice take a reference on the ppp file. This ensures +	 * that ppp_destroy_interface() won't run before the device gets +	 * unregistered. +	 */ +	atomic_inc(&ppp->file.refcnt); +  	return 0;  } @@ -1362,6 +1372,15 @@ static void ppp_dev_uninit(struct net_device *dev)  	wake_up_interruptible(&ppp->file.rwait);  } +static void ppp_dev_priv_destructor(struct net_device *dev) +{ +	struct ppp *ppp; + +	ppp = netdev_priv(dev); +	if (atomic_dec_and_test(&ppp->file.refcnt)) +		ppp_destroy_interface(ppp); +} +  static const struct net_device_ops ppp_netdev_ops = {  	.ndo_init	 = ppp_dev_init,  	.ndo_uninit      = ppp_dev_uninit, @@ -1387,6 +1406,7 @@ static void ppp_setup(struct net_device *dev)  	dev->tx_queue_len = 3;  	dev->type = ARPHRD_PPP;  	dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; +	dev->priv_destructor = ppp_dev_priv_destructor;  	netif_keep_dst(dev);  } diff --git a/drivers/net/ppp/ppp_mppe.h b/drivers/net/ppp/ppp_mppe.h index 7a14e058c668..677b3b3f7425 100644 --- a/drivers/net/ppp/ppp_mppe.h +++ b/drivers/net/ppp/ppp_mppe.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #define MPPE_PAD                4      /* MPPE growth per frame */  #define MPPE_MAX_KEY_LEN       16      /* largest key length (128-bit) */ diff --git a/drivers/net/slip/slip.h b/drivers/net/slip/slip.h index cf32aadf508f..c420e5948522 100644 --- a/drivers/net/slip/slip.h +++ b/drivers/net/slip/slip.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * slip.h	Define the SLIP device driver interface and constants.   * diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 21b71ae947fd..6c0c84c33e1f 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -517,6 +517,10 @@ static int tap_open(struct inode *inode, struct file *file)  					     &tap_proto, 0);  	if (!q)  		goto err; +	if (skb_array_init(&q->skb_array, tap->dev->tx_queue_len, GFP_KERNEL)) { +		sk_free(&q->sk); +		goto err; +	}  	RCU_INIT_POINTER(q->sock.wq, &q->wq);  	init_waitqueue_head(&q->wq.wait); @@ -540,22 +544,18 @@ static int tap_open(struct inode *inode, struct file *file)  	if ((tap->dev->features & NETIF_F_HIGHDMA) && (tap->dev->features & NETIF_F_SG))  		sock_set_flag(&q->sk, SOCK_ZEROCOPY); -	err = -ENOMEM; -	if (skb_array_init(&q->skb_array, tap->dev->tx_queue_len, GFP_KERNEL)) -		goto err_array; -  	err = tap_set_queue(tap, file, q); -	if (err) -		goto err_queue; +	if (err) { +		/* tap_sock_destruct() will take care of freeing skb_array */ +		goto err_put; +	}  	dev_put(tap->dev);  	rtnl_unlock();  	return err; -err_queue: -	skb_array_cleanup(&q->skb_array); -err_array: +err_put:  	sock_put(&q->sk);  err:  	if (tap) @@ -1032,6 +1032,8 @@ static long tap_ioctl(struct file *file, unsigned int cmd,  	case TUNSETSNDBUF:  		if (get_user(s, sp))  			return -EFAULT; +		if (s <= 0) +			return -EINVAL;  		q->sk.sk_sndbuf = s;  		return 0; @@ -1249,8 +1251,8 @@ static int tap_list_add(dev_t major, const char *device_name)  	return 0;  } -int tap_create_cdev(struct cdev *tap_cdev, -		    dev_t *tap_major, const char *device_name) +int tap_create_cdev(struct cdev *tap_cdev, dev_t *tap_major, +		    const char *device_name, struct module *module)  {  	int err; @@ -1259,6 +1261,7 @@ int tap_create_cdev(struct cdev *tap_cdev,  		goto out1;  	cdev_init(tap_cdev, &tap_fops); +	tap_cdev->owner = module;  	err = cdev_add(tap_cdev, *tap_major, TAP_NUM_DEVS);  	if (err)  		goto out2; diff --git a/drivers/net/team/Makefile b/drivers/net/team/Makefile index c57e85889751..f582d81a5091 100644 --- a/drivers/net/team/Makefile +++ b/drivers/net/team/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the network team driver  # diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 3c9985f29950..42bb820a56c9 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1286,6 +1286,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,  	buflen += SKB_DATA_ALIGN(len + pad);  	rcu_read_unlock(); +	alloc_frag->offset = ALIGN((u64)alloc_frag->offset, SMP_CACHE_BYTES);  	if (unlikely(!skb_page_frag_refill(buflen, alloc_frag, GFP_KERNEL)))  		return ERR_PTR(-ENOMEM); @@ -1496,11 +1497,13 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,  	switch (tun->flags & TUN_TYPE_MASK) {  	case IFF_TUN:  		if (tun->flags & IFF_NO_PI) { -			switch (skb->data[0] & 0xf0) { -			case 0x40: +			u8 ip_version = skb->len ? (skb->data[0] >> 4) : 0; + +			switch (ip_version) { +			case 4:  				pi.proto = htons(ETH_P_IP);  				break; -			case 0x60: +			case 6:  				pi.proto = htons(ETH_P_IPV6);  				break;  			default: @@ -2025,6 +2028,9 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)  		if (!dev)  			return -ENOMEM; +		err = dev_get_valid_name(net, dev, name); +		if (err < 0) +			goto err_free_dev;  		dev_net_set(dev, net);  		dev->rtnl_link_ops = &tun_link_ops; @@ -2423,6 +2429,10 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,  			ret = -EFAULT;  			break;  		} +		if (sndbuf <= 0) { +			ret = -EINVAL; +			break; +		}  		tun->sndbuf = sndbuf;  		tun_set_sndbuf(tun); diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile index 37fb46aee341..27307a4ab003 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for USB Network drivers  # diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 8ab281b478f2..3e7a3ac3a362 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -54,11 +54,19 @@ static int is_wireless_rndis(struct usb_interface_descriptor *desc)  		desc->bInterfaceProtocol == 3);  } +static int is_novatel_rndis(struct usb_interface_descriptor *desc) +{ +	return (desc->bInterfaceClass == USB_CLASS_MISC && +		desc->bInterfaceSubClass == 4 && +		desc->bInterfaceProtocol == 1); +} +  #else  #define is_rndis(desc)		0  #define is_activesync(desc)	0  #define is_wireless_rndis(desc)	0 +#define is_novatel_rndis(desc)	0  #endif @@ -150,7 +158,8 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)  	 */  	rndis = (is_rndis(&intf->cur_altsetting->desc) ||  		 is_activesync(&intf->cur_altsetting->desc) || -		 is_wireless_rndis(&intf->cur_altsetting->desc)); +		 is_wireless_rndis(&intf->cur_altsetting->desc) || +		 is_novatel_rndis(&intf->cur_altsetting->desc));  	memset(info, 0, sizeof(*info));  	info->control = intf; @@ -547,9 +556,12 @@ static const struct driver_info wwan_info = {  #define REALTEK_VENDOR_ID	0x0bda  #define SAMSUNG_VENDOR_ID	0x04e8  #define LENOVO_VENDOR_ID	0x17ef +#define LINKSYS_VENDOR_ID	0x13b1  #define NVIDIA_VENDOR_ID	0x0955  #define HP_VENDOR_ID		0x03f0  #define MICROSOFT_VENDOR_ID	0x045e +#define UBLOX_VENDOR_ID		0x1546 +#define TPLINK_VENDOR_ID	0x2357  static const struct usb_device_id	products[] = {  /* BLACKLIST !! @@ -737,6 +749,15 @@ static const struct usb_device_id	products[] = {  	.driver_info = 0,  }, +#if IS_ENABLED(CONFIG_USB_RTL8152) +/* Linksys USB3GIGV1 Ethernet Adapter */ +{ +	USB_DEVICE_AND_INTERFACE_INFO(LINKSYS_VENDOR_ID, 0x0041, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +	.driver_info = 0, +}, +#endif +  /* ThinkPad USB-C Dock (based on Realtek RTL8153) */  {  	USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM, @@ -793,6 +814,13 @@ static const struct usb_device_id	products[] = {  	.driver_info = 0,  }, +	/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ +{ +	USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +	.driver_info = 0, +}, +  /* WHITELIST!!!   *   * CDC Ether uses two interfaces, not necessarily consecutive. @@ -844,12 +872,30 @@ static const struct usb_device_id	products[] = {  			USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),  	.driver_info = (kernel_ulong_t)&wwan_info,  }, { +	/* Huawei ME906 and ME909 */ +	USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, USB_CLASS_COMM, +				      USB_CDC_SUBCLASS_ETHERNET, +				      USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long)&wwan_info, +}, {  	/* ZTE modules */  	USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, USB_CLASS_COMM,  				      USB_CDC_SUBCLASS_ETHERNET,  				      USB_CDC_PROTO_NONE),  	.driver_info = (unsigned long)&zte_cdc_info,  }, { +	/* U-blox TOBY-L2 */ +	USB_DEVICE_AND_INTERFACE_INFO(UBLOX_VENDOR_ID, 0x1143, USB_CLASS_COMM, +				      USB_CDC_SUBCLASS_ETHERNET, +				      USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long)&wwan_info, +}, { +	/* U-blox SARA-U2 */ +	USB_DEVICE_AND_INTERFACE_INFO(UBLOX_VENDOR_ID, 0x1104, USB_CLASS_COMM, +				      USB_CDC_SUBCLASS_ETHERNET, +				      USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long)&wwan_info, +}, {  	USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,  			USB_CDC_PROTO_NONE),  	.driver_info = (unsigned long) &cdc_info, diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index b99a7fb09f8e..0161f77641fa 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -1265,30 +1265,45 @@ static int lan78xx_ethtool_get_eeprom(struct net_device *netdev,  				      struct ethtool_eeprom *ee, u8 *data)  {  	struct lan78xx_net *dev = netdev_priv(netdev); +	int ret; + +	ret = usb_autopm_get_interface(dev->intf); +	if (ret) +		return ret;  	ee->magic = LAN78XX_EEPROM_MAGIC; -	return lan78xx_read_raw_eeprom(dev, ee->offset, ee->len, data); +	ret = lan78xx_read_raw_eeprom(dev, ee->offset, ee->len, data); + +	usb_autopm_put_interface(dev->intf); + +	return ret;  }  static int lan78xx_ethtool_set_eeprom(struct net_device *netdev,  				      struct ethtool_eeprom *ee, u8 *data)  {  	struct lan78xx_net *dev = netdev_priv(netdev); +	int ret; + +	ret = usb_autopm_get_interface(dev->intf); +	if (ret) +		return ret; -	/* Allow entire eeprom update only */ -	if ((ee->magic == LAN78XX_EEPROM_MAGIC) && -	    (ee->offset == 0) && -	    (ee->len == 512) && -	    (data[0] == EEPROM_INDICATOR)) -		return lan78xx_write_raw_eeprom(dev, ee->offset, ee->len, data); +	/* Invalid EEPROM_INDICATOR at offset zero will result in a failure +	 * to load data from EEPROM +	 */ +	if (ee->magic == LAN78XX_EEPROM_MAGIC) +		ret = lan78xx_write_raw_eeprom(dev, ee->offset, ee->len, data);  	else if ((ee->magic == LAN78XX_OTP_MAGIC) &&  		 (ee->offset == 0) &&  		 (ee->len == 512) &&  		 (data[0] == OTP_INDICATOR_1)) -		return lan78xx_write_raw_otp(dev, ee->offset, ee->len, data); +		ret = lan78xx_write_raw_otp(dev, ee->offset, ee->len, data); + +	usb_autopm_put_interface(dev->intf); -	return -EINVAL; +	return ret;  }  static void lan78xx_get_strings(struct net_device *netdev, u32 stringset, @@ -2434,7 +2449,6 @@ static int lan78xx_reset(struct lan78xx_net *dev)  	/* LAN7801 only has RGMII mode */  	if (dev->chipid == ID_REV_CHIP_ID_7801_)  		buf &= ~MAC_CR_GMII_EN_; -	buf |= MAC_CR_AUTO_DUPLEX_ | MAC_CR_AUTO_SPEED_;  	ret = lan78xx_write_reg(dev, MAC_CR, buf);  	ret = lan78xx_read_reg(dev, MAC_TX, &buf); diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index ceb78e2ea4f0..d51d9abf7986 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -613,7 +613,9 @@ enum rtl8152_flags {  #define VENDOR_ID_MICROSOFT		0x045e  #define VENDOR_ID_SAMSUNG		0x04e8  #define VENDOR_ID_LENOVO		0x17ef +#define VENDOR_ID_LINKSYS		0x13b1  #define VENDOR_ID_NVIDIA		0x0955 +#define VENDOR_ID_TPLINK		0x2357  #define MCU_TYPE_PLA			0x0100  #define MCU_TYPE_USB			0x0000 @@ -5316,7 +5318,9 @@ static const struct usb_device_id rtl8152_table[] = {  	{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x7205)},  	{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x720c)},  	{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x7214)}, +	{REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041)},  	{REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA,  0x09ff)}, +	{REALTEK_USB_DEVICE(VENDOR_ID_TPLINK,  0x0601)},  	{}  }; diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index a151f267aebb..b807c91abe1d 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c @@ -632,6 +632,10 @@ static const struct usb_device_id	products [] = {  	/* RNDIS for tethering */  	USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),  	.driver_info = (unsigned long) &rndis_info, +}, { +	/* Novatel Verizon USB730L */ +	USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1), +	.driver_info = (unsigned long) &rndis_info,  },  	{ },		// END  }; diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index 9b243e6f3008..7dc3bcac3506 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c @@ -1165,7 +1165,7 @@ static int vrf_fib_rule(const struct net_device *dev, __u8 family, bool add_it)  	frh->family = family;  	frh->action = FR_ACT_TO_TBL; -	if (nla_put_u32(skb, FRA_L3MDEV, 1)) +	if (nla_put_u8(skb, FRA_L3MDEV, 1))  		goto nla_put_failure;  	if (nla_put_u32(skb, FRA_PRIORITY, FIB_RULE_PREF)) diff --git a/drivers/net/wan/Makefile b/drivers/net/wan/Makefile index 73c2326603fc..9532e69fda87 100644 --- a/drivers/net/wan/Makefile +++ b/drivers/net/wan/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Linux network (wan) device drivers.  # diff --git a/drivers/net/wan/hd64570.h b/drivers/net/wan/hd64570.h index 10963e8f4b39..24529996c872 100644 --- a/drivers/net/wan/hd64570.h +++ b/drivers/net/wan/hd64570.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __HD64570_H  #define __HD64570_H diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c index 63f749078a1f..0e3f8ed84660 100644 --- a/drivers/net/wan/lapbether.c +++ b/drivers/net/wan/lapbether.c @@ -346,7 +346,6 @@ out:  fail:  	dev_put(dev);  	free_netdev(ndev); -	kfree(lapbeth);  	goto out;  } diff --git a/drivers/net/wan/lmc/lmc.h b/drivers/net/wan/lmc/lmc.h index 4ced7ac16c2c..38961793adad 100644 --- a/drivers/net/wan/lmc/lmc.h +++ b/drivers/net/wan/lmc/lmc.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _LMC_H_  #define _LMC_H_ diff --git a/drivers/net/wan/lmc/lmc_debug.c b/drivers/net/wan/lmc/lmc_debug.c index 15049d711f47..f999db788506 100644 --- a/drivers/net/wan/lmc/lmc_debug.c +++ b/drivers/net/wan/lmc/lmc_debug.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/types.h>  #include <linux/netdevice.h>  #include <linux/interrupt.h> diff --git a/drivers/net/wan/lmc/lmc_debug.h b/drivers/net/wan/lmc/lmc_debug.h index 2d46f121549f..820adcae5d67 100644 --- a/drivers/net/wan/lmc/lmc_debug.h +++ b/drivers/net/wan/lmc/lmc_debug.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _LMC_DEBUG_H_  #define _LMC_DEBUG_H_ diff --git a/drivers/net/wan/lmc/lmc_proto.h b/drivers/net/wan/lmc/lmc_proto.h index 662148c54644..bb098e443776 100644 --- a/drivers/net/wan/lmc/lmc_proto.h +++ b/drivers/net/wan/lmc/lmc_proto.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _LMC_PROTO_H_  #define _LMC_PROTO_H_ diff --git a/drivers/net/wan/x25_asy.h b/drivers/net/wan/x25_asy.h index f57ee67836ae..eb4a4216ee94 100644 --- a/drivers/net/wan/x25_asy.h +++ b/drivers/net/wan/x25_asy.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _LINUX_X25_ASY_H  #define _LINUX_X25_ASY_H diff --git a/drivers/net/wan/z85230.h b/drivers/net/wan/z85230.h index 2416a9d60bd6..32ae710d4f40 100644 --- a/drivers/net/wan/z85230.h +++ b/drivers/net/wan/z85230.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   *	Description of Z8530 Z85C30 and Z85230 communications chips   * diff --git a/drivers/net/wimax/i2400m/Makefile b/drivers/net/wimax/i2400m/Makefile index f6d19c348082..b1db1eff0648 100644 --- a/drivers/net/wimax/i2400m/Makefile +++ b/drivers/net/wimax/i2400m/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_WIMAX_I2400M) += i2400m.o  obj-$(CONFIG_WIMAX_I2400M_USB) += i2400m-usb.o diff --git a/drivers/net/wimax/i2400m/fw.c b/drivers/net/wimax/i2400m/fw.c index c9c711dcd0e6..a89b5685e68b 100644 --- a/drivers/net/wimax/i2400m/fw.c +++ b/drivers/net/wimax/i2400m/fw.c @@ -652,7 +652,7 @@ static int i2400m_download_chunk(struct i2400m *i2400m, const void *chunk,  	struct device *dev = i2400m_dev(i2400m);  	struct {  		struct i2400m_bootrom_header cmd; -		u8 cmd_payload[chunk_len]; +		u8 cmd_payload[];  	} __packed *buf;  	struct i2400m_bootrom_header ack; diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile index 54b41ac5f9c8..7fc96306712a 100644 --- a/drivers/net/wireless/Makefile +++ b/drivers/net/wireless/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Linux Wireless network device drivers.  # diff --git a/drivers/net/wireless/admtek/adm8211.h b/drivers/net/wireless/admtek/adm8211.h index bbc10b1cde87..2c55c629de28 100644 --- a/drivers/net/wireless/admtek/adm8211.h +++ b/drivers/net/wireless/admtek/adm8211.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef ADM8211_H  #define ADM8211_H diff --git a/drivers/net/wireless/ath/Makefile b/drivers/net/wireless/ath/Makefile index 4cdebc7659dd..e4e460b5498e 100644 --- a/drivers/net/wireless/ath/Makefile +++ b/drivers/net/wireless/ath/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_ATH5K)		+= ath5k/  obj-$(CONFIG_ATH9K_HW)		+= ath9k/  obj-$(CONFIG_CARL9170)		+= carl9170/ diff --git a/drivers/net/wireless/ath/ath10k/Makefile b/drivers/net/wireless/ath/ath10k/Makefile index 899b9b79f4ce..9492177e9063 100644 --- a/drivers/net/wireless/ath/ath10k/Makefile +++ b/drivers/net/wireless/ath/ath10k/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_ATH10K) += ath10k_core.o  ath10k_core-y += mac.o \  		 debug.o \ diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c index a3f5dc78353f..0aeeb233af78 100644 --- a/drivers/net/wireless/ath/ath10k/htt_rx.c +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c @@ -550,6 +550,11 @@ static int ath10k_htt_rx_crypto_param_len(struct ath10k *ar,  		return IEEE80211_TKIP_IV_LEN;  	case HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2:  		return IEEE80211_CCMP_HDR_LEN; +	case HTT_RX_MPDU_ENCRYPT_AES_CCM256_WPA2: +		return IEEE80211_CCMP_256_HDR_LEN; +	case HTT_RX_MPDU_ENCRYPT_AES_GCMP_WPA2: +	case HTT_RX_MPDU_ENCRYPT_AES_GCMP256_WPA2: +		return IEEE80211_GCMP_HDR_LEN;  	case HTT_RX_MPDU_ENCRYPT_WEP128:  	case HTT_RX_MPDU_ENCRYPT_WAPI:  		break; @@ -575,6 +580,11 @@ static int ath10k_htt_rx_crypto_tail_len(struct ath10k *ar,  		return IEEE80211_TKIP_ICV_LEN;  	case HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2:  		return IEEE80211_CCMP_MIC_LEN; +	case HTT_RX_MPDU_ENCRYPT_AES_CCM256_WPA2: +		return IEEE80211_CCMP_256_MIC_LEN; +	case HTT_RX_MPDU_ENCRYPT_AES_GCMP_WPA2: +	case HTT_RX_MPDU_ENCRYPT_AES_GCMP256_WPA2: +		return IEEE80211_GCMP_MIC_LEN;  	case HTT_RX_MPDU_ENCRYPT_WEP128:  	case HTT_RX_MPDU_ENCRYPT_WAPI:  		break; @@ -1051,9 +1061,21 @@ static void ath10k_htt_rx_h_undecap_raw(struct ath10k *ar,  	hdr = (void *)msdu->data;  	/* Tail */ -	if (status->flag & RX_FLAG_IV_STRIPPED) +	if (status->flag & RX_FLAG_IV_STRIPPED) {  		skb_trim(msdu, msdu->len -  			 ath10k_htt_rx_crypto_tail_len(ar, enctype)); +	} else { +		/* MIC */ +		if ((status->flag & RX_FLAG_MIC_STRIPPED) && +		    enctype == HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2) +			skb_trim(msdu, msdu->len - 8); + +		/* ICV */ +		if (status->flag & RX_FLAG_ICV_STRIPPED && +		    enctype != HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2) +			skb_trim(msdu, msdu->len - +				 ath10k_htt_rx_crypto_tail_len(ar, enctype)); +	}  	/* MMIC */  	if ((status->flag & RX_FLAG_MMIC_STRIPPED) && @@ -1075,7 +1097,8 @@ static void ath10k_htt_rx_h_undecap_raw(struct ath10k *ar,  static void ath10k_htt_rx_h_undecap_nwifi(struct ath10k *ar,  					  struct sk_buff *msdu,  					  struct ieee80211_rx_status *status, -					  const u8 first_hdr[64]) +					  const u8 first_hdr[64], +					  enum htt_rx_mpdu_encrypt_type enctype)  {  	struct ieee80211_hdr *hdr;  	struct htt_rx_desc *rxd; @@ -1083,6 +1106,7 @@ static void ath10k_htt_rx_h_undecap_nwifi(struct ath10k *ar,  	u8 da[ETH_ALEN];  	u8 sa[ETH_ALEN];  	int l3_pad_bytes; +	int bytes_aligned = ar->hw_params.decap_align_bytes;  	/* Delivered decapped frame:  	 * [nwifi 802.11 header] <-- replaced with 802.11 hdr @@ -1111,6 +1135,14 @@ static void ath10k_htt_rx_h_undecap_nwifi(struct ath10k *ar,  	/* push original 802.11 header */  	hdr = (struct ieee80211_hdr *)first_hdr;  	hdr_len = ieee80211_hdrlen(hdr->frame_control); + +	if (!(status->flag & RX_FLAG_IV_STRIPPED)) { +		memcpy(skb_push(msdu, +				ath10k_htt_rx_crypto_param_len(ar, enctype)), +		       (void *)hdr + round_up(hdr_len, bytes_aligned), +			ath10k_htt_rx_crypto_param_len(ar, enctype)); +	} +  	memcpy(skb_push(msdu, hdr_len), hdr, hdr_len);  	/* original 802.11 header has a different DA and in @@ -1171,6 +1203,7 @@ static void ath10k_htt_rx_h_undecap_eth(struct ath10k *ar,  	u8 sa[ETH_ALEN];  	int l3_pad_bytes;  	struct htt_rx_desc *rxd; +	int bytes_aligned = ar->hw_params.decap_align_bytes;  	/* Delivered decapped frame:  	 * [eth header] <-- replaced with 802.11 hdr & rfc1042/llc @@ -1199,6 +1232,14 @@ static void ath10k_htt_rx_h_undecap_eth(struct ath10k *ar,  	/* push original 802.11 header */  	hdr = (struct ieee80211_hdr *)first_hdr;  	hdr_len = ieee80211_hdrlen(hdr->frame_control); + +	if (!(status->flag & RX_FLAG_IV_STRIPPED)) { +		memcpy(skb_push(msdu, +				ath10k_htt_rx_crypto_param_len(ar, enctype)), +		       (void *)hdr + round_up(hdr_len, bytes_aligned), +			ath10k_htt_rx_crypto_param_len(ar, enctype)); +	} +  	memcpy(skb_push(msdu, hdr_len), hdr, hdr_len);  	/* original 802.11 header has a different DA and in @@ -1212,12 +1253,14 @@ static void ath10k_htt_rx_h_undecap_eth(struct ath10k *ar,  static void ath10k_htt_rx_h_undecap_snap(struct ath10k *ar,  					 struct sk_buff *msdu,  					 struct ieee80211_rx_status *status, -					 const u8 first_hdr[64]) +					 const u8 first_hdr[64], +					 enum htt_rx_mpdu_encrypt_type enctype)  {  	struct ieee80211_hdr *hdr;  	size_t hdr_len;  	int l3_pad_bytes;  	struct htt_rx_desc *rxd; +	int bytes_aligned = ar->hw_params.decap_align_bytes;  	/* Delivered decapped frame:  	 * [amsdu header] <-- replaced with 802.11 hdr @@ -1233,6 +1276,14 @@ static void ath10k_htt_rx_h_undecap_snap(struct ath10k *ar,  	hdr = (struct ieee80211_hdr *)first_hdr;  	hdr_len = ieee80211_hdrlen(hdr->frame_control); + +	if (!(status->flag & RX_FLAG_IV_STRIPPED)) { +		memcpy(skb_push(msdu, +				ath10k_htt_rx_crypto_param_len(ar, enctype)), +		       (void *)hdr + round_up(hdr_len, bytes_aligned), +			ath10k_htt_rx_crypto_param_len(ar, enctype)); +	} +  	memcpy(skb_push(msdu, hdr_len), hdr, hdr_len);  } @@ -1267,13 +1318,15 @@ static void ath10k_htt_rx_h_undecap(struct ath10k *ar,  					    is_decrypted);  		break;  	case RX_MSDU_DECAP_NATIVE_WIFI: -		ath10k_htt_rx_h_undecap_nwifi(ar, msdu, status, first_hdr); +		ath10k_htt_rx_h_undecap_nwifi(ar, msdu, status, first_hdr, +					      enctype);  		break;  	case RX_MSDU_DECAP_ETHERNET2_DIX:  		ath10k_htt_rx_h_undecap_eth(ar, msdu, status, first_hdr, enctype);  		break;  	case RX_MSDU_DECAP_8023_SNAP_LLC: -		ath10k_htt_rx_h_undecap_snap(ar, msdu, status, first_hdr); +		ath10k_htt_rx_h_undecap_snap(ar, msdu, status, first_hdr, +					     enctype);  		break;  	}  } @@ -1316,7 +1369,8 @@ static void ath10k_htt_rx_h_csum_offload(struct sk_buff *msdu)  static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,  				 struct sk_buff_head *amsdu, -				 struct ieee80211_rx_status *status) +				 struct ieee80211_rx_status *status, +				 bool fill_crypt_header)  {  	struct sk_buff *first;  	struct sk_buff *last; @@ -1326,7 +1380,6 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,  	enum htt_rx_mpdu_encrypt_type enctype;  	u8 first_hdr[64];  	u8 *qos; -	size_t hdr_len;  	bool has_fcs_err;  	bool has_crypto_err;  	bool has_tkip_err; @@ -1351,15 +1404,17 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,  	 * decapped header. It'll be used for undecapping of each MSDU.  	 */  	hdr = (void *)rxd->rx_hdr_status; -	hdr_len = ieee80211_hdrlen(hdr->frame_control); -	memcpy(first_hdr, hdr, hdr_len); +	memcpy(first_hdr, hdr, RX_HTT_HDR_STATUS_LEN);  	/* Each A-MSDU subframe will use the original header as the base and be  	 * reported as a separate MSDU so strip the A-MSDU bit from QoS Ctl.  	 */  	hdr = (void *)first_hdr; -	qos = ieee80211_get_qos_ctl(hdr); -	qos[0] &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT; + +	if (ieee80211_is_data_qos(hdr->frame_control)) { +		qos = ieee80211_get_qos_ctl(hdr); +		qos[0] &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT; +	}  	/* Some attention flags are valid only in the last MSDU. */  	last = skb_peek_tail(amsdu); @@ -1406,9 +1461,14 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,  		status->flag |= RX_FLAG_DECRYPTED;  		if (likely(!is_mgmt)) -			status->flag |= RX_FLAG_IV_STRIPPED | -					RX_FLAG_MMIC_STRIPPED; -} +			status->flag |= RX_FLAG_MMIC_STRIPPED; + +		if (fill_crypt_header) +			status->flag |= RX_FLAG_MIC_STRIPPED | +					RX_FLAG_ICV_STRIPPED; +		else +			status->flag |= RX_FLAG_IV_STRIPPED; +	}  	skb_queue_walk(amsdu, msdu) {  		ath10k_htt_rx_h_csum_offload(msdu); @@ -1424,6 +1484,9 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,  		if (is_mgmt)  			continue; +		if (fill_crypt_header) +			continue; +  		hdr = (void *)msdu->data;  		hdr->frame_control &= ~__cpu_to_le16(IEEE80211_FCTL_PROTECTED);  	} @@ -1434,6 +1497,9 @@ static void ath10k_htt_rx_h_deliver(struct ath10k *ar,  				    struct ieee80211_rx_status *status)  {  	struct sk_buff *msdu; +	struct sk_buff *first_subframe; + +	first_subframe = skb_peek(amsdu);  	while ((msdu = __skb_dequeue(amsdu))) {  		/* Setup per-MSDU flags */ @@ -1442,6 +1508,13 @@ static void ath10k_htt_rx_h_deliver(struct ath10k *ar,  		else  			status->flag |= RX_FLAG_AMSDU_MORE; +		if (msdu == first_subframe) { +			first_subframe = NULL; +			status->flag &= ~RX_FLAG_ALLOW_SAME_PN; +		} else { +			status->flag |= RX_FLAG_ALLOW_SAME_PN; +		} +  		ath10k_process_rx(ar, status, msdu);  	}  } @@ -1584,7 +1657,7 @@ static int ath10k_htt_rx_handle_amsdu(struct ath10k_htt *htt)  		ath10k_htt_rx_h_unchain(ar, &amsdu);  	ath10k_htt_rx_h_filter(ar, &amsdu, rx_status); -	ath10k_htt_rx_h_mpdu(ar, &amsdu, rx_status); +	ath10k_htt_rx_h_mpdu(ar, &amsdu, rx_status, true);  	ath10k_htt_rx_h_deliver(ar, &amsdu, rx_status);  	return num_msdus; @@ -1745,8 +1818,7 @@ static void ath10k_htt_rx_delba(struct ath10k *ar, struct htt_resp *resp)  }  static int ath10k_htt_rx_extract_amsdu(struct sk_buff_head *list, -				       struct sk_buff_head *amsdu, -				       int budget_left) +				       struct sk_buff_head *amsdu)  {  	struct sk_buff *msdu;  	struct htt_rx_desc *rxd; @@ -1757,9 +1829,8 @@ static int ath10k_htt_rx_extract_amsdu(struct sk_buff_head *list,  	if (WARN_ON(!skb_queue_empty(amsdu)))  		return -EINVAL; -	while ((msdu = __skb_dequeue(list)) && budget_left) { +	while ((msdu = __skb_dequeue(list))) {  		__skb_queue_tail(amsdu, msdu); -		budget_left--;  		rxd = (void *)msdu->data - sizeof(*rxd);  		if (rxd->msdu_end.common.info0 & @@ -1850,8 +1921,7 @@ static int ath10k_htt_rx_h_rx_offload(struct ath10k *ar,  	return num_msdu;  } -static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb, -				    int budget_left) +static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb)  {  	struct ath10k_htt *htt = &ar->htt;  	struct htt_resp *resp = (void *)skb->data; @@ -1908,9 +1978,9 @@ static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb,  	if (offload)  		num_msdus = ath10k_htt_rx_h_rx_offload(ar, &list); -	while (!skb_queue_empty(&list) && budget_left) { +	while (!skb_queue_empty(&list)) {  		__skb_queue_head_init(&amsdu); -		ret = ath10k_htt_rx_extract_amsdu(&list, &amsdu, budget_left); +		ret = ath10k_htt_rx_extract_amsdu(&list, &amsdu);  		switch (ret) {  		case 0:  			/* Note: The in-order indication may report interleaved @@ -1920,10 +1990,9 @@ static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb,  			 * should still give an idea about rx rate to the user.  			 */  			num_msdus += skb_queue_len(&amsdu); -			budget_left -= skb_queue_len(&amsdu);  			ath10k_htt_rx_h_ppdu(ar, &amsdu, status, vdev_id);  			ath10k_htt_rx_h_filter(ar, &amsdu, status); -			ath10k_htt_rx_h_mpdu(ar, &amsdu, status); +			ath10k_htt_rx_h_mpdu(ar, &amsdu, status, false);  			ath10k_htt_rx_h_deliver(ar, &amsdu, status);  			break;  		case -EAGAIN: @@ -2563,8 +2632,7 @@ int ath10k_htt_txrx_compl_task(struct ath10k *ar, int budget)  		}  		spin_lock_bh(&htt->rx_ring.lock); -		num_rx_msdus = ath10k_htt_rx_in_ord_ind(ar, skb, -							(budget - quota)); +		num_rx_msdus = ath10k_htt_rx_in_ord_ind(ar, skb);  		spin_unlock_bh(&htt->rx_ring.lock);  		if (num_rx_msdus < 0) {  			resched_napi = true; diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c index bc1633945a56..195dafb98131 100644 --- a/drivers/net/wireless/ath/ath10k/pci.c +++ b/drivers/net/wireless/ath/ath10k/pci.c @@ -3396,9 +3396,7 @@ static void ath10k_pci_remove(struct pci_dev *pdev)  MODULE_DEVICE_TABLE(pci, ath10k_pci_id_table); -#ifdef CONFIG_PM - -static int ath10k_pci_pm_suspend(struct device *dev) +static __maybe_unused int ath10k_pci_pm_suspend(struct device *dev)  {  	struct ath10k *ar = dev_get_drvdata(dev);  	int ret; @@ -3414,7 +3412,7 @@ static int ath10k_pci_pm_suspend(struct device *dev)  	return ret;  } -static int ath10k_pci_pm_resume(struct device *dev) +static __maybe_unused int ath10k_pci_pm_resume(struct device *dev)  {  	struct ath10k *ar = dev_get_drvdata(dev);  	int ret; @@ -3433,7 +3431,6 @@ static int ath10k_pci_pm_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(ath10k_pci_pm_ops,  			 ath10k_pci_pm_suspend,  			 ath10k_pci_pm_resume); -#endif  static struct pci_driver ath10k_pci_driver = {  	.name = "ath10k_pci", diff --git a/drivers/net/wireless/ath/ath10k/rx_desc.h b/drivers/net/wireless/ath/ath10k/rx_desc.h index c1022a1cf855..28da14398951 100644 --- a/drivers/net/wireless/ath/ath10k/rx_desc.h +++ b/drivers/net/wireless/ath/ath10k/rx_desc.h @@ -239,6 +239,9 @@ enum htt_rx_mpdu_encrypt_type {  	HTT_RX_MPDU_ENCRYPT_WAPI             = 5,  	HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2     = 6,  	HTT_RX_MPDU_ENCRYPT_NONE             = 7, +	HTT_RX_MPDU_ENCRYPT_AES_CCM256_WPA2  = 8, +	HTT_RX_MPDU_ENCRYPT_AES_GCMP_WPA2    = 9, +	HTT_RX_MPDU_ENCRYPT_AES_GCMP256_WPA2 = 10,  };  #define RX_MPDU_START_INFO0_PEER_IDX_MASK     0x000007ff diff --git a/drivers/net/wireless/ath/ath5k/Makefile b/drivers/net/wireless/ath/ath5k/Makefile index 1b3a34f7f224..a8724eee21f8 100644 --- a/drivers/net/wireless/ath/ath5k/Makefile +++ b/drivers/net/wireless/ath/ath5k/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  ath5k-y				+= caps.o  ath5k-y				+= initvals.o  ath5k-y				+= eeprom.o diff --git a/drivers/net/wireless/ath/ath5k/sysfs.c b/drivers/net/wireless/ath/ath5k/sysfs.c index 04cf0ca72610..25978c732fe1 100644 --- a/drivers/net/wireless/ath/ath5k/sysfs.c +++ b/drivers/net/wireless/ath/ath5k/sysfs.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt  #include <linux/device.h> diff --git a/drivers/net/wireless/ath/ath5k/trace.h b/drivers/net/wireless/ath/ath5k/trace.h index c6eef519bb61..a41e3bf42dfc 100644 --- a/drivers/net/wireless/ath/ath5k/trace.h +++ b/drivers/net/wireless/ath/ath5k/trace.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #if !defined(__TRACE_ATH5K_H) || defined(TRACE_HEADER_MULTI_READ)  #define __TRACE_ATH5K_H diff --git a/drivers/net/wireless/ath/ath6kl/trace.h b/drivers/net/wireless/ath/ath6kl/trace.h index 1a1ea7881b4d..91e735cfdef7 100644 --- a/drivers/net/wireless/ath/ath6kl/trace.h +++ b/drivers/net/wireless/ath/ath6kl/trace.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #if !defined(_ATH6KL_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)  #include <net/cfg80211.h> diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile index 36a40ffdce15..d804ce7391a0 100644 --- a/drivers/net/wireless/ath/ath9k/Makefile +++ b/drivers/net/wireless/ath/ath9k/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  ath9k-y +=	beacon.o \  		gpio.o \  		init.o \ diff --git a/drivers/net/wireless/ath/carl9170/version.h b/drivers/net/wireless/ath/carl9170/version.h index a0410fe8c03a..9a44d004c206 100644 --- a/drivers/net/wireless/ath/carl9170/version.h +++ b/drivers/net/wireless/ath/carl9170/version.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __CARL9170_SHARED_VERSION_H  #define __CARL9170_SHARED_VERSION_H  #define CARL9170FW_VERSION_YEAR 16 diff --git a/drivers/net/wireless/ath/wcn36xx/Makefile b/drivers/net/wireless/ath/wcn36xx/Makefile index 50c43b4382ba..3b09435104eb 100644 --- a/drivers/net/wireless/ath/wcn36xx/Makefile +++ b/drivers/net/wireless/ath/wcn36xx/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_WCN36XX) := wcn36xx.o  wcn36xx-y +=   main.o \                 dxe.o \ diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c index 35bd50bcbbd5..b83f01d6e3dd 100644 --- a/drivers/net/wireless/ath/wcn36xx/main.c +++ b/drivers/net/wireless/ath/wcn36xx/main.c @@ -812,7 +812,6 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,  			if (!sta) {  				wcn36xx_err("sta %pM is not found\n",  					      bss_conf->bssid); -				rcu_read_unlock();  				goto out;  			}  			sta_priv = wcn36xx_sta_to_priv(sta); diff --git a/drivers/net/wireless/ath/wil6210/Makefile b/drivers/net/wireless/ath/wil6210/Makefile index d27efe83748b..398edd2a7f2b 100644 --- a/drivers/net/wireless/ath/wil6210/Makefile +++ b/drivers/net/wireless/ath/wil6210/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_WIL6210) += wil6210.o  wil6210-y := main.o diff --git a/drivers/net/wireless/broadcom/b43/Makefile b/drivers/net/wireless/broadcom/b43/Makefile index 27fab958e3d5..54f92ce49bb8 100644 --- a/drivers/net/wireless/broadcom/b43/Makefile +++ b/drivers/net/wireless/broadcom/b43/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  b43-y				+= main.o  b43-y				+= bus.o  b43-$(CONFIG_B43_PHY_G)		+= phy_g.o tables.o lo.o wa.o diff --git a/drivers/net/wireless/broadcom/b43/b43.h b/drivers/net/wireless/broadcom/b43/b43.h index d7d42f0b80c3..b77d1a904f7e 100644 --- a/drivers/net/wireless/broadcom/b43/b43.h +++ b/drivers/net/wireless/broadcom/b43/b43.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_H_  #define B43_H_ diff --git a/drivers/net/wireless/broadcom/b43/bus.h b/drivers/net/wireless/broadcom/b43/bus.h index 256c2c17939a..2a695f9e528b 100644 --- a/drivers/net/wireless/broadcom/b43/bus.h +++ b/drivers/net/wireless/broadcom/b43/bus.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_BUS_H_  #define B43_BUS_H_ diff --git a/drivers/net/wireless/broadcom/b43/debugfs.h b/drivers/net/wireless/broadcom/b43/debugfs.h index d05377745011..0bf437c86c67 100644 --- a/drivers/net/wireless/broadcom/b43/debugfs.h +++ b/drivers/net/wireless/broadcom/b43/debugfs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_DEBUGFS_H_  #define B43_DEBUGFS_H_ diff --git a/drivers/net/wireless/broadcom/b43/dma.h b/drivers/net/wireless/broadcom/b43/dma.h index df8c8cdcbdb5..c2a357219d4b 100644 --- a/drivers/net/wireless/broadcom/b43/dma.h +++ b/drivers/net/wireless/broadcom/b43/dma.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_DMA_H_  #define B43_DMA_H_ diff --git a/drivers/net/wireless/broadcom/b43/leds.h b/drivers/net/wireless/broadcom/b43/leds.h index 32b66d53cdac..5ebd1b2b1749 100644 --- a/drivers/net/wireless/broadcom/b43/leds.h +++ b/drivers/net/wireless/broadcom/b43/leds.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_LEDS_H_  #define B43_LEDS_H_ diff --git a/drivers/net/wireless/broadcom/b43/lo.h b/drivers/net/wireless/broadcom/b43/lo.h index 7b4df3883bc2..66e07ab79c51 100644 --- a/drivers/net/wireless/broadcom/b43/lo.h +++ b/drivers/net/wireless/broadcom/b43/lo.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_LO_H_  #define B43_LO_H_ diff --git a/drivers/net/wireless/broadcom/b43/phy_a.h b/drivers/net/wireless/broadcom/b43/phy_a.h index 0a92d01c21f9..b1cbfc02beb6 100644 --- a/drivers/net/wireless/broadcom/b43/phy_a.h +++ b/drivers/net/wireless/broadcom/b43/phy_a.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef LINUX_B43_PHY_A_H_  #define LINUX_B43_PHY_A_H_ diff --git a/drivers/net/wireless/broadcom/b43/phy_ac.h b/drivers/net/wireless/broadcom/b43/phy_ac.h index d1ca79e0eb24..02eb6c08670d 100644 --- a/drivers/net/wireless/broadcom/b43/phy_ac.h +++ b/drivers/net/wireless/broadcom/b43/phy_ac.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_PHY_AC_H_  #define B43_PHY_AC_H_ diff --git a/drivers/net/wireless/broadcom/b43/phy_common.h b/drivers/net/wireless/broadcom/b43/phy_common.h index ced054a9850c..57a1ad8afa08 100644 --- a/drivers/net/wireless/broadcom/b43/phy_common.h +++ b/drivers/net/wireless/broadcom/b43/phy_common.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef LINUX_B43_PHY_COMMON_H_  #define LINUX_B43_PHY_COMMON_H_ diff --git a/drivers/net/wireless/broadcom/b43/phy_g.h b/drivers/net/wireless/broadcom/b43/phy_g.h index 5413c906a3e7..a27b8603c75f 100644 --- a/drivers/net/wireless/broadcom/b43/phy_g.h +++ b/drivers/net/wireless/broadcom/b43/phy_g.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef LINUX_B43_PHY_G_H_  #define LINUX_B43_PHY_G_H_ diff --git a/drivers/net/wireless/broadcom/b43/phy_ht.h b/drivers/net/wireless/broadcom/b43/phy_ht.h index c086f56ce478..046753857493 100644 --- a/drivers/net/wireless/broadcom/b43/phy_ht.h +++ b/drivers/net/wireless/broadcom/b43/phy_ht.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_PHY_HT_H_  #define B43_PHY_HT_H_ diff --git a/drivers/net/wireless/broadcom/b43/phy_lcn.h b/drivers/net/wireless/broadcom/b43/phy_lcn.h index 6a7092e13fff..0b1cfaf6394c 100644 --- a/drivers/net/wireless/broadcom/b43/phy_lcn.h +++ b/drivers/net/wireless/broadcom/b43/phy_lcn.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_PHY_LCN_H_  #define B43_PHY_LCN_H_ diff --git a/drivers/net/wireless/broadcom/b43/phy_lp.h b/drivers/net/wireless/broadcom/b43/phy_lp.h index 62737f700cbc..50bef2ea6e52 100644 --- a/drivers/net/wireless/broadcom/b43/phy_lp.h +++ b/drivers/net/wireless/broadcom/b43/phy_lp.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef LINUX_B43_PHY_LP_H_  #define LINUX_B43_PHY_LP_H_ diff --git a/drivers/net/wireless/broadcom/b43/phy_n.h b/drivers/net/wireless/broadcom/b43/phy_n.h index a6da2c31a99c..b96ded0ef539 100644 --- a/drivers/net/wireless/broadcom/b43/phy_n.h +++ b/drivers/net/wireless/broadcom/b43/phy_n.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_NPHY_H_  #define B43_NPHY_H_ diff --git a/drivers/net/wireless/broadcom/b43/pio.h b/drivers/net/wireless/broadcom/b43/pio.h index 1e516147424f..ffbfec622f82 100644 --- a/drivers/net/wireless/broadcom/b43/pio.h +++ b/drivers/net/wireless/broadcom/b43/pio.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_PIO_H_  #define B43_PIO_H_ diff --git a/drivers/net/wireless/broadcom/b43/ppr.h b/drivers/net/wireless/broadcom/b43/ppr.h index 24d7447e9f01..094389f9f477 100644 --- a/drivers/net/wireless/broadcom/b43/ppr.h +++ b/drivers/net/wireless/broadcom/b43/ppr.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef LINUX_B43_PPR_H_  #define LINUX_B43_PPR_H_ diff --git a/drivers/net/wireless/broadcom/b43/radio_2055.h b/drivers/net/wireless/broadcom/b43/radio_2055.h index 67f96122f8d8..ad7271cde001 100644 --- a/drivers/net/wireless/broadcom/b43/radio_2055.h +++ b/drivers/net/wireless/broadcom/b43/radio_2055.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_RADIO_2055_H_  #define B43_RADIO_2055_H_ diff --git a/drivers/net/wireless/broadcom/b43/radio_2056.h b/drivers/net/wireless/broadcom/b43/radio_2056.h index 5b86673459fa..59297fdce5e3 100644 --- a/drivers/net/wireless/broadcom/b43/radio_2056.h +++ b/drivers/net/wireless/broadcom/b43/radio_2056.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_RADIO_2056_H_  #define B43_RADIO_2056_H_ diff --git a/drivers/net/wireless/broadcom/b43/radio_2057.h b/drivers/net/wireless/broadcom/b43/radio_2057.h index 220d080238ff..d7959da77b51 100644 --- a/drivers/net/wireless/broadcom/b43/radio_2057.h +++ b/drivers/net/wireless/broadcom/b43/radio_2057.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_RADIO_2057_H_  #define B43_RADIO_2057_H_ diff --git a/drivers/net/wireless/broadcom/b43/radio_2059.h b/drivers/net/wireless/broadcom/b43/radio_2059.h index 9e22fb60588b..32c0025bce9d 100644 --- a/drivers/net/wireless/broadcom/b43/radio_2059.h +++ b/drivers/net/wireless/broadcom/b43/radio_2059.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_RADIO_2059_H_  #define B43_RADIO_2059_H_ diff --git a/drivers/net/wireless/broadcom/b43/rfkill.h b/drivers/net/wireless/broadcom/b43/rfkill.h index f046c3ca0519..8682ac5b828a 100644 --- a/drivers/net/wireless/broadcom/b43/rfkill.h +++ b/drivers/net/wireless/broadcom/b43/rfkill.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_RFKILL_H_  #define B43_RFKILL_H_ diff --git a/drivers/net/wireless/broadcom/b43/sdio.h b/drivers/net/wireless/broadcom/b43/sdio.h index 1e93926f388f..aa5693b123ad 100644 --- a/drivers/net/wireless/broadcom/b43/sdio.h +++ b/drivers/net/wireless/broadcom/b43/sdio.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_SDIO_H_  #define B43_SDIO_H_ diff --git a/drivers/net/wireless/broadcom/b43/sysfs.h b/drivers/net/wireless/broadcom/b43/sysfs.h index 12bda9ef1a85..e70e6cff3c53 100644 --- a/drivers/net/wireless/broadcom/b43/sysfs.h +++ b/drivers/net/wireless/broadcom/b43/sysfs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_SYSFS_H_  #define B43_SYSFS_H_ diff --git a/drivers/net/wireless/broadcom/b43/tables.h b/drivers/net/wireless/broadcom/b43/tables.h index 80e73c7cbac5..3b0777f15f3e 100644 --- a/drivers/net/wireless/broadcom/b43/tables.h +++ b/drivers/net/wireless/broadcom/b43/tables.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_TABLES_H_  #define B43_TABLES_H_ diff --git a/drivers/net/wireless/broadcom/b43/tables_lpphy.h b/drivers/net/wireless/broadcom/b43/tables_lpphy.h index 84f1d265f657..62002098bbda 100644 --- a/drivers/net/wireless/broadcom/b43/tables_lpphy.h +++ b/drivers/net/wireless/broadcom/b43/tables_lpphy.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_TABLES_LPPHY_H_  #define B43_TABLES_LPPHY_H_ diff --git a/drivers/net/wireless/broadcom/b43/tables_nphy.h b/drivers/net/wireless/broadcom/b43/tables_nphy.h index b51f386db02f..3876786d2692 100644 --- a/drivers/net/wireless/broadcom/b43/tables_nphy.h +++ b/drivers/net/wireless/broadcom/b43/tables_nphy.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_TABLES_NPHY_H_  #define B43_TABLES_NPHY_H_ diff --git a/drivers/net/wireless/broadcom/b43/tables_phy_ht.h b/drivers/net/wireless/broadcom/b43/tables_phy_ht.h index 1b5ef2bc770c..7ed057118ae3 100644 --- a/drivers/net/wireless/broadcom/b43/tables_phy_ht.h +++ b/drivers/net/wireless/broadcom/b43/tables_phy_ht.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_TABLES_PHY_HT_H_  #define B43_TABLES_PHY_HT_H_ diff --git a/drivers/net/wireless/broadcom/b43/tables_phy_lcn.h b/drivers/net/wireless/broadcom/b43/tables_phy_lcn.h index caff9db6831f..5ea6c15e851e 100644 --- a/drivers/net/wireless/broadcom/b43/tables_phy_lcn.h +++ b/drivers/net/wireless/broadcom/b43/tables_phy_lcn.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_TABLES_PHY_LCN_H_  #define B43_TABLES_PHY_LCN_H_ diff --git a/drivers/net/wireless/broadcom/b43/wa.h b/drivers/net/wireless/broadcom/b43/wa.h index e163c5e56e81..f3459b99d83b 100644 --- a/drivers/net/wireless/broadcom/b43/wa.h +++ b/drivers/net/wireless/broadcom/b43/wa.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_WA_H_  #define B43_WA_H_ diff --git a/drivers/net/wireless/broadcom/b43/xmit.h b/drivers/net/wireless/broadcom/b43/xmit.h index ba6115308068..6524a75bb73b 100644 --- a/drivers/net/wireless/broadcom/b43/xmit.h +++ b/drivers/net/wireless/broadcom/b43/xmit.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43_XMIT_H_  #define B43_XMIT_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/Makefile b/drivers/net/wireless/broadcom/b43legacy/Makefile index 227a77e84362..f8b392f09009 100644 --- a/drivers/net/wireless/broadcom/b43legacy/Makefile +++ b/drivers/net/wireless/broadcom/b43legacy/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # b43legacy core  b43legacy-y				+= main.o  b43legacy-y				+= ilt.o diff --git a/drivers/net/wireless/broadcom/b43legacy/b43legacy.h b/drivers/net/wireless/broadcom/b43legacy/b43legacy.h index 482476fdb1f3..6b0cec467938 100644 --- a/drivers/net/wireless/broadcom/b43legacy/b43legacy.h +++ b/drivers/net/wireless/broadcom/b43legacy/b43legacy.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_H_  #define B43legacy_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/debugfs.h b/drivers/net/wireless/broadcom/b43legacy/debugfs.h index 9ee32158b947..7a37764406b1 100644 --- a/drivers/net/wireless/broadcom/b43legacy/debugfs.h +++ b/drivers/net/wireless/broadcom/b43legacy/debugfs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_DEBUGFS_H_  #define B43legacy_DEBUGFS_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/dma.h b/drivers/net/wireless/broadcom/b43legacy/dma.h index c3282f906bc7..b5c1a51db2a4 100644 --- a/drivers/net/wireless/broadcom/b43legacy/dma.h +++ b/drivers/net/wireless/broadcom/b43legacy/dma.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_DMA_H_  #define B43legacy_DMA_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/ilt.h b/drivers/net/wireless/broadcom/b43legacy/ilt.h index 48bcf37eccb8..ce7a61e2efb1 100644 --- a/drivers/net/wireless/broadcom/b43legacy/ilt.h +++ b/drivers/net/wireless/broadcom/b43legacy/ilt.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_ILT_H_  #define B43legacy_ILT_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/leds.h b/drivers/net/wireless/broadcom/b43legacy/leds.h index 9ff6750dc57f..389ae06a2d10 100644 --- a/drivers/net/wireless/broadcom/b43legacy/leds.h +++ b/drivers/net/wireless/broadcom/b43legacy/leds.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_LEDS_H_  #define B43legacy_LEDS_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/pio.h b/drivers/net/wireless/broadcom/b43legacy/pio.h index 8e6773ea6e75..1cd1b9ca5e9c 100644 --- a/drivers/net/wireless/broadcom/b43legacy/pio.h +++ b/drivers/net/wireless/broadcom/b43legacy/pio.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_PIO_H_  #define B43legacy_PIO_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/rfkill.h b/drivers/net/wireless/broadcom/b43legacy/rfkill.h index 75585571c544..7f314eb815d4 100644 --- a/drivers/net/wireless/broadcom/b43legacy/rfkill.h +++ b/drivers/net/wireless/broadcom/b43legacy/rfkill.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_RFKILL_H_  #define B43legacy_RFKILL_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/sysfs.h b/drivers/net/wireless/broadcom/b43legacy/sysfs.h index 417d509803c7..ea9d783e6796 100644 --- a/drivers/net/wireless/broadcom/b43legacy/sysfs.h +++ b/drivers/net/wireless/broadcom/b43legacy/sysfs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_SYSFS_H_  #define B43legacy_SYSFS_H_ diff --git a/drivers/net/wireless/broadcom/b43legacy/xmit.h b/drivers/net/wireless/broadcom/b43legacy/xmit.h index 289db00a4a7b..e4ef869f0b8c 100644 --- a/drivers/net/wireless/broadcom/b43legacy/xmit.h +++ b/drivers/net/wireless/broadcom/b43legacy/xmit.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef B43legacy_XMIT_H_  #define B43legacy_XMIT_H_ diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index aaed4ab503ad..4157c90ad973 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -980,7 +980,7 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,  	eth_broadcast_addr(params_le->bssid);  	params_le->bss_type = DOT11_BSSTYPE_ANY; -	params_le->scan_type = 0; +	params_le->scan_type = BRCMF_SCANTYPE_ACTIVE;  	params_le->channel_num = 0;  	params_le->nprobes = cpu_to_le32(-1);  	params_le->active_time = cpu_to_le32(-1); @@ -988,12 +988,9 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,  	params_le->home_time = cpu_to_le32(-1);  	memset(¶ms_le->ssid_le, 0, sizeof(params_le->ssid_le)); -	/* if request is null exit so it will be all channel broadcast scan */ -	if (!request) -		return; -  	n_ssids = request->n_ssids;  	n_channels = request->n_channels; +  	/* Copy channel array if applicable */  	brcmf_dbg(SCAN, "### List of channelspecs to scan ### %d\n",  		  n_channels); @@ -1030,16 +1027,8 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,  			ptr += sizeof(ssid_le);  		}  	} else { -		brcmf_dbg(SCAN, "Broadcast scan %p\n", request->ssids); -		if ((request->ssids) && request->ssids->ssid_len) { -			brcmf_dbg(SCAN, "SSID %s len=%d\n", -				  params_le->ssid_le.SSID, -				  request->ssids->ssid_len); -			params_le->ssid_le.SSID_len = -				cpu_to_le32(request->ssids->ssid_len); -			memcpy(¶ms_le->ssid_le.SSID, request->ssids->ssid, -				request->ssids->ssid_len); -		} +		brcmf_dbg(SCAN, "Performing passive scan\n"); +		params_le->scan_type = BRCMF_SCANTYPE_PASSIVE;  	}  	/* Adding mask to channel numbers */  	params_le->channel_num = @@ -3162,6 +3151,7 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,  	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;  	s32 status;  	struct brcmf_escan_result_le *escan_result_le; +	u32 escan_buflen;  	struct brcmf_bss_info_le *bss_info_le;  	struct brcmf_bss_info_le *bss = NULL;  	u32 bi_length; @@ -3181,11 +3171,23 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,  	if (status == BRCMF_E_STATUS_PARTIAL) {  		brcmf_dbg(SCAN, "ESCAN Partial result\n"); +		if (e->datalen < sizeof(*escan_result_le)) { +			brcmf_err("invalid event data length\n"); +			goto exit; +		}  		escan_result_le = (struct brcmf_escan_result_le *) data;  		if (!escan_result_le) {  			brcmf_err("Invalid escan result (NULL pointer)\n");  			goto exit;  		} +		escan_buflen = le32_to_cpu(escan_result_le->buflen); +		if (escan_buflen > BRCMF_ESCAN_BUF_SIZE || +		    escan_buflen > e->datalen || +		    escan_buflen < sizeof(*escan_result_le)) { +			brcmf_err("Invalid escan buffer length: %d\n", +				  escan_buflen); +			goto exit; +		}  		if (le16_to_cpu(escan_result_le->bss_count) != 1) {  			brcmf_err("Invalid bss_count %d: ignoring\n",  				  escan_result_le->bss_count); @@ -3202,9 +3204,8 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,  		}  		bi_length = le32_to_cpu(bss_info_le->length); -		if (bi_length != (le32_to_cpu(escan_result_le->buflen) - -					WL_ESCAN_RESULTS_FIXED_SIZE)) { -			brcmf_err("Invalid bss_info length %d: ignoring\n", +		if (bi_length != escan_buflen -	WL_ESCAN_RESULTS_FIXED_SIZE) { +			brcmf_err("Ignoring invalid bss_info length: %d\n",  				  bi_length);  			goto exit;  		} diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c index 4eb1e1ce9ace..ef72baf6dd96 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c @@ -429,7 +429,8 @@ void brcmf_fweh_process_event(struct brcmf_pub *drvr,  	if (code != BRCMF_E_IF && !fweh->evt_handler[code])  		return; -	if (datalen > BRCMF_DCMD_MAXLEN) +	if (datalen > BRCMF_DCMD_MAXLEN || +	    datalen + sizeof(*event_packet) > packet_len)  		return;  	if (in_interrupt()) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h index 8391989b1882..e0d22fedb2b4 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h @@ -45,6 +45,11 @@  #define BRCMF_SCAN_PARAMS_COUNT_MASK	0x0000ffff  #define BRCMF_SCAN_PARAMS_NSSID_SHIFT	16 +/* scan type definitions */ +#define BRCMF_SCANTYPE_DEFAULT		0xFF +#define BRCMF_SCANTYPE_ACTIVE		0 +#define BRCMF_SCANTYPE_PASSIVE		1 +  #define BRCMF_WSEC_MAX_PSK_LEN		32  #define	BRCMF_WSEC_PASSPHRASE		BIT(0) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c index 74b17cecb189..c0a5449ed72c 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <net/mac80211.h>  #include <linux/bcma/bcma_driver_chipcommon.h>  #include <linux/gpio.h> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c index b3aab2fe96eb..ef685465f80a 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c @@ -14764,8 +14764,8 @@ static void wlc_phy_ipa_restore_tx_digi_filts_nphy(struct brcms_phy *pi)  }  static void -wlc_phy_set_rfseq_nphy(struct brcms_phy *pi, u8 cmd, u8 *events, u8 *dlys, -		       u8 len) +wlc_phy_set_rfseq_nphy(struct brcms_phy *pi, u8 cmd, const u8 *events, +		       const u8 *dlys, u8 len)  {  	u32 t1_offset, t2_offset;  	u8 ctr; @@ -15240,16 +15240,16 @@ static void wlc_phy_workarounds_nphy_gainctrl_2057_rev5(struct brcms_phy *pi)  static void wlc_phy_workarounds_nphy_gainctrl_2057_rev6(struct brcms_phy *pi)  {  	u16 currband; -	s8 lna1G_gain_db_rev7[] = { 9, 14, 19, 24 }; -	s8 *lna1_gain_db = NULL; -	s8 *lna1_gain_db_2 = NULL; -	s8 *lna2_gain_db = NULL; -	s8 tiaA_gain_db_rev7[] = { -9, -6, -3, 0, 3, 3, 3, 3, 3, 3 }; -	s8 *tia_gain_db; -	s8 tiaA_gainbits_rev7[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4 }; -	s8 *tia_gainbits; -	u16 rfseqA_init_gain_rev7[] = { 0x624f, 0x624f }; -	u16 *rfseq_init_gain; +	static const s8 lna1G_gain_db_rev7[] = { 9, 14, 19, 24 }; +	const s8 *lna1_gain_db = NULL; +	const s8 *lna1_gain_db_2 = NULL; +	const s8 *lna2_gain_db = NULL; +	static const s8 tiaA_gain_db_rev7[] = { -9, -6, -3, 0, 3, 3, 3, 3, 3, 3 }; +	const s8 *tia_gain_db; +	static const s8 tiaA_gainbits_rev7[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4 }; +	const s8 *tia_gainbits; +	static const u16 rfseqA_init_gain_rev7[] = { 0x624f, 0x624f }; +	const u16 *rfseq_init_gain;  	u16 init_gaincode;  	u16 clip1hi_gaincode;  	u16 clip1md_gaincode = 0; @@ -15310,10 +15310,9 @@ static void wlc_phy_workarounds_nphy_gainctrl_2057_rev6(struct brcms_phy *pi)  			if ((freq <= 5080) || (freq == 5825)) { -				s8 lna1A_gain_db_rev7[] = { 11, 16, 20, 24 }; -				s8 lna1A_gain_db_2_rev7[] = { -					11, 17, 22, 25}; -				s8 lna2A_gain_db_rev7[] = { -1, 6, 10, 14 }; +				static const s8 lna1A_gain_db_rev7[] = { 11, 16, 20, 24 }; +				static const s8 lna1A_gain_db_2_rev7[] = { 11, 17, 22, 25}; +				static const s8 lna2A_gain_db_rev7[] = { -1, 6, 10, 14 };  				crsminu_th = 0x3e;  				lna1_gain_db = lna1A_gain_db_rev7; @@ -15321,10 +15320,9 @@ static void wlc_phy_workarounds_nphy_gainctrl_2057_rev6(struct brcms_phy *pi)  				lna2_gain_db = lna2A_gain_db_rev7;  			} else if ((freq >= 5500) && (freq <= 5700)) { -				s8 lna1A_gain_db_rev7[] = { 11, 17, 21, 25 }; -				s8 lna1A_gain_db_2_rev7[] = { -					12, 18, 22, 26}; -				s8 lna2A_gain_db_rev7[] = { 1, 8, 12, 16 }; +				static const s8 lna1A_gain_db_rev7[] = { 11, 17, 21, 25 }; +				static const s8 lna1A_gain_db_2_rev7[] = { 12, 18, 22, 26}; +				static const s8 lna2A_gain_db_rev7[] = { 1, 8, 12, 16 };  				crsminu_th = 0x45;  				clip1md_gaincode_B = 0x14; @@ -15335,10 +15333,9 @@ static void wlc_phy_workarounds_nphy_gainctrl_2057_rev6(struct brcms_phy *pi)  				lna2_gain_db = lna2A_gain_db_rev7;  			} else { -				s8 lna1A_gain_db_rev7[] = { 12, 18, 22, 26 }; -				s8 lna1A_gain_db_2_rev7[] = { -					12, 18, 22, 26}; -				s8 lna2A_gain_db_rev7[] = { -1, 6, 10, 14 }; +				static const s8 lna1A_gain_db_rev7[] = { 12, 18, 22, 26 }; +				static const s8 lna1A_gain_db_2_rev7[] = { 12, 18, 22, 26}; +				static const s8 lna2A_gain_db_rev7[] = { -1, 6, 10, 14 };  				crsminu_th = 0x41;  				lna1_gain_db = lna1A_gain_db_rev7; @@ -15450,65 +15447,65 @@ static void wlc_phy_workarounds_nphy_gainctrl(struct brcms_phy *pi)  		NPHY_RFSEQ_CMD_CLR_HIQ_DIS,  		NPHY_RFSEQ_CMD_SET_HPF_BW  	}; -	u8 rfseq_updategainu_dlys[] = { 10, 30, 1 }; -	s8 lna1G_gain_db[] = { 7, 11, 16, 23 }; -	s8 lna1G_gain_db_rev4[] = { 8, 12, 17, 25 }; -	s8 lna1G_gain_db_rev5[] = { 9, 13, 18, 26 }; -	s8 lna1G_gain_db_rev6[] = { 8, 13, 18, 25 }; -	s8 lna1G_gain_db_rev6_224B0[] = { 10, 14, 19, 27 }; -	s8 lna1A_gain_db[] = { 7, 11, 17, 23 }; -	s8 lna1A_gain_db_rev4[] = { 8, 12, 18, 23 }; -	s8 lna1A_gain_db_rev5[] = { 6, 10, 16, 21 }; -	s8 lna1A_gain_db_rev6[] = { 6, 10, 16, 21 }; -	s8 *lna1_gain_db = NULL; -	s8 lna2G_gain_db[] = { -5, 6, 10, 14 }; -	s8 lna2G_gain_db_rev5[] = { -3, 7, 11, 16 }; -	s8 lna2G_gain_db_rev6[] = { -5, 6, 10, 14 }; -	s8 lna2G_gain_db_rev6_224B0[] = { -5, 6, 10, 15 }; -	s8 lna2A_gain_db[] = { -6, 2, 6, 10 }; -	s8 lna2A_gain_db_rev4[] = { -5, 2, 6, 10 }; -	s8 lna2A_gain_db_rev5[] = { -7, 0, 4, 8 }; -	s8 lna2A_gain_db_rev6[] = { -7, 0, 4, 8 }; -	s8 *lna2_gain_db = NULL; -	s8 tiaG_gain_db[] = { +	static const u8 rfseq_updategainu_dlys[] = { 10, 30, 1 }; +	static const s8 lna1G_gain_db[] = { 7, 11, 16, 23 }; +	static const s8 lna1G_gain_db_rev4[] = { 8, 12, 17, 25 }; +	static const s8 lna1G_gain_db_rev5[] = { 9, 13, 18, 26 }; +	static const s8 lna1G_gain_db_rev6[] = { 8, 13, 18, 25 }; +	static const s8 lna1G_gain_db_rev6_224B0[] = { 10, 14, 19, 27 }; +	static const s8 lna1A_gain_db[] = { 7, 11, 17, 23 }; +	static const s8 lna1A_gain_db_rev4[] = { 8, 12, 18, 23 }; +	static const s8 lna1A_gain_db_rev5[] = { 6, 10, 16, 21 }; +	static const s8 lna1A_gain_db_rev6[] = { 6, 10, 16, 21 }; +	const s8 *lna1_gain_db = NULL; +	static const s8 lna2G_gain_db[] = { -5, 6, 10, 14 }; +	static const s8 lna2G_gain_db_rev5[] = { -3, 7, 11, 16 }; +	static const s8 lna2G_gain_db_rev6[] = { -5, 6, 10, 14 }; +	static const s8 lna2G_gain_db_rev6_224B0[] = { -5, 6, 10, 15 }; +	static const s8 lna2A_gain_db[] = { -6, 2, 6, 10 }; +	static const s8 lna2A_gain_db_rev4[] = { -5, 2, 6, 10 }; +	static const s8 lna2A_gain_db_rev5[] = { -7, 0, 4, 8 }; +	static const s8 lna2A_gain_db_rev6[] = { -7, 0, 4, 8 }; +	const s8 *lna2_gain_db = NULL; +	static const s8 tiaG_gain_db[] = {  		0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A }; -	s8 tiaA_gain_db[] = { +	static const s8 tiaA_gain_db[] = {  		0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13 }; -	s8 tiaA_gain_db_rev4[] = { +	static const s8 tiaA_gain_db_rev4[] = {  		0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d }; -	s8 tiaA_gain_db_rev5[] = { +	static const s8 tiaA_gain_db_rev5[] = {  		0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d }; -	s8 tiaA_gain_db_rev6[] = { +	static const s8 tiaA_gain_db_rev6[] = {  		0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d }; -	s8 *tia_gain_db; -	s8 tiaG_gainbits[] = { +	const s8 *tia_gain_db; +	static const s8 tiaG_gainbits[] = {  		0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 }; -	s8 tiaA_gainbits[] = { +	static const s8 tiaA_gainbits[] = {  		0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06 }; -	s8 tiaA_gainbits_rev4[] = { +	static const s8 tiaA_gainbits_rev4[] = {  		0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 }; -	s8 tiaA_gainbits_rev5[] = { +	static const s8 tiaA_gainbits_rev5[] = {  		0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 }; -	s8 tiaA_gainbits_rev6[] = { +	static const s8 tiaA_gainbits_rev6[] = {  		0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 }; -	s8 *tia_gainbits; -	s8 lpf_gain_db[] = { 0x00, 0x06, 0x0c, 0x12, 0x12, 0x12 }; -	s8 lpf_gainbits[] = { 0x00, 0x01, 0x02, 0x03, 0x03, 0x03 }; -	u16 rfseqG_init_gain[] = { 0x613f, 0x613f, 0x613f, 0x613f }; -	u16 rfseqG_init_gain_rev4[] = { 0x513f, 0x513f, 0x513f, 0x513f }; -	u16 rfseqG_init_gain_rev5[] = { 0x413f, 0x413f, 0x413f, 0x413f }; -	u16 rfseqG_init_gain_rev5_elna[] = { +	const s8 *tia_gainbits; +	static const s8 lpf_gain_db[] = { 0x00, 0x06, 0x0c, 0x12, 0x12, 0x12 }; +	static const s8 lpf_gainbits[] = { 0x00, 0x01, 0x02, 0x03, 0x03, 0x03 }; +	static const u16 rfseqG_init_gain[] = { 0x613f, 0x613f, 0x613f, 0x613f }; +	static const u16 rfseqG_init_gain_rev4[] = { 0x513f, 0x513f, 0x513f, 0x513f }; +	static const u16 rfseqG_init_gain_rev5[] = { 0x413f, 0x413f, 0x413f, 0x413f }; +	static const u16 rfseqG_init_gain_rev5_elna[] = {  		0x013f, 0x013f, 0x013f, 0x013f }; -	u16 rfseqG_init_gain_rev6[] = { 0x513f, 0x513f }; -	u16 rfseqG_init_gain_rev6_224B0[] = { 0x413f, 0x413f }; -	u16 rfseqG_init_gain_rev6_elna[] = { 0x113f, 0x113f }; -	u16 rfseqA_init_gain[] = { 0x516f, 0x516f, 0x516f, 0x516f }; -	u16 rfseqA_init_gain_rev4[] = { 0x614f, 0x614f, 0x614f, 0x614f }; -	u16 rfseqA_init_gain_rev4_elna[] = { +	static const u16 rfseqG_init_gain_rev6[] = { 0x513f, 0x513f }; +	static const u16 rfseqG_init_gain_rev6_224B0[] = { 0x413f, 0x413f }; +	static const u16 rfseqG_init_gain_rev6_elna[] = { 0x113f, 0x113f }; +	static const u16 rfseqA_init_gain[] = { 0x516f, 0x516f, 0x516f, 0x516f }; +	static const u16 rfseqA_init_gain_rev4[] = { 0x614f, 0x614f, 0x614f, 0x614f }; +	static const u16 rfseqA_init_gain_rev4_elna[] = {  		0x314f, 0x314f, 0x314f, 0x314f }; -	u16 rfseqA_init_gain_rev5[] = { 0x714f, 0x714f, 0x714f, 0x714f }; -	u16 rfseqA_init_gain_rev6[] = { 0x714f, 0x714f }; -	u16 *rfseq_init_gain; +	static const u16 rfseqA_init_gain_rev5[] = { 0x714f, 0x714f, 0x714f, 0x714f }; +	static const u16 rfseqA_init_gain_rev6[] = { 0x714f, 0x714f }; +	const u16 *rfseq_init_gain;  	u16 initG_gaincode = 0x627e;  	u16 initG_gaincode_rev4 = 0x527e;  	u16 initG_gaincode_rev5 = 0x427e; @@ -15538,10 +15535,10 @@ static void wlc_phy_workarounds_nphy_gainctrl(struct brcms_phy *pi)  	u16 clip1mdA_gaincode_rev6 = 0x2084;  	u16 clip1md_gaincode = 0;  	u16 clip1loG_gaincode = 0x0074; -	u16 clip1loG_gaincode_rev5[] = { +	static const u16 clip1loG_gaincode_rev5[] = {  		0x0062, 0x0064, 0x006a, 0x106a, 0x106c, 0x1074, 0x107c, 0x207c  	}; -	u16 clip1loG_gaincode_rev6[] = { +	static const u16 clip1loG_gaincode_rev6[] = {  		0x106a, 0x106c, 0x1074, 0x107c, 0x007e, 0x107e, 0x207e, 0x307e  	};  	u16 clip1loG_gaincode_rev6_224B0 = 0x1074; @@ -16066,7 +16063,7 @@ static void wlc_phy_workarounds_nphy_gainctrl(struct brcms_phy *pi)  static void wlc_phy_workarounds_nphy(struct brcms_phy *pi)  { -	u8 rfseq_rx2tx_events[] = { +	static const u8 rfseq_rx2tx_events[] = {  		NPHY_RFSEQ_CMD_NOP,  		NPHY_RFSEQ_CMD_RXG_FBW,  		NPHY_RFSEQ_CMD_TR_SWITCH, @@ -16076,7 +16073,7 @@ static void wlc_phy_workarounds_nphy(struct brcms_phy *pi)  		NPHY_RFSEQ_CMD_EXT_PA  	};  	u8 rfseq_rx2tx_dlys[] = { 8, 6, 6, 2, 4, 60, 1 }; -	u8 rfseq_tx2rx_events[] = { +	static const u8 rfseq_tx2rx_events[] = {  		NPHY_RFSEQ_CMD_NOP,  		NPHY_RFSEQ_CMD_EXT_PA,  		NPHY_RFSEQ_CMD_TX_GAIN, @@ -16085,8 +16082,8 @@ static void wlc_phy_workarounds_nphy(struct brcms_phy *pi)  		NPHY_RFSEQ_CMD_RXG_FBW,  		NPHY_RFSEQ_CMD_CLR_HIQ_DIS  	}; -	u8 rfseq_tx2rx_dlys[] = { 8, 6, 2, 4, 4, 6, 1 }; -	u8 rfseq_tx2rx_events_rev3[] = { +	static const u8 rfseq_tx2rx_dlys[] = { 8, 6, 2, 4, 4, 6, 1 }; +	static const u8 rfseq_tx2rx_events_rev3[] = {  		NPHY_REV3_RFSEQ_CMD_EXT_PA,  		NPHY_REV3_RFSEQ_CMD_INT_PA_PU,  		NPHY_REV3_RFSEQ_CMD_TX_GAIN, @@ -16096,7 +16093,7 @@ static void wlc_phy_workarounds_nphy(struct brcms_phy *pi)  		NPHY_REV3_RFSEQ_CMD_CLR_HIQ_DIS,  		NPHY_REV3_RFSEQ_CMD_END  	}; -	u8 rfseq_tx2rx_dlys_rev3[] = { 8, 4, 2, 2, 4, 4, 6, 1 }; +	static const u8 rfseq_tx2rx_dlys_rev3[] = { 8, 4, 2, 2, 4, 4, 6, 1 };  	u8 rfseq_rx2tx_events_rev3[] = {  		NPHY_REV3_RFSEQ_CMD_NOP,  		NPHY_REV3_RFSEQ_CMD_RXG_FBW, @@ -16110,7 +16107,7 @@ static void wlc_phy_workarounds_nphy(struct brcms_phy *pi)  	};  	u8 rfseq_rx2tx_dlys_rev3[] = { 8, 6, 6, 4, 4, 18, 42, 1, 1 }; -	u8 rfseq_rx2tx_events_rev3_ipa[] = { +	static const u8 rfseq_rx2tx_events_rev3_ipa[] = {  		NPHY_REV3_RFSEQ_CMD_NOP,  		NPHY_REV3_RFSEQ_CMD_RXG_FBW,  		NPHY_REV3_RFSEQ_CMD_TR_SWITCH, @@ -16121,15 +16118,15 @@ static void wlc_phy_workarounds_nphy(struct brcms_phy *pi)  		NPHY_REV3_RFSEQ_CMD_INT_PA_PU,  		NPHY_REV3_RFSEQ_CMD_END  	}; -	u8 rfseq_rx2tx_dlys_rev3_ipa[] = { 8, 6, 6, 4, 4, 16, 43, 1, 1 }; -	u16 rfseq_rx2tx_dacbufpu_rev7[] = { 0x10f, 0x10f }; +	static const u8 rfseq_rx2tx_dlys_rev3_ipa[] = { 8, 6, 6, 4, 4, 16, 43, 1, 1 }; +	static const u16 rfseq_rx2tx_dacbufpu_rev7[] = { 0x10f, 0x10f };  	s16 alpha0, alpha1, alpha2;  	s16 beta0, beta1, beta2;  	u32 leg_data_weights, ht_data_weights, nss1_data_weights,  	    stbc_data_weights;  	u8 chan_freq_range = 0; -	u16 dac_control = 0x0002; +	static const u16 dac_control = 0x0002;  	u16 aux_adc_vmid_rev7_core0[] = { 0x8e, 0x96, 0x96, 0x96 };  	u16 aux_adc_vmid_rev7_core1[] = { 0x8f, 0x9f, 0x9f, 0x96 };  	u16 aux_adc_vmid_rev4[] = { 0xa2, 0xb4, 0xb4, 0x89 }; @@ -16139,8 +16136,8 @@ static void wlc_phy_workarounds_nphy(struct brcms_phy *pi)  	u16 aux_adc_gain_rev4[] = { 0x02, 0x02, 0x02, 0x00 };  	u16 aux_adc_gain_rev3[] = { 0x02, 0x02, 0x02, 0x00 };  	u16 *aux_adc_gain; -	u16 sk_adc_vmid[] = { 0xb4, 0xb4, 0xb4, 0x24 }; -	u16 sk_adc_gain[] = { 0x02, 0x02, 0x02, 0x02 }; +	static const u16 sk_adc_vmid[] = { 0xb4, 0xb4, 0xb4, 0x24 }; +	static const u16 sk_adc_gain[] = { 0x02, 0x02, 0x02, 0x02 };  	s32 min_nvar_val = 0x18d;  	s32 min_nvar_offset_6mbps = 20;  	u8 pdetrange; @@ -16151,9 +16148,9 @@ static void wlc_phy_workarounds_nphy(struct brcms_phy *pi)  	u16 rfseq_rx2tx_lpf_h_hpc_rev7 = 0x77;  	u16 rfseq_tx2rx_lpf_h_hpc_rev7 = 0x77;  	u16 rfseq_pktgn_lpf_h_hpc_rev7 = 0x77; -	u16 rfseq_htpktgn_lpf_hpc_rev7[] = { 0x77, 0x11, 0x11 }; -	u16 rfseq_pktgn_lpf_hpc_rev7[] = { 0x11, 0x11 }; -	u16 rfseq_cckpktgn_lpf_hpc_rev7[] = { 0x11, 0x11 }; +	static const u16 rfseq_htpktgn_lpf_hpc_rev7[] = { 0x77, 0x11, 0x11 }; +	static const u16 rfseq_pktgn_lpf_hpc_rev7[] = { 0x11, 0x11 }; +	static const u16 rfseq_cckpktgn_lpf_hpc_rev7[] = { 0x11, 0x11 };  	u16 ipalvlshift_3p3_war_en = 0;  	u16 rccal_bcap_val, rccal_scap_val;  	u16 rccal_tx20_11b_bcap = 0; @@ -24291,13 +24288,13 @@ static void wlc_phy_update_txcal_ladder_nphy(struct brcms_phy *pi, u16 core)  	u16 bbmult;  	u16 tblentry; -	struct nphy_txiqcal_ladder ladder_lo[] = { +	static const struct nphy_txiqcal_ladder ladder_lo[] = {  		{3, 0}, {4, 0}, {6, 0}, {9, 0}, {13, 0}, {18, 0},  		{25, 0}, {25, 1}, {25, 2}, {25, 3}, {25, 4}, {25, 5},  		{25, 6}, {25, 7}, {35, 7}, {50, 7}, {71, 7}, {100, 7}  	}; -	struct nphy_txiqcal_ladder ladder_iq[] = { +	static const struct nphy_txiqcal_ladder ladder_iq[] = {  		{3, 0}, {4, 0}, {6, 0}, {9, 0}, {13, 0}, {18, 0},  		{25, 0}, {35, 0}, {50, 0}, {71, 0}, {100, 0}, {100, 1},  		{100, 2}, {100, 3}, {100, 4}, {100, 5}, {100, 6}, {100, 7} @@ -25773,67 +25770,67 @@ wlc_phy_cal_txiqlo_nphy(struct brcms_phy *pi, struct nphy_txgains target_gain,  	u16 cal_gain[2];  	struct nphy_iqcal_params cal_params[2];  	u32 tbl_len; -	void *tbl_ptr; +	const void *tbl_ptr;  	bool ladder_updated[2];  	u8 mphase_cal_lastphase = 0;  	int bcmerror = 0;  	bool phyhang_avoid_state = false; -	u16 tbl_tx_iqlo_cal_loft_ladder_20[] = { +	static const u16 tbl_tx_iqlo_cal_loft_ladder_20[] = {  		0x0300, 0x0500, 0x0700, 0x0900, 0x0d00, 0x1100, 0x1900, 0x1901,  		0x1902,  		0x1903, 0x1904, 0x1905, 0x1906, 0x1907, 0x2407, 0x3207, 0x4607,  		0x6407  	}; -	u16 tbl_tx_iqlo_cal_iqimb_ladder_20[] = { +	static const u16 tbl_tx_iqlo_cal_iqimb_ladder_20[] = {  		0x0200, 0x0300, 0x0600, 0x0900, 0x0d00, 0x1100, 0x1900, 0x2400,  		0x3200,  		0x4600, 0x6400, 0x6401, 0x6402, 0x6403, 0x6404, 0x6405, 0x6406,  		0x6407  	}; -	u16 tbl_tx_iqlo_cal_loft_ladder_40[] = { +	static const u16 tbl_tx_iqlo_cal_loft_ladder_40[] = {  		0x0200, 0x0300, 0x0400, 0x0700, 0x0900, 0x0c00, 0x1200, 0x1201,  		0x1202,  		0x1203, 0x1204, 0x1205, 0x1206, 0x1207, 0x1907, 0x2307, 0x3207,  		0x4707  	}; -	u16 tbl_tx_iqlo_cal_iqimb_ladder_40[] = { +	static const u16 tbl_tx_iqlo_cal_iqimb_ladder_40[] = {  		0x0100, 0x0200, 0x0400, 0x0700, 0x0900, 0x0c00, 0x1200, 0x1900,  		0x2300,  		0x3200, 0x4700, 0x4701, 0x4702, 0x4703, 0x4704, 0x4705, 0x4706,  		0x4707  	}; -	u16 tbl_tx_iqlo_cal_startcoefs[] = { +	static const u16 tbl_tx_iqlo_cal_startcoefs[] = {  		0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  		0x0000  	}; -	u16 tbl_tx_iqlo_cal_cmds_fullcal[] = { +	static const u16 tbl_tx_iqlo_cal_cmds_fullcal[] = {  		0x8123, 0x8264, 0x8086, 0x8245, 0x8056,  		0x9123, 0x9264, 0x9086, 0x9245, 0x9056  	}; -	u16 tbl_tx_iqlo_cal_cmds_recal[] = { +	static const u16 tbl_tx_iqlo_cal_cmds_recal[] = {  		0x8101, 0x8253, 0x8053, 0x8234, 0x8034,  		0x9101, 0x9253, 0x9053, 0x9234, 0x9034  	}; -	u16 tbl_tx_iqlo_cal_startcoefs_nphyrev3[] = { +	static const u16 tbl_tx_iqlo_cal_startcoefs_nphyrev3[] = {  		0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  		0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  		0x0000  	}; -	u16 tbl_tx_iqlo_cal_cmds_fullcal_nphyrev3[] = { +	static const u16 tbl_tx_iqlo_cal_cmds_fullcal_nphyrev3[] = {  		0x8434, 0x8334, 0x8084, 0x8267, 0x8056, 0x8234,  		0x9434, 0x9334, 0x9084, 0x9267, 0x9056, 0x9234  	}; -	u16 tbl_tx_iqlo_cal_cmds_recal_nphyrev3[] = { +	static const u16 tbl_tx_iqlo_cal_cmds_recal_nphyrev3[] = {  		0x8423, 0x8323, 0x8073, 0x8256, 0x8045, 0x8223,  		0x9423, 0x9323, 0x9073, 0x9256, 0x9045, 0x9223  	}; diff --git a/drivers/net/wireless/cisco/airo.h b/drivers/net/wireless/cisco/airo.h index e480adf86be6..8a02977a2e2b 100644 --- a/drivers/net/wireless/cisco/airo.h +++ b/drivers/net/wireless/cisco/airo.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _AIRO_H_  #define _AIRO_H_ diff --git a/drivers/net/wireless/intel/ipw2x00/Makefile b/drivers/net/wireless/intel/ipw2x00/Makefile index aecd2cff462b..e1ec50359dff 100644 --- a/drivers/net/wireless/intel/ipw2x00/Makefile +++ b/drivers/net/wireless/intel/ipw2x00/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the Intel Centrino wireless drivers  # diff --git a/drivers/net/wireless/intel/iwlegacy/Makefile b/drivers/net/wireless/intel/iwlegacy/Makefile index c826a6b985bb..c5ad0453b334 100644 --- a/drivers/net/wireless/intel/iwlegacy/Makefile +++ b/drivers/net/wireless/intel/iwlegacy/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_IWLEGACY)	+= iwlegacy.o  iwlegacy-objs 		:= common.o  iwlegacy-$(CONFIG_IWLEGACY_DEBUGFS) += debug.o diff --git a/drivers/net/wireless/intel/iwlwifi/Makefile b/drivers/net/wireless/intel/iwlwifi/Makefile index 35a32a3ec882..595b26b66bfc 100644 --- a/drivers/net/wireless/intel/iwlwifi/Makefile +++ b/drivers/net/wireless/intel/iwlwifi/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # common  obj-$(CONFIG_IWLWIFI)	+= iwlwifi.o  iwlwifi-objs		+= iwl-io.o diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/7000.c b/drivers/net/wireless/intel/iwlwifi/cfg/7000.c index 45e2efc70d19..ce741beec1fc 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/7000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/7000.c @@ -309,6 +309,7 @@ const struct iwl_cfg iwl3168_2ac_cfg = {  	.nvm_calib_ver = IWL3168_TX_POWER_VERSION,  	.pwr_tx_backoffs = iwl7265_pwr_tx_backoffs,  	.dccm_len = IWL7265_DCCM_LEN, +	.nvm_type = IWL_NVM_SDP,  };  const struct iwl_cfg iwl7265_2ac_cfg = { diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/8000.c b/drivers/net/wireless/intel/iwlwifi/cfg/8000.c index 2e6c52664cee..c2a5936ccede 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/8000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/8000.c @@ -164,7 +164,7 @@ static const struct iwl_tt_params iwl8000_tt_params = {  	.default_nvm_file_C_step = DEFAULT_NVM_FILE_FAMILY_8000C,	\  	.thermal_params = &iwl8000_tt_params,				\  	.apmg_not_supported = true,					\ -	.ext_nvm = true,						\ +	.nvm_type = IWL_NVM_EXT,					\  	.dbgc_supported = true  #define IWL_DEVICE_8000							\ diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/9000.c b/drivers/net/wireless/intel/iwlwifi/cfg/9000.c index 2babe0a1f18b..e8b5ff42f5a8 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/9000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/9000.c @@ -148,7 +148,7 @@ static const struct iwl_tt_params iwl9000_tt_params = {  	.vht_mu_mimo_supported = true,					\  	.mac_addr_from_csr = true,					\  	.rf_id = true,							\ -	.ext_nvm = true,						\ +	.nvm_type = IWL_NVM_EXT,					\  	.dbgc_supported = true  const struct iwl_cfg iwl9160_2ac_cfg = { diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/a000.c b/drivers/net/wireless/intel/iwlwifi/cfg/a000.c index 76ba1f8bc72f..a440140ed8dd 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/a000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/a000.c @@ -133,7 +133,7 @@ static const struct iwl_ht_params iwl_a000_ht_params = {  	.use_tfh = true,						\  	.rf_id = true,							\  	.gen2 = true,							\ -	.ext_nvm = true,						\ +	.nvm_type = IWL_NVM_EXT,					\  	.dbgc_supported = true  const struct iwl_cfg iwla000_2ac_cfg_hr = { diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/Makefile b/drivers/net/wireless/intel/iwlwifi/dvm/Makefile index b256a354953a..702d42b2d452 100644 --- a/drivers/net/wireless/intel/iwlwifi/dvm/Makefile +++ b/drivers/net/wireless/intel/iwlwifi/dvm/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # DVM  obj-$(CONFIG_IWLDVM)	+= iwldvm.o  iwldvm-objs		+= main.o rs.o mac80211.o ucode.o tx.o diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h b/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h index 00bc7a25dece..3fd07bc80f54 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h +++ b/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h @@ -108,6 +108,7 @@ enum iwl_nvm_access_target {   * @NVM_SECTION_TYPE_REGULATORY: regulatory section   * @NVM_SECTION_TYPE_CALIBRATION: calibration section   * @NVM_SECTION_TYPE_PRODUCTION: production section + * @NVM_SECTION_TYPE_REGULATORY_SDP: regulatory section used by 3168 series   * @NVM_SECTION_TYPE_MAC_OVERRIDE: MAC override section   * @NVM_SECTION_TYPE_PHY_SKU: PHY SKU section   * @NVM_MAX_NUM_SECTIONS: number of sections @@ -117,6 +118,7 @@ enum iwl_nvm_section_type {  	NVM_SECTION_TYPE_REGULATORY = 3,  	NVM_SECTION_TYPE_CALIBRATION = 4,  	NVM_SECTION_TYPE_PRODUCTION = 5, +	NVM_SECTION_TYPE_REGULATORY_SDP = 8,  	NVM_SECTION_TYPE_MAC_OVERRIDE = 11,  	NVM_SECTION_TYPE_PHY_SKU = 12,  	NVM_MAX_NUM_SECTIONS = 13, diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c index 6afc7a799892..f5dd7d83cd0a 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c @@ -1086,7 +1086,7 @@ void iwl_fw_error_dump_wk(struct work_struct *work)  	if (fwrt->trans->cfg->device_family == IWL_DEVICE_FAMILY_7000) {  		/* stop recording */ -		iwl_set_bits_prph(fwrt->trans, MON_BUFF_SAMPLE_CTL, 0x100); +		iwl_fw_dbg_stop_recording(fwrt);  		iwl_fw_error_dump(fwrt); @@ -1104,10 +1104,7 @@ void iwl_fw_error_dump_wk(struct work_struct *work)  		u32 in_sample = iwl_read_prph(fwrt->trans, DBGC_IN_SAMPLE);  		u32 out_ctrl = iwl_read_prph(fwrt->trans, DBGC_OUT_CTRL); -		/* stop recording */ -		iwl_write_prph(fwrt->trans, DBGC_IN_SAMPLE, 0); -		udelay(100); -		iwl_write_prph(fwrt->trans, DBGC_OUT_CTRL, 0); +		iwl_fw_dbg_stop_recording(fwrt);  		/* wait before we collect the data till the DBGC stop */  		udelay(500); diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h index 0f810ea89d31..9c889a32fe24 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h +++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h @@ -68,6 +68,8 @@  #include <linux/workqueue.h>  #include <net/cfg80211.h>  #include "runtime.h" +#include "iwl-prph.h" +#include "iwl-io.h"  #include "file.h"  #include "error-dump.h" @@ -194,8 +196,21 @@ _iwl_fw_dbg_trigger_simple_stop(struct iwl_fw_runtime *fwrt,  					iwl_fw_dbg_get_trigger((fwrt)->fw,\  							       (trig))) +static inline void iwl_fw_dbg_stop_recording(struct iwl_fw_runtime *fwrt) +{ +	if (fwrt->trans->cfg->device_family == IWL_DEVICE_FAMILY_7000) { +		iwl_set_bits_prph(fwrt->trans, MON_BUFF_SAMPLE_CTL, 0x100); +	} else { +		iwl_write_prph(fwrt->trans, DBGC_IN_SAMPLE, 0); +		udelay(100); +		iwl_write_prph(fwrt->trans, DBGC_OUT_CTRL, 0); +	} +} +  static inline void iwl_fw_dump_conf_clear(struct iwl_fw_runtime *fwrt)  { +	iwl_fw_dbg_stop_recording(fwrt); +  	fwrt->dump.conf = FW_DBG_INVALID;  } diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-config.h b/drivers/net/wireless/intel/iwlwifi/iwl-config.h index 3e057b539d5b..71cb1ecde0f7 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-config.h +++ b/drivers/net/wireless/intel/iwlwifi/iwl-config.h @@ -108,6 +108,18 @@ enum iwl_led_mode {  	IWL_LED_DISABLE,  }; +/** + * enum iwl_nvm_type - nvm formats + * @IWL_NVM: the regular format + * @IWL_NVM_EXT: extended NVM format + * @IWL_NVM_SDP: NVM format used by 3168 series + */ +enum iwl_nvm_type { +	IWL_NVM, +	IWL_NVM_EXT, +	IWL_NVM_SDP, +}; +  /*   * This is the threshold value of plcp error rate per 100mSecs.  It is   * used to set and check for the validity of plcp_delta. @@ -320,7 +332,7 @@ struct iwl_pwr_tx_backoff {   * @integrated: discrete or integrated   * @gen2: a000 and on transport operation   * @cdb: CDB support - * @ext_nvm: extended NVM format + * @nvm_type: see &enum iwl_nvm_type   *   * We enable the driver to be backward compatible wrt. hardware features.   * API differences in uCode shouldn't be handled here but through TLVs @@ -342,6 +354,7 @@ struct iwl_cfg {  	const struct iwl_tt_params *thermal_params;  	enum iwl_device_family device_family;  	enum iwl_led_mode led_mode; +	enum iwl_nvm_type nvm_type;  	u32 max_data_size;  	u32 max_inst_size;  	netdev_features_t features; @@ -369,7 +382,6 @@ struct iwl_cfg {  	    use_tfh:1,  	    gen2:1,  	    cdb:1, -	    ext_nvm:1,  	    dbgc_supported:1;  	u8 valid_tx_ant;  	u8 valid_rx_ant; diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c index 3014beef4873..c3a5d8ccc95e 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c @@ -77,7 +77,7 @@  #include "iwl-csr.h"  /* NVM offsets (in words) definitions */ -enum wkp_nvm_offsets { +enum nvm_offsets {  	/* NVM HW-Section offset (in words) definitions */  	SUBSYSTEM_ID = 0x0A,  	HW_ADDR = 0x15, @@ -92,7 +92,10 @@ enum wkp_nvm_offsets {  	/* NVM calibration section offset (in words) definitions */  	NVM_CALIB_SECTION = 0x2B8, -	XTAL_CALIB = 0x316 - NVM_CALIB_SECTION +	XTAL_CALIB = 0x316 - NVM_CALIB_SECTION, + +	/* NVM REGULATORY -Section offset (in words) definitions */ +	NVM_CHANNELS_SDP = 0,  };  enum ext_nvm_offsets { @@ -206,8 +209,36 @@ enum iwl_nvm_channel_flags {  	NVM_CHANNEL_DC_HIGH		= BIT(12),  }; +static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level, +					       int chan, u16 flags) +{  #define CHECK_AND_PRINT_I(x)	\ -	((ch_flags & NVM_CHANNEL_##x) ? # x " " : "") +	((flags & NVM_CHANNEL_##x) ? " " #x : "") + +	if (!(flags & NVM_CHANNEL_VALID)) { +		IWL_DEBUG_DEV(dev, level, "Ch. %d: 0x%x: No traffic\n", +			      chan, flags); +		return; +	} + +	/* Note: already can print up to 101 characters, 110 is the limit! */ +	IWL_DEBUG_DEV(dev, level, +		      "Ch. %d: 0x%x:%s%s%s%s%s%s%s%s%s%s%s%s\n", +		      chan, flags, +		      CHECK_AND_PRINT_I(VALID), +		      CHECK_AND_PRINT_I(IBSS), +		      CHECK_AND_PRINT_I(ACTIVE), +		      CHECK_AND_PRINT_I(RADAR), +		      CHECK_AND_PRINT_I(INDOOR_ONLY), +		      CHECK_AND_PRINT_I(GO_CONCURRENT), +		      CHECK_AND_PRINT_I(UNIFORM), +		      CHECK_AND_PRINT_I(20MHZ), +		      CHECK_AND_PRINT_I(40MHZ), +		      CHECK_AND_PRINT_I(80MHZ), +		      CHECK_AND_PRINT_I(160MHZ), +		      CHECK_AND_PRINT_I(DC_HIGH)); +#undef CHECK_AND_PRINT_I +}  static u32 iwl_get_channel_flags(u8 ch_num, int ch_idx, bool is_5ghz,  				 u16 nvm_flags, const struct iwl_cfg *cfg) @@ -215,7 +246,7 @@ static u32 iwl_get_channel_flags(u8 ch_num, int ch_idx, bool is_5ghz,  	u32 flags = IEEE80211_CHAN_NO_HT40;  	u32 last_5ghz_ht = LAST_5GHZ_HT; -	if (cfg->ext_nvm) +	if (cfg->nvm_type == IWL_NVM_EXT)  		last_5ghz_ht = LAST_5GHZ_HT_FAMILY_8000;  	if (!is_5ghz && (nvm_flags & NVM_CHANNEL_40MHZ)) { @@ -268,7 +299,7 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,  	int num_of_ch, num_2ghz_channels;  	const u8 *nvm_chan; -	if (!cfg->ext_nvm) { +	if (cfg->nvm_type != IWL_NVM_EXT) {  		num_of_ch = IWL_NUM_CHANNELS;  		nvm_chan = &iwl_nvm_channels[0];  		num_2ghz_channels = NUM_2GHZ_CHANNELS; @@ -302,12 +333,8 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,  			 * supported, hence we still want to add them to  			 * the list of supported channels to cfg80211.  			 */ -			IWL_DEBUG_EEPROM(dev, -					 "Ch. %d Flags %x [%sGHz] - No traffic\n", -					 nvm_chan[ch_idx], -					 ch_flags, -					 (ch_idx >= num_2ghz_channels) ? -					 "5.2" : "2.4"); +			iwl_nvm_print_channel_flags(dev, IWL_DL_EEPROM, +						    nvm_chan[ch_idx], ch_flags);  			continue;  		} @@ -337,27 +364,10 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,  		else  			channel->flags = 0; -		IWL_DEBUG_EEPROM(dev, -				 "Ch. %d [%sGHz] flags 0x%x %s%s%s%s%s%s%s%s%s%s%s%s(%ddBm): Ad-Hoc %ssupported\n", -				 channel->hw_value, -				 is_5ghz ? "5.2" : "2.4", -				 ch_flags, -				 CHECK_AND_PRINT_I(VALID), -				 CHECK_AND_PRINT_I(IBSS), -				 CHECK_AND_PRINT_I(ACTIVE), -				 CHECK_AND_PRINT_I(RADAR), -				 CHECK_AND_PRINT_I(INDOOR_ONLY), -				 CHECK_AND_PRINT_I(GO_CONCURRENT), -				 CHECK_AND_PRINT_I(UNIFORM), -				 CHECK_AND_PRINT_I(20MHZ), -				 CHECK_AND_PRINT_I(40MHZ), -				 CHECK_AND_PRINT_I(80MHZ), -				 CHECK_AND_PRINT_I(160MHZ), -				 CHECK_AND_PRINT_I(DC_HIGH), -				 channel->max_power, -				 ((ch_flags & NVM_CHANNEL_IBSS) && -				  !(ch_flags & NVM_CHANNEL_RADAR)) -					? "" : "not "); +		iwl_nvm_print_channel_flags(dev, IWL_DL_EEPROM, +					    channel->hw_value, ch_flags); +		IWL_DEBUG_EEPROM(dev, "Ch. %d: %ddBm\n", +				 channel->hw_value, channel->max_power);  	}  	return n_channels; @@ -484,7 +494,7 @@ IWL_EXPORT_SYMBOL(iwl_init_sbands);  static int iwl_get_sku(const struct iwl_cfg *cfg, const __le16 *nvm_sw,  		       const __le16 *phy_sku)  { -	if (!cfg->ext_nvm) +	if (cfg->nvm_type != IWL_NVM_EXT)  		return le16_to_cpup(nvm_sw + SKU);  	return le32_to_cpup((__le32 *)(phy_sku + SKU_FAMILY_8000)); @@ -492,7 +502,7 @@ static int iwl_get_sku(const struct iwl_cfg *cfg, const __le16 *nvm_sw,  static int iwl_get_nvm_version(const struct iwl_cfg *cfg, const __le16 *nvm_sw)  { -	if (!cfg->ext_nvm) +	if (cfg->nvm_type != IWL_NVM_EXT)  		return le16_to_cpup(nvm_sw + NVM_VERSION);  	else  		return le32_to_cpup((__le32 *)(nvm_sw + @@ -502,7 +512,7 @@ static int iwl_get_nvm_version(const struct iwl_cfg *cfg, const __le16 *nvm_sw)  static int iwl_get_radio_cfg(const struct iwl_cfg *cfg, const __le16 *nvm_sw,  			     const __le16 *phy_sku)  { -	if (!cfg->ext_nvm) +	if (cfg->nvm_type != IWL_NVM_EXT)  		return le16_to_cpup(nvm_sw + RADIO_CFG);  	return le32_to_cpup((__le32 *)(phy_sku + RADIO_CFG_FAMILY_EXT_NVM)); @@ -513,7 +523,7 @@ static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg, const __le16 *nvm_sw)  {  	int n_hw_addr; -	if (!cfg->ext_nvm) +	if (cfg->nvm_type != IWL_NVM_EXT)  		return le16_to_cpup(nvm_sw + N_HW_ADDRS);  	n_hw_addr = le32_to_cpup((__le32 *)(nvm_sw + N_HW_ADDRS_FAMILY_8000)); @@ -525,7 +535,7 @@ static void iwl_set_radio_cfg(const struct iwl_cfg *cfg,  			      struct iwl_nvm_data *data,  			      u32 radio_cfg)  { -	if (!cfg->ext_nvm) { +	if (cfg->nvm_type != IWL_NVM_EXT) {  		data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK(radio_cfg);  		data->radio_cfg_step = NVM_RF_CFG_STEP_MSK(radio_cfg);  		data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK(radio_cfg); @@ -634,7 +644,7 @@ static int iwl_set_hw_address(struct iwl_trans *trans,  {  	if (cfg->mac_addr_from_csr) {  		iwl_set_hw_address_from_csr(trans, data); -	} else if (!cfg->ext_nvm) { +	} else if (cfg->nvm_type != IWL_NVM_EXT) {  		const u8 *hw_addr = (const u8 *)(nvm_hw + HW_ADDR);  		/* The byte order is little endian 16 bit, meaning 214365 */ @@ -706,7 +716,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,  	u16 lar_config;  	const __le16 *ch_section; -	if (!cfg->ext_nvm) +	if (cfg->nvm_type != IWL_NVM_EXT)  		data = kzalloc(sizeof(*data) +  			       sizeof(struct ieee80211_channel) *  			       IWL_NUM_CHANNELS, @@ -740,7 +750,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,  	data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw); -	if (!cfg->ext_nvm) { +	if (cfg->nvm_type != IWL_NVM_EXT) {  		/* Checking for required sections */  		if (!nvm_calib) {  			IWL_ERR(trans, @@ -748,11 +758,15 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,  			kfree(data);  			return NULL;  		} + +		ch_section = cfg->nvm_type == IWL_NVM_SDP ? +			     ®ulatory[NVM_CHANNELS_SDP] : +			     &nvm_sw[NVM_CHANNELS]; +  		/* in family 8000 Xtal calibration values moved to OTP */  		data->xtal_calib[0] = *(nvm_calib + XTAL_CALIB);  		data->xtal_calib[1] = *(nvm_calib + XTAL_CALIB + 1);  		lar_enabled = true; -		ch_section = &nvm_sw[NVM_CHANNELS];  	} else {  		u16 lar_offset = data->nvm_version < 0xE39 ?  				 NVM_LAR_OFFSET_OLD : @@ -786,7 +800,7 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u8 *nvm_chan,  	u32 flags = NL80211_RRF_NO_HT40;  	u32 last_5ghz_ht = LAST_5GHZ_HT; -	if (cfg->ext_nvm) +	if (cfg->nvm_type == IWL_NVM_EXT)  		last_5ghz_ht = LAST_5GHZ_HT_FAMILY_8000;  	if (ch_idx < NUM_2GHZ_CHANNELS && @@ -834,7 +848,7 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,  	int ch_idx;  	u16 ch_flags;  	u32 reg_rule_flags, prev_reg_rule_flags = 0; -	const u8 *nvm_chan = cfg->ext_nvm ? +	const u8 *nvm_chan = cfg->nvm_type == IWL_NVM_EXT ?  			     iwl_ext_nvm_channels : iwl_nvm_channels;  	struct ieee80211_regdomain *regd;  	int size_of_regd; @@ -843,7 +857,7 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,  	int center_freq, prev_center_freq = 0;  	int valid_rules = 0;  	bool new_rule; -	int max_num_ch = cfg->ext_nvm ? +	int max_num_ch = cfg->nvm_type == IWL_NVM_EXT ?  			 IWL_NUM_CHANNELS_EXT : IWL_NUM_CHANNELS;  	if (WARN_ON_ONCE(num_of_ch > NL80211_MAX_SUPP_REG_RULES)) @@ -873,12 +887,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,  		new_rule = false;  		if (!(ch_flags & NVM_CHANNEL_VALID)) { -			IWL_DEBUG_DEV(dev, IWL_DL_LAR, -				      "Ch. %d Flags %x [%sGHz] - No traffic\n", -				      nvm_chan[ch_idx], -				      ch_flags, -				      (ch_idx >= NUM_2GHZ_CHANNELS) ? -				      "5.2" : "2.4"); +			iwl_nvm_print_channel_flags(dev, IWL_DL_LAR, +						    nvm_chan[ch_idx], ch_flags);  			continue;  		} @@ -914,31 +924,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,  		prev_center_freq = center_freq;  		prev_reg_rule_flags = reg_rule_flags; -		IWL_DEBUG_DEV(dev, IWL_DL_LAR, -			      "Ch. %d [%sGHz] %s%s%s%s%s%s%s%s%s%s%s%s(0x%02x)\n", -			      center_freq, -			      band == NL80211_BAND_5GHZ ? "5.2" : "2.4", -			      CHECK_AND_PRINT_I(VALID), -			      CHECK_AND_PRINT_I(IBSS), -			      CHECK_AND_PRINT_I(ACTIVE), -			      CHECK_AND_PRINT_I(RADAR), -			      CHECK_AND_PRINT_I(INDOOR_ONLY), -			      CHECK_AND_PRINT_I(GO_CONCURRENT), -			      CHECK_AND_PRINT_I(UNIFORM), -			      CHECK_AND_PRINT_I(20MHZ), -			      CHECK_AND_PRINT_I(40MHZ), -			      CHECK_AND_PRINT_I(80MHZ), -			      CHECK_AND_PRINT_I(160MHZ), -			      CHECK_AND_PRINT_I(DC_HIGH), -			      ch_flags); -		IWL_DEBUG_DEV(dev, IWL_DL_LAR, -			      "Ch. %d [%sGHz] reg_flags 0x%x: %s\n", -			      center_freq, -			      band == NL80211_BAND_5GHZ ? "5.2" : "2.4", -			      reg_rule_flags, -			      ((ch_flags & NVM_CHANNEL_ACTIVE) && -			       !(ch_flags & NVM_CHANNEL_RADAR)) -					 ? "Ad-Hoc" : ""); +		iwl_nvm_print_channel_flags(dev, IWL_DL_LAR, +					    nvm_chan[ch_idx], ch_flags);  	}  	regd->n_reg_rules = valid_rules; diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile index 00e6737dda72..a47635c32c11 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile +++ b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_IWLMVM)   += iwlmvm.o  iwlmvm-y += fw.o mac80211.o nvm.o ops.o phy-ctxt.o mac-ctxt.o  iwlmvm-y += utils.o rx.o rxmq.o tx.o binding.o quota.o sta.o sf.o diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c index 5de19ea10575..b205a7bfb828 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c @@ -2167,7 +2167,7 @@ out:  	 * 1. We are not using a unified image  	 * 2. We are using a unified image but had an error while exiting D3  	 */ -	set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); +	set_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status);  	set_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status);  	/*  	 * When switching images we return 1, which causes mac80211 diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c index 15f2d826bb4b..a9ac872226fd 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c @@ -1077,6 +1077,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)  	mvm->vif_count = 0;  	mvm->rx_ba_sessions = 0;  	mvm->fwrt.dump.conf = FW_DBG_INVALID; +	mvm->monitor_on = false;  	/* keep statistics ticking */  	iwl_mvm_accu_radio_stats(mvm); @@ -1437,6 +1438,9 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,  		mvm->p2p_device_vif = vif;  	} +	if (vif->type == NL80211_IFTYPE_MONITOR) +		mvm->monitor_on = true; +  	iwl_mvm_vif_dbgfs_register(mvm, vif);  	goto out_unlock; @@ -1526,6 +1530,9 @@ static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,  	iwl_mvm_power_update_mac(mvm);  	iwl_mvm_mac_ctxt_remove(mvm, vif); +	if (vif->type == NL80211_IFTYPE_MONITOR) +		mvm->monitor_on = false; +  out_release:  	mutex_unlock(&mvm->mutex);  } @@ -1546,6 +1553,11 @@ static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,  	struct iwl_mvm_mc_iter_data *data = _data;  	struct iwl_mvm *mvm = data->mvm;  	struct iwl_mcast_filter_cmd *cmd = mvm->mcast_filter_cmd; +	struct iwl_host_cmd hcmd = { +		.id = MCAST_FILTER_CMD, +		.flags = CMD_ASYNC, +		.dataflags[0] = IWL_HCMD_DFL_NOCOPY, +	};  	int ret, len;  	/* if we don't have free ports, mcast frames will be dropped */ @@ -1560,7 +1572,10 @@ static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,  	memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN);  	len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4); -	ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_ASYNC, len, cmd); +	hcmd.len[0] = len; +	hcmd.data[0] = cmd; + +	ret = iwl_mvm_send_cmd(mvm, &hcmd);  	if (ret)  		IWL_ERR(mvm, "mcast filter cmd error. ret=%d\n", ret);  } @@ -1635,6 +1650,12 @@ static void iwl_mvm_configure_filter(struct ieee80211_hw *hw,  	if (!cmd)  		goto out; +	if (changed_flags & FIF_ALLMULTI) +		cmd->pass_all = !!(*total_flags & FIF_ALLMULTI); + +	if (cmd->pass_all) +		cmd->count = 0; +  	iwl_mvm_recalc_multicast(mvm);  out:  	mutex_unlock(&mvm->mutex); @@ -2563,7 +2584,7 @@ static void iwl_mvm_purge_deferred_tx_frames(struct iwl_mvm *mvm,  			 * queues, so we should never get a second deferred  			 * frame for the RA/TID.  			 */ -			iwl_mvm_start_mac_queues(mvm, info->hw_queue); +			iwl_mvm_start_mac_queues(mvm, BIT(info->hw_queue));  			ieee80211_free_txskb(mvm->hw, skb);  		}  	} @@ -3975,6 +3996,43 @@ out_unlock:  	return ret;  } +static void iwl_mvm_flush_no_vif(struct iwl_mvm *mvm, u32 queues, bool drop) +{ +	if (drop) { +		if (iwl_mvm_has_new_tx_api(mvm)) +			/* TODO new tx api */ +			WARN_ONCE(1, +				  "Need to implement flush TX queue\n"); +		else +			iwl_mvm_flush_tx_path(mvm, +				iwl_mvm_flushable_queues(mvm) & queues, +				0); +	} else { +		if (iwl_mvm_has_new_tx_api(mvm)) { +			struct ieee80211_sta *sta; +			int i; + +			mutex_lock(&mvm->mutex); + +			for (i = 0; i < ARRAY_SIZE(mvm->fw_id_to_mac_id); i++) { +				sta = rcu_dereference_protected( +						mvm->fw_id_to_mac_id[i], +						lockdep_is_held(&mvm->mutex)); +				if (IS_ERR_OR_NULL(sta)) +					continue; + +				iwl_mvm_wait_sta_queues_empty(mvm, +						iwl_mvm_sta_from_mac80211(sta)); +			} + +			mutex_unlock(&mvm->mutex); +		} else { +			iwl_trans_wait_tx_queues_empty(mvm->trans, +						       queues); +		} +	} +} +  static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,  			      struct ieee80211_vif *vif, u32 queues, bool drop)  { @@ -3985,7 +4043,12 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,  	int i;  	u32 msk = 0; -	if (!vif || vif->type != NL80211_IFTYPE_STATION) +	if (!vif) { +		iwl_mvm_flush_no_vif(mvm, queues, drop); +		return; +	} + +	if (vif->type != NL80211_IFTYPE_STATION)  		return;  	/* Make sure we're done with the deferred traffic before flushing */ diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h index 83303bac0e4b..949e63418299 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h @@ -1015,6 +1015,9 @@ struct iwl_mvm {  	bool drop_bcn_ap_mode;  	struct delayed_work cs_tx_unblock_dwork; + +	/* does a monitor vif exist (only one can exist hence bool) */ +	bool monitor_on;  #ifdef CONFIG_ACPI  	struct iwl_mvm_sar_profile sar_profiles[IWL_MVM_SAR_PROFILE_NUM];  	struct iwl_mvm_geo_profile geo_profiles[IWL_NUM_GEO_PROFILES]; @@ -1159,7 +1162,7 @@ static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)  	 * Enable LAR only if it is supported by the FW (TLV) &&  	 * enabled in the NVM  	 */ -	if (mvm->cfg->ext_nvm) +	if (mvm->cfg->nvm_type == IWL_NVM_EXT)  		return nvm_lar && tlv_lar;  	else  		return tlv_lar; diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c index 422aa6be9932..fb25b6f29323 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c @@ -295,18 +295,24 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)  	const __be16 *hw;  	const __le16 *sw, *calib, *regulatory, *mac_override, *phy_sku;  	bool lar_enabled; +	int regulatory_type;  	/* Checking for required sections */ -	if (!mvm->trans->cfg->ext_nvm) { +	if (mvm->trans->cfg->nvm_type != IWL_NVM_EXT) {  		if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data ||  		    !mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data) {  			IWL_ERR(mvm, "Can't parse empty OTP/NVM sections\n");  			return NULL;  		}  	} else { +		if (mvm->trans->cfg->nvm_type == IWL_NVM_SDP) +			regulatory_type = NVM_SECTION_TYPE_REGULATORY_SDP; +		else +			regulatory_type = NVM_SECTION_TYPE_REGULATORY; +  		/* SW and REGULATORY sections are mandatory */  		if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || -		    !mvm->nvm_sections[NVM_SECTION_TYPE_REGULATORY].data) { +		    !mvm->nvm_sections[regulatory_type].data) {  			IWL_ERR(mvm,  				"Can't parse empty family 8000 OTP/NVM sections\n");  			return NULL; @@ -330,11 +336,14 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)  	hw = (const __be16 *)sections[mvm->cfg->nvm_hw_section_num].data;  	sw = (const __le16 *)sections[NVM_SECTION_TYPE_SW].data;  	calib = (const __le16 *)sections[NVM_SECTION_TYPE_CALIBRATION].data; -	regulatory = (const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY].data;  	mac_override =  		(const __le16 *)sections[NVM_SECTION_TYPE_MAC_OVERRIDE].data;  	phy_sku = (const __le16 *)sections[NVM_SECTION_TYPE_PHY_SKU].data; +	regulatory = mvm->trans->cfg->nvm_type == IWL_NVM_SDP ? +		(const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY_SDP].data : +		(const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY].data; +  	lar_enabled = !iwlwifi_mod_params.lar_disable &&  		      fw_has_capa(&mvm->fw->ucode_capa,  				  IWL_UCODE_TLV_CAPA_LAR_SUPPORT); @@ -394,7 +403,7 @@ int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm)  	IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from external NVM\n");  	/* Maximal size depends on NVM version */ -	if (!mvm->trans->cfg->ext_nvm) +	if (mvm->trans->cfg->nvm_type != IWL_NVM_EXT)  		max_section_size = IWL_MAX_NVM_SECTION_SIZE;  	else  		max_section_size = IWL_MAX_EXT_NVM_SECTION_SIZE; @@ -465,7 +474,7 @@ int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm)  			break;  		} -		if (!mvm->trans->cfg->ext_nvm) { +		if (mvm->trans->cfg->nvm_type != IWL_NVM_EXT) {  			section_size =  				2 * NVM_WORD1_LEN(le16_to_cpu(file_sec->word1));  			section_id = NVM_WORD2_ID(le16_to_cpu(file_sec->word2)); @@ -740,7 +749,7 @@ int iwl_mvm_init_mcc(struct iwl_mvm *mvm)  	struct ieee80211_regdomain *regd;  	char mcc[3]; -	if (mvm->cfg->ext_nvm) { +	if (mvm->cfg->nvm_type == IWL_NVM_EXT) {  		tlv_lar = fw_has_capa(&mvm->fw->ucode_capa,  				      IWL_UCODE_TLV_CAPA_LAR_SUPPORT);  		nvm_lar = mvm->nvm_data->lar_enabled; diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c index ba7bd049d3d4..0fe723ca844e 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c @@ -661,7 +661,8 @@ static void rs_tl_turn_on_agg(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,  	    (lq_sta->tx_agg_tid_en & BIT(tid)) &&  	    (tid_data->tx_count_last >= IWL_MVM_RS_AGG_START_THRESHOLD)) {  		IWL_DEBUG_RATE(mvm, "try to aggregate tid %d\n", tid); -		rs_tl_turn_on_agg_for_tid(mvm, lq_sta, tid, sta); +		if (rs_tl_turn_on_agg_for_tid(mvm, lq_sta, tid, sta) == 0) +			tid_data->state = IWL_AGG_QUEUED;  	}  } diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rx.c b/drivers/net/wireless/intel/iwlwifi/mvm/rx.c index 184c749766f2..2d14a58cbdd7 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rx.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rx.c @@ -244,7 +244,9 @@ static u32 iwl_mvm_set_mac80211_rx_flag(struct iwl_mvm *mvm,  		return 0;  	default: -		IWL_ERR(mvm, "Unhandled alg: 0x%x\n", rx_pkt_status); +		/* Expected in monitor (not having the keys) */ +		if (!mvm->monitor_on) +			IWL_ERR(mvm, "Unhandled alg: 0x%x\n", rx_pkt_status);  	}  	return 0; diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c index 67ffd9774712..248699c2c4bf 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c @@ -277,7 +277,9 @@ static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,  		stats->flag |= RX_FLAG_DECRYPTED;  		return 0;  	default: -		IWL_ERR(mvm, "Unhandled alg: 0x%x\n", status); +		/* Expected in monitor (not having the keys) */ +		if (!mvm->monitor_on) +			IWL_ERR(mvm, "Unhandled alg: 0x%x\n", status);  	}  	return 0; @@ -672,11 +674,12 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,  	 * If there was a significant jump in the nssn - adjust.  	 * If the SN is smaller than the NSSN it might need to first go into  	 * the reorder buffer, in which case we just release up to it and the -	 * rest of the function will take of storing it and releasing up to the -	 * nssn +	 * rest of the function will take care of storing it and releasing up to +	 * the nssn  	 */  	if (!iwl_mvm_is_sn_less(nssn, buffer->head_sn + buffer->buf_size, -				buffer->buf_size)) { +				buffer->buf_size) || +	    !ieee80211_sn_less(sn, buffer->head_sn + buffer->buf_size)) {  		u16 min_sn = ieee80211_sn_less(sn, nssn) ? sn : nssn;  		iwl_mvm_release_frames(mvm, sta, napi, buffer, min_sn); diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c index 50983615dce6..774122fed454 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c @@ -555,7 +555,7 @@ static int iwl_mvm_lmac_scan_abort(struct iwl_mvm *mvm)  	struct iwl_host_cmd cmd = {  		.id = SCAN_OFFLOAD_ABORT_CMD,  	}; -	u32 status; +	u32 status = CAN_ABORT_STATUS;  	ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status);  	if (ret) diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c index 411a2055dc45..c4a343534c5e 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c @@ -1285,7 +1285,7 @@ static int iwl_mvm_add_int_sta_common(struct iwl_mvm *mvm,  {  	struct iwl_mvm_add_sta_cmd cmd;  	int ret; -	u32 status; +	u32 status = ADD_STA_SUCCESS;  	lockdep_assert_held(&mvm->mutex); @@ -2385,8 +2385,10 @@ int iwl_mvm_sta_tx_agg_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  	if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT))  		return -EINVAL; -	if (mvmsta->tid_data[tid].state != IWL_AGG_OFF) { -		IWL_ERR(mvm, "Start AGG when state is not IWL_AGG_OFF %d!\n", +	if (mvmsta->tid_data[tid].state != IWL_AGG_QUEUED && +	    mvmsta->tid_data[tid].state != IWL_AGG_OFF) { +		IWL_ERR(mvm, +			"Start AGG when state is not IWL_AGG_QUEUED or IWL_AGG_OFF %d!\n",  			mvmsta->tid_data[tid].state);  		return -ENXIO;  	} diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h index d13893806513..aedabe101cf0 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h @@ -281,6 +281,7 @@ struct iwl_mvm_vif;   * These states relate to a specific RA / TID.   *   * @IWL_AGG_OFF: aggregation is not used + * @IWL_AGG_QUEUED: aggregation start work has been queued   * @IWL_AGG_STARTING: aggregation are starting (between start and oper)   * @IWL_AGG_ON: aggregation session is up   * @IWL_EMPTYING_HW_QUEUE_ADDBA: establishing a BA session - waiting for the @@ -290,6 +291,7 @@ struct iwl_mvm_vif;   */  enum iwl_mvm_agg_state {  	IWL_AGG_OFF = 0, +	IWL_AGG_QUEUED,  	IWL_AGG_STARTING,  	IWL_AGG_ON,  	IWL_EMPTYING_HW_QUEUE_ADDBA, diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c index 8876c2abc440..1232f63278eb 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c @@ -529,6 +529,7 @@ int iwl_mvm_ctdp_command(struct iwl_mvm *mvm, u32 op, u32 state)  	lockdep_assert_held(&mvm->mutex); +	status = 0;  	ret = iwl_mvm_send_cmd_pdu_status(mvm, WIDE_ID(PHY_OPS_GROUP,  						       CTDP_CONFIG_CMD),  					  sizeof(cmd), &cmd, &status); @@ -630,7 +631,7 @@ static int iwl_mvm_tzone_get_temp(struct thermal_zone_device *device,  	if (!iwl_mvm_firmware_running(mvm) ||  	    mvm->fwrt.cur_fw_img != IWL_UCODE_REGULAR) { -		ret = -EIO; +		ret = -ENODATA;  		goto out;  	} diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c index 172b5e63d3fb..6f2e2af23219 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c @@ -564,8 +564,8 @@ static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm,  	case NL80211_IFTYPE_AP:  	case NL80211_IFTYPE_ADHOC:  		/* -		 * Handle legacy hostapd as well, where station will be added -		 * only just before sending the association response. +		 * Non-bufferable frames use the broadcast station, thus they +		 * use the probe queue.  		 * Also take care of the case where we send a deauth to a  		 * station that we don't have, or similarly an association  		 * response (with non-success status) for a station we can't @@ -573,9 +573,9 @@ static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm,  		 * Also, disassociate frames might happen, particular with  		 * reason 7 ("Class 3 frame received from nonassociated STA").  		 */ -		if (ieee80211_is_probe_resp(fc) || ieee80211_is_auth(fc) || -		    ieee80211_is_deauth(fc) || ieee80211_is_assoc_resp(fc) || -		    ieee80211_is_disassoc(fc)) +		if (ieee80211_is_mgmt(fc) && +		    (!ieee80211_is_bufferable_mmpdu(fc) || +		     ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc)))  			return mvm->probe_queue;  		if (info->hw_queue == info->control.vif->cab_queue)  			return mvmvif->cab_queue; diff --git a/drivers/net/wireless/intersil/hostap/Makefile b/drivers/net/wireless/intersil/hostap/Makefile index b8e41a702c00..ae3bb73b2d99 100644 --- a/drivers/net/wireless/intersil/hostap/Makefile +++ b/drivers/net/wireless/intersil/hostap/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  hostap-y := hostap_80211_rx.o hostap_80211_tx.o hostap_ap.o hostap_info.o \              hostap_ioctl.o hostap_main.o hostap_proc.o   obj-$(CONFIG_HOSTAP) += hostap.o diff --git a/drivers/net/wireless/intersil/hostap/hostap.h b/drivers/net/wireless/intersil/hostap/hostap.h index ce8721fbc10e..8130d29c7989 100644 --- a/drivers/net/wireless/intersil/hostap/hostap.h +++ b/drivers/net/wireless/intersil/hostap/hostap.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef HOSTAP_H  #define HOSTAP_H diff --git a/drivers/net/wireless/intersil/hostap/hostap_80211.h b/drivers/net/wireless/intersil/hostap/hostap_80211.h index ed98ce7c8f65..1452cf6ecb07 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_80211.h +++ b/drivers/net/wireless/intersil/hostap/hostap_80211.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef HOSTAP_80211_H  #define HOSTAP_80211_H diff --git a/drivers/net/wireless/intersil/hostap/hostap_80211_rx.c b/drivers/net/wireless/intersil/hostap/hostap_80211_rx.c index 6d8b64ca1a63..61be822f90b5 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_80211_rx.c +++ b/drivers/net/wireless/intersil/hostap/hostap_80211_rx.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/etherdevice.h>  #include <linux/slab.h>  #include <linux/export.h> diff --git a/drivers/net/wireless/intersil/hostap/hostap_80211_tx.c b/drivers/net/wireless/intersil/hostap/hostap_80211_tx.c index c1b10d5117ad..c47da06945c2 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_80211_tx.c +++ b/drivers/net/wireless/intersil/hostap/hostap_80211_tx.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/slab.h>  #include <linux/export.h>  #include <linux/etherdevice.h> diff --git a/drivers/net/wireless/intersil/hostap/hostap_ap.c b/drivers/net/wireless/intersil/hostap/hostap_ap.c index eb9cd6fa9c4d..1a8d8db80b05 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_ap.c +++ b/drivers/net/wireless/intersil/hostap/hostap_ap.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Intersil Prism2 driver with Host AP (software access point) support   * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen diff --git a/drivers/net/wireless/intersil/hostap/hostap_ap.h b/drivers/net/wireless/intersil/hostap/hostap_ap.h index 334e2d0b8e11..b7ac9e2f1a39 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_ap.h +++ b/drivers/net/wireless/intersil/hostap/hostap_ap.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef HOSTAP_AP_H  #define HOSTAP_AP_H diff --git a/drivers/net/wireless/intersil/hostap/hostap_common.h b/drivers/net/wireless/intersil/hostap/hostap_common.h index 4230102ac9e4..22543538239b 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_common.h +++ b/drivers/net/wireless/intersil/hostap/hostap_common.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef HOSTAP_COMMON_H  #define HOSTAP_COMMON_H diff --git a/drivers/net/wireless/intersil/hostap/hostap_config.h b/drivers/net/wireless/intersil/hostap/hostap_config.h index 2c8f71f0ed45..3ebd55847fad 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_config.h +++ b/drivers/net/wireless/intersil/hostap/hostap_config.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef HOSTAP_CONFIG_H  #define HOSTAP_CONFIG_H diff --git a/drivers/net/wireless/intersil/hostap/hostap_download.c b/drivers/net/wireless/intersil/hostap/hostap_download.c index 705fe668b969..4507614a7c5a 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_download.c +++ b/drivers/net/wireless/intersil/hostap/hostap_download.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  static int prism2_enable_aux_port(struct net_device *dev, int enable)  {  	u16 val, reg; diff --git a/drivers/net/wireless/intersil/hostap/hostap_info.c b/drivers/net/wireless/intersil/hostap/hostap_info.c index 7635ac4f6679..de8a099a9386 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_info.c +++ b/drivers/net/wireless/intersil/hostap/hostap_info.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* Host AP driver Info Frame processing (part of hostap.o module) */  #include <linux/if_arp.h> diff --git a/drivers/net/wireless/intersil/hostap/hostap_ioctl.c b/drivers/net/wireless/intersil/hostap/hostap_ioctl.c index ff153ce29539..c1bc0a6ef300 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_ioctl.c +++ b/drivers/net/wireless/intersil/hostap/hostap_ioctl.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* ioctl() (mostly Linux Wireless Extensions) routines for Host AP driver */  #include <linux/slab.h> diff --git a/drivers/net/wireless/intersil/hostap/hostap_proc.c b/drivers/net/wireless/intersil/hostap/hostap_proc.c index dd84557cf957..d234231bf532 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_proc.c +++ b/drivers/net/wireless/intersil/hostap/hostap_proc.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* /proc routines for Host AP driver */  #include <linux/types.h> diff --git a/drivers/net/wireless/intersil/hostap/hostap_wlan.h b/drivers/net/wireless/intersil/hostap/hostap_wlan.h index 5352adb94d50..a8c4c1a8b29d 100644 --- a/drivers/net/wireless/intersil/hostap/hostap_wlan.h +++ b/drivers/net/wireless/intersil/hostap/hostap_wlan.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef HOSTAP_WLAN_H  #define HOSTAP_WLAN_H diff --git a/drivers/net/wireless/intersil/orinoco/Makefile b/drivers/net/wireless/intersil/orinoco/Makefile index b7ecef820f76..0c29c56c88d6 100644 --- a/drivers/net/wireless/intersil/orinoco/Makefile +++ b/drivers/net/wireless/intersil/orinoco/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for the orinoco wireless device drivers.  # diff --git a/drivers/net/wireless/intersil/p54/Makefile b/drivers/net/wireless/intersil/p54/Makefile index b542e68f1781..d71651ff904e 100644 --- a/drivers/net/wireless/intersil/p54/Makefile +++ b/drivers/net/wireless/intersil/p54/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  p54common-objs			:= eeprom.o fwio.o txrx.o main.o  p54common-$(CONFIG_P54_LEDS)	+= led.o diff --git a/drivers/net/wireless/marvell/libertas/Makefile b/drivers/net/wireless/marvell/libertas/Makefile index eac72f7bd341..41b9b440a542 100644 --- a/drivers/net/wireless/marvell/libertas/Makefile +++ b/drivers/net/wireless/marvell/libertas/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  libertas-y += cfg.o  libertas-y += cmd.o  libertas-y += cmdresp.o diff --git a/drivers/net/wireless/marvell/libertas/cfg.c b/drivers/net/wireless/marvell/libertas/cfg.c index 71ba2c8d09b5..9f3a7b512673 100644 --- a/drivers/net/wireless/marvell/libertas/cfg.c +++ b/drivers/net/wireless/marvell/libertas/cfg.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Implement cfg80211 ("iw") support.   * diff --git a/drivers/net/wireless/marvell/libertas/cfg.h b/drivers/net/wireless/marvell/libertas/cfg.h index acccc2922401..0e48dc6d81d1 100644 --- a/drivers/net/wireless/marvell/libertas/cfg.h +++ b/drivers/net/wireless/marvell/libertas/cfg.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __LBS_CFG80211_H__  #define __LBS_CFG80211_H__ diff --git a/drivers/net/wireless/marvell/libertas/cmd.h b/drivers/net/wireless/marvell/libertas/cmd.h index 0c5444b02c64..80878561cb90 100644 --- a/drivers/net/wireless/marvell/libertas/cmd.h +++ b/drivers/net/wireless/marvell/libertas/cmd.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* Copyright (C) 2007, Red Hat, Inc. */  #ifndef _LBS_CMD_H_ diff --git a/drivers/net/wireless/marvell/libertas/cmdresp.c b/drivers/net/wireless/marvell/libertas/cmdresp.c index aaf01619de59..b73d08381398 100644 --- a/drivers/net/wireless/marvell/libertas/cmdresp.c +++ b/drivers/net/wireless/marvell/libertas/cmdresp.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * This file contains the handling of command   * responses as well as events generated by firmware. diff --git a/drivers/net/wireless/marvell/libertas/debugfs.c b/drivers/net/wireless/marvell/libertas/debugfs.c index faed1823c58e..c83f44f9ddf1 100644 --- a/drivers/net/wireless/marvell/libertas/debugfs.c +++ b/drivers/net/wireless/marvell/libertas/debugfs.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/dcache.h>  #include <linux/debugfs.h>  #include <linux/delay.h> diff --git a/drivers/net/wireless/marvell/libertas/debugfs.h b/drivers/net/wireless/marvell/libertas/debugfs.h index f2b9c7ffe0fd..6efd1a66dad7 100644 --- a/drivers/net/wireless/marvell/libertas/debugfs.h +++ b/drivers/net/wireless/marvell/libertas/debugfs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _LBS_DEBUGFS_H_  #define _LBS_DEBUGFS_H_ diff --git a/drivers/net/wireless/marvell/libertas/decl.h b/drivers/net/wireless/marvell/libertas/decl.h index 84a3aa7ac570..5d1e30e0c5db 100644 --- a/drivers/net/wireless/marvell/libertas/decl.h +++ b/drivers/net/wireless/marvell/libertas/decl.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   *  This file contains declaration referring to diff --git a/drivers/net/wireless/marvell/libertas/defs.h b/drivers/net/wireless/marvell/libertas/defs.h index d3221444e51c..58e2ead7b0cc 100644 --- a/drivers/net/wireless/marvell/libertas/defs.h +++ b/drivers/net/wireless/marvell/libertas/defs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * This header file contains global constant/enum definitions,   * global variable declaration. diff --git a/drivers/net/wireless/marvell/libertas/dev.h b/drivers/net/wireless/marvell/libertas/dev.h index edf710bc5e77..dd1ee1f0af48 100644 --- a/drivers/net/wireless/marvell/libertas/dev.h +++ b/drivers/net/wireless/marvell/libertas/dev.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * This file contains definitions and data structures specific   * to Marvell 802.11 NIC. It contains the Device Information diff --git a/drivers/net/wireless/marvell/libertas/ethtool.c b/drivers/net/wireless/marvell/libertas/ethtool.c index 693868f16921..1bb8746a0b23 100644 --- a/drivers/net/wireless/marvell/libertas/ethtool.c +++ b/drivers/net/wireless/marvell/libertas/ethtool.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/hardirq.h>  #include <linux/netdevice.h>  #include <linux/ethtool.h> diff --git a/drivers/net/wireless/marvell/libertas/host.h b/drivers/net/wireless/marvell/libertas/host.h index 96726f79a1dd..a4fc3f79bb17 100644 --- a/drivers/net/wireless/marvell/libertas/host.h +++ b/drivers/net/wireless/marvell/libertas/host.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * This file function prototypes, data structure   * and  definitions for all the host/station commands diff --git a/drivers/net/wireless/marvell/libertas/if_usb.h b/drivers/net/wireless/marvell/libertas/if_usb.h index 6e42eac331de..8dc14bec3e16 100644 --- a/drivers/net/wireless/marvell/libertas/if_usb.h +++ b/drivers/net/wireless/marvell/libertas/if_usb.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _LBS_IF_USB_H  #define _LBS_IF_USB_H diff --git a/drivers/net/wireless/marvell/libertas/mesh.c b/drivers/net/wireless/marvell/libertas/mesh.c index 37ace5cb309d..b0cb16ef8d1d 100644 --- a/drivers/net/wireless/marvell/libertas/mesh.c +++ b/drivers/net/wireless/marvell/libertas/mesh.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt  #include <linux/delay.h> diff --git a/drivers/net/wireless/marvell/libertas/mesh.h b/drivers/net/wireless/marvell/libertas/mesh.h index 6603f341c874..dfe22c91aade 100644 --- a/drivers/net/wireless/marvell/libertas/mesh.h +++ b/drivers/net/wireless/marvell/libertas/mesh.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Contains all definitions needed for the Libertas' MESH implementation.   */ diff --git a/drivers/net/wireless/marvell/libertas/radiotap.h b/drivers/net/wireless/marvell/libertas/radiotap.h index b3c8ea6d610e..1ed5608d353f 100644 --- a/drivers/net/wireless/marvell/libertas/radiotap.h +++ b/drivers/net/wireless/marvell/libertas/radiotap.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <net/ieee80211_radiotap.h>  struct tx_radiotap_hdr { diff --git a/drivers/net/wireless/marvell/libertas/types.h b/drivers/net/wireless/marvell/libertas/types.h index cf1d9b047ee6..cd4ceb6f885d 100644 --- a/drivers/net/wireless/marvell/libertas/types.h +++ b/drivers/net/wireless/marvell/libertas/types.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * This header file contains definition for global types   */ diff --git a/drivers/net/wireless/marvell/libertas_tf/deb_defs.h b/drivers/net/wireless/marvell/libertas_tf/deb_defs.h index 4bd3dc5adf7c..37a98e228b46 100644 --- a/drivers/net/wireless/marvell/libertas_tf/deb_defs.h +++ b/drivers/net/wireless/marvell/libertas_tf/deb_defs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /**    * This header file contains global constant/enum definitions,    * global variable declaration. diff --git a/drivers/net/wireless/quantenna/qtnfmac/Makefile b/drivers/net/wireless/quantenna/qtnfmac/Makefile index f236b7dc2be3..97f760a3d599 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/Makefile +++ b/drivers/net/wireless/quantenna/qtnfmac/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Copyright (c) 2015-2016 Quantenna Communications, Inc.  # All rights reserved. diff --git a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c index 856fa6e8327e..a450bc6bc774 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c +++ b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c @@ -115,6 +115,8 @@ int qtnf_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)  	vif = qtnf_netdev_get_priv(wdev->netdev); +	qtnf_scan_done(vif->mac, true); +  	if (qtnf_cmd_send_del_intf(vif))  		pr_err("VIF%u.%u: failed to delete VIF\n", vif->mac->macid,  		       vif->vifid); @@ -335,6 +337,8 @@ static int qtnf_stop_ap(struct wiphy *wiphy, struct net_device *dev)  	struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);  	int ret; +	qtnf_scan_done(vif->mac, true); +  	ret = qtnf_cmd_send_stop_ap(vif);  	if (ret) {  		pr_err("VIF%u.%u: failed to stop AP operation in FW\n", @@ -570,8 +574,6 @@ qtnf_del_station(struct wiphy *wiphy, struct net_device *dev,  	    !qtnf_sta_list_lookup(&vif->sta_list, params->mac))  		return 0; -	qtnf_scan_done(vif->mac, true); -  	ret = qtnf_cmd_send_del_sta(vif, params);  	if (ret)  		pr_err("VIF%u.%u: failed to delete STA %pM\n", @@ -1134,8 +1136,9 @@ void qtnf_virtual_intf_cleanup(struct net_device *ndev)  		}  		vif->sta_state = QTNF_STA_DISCONNECTED; -		qtnf_scan_done(mac, true);  	} + +	qtnf_scan_done(mac, true);  }  void qtnf_cfg80211_vif_reset(struct qtnf_vif *vif) diff --git a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h index 6a4af52522b8..66db26613b1f 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h +++ b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h @@ -34,6 +34,9 @@ static inline void qtnf_scan_done(struct qtnf_wmac *mac, bool aborted)  		.aborted = aborted,  	}; +	if (timer_pending(&mac->scan_timeout)) +		del_timer_sync(&mac->scan_timeout); +  	mutex_lock(&mac->mac_lock);  	if (mac->scan_req) { diff --git a/drivers/net/wireless/quantenna/qtnfmac/event.c b/drivers/net/wireless/quantenna/qtnfmac/event.c index 0fc2814eafad..43d2e7fd6e02 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/event.c +++ b/drivers/net/wireless/quantenna/qtnfmac/event.c @@ -345,8 +345,6 @@ qtnf_event_handle_scan_complete(struct qtnf_wmac *mac,  		return -EINVAL;  	} -	if (timer_pending(&mac->scan_timeout)) -		del_timer_sync(&mac->scan_timeout);  	qtnf_scan_done(mac, le32_to_cpu(status->flags) & QLINK_SCAN_ABORTED);  	return 0; diff --git a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c index 502e72b7cdcc..69131965a298 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c +++ b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c @@ -661,14 +661,18 @@ static int qtnf_pcie_data_tx(struct qtnf_bus *bus, struct sk_buff *skb)  	struct qtnf_pcie_bus_priv *priv = (void *)get_bus_priv(bus);  	dma_addr_t txbd_paddr, skb_paddr;  	struct qtnf_tx_bd *txbd; +	unsigned long flags;  	int len, i;  	u32 info;  	int ret = 0; +	spin_lock_irqsave(&priv->tx0_lock, flags); +  	if (!qtnf_tx_queue_ready(priv)) {  		if (skb->dev)  			netif_stop_queue(skb->dev); +		spin_unlock_irqrestore(&priv->tx0_lock, flags);  		return NETDEV_TX_BUSY;  	} @@ -717,8 +721,10 @@ tx_done:  		dev_kfree_skb_any(skb);  	} -	qtnf_pcie_data_tx_reclaim(priv);  	priv->tx_done_count++; +	spin_unlock_irqrestore(&priv->tx0_lock, flags); + +	qtnf_pcie_data_tx_reclaim(priv);  	return NETDEV_TX_OK;  } @@ -1247,6 +1253,7 @@ static int qtnf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	strcpy(bus->fwname, QTN_PCI_PEARL_FW_NAME);  	init_completion(&bus->request_firmware_complete);  	mutex_init(&bus->bus_lock); +	spin_lock_init(&pcie_priv->tx0_lock);  	spin_lock_init(&pcie_priv->irq_lock);  	spin_lock_init(&pcie_priv->tx_reclaim_lock); diff --git a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h index e76a23716ee0..86ac1ccedb52 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h +++ b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h @@ -34,6 +34,8 @@ struct qtnf_pcie_bus_priv {  	/* lock for tx reclaim operations */  	spinlock_t tx_reclaim_lock; +	/* lock for tx0 operations */ +	spinlock_t tx0_lock;  	u8 msi_enabled;  	int mps; diff --git a/drivers/net/wireless/ralink/rt2x00/Makefile b/drivers/net/wireless/ralink/rt2x00/Makefile index 24a66015a495..de030ebcdf6e 100644 --- a/drivers/net/wireless/ralink/rt2x00/Makefile +++ b/drivers/net/wireless/ralink/rt2x00/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rt2x00lib-y				+= rt2x00dev.o  rt2x00lib-y				+= rt2x00mac.o  rt2x00lib-y				+= rt2x00config.o diff --git a/drivers/net/wireless/ray_cs.h b/drivers/net/wireless/ray_cs.h index 524c2f02dd82..0609d8625019 100644 --- a/drivers/net/wireless/ray_cs.h +++ b/drivers/net/wireless/ray_cs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* Raytheon wireless LAN PCMCIA card driver for Linux      A  PCMCIA client driver for the Raylink wireless network card     Written by Corey Thomas diff --git a/drivers/net/wireless/rayctl.h b/drivers/net/wireless/rayctl.h index b21ed64e15df..668444f6bf07 100644 --- a/drivers/net/wireless/rayctl.h +++ b/drivers/net/wireless/rayctl.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _RAYCTL_H_  #define _RAYCTL_H_ diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8180.h b/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8180.h index e8243a44d6b6..7948a2da195a 100644 --- a/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8180.h +++ b/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8180.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef RTL8180_H  #define RTL8180_H diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225.h b/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225.h index 310013a2d726..de7727b74631 100644 --- a/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225.h +++ b/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef RTL8180_RTL8225_H  #define RTL8180_RTL8225_H diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8187/rfkill.h b/drivers/net/wireless/realtek/rtl818x/rtl8187/rfkill.h index e12575e96d11..c493e59eede9 100644 --- a/drivers/net/wireless/realtek/rtl818x/rtl8187/rfkill.h +++ b/drivers/net/wireless/realtek/rtl818x/rtl8187/rfkill.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef RTL8187_RFKILL_H  #define RTL8187_RFKILL_H diff --git a/drivers/net/wireless/realtek/rtlwifi/Makefile b/drivers/net/wireless/realtek/rtlwifi/Makefile index 84c2e826fa1d..09c30e428375 100644 --- a/drivers/net/wireless/realtek/rtlwifi/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_RTLWIFI) 		+= rtlwifi.o  rtlwifi-objs	:=		\  		base.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile b/drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile index 20582df0465c..d15c58737388 100644 --- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  btcoexist-objs :=	halbtc8192e2ant.o	\  			halbtc8723b1ant.o	\  			halbtc8723b2ant.o	\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/Makefile index dae4f0f19cd3..5ea368e8e64b 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8188ee-objs :=		\  		dm.o		\  		fw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192c/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8192c/Makefile index 0546b7556259..40f075527fc8 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192c/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192c/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8192c-common-objs :=		\  		main.o		\  		dm_common.o	\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/Makefile index 577c7adbc322..bc307ccc5e83 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8192ce-objs :=		\  		dm.o		\  		hw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/Makefile index 97437dadc287..8b3921fd2cb6 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8192cu-objs :=		\  		dm.o		\  		hw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/Makefile index d0703f20d30c..6482d823a57a 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8192de-objs :=		\  		dm.o		\  		fw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/Makefile index f254b9f64326..12dfbeb1f3ca 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8192ee-objs :=		\  		dm.o		\  		fw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/Makefile index dfa9dbbe2cdf..e577235f5286 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8192se-objs :=		\  		dm.o		\  		fw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/Makefile index e7607d2cb2ef..d1238707291f 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8723ae-objs :=		\  		dm.o		\  		fw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/Makefile index a841cbd55d8e..d3ed44d80011 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8723be-objs :=		\  		dm.o		\  		fw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723com/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8723com/Makefile index 73da75526e2a..3451198b670c 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8723com/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723com/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8723-common-objs :=		\  		main.o		\  		dm_common.o	\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/Makefile b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/Makefile index 8ca406b95f02..81dbf4ca6bc6 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/Makefile +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rtl8821ae-objs :=		\  		dm.o		\  		fw.o		\ diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c index 4f73012978e9..1d431d4bf6d2 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c @@ -1122,7 +1122,7 @@ static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)  	}  	if (0 == tmp) {  		read_addr = REG_DBI_RDATA + addr % 4; -		ret = rtl_read_byte(rtlpriv, read_addr); +		ret = rtl_read_word(rtlpriv, read_addr);  	}  	return ret;  } diff --git a/drivers/net/wireless/rsi/Makefile b/drivers/net/wireless/rsi/Makefile index ebb89965997a..47c45908d894 100644 --- a/drivers/net/wireless/rsi/Makefile +++ b/drivers/net/wireless/rsi/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  rsi_91x-y			+= rsi_91x_main.o  rsi_91x-y			+= rsi_91x_core.o  rsi_91x-y			+= rsi_91x_mac80211.o diff --git a/drivers/net/wireless/st/cw1200/Makefile b/drivers/net/wireless/st/cw1200/Makefile index b086aac6547a..386a484e0707 100644 --- a/drivers/net/wireless/st/cw1200/Makefile +++ b/drivers/net/wireless/st/cw1200/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  cw1200_core-y := \  		fwio.o \  		txrx.o \ diff --git a/drivers/net/wireless/ti/Makefile b/drivers/net/wireless/ti/Makefile index af14231aeede..0530dd744275 100644 --- a/drivers/net/wireless/ti/Makefile +++ b/drivers/net/wireless/ti/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_WLCORE)			+= wlcore/  obj-$(CONFIG_WL12XX)			+= wl12xx/  obj-$(CONFIG_WL1251)			+= wl1251/ diff --git a/drivers/net/wireless/ti/wl1251/Makefile b/drivers/net/wireless/ti/wl1251/Makefile index 58b4f935a3f6..38da9f8e5f82 100644 --- a/drivers/net/wireless/ti/wl1251/Makefile +++ b/drivers/net/wireless/ti/wl1251/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  wl1251-objs		= main.o event.o tx.o rx.o ps.o cmd.o \  			  acx.o boot.o init.o debugfs.o io.o  wl1251_spi-objs		+= spi.o diff --git a/drivers/net/wireless/ti/wl1251/acx.c b/drivers/net/wireless/ti/wl1251/acx.c index d6fbdda2cba3..f78fc3880423 100644 --- a/drivers/net/wireless/ti/wl1251/acx.c +++ b/drivers/net/wireless/ti/wl1251/acx.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include "acx.h"  #include <linux/module.h> diff --git a/drivers/net/wireless/ti/wl1251/cmd.c b/drivers/net/wireless/ti/wl1251/cmd.c index ede31f048ef9..9547aea01b0f 100644 --- a/drivers/net/wireless/ti/wl1251/cmd.c +++ b/drivers/net/wireless/ti/wl1251/cmd.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include "cmd.h"  #include <linux/module.h> diff --git a/drivers/net/wireless/ti/wl1251/wl12xx_80211.h b/drivers/net/wireless/ti/wl1251/wl12xx_80211.h index 04ed51495772..7fabe702c4cc 100644 --- a/drivers/net/wireless/ti/wl1251/wl12xx_80211.h +++ b/drivers/net/wireless/ti/wl1251/wl12xx_80211.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __WL12XX_80211_H__  #define __WL12XX_80211_H__ diff --git a/drivers/net/wireless/ti/wlcore/Makefile b/drivers/net/wireless/ti/wlcore/Makefile index e286713b3c18..7d418c57bcb5 100644 --- a/drivers/net/wireless/ti/wlcore/Makefile +++ b/drivers/net/wireless/ti/wlcore/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  wlcore-objs		= main.o cmd.o io.o event.o tx.o rx.o ps.o acx.o \  			  boot.o init.o debugfs.o scan.o sysfs.o vendor_cmd.o diff --git a/drivers/net/wireless/ti/wlcore/wl12xx_80211.h b/drivers/net/wireless/ti/wlcore/wl12xx_80211.h index 22b0bc98d7b5..181be725eff8 100644 --- a/drivers/net/wireless/ti/wlcore/wl12xx_80211.h +++ b/drivers/net/wireless/ti/wlcore/wl12xx_80211.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __WL12XX_80211_H__  #define __WL12XX_80211_H__ diff --git a/drivers/net/wireless/wl3501.h b/drivers/net/wireless/wl3501.h index 3fbfd19818f1..efdce9ae36ea 100644 --- a/drivers/net/wireless/wl3501.h +++ b/drivers/net/wireless/wl3501.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __WL3501_H__  #define __WL3501_H__ diff --git a/drivers/net/wireless/zydas/zd1211rw/Makefile b/drivers/net/wireless/zydas/zd1211rw/Makefile index 5728a918e508..1647a449ce1a 100644 --- a/drivers/net/wireless/zydas/zd1211rw/Makefile +++ b/drivers/net/wireless/zydas/zd1211rw/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_ZD1211RW) += zd1211rw.o  zd1211rw-objs := zd_chip.o zd_mac.o \ diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index ee8ed9da00ad..4491ca5aee90 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -486,7 +486,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,  	dev->tx_queue_len = XENVIF_QUEUE_LENGTH; -	dev->min_mtu = 0; +	dev->min_mtu = ETH_MIN_MTU;  	dev->max_mtu = ETH_MAX_MTU - VLAN_ETH_HLEN;  	/* diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 523387e71a80..8b8689c6d887 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c @@ -1316,7 +1316,7 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)  	netdev->features |= netdev->hw_features;  	netdev->ethtool_ops = &xennet_ethtool_ops; -	netdev->min_mtu = 0; +	netdev->min_mtu = ETH_MIN_MTU;  	netdev->max_mtu = XEN_NETIF_MAX_TX_SIZE;  	SET_NETDEV_DEV(netdev, &dev->dev); |