Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9aae56e authored by Arvid Brodin's avatar Arvid Brodin Committed by David S. Miller
Browse files

net/hsr: Operstate handling cleanup.

parent abff7162
Loading
Loading
Loading
Loading
+28 −9
Original line number Diff line number Diff line
@@ -46,31 +46,36 @@ static void __hsr_set_operstate(struct net_device *dev, int transition)
	}
}

void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1,
		       struct net_device *slave2)
static void hsr_set_operstate(struct net_device *hsr_dev, bool has_carrier)
{
	if (!is_admin_up(hsr_dev)) {
		__hsr_set_operstate(hsr_dev, IF_OPER_DOWN);
		return;
	}

	if (is_slave_up(slave1) || is_slave_up(slave2))
	if (has_carrier)
		__hsr_set_operstate(hsr_dev, IF_OPER_UP);
	else
		__hsr_set_operstate(hsr_dev, IF_OPER_LOWERLAYERDOWN);
}

void hsr_set_carrier(struct net_device *hsr_dev, struct net_device *slave1,
		     struct net_device *slave2)
static bool hsr_check_carrier(struct hsr_priv *hsr)
{
	if (is_slave_up(slave1) || is_slave_up(slave2))
		netif_carrier_on(hsr_dev);
	bool has_carrier;

	has_carrier = (is_slave_up(hsr->slave[0]) || is_slave_up(hsr->slave[1]));

	if (has_carrier)
		netif_carrier_on(hsr->dev);
	else
		netif_carrier_off(hsr_dev);
		netif_carrier_off(hsr->dev);

	return has_carrier;
}


void hsr_check_announce(struct net_device *hsr_dev, int old_operstate)
static void hsr_check_announce(struct net_device *hsr_dev,
			       unsigned char old_operstate)
{
	struct hsr_priv *hsr;

@@ -89,6 +94,20 @@ void hsr_check_announce(struct net_device *hsr_dev, int old_operstate)
		del_timer(&hsr->announce_timer);
}

void hsr_check_carrier_and_operstate(struct hsr_priv *hsr)
{
	unsigned char old_operstate;
	bool has_carrier;

	/* netif_stacked_transfer_operstate() cannot be used here since
	 * it doesn't set IF_OPER_LOWERLAYERDOWN (?)
	 */
	old_operstate = hsr->dev->operstate;
	has_carrier = hsr_check_carrier(hsr);
	hsr_set_operstate(hsr->dev, has_carrier);
	hsr_check_announce(hsr->dev, old_operstate);
}


int hsr_get_max_mtu(struct hsr_priv *hsr)
{
+1 −5
Original line number Diff line number Diff line
@@ -18,11 +18,7 @@
void hsr_dev_setup(struct net_device *dev);
int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
		     unsigned char multicast_spec);
void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1,
		       struct net_device *slave2);
void hsr_set_carrier(struct net_device *hsr_dev, struct net_device *slave1,
		     struct net_device *slave2);
void hsr_check_announce(struct net_device *hsr_dev, int old_operstate);
void hsr_check_carrier_and_operstate(struct hsr_priv *hsr);
bool is_hsr_master(struct net_device *dev);
int hsr_get_max_mtu(struct hsr_priv *hsr);

+1 −8
Original line number Diff line number Diff line
@@ -91,7 +91,6 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
{
	struct net_device *slave, *other_slave;
	struct hsr_priv *hsr;
	int old_operstate;
	int mtu_max;
	int res;
	struct net_device *dev;
@@ -115,13 +114,7 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
	case NETDEV_UP:		/* Administrative state DOWN */
	case NETDEV_DOWN:	/* Administrative state UP */
	case NETDEV_CHANGE:	/* Link (carrier) state changes */
		old_operstate = hsr->dev->operstate;
		hsr_set_carrier(hsr->dev, slave, other_slave);
		/* netif_stacked_transfer_operstate() cannot be used here since
		 * it doesn't set IF_OPER_LOWERLAYERDOWN (?)
		 */
		hsr_set_operstate(hsr->dev, slave, other_slave);
		hsr_check_announce(hsr->dev, old_operstate);
		hsr_check_carrier_and_operstate(hsr);
		break;
	case NETDEV_CHANGEADDR: