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

Commit 4deb7c1e authored by Jeff Garzik's avatar Jeff Garzik Committed by Dominik Brodowski
Browse files

[PATCH] PCMCIA: handle sysfs, PCI errors



Handle sysfs and PCI errors correctly.

Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
parent 26aaa3c2
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -128,9 +128,12 @@ static int proc_read_drivers(char *buf, char **start, off_t pos,
			     int count, int *eof, void *data)
{
	char *p = buf;
	int rc;

	bus_for_each_drv(&pcmcia_bus_type, NULL,
	rc = bus_for_each_drv(&pcmcia_bus_type, NULL,
			      (void *) &p, proc_read_drivers_callback);
	if (rc < 0)
		return rc;

	return (p - buf);
}
@@ -269,8 +272,10 @@ static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info)
	 * Prevent this racing with a card insertion.
	 */
	mutex_lock(&s->skt_mutex);
	bus_rescan_devices(&pcmcia_bus_type);
	ret = bus_rescan_devices(&pcmcia_bus_type);
	mutex_unlock(&s->skt_mutex);
	if (ret)
		goto err_put_module;

	/* check whether the driver indeed matched. I don't care if this
	 * is racy or not, because it can only happen on cardmgr access
+13 −3
Original line number Diff line number Diff line
@@ -1197,8 +1197,12 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
	ret = pcmcia_register_socket(&socket->socket);
	if (ret == 0) {
		/* Add the yenta register attributes */
		device_create_file(&dev->dev, &dev_attr_yenta_registers);
		ret = device_create_file(&dev->dev, &dev_attr_yenta_registers);
		if (ret == 0)
			goto out;

		/* error path... */
		pcmcia_unregister_socket(&socket->socket);
	}

 unmap:
@@ -1248,12 +1252,18 @@ static int yenta_dev_resume (struct pci_dev *dev)
	struct yenta_socket *socket = pci_get_drvdata(dev);

	if (socket) {
		int rc;

		pci_set_power_state(dev, 0);
		/* FIXME: pci_restore_state needs to have a better interface */
		pci_restore_state(dev);
		pci_write_config_dword(dev, 16*4, socket->saved_state[0]);
		pci_write_config_dword(dev, 17*4, socket->saved_state[1]);
		pci_enable_device(dev);

		rc = pci_enable_device(dev);
		if (rc)
			return rc;

		pci_set_master(dev);

		if (socket->type && socket->type->restore_state)