char *buf)
{
struct gb_connection *connection = to_gb_connection(dev);
+ enum gb_connection_state state;
- return sprintf(buf, "%d\n", connection->state);
+ spin_lock_irq(&connection->lock);
+ state = connection->state;
+ spin_unlock_irq(&connection->lock);
+
+ return sprintf(buf, "%d\n", state);
}
static DEVICE_ATTR_RO(state);
spin_unlock_irq(&gb_connections_lock);
atomic_set(&connection->op_cycle, 0);
+ spin_lock_init(&connection->lock);
INIT_LIST_HEAD(&connection->operations);
/* XXX Will have to establish connections to get version */
}
/* Need to enable the connection to initialize it */
+ spin_lock_irq(&connection->lock);
connection->state = GB_CONNECTION_STATE_ENABLED;
+ spin_unlock_irq(&connection->lock);
+
ret = connection->protocol->connection_init(connection);
- if (ret)
+ if (ret) {
+ spin_lock_irq(&connection->lock);
connection->state = GB_CONNECTION_STATE_ERROR;
+ spin_unlock_irq(&connection->lock);
+ }
return ret;
}
return;
}
- if (connection->state != GB_CONNECTION_STATE_ENABLED)
+ spin_lock_irq(&connection->lock);
+ if (connection->state != GB_CONNECTION_STATE_ENABLED) {
+ spin_unlock_irq(&connection->lock);
return;
-
+ }
connection->state = GB_CONNECTION_STATE_DESTROYING;
+ spin_unlock_irq(&connection->lock);
+
connection->protocol->connection_exit(connection);
/*