diff options
Diffstat (limited to 'drivers/net')
44 files changed, 747 insertions, 400 deletions
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index dc15d248443..ef8d2a080d1 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c @@ -1060,7 +1060,7 @@ static ssize_t bonding_store_primary(struct device *d,  		goto out;  	} -	sscanf(buf, "%16s", ifname); /* IFNAMSIZ */ +	sscanf(buf, "%15s", ifname); /* IFNAMSIZ */  	/* check to see if we are clearing primary */  	if (!strlen(ifname) || buf[0] == '\n') { @@ -1237,7 +1237,7 @@ static ssize_t bonding_store_active_slave(struct device *d,  		goto out;  	} -	sscanf(buf, "%16s", ifname); /* IFNAMSIZ */ +	sscanf(buf, "%15s", ifname); /* IFNAMSIZ */  	/* check to see if we are clearing active */  	if (!strlen(ifname) || buf[0] == '\n') { diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index c78ecfca1e4..a412bf6d73e 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -144,9 +144,22 @@  #define FLEXCAN_MB_CODE_MASK		(0xf0ffffff) -/* FLEXCAN hardware feature flags */ +/* + * FLEXCAN hardware feature flags + * + * Below is some version info we got: + *    SOC   Version   IP-Version  Glitch-  [TR]WRN_INT + *                                Filter?   connected? + *   MX25  FlexCAN2  03.00.00.00     no         no + *   MX28  FlexCAN2  03.00.04.00    yes        yes + *   MX35  FlexCAN2  03.00.00.00     no         no + *   MX53  FlexCAN2  03.00.00.00    yes         no + *   MX6s  FlexCAN3  10.00.12.00    yes        yes + * + * Some SOCs do not have the RX_WARN & TX_WARN interrupt line connected. + */  #define FLEXCAN_HAS_V10_FEATURES	BIT(1) /* For core version >= 10 */ -#define FLEXCAN_HAS_BROKEN_ERR_STATE	BIT(2) /* Broken error state handling */ +#define FLEXCAN_HAS_BROKEN_ERR_STATE	BIT(2) /* [TR]WRN_INT not connected */  /* Structure of the message buffer */  struct flexcan_mb { @@ -205,7 +218,7 @@ static struct flexcan_devtype_data fsl_p1010_devtype_data = {  };  static struct flexcan_devtype_data fsl_imx28_devtype_data;  static struct flexcan_devtype_data fsl_imx6q_devtype_data = { -	.features = FLEXCAN_HAS_V10_FEATURES | FLEXCAN_HAS_BROKEN_ERR_STATE, +	.features = FLEXCAN_HAS_V10_FEATURES,  };  static const struct can_bittiming_const flexcan_bittiming_const = { diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c index f5b82aeb254..6525dbcca4e 100644 --- a/drivers/net/can/sja1000/peak_pci.c +++ b/drivers/net/can/sja1000/peak_pci.c @@ -30,9 +30,10 @@  #include "sja1000.h" -MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); +MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>");  MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCI family cards");  MODULE_SUPPORTED_DEVICE("PEAK PCAN PCI/PCIe/PCIeC miniPCI CAN cards"); +MODULE_SUPPORTED_DEVICE("PEAK PCAN miniPCIe/cPCI PC/104+ PCI/104e CAN Cards");  MODULE_LICENSE("GPL v2");  #define DRV_NAME  "peak_pci" @@ -64,7 +65,11 @@ struct peak_pci_chan {  #define PEAK_PCI_DEVICE_ID	0x0001	/* for PCI/PCIe slot cards */  #define PEAK_PCIEC_DEVICE_ID	0x0002	/* for ExpressCard slot cards */  #define PEAK_PCIE_DEVICE_ID	0x0003	/* for nextgen PCIe slot cards */ -#define PEAK_MPCI_DEVICE_ID	0x0008	/* The miniPCI slot cards */ +#define PEAK_CPCI_DEVICE_ID	0x0004	/* for nextgen cPCI slot cards */ +#define PEAK_MPCI_DEVICE_ID	0x0005	/* for nextgen miniPCI slot cards */ +#define PEAK_PC_104P_DEVICE_ID	0x0006	/* PCAN-PC/104+ cards */ +#define PEAK_PCI_104E_DEVICE_ID	0x0007	/* PCAN-PCI/104 Express cards */ +#define PEAK_MPCIE_DEVICE_ID	0x0008	/* The miniPCIe slot cards */  #define PEAK_PCI_CHAN_MAX	4 @@ -76,6 +81,10 @@ static DEFINE_PCI_DEVICE_TABLE(peak_pci_tbl) = {  	{PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},  	{PEAK_PCI_VENDOR_ID, PEAK_PCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},  	{PEAK_PCI_VENDOR_ID, PEAK_MPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, +	{PEAK_PCI_VENDOR_ID, PEAK_MPCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, +	{PEAK_PCI_VENDOR_ID, PEAK_PC_104P_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, +	{PEAK_PCI_VENDOR_ID, PEAK_PCI_104E_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, +	{PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},  #ifdef CONFIG_CAN_PEAK_PCIEC  	{PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},  #endif diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index e2e45ee5df3..6dd0dd076cc 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c @@ -137,7 +137,16 @@  #define LINK_20GTFD		LINK_STATUS_SPEED_AND_DUPLEX_20GTFD  #define LINK_20GXFD		LINK_STATUS_SPEED_AND_DUPLEX_20GXFD - +#define LINK_UPDATE_MASK \ +			(LINK_STATUS_SPEED_AND_DUPLEX_MASK | \ +			 LINK_STATUS_LINK_UP | \ +			 LINK_STATUS_PHYSICAL_LINK_FLAG | \ +			 LINK_STATUS_AUTO_NEGOTIATE_COMPLETE | \ +			 LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK | \ +			 LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK | \ +			 LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK | \ +			 LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE | \ +			 LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE)  #define SFP_EEPROM_CON_TYPE_ADDR		0x2  	#define SFP_EEPROM_CON_TYPE_VAL_LC	0x7 @@ -3295,6 +3304,21 @@ static void bnx2x_serdes_deassert(struct bnx2x *bp, u8 port)  	       DEFAULT_PHY_DEV_ADDR);  } +static void bnx2x_xgxs_specific_func(struct bnx2x_phy *phy, +				     struct link_params *params, +				     u32 action) +{ +	struct bnx2x *bp = params->bp; +	switch (action) { +	case PHY_INIT: +		/* Set correct devad */ +		REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_ST + params->port*0x18, 0); +		REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + params->port*0x18, +		       phy->def_md_devad); +		break; +	} +} +  static void bnx2x_xgxs_deassert(struct link_params *params)  {  	struct bnx2x *bp = params->bp; @@ -3309,10 +3333,8 @@ static void bnx2x_xgxs_deassert(struct link_params *params)  	REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_CLEAR, val);  	udelay(500);  	REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_SET, val); - -	REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_ST + port*0x18, 0); -	REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + port*0x18, -	       params->phy[INT_PHY].def_md_devad); +	bnx2x_xgxs_specific_func(¶ms->phy[INT_PHY], params, +				 PHY_INIT);  }  static void bnx2x_calc_ieee_aneg_adv(struct bnx2x_phy *phy, @@ -3545,14 +3567,11 @@ static void bnx2x_warpcore_set_lpi_passthrough(struct bnx2x_phy *phy,  static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  					struct link_params *params,  					struct link_vars *vars) { -	u16 val16 = 0, lane, i; +	u16 lane, i, cl72_ctrl, an_adv = 0; +	u16 ucode_ver;  	struct bnx2x *bp = params->bp;  	static struct bnx2x_reg_set reg_set[] = {  		{MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7}, -		{MDIO_AN_DEVAD, MDIO_WC_REG_PAR_DET_10G_CTRL, 0}, -		{MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 0}, -		{MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0xff}, -		{MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0x5555},  		{MDIO_PMA_DEVAD, MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0},  		{MDIO_WC_DEVAD, MDIO_WC_REG_RX66_CONTROL, 0x7415},  		{MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190}, @@ -3565,12 +3584,19 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,  				 reg_set[i].val); +	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, +		MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, &cl72_ctrl); +	cl72_ctrl &= 0xf8ff; +	cl72_ctrl |= 0x3800; +	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, +		MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, cl72_ctrl); +  	/* Check adding advertisement for 1G KX */  	if (((vars->line_speed == SPEED_AUTO_NEG) &&  	     (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) ||  	    (vars->line_speed == SPEED_1000)) {  		u32 addr = MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2; -		val16 |= (1<<5); +		an_adv |= (1<<5);  		/* Enable CL37 1G Parallel Detect */  		bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, addr, 0x1); @@ -3580,11 +3606,14 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  	     (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) ||  	    (vars->line_speed ==  SPEED_10000)) {  		/* Check adding advertisement for 10G KR */ -		val16 |= (1<<7); +		an_adv |= (1<<7);  		/* Enable 10G Parallel Detect */ +		CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, +				  MDIO_AER_BLOCK_AER_REG, 0); +  		bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,  				 MDIO_WC_REG_PAR_DET_10G_CTRL, 1); - +		bnx2x_set_aer_mmd(params, phy);  		DP(NETIF_MSG_LINK, "Advertize 10G\n");  	} @@ -3604,7 +3633,7 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  	/* Advertised speeds */  	bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, -			 MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, val16); +			 MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, an_adv);  	/* Advertised and set FEC (Forward Error Correction) */  	bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, @@ -3628,9 +3657,10 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  	/* Set KR Autoneg Work-Around flag for Warpcore version older than D108  	 */  	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_UC_INFO_B1_VERSION, &val16); -	if (val16 < 0xd108) { -		DP(NETIF_MSG_LINK, "Enable AN KR work-around\n"); +			MDIO_WC_REG_UC_INFO_B1_VERSION, &ucode_ver); +	if (ucode_ver < 0xd108) { +		DP(NETIF_MSG_LINK, "Enable AN KR work-around. WC ver:0x%x\n", +			       ucode_ver);  		vars->rx_tx_asic_rst = MAX_KR_LINK_RETRY;  	}  	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, @@ -3651,21 +3681,16 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy,  				      struct link_vars *vars)  {  	struct bnx2x *bp = params->bp; -	u16 i; +	u16 val16, i, lane;  	static struct bnx2x_reg_set reg_set[] = {  		/* Disable Autoneg */  		{MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7}, -		{MDIO_AN_DEVAD, MDIO_WC_REG_PAR_DET_10G_CTRL, 0},  		{MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL,  			0x3f00},  		{MDIO_AN_DEVAD, MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, 0},  		{MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x0},  		{MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL3_UP1, 0x1},  		{MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL5_MISC7, 0xa}, -		/* Disable CL36 PCS Tx */ -		{MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0x0}, -		/* Double Wide Single Data Rate @ pll rate */ -		{MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0xFFFF},  		/* Leave cl72 training enable, needed for KR */  		{MDIO_PMA_DEVAD,  		MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150, @@ -3676,11 +3701,24 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy,  		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,  				 reg_set[i].val); -	/* Leave CL72 enabled */ -	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, -				 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, -				 0x3800); +	lane = bnx2x_get_warpcore_lane(phy, params); +	/* Global registers */ +	CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, +			  MDIO_AER_BLOCK_AER_REG, 0); +	/* Disable CL36 PCS Tx */ +	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, +			MDIO_WC_REG_XGXSBLK1_LANECTRL0, &val16); +	val16 &= ~(0x0011 << lane); +	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, +			 MDIO_WC_REG_XGXSBLK1_LANECTRL0, val16); +	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, +			MDIO_WC_REG_XGXSBLK1_LANECTRL1, &val16); +	val16 |= (0x0303 << (lane << 1)); +	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, +			 MDIO_WC_REG_XGXSBLK1_LANECTRL1, val16); +	/* Restore AER */ +	bnx2x_set_aer_mmd(params, phy);  	/* Set speed via PMA/PMD register */  	bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD,  			 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x2040); @@ -4303,7 +4341,7 @@ static void bnx2x_warpcore_link_reset(struct bnx2x_phy *phy,  				      struct link_params *params)  {  	struct bnx2x *bp = params->bp; -	u16 val16; +	u16 val16, lane;  	bnx2x_sfp_e3_set_transmitter(params, phy, 0);  	bnx2x_set_mdio_clk(bp, params->chip_id, params->port);  	bnx2x_set_aer_mmd(params, phy); @@ -4340,6 +4378,30 @@ static void bnx2x_warpcore_link_reset(struct bnx2x_phy *phy,  			 MDIO_WC_REG_XGXSBLK1_LANECTRL2,  			 val16 & 0xff00); +	lane = bnx2x_get_warpcore_lane(phy, params); +	/* Disable CL36 PCS Tx */ +	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, +			MDIO_WC_REG_XGXSBLK1_LANECTRL0, &val16); +	val16 |= (0x11 << lane); +	if (phy->flags & FLAGS_WC_DUAL_MODE) +		val16 |= (0x22 << lane); +	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, +			 MDIO_WC_REG_XGXSBLK1_LANECTRL0, val16); + +	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, +			MDIO_WC_REG_XGXSBLK1_LANECTRL1, &val16); +	val16 &= ~(0x0303 << (lane << 1)); +	val16 |= (0x0101 << (lane << 1)); +	if (phy->flags & FLAGS_WC_DUAL_MODE) { +		val16 &= ~(0x0c0c << (lane << 1)); +		val16 |= (0x0404 << (lane << 1)); +	} + +	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, +			 MDIO_WC_REG_XGXSBLK1_LANECTRL1, val16); +	/* Restore AER */ +	bnx2x_set_aer_mmd(params, phy); +  }  static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy, @@ -6296,15 +6358,7 @@ static int bnx2x_update_link_down(struct link_params *params,  	vars->mac_type = MAC_TYPE_NONE;  	/* Update shared memory */ -	vars->link_status &= ~(LINK_STATUS_SPEED_AND_DUPLEX_MASK | -			       LINK_STATUS_LINK_UP | -			       LINK_STATUS_PHYSICAL_LINK_FLAG | -			       LINK_STATUS_AUTO_NEGOTIATE_COMPLETE | -			       LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK | -			       LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK | -			       LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK | -			       LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE | -			       LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE); +	vars->link_status &= ~LINK_UPDATE_MASK;  	vars->line_speed = 0;  	bnx2x_update_mng(params, vars->link_status); @@ -6452,6 +6506,7 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars)  	u16 ext_phy_line_speed = 0, prev_line_speed = vars->line_speed;  	u8 active_external_phy = INT_PHY;  	vars->phy_flags &= ~PHY_HALF_OPEN_CONN_FLAG; +	vars->link_status &= ~LINK_UPDATE_MASK;  	for (phy_index = INT_PHY; phy_index < params->num_phys;  	      phy_index++) {  		phy_vars[phy_index].flow_ctrl = 0; @@ -7579,7 +7634,7 @@ static void bnx2x_warpcore_power_module(struct link_params *params,  static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,  						 struct link_params *params,  						 u16 addr, u8 byte_cnt, -						 u8 *o_buf) +						 u8 *o_buf, u8 is_init)  {  	int rc = 0;  	u8 i, j = 0, cnt = 0; @@ -7596,10 +7651,10 @@ static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,  	/* 4 byte aligned address */  	addr32 = addr & (~0x3);  	do { -		if (cnt == I2C_WA_PWR_ITER) { +		if ((!is_init) && (cnt == I2C_WA_PWR_ITER)) {  			bnx2x_warpcore_power_module(params, phy, 0);  			/* Note that 100us are not enough here */ -			usleep_range(1000,1000); +			usleep_range(1000, 2000);  			bnx2x_warpcore_power_module(params, phy, 1);  		}  		rc = bnx2x_bsc_read(params, phy, 0xa0, addr32, 0, byte_cnt, @@ -7719,7 +7774,7 @@ int bnx2x_read_sfp_module_eeprom(struct bnx2x_phy *phy,  	break;  	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT:  		rc = bnx2x_warpcore_read_sfp_module_eeprom(phy, params, addr, -							   byte_cnt, o_buf); +							   byte_cnt, o_buf, 0);  	break;  	}  	return rc; @@ -7923,6 +7978,7 @@ static int bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy,  {  	u8 val; +	int rc;  	struct bnx2x *bp = params->bp;  	u16 timeout;  	/* Initialization time after hot-plug may take up to 300ms for @@ -7930,8 +7986,14 @@ static int bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy,  	 */  	for (timeout = 0; timeout < 60; timeout++) { -		if (bnx2x_read_sfp_module_eeprom(phy, params, 1, 1, &val) -		    == 0) { +		if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) +			rc = bnx2x_warpcore_read_sfp_module_eeprom(phy, +								   params, 1, +								   1, &val, 1); +		else +			rc = bnx2x_read_sfp_module_eeprom(phy, params, 1, 1, +							  &val); +		if (rc == 0) {  			DP(NETIF_MSG_LINK,  			   "SFP+ module initialization took %d ms\n",  			   timeout * 5); @@ -7939,7 +8001,8 @@ static int bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy,  		}  		usleep_range(5000, 10000);  	} -	return -EINVAL; +	rc = bnx2x_read_sfp_module_eeprom(phy, params, 1, 1, &val); +	return rc;  }  static void bnx2x_8727_power_module(struct bnx2x *bp, @@ -10993,7 +11056,7 @@ static struct bnx2x_phy phy_xgxs = {  	.format_fw_ver	= (format_fw_ver_t)NULL,  	.hw_reset	= (hw_reset_t)NULL,  	.set_link_led	= (set_link_led_t)NULL, -	.phy_specific_func = (phy_specific_func_t)NULL +	.phy_specific_func = (phy_specific_func_t)bnx2x_xgxs_specific_func  };  static struct bnx2x_phy phy_warpcore = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT, @@ -11465,6 +11528,11 @@ static int bnx2x_populate_int_phy(struct bnx2x *bp, u32 shmem_base, u8 port,  			phy->media_type = ETH_PHY_BASE_T;  			break;  		case PORT_HW_CFG_NET_SERDES_IF_XFI: +			phy->supported &= (SUPPORTED_1000baseT_Full | +					   SUPPORTED_10000baseT_Full | +					   SUPPORTED_FIBRE | +					   SUPPORTED_Pause | +					   SUPPORTED_Asym_Pause);  			phy->media_type = ETH_PHY_XFP_FIBER;  			break;  		case PORT_HW_CFG_NET_SERDES_IF_SFI: diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index d5648fc666b..bd1fd3d87c2 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c @@ -6794,8 +6794,9 @@ static int bnx2x_init_hw_port(struct bnx2x *bp)  	bnx2x_init_block(bp, BLOCK_DORQ, init_phase); +	bnx2x_init_block(bp, BLOCK_BRB1, init_phase); +  	if (CHIP_IS_E1(bp) || CHIP_IS_E1H(bp)) { -		bnx2x_init_block(bp, BLOCK_BRB1, init_phase);  		if (IS_MF(bp))  			low = ((bp->flags & ONE_PORT_FLAG) ? 160 : 246); @@ -11902,7 +11903,15 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,  	/* disable FCOE L2 queue for E1x */  	if (CHIP_IS_E1x(bp))  		bp->flags |= NO_FCOE_FLAG; - +	/* disable FCOE for 57840 device, until FW supports it */ +	switch (ent->driver_data) { +	case BCM57840_O: +	case BCM57840_4_10: +	case BCM57840_2_20: +	case BCM57840_MFO: +	case BCM57840_MF: +		bp->flags |= NO_FCOE_FLAG; +	}  #endif diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index a4da893ac1e..378988b5709 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h @@ -251,6 +251,8 @@ struct adapter_params {  	unsigned char rev;                /* chip revision */  	unsigned char offload; +	unsigned char bypass; +  	unsigned int ofldq_wr_cred;  }; @@ -642,6 +644,23 @@ extern int dbfifo_int_thresh;  #define for_each_port(adapter, iter) \  	for (iter = 0; iter < (adapter)->params.nports; ++iter) +static inline int is_bypass(struct adapter *adap) +{ +	return adap->params.bypass; +} + +static inline int is_bypass_device(int device) +{ +	/* this should be set based upon device capabilities */ +	switch (device) { +	case 0x440b: +	case 0x440c: +		return 1; +	default: +		return 0; +	} +} +  static inline unsigned int core_ticks_per_usec(const struct adapter *adap)  {  	return adap->params.vpd.cclk / 1000; diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 604f4f87f55..0df1284df49 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c @@ -3416,16 +3416,6 @@ static int adap_init0_config(struct adapter *adapter, int reset)  			 finicsum, cfcsum);  	/* -	 * If we're a pure NIC driver then disable all offloading facilities. -	 * This will allow the firmware to optimize aspects of the hardware -	 * configuration which will result in improved performance. -	 */ -	caps_cmd.ofldcaps = 0; -	caps_cmd.iscsicaps = 0; -	caps_cmd.rdmacaps = 0; -	caps_cmd.fcoecaps = 0; - -	/*  	 * And now tell the firmware to use the configuration we just loaded.  	 */  	caps_cmd.op_to_write = @@ -3513,18 +3503,6 @@ static int adap_init0_no_config(struct adapter *adapter, int reset)  	if (ret < 0)  		goto bye; -#ifndef CONFIG_CHELSIO_T4_OFFLOAD -	/* -	 * If we're a pure NIC driver then disable all offloading facilities. -	 * This will allow the firmware to optimize aspects of the hardware -	 * configuration which will result in improved performance. -	 */ -	caps_cmd.ofldcaps = 0; -	caps_cmd.iscsicaps = 0; -	caps_cmd.rdmacaps = 0; -	caps_cmd.fcoecaps = 0; -#endif -  	if (caps_cmd.niccaps & htons(FW_CAPS_CONFIG_NIC_VM)) {  		if (!vf_acls)  			caps_cmd.niccaps ^= htons(FW_CAPS_CONFIG_NIC_VM); @@ -3745,6 +3723,7 @@ static int adap_init0(struct adapter *adap)  	u32 v, port_vec;  	enum dev_state state;  	u32 params[7], val[7]; +	struct fw_caps_config_cmd caps_cmd;  	int reset = 1, j;  	/* @@ -3898,6 +3877,9 @@ static int adap_init0(struct adapter *adap)  			goto bye;  	} +	if (is_bypass_device(adap->pdev->device)) +		adap->params.bypass = 1; +  	/*  	 * Grab some of our basic fundamental operating parameters.  	 */ @@ -3940,13 +3922,12 @@ static int adap_init0(struct adapter *adap)  		adap->tids.aftid_end = val[1];  	} -#ifdef CONFIG_CHELSIO_T4_OFFLOAD  	/*  	 * Get device capabilities so we can determine what resources we need  	 * to manage.  	 */  	memset(&caps_cmd, 0, sizeof(caps_cmd)); -	caps_cmd.op_to_write = htonl(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) | +	caps_cmd.op_to_write = htonl(FW_CMD_OP(FW_CAPS_CONFIG_CMD) |  				     FW_CMD_REQUEST | FW_CMD_READ);  	caps_cmd.retval_len16 = htonl(FW_LEN16(caps_cmd));  	ret = t4_wr_mbox(adap, adap->mbox, &caps_cmd, sizeof(caps_cmd), @@ -3991,15 +3972,6 @@ static int adap_init0(struct adapter *adap)  		adap->vres.ddp.size = val[4] - val[3] + 1;  		adap->params.ofldq_wr_cred = val[5]; -		params[0] = FW_PARAM_PFVF(ETHOFLD_START); -		params[1] = FW_PARAM_PFVF(ETHOFLD_END); -		ret = t4_query_params(adap, adap->mbox, adap->fn, 0, 2, -				      params, val); -		if ((val[0] != val[1]) && (ret >= 0)) { -			adap->tids.uotid_base = val[0]; -			adap->tids.nuotids = val[1] - val[0] + 1; -		} -  		adap->params.offload = 1;  	}  	if (caps_cmd.rdmacaps) { @@ -4048,7 +4020,6 @@ static int adap_init0(struct adapter *adap)  	}  #undef FW_PARAM_PFVF  #undef FW_PARAM_DEV -#endif /* CONFIG_CHELSIO_T4_OFFLOAD */  	/*  	 * These are finalized by FW initialization, load their values now. diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h index 1b899fea1a9..39bec73ff87 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h @@ -102,6 +102,9 @@ struct tid_info {  	unsigned int ftid_base;  	unsigned int aftid_base;  	unsigned int aftid_end; +	/* Server filter region */ +	unsigned int sftid_base; +	unsigned int nsftids;  	spinlock_t atid_lock ____cacheline_aligned_in_smp;  	union aopen_entry *afree; diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c index b9db0e04056..2e5daee0438 100644 --- a/drivers/net/ethernet/freescale/gianfar_ptp.c +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c @@ -478,7 +478,7 @@ static int gianfar_ptp_probe(struct platform_device *dev)  		pr_err("no resource\n");  		goto no_resource;  	} -	if (request_resource(&ioport_resource, etsects->rsrc)) { +	if (request_resource(&iomem_resource, etsects->rsrc)) {  		pr_err("resource busy\n");  		goto no_resource;  	} diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index 56b20d17d0e..116f0e901be 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c @@ -2673,6 +2673,9 @@ static int ixgbe_get_ts_info(struct net_device *dev,  	case ixgbe_mac_X540:  	case ixgbe_mac_82599EB:  		info->so_timestamping = +			SOF_TIMESTAMPING_TX_SOFTWARE | +			SOF_TIMESTAMPING_RX_SOFTWARE | +			SOF_TIMESTAMPING_SOFTWARE |  			SOF_TIMESTAMPING_TX_HARDWARE |  			SOF_TIMESTAMPING_RX_HARDWARE |  			SOF_TIMESTAMPING_RAW_HARDWARE; diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index c10e3a6de09..b35094c590b 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c @@ -143,7 +143,6 @@ void mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv,  		mlx4_bf_free(mdev->dev, &ring->bf);  	mlx4_qp_remove(mdev->dev, &ring->qp);  	mlx4_qp_free(mdev->dev, &ring->qp); -	mlx4_qp_release_range(mdev->dev, ring->qpn, 1);  	mlx4_en_unmap_buffer(&ring->wqres.buf);  	mlx4_free_hwq_res(mdev->dev, &ring->wqres, ring->buf_size);  	kfree(ring->bounce_buf); @@ -712,7 +711,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)  	if (bounce)  		tx_desc = mlx4_en_bounce_to_desc(priv, ring, index, desc_size); -	if (ring->bf_enabled && desc_size <= MAX_BF && !bounce && !vlan_tag) { +	if (ring->bf_enabled && desc_size <= MAX_BF && !bounce && !vlan_tx_tag_present(skb)) {  		*(__be32 *) (&tx_desc->ctrl.vlan_tag) |= cpu_to_be32(ring->doorbell_qpn);  		op_own |= htonl((bf_index & 0xffff) << 8);  		/* Ensure new descirptor hits memory diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 51c764901ad..b84a88bc44d 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c @@ -329,9 +329,6 @@ int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave,  	ctx = &priv->mfunc.master.slave_state[slave];  	spin_lock_irqsave(&ctx->lock, flags); -	mlx4_dbg(dev, "%s: slave: %d, current state: %d new event :%d\n", -		 __func__, slave, cur_state, event); -  	switch (cur_state) {  	case SLAVE_PORT_DOWN:  		if (MLX4_PORT_STATE_DEV_EVENT_PORT_UP == event) @@ -366,9 +363,6 @@ int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave,  			goto out;  	}  	ret = mlx4_get_slave_port_state(dev, slave, port); -	mlx4_dbg(dev, "%s: slave: %d, current state: %d new event" -		 " :%d gen_event: %d\n", -		 __func__, slave, cur_state, event, *gen_event);  out:  	spin_unlock_irqrestore(&ctx->lock, flags); @@ -843,6 +837,18 @@ static void __iomem *mlx4_get_eq_uar(struct mlx4_dev *dev, struct mlx4_eq *eq)  	return priv->eq_table.uar_map[index] + 0x800 + 8 * (eq->eqn % 4);  } +static void mlx4_unmap_uar(struct mlx4_dev *dev) +{ +	struct mlx4_priv *priv = mlx4_priv(dev); +	int i; + +	for (i = 0; i < mlx4_num_eq_uar(dev); ++i) +		if (priv->eq_table.uar_map[i]) { +			iounmap(priv->eq_table.uar_map[i]); +			priv->eq_table.uar_map[i] = NULL; +		} +} +  static int mlx4_create_eq(struct mlx4_dev *dev, int nent,  			  u8 intr, struct mlx4_eq *eq)  { @@ -1207,6 +1213,7 @@ err_out_unmap:  	mlx4_free_irqs(dev);  err_out_bitmap: +	mlx4_unmap_uar(dev);  	mlx4_bitmap_cleanup(&priv->eq_table.bitmap);  err_out_free: @@ -1231,10 +1238,7 @@ void mlx4_cleanup_eq_table(struct mlx4_dev *dev)  	if (!mlx4_is_slave(dev))  		mlx4_unmap_clr_int(dev); -	for (i = 0; i < mlx4_num_eq_uar(dev); ++i) -		if (priv->eq_table.uar_map[i]) -			iounmap(priv->eq_table.uar_map[i]); - +	mlx4_unmap_uar(dev);  	mlx4_bitmap_cleanup(&priv->eq_table.bitmap);  	kfree(priv->eq_table.uar_map); diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 80df2ab0177..2aa80afd98d 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c @@ -1405,7 +1405,10 @@ unmap_bf:  	unmap_bf_area(dev);  err_close: -	mlx4_close_hca(dev); +	if (mlx4_is_slave(dev)) +		mlx4_slave_exit(dev); +	else +		mlx4_CLOSE_HCA(dev, 0);  err_free_icm:  	if (!mlx4_is_slave(dev)) diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 926c911c0ac..b05705f50f0 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c @@ -330,9 +330,6 @@ static void update_pkey_index(struct mlx4_dev *dev, int slave,  	new_index = priv->virt2phys_pkey[slave][port - 1][orig_index];  	*(u8 *)(inbox->buf + 35) = new_index; - -	mlx4_dbg(dev, "port = %d, orig pkey index = %d, " -		 "new pkey index = %d\n", port, orig_index, new_index);  }  static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox, @@ -351,9 +348,6 @@ static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox,  		if (optpar & MLX4_QP_OPTPAR_ALT_ADDR_PATH)  			qp_ctx->alt_path.mgid_index = slave & 0x7F;  	} - -	mlx4_dbg(dev, "slave %d, new gid index: 0x%x ", -		slave, qp_ctx->pri_path.mgid_index);  }  static int mpt_mask(struct mlx4_dev *dev) diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c index 53743f7a2ca..af8b4142088 100644 --- a/drivers/net/ethernet/nxp/lpc_eth.c +++ b/drivers/net/ethernet/nxp/lpc_eth.c @@ -1524,6 +1524,7 @@ static int lpc_eth_drv_remove(struct platform_device *pdev)  				  pldat->dma_buff_base_p);  	free_irq(ndev->irq, ndev);  	iounmap(pldat->net_base); +	mdiobus_unregister(pldat->mii_bus);  	mdiobus_free(pldat->mii_bus);  	clk_disable(pldat->clk);  	clk_put(pldat->clk); diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c index b2a94d02a52..4c4fe5b1a29 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c @@ -339,26 +339,6 @@ static void pch_gbe_wait_clr_bit(void *reg, u32 bit)  }  /** - * pch_gbe_wait_clr_bit_irq - Wait to clear a bit for interrupt context - * @reg:	Pointer of register - * @busy:	Busy bit - */ -static int pch_gbe_wait_clr_bit_irq(void *reg, u32 bit) -{ -	u32 tmp; -	int ret = -1; -	/* wait busy */ -	tmp = 20; -	while ((ioread32(reg) & bit) && --tmp) -		udelay(5); -	if (!tmp) -		pr_err("Error: busy bit is not cleared\n"); -	else -		ret = 0; -	return ret; -} - -/**   * pch_gbe_mac_mar_set - Set MAC address register   * @hw:	    Pointer to the HW structure   * @addr:   Pointer to the MAC address @@ -409,15 +389,20 @@ static void pch_gbe_mac_reset_hw(struct pch_gbe_hw *hw)  	return;  } -static void pch_gbe_mac_reset_rx(struct pch_gbe_hw *hw) +static void pch_gbe_disable_mac_rx(struct pch_gbe_hw *hw)  { -	/* Read the MAC addresses. and store to the private data */ -	pch_gbe_mac_read_mac_addr(hw); -	iowrite32(PCH_GBE_RX_RST, &hw->reg->RESET); -	pch_gbe_wait_clr_bit_irq(&hw->reg->RESET, PCH_GBE_RX_RST); -	/* Setup the MAC addresses */ -	pch_gbe_mac_mar_set(hw, hw->mac.addr, 0); -	return; +	u32 rctl; +	/* Disables Receive MAC */ +	rctl = ioread32(&hw->reg->MAC_RX_EN); +	iowrite32((rctl & ~PCH_GBE_MRE_MAC_RX_EN), &hw->reg->MAC_RX_EN); +} + +static void pch_gbe_enable_mac_rx(struct pch_gbe_hw *hw) +{ +	u32 rctl; +	/* Enables Receive MAC */ +	rctl = ioread32(&hw->reg->MAC_RX_EN); +	iowrite32((rctl | PCH_GBE_MRE_MAC_RX_EN), &hw->reg->MAC_RX_EN);  }  /** @@ -913,7 +898,7 @@ static void pch_gbe_setup_rctl(struct pch_gbe_adapter *adapter)  static void pch_gbe_configure_rx(struct pch_gbe_adapter *adapter)  {  	struct pch_gbe_hw *hw = &adapter->hw; -	u32 rdba, rdlen, rctl, rxdma; +	u32 rdba, rdlen, rxdma;  	pr_debug("dma adr = 0x%08llx  size = 0x%08x\n",  		 (unsigned long long)adapter->rx_ring->dma, @@ -921,9 +906,7 @@ static void pch_gbe_configure_rx(struct pch_gbe_adapter *adapter)  	pch_gbe_mac_force_mac_fc(hw); -	/* Disables Receive MAC */ -	rctl = ioread32(&hw->reg->MAC_RX_EN); -	iowrite32((rctl & ~PCH_GBE_MRE_MAC_RX_EN), &hw->reg->MAC_RX_EN); +	pch_gbe_disable_mac_rx(hw);  	/* Disables Receive DMA */  	rxdma = ioread32(&hw->reg->DMA_CTRL); @@ -1316,38 +1299,17 @@ void pch_gbe_update_stats(struct pch_gbe_adapter *adapter)  	spin_unlock_irqrestore(&adapter->stats_lock, flags);  } -static void pch_gbe_stop_receive(struct pch_gbe_adapter *adapter) +static void pch_gbe_disable_dma_rx(struct pch_gbe_hw *hw)  { -	struct pch_gbe_hw *hw = &adapter->hw;  	u32 rxdma; -	u16 value; -	int ret;  	/* Disable Receive DMA */  	rxdma = ioread32(&hw->reg->DMA_CTRL);  	rxdma &= ~PCH_GBE_RX_DMA_EN;  	iowrite32(rxdma, &hw->reg->DMA_CTRL); -	/* Wait Rx DMA BUS is IDLE */ -	ret = pch_gbe_wait_clr_bit_irq(&hw->reg->RX_DMA_ST, PCH_GBE_IDLE_CHECK); -	if (ret) { -		/* Disable Bus master */ -		pci_read_config_word(adapter->pdev, PCI_COMMAND, &value); -		value &= ~PCI_COMMAND_MASTER; -		pci_write_config_word(adapter->pdev, PCI_COMMAND, value); -		/* Stop Receive */ -		pch_gbe_mac_reset_rx(hw); -		/* Enable Bus master */ -		value |= PCI_COMMAND_MASTER; -		pci_write_config_word(adapter->pdev, PCI_COMMAND, value); -	} else { -		/* Stop Receive */ -		pch_gbe_mac_reset_rx(hw); -	} -	/* reprogram multicast address register after reset */ -	pch_gbe_set_multi(adapter->netdev);  } -static void pch_gbe_start_receive(struct pch_gbe_hw *hw) +static void pch_gbe_enable_dma_rx(struct pch_gbe_hw *hw)  {  	u32 rxdma; @@ -1355,9 +1317,6 @@ static void pch_gbe_start_receive(struct pch_gbe_hw *hw)  	rxdma = ioread32(&hw->reg->DMA_CTRL);  	rxdma |= PCH_GBE_RX_DMA_EN;  	iowrite32(rxdma, &hw->reg->DMA_CTRL); -	/* Enables Receive */ -	iowrite32(PCH_GBE_MRE_MAC_RX_EN, &hw->reg->MAC_RX_EN); -	return;  }  /** @@ -1393,7 +1352,7 @@ static irqreturn_t pch_gbe_intr(int irq, void *data)  			int_en = ioread32(&hw->reg->INT_EN);  			iowrite32((int_en & ~PCH_GBE_INT_RX_FIFO_ERR),  				  &hw->reg->INT_EN); -			pch_gbe_stop_receive(adapter); +			pch_gbe_disable_dma_rx(&adapter->hw);  			int_st |= ioread32(&hw->reg->INT_ST);  			int_st = int_st & ioread32(&hw->reg->INT_EN);  		} @@ -1971,12 +1930,12 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter)  	struct net_device *netdev = adapter->netdev;  	struct pch_gbe_tx_ring *tx_ring = adapter->tx_ring;  	struct pch_gbe_rx_ring *rx_ring = adapter->rx_ring; -	int err; +	int err = -EINVAL;  	/* Ensure we have a valid MAC */  	if (!is_valid_ether_addr(adapter->hw.mac.addr)) {  		pr_err("Error: Invalid MAC address\n"); -		return -EINVAL; +		goto out;  	}  	/* hardware has been reset, we need to reload some things */ @@ -1989,18 +1948,19 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter)  	err = pch_gbe_request_irq(adapter);  	if (err) { -		pr_err("Error: can't bring device up\n"); -		return err; +		pr_err("Error: can't bring device up - irq request failed\n"); +		goto out;  	}  	err = pch_gbe_alloc_rx_buffers_pool(adapter, rx_ring, rx_ring->count);  	if (err) { -		pr_err("Error: can't bring device up\n"); -		return err; +		pr_err("Error: can't bring device up - alloc rx buffers pool failed\n"); +		goto freeirq;  	}  	pch_gbe_alloc_tx_buffers(adapter, tx_ring);  	pch_gbe_alloc_rx_buffers(adapter, rx_ring, rx_ring->count);  	adapter->tx_queue_len = netdev->tx_queue_len; -	pch_gbe_start_receive(&adapter->hw); +	pch_gbe_enable_dma_rx(&adapter->hw); +	pch_gbe_enable_mac_rx(&adapter->hw);  	mod_timer(&adapter->watchdog_timer, jiffies); @@ -2009,6 +1969,11 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter)  	netif_start_queue(adapter->netdev);  	return 0; + +freeirq: +	pch_gbe_free_irq(adapter); +out: +	return err;  }  /** @@ -2405,7 +2370,6 @@ static int pch_gbe_napi_poll(struct napi_struct *napi, int budget)  	int work_done = 0;  	bool poll_end_flag = false;  	bool cleaned = false; -	u32 int_en;  	pr_debug("budget : %d\n", budget); @@ -2422,19 +2386,13 @@ static int pch_gbe_napi_poll(struct napi_struct *napi, int budget)  	if (poll_end_flag) {  		napi_complete(napi); -		if (adapter->rx_stop_flag) { -			adapter->rx_stop_flag = false; -			pch_gbe_start_receive(&adapter->hw); -		}  		pch_gbe_irq_enable(adapter); -	} else -		if (adapter->rx_stop_flag) { -			adapter->rx_stop_flag = false; -			pch_gbe_start_receive(&adapter->hw); -			int_en = ioread32(&adapter->hw.reg->INT_EN); -			iowrite32((int_en | PCH_GBE_INT_RX_FIFO_ERR), -				&adapter->hw.reg->INT_EN); -		} +	} + +	if (adapter->rx_stop_flag) { +		adapter->rx_stop_flag = false; +		pch_gbe_enable_dma_rx(&adapter->hw); +	}  	pr_debug("poll_end_flag : %d  work_done : %d  budget : %d\n",  		 poll_end_flag, work_done, budget); diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c index df09b1cb742..6407d0d77e8 100644 --- a/drivers/net/ethernet/qlogic/qla3xxx.c +++ b/drivers/net/ethernet/qlogic/qla3xxx.c @@ -2525,6 +2525,13 @@ static int ql_alloc_net_req_rsp_queues(struct ql3_adapter *qdev)  	qdev->req_q_size =  	    (u32) (NUM_REQ_Q_ENTRIES * sizeof(struct ob_mac_iocb_req)); +	qdev->rsp_q_size = NUM_RSP_Q_ENTRIES * sizeof(struct net_rsp_iocb); + +	/* The barrier is required to ensure request and response queue +	 * addr writes to the registers. +	 */ +	wmb(); +  	qdev->req_q_virt_addr =  	    pci_alloc_consistent(qdev->pdev,  				 (size_t) qdev->req_q_size, @@ -2536,8 +2543,6 @@ static int ql_alloc_net_req_rsp_queues(struct ql3_adapter *qdev)  		return -ENOMEM;  	} -	qdev->rsp_q_size = NUM_RSP_Q_ENTRIES * sizeof(struct net_rsp_iocb); -  	qdev->rsp_q_virt_addr =  	    pci_alloc_consistent(qdev->pdev,  				 (size_t) qdev->rsp_q_size, diff --git a/drivers/net/ethernet/ti/Kconfig b/drivers/net/ethernet/ti/Kconfig index b26cbda5efa..2c41894d547 100644 --- a/drivers/net/ethernet/ti/Kconfig +++ b/drivers/net/ethernet/ti/Kconfig @@ -5,7 +5,7 @@  config NET_VENDOR_TI  	bool "Texas Instruments (TI) devices"  	default y -	depends on PCI || EISA || AR7 || (ARM && (ARCH_DAVINCI || ARCH_OMAP3)) +	depends on PCI || EISA || AR7 || (ARM && (ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX))  	---help---  	  If you have a network (Ethernet) card belonging to this class, say Y  	  and read the Ethernet-HOWTO, available from diff --git a/drivers/net/ethernet/tile/tilegx.c b/drivers/net/ethernet/tile/tilegx.c index 4e2a1628484..4e981001385 100644 --- a/drivers/net/ethernet/tile/tilegx.c +++ b/drivers/net/ethernet/tile/tilegx.c @@ -1334,11 +1334,11 @@ static int tso_count_edescs(struct sk_buff *skb)  {  	struct skb_shared_info *sh = skb_shinfo(skb);  	unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); -	unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; +	unsigned int data_len = skb->len - sh_len;  	unsigned int p_len = sh->gso_size;  	long f_id = -1;    /* id of the current fragment */ -	long f_size = skb->hdr_len;  /* size of the current fragment */ -	long f_used = sh_len;  /* bytes used from the current fragment */ +	long f_size = skb_headlen(skb) - sh_len;  /* current fragment size */ +	long f_used = 0;  /* bytes used from the current fragment */  	long n;            /* size of the current piece of payload */  	int num_edescs = 0;  	int segment; @@ -1353,7 +1353,7 @@ static int tso_count_edescs(struct sk_buff *skb)  			/* Advance as needed. */  			while (f_used >= f_size) {  				f_id++; -				f_size = sh->frags[f_id].size; +				f_size = skb_frag_size(&sh->frags[f_id]);  				f_used = 0;  			} @@ -1384,13 +1384,13 @@ static void tso_headers_prepare(struct sk_buff *skb, unsigned char *headers,  	struct iphdr *ih;  	struct tcphdr *th;  	unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); -	unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; +	unsigned int data_len = skb->len - sh_len;  	unsigned char *data = skb->data;  	unsigned int ih_off, th_off, p_len;  	unsigned int isum_seed, tsum_seed, id, seq;  	long f_id = -1;    /* id of the current fragment */ -	long f_size = skb->hdr_len;  /* size of the current fragment */ -	long f_used = sh_len;  /* bytes used from the current fragment */ +	long f_size = skb_headlen(skb) - sh_len;  /* current fragment size */ +	long f_used = 0;  /* bytes used from the current fragment */  	long n;            /* size of the current piece of payload */  	int segment; @@ -1405,7 +1405,7 @@ static void tso_headers_prepare(struct sk_buff *skb, unsigned char *headers,  	isum_seed = ((0xFFFF - ih->check) +  		     (0xFFFF - ih->tot_len) +  		     (0xFFFF - ih->id)); -	tsum_seed = th->check + (0xFFFF ^ htons(sh_len + data_len)); +	tsum_seed = th->check + (0xFFFF ^ htons(skb->len));  	id = ntohs(ih->id);  	seq = ntohl(th->seq); @@ -1444,7 +1444,7 @@ static void tso_headers_prepare(struct sk_buff *skb, unsigned char *headers,  			/* Advance as needed. */  			while (f_used >= f_size) {  				f_id++; -				f_size = sh->frags[f_id].size; +				f_size = skb_frag_size(&sh->frags[f_id]);  				f_used = 0;  			} @@ -1478,14 +1478,14 @@ static void tso_egress(struct net_device *dev, gxio_mpipe_equeue_t *equeue,  	struct tile_net_priv *priv = netdev_priv(dev);  	struct skb_shared_info *sh = skb_shinfo(skb);  	unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); -	unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; +	unsigned int data_len = skb->len - sh_len;  	unsigned int p_len = sh->gso_size;  	gxio_mpipe_edesc_t edesc_head = { { 0 } };  	gxio_mpipe_edesc_t edesc_body = { { 0 } };  	long f_id = -1;    /* id of the current fragment */ -	long f_size = skb->hdr_len;  /* size of the current fragment */ -	long f_used = sh_len;  /* bytes used from the current fragment */ -	void *f_data = skb->data; +	long f_size = skb_headlen(skb) - sh_len;  /* current fragment size */ +	long f_used = 0;  /* bytes used from the current fragment */ +	void *f_data = skb->data + sh_len;  	long n;            /* size of the current piece of payload */  	unsigned long tx_packets = 0, tx_bytes = 0;  	unsigned int csum_start; @@ -1516,15 +1516,18 @@ static void tso_egress(struct net_device *dev, gxio_mpipe_equeue_t *equeue,  		/* Egress the payload. */  		while (p_used < p_len) { +			void *va;  			/* Advance as needed. */  			while (f_used >= f_size) {  				f_id++; -				f_size = sh->frags[f_id].size; -				f_used = 0; +				f_size = skb_frag_size(&sh->frags[f_id]);  				f_data = tile_net_frag_buf(&sh->frags[f_id]); +				f_used = 0;  			} +			va = f_data + f_used; +  			/* Use bytes from the current fragment. */  			n = p_len - p_used;  			if (n > f_size - f_used) @@ -1533,7 +1536,7 @@ static void tso_egress(struct net_device *dev, gxio_mpipe_equeue_t *equeue,  			p_used += n;  			/* Egress a piece of the payload. */ -			edesc_body.va = va_to_tile_io_addr(f_data) + f_used; +			edesc_body.va = va_to_tile_io_addr(va);  			edesc_body.xfer_size = n;  			edesc_body.bound = !(p_used < p_len);  			gxio_mpipe_equeue_put_at(equeue, edesc_body, slot); diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 983bbf4d5ef..961f0b29391 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -15,6 +15,11 @@ if PHYLIB  comment "MII PHY device drivers" +config AT803X_PHY +	tristate "Drivers for Atheros AT803X PHYs" +	---help--- +	  Currently supports the AT8030 and AT8035 model +  config AMD_PHY  	tristate "Drivers for the AMD PHYs"  	---help--- diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 426674debae..9645e389a58 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -25,6 +25,7 @@ obj-$(CONFIG_STE10XP)		+= ste10Xp.o  obj-$(CONFIG_MICREL_PHY)	+= micrel.o  obj-$(CONFIG_MDIO_OCTEON)	+= mdio-octeon.o  obj-$(CONFIG_MICREL_KS8995MA)	+= spi_ks8995.o +obj-$(CONFIG_AT803X_PHY)	+= at803x.o  obj-$(CONFIG_AMD_PHY)		+= amd.o  obj-$(CONFIG_MDIO_BUS_MUX)	+= mdio-mux.o  obj-$(CONFIG_MDIO_BUS_MUX_GPIO)	+= mdio-mux-gpio.o diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c new file mode 100644 index 00000000000..45cbc10de01 --- /dev/null +++ b/drivers/net/phy/at803x.c @@ -0,0 +1,176 @@ +/* + * drivers/net/phy/at803x.c + * + * Driver for Atheros 803x PHY + * + * Author: Matus Ujhelyi <ujhelyi.m@gmail.com> + * + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version. + */ + +#include <linux/phy.h> +#include <linux/module.h> +#include <linux/string.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> + +#define AT803X_INTR_ENABLE			0x12 +#define AT803X_INTR_STATUS			0x13 +#define AT803X_WOL_ENABLE			0x01 +#define AT803X_DEVICE_ADDR			0x03 +#define AT803X_LOC_MAC_ADDR_0_15_OFFSET		0x804C +#define AT803X_LOC_MAC_ADDR_16_31_OFFSET	0x804B +#define AT803X_LOC_MAC_ADDR_32_47_OFFSET	0x804A +#define AT803X_MMD_ACCESS_CONTROL		0x0D +#define AT803X_MMD_ACCESS_CONTROL_DATA		0x0E +#define AT803X_FUNC_DATA			0x4003 + +MODULE_DESCRIPTION("Atheros 803x PHY driver"); +MODULE_AUTHOR("Matus Ujhelyi"); +MODULE_LICENSE("GPL"); + +static void at803x_set_wol_mac_addr(struct phy_device *phydev) +{ +	struct net_device *ndev = phydev->attached_dev; +	const u8 *mac; +	unsigned int i, offsets[] = { +		AT803X_LOC_MAC_ADDR_32_47_OFFSET, +		AT803X_LOC_MAC_ADDR_16_31_OFFSET, +		AT803X_LOC_MAC_ADDR_0_15_OFFSET, +	}; + +	if (!ndev) +		return; + +	mac = (const u8 *) ndev->dev_addr; + +	if (!is_valid_ether_addr(mac)) +		return; + +	for (i = 0; i < 3; i++) { +		phy_write(phydev, AT803X_MMD_ACCESS_CONTROL, +				  AT803X_DEVICE_ADDR); +		phy_write(phydev, AT803X_MMD_ACCESS_CONTROL_DATA, +				  offsets[i]); +		phy_write(phydev, AT803X_MMD_ACCESS_CONTROL, +				  AT803X_FUNC_DATA); +		phy_write(phydev, AT803X_MMD_ACCESS_CONTROL_DATA, +				  mac[(i * 2) + 1] | (mac[(i * 2)] << 8)); +	} +} + +static int at803x_config_init(struct phy_device *phydev) +{ +	int val; +	u32 features; +	int status; + +	features = SUPPORTED_TP | SUPPORTED_MII | SUPPORTED_AUI | +		   SUPPORTED_FIBRE | SUPPORTED_BNC; + +	val = phy_read(phydev, MII_BMSR); +	if (val < 0) +		return val; + +	if (val & BMSR_ANEGCAPABLE) +		features |= SUPPORTED_Autoneg; +	if (val & BMSR_100FULL) +		features |= SUPPORTED_100baseT_Full; +	if (val & BMSR_100HALF) +		features |= SUPPORTED_100baseT_Half; +	if (val & BMSR_10FULL) +		features |= SUPPORTED_10baseT_Full; +	if (val & BMSR_10HALF) +		features |= SUPPORTED_10baseT_Half; + +	if (val & BMSR_ESTATEN) { +		val = phy_read(phydev, MII_ESTATUS); +		if (val < 0) +			return val; + +		if (val & ESTATUS_1000_TFULL) +			features |= SUPPORTED_1000baseT_Full; +		if (val & ESTATUS_1000_THALF) +			features |= SUPPORTED_1000baseT_Half; +	} + +	phydev->supported = features; +	phydev->advertising = features; + +	/* enable WOL */ +	at803x_set_wol_mac_addr(phydev); +	status = phy_write(phydev, AT803X_INTR_ENABLE, AT803X_WOL_ENABLE); +	status = phy_read(phydev, AT803X_INTR_STATUS); + +	return 0; +} + +/* ATHEROS 8035 */ +static struct phy_driver at8035_driver = { +	.phy_id		= 0x004dd072, +	.name		= "Atheros 8035 ethernet", +	.phy_id_mask	= 0xffffffef, +	.config_init	= at803x_config_init, +	.features	= PHY_GBIT_FEATURES, +	.flags		= PHY_HAS_INTERRUPT, +	.config_aneg	= &genphy_config_aneg, +	.read_status	= &genphy_read_status, +	.driver		= { +		.owner = THIS_MODULE, +	}, +}; + +/* ATHEROS 8030 */ +static struct phy_driver at8030_driver = { +	.phy_id		= 0x004dd076, +	.name		= "Atheros 8030 ethernet", +	.phy_id_mask	= 0xffffffef, +	.config_init	= at803x_config_init, +	.features	= PHY_GBIT_FEATURES, +	.flags		= PHY_HAS_INTERRUPT, +	.config_aneg	= &genphy_config_aneg, +	.read_status	= &genphy_read_status, +	.driver		= { +		.owner = THIS_MODULE, +	}, +}; + +static int __init atheros_init(void) +{ +	int ret; + +	ret = phy_driver_register(&at8035_driver); +	if (ret) +		goto err1; + +	ret = phy_driver_register(&at8030_driver); +	if (ret) +		goto err2; + +	return 0; + +err2: +	phy_driver_unregister(&at8035_driver); +err1: +	return ret; +} + +static void __exit atheros_exit(void) +{ +	phy_driver_unregister(&at8035_driver); +	phy_driver_unregister(&at8030_driver); +} + +module_init(atheros_init); +module_exit(atheros_exit); + +static struct mdio_device_id __maybe_unused atheros_tbl[] = { +	{ 0x004dd076, 0xffffffef }, +	{ 0x004dd072, 0xffffffef }, +	{ } +}; + +MODULE_DEVICE_TABLE(mdio, atheros_tbl); diff --git a/drivers/net/phy/mdio-bitbang.c b/drivers/net/phy/mdio-bitbang.c index daec9b05d16..6428fcbbdd4 100644 --- a/drivers/net/phy/mdio-bitbang.c +++ b/drivers/net/phy/mdio-bitbang.c @@ -234,6 +234,7 @@ void free_mdio_bitbang(struct mii_bus *bus)  	struct mdiobb_ctrl *ctrl = bus->priv;  	module_put(ctrl->ops->owner); +	mdiobus_unregister(bus);  	mdiobus_free(bus);  }  EXPORT_SYMBOL(free_mdio_bitbang); diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index a03de719704..d0129827602 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -592,6 +592,32 @@ static const struct usb_device_id	products [] = {  	.driver_info		= 0,  }, +/* Novatel USB551L and MC551 - handled by qmi_wwan */ +{ +	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR +		 | USB_DEVICE_ID_MATCH_PRODUCT +		 | USB_DEVICE_ID_MATCH_INT_INFO, +	.idVendor               = NOVATEL_VENDOR_ID, +	.idProduct		= 0xB001, +	.bInterfaceClass	= USB_CLASS_COMM, +	.bInterfaceSubClass	= USB_CDC_SUBCLASS_ETHERNET, +	.bInterfaceProtocol	= USB_CDC_PROTO_NONE, +	.driver_info = 0, +}, + +/* Novatel E362 - handled by qmi_wwan */ +{ +	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR +		 | USB_DEVICE_ID_MATCH_PRODUCT +		 | USB_DEVICE_ID_MATCH_INT_INFO, +	.idVendor               = NOVATEL_VENDOR_ID, +	.idProduct		= 0x9010, +	.bInterfaceClass	= USB_CLASS_COMM, +	.bInterfaceSubClass	= USB_CDC_SUBCLASS_ETHERNET, +	.bInterfaceProtocol	= USB_CDC_PROTO_NONE, +	.driver_info = 0, +}, +  /*   * WHITELIST!!!   * @@ -604,21 +630,6 @@ static const struct usb_device_id	products [] = {   * because of bugs/quirks in a given product (like Zaurus, above).   */  { -	/* Novatel USB551L */ -	/* This match must come *before* the generic CDC-ETHER match so that -	 * we get FLAG_WWAN set on the device, since it's descriptors are -	 * generic CDC-ETHER. -	 */ -	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR -		 | USB_DEVICE_ID_MATCH_PRODUCT -		 | USB_DEVICE_ID_MATCH_INT_INFO, -	.idVendor               = NOVATEL_VENDOR_ID, -	.idProduct		= 0xB001, -	.bInterfaceClass	= USB_CLASS_COMM, -	.bInterfaceSubClass	= USB_CDC_SUBCLASS_ETHERNET, -	.bInterfaceProtocol	= USB_CDC_PROTO_NONE, -	.driver_info = (unsigned long)&wwan_info, -}, {  	/* ZTE (Vodafone) K3805-Z */  	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR  		 | USB_DEVICE_ID_MATCH_PRODUCT diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index a28a983d465..534d8becbbd 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c @@ -62,6 +62,7 @@  #define USB_PRODUCT_IPAD 0x129a  #define USB_PRODUCT_IPHONE_4_VZW 0x129c  #define USB_PRODUCT_IPHONE_4S	0x12a0 +#define USB_PRODUCT_IPHONE_5	0x12a8  #define IPHETH_USBINTF_CLASS    255  #define IPHETH_USBINTF_SUBCLASS 253 @@ -113,6 +114,10 @@ static struct usb_device_id ipheth_table[] = {  		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S,  		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,  		IPHETH_USBINTF_PROTO) }, +	{ USB_DEVICE_AND_INTERFACE_INFO( +		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_5, +		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, +		IPHETH_USBINTF_PROTO) },  	{ }  };  MODULE_DEVICE_TABLE(usb, ipheth_table); diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 6883c371c59..3b566fa0f8e 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -369,18 +369,73 @@ static const struct usb_device_id products[] = {  		USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff),  		.driver_info        = (unsigned long)&qmi_wwan_info,  	}, +	{	/* Novatel USB551L and MC551 */ +		USB_DEVICE_AND_INTERFACE_INFO(0x1410, 0xb001, +		                              USB_CLASS_COMM, +		                              USB_CDC_SUBCLASS_ETHERNET, +		                              USB_CDC_PROTO_NONE), +		.driver_info        = (unsigned long)&qmi_wwan_info, +	}, +	{	/* Novatel E362 */ +		USB_DEVICE_AND_INTERFACE_INFO(0x1410, 0x9010, +		                              USB_CLASS_COMM, +		                              USB_CDC_SUBCLASS_ETHERNET, +		                              USB_CDC_PROTO_NONE), +		.driver_info        = (unsigned long)&qmi_wwan_info, +	},  	/* 3. Combined interface devices matching on interface number */ +	{QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0017, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x0021, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0025, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0031, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0042, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0049, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0052, 4)},  	{QMI_FIXED_INTF(0x19d2, 0x0055, 1)},	/* ZTE (Vodafone) K3520-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x0058, 4)},  	{QMI_FIXED_INTF(0x19d2, 0x0063, 4)},	/* ZTE (Vodafone) K3565-Z */  	{QMI_FIXED_INTF(0x19d2, 0x0104, 4)},	/* ZTE (Vodafone) K4505-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x0113, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0118, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0121, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0123, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0124, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0125, 6)}, +	{QMI_FIXED_INTF(0x19d2, 0x0126, 5)}, +	{QMI_FIXED_INTF(0x19d2, 0x0130, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0133, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x0141, 5)},  	{QMI_FIXED_INTF(0x19d2, 0x0157, 5)},	/* ZTE MF683 */ +	{QMI_FIXED_INTF(0x19d2, 0x0158, 3)},  	{QMI_FIXED_INTF(0x19d2, 0x0167, 4)},	/* ZTE MF820D */ +	{QMI_FIXED_INTF(0x19d2, 0x0168, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x0176, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x0178, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x0191, 4)},	/* ZTE EuFi890 */ +	{QMI_FIXED_INTF(0x19d2, 0x0199, 1)},	/* ZTE MF820S */ +	{QMI_FIXED_INTF(0x19d2, 0x0200, 1)}, +	{QMI_FIXED_INTF(0x19d2, 0x0257, 3)},	/* ZTE MF821 */  	{QMI_FIXED_INTF(0x19d2, 0x0326, 4)},	/* ZTE MF821D */  	{QMI_FIXED_INTF(0x19d2, 0x1008, 4)},	/* ZTE (Vodafone) K3570-Z */  	{QMI_FIXED_INTF(0x19d2, 0x1010, 4)},	/* ZTE (Vodafone) K3571-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x1012, 4)},  	{QMI_FIXED_INTF(0x19d2, 0x1018, 3)},	/* ZTE (Vodafone) K5006-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x1021, 2)}, +	{QMI_FIXED_INTF(0x19d2, 0x1245, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1247, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1252, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1254, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1255, 3)}, +	{QMI_FIXED_INTF(0x19d2, 0x1255, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1256, 4)}, +	{QMI_FIXED_INTF(0x19d2, 0x1401, 2)},  	{QMI_FIXED_INTF(0x19d2, 0x1402, 2)},	/* ZTE MF60 */ +	{QMI_FIXED_INTF(0x19d2, 0x1424, 2)}, +	{QMI_FIXED_INTF(0x19d2, 0x1425, 2)}, +	{QMI_FIXED_INTF(0x19d2, 0x1426, 2)},	/* ZTE MF91 */  	{QMI_FIXED_INTF(0x19d2, 0x2002, 4)},	/* ZTE (Vodafone) K3765-Z */  	{QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)},    /* Sierra Wireless MC7700 */  	{QMI_FIXED_INTF(0x114f, 0x68a2, 8)},    /* Sierra Wireless MC7750 */ diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index f9819d10b1f..cb04f900cc4 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -1158,6 +1158,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,  		usb_anchor_urb(urb, &dev->deferred);  		/* no use to process more packets */  		netif_stop_queue(net); +		usb_put_urb(urb);  		spin_unlock_irqrestore(&dev->txq.lock, flags);  		netdev_dbg(dev->net, "Delaying transmission for resumption\n");  		goto deferred; @@ -1310,6 +1311,8 @@ void usbnet_disconnect (struct usb_interface *intf)  	cancel_work_sync(&dev->kevent); +	usb_scuttle_anchored_urbs(&dev->deferred); +  	if (dev->driver_info->unbind)  		dev->driver_info->unbind (dev, intf); diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index ce9d4f2c977..0ae1bcc6da7 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -744,28 +744,43 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx,  	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {  		const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i]; +		u32 buf_size; -		tbi = tq->buf_info + tq->tx_ring.next2fill; -		tbi->map_type = VMXNET3_MAP_PAGE; -		tbi->dma_addr = skb_frag_dma_map(&adapter->pdev->dev, frag, -						 0, skb_frag_size(frag), -						 DMA_TO_DEVICE); +		buf_offset = 0; +		len = skb_frag_size(frag); +		while (len) { +			tbi = tq->buf_info + tq->tx_ring.next2fill; +			if (len < VMXNET3_MAX_TX_BUF_SIZE) { +				buf_size = len; +				dw2 |= len; +			} else { +				buf_size = VMXNET3_MAX_TX_BUF_SIZE; +				/* spec says that for TxDesc.len, 0 == 2^14 */ +			} +			tbi->map_type = VMXNET3_MAP_PAGE; +			tbi->dma_addr = skb_frag_dma_map(&adapter->pdev->dev, frag, +							 buf_offset, buf_size, +							 DMA_TO_DEVICE); -		tbi->len = skb_frag_size(frag); +			tbi->len = buf_size; -		gdesc = tq->tx_ring.base + tq->tx_ring.next2fill; -		BUG_ON(gdesc->txd.gen == tq->tx_ring.gen); +			gdesc = tq->tx_ring.base + tq->tx_ring.next2fill; +			BUG_ON(gdesc->txd.gen == tq->tx_ring.gen); -		gdesc->txd.addr = cpu_to_le64(tbi->dma_addr); -		gdesc->dword[2] = cpu_to_le32(dw2 | skb_frag_size(frag)); -		gdesc->dword[3] = 0; +			gdesc->txd.addr = cpu_to_le64(tbi->dma_addr); +			gdesc->dword[2] = cpu_to_le32(dw2); +			gdesc->dword[3] = 0; -		dev_dbg(&adapter->netdev->dev, -			"txd[%u]: 0x%llu %u %u\n", -			tq->tx_ring.next2fill, le64_to_cpu(gdesc->txd.addr), -			le32_to_cpu(gdesc->dword[2]), gdesc->dword[3]); -		vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); -		dw2 = tq->tx_ring.gen << VMXNET3_TXD_GEN_SHIFT; +			dev_dbg(&adapter->netdev->dev, +				"txd[%u]: 0x%llu %u %u\n", +				tq->tx_ring.next2fill, le64_to_cpu(gdesc->txd.addr), +				le32_to_cpu(gdesc->dword[2]), gdesc->dword[3]); +			vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); +			dw2 = tq->tx_ring.gen << VMXNET3_TXD_GEN_SHIFT; + +			len -= buf_size; +			buf_offset += buf_size; +		}  	}  	ctx->eop_txd = gdesc; @@ -886,6 +901,18 @@ vmxnet3_prepare_tso(struct sk_buff *skb,  	}  } +static int txd_estimate(const struct sk_buff *skb) +{ +	int count = VMXNET3_TXD_NEEDED(skb_headlen(skb)) + 1; +	int i; + +	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { +		const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i]; + +		count += VMXNET3_TXD_NEEDED(skb_frag_size(frag)); +	} +	return count; +}  /*   * Transmits a pkt thru a given tq @@ -914,9 +941,7 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,  	union Vmxnet3_GenericDesc tempTxDesc;  #endif -	/* conservatively estimate # of descriptors to use */ -	count = VMXNET3_TXD_NEEDED(skb_headlen(skb)) + -		skb_shinfo(skb)->nr_frags + 1; +	count = txd_estimate(skb);  	ctx.ipv4 = (vlan_get_protocol(skb) == cpu_to_be16(ETH_P_IP)); diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 607976c0016..7b4adde93c0 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -816,7 +816,7 @@ static void vxlan_cleanup(unsigned long arg)  				= container_of(p, struct vxlan_fdb, hlist);  			unsigned long timeout; -			if (f->state == NUD_PERMANENT) +			if (f->state & NUD_PERMANENT)  				continue;  			timeout = f->used + vxlan->age_interval * HZ; diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h index 89bf94d4d8a..6f7cf49eff4 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h @@ -534,107 +534,107 @@ static const u32 ar9300_2p2_baseband_core[][2] = {  static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = {  	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ -	{0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, -	{0x0000a2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, -	{0x0000a2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, +	{0x0000a2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, +	{0x0000a2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, +	{0x0000a2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800},  	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},  	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},  	{0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},  	{0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, -	{0x0000a510, 0x15000028, 0x15000028, 0x0f000202, 0x0f000202}, -	{0x0000a514, 0x1b00002b, 0x1b00002b, 0x12000400, 0x12000400}, -	{0x0000a518, 0x1f020028, 0x1f020028, 0x16000402, 0x16000402}, -	{0x0000a51c, 0x2502002b, 0x2502002b, 0x19000404, 0x19000404}, -	{0x0000a520, 0x2a04002a, 0x2a04002a, 0x1c000603, 0x1c000603}, -	{0x0000a524, 0x2e06002a, 0x2e06002a, 0x21000a02, 0x21000a02}, -	{0x0000a528, 0x3302202d, 0x3302202d, 0x25000a04, 0x25000a04}, -	{0x0000a52c, 0x3804202c, 0x3804202c, 0x28000a20, 0x28000a20}, -	{0x0000a530, 0x3c06202c, 0x3c06202c, 0x2c000e20, 0x2c000e20}, -	{0x0000a534, 0x4108202d, 0x4108202d, 0x30000e22, 0x30000e22}, -	{0x0000a538, 0x4506402d, 0x4506402d, 0x34000e24, 0x34000e24}, -	{0x0000a53c, 0x4906222d, 0x4906222d, 0x38001640, 0x38001640}, -	{0x0000a540, 0x4d062231, 0x4d062231, 0x3c001660, 0x3c001660}, -	{0x0000a544, 0x50082231, 0x50082231, 0x3f001861, 0x3f001861}, -	{0x0000a548, 0x5608422e, 0x5608422e, 0x43001a81, 0x43001a81}, -	{0x0000a54c, 0x5a08442e, 0x5a08442e, 0x47001a83, 0x47001a83}, -	{0x0000a550, 0x5e0a4431, 0x5e0a4431, 0x4a001c84, 0x4a001c84}, -	{0x0000a554, 0x640a4432, 0x640a4432, 0x4e001ce3, 0x4e001ce3}, -	{0x0000a558, 0x680a4434, 0x680a4434, 0x52001ce5, 0x52001ce5}, -	{0x0000a55c, 0x6c0a6434, 0x6c0a6434, 0x56001ce9, 0x56001ce9}, -	{0x0000a560, 0x6f0a6633, 0x6f0a6633, 0x5a001ceb, 0x5a001ceb}, -	{0x0000a564, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, -	{0x0000a568, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, -	{0x0000a56c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, -	{0x0000a570, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, -	{0x0000a574, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, -	{0x0000a578, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, -	{0x0000a57c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, +	{0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202}, +	{0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400}, +	{0x0000a518, 0x21002220, 0x21002220, 0x16000402, 0x16000402}, +	{0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404}, +	{0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603}, +	{0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02}, +	{0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04}, +	{0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20}, +	{0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20}, +	{0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22}, +	{0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24}, +	{0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640}, +	{0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660}, +	{0x0000a544, 0x52022470, 0x52022470, 0x3f001861, 0x3f001861}, +	{0x0000a548, 0x55022490, 0x55022490, 0x43001a81, 0x43001a81}, +	{0x0000a54c, 0x59022492, 0x59022492, 0x47001a83, 0x47001a83}, +	{0x0000a550, 0x5d022692, 0x5d022692, 0x4a001c84, 0x4a001c84}, +	{0x0000a554, 0x61022892, 0x61022892, 0x4e001ce3, 0x4e001ce3}, +	{0x0000a558, 0x65024890, 0x65024890, 0x52001ce5, 0x52001ce5}, +	{0x0000a55c, 0x69024892, 0x69024892, 0x56001ce9, 0x56001ce9}, +	{0x0000a560, 0x6e024c92, 0x6e024c92, 0x5a001ceb, 0x5a001ceb}, +	{0x0000a564, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, +	{0x0000a568, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, +	{0x0000a56c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, +	{0x0000a570, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, +	{0x0000a574, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, +	{0x0000a578, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, +	{0x0000a57c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec},  	{0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},  	{0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},  	{0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004},  	{0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, -	{0x0000a590, 0x15800028, 0x15800028, 0x0f800202, 0x0f800202}, -	{0x0000a594, 0x1b80002b, 0x1b80002b, 0x12800400, 0x12800400}, -	{0x0000a598, 0x1f820028, 0x1f820028, 0x16800402, 0x16800402}, -	{0x0000a59c, 0x2582002b, 0x2582002b, 0x19800404, 0x19800404}, -	{0x0000a5a0, 0x2a84002a, 0x2a84002a, 0x1c800603, 0x1c800603}, -	{0x0000a5a4, 0x2e86002a, 0x2e86002a, 0x21800a02, 0x21800a02}, -	{0x0000a5a8, 0x3382202d, 0x3382202d, 0x25800a04, 0x25800a04}, -	{0x0000a5ac, 0x3884202c, 0x3884202c, 0x28800a20, 0x28800a20}, -	{0x0000a5b0, 0x3c86202c, 0x3c86202c, 0x2c800e20, 0x2c800e20}, -	{0x0000a5b4, 0x4188202d, 0x4188202d, 0x30800e22, 0x30800e22}, -	{0x0000a5b8, 0x4586402d, 0x4586402d, 0x34800e24, 0x34800e24}, -	{0x0000a5bc, 0x4986222d, 0x4986222d, 0x38801640, 0x38801640}, -	{0x0000a5c0, 0x4d862231, 0x4d862231, 0x3c801660, 0x3c801660}, -	{0x0000a5c4, 0x50882231, 0x50882231, 0x3f801861, 0x3f801861}, -	{0x0000a5c8, 0x5688422e, 0x5688422e, 0x43801a81, 0x43801a81}, -	{0x0000a5cc, 0x5a88442e, 0x5a88442e, 0x47801a83, 0x47801a83}, -	{0x0000a5d0, 0x5e8a4431, 0x5e8a4431, 0x4a801c84, 0x4a801c84}, -	{0x0000a5d4, 0x648a4432, 0x648a4432, 0x4e801ce3, 0x4e801ce3}, -	{0x0000a5d8, 0x688a4434, 0x688a4434, 0x52801ce5, 0x52801ce5}, -	{0x0000a5dc, 0x6c8a6434, 0x6c8a6434, 0x56801ce9, 0x56801ce9}, -	{0x0000a5e0, 0x6f8a6633, 0x6f8a6633, 0x5a801ceb, 0x5a801ceb}, -	{0x0000a5e4, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, -	{0x0000a5e8, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, -	{0x0000a5ec, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, -	{0x0000a5f0, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, -	{0x0000a5f4, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, -	{0x0000a5f8, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, -	{0x0000a5fc, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, +	{0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202}, +	{0x0000a594, 0x1c800223, 0x1c800223, 0x12800400, 0x12800400}, +	{0x0000a598, 0x21802220, 0x21802220, 0x16800402, 0x16800402}, +	{0x0000a59c, 0x27802223, 0x27802223, 0x19800404, 0x19800404}, +	{0x0000a5a0, 0x2b822220, 0x2b822220, 0x1c800603, 0x1c800603}, +	{0x0000a5a4, 0x2f822222, 0x2f822222, 0x21800a02, 0x21800a02}, +	{0x0000a5a8, 0x34822225, 0x34822225, 0x25800a04, 0x25800a04}, +	{0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x28800a20, 0x28800a20}, +	{0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2c800e20, 0x2c800e20}, +	{0x0000a5b4, 0x4282242a, 0x4282242a, 0x30800e22, 0x30800e22}, +	{0x0000a5b8, 0x4782244a, 0x4782244a, 0x34800e24, 0x34800e24}, +	{0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x38801640, 0x38801640}, +	{0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x3c801660, 0x3c801660}, +	{0x0000a5c4, 0x52822470, 0x52822470, 0x3f801861, 0x3f801861}, +	{0x0000a5c8, 0x55822490, 0x55822490, 0x43801a81, 0x43801a81}, +	{0x0000a5cc, 0x59822492, 0x59822492, 0x47801a83, 0x47801a83}, +	{0x0000a5d0, 0x5d822692, 0x5d822692, 0x4a801c84, 0x4a801c84}, +	{0x0000a5d4, 0x61822892, 0x61822892, 0x4e801ce3, 0x4e801ce3}, +	{0x0000a5d8, 0x65824890, 0x65824890, 0x52801ce5, 0x52801ce5}, +	{0x0000a5dc, 0x69824892, 0x69824892, 0x56801ce9, 0x56801ce9}, +	{0x0000a5e0, 0x6e824c92, 0x6e824c92, 0x5a801ceb, 0x5a801ceb}, +	{0x0000a5e4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, +	{0x0000a5e8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, +	{0x0000a5ec, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, +	{0x0000a5f0, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, +	{0x0000a5f4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, +	{0x0000a5f8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, +	{0x0000a5fc, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec},  	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},  	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, -	{0x0000a608, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, -	{0x0000a60c, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, -	{0x0000a610, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, -	{0x0000a614, 0x01804601, 0x01804601, 0x01404000, 0x01404000}, -	{0x0000a618, 0x01804601, 0x01804601, 0x01404501, 0x01404501}, -	{0x0000a61c, 0x01804601, 0x01804601, 0x02008501, 0x02008501}, -	{0x0000a620, 0x03408d02, 0x03408d02, 0x0280ca03, 0x0280ca03}, -	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04}, -	{0x0000a628, 0x03410d04, 0x03410d04, 0x04014c04, 0x04014c04}, -	{0x0000a62c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, -	{0x0000a630, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, -	{0x0000a634, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, -	{0x0000a638, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, -	{0x0000a63c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, -	{0x0000b2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, -	{0x0000b2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, -	{0x0000b2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, +	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, +	{0x0000a614, 0x02004000, 0x02004000, 0x01404000, 0x01404000}, +	{0x0000a618, 0x02004801, 0x02004801, 0x01404501, 0x01404501}, +	{0x0000a61c, 0x02808a02, 0x02808a02, 0x02008501, 0x02008501}, +	{0x0000a620, 0x0380ce03, 0x0380ce03, 0x0280ca03, 0x0280ca03}, +	{0x0000a624, 0x04411104, 0x04411104, 0x03010c04, 0x03010c04}, +	{0x0000a628, 0x04411104, 0x04411104, 0x04014c04, 0x04014c04}, +	{0x0000a62c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, +	{0x0000a630, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, +	{0x0000a634, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, +	{0x0000a638, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, +	{0x0000a63c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, +	{0x0000b2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, +	{0x0000b2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, +	{0x0000b2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800},  	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, -	{0x0000c2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, -	{0x0000c2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, -	{0x0000c2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, +	{0x0000c2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, +	{0x0000c2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, +	{0x0000c2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800},  	{0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},  	{0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, -	{0x00016048, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, +	{0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001},  	{0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},  	{0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, -	{0x00016448, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, +	{0x00016448, 0x66480001, 0x66480001, 0x66480001, 0x66480001},  	{0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},  	{0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, -	{0x00016848, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, +	{0x00016848, 0x66480001, 0x66480001, 0x66480001, 0x66480001},  	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},  }; diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index 924c4616c3d..f5dda84176c 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c @@ -38,6 +38,7 @@ static struct usb_device_id ath9k_hif_usb_ids[] = {  	{ USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */  	{ USB_DEVICE(0x040D, 0x3801) }, /* VIA */  	{ USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */ +	{ USB_DEVICE(0x0cf3, 0xb002) }, /* Ubiquiti WifiStation */  	{ USB_DEVICE(0x057c, 0x8403) }, /* AVM FRITZ!WLAN 11N v2 USB */  	{ USB_DEVICE(0x0cf3, 0x7015), diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 378bd70256b..741918a2027 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -312,6 +312,7 @@ static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc)  	}  	bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list); +	bf->bf_next = NULL;  	list_del(&bf->list);  	spin_unlock_bh(&sc->tx.txbuflock); @@ -393,7 +394,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  	u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0, seq_first;  	u32 ba[WME_BA_BMP_SIZE >> 5];  	int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; -	bool rc_update = true; +	bool rc_update = true, isba;  	struct ieee80211_tx_rate rates[4];  	struct ath_frame_info *fi;  	int nframes; @@ -437,13 +438,17 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  	tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;  	tid = ATH_AN_2_TID(an, tidno);  	seq_first = tid->seq_start; +	isba = ts->ts_flags & ATH9K_TX_BA;  	/*  	 * The hardware occasionally sends a tx status for the wrong TID.  	 * In this case, the BA status cannot be considered valid and all  	 * subframes need to be retransmitted +	 * +	 * Only BlockAcks have a TID and therefore normal Acks cannot be +	 * checked  	 */ -	if (tidno != ts->tid) +	if (isba && tidno != ts->tid)  		txok = false;  	isaggr = bf_isaggr(bf); @@ -1774,6 +1779,7 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,  	list_add_tail(&bf->list, &bf_head);  	bf->bf_state.bf_type = 0; +	bf->bf_next = NULL;  	bf->bf_lastbf = bf;  	ath_tx_fill_desc(sc, bf, txq, fi->framelen);  	ath_tx_txqaddbuf(sc, txq, &bf_head, false); diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 73730e94e0a..c5a99c8c816 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c @@ -5404,6 +5404,8 @@ static void b43_bcma_remove(struct bcma_device *core)  	cancel_work_sync(&wldev->restart_work);  	B43_WARN_ON(!wl); +	if (!wldev->fw.ucode.data) +		return;			/* NULL if firmware never loaded */  	if (wl->current_dev == wldev && wl->hw_registred) {  		b43_leds_stop(wldev);  		ieee80211_unregister_hw(wl->hw); @@ -5478,6 +5480,8 @@ static void b43_ssb_remove(struct ssb_device *sdev)  	cancel_work_sync(&wldev->restart_work);  	B43_WARN_ON(!wl); +	if (!wldev->fw.ucode.data) +		return;			/* NULL if firmware never loaded */  	if (wl->current_dev == wldev && wl->hw_registred) {  		b43_leds_stop(wldev);  		ieee80211_unregister_hw(wl->hw); diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c index a2b4b1e7101..7a6dfdc67b6 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c @@ -1339,7 +1339,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo,  	}  	ret = brcmf_bus_start(dev); -	if (ret == -ENOLINK) { +	if (ret) {  		brcmf_dbg(ERROR, "dongle is not responding\n");  		brcmf_detach(dev);  		goto fail; diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index c1abaa6db59..a6f1e816600 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c @@ -3569,7 +3569,7 @@ brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy,  	if (!request || !request->n_ssids || !request->n_match_sets) {  		WL_ERR("Invalid sched scan req!! n_ssids:%d\n", -		       request->n_ssids); +		       request ? request->n_ssids : 0);  		return -EINVAL;  	} @@ -3972,7 +3972,7 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg,  	u8  *iovar_ie_buf;  	u8  *curr_ie_buf;  	u8  *mgmt_ie_buf = NULL; -	u32 mgmt_ie_buf_len = 0; +	int mgmt_ie_buf_len;  	u32 *mgmt_ie_len = 0;  	u32 del_add_ie_buf_len = 0;  	u32 total_ie_buf_len = 0; @@ -3982,7 +3982,7 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg,  	struct parsed_vndr_ie_info *vndrie_info;  	s32 i;  	u8 *ptr; -	u32 remained_buf_len; +	int remained_buf_len;  	WL_TRACE("bssidx %d, pktflag : 0x%02X\n", bssidx, pktflag);  	iovar_ie_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); @@ -4606,12 +4606,13 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,  	struct brcmf_cfg80211_profile *profile = cfg->profile;  	struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);  	struct wiphy *wiphy = cfg_to_wiphy(cfg); -	struct brcmf_channel_info_le channel_le; -	struct ieee80211_channel *notify_channel; +	struct ieee80211_channel *notify_channel = NULL;  	struct ieee80211_supported_band *band; +	struct brcmf_bss_info_le *bi;  	u32 freq;  	s32 err = 0;  	u32 target_channel; +	u8 *buf;  	WL_TRACE("Enter\n"); @@ -4619,11 +4620,22 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,  	memcpy(profile->bssid, e->addr, ETH_ALEN);  	brcmf_update_bss_info(cfg); -	brcmf_exec_dcmd(ndev, BRCMF_C_GET_CHANNEL, &channel_le, -			sizeof(channel_le)); +	buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL); +	if (buf == NULL) { +		err = -ENOMEM; +		goto done; +	} + +	/* data sent to dongle has to be little endian */ +	*(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX); +	err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_BSS_INFO, buf, WL_BSS_INFO_MAX); + +	if (err) +		goto done; -	target_channel = le32_to_cpu(channel_le.target_channel); -	WL_CONN("Roamed to channel %d\n", target_channel); +	bi = (struct brcmf_bss_info_le *)(buf + 4); +	target_channel = bi->ctl_ch ? bi->ctl_ch : +				      CHSPEC_CHANNEL(le16_to_cpu(bi->chanspec));  	if (target_channel <= CH_MAX_2G_CHANNEL)  		band = wiphy->bands[IEEE80211_BAND_2GHZ]; @@ -4633,6 +4645,8 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,  	freq = ieee80211_channel_to_frequency(target_channel, band->band);  	notify_channel = ieee80211_get_channel(wiphy, freq); +done: +	kfree(buf);  	cfg80211_roamed(ndev, notify_channel, (u8 *)profile->bssid,  			conn_info->req_ie, conn_info->req_ie_len,  			conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL); @@ -5186,41 +5200,6 @@ brcmf_cfg80211_event(struct net_device *ndev,  		schedule_work(&cfg->event_work);  } -static s32 brcmf_dongle_mode(struct net_device *ndev, s32 iftype) -{ -	s32 infra = 0; -	s32 err = 0; - -	switch (iftype) { -	case NL80211_IFTYPE_MONITOR: -	case NL80211_IFTYPE_WDS: -		WL_ERR("type (%d) : currently we do not support this mode\n", -		       iftype); -		err = -EINVAL; -		return err; -	case NL80211_IFTYPE_ADHOC: -		infra = 0; -		break; -	case NL80211_IFTYPE_STATION: -		infra = 1; -		break; -	case NL80211_IFTYPE_AP: -		infra = 1; -		break; -	default: -		err = -EINVAL; -		WL_ERR("invalid type (%d)\n", iftype); -		return err; -	} -	err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_INFRA, &infra); -	if (err) { -		WL_ERR("WLC_SET_INFRA error (%d)\n", err); -		return err; -	} - -	return 0; -} -  static s32 brcmf_dongle_eventmsg(struct net_device *ndev)  {  	/* Room for "event_msgs" + '\0' + bitvec */ @@ -5439,7 +5418,8 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)  				WL_BEACON_TIMEOUT);  	if (err)  		goto default_conf_out; -	err = brcmf_dongle_mode(ndev, wdev->iftype); +	err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype, +					  NULL, NULL);  	if (err && err != -EINPROGRESS)  		goto default_conf_out;  	err = brcmf_dongle_probecap(cfg); diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 935120fc8c9..768bf612533 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c @@ -10472,7 +10472,7 @@ static void ipw_handle_promiscuous_tx(struct ipw_priv *priv,  		} else  			len = src->len; -		dst = alloc_skb(len + sizeof(*rt_hdr), GFP_ATOMIC); +		dst = alloc_skb(len + sizeof(*rt_hdr) + sizeof(u16)*2, GFP_ATOMIC);  		if (!dst)  			continue; diff --git a/drivers/net/wireless/iwlwifi/dvm/devices.c b/drivers/net/wireless/iwlwifi/dvm/devices.c index 349c205d5f6..da586206419 100644 --- a/drivers/net/wireless/iwlwifi/dvm/devices.c +++ b/drivers/net/wireless/iwlwifi/dvm/devices.c @@ -518,7 +518,7 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,  	 * See iwlagn_mac_channel_switch.  	 */  	struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; -	struct iwl6000_channel_switch_cmd cmd; +	struct iwl6000_channel_switch_cmd *cmd;  	u32 switch_time_in_usec, ucode_switch_time;  	u16 ch;  	u32 tsf_low; @@ -527,18 +527,25 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,  	struct ieee80211_vif *vif = ctx->vif;  	struct iwl_host_cmd hcmd = {  		.id = REPLY_CHANNEL_SWITCH, -		.len = { sizeof(cmd), }, +		.len = { sizeof(*cmd), },  		.flags = CMD_SYNC, -		.data = { &cmd, }, +		.dataflags[0] = IWL_HCMD_DFL_NOCOPY,  	}; +	int err; -	cmd.band = priv->band == IEEE80211_BAND_2GHZ; +	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); +	if (!cmd) +		return -ENOMEM; + +	hcmd.data[0] = cmd; + +	cmd->band = priv->band == IEEE80211_BAND_2GHZ;  	ch = ch_switch->channel->hw_value;  	IWL_DEBUG_11H(priv, "channel switch from %u to %u\n",  		      ctx->active.channel, ch); -	cmd.channel = cpu_to_le16(ch); -	cmd.rxon_flags = ctx->staging.flags; -	cmd.rxon_filter_flags = ctx->staging.filter_flags; +	cmd->channel = cpu_to_le16(ch); +	cmd->rxon_flags = ctx->staging.flags; +	cmd->rxon_filter_flags = ctx->staging.filter_flags;  	switch_count = ch_switch->count;  	tsf_low = ch_switch->timestamp & 0x0ffffffff;  	/* @@ -554,23 +561,25 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,  			switch_count = 0;  	}  	if (switch_count <= 1) -		cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); +		cmd->switch_time = cpu_to_le32(priv->ucode_beacon_time);  	else {  		switch_time_in_usec =  			vif->bss_conf.beacon_int * switch_count * TIME_UNIT;  		ucode_switch_time = iwl_usecs_to_beacons(priv,  							 switch_time_in_usec,  							 beacon_interval); -		cmd.switch_time = iwl_add_beacon_time(priv, -						      priv->ucode_beacon_time, -						      ucode_switch_time, -						      beacon_interval); +		cmd->switch_time = iwl_add_beacon_time(priv, +						       priv->ucode_beacon_time, +						       ucode_switch_time, +						       beacon_interval);  	}  	IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", -		      cmd.switch_time); -	cmd.expect_beacon = ch_switch->channel->flags & IEEE80211_CHAN_RADAR; +		      cmd->switch_time); +	cmd->expect_beacon = ch_switch->channel->flags & IEEE80211_CHAN_RADAR; -	return iwl_dvm_send_cmd(priv, &hcmd); +	err = iwl_dvm_send_cmd(priv, &hcmd); +	kfree(cmd); +	return err;  }  struct iwl_lib_ops iwl6000_lib = { diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index 0679458a1ba..780d3e16829 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c @@ -1825,8 +1825,6 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy,  		return -EBUSY;  	} -	priv->scan_request = request; -  	priv->user_scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg),  				      GFP_KERNEL);  	if (!priv->user_scan_cfg) { @@ -1834,6 +1832,8 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy,  		return -ENOMEM;  	} +	priv->scan_request = request; +  	priv->user_scan_cfg->num_ssids = request->n_ssids;  	priv->user_scan_cfg->ssid_list = request->ssids; @@ -1870,6 +1870,9 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy,  	ret = mwifiex_scan_networks(priv, priv->user_scan_cfg);  	if (ret) {  		dev_err(priv->adapter->dev, "scan failed: %d\n", ret); +		priv->scan_request = NULL; +		kfree(priv->user_scan_cfg); +		priv->user_scan_cfg = NULL;  		return ret;  	} diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c index 00b658d3b6e..9171aaedbcc 100644 --- a/drivers/net/wireless/mwifiex/scan.c +++ b/drivers/net/wireless/mwifiex/scan.c @@ -1843,21 +1843,18 @@ static int mwifiex_scan_specific_ssid(struct mwifiex_private *priv,  				      struct cfg80211_ssid *req_ssid)  {  	struct mwifiex_adapter *adapter = priv->adapter; -	int ret = 0; +	int ret;  	struct mwifiex_user_scan_cfg *scan_cfg; -	if (!req_ssid) -		return -1; -  	if (adapter->scan_processing) { -		dev_dbg(adapter->dev, "cmd: Scan already in process...\n"); -		return ret; +		dev_err(adapter->dev, "cmd: Scan already in process...\n"); +		return -EBUSY;  	}  	if (priv->scan_block) { -		dev_dbg(adapter->dev, +		dev_err(adapter->dev,  			"cmd: Scan is blocked during association...\n"); -		return ret; +		return -EBUSY;  	}  	scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg), GFP_KERNEL); diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index a12e84f892b..6b2e1e431dd 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c @@ -1988,6 +1988,7 @@ static struct usb_driver rt2500usb_driver = {  	.disconnect	= rt2x00usb_disconnect,  	.suspend	= rt2x00usb_suspend,  	.resume		= rt2x00usb_resume, +	.reset_resume	= rt2x00usb_resume,  	.disable_hub_initiated_lpm = 1,  }; diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 01dc8891070..59474ae0aec 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c @@ -2449,7 +2449,7 @@ static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev)  	/*  	 * Check if temperature compensation is supported.  	 */ -	if (tssi_bounds[4] == 0xff) +	if (tssi_bounds[4] == 0xff || step == 0xff)  		return 0;  	/* diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index c9e9370eb78..3b8fb5a603f 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c @@ -1282,6 +1282,7 @@ static struct usb_driver rt2800usb_driver = {  	.disconnect	= rt2x00usb_disconnect,  	.suspend	= rt2x00usb_suspend,  	.resume		= rt2x00usb_resume, +	.reset_resume	= rt2x00usb_resume,  	.disable_hub_initiated_lpm = 1,  }; diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index e5eb43b3eee..24eec66e9fd 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c @@ -2535,6 +2535,7 @@ static struct usb_driver rt73usb_driver = {  	.disconnect	= rt2x00usb_disconnect,  	.suspend	= rt2x00usb_suspend,  	.resume		= rt2x00usb_resume, +	.reset_resume	= rt2x00usb_resume,  	.disable_hub_initiated_lpm = 1,  }; diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 030beb45d8b..e3ea4b34688 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c @@ -673,7 +673,7 @@ static int rtl_usb_start(struct ieee80211_hw *hw)  		set_hal_start(rtlhal);  		/* Start bulk IN */ -		_rtl_usb_receive(hw); +		err = _rtl_usb_receive(hw);  	}  	return err;  |