SOURCES (LINUX_2_6): kernel-2.6-pcmcia.patch - next try for KBZ 55...

havner havner at pld-linux.org
Sat Jan 28 05:30:45 CET 2006


Author: havner                       Date: Sat Jan 28 04:30:44 2006 GMT
Module: SOURCES                       Tag: LINUX_2_6
---- Log message:
- next try for KBZ 5569, previous one didn't fix all issues.

---- Files affected:
SOURCES:
   kernel-2.6-pcmcia.patch (1.1.2.1 -> 1.1.2.2) 

---- Diffs:

================================================================
Index: SOURCES/kernel-2.6-pcmcia.patch
diff -u SOURCES/kernel-2.6-pcmcia.patch:1.1.2.1 SOURCES/kernel-2.6-pcmcia.patch:1.1.2.2
--- SOURCES/kernel-2.6-pcmcia.patch:1.1.2.1	Fri Jan 20 03:33:00 2006
+++ SOURCES/kernel-2.6-pcmcia.patch	Sat Jan 28 05:30:39 2006
@@ -1,20 +1,77 @@
-[PATCH] pcmcia: delay creation of 'pseudo' devices
-
-Pseudo secondary PCMCIA devices work best if the primary PCMCIA device
-is configured already. Therefore, delay things a bit...
-
-Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net>
-
 diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
-index d419f17..3e3bb09 100644
+index 0a424a4..54ad93d 100644
 --- a/drivers/pcmcia/ds.c
 +++ b/drivers/pcmcia/ds.c
-@@ -679,7 +679,7 @@ static inline void pcmcia_add_pseudo_dev
+@@ -352,11 +352,20 @@ static void pcmcia_release_dev(struct de
+ 	kfree(p_dev);
+ }
+ 
++static void pcmcia_add_pseudo_device(struct pcmcia_socket *s)
++{
++	if (!s->pcmcia_state.device_add_pending) {
++		s->pcmcia_state.device_add_pending = 1;
++		schedule_work(&s->device_add);
++	}
++	return;
++}
+ 
+ static int pcmcia_device_probe(struct device * dev)
  {
- 	if (!s->pcmcia_state.device_add_pending) {
- 		s->pcmcia_state.device_add_pending = 1;
--		schedule_work(&s->device_add);
-+		schedule_delayed_work(&s->device_add, 10);
+ 	struct pcmcia_device *p_dev;
+ 	struct pcmcia_driver *p_drv;
++	struct pcmcia_device_id *did;
+ 	struct pcmcia_socket *s;
+ 	int ret = 0;
+ 
+@@ -392,6 +401,19 @@ static int pcmcia_device_probe(struct de
  	}
- 	return;
+ 
+ 	ret = p_drv->probe(p_dev);
++	if (ret)
++		goto put_module;
++
++	/* handle pseudo multifunction devices:
++	 * there are at most two pseudo multifunction devices.
++	 * if we're matching against the first, schedule a
++	 * call which will then check whether there are two
++	 * pseudo devices, and if not, add the second one.
++	 */
++	did = (struct pcmcia_device_id *) p_dev->dev.driver_data;
++	if ((did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
++	    (p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
++		pcmcia_add_pseudo_device(p_dev->socket);
+ 
+  put_module:
+ 	if (ret)
+@@ -660,15 +682,6 @@ static void pcmcia_delayed_add_pseudo_de
+ 	s->pcmcia_state.device_add_pending = 0;
  }
+ 
+-static inline void pcmcia_add_pseudo_device(struct pcmcia_socket *s)
+-{
+-	if (!s->pcmcia_state.device_add_pending) {
+-		s->pcmcia_state.device_add_pending = 1;
+-		schedule_work(&s->device_add);
+-	}
+-	return;
+-}
+-
+ static int pcmcia_requery(struct device *dev, void * _data)
+ {
+ 	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
+@@ -755,15 +768,6 @@ static inline int pcmcia_devmatch(struct
+ 	}
+ 
+ 	if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
+-		/* handle pseudo multifunction devices:
+-		 * there are at most two pseudo multifunction devices.
+-		 * if we're matching against the first, schedule a
+-		 * call which will then check whether there are two
+-		 * pseudo devices, and if not, add the second one.
+-		 */
+-		if (dev->device_no == 0)
+-			pcmcia_add_pseudo_device(dev->socket);
+-
+ 		if (dev->device_no != did->device_no)
+ 			return 0;
+ 	}
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/SOURCES/kernel-2.6-pcmcia.patch?r1=1.1.2.1&r2=1.1.2.2&f=u



More information about the pld-cvs-commit mailing list