[ltp] [PATCH] 2.6.16 ThinkPad T43/R52/*60 PnP IrDA support

Henrique de Moraes Holschuh linux-thinkpad@linux-thinkpad.org
Sat, 3 Jun 2006 13:21:19 -0300


--3MwIy2ne0vdjdPXF
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Well, I am still looking into the mess with the 2.6.17-rc5 nsc-ircc hangs,
but here is a *hack* that seems to work fine.  It is based on the old
patches we had for 2.6.12-2.6.15 in thinkwiki.org.

This hacked version of the nsc-ircc should support the T43/R52, as well as
any other models that used to work before *and* need PnP support to enable
the FIR device -- if stock nsc-ircc supports your ThinkPad, do *not* apply
this patch.  

You absolutely *must* have the FIR device enabled in BIOS for it to have a
chance of working, btw.

I have attached to this message both the patch against 2.6.16, and the
patched 2.6.16.19 nsc-ircc.c and nsc-ircc.h files (gzipped), so people who
have them patched can just replace them with these versions.

Please test, and report back.  I still don't have a FIR device to play with,
but I can and did test module load/unload and sw-suspend2 hibernation.

Notes:

1. Just like the old patches, it has *no* power management support, so
*unload the module on suspend and hibernate*, otherwise I doubt IrDA will
work after a resume.  This should disable IrDA and conserve power during
sleep, as a bonus.  

THIS MEANS YOU ARE TO ADD nsc-ircc TO THE SWSUSPEND2 MODULE BLACKLIST WHEN
USING THIS PATCH!

2. It can be loaded and unloaded (modprobe'd/rmmod'ed) as much as you want,
I tried it 100 times and nothing weird happened to the kernel.  So, it does
*not* have the same bug as the 2.6.17-rc5 modules on a 2.6.16 tree.

3. It *does not do PnP auto-detection*.  I could implement this, I
suppose... but it is a waste of time better spent on 2.6.17, and what
existed in 2.6.15 does not work right (in 2.6.16? ever?) anyway.

4. You *have* to specify the dongle_id, io, irq and dma parameters.

How it works:

PnP is used only to enable and disable the device on module load/unload, so
you have to give it the correct "io=0x2f8 irq=3 dma=3" (change as needed)
parameters.  The PnP layer does *not* change or autoconfig anything.
If running in debug mode, the module now tells you this (and tells you what
it thinks the io, dma and irq parameters should be, btw!).

The nsc-ircc code *does* attempt to autodetect the dongle, but it does this
doing some dubious IO operations to the FIR controller, which appear to not
be working right all the time (otherwise we would never have to specify the
dongle id :P).  It is much better -- and 50us faster -- to specify the
dongle_id manually.  I have no datasheets to know if increasing the
autodetect delay of 50us to 100us would help, but who wants the kernel
spinning in place for no good reason anyway?

-- 
  "One disk to rule them all, One disk to find them. One disk to bring
  them all and in the darkness grind them. In the Land of Redmond
  where the shadows lie." -- The Silicon Valley Tarot
  Henrique Holschuh

--3MwIy2ne0vdjdPXF
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="nsc-ircc_2.6.16-ThinkPad_full.patch"

diff -u 2.6.16/nsc-ircc.c 2.6.16-oldpnp-t43-fix/nsc-ircc.c
--- 2.6.16/drivers/net/irda/nsc-ircc.c	2006-06-02 11:34:36.000000000 -0300
+++ 2.6.16-thinkpad/drivers/net/irda/nsc-ircc.c	2006-06-03 12:35:03.000000000 -0300
@@ -12,6 +12,7 @@
  *     Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>
  *     Copyright (c) 1998 Lichen Wang, <lwang@actisys.com>
  *     Copyright (c) 1998 Actisys Corp., www.actisys.com
+ *     Copyright (c) 2000-2004 Jean Tourrilhes <jt@hpl.hp.com>
  *     All Rights Reserved
  *      
  *     This program is free software; you can redistribute it and/or 
@@ -53,6 +54,7 @@
 #include <linux/init.h>
 #include <linux/rtnetlink.h>
 #include <linux/dma-mapping.h>
+#include <linux/pnp.h>
 
 #include <asm/io.h>
 #include <asm/dma.h>
@@ -87,6 +89,7 @@
 static int nsc_ircc_init_108(nsc_chip_t *chip, chipio_t *info);
 static int nsc_ircc_init_338(nsc_chip_t *chip, chipio_t *info);
 static int nsc_ircc_init_39x(nsc_chip_t *chip, chipio_t *info);
+static int __devinit nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id);
 
 /* These are the known NSC chips */
 static nsc_chip_t chips[] = {
@@ -101,6 +104,12 @@
 	/* Contributed by Jan Frey - IBM A30/A31 */
 	{ "PC8739x", { 0x2e, 0x4e, 0x0 }, 0x20, 0xea, 0xff, 
 	  nsc_ircc_probe_39x, nsc_ircc_init_39x },
+	/* IBM ThinkPads using PC8738x (T60/X60/Z60) */
+	{ "IBM-PC8738x", { 0x2e, 0x4e, 0x0 }, 0x20, 0xf4, 0xff,
+	  nsc_ircc_probe_39x, nsc_ircc_init_39x },
+	/* IBM ThinkPads using PC8394T (T43/R52/?) */
+	{ "IBM-PC8394T", { 0x2e, 0x4e, 0x0 }, 0x20, 0xf9, 0xff,
+	  nsc_ircc_probe_39x, nsc_ircc_init_39x },
 	{ NULL }
 };
 
@@ -126,8 +135,23 @@
 	"No dongle connected",
 };
 
+/* PNP probing */
+static const struct pnp_device_id nsc_ircc_pnp_table[] = {
+	{ .id = "NSC6001", .driver_data = 0 },
+	{ .id = "IBM0071", .driver_data = 0 },
+	{ }
+};
+
+MODULE_DEVICE_TABLE(pnp, nsc_ircc_pnp_table);
+
+static struct pnp_driver nsc_ircc_pnp_driver = {
+	.name = "nsc-ircc",
+	.id_table = nsc_ircc_pnp_table,
+	.probe = nsc_ircc_pnp_probe,
+};
+
 /* Some prototypes */
-static int  nsc_ircc_open(int i, chipio_t *info);
+static int  nsc_ircc_open(chipio_t *info);
 static int  nsc_ircc_close(struct nsc_ircc_cb *self);
 static int  nsc_ircc_setup(chipio_t *info);
 static void nsc_ircc_pio_receive(struct nsc_ircc_cb *self);
@@ -148,6 +172,9 @@
 static struct net_device_stats *nsc_ircc_net_get_stats(struct net_device *dev);
 static int nsc_ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data);
 
+/* Globals */
+static int pnp_registered_port;
+
 /*
  * Function nsc_ircc_init ()
  *
@@ -163,6 +190,14 @@
 	int cfg, id;
 	int reg;
 	int i = 0;
+	int r;
+
+	/* Register with PnP subsystem to detect disabled ports */
+	r = pnp_register_driver(&nsc_ircc_pnp_driver);
+	if (r >= 0) {
+		pnp_registered_port = 1;
+		ret = 0;
+	}
 
 	/* Probe for all the NSC chipsets we know about */
 	for (chip=chips; chip->name ; chip++) {
@@ -204,7 +239,7 @@
 				} else
 					chip->probe(chip, &info);
 
-				if (nsc_ircc_open(i, &info) == 0)
+				if (nsc_ircc_open(&info) == 0)
 					ret = 0;
 				i++;
 			} else {
@@ -229,6 +264,9 @@
 
 	pm_unregister_all(nsc_ircc_pmproc);
 
+	if (pnp_registered_port)
+		pnp_unregister_driver(&nsc_ircc_pnp_driver);
+
 	for (i=0; i < 4; i++) {
 		if (dev_self[i])
 			nsc_ircc_close(dev_self[i]);
@@ -241,16 +279,26 @@
  *    Open driver instance
  *
  */
-static int __init nsc_ircc_open(int i, chipio_t *info)
+static int __devinit nsc_ircc_open(chipio_t *info)
 {
 	struct net_device *dev;
 	struct nsc_ircc_cb *self;
         struct pm_dev *pmdev;
 	void *ret;
 	int err;
+	int i;
 
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
+ 	for (i=0; i < 4; i++) {
+		if (!dev_self[i])
+			break;
+	}
+	if (i == 4) {
+		IRDA_ERROR("%s(), maximum number of supported chips reached!\n", __FUNCTION__);
+		return -ENOMEM;
+	}
+
 	IRDA_MESSAGE("%s, Found chip at base=0x%03x\n", driver_name,
 		     info->cfg_base);
 
@@ -389,7 +437,7 @@
  *    Close driver instance
  *
  */
-static int __exit nsc_ircc_close(struct nsc_ircc_cb *self)
+static int __devexit nsc_ircc_close(struct nsc_ircc_cb *self)
 {
 	int iobase;
 
@@ -806,6 +854,40 @@
 	return 0;
 }
 
+/* PNP probing */
+static int __devinit
+nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id)
+{
+	chipio_t info;
+
+	memset(&info, 0, sizeof(chipio_t));
+	info.irq = -1;
+	info.dma = -1;
+
+	/* There don't seem to be any way to get the cfg_base.
+	 * On my box, cfg_base is in the PnP descriptor of the
+	 * motherboard. Oh well... Jean II */
+
+	if (pnp_port_valid(dev, 0) &&
+		!(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED))
+		info.fir_base = pnp_port_start(dev, 0);
+
+	if (pnp_irq_valid(dev, 0) &&
+		!(pnp_irq_flags(dev, 0) & IORESOURCE_DISABLED))
+		info.irq = pnp_irq(dev, 0);
+
+	if (pnp_dma_valid(dev, 0) &&
+		!(pnp_dma_flags(dev, 0) & IORESOURCE_DISABLED))
+		info.dma = pnp_dma(dev, 0);
+
+	IRDA_DEBUG(0, "%s() : Found cfg_base 0x%03X ; firbase 0x%03X ; irq %d ; dma %d.\n", __FUNCTION__, info.cfg_base, info.fir_base, info.irq, info.dma);
+	IRDA_DEBUG(0, "%s() : Please load this driver with parameters: io=0x%03X irq=%d dma=%d\n",  __FUNCTION__, info.fir_base, info.irq, info.dma);
+
+	/* We are only a helper for nsc_ircc_init, so 
+	 * don't start the device, nor disable it! */
+	return 0;
+}
+
 /*
  * Function nsc_ircc_setup (info)
  *

--3MwIy2ne0vdjdPXF
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="nsc-ircc.c.gz"
Content-Transfer-Encoding: base64

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
dDKTxEwa3NrfkaJjSU7p/wvGdNG6AuQAAA==

--3MwIy2ne0vdjdPXF
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="nsc-ircc.h.gz"
Content-Transfer-Encoding: base64

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
t6My/wf3WKeB+yMAAA==

--3MwIy2ne0vdjdPXF--