1
0
Fork 0

ivshmem-net: Refactor and comment ivshm_net_state_change

This should make the state transitioning logic clearer. Also avoid the
harmless but redundant netif_carrier_on/ivshm_net_run in RUN state.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
(cherry picked from commit d0791721836578640fb8a1980ce61f1afb90aeb2)
(cherry picked from commit 1ce077a1eabb2897c5f5ee94e83959457dbd2b59)
pull/10/head
Jan Kiszka 2018-03-04 13:50:24 +01:00 committed by Jason Liu
parent e1aa65153f
commit b60b5f88b3
1 changed files with 20 additions and 3 deletions

View File

@ -575,14 +575,21 @@ static void ivshm_net_state_change(struct work_struct *work)
struct net_device *ndev = in->napi.dev;
u32 rstate = readl(&in->ivshm_regs->rstate);
switch (in->lstate) {
case IVSHM_NET_STATE_RESET:
/*
* Wait for the remote to leave READY/RUN before transitioning
* to INIT.
*/
if (rstate < IVSHM_NET_STATE_READY)
ivshm_net_set_state(in, IVSHM_NET_STATE_INIT);
break;
case IVSHM_NET_STATE_INIT:
/*
* Wait for the remote to leave RESET before performing the
* initialization and moving to READY.
*/
if (rstate > IVSHM_NET_STATE_RESET) {
ivshm_net_init_queues(ndev);
ivshm_net_set_state(in, IVSHM_NET_STATE_READY);
@ -594,11 +601,21 @@ static void ivshm_net_state_change(struct work_struct *work)
break;
case IVSHM_NET_STATE_READY:
case IVSHM_NET_STATE_RUN:
/*
* Link is up and we are running once the remote is in READY or
* RUN.
*/
if (rstate >= IVSHM_NET_STATE_READY) {
netif_carrier_on(ndev);
ivshm_net_run(ndev);
} else if (rstate == IVSHM_NET_STATE_RESET) {
break;
}
/* fall through */
case IVSHM_NET_STATE_RUN:
/*
* If the remote goes to RESET, we need to follow immediately.
*/
if (rstate == IVSHM_NET_STATE_RESET) {
netif_carrier_off(ndev);
ivshm_net_do_stop(ndev);
}