| .. | .. | 
|---|
| 2310 | 2310 |  | 
|---|
| 2311 | 2311 | /* If there is a GPIO connected to the reset pin, toggle it */ | 
|---|
| 2312 | 2312 | if (gpiod) { | 
|---|
|  | 2313 | +		/* If the switch has just been reset and not yet completed | 
|---|
|  | 2314 | +		 * loading EEPROM, the reset may interrupt the I2C transaction | 
|---|
|  | 2315 | +		 * mid-byte, causing the first EEPROM read after the reset | 
|---|
|  | 2316 | +		 * from the wrong location resulting in the switch booting | 
|---|
|  | 2317 | +		 * to wrong mode and inoperable. | 
|---|
|  | 2318 | +		 */ | 
|---|
|  | 2319 | +		if (chip->info->ops->get_eeprom) | 
|---|
|  | 2320 | +			mv88e6xxx_g2_eeprom_wait(chip); | 
|---|
|  | 2321 | + | 
|---|
| 2313 | 2322 | gpiod_set_value_cansleep(gpiod, 1); | 
|---|
| 2314 | 2323 | usleep_range(10000, 20000); | 
|---|
| 2315 | 2324 | gpiod_set_value_cansleep(gpiod, 0); | 
|---|
| 2316 | 2325 | usleep_range(10000, 20000); | 
|---|
| 2317 | 2326 |  | 
|---|
| 2318 |  | -		mv88e6xxx_g1_wait_eeprom_done(chip); | 
|---|
|  | 2327 | +		if (chip->info->ops->get_eeprom) | 
|---|
|  | 2328 | +			mv88e6xxx_g2_eeprom_wait(chip); | 
|---|
| 2319 | 2329 | } | 
|---|
| 2320 | 2330 | } | 
|---|
| 2321 | 2331 |  | 
|---|
| .. | .. | 
|---|
| 2611 | 2621 | * If this is the upstream port for this switch, enable | 
|---|
| 2612 | 2622 | * forwarding of unknown unicasts and multicasts. | 
|---|
| 2613 | 2623 | */ | 
|---|
| 2614 |  | -	reg = MV88E6XXX_PORT_CTL0_IGMP_MLD_SNOOP | | 
|---|
| 2615 |  | -		MV88E6185_PORT_CTL0_USE_TAG | MV88E6185_PORT_CTL0_USE_IP | | 
|---|
|  | 2624 | +	reg = MV88E6185_PORT_CTL0_USE_TAG | MV88E6185_PORT_CTL0_USE_IP | | 
|---|
| 2616 | 2625 | MV88E6XXX_PORT_CTL0_STATE_FORWARDING; | 
|---|
|  | 2626 | +	/* Forward any IPv4 IGMP or IPv6 MLD frames received | 
|---|
|  | 2627 | +	 * by a USER port to the CPU port to allow snooping. | 
|---|
|  | 2628 | +	 */ | 
|---|
|  | 2629 | +	if (dsa_is_user_port(ds, port)) | 
|---|
|  | 2630 | +		reg |= MV88E6XXX_PORT_CTL0_IGMP_MLD_SNOOP; | 
|---|
|  | 2631 | + | 
|---|
| 2617 | 2632 | err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg); | 
|---|
| 2618 | 2633 | if (err) | 
|---|
| 2619 | 2634 | return err; | 
|---|
| .. | .. | 
|---|
| 2734 | 2749 | return 10240 - VLAN_ETH_HLEN - EDSA_HLEN - ETH_FCS_LEN; | 
|---|
| 2735 | 2750 | else if (chip->info->ops->set_max_frame_size) | 
|---|
| 2736 | 2751 | return 1632 - VLAN_ETH_HLEN - EDSA_HLEN - ETH_FCS_LEN; | 
|---|
| 2737 |  | -	return 1522 - VLAN_ETH_HLEN - EDSA_HLEN - ETH_FCS_LEN; | 
|---|
|  | 2752 | +	return ETH_DATA_LEN; | 
|---|
| 2738 | 2753 | } | 
|---|
| 2739 | 2754 |  | 
|---|
| 2740 | 2755 | static int mv88e6xxx_change_mtu(struct dsa_switch *ds, int port, int new_mtu) | 
|---|
| 2741 | 2756 | { | 
|---|
| 2742 | 2757 | struct mv88e6xxx_chip *chip = ds->priv; | 
|---|
| 2743 | 2758 | int ret = 0; | 
|---|
|  | 2759 | + | 
|---|
|  | 2760 | +	/* For families where we don't know how to alter the MTU, | 
|---|
|  | 2761 | +	 * just accept any value up to ETH_DATA_LEN | 
|---|
|  | 2762 | +	 */ | 
|---|
|  | 2763 | +	if (!chip->info->ops->port_set_jumbo_size && | 
|---|
|  | 2764 | +	    !chip->info->ops->set_max_frame_size) { | 
|---|
|  | 2765 | +		if (new_mtu > ETH_DATA_LEN) | 
|---|
|  | 2766 | +			return -EINVAL; | 
|---|
|  | 2767 | + | 
|---|
|  | 2768 | +		return 0; | 
|---|
|  | 2769 | +	} | 
|---|
| 2744 | 2770 |  | 
|---|
| 2745 | 2771 | if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port)) | 
|---|
| 2746 | 2772 | new_mtu += EDSA_HLEN; | 
|---|
| .. | .. | 
|---|
| 2750 | 2776 | ret = chip->info->ops->port_set_jumbo_size(chip, port, new_mtu); | 
|---|
| 2751 | 2777 | else if (chip->info->ops->set_max_frame_size) | 
|---|
| 2752 | 2778 | ret = chip->info->ops->set_max_frame_size(chip, new_mtu); | 
|---|
| 2753 |  | -	else | 
|---|
| 2754 |  | -		if (new_mtu > 1522) | 
|---|
| 2755 |  | -			ret = -EINVAL; | 
|---|
| 2756 | 2779 | mv88e6xxx_reg_unlock(chip); | 
|---|
| 2757 | 2780 |  | 
|---|
| 2758 | 2781 | return ret; | 
|---|
| .. | .. | 
|---|
| 4169 | 4192 | .set_cpu_port = mv88e6095_g1_set_cpu_port, | 
|---|
| 4170 | 4193 | .set_egress_port = mv88e6095_g1_set_egress_port, | 
|---|
| 4171 | 4194 | .watchdog_ops = &mv88e6390_watchdog_ops, | 
|---|
|  | 4195 | +	.mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu, | 
|---|
| 4172 | 4196 | .reset = mv88e6352_g1_reset, | 
|---|
| 4173 | 4197 | .vtu_getnext = mv88e6185_g1_vtu_getnext, | 
|---|
| 4174 | 4198 | .vtu_loadpurge = mv88e6185_g1_vtu_loadpurge, | 
|---|
| .. | .. | 
|---|
| 5533 | 5557 | goto out; | 
|---|
| 5534 | 5558 | } | 
|---|
| 5535 | 5559 | if (chip->reset) | 
|---|
| 5536 |  | -		usleep_range(1000, 2000); | 
|---|
|  | 5560 | +		usleep_range(10000, 20000); | 
|---|
| 5537 | 5561 |  | 
|---|
| 5538 | 5562 | err = mv88e6xxx_detect(chip); | 
|---|
| 5539 | 5563 | if (err) | 
|---|