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

Commit bf091f3f authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller
Browse files

sunvnet: straighten up message event handling logic



The use of gotos for handling the incoming events made this code
harder to read and support than it should be.  This patch straightens
out and clears up the logic.

Signed-off-by: default avatarShannon Nelson <shannon.nelson@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fd263fb6
Loading
Loading
Loading
Loading
+45 −49
Original line number Diff line number Diff line
@@ -738,14 +738,15 @@ static int vnet_event_napi(struct vnet_port *port, int budget)
	struct vio_driver_state *vio = &port->vio;
	int tx_wakeup, err;
	int npkts = 0;
	int event = (port->rx_event & LDC_EVENT_RESET);

ldc_ctrl:
	if (unlikely(event == LDC_EVENT_RESET ||
		     event == LDC_EVENT_UP)) {
		vio_link_state_change(vio, event);
	/* we don't expect any other bits */
	BUG_ON(port->rx_event & ~(LDC_EVENT_DATA_READY |
				  LDC_EVENT_RESET |
				  LDC_EVENT_UP));

		if (event == LDC_EVENT_RESET) {
	/* RESET takes precedent over any other event */
	if (port->rx_event & LDC_EVENT_RESET) {
		vio_link_state_change(vio, LDC_EVENT_RESET);
		vnet_port_reset(port);
		vio_port_up(vio);

@@ -758,21 +759,16 @@ static int vnet_event_napi(struct vnet_port *port, int budget)
		 */
		if (netif_running(dev))
			maybe_tx_wakeup(port);
		}

		port->rx_event = 0;
		return 0;
	}
	/* We may have multiple LDC events in rx_event. Unroll send_events() */
	event = (port->rx_event & LDC_EVENT_UP);
	port->rx_event &= ~(LDC_EVENT_RESET | LDC_EVENT_UP);
	if (event == LDC_EVENT_UP)
		goto ldc_ctrl;
	event = port->rx_event;
	if (!(event & LDC_EVENT_DATA_READY))
		return 0;

	/* we dont expect any other bits than RESET, UP, DATA_READY */
	BUG_ON(event != LDC_EVENT_DATA_READY);
	if (port->rx_event & LDC_EVENT_UP) {
		vio_link_state_change(vio, LDC_EVENT_UP);
		port->rx_event = 0;
		return 0;
	}

	err = 0;
	tx_wakeup = 0;
@@ -795,8 +791,7 @@ static int vnet_event_napi(struct vnet_port *port, int budget)
			pkt->start_idx = vio_dring_next(dr,
							port->napi_stop_idx);
			pkt->end_idx = -1;
			goto napi_resume;
		}
		} else {
			err = ldc_read(vio->lp, &msgbuf, sizeof(msgbuf));
			if (unlikely(err < 0)) {
				if (err == -ECONNRESET)
@@ -813,7 +808,8 @@ static int vnet_event_napi(struct vnet_port *port, int budget)
			err = vio_validate_sid(vio, &msgbuf.tag);
			if (err < 0)
				break;
napi_resume:
		}

		if (likely(msgbuf.tag.type == VIO_TYPE_DATA)) {
			if (msgbuf.tag.stype == VIO_SUBTYPE_INFO) {
				if (!sunvnet_port_is_up_common(port)) {