[PATCH 11/18] pcmcia: do not use io_req_t when calling pcmcia_request_io()

Komuro komurojun-mbn at nifty.com
Fri Sep 17 09:06:51 EDT 2010


Hi,

Xircom multi-function card still does not work.

Please see the attached dmesg log.


Best Regards
Komuro

----- Original Message -----
>Date: Mon, 13 Sep 2010 21:53:53 +0200
>From: Dominik Brodowski <linux at dominikbrodowski.net>
>To: Komuro <komurojun-mbn at nifty.com>
>Cc: linux-pcmcia at lists.infradead.org, linux-serial at vger.kernel.org
>Subject: Re: Re: Re: Re: [PATCH 11/18] pcmcia: do not use io_req_t when
> calling pcmcia_request_io()
>
>
>Dear Komuro,
>
>does the attached patch help with 2.6.36-rc4?
>
>Best,
>	Dominik
>
>commit 1852d6b8c3fa2d1765f66cd7d96a8c6bf9f01997
>Author: Dominik Brodowski <linux at dominikbrodowski.net>
>Date:   Mon Aug 30 08:18:54 2010 +0200
>
>    pcmcia serial_cs.c: fix multifunction card handling
>    
>    We shouldn't overwrite pre-set values, and we should also
>    set the port address to the beginning, and not the end of
>    the 8-port range.
>    
>    Reported-by: Komuro <komurojun-mbn at nifty.com>
>    Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net>
>
>diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c
>index 141c695..7d475b2 100644
>--- a/drivers/serial/serial_cs.c
>+++ b/drivers/serial/serial_cs.c
>@@ -335,8 +335,6 @@ static int serial_probe(struct pcmcia_device *link)
> 	info->p_dev = link;
> 	link->priv = info;
> 
>-	link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
>-	link->resource[0]->end = 8;
> 	link->conf.Attributes = CONF_ENABLE_IRQ;
> 	if (do_sound) {
> 		link->conf.Attributes |= CONF_ENABLE_SPKR;
>@@ -411,6 +409,27 @@ static int setup_serial(struct pcmcia_device *handle, st
ruct serial_info * info,
> 
> /*====================================================================*/
> 
>+static int pfc_config(struct pcmcia_device *p_dev)
>+{
>+	unsigned int port = 0;
>+	struct serial_info *info = p_dev->priv;
>+
>+	if ((p_dev->resource[1]->end != 0) &&
>+		(resource_size(p_dev->resource[1]) == 8)) {
>+		port = p_dev->resource[1]->start;
>+		info->slave = 1;
>+	} else if ((info->manfid == MANFID_OSITECH) &&
>+		(resource_size(p_dev->resource[0]) == 0x40)) {
>+		port = p_dev->resource[0]->start + 0x28;
>+		info->slave = 1;
>+	}
>+	if (info->slave)
>+		return setup_serial(p_dev, info, port, p_dev->irq);
>+
>+	dev_warn(&p_dev->dev, "no usable port range found, giving up\n");
>+	return -ENODEV;
>+}
>+
> static int simple_config_check(struct pcmcia_device *p_dev,
> 			       cistpl_cftable_entry_t *cf,
> 			       cistpl_cftable_entry_t *dflt,
>@@ -461,23 +480,8 @@ static int simple_config(struct pcmcia_device *link)
> 	struct serial_info *info = link->priv;
> 	int i = -ENODEV, try;
> 
>-	/* If the card is already configured, look up the port and irq */
>-	if (link->function_config) {
>-		unsigned int port = 0;
>-		if ((link->resource[1]->end != 0) &&
>-			(resource_size(link->resource[1]) == 8)) {
>-			port = link->resource[1]->end;
>-			info->slave = 1;
>-		} else if ((info->manfid == MANFID_OSITECH) &&
>-			(resource_size(link->resource[0]) == 0x40)) {
>-			port = link->resource[0]->start + 0x28;
>-			info->slave = 1;
>-		}
>-		if (info->slave) {
>-			return setup_serial(link, info, port,
>-					    link->irq);
>-		}
>-	}
>+	link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
>+	link->resource[0]->end = 8;
> 
> 	/* First pass: look for a config entry that looks normal.
> 	 * Two tries: without IO aliases, then with aliases */
>@@ -491,8 +495,7 @@ static int simple_config(struct pcmcia_device *link)
> 	if (!pcmcia_loop_config(link, simple_config_check_notpicky, NULL))
> 		goto found_port;
> 
>-	printk(KERN_NOTICE
>-	       "serial_cs: no usable port range found, giving up\n");
>+	dev_warn(&link->dev, "no usable port range found, giving up\n");
> 	return -1;
> 
> found_port:
>@@ -558,6 +561,7 @@ static int multi_config(struct pcmcia_device *link)
> 	int i, base2 = 0;
> 
> 	/* First, look for a generic full-sized window */
>+	link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
> 	link->resource[0]->end = info->multi * 8;
> 	if (pcmcia_loop_config(link, multi_config_check, &base2)) {
> 		/* If that didn't work, look for two windows */
>@@ -565,15 +569,14 @@ static int multi_config(struct pcmcia_device *link)
> 		info->multi = 2;
> 		if (pcmcia_loop_config(link, multi_config_check_notpicky,
> 				       &base2)) {
>-			printk(KERN_NOTICE "serial_cs: no usable port range"
>+			dev_warn(&link->dev, "no usable port range "
> 			       "found, giving up\n");
> 			return -ENODEV;
> 		}
> 	}
> 
> 	if (!link->irq)
>-		dev_warn(&link->dev,
>-			"serial_cs: no usable IRQ found, continuing...\n");
>+		dev_warn(&link->dev, "no usable IRQ found, continuing...\n");
> 
> 	/*
> 	 * Apply any configuration quirks.
>@@ -675,6 +678,7 @@ static int serial_config(struct pcmcia_device * link)
> 	   multifunction cards that ask for appropriate IO port ranges */
> 	if ((info->multi == 0) &&
> 	    (link->has_func_id) &&
>+	    (link->socket->pcmcia_pfc == 0) &&
> 	    ((link->func_id == CISTPL_FUNCID_MULTI) ||
> 	     (link->func_id == CISTPL_FUNCID_SERIAL)))
> 		pcmcia_loop_config(link, serial_check_for_multi, info);
>@@ -685,7 +689,13 @@ static int serial_config(struct pcmcia_device * link)
> 	if (info->quirk && info->quirk->multi != -1)
> 		info->multi = info->quirk->multi;
> 
>-	if (info->multi > 1)
>+	dev_info(&link->dev,
>+		"trying to set up [0x%04x:0x%04x] (pfc: %d, multi: %d, quirk: %p)\n",
>+		link->manf_id, link->card_id,
>+		link->socket->pcmcia_pfc, info->multi, info->quirk);
>+	if (link->socket->pcmcia_pfc)
>+		i = pfc_config(link);
>+	else if (info->multi > 1)
> 		i = multi_config(link);
> 	else
> 		i = simple_config(link);
>@@ -704,7 +714,7 @@ static int serial_config(struct pcmcia_device * link)
> 	return 0;
> 
> failed:
>-	dev_warn(&link->dev, "serial_cs: failed to initialize\n");
>+	dev_warn(&link->dev, "failed to initialize\n");
> 	serial_remove(link);
> 	return -ENODEV;
> }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: serial_cs.log
Type: application/octet-stream
Size: 14661 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-pcmcia/attachments/20100917/0dc09732/attachment.obj>


More information about the linux-pcmcia mailing list