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

Commit cfe5d809 authored by Dominik Brodowski's avatar Dominik Brodowski
Browse files

pcmcia: use ops_mutex for rsrc_{mgr,nonstatic} locking

parent 3f565232
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ be called with "ops_mutex" held:
	socket_setup()

	struct pccard_operations	*ops
	struct pccard_resource_ops	*resource_ops;

Note that send_event() and struct pcmcia_callback *callback must not be
called with "ops_mutex" held.
@@ -54,7 +55,7 @@ protected by pcmcia_socket_list_rwsem;

2. Per-Socket Data:
-------------------
The resource_ops are on their own to provide proper locking.
The resource_ops and their data are protected by ops_mutex.

The "main" struct pcmcia_socket is protected as follows (read-only fields
or single-use fields not mentioned):
+6 −1
Original line number Diff line number Diff line
@@ -224,7 +224,9 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
	spin_lock_init(&socket->thread_lock);

	if (socket->resource_ops->init) {
		mutex_lock(&socket->ops_mutex);
		ret = socket->resource_ops->init(socket);
		mutex_unlock(&socket->ops_mutex);
		if (ret)
			goto err;
	}
@@ -282,8 +284,11 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket)
	up_write(&pcmcia_socket_list_rwsem);

	/* wait for sysfs to drop all references */
	if (socket->resource_ops->exit)
	if (socket->resource_ops->exit) {
		mutex_lock(&socket->ops_mutex);
		socket->resource_ops->exit(socket);
		mutex_unlock(&socket->ops_mutex);
	}
	wait_for_completion(&socket->socket_released);
} /* pcmcia_unregister_socket */
EXPORT_SYMBOL(pcmcia_unregister_socket);
+5 −1
Original line number Diff line number Diff line
@@ -607,19 +607,23 @@ static int pcmcia_card_add(struct pcmcia_socket *s)
{
	cistpl_longlink_mfc_t mfc;
	unsigned int no_funcs, i, no_chains;
	int ret = 0;
	int ret = -EAGAIN;

	mutex_lock(&s->ops_mutex);
	if (!(s->resource_setup_done)) {
		dev_dbg(&s->dev,
			   "no resources available, delaying card_add\n");
		mutex_unlock(&s->ops_mutex);
		return -EAGAIN; /* try again, but later... */
	}

	if (pcmcia_validate_mem(s)) {
		dev_dbg(&s->dev, "validating mem resources failed, "
		       "delaying card_add\n");
		mutex_unlock(&s->ops_mutex);
		return -EAGAIN; /* try again, but later... */
	}
	mutex_unlock(&s->ops_mutex);

	ret = pccard_validate_cis(s, &no_chains);
	if (ret || !no_chains) {
+1 −3
Original line number Diff line number Diff line
@@ -187,7 +187,6 @@ static int pcmcia_adjust_resource_info(adjust_t *adj)
				continue;
			} else if (!(s->resource_setup_old))
				s->resource_setup_old = 1;
			mutex_unlock(&s->ops_mutex);

			switch (adj->Resource) {
			case RES_MEMORY_RANGE:
@@ -206,10 +205,9 @@ static int pcmcia_adjust_resource_info(adjust_t *adj)
				 * last call to adjust_resource_info, we
				 * always need to assume this is the latest
				 * one... */
				mutex_lock(&s->ops_mutex);
				s->resource_setup_done = 1;
				mutex_unlock(&s->ops_mutex);
			}
			mutex_unlock(&s->ops_mutex);
		}
	}
	up_read(&pcmcia_socket_list_rwsem);
+0 −2
Original line number Diff line number Diff line
@@ -26,9 +26,7 @@ static int static_init(struct pcmcia_socket *s)
	/* the good thing about SS_CAP_STATIC_MAP sockets is
	 * that they don't need a resource database */

	mutex_lock(&s->ops_mutex);
	s->resource_setup_done = 1;
	mutex_unlock(&s->ops_mutex);

	return 0;
}
Loading