public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Infineon TPM: move infineon driver off pci_dev
@ 2005-10-26 17:11 Marcel Selhorst
  2005-10-26 17:23 ` Kylene Jo Hall
  2005-10-26 17:41 ` matthieu castet
  0 siblings, 2 replies; 17+ messages in thread
From: Marcel Selhorst @ 2005-10-26 17:11 UTC (permalink / raw)
  To: linux-kernel; +Cc: Andrew Morton, Kylene Jo Hall, matthieu castet

Dear all,

the following patch moves the Infineon TPM driver off pci device
and makes it a pure pnp-driver. It was tested with IFX0101 and
IFX0102 and is now based on the tpm patchset (1 to 5) from Kylene
Hall submitted yesterday.

Best regards,

Marcel Selhorst

Signed-off-by: Marcel Selhorst <selhorst@crypto.rub.de>
---

diff -pruN linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c
linux-2.6.14-rc5.infineon_v1.6/drivers/char/tpm/tpm_infineon.c
--- linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c	2005-10-26
15:21:53.000000000 +0200
+++ linux-2.6.14-rc5.infineon_v1.6/drivers/char/tpm/tpm_infineon.c	2005-10-26
15:21:42.000000000 +0200
@@ -5,6 +5,7 @@
  * Specifications at www.trustedcomputinggroup.org
  *
  * Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
+ * Sirrix AG - security technologies, http://www.sirrix.com and
  * Applied Data Security Group, Ruhr-University Bochum, Germany
  * Project-Homepage: http://www.prosec.rub.de/tpm
  *
@@ -31,7 +32,7 @@
 /* These values will be filled after PnP-call */
 static int TPM_INF_DATA = 0;
 static int TPM_INF_ADDR = 0;
-static int pnp_registered = 0;
+static int TPM_INF_BASE = 0;

 /* TPM header definitions */
 enum infineon_tpm_header {
@@ -143,11 +144,9 @@ static int wait(struct tpm_chip *chip, i
 	}
 	if (i == TPM_MAX_TRIES) {	/* timeout occurs */
 		if (wait_for_bit == STAT_XFE)
-			dev_err(chip->dev,
-				"Timeout in wait(STAT_XFE)\n");
+			dev_err(chip->dev, "Timeout in wait(STAT_XFE)\n");
 		if (wait_for_bit == STAT_RDA)
-			dev_err(chip->dev,
-				"Timeout in wait(STAT_RDA)\n");
+			dev_err(chip->dev, "Timeout in wait(STAT_RDA)\n");
 		return -EIO;
 	}
 	return 0;
@@ -196,7 +195,7 @@ static int tpm_inf_recv(struct tpm_chip
 	int ret;
 	u32 size = 0;

-recv_begin:
+      recv_begin:
 	/* start receiving header */
 	for (i = 0; i < 4; i++) {
 		ret = wait(chip, STAT_RDA);
@@ -221,8 +220,7 @@ recv_begin:
 		}

 		if ((size == 0x6D00) && (buf[1] == 0x80)) {
-			dev_err(chip->dev,
-				"Error handling on vendor layer!\n");
+			dev_err(chip->dev, "Error handling on vendor layer!\n");
 			return -EIO;
 		}

@@ -362,30 +360,11 @@ static const struct pnp_device_id tpm_pn
 	{"IFX0102", 0},
 	{"", 0}
 };
+
 MODULE_DEVICE_TABLE(pnp, tpm_pnp_tbl);

 static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
-					const struct pnp_device_id *dev_id)
-{
-	if (pnp_port_valid(dev, 0)) {
-		TPM_INF_ADDR = (pnp_port_start(dev, 0) & 0xff);
-		TPM_INF_DATA = ((TPM_INF_ADDR + 1) & 0xff);
-		tpm_inf.base = pnp_port_start(dev, 1);
-		dev_info(&dev->dev, "Found %s with ID %s\n",
-		dev->name, dev_id->id);
-		return 0;
-	}
-	return -ENODEV;
-}
-
-static struct pnp_driver tpm_inf_pnp = {
-	.name = "tpm_inf_pnp",
-	.id_table = tpm_pnp_tbl,
-	.probe = tpm_inf_pnp_probe,
-};
-
-static int __devinit tpm_inf_probe(struct pci_dev *pci_dev,
-				   const struct pci_device_id *pci_id)
+				       const struct pnp_device_id *dev_id)
 {
 	int rc = 0;
 	u8 iol, ioh;
@@ -394,30 +373,23 @@ static int __devinit tpm_inf_probe(struc
 	int productid[2];
 	char chipname[20];

-	rc = pci_enable_device(pci_dev);
-	if (rc)
-		return rc;
-
-	dev_info(&pci_dev->dev, "LPC-bus found at 0x%x\n", pci_id->device);
-
-	/* read IO-ports from PnP */
-	rc = pnp_register_driver(&tpm_inf_pnp);
-	if (rc < 0) {
-		dev_err(&pci_dev->dev,
-			"Error %x from pnp_register_driver!\n",rc);
-		goto error2;
-	}
-	if (!rc) {
-		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
-		goto error;
+	/* read IO-ports through PnP */
+	if (pnp_port_valid(dev, 0) &&
+	    !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) {
+		TPM_INF_ADDR = pnp_port_start(dev, 0);
+		TPM_INF_DATA = (TPM_INF_ADDR + 1);
+		TPM_INF_BASE = pnp_port_start(dev, 1);
+		dev_info(&dev->dev, "Found %s with ID %s\n",
+			 dev->name, dev_id->id);
+		if (!((TPM_INF_BASE >> 8) & 0xff)) {
+			tpm_inf.base = 0;
+		} else {
+			/* publish the base address to the tpm-driver
+			   and use tpm_inf.base from now on */
+			tpm_inf.base = TPM_INF_BASE;
+		}
 	} else {
-		pnp_registered = 1;
-	}
-
-	/* Make sure, we have received valid config ports */
-	if (!TPM_INF_ADDR) {
-		dev_err(&pci_dev->dev, "No valid IO-ports received!\n");
-		goto error;
+		return -EINVAL;
 	}

 	/* query chip for its vendor, its version number a.s.o. */
@@ -450,8 +422,8 @@ static int __devinit tpm_inf_probe(struc
 	if ((vendorid[0] << 8 | vendorid[1]) == (TPM_INFINEON_DEV_VEN_VALUE)) {

 		if (tpm_inf.base == 0) {
-			dev_err(&pci_dev->dev, "No IO-ports found!\n");
-			goto error;
+			dev_err(&dev->dev, "No IO-ports found!\n");
+			return -EIO;
 		}
 		/* configure TPM with IO-ports */
 		outb(IOLIMH, TPM_INF_ADDR);
@@ -466,10 +438,10 @@ static int __devinit tpm_inf_probe(struc
 		iol = inb(TPM_INF_DATA);

 		if ((ioh << 8 | iol) != tpm_inf.base) {
-			dev_err(&pci_dev->dev,
+			dev_err(&dev->dev,
 				"Could not set IO-ports to %04x\n",
 				tpm_inf.base);
-			goto error;
+			return -EIO;
 		}

 		/* activate register */
@@ -481,7 +453,7 @@ static int __devinit tpm_inf_probe(struc
 		outb(RESET_LP_IRQC_DISABLE, tpm_inf.base + CMD);

 		/* Finally, we're done, print some infos */
-		dev_info(&pci_dev->dev, "TPM found: "
+		dev_info(&dev->dev, "TPM found: "
 			 "config base 0x%x, "
 			 "io base 0x%x, "
 			 "chip version %02x%02x, "
@@ -489,67 +461,48 @@ static int __devinit tpm_inf_probe(struc
 			 "product id %02x%02x"
 			 "%s\n",
 			 TPM_INF_ADDR,
-			 tpm_inf.base,
+			 TPM_INF_BASE,
 			 version[0], version[1],
 			 vendorid[0], vendorid[1],
 			 productid[0], productid[1], chipname);

-		rc = tpm_register_hardware(&pci_dev->dev, &tpm_inf);
-		if (rc < 0)
-			goto error;
+		rc = tpm_register_hardware(&dev->dev, &tpm_inf);
+		if (rc < 0) {
+			return -ENODEV;
+		}
 		return 0;
 	} else {
-		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
-error:
-		pnp_unregister_driver(&tpm_inf_pnp);
-error2:
-		pci_disable_device(pci_dev);
-		pnp_registered = 0;
+		dev_info(&dev->dev, "No Infineon TPM found!\n");
 		return -ENODEV;
 	}
 }

-static __devexit void tpm_inf_remove(struct pci_dev* pci_dev)
+static __devexit void tpm_inf_pnp_remove(struct pnp_dev *dev)
 {
-	struct tpm_chip* chip = pci_get_drvdata(pci_dev);
-	
-	if( chip )
+	struct tpm_chip *chip = pnp_get_drvdata(dev);
+
+	if (chip)
 		tpm_remove_hardware(chip->dev);
 }

-static struct pci_device_id tpm_pci_tbl[] __devinitdata = {
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2)},
-	{0,}
-};
-
-MODULE_DEVICE_TABLE(pci, tpm_pci_tbl);
-
-static struct pci_driver inf_pci_driver = {
-	.name = "tpm_inf",
-	.id_table = tpm_pci_tbl,
-	.probe = tpm_inf_probe,
-	.remove = __devexit_p(tpm_inf_remove),
-	.suspend = tpm_pm_suspend,
-	.resume = tpm_pm_resume,
+static struct pnp_driver tpm_inf_pnp = {
+	.name = "tpm_inf_pnp",
+	.driver.owner = THIS_MODULE,
+	.id_table = tpm_pnp_tbl,
+	.probe = tpm_inf_pnp_probe,
+	.remove = tpm_inf_pnp_remove,
+	.driver.suspend = tpm_pm_suspend,
+	.driver.resume = tpm_pm_resume,
 };

 static int __init init_inf(void)
 {
-	return pci_register_driver(&inf_pci_driver);
+	return pnp_register_driver(&tpm_inf_pnp);
 }

 static void __exit cleanup_inf(void)
 {
-	if (pnp_registered)
-		pnp_unregister_driver(&tpm_inf_pnp);
-	pci_unregister_driver(&inf_pci_driver);
+	pnp_unregister_driver(&tpm_inf_pnp);
 }

 module_init(init_inf);
@@ -557,5 +510,5 @@ module_exit(cleanup_inf);

 MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
 MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
-MODULE_VERSION("1.5");
+MODULE_VERSION("1.6");
 MODULE_LICENSE("GPL");

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-26 17:11 [PATCH] Infineon TPM: move infineon driver off pci_dev Marcel Selhorst
@ 2005-10-26 17:23 ` Kylene Jo Hall
  2005-10-26 17:41 ` matthieu castet
  1 sibling, 0 replies; 17+ messages in thread
From: Kylene Jo Hall @ 2005-10-26 17:23 UTC (permalink / raw)
  To: Marcel Selhorst; +Cc: linux-kernel, Andrew Morton, matthieu castet

Signed-off-by: Kylene Hall <kjhall@us.ibm.com>

On Wed, 2005-10-26 at 19:11 +0200, Marcel Selhorst wrote:
> Dear all,
> 
> the following patch moves the Infineon TPM driver off pci device
> and makes it a pure pnp-driver. It was tested with IFX0101 and
> IFX0102 and is now based on the tpm patchset (1 to 5) from Kylene
> Hall submitted yesterday.
> 
> Best regards,
> 
> Marcel Selhorst
> 
> Signed-off-by: Marcel Selhorst <selhorst@crypto.rub.de>
> ---
> 
> diff -pruN linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c
> linux-2.6.14-rc5.infineon_v1.6/drivers/char/tpm/tpm_infineon.c
> --- linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c	2005-10-26
> 15:21:53.000000000 +0200
> +++ linux-2.6.14-rc5.infineon_v1.6/drivers/char/tpm/tpm_infineon.c	2005-10-26
> 15:21:42.000000000 +0200
> @@ -5,6 +5,7 @@
>   * Specifications at www.trustedcomputinggroup.org
>   *
>   * Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
> + * Sirrix AG - security technologies, http://www.sirrix.com and
>   * Applied Data Security Group, Ruhr-University Bochum, Germany
>   * Project-Homepage: http://www.prosec.rub.de/tpm
>   *
> @@ -31,7 +32,7 @@
>  /* These values will be filled after PnP-call */
>  static int TPM_INF_DATA = 0;
>  static int TPM_INF_ADDR = 0;
> -static int pnp_registered = 0;
> +static int TPM_INF_BASE = 0;
> 
>  /* TPM header definitions */
>  enum infineon_tpm_header {
> @@ -143,11 +144,9 @@ static int wait(struct tpm_chip *chip, i
>  	}
>  	if (i == TPM_MAX_TRIES) {	/* timeout occurs */
>  		if (wait_for_bit == STAT_XFE)
> -			dev_err(chip->dev,
> -				"Timeout in wait(STAT_XFE)\n");
> +			dev_err(chip->dev, "Timeout in wait(STAT_XFE)\n");
>  		if (wait_for_bit == STAT_RDA)
> -			dev_err(chip->dev,
> -				"Timeout in wait(STAT_RDA)\n");
> +			dev_err(chip->dev, "Timeout in wait(STAT_RDA)\n");
>  		return -EIO;
>  	}
>  	return 0;
> @@ -196,7 +195,7 @@ static int tpm_inf_recv(struct tpm_chip
>  	int ret;
>  	u32 size = 0;
> 
> -recv_begin:
> +      recv_begin:
>  	/* start receiving header */
>  	for (i = 0; i < 4; i++) {
>  		ret = wait(chip, STAT_RDA);
> @@ -221,8 +220,7 @@ recv_begin:
>  		}
> 
>  		if ((size == 0x6D00) && (buf[1] == 0x80)) {
> -			dev_err(chip->dev,
> -				"Error handling on vendor layer!\n");
> +			dev_err(chip->dev, "Error handling on vendor layer!\n");
>  			return -EIO;
>  		}
> 
> @@ -362,30 +360,11 @@ static const struct pnp_device_id tpm_pn
>  	{"IFX0102", 0},
>  	{"", 0}
>  };
> +
>  MODULE_DEVICE_TABLE(pnp, tpm_pnp_tbl);
> 
>  static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
> -					const struct pnp_device_id *dev_id)
> -{
> -	if (pnp_port_valid(dev, 0)) {
> -		TPM_INF_ADDR = (pnp_port_start(dev, 0) & 0xff);
> -		TPM_INF_DATA = ((TPM_INF_ADDR + 1) & 0xff);
> -		tpm_inf.base = pnp_port_start(dev, 1);
> -		dev_info(&dev->dev, "Found %s with ID %s\n",
> -		dev->name, dev_id->id);
> -		return 0;
> -	}
> -	return -ENODEV;
> -}
> -
> -static struct pnp_driver tpm_inf_pnp = {
> -	.name = "tpm_inf_pnp",
> -	.id_table = tpm_pnp_tbl,
> -	.probe = tpm_inf_pnp_probe,
> -};
> -
> -static int __devinit tpm_inf_probe(struct pci_dev *pci_dev,
> -				   const struct pci_device_id *pci_id)
> +				       const struct pnp_device_id *dev_id)
>  {
>  	int rc = 0;
>  	u8 iol, ioh;
> @@ -394,30 +373,23 @@ static int __devinit tpm_inf_probe(struc
>  	int productid[2];
>  	char chipname[20];
> 
> -	rc = pci_enable_device(pci_dev);
> -	if (rc)
> -		return rc;
> -
> -	dev_info(&pci_dev->dev, "LPC-bus found at 0x%x\n", pci_id->device);
> -
> -	/* read IO-ports from PnP */
> -	rc = pnp_register_driver(&tpm_inf_pnp);
> -	if (rc < 0) {
> -		dev_err(&pci_dev->dev,
> -			"Error %x from pnp_register_driver!\n",rc);
> -		goto error2;
> -	}
> -	if (!rc) {
> -		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
> -		goto error;
> +	/* read IO-ports through PnP */
> +	if (pnp_port_valid(dev, 0) &&
> +	    !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) {
> +		TPM_INF_ADDR = pnp_port_start(dev, 0);
> +		TPM_INF_DATA = (TPM_INF_ADDR + 1);
> +		TPM_INF_BASE = pnp_port_start(dev, 1);
> +		dev_info(&dev->dev, "Found %s with ID %s\n",
> +			 dev->name, dev_id->id);
> +		if (!((TPM_INF_BASE >> 8) & 0xff)) {
> +			tpm_inf.base = 0;
> +		} else {
> +			/* publish the base address to the tpm-driver
> +			   and use tpm_inf.base from now on */
> +			tpm_inf.base = TPM_INF_BASE;
> +		}
>  	} else {
> -		pnp_registered = 1;
> -	}
> -
> -	/* Make sure, we have received valid config ports */
> -	if (!TPM_INF_ADDR) {
> -		dev_err(&pci_dev->dev, "No valid IO-ports received!\n");
> -		goto error;
> +		return -EINVAL;
>  	}
> 
>  	/* query chip for its vendor, its version number a.s.o. */
> @@ -450,8 +422,8 @@ static int __devinit tpm_inf_probe(struc
>  	if ((vendorid[0] << 8 | vendorid[1]) == (TPM_INFINEON_DEV_VEN_VALUE)) {
> 
>  		if (tpm_inf.base == 0) {
> -			dev_err(&pci_dev->dev, "No IO-ports found!\n");
> -			goto error;
> +			dev_err(&dev->dev, "No IO-ports found!\n");
> +			return -EIO;
>  		}
>  		/* configure TPM with IO-ports */
>  		outb(IOLIMH, TPM_INF_ADDR);
> @@ -466,10 +438,10 @@ static int __devinit tpm_inf_probe(struc
>  		iol = inb(TPM_INF_DATA);
> 
>  		if ((ioh << 8 | iol) != tpm_inf.base) {
> -			dev_err(&pci_dev->dev,
> +			dev_err(&dev->dev,
>  				"Could not set IO-ports to %04x\n",
>  				tpm_inf.base);
> -			goto error;
> +			return -EIO;
>  		}
> 
>  		/* activate register */
> @@ -481,7 +453,7 @@ static int __devinit tpm_inf_probe(struc
>  		outb(RESET_LP_IRQC_DISABLE, tpm_inf.base + CMD);
> 
>  		/* Finally, we're done, print some infos */
> -		dev_info(&pci_dev->dev, "TPM found: "
> +		dev_info(&dev->dev, "TPM found: "
>  			 "config base 0x%x, "
>  			 "io base 0x%x, "
>  			 "chip version %02x%02x, "
> @@ -489,67 +461,48 @@ static int __devinit tpm_inf_probe(struc
>  			 "product id %02x%02x"
>  			 "%s\n",
>  			 TPM_INF_ADDR,
> -			 tpm_inf.base,
> +			 TPM_INF_BASE,
>  			 version[0], version[1],
>  			 vendorid[0], vendorid[1],
>  			 productid[0], productid[1], chipname);
> 
> -		rc = tpm_register_hardware(&pci_dev->dev, &tpm_inf);
> -		if (rc < 0)
> -			goto error;
> +		rc = tpm_register_hardware(&dev->dev, &tpm_inf);
> +		if (rc < 0) {
> +			return -ENODEV;
> +		}
>  		return 0;
>  	} else {
> -		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
> -error:
> -		pnp_unregister_driver(&tpm_inf_pnp);
> -error2:
> -		pci_disable_device(pci_dev);
> -		pnp_registered = 0;
> +		dev_info(&dev->dev, "No Infineon TPM found!\n");
>  		return -ENODEV;
>  	}
>  }
> 
> -static __devexit void tpm_inf_remove(struct pci_dev* pci_dev)
> +static __devexit void tpm_inf_pnp_remove(struct pnp_dev *dev)
>  {
> -	struct tpm_chip* chip = pci_get_drvdata(pci_dev);
> -	
> -	if( chip )
> +	struct tpm_chip *chip = pnp_get_drvdata(dev);
> +
> +	if (chip)
>  		tpm_remove_hardware(chip->dev);
>  }
> 
> -static struct pci_device_id tpm_pci_tbl[] __devinitdata = {
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2)},
> -	{0,}
> -};
> -
> -MODULE_DEVICE_TABLE(pci, tpm_pci_tbl);
> -
> -static struct pci_driver inf_pci_driver = {
> -	.name = "tpm_inf",
> -	.id_table = tpm_pci_tbl,
> -	.probe = tpm_inf_probe,
> -	.remove = __devexit_p(tpm_inf_remove),
> -	.suspend = tpm_pm_suspend,
> -	.resume = tpm_pm_resume,
> +static struct pnp_driver tpm_inf_pnp = {
> +	.name = "tpm_inf_pnp",
> +	.driver.owner = THIS_MODULE,
> +	.id_table = tpm_pnp_tbl,
> +	.probe = tpm_inf_pnp_probe,
> +	.remove = tpm_inf_pnp_remove,
> +	.driver.suspend = tpm_pm_suspend,
> +	.driver.resume = tpm_pm_resume,
>  };
> 
>  static int __init init_inf(void)
>  {
> -	return pci_register_driver(&inf_pci_driver);
> +	return pnp_register_driver(&tpm_inf_pnp);
>  }
> 
>  static void __exit cleanup_inf(void)
>  {
> -	if (pnp_registered)
> -		pnp_unregister_driver(&tpm_inf_pnp);
> -	pci_unregister_driver(&inf_pci_driver);
> +	pnp_unregister_driver(&tpm_inf_pnp);
>  }
> 
>  module_init(init_inf);
> @@ -557,5 +510,5 @@ module_exit(cleanup_inf);
> 
>  MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
>  MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
> -MODULE_VERSION("1.5");
> +MODULE_VERSION("1.6");
>  MODULE_LICENSE("GPL");
> 


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-26 17:11 [PATCH] Infineon TPM: move infineon driver off pci_dev Marcel Selhorst
  2005-10-26 17:23 ` Kylene Jo Hall
@ 2005-10-26 17:41 ` matthieu castet
  2005-10-26 19:53   ` Marcel Selhorst
  2005-10-27 11:22   ` Marcel Selhorst
  1 sibling, 2 replies; 17+ messages in thread
From: matthieu castet @ 2005-10-26 17:41 UTC (permalink / raw)
  To: Marcel Selhorst; +Cc: linux-kernel, Andrew Morton, Kylene Jo Hall

Hi,

Marcel Selhorst wrote:
> Dear all,
> 
> the following patch moves the Infineon TPM driver off pci device
> and makes it a pure pnp-driver. It was tested with IFX0101 and
> IFX0102 and is now based on the tpm patchset (1 to 5) from Kylene
> Hall submitted yesterday.
> 
> Best regards,
> 
> Marcel Selhorst
> 
> Signed-off-by: Marcel Selhorst <selhorst@crypto.rub.de>
> ---
> 
> diff -pruN linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c
> linux-2.6.14-rc5.infineon_v1.6/drivers/char/tpm/tpm_infineon.c
> --- linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c	2005-10-26
> 15:21:53.000000000 +0200
> +++ linux-2.6.14-rc5.infineon_v1.6/drivers/char/tpm/tpm_infineon.c	2005-10-26
> 15:21:42.000000000 +0200
> @@ -5,6 +5,7 @@
>   * Specifications at www.trustedcomputinggroup.org
>   *
>   * Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
> + * Sirrix AG - security technologies, http://www.sirrix.com and
>   * Applied Data Security Group, Ruhr-University Bochum, Germany
>   * Project-Homepage: http://www.prosec.rub.de/tpm
>   *
> @@ -31,7 +32,7 @@
>  /* These values will be filled after PnP-call */

> +	/* read IO-ports through PnP */
> +	if (pnp_port_valid(dev, 0) &&
> +	    !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) {
> +		TPM_INF_ADDR = pnp_port_start(dev, 0);
> +		TPM_INF_DATA = (TPM_INF_ADDR + 1);
> +		TPM_INF_BASE = pnp_port_start(dev, 1);
You should add a pnp_port_valid(dev, 1) check.
If you are paranoid, you could also check the port len.

I don't remember if it is done somewhere, but a request_region should be 
used.

The others parts are ok for me.

Matthieu

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-26 17:41 ` matthieu castet
@ 2005-10-26 19:53   ` Marcel Selhorst
  2005-10-27 11:22   ` Marcel Selhorst
  1 sibling, 0 replies; 17+ messages in thread
From: Marcel Selhorst @ 2005-10-26 19:53 UTC (permalink / raw)
  To: matthieu castet; +Cc: linux-kernel, Andrew Morton, Kylene Jo Hall

Hi Matthieu,

>> +    /* read IO-ports through PnP */
>> +    if (pnp_port_valid(dev, 0) &&
>> +        !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) {
>> +        TPM_INF_ADDR = pnp_port_start(dev, 0);
>> +        TPM_INF_DATA = (TPM_INF_ADDR + 1);
>> +        TPM_INF_BASE = pnp_port_start(dev, 1);
> 
> You should add a pnp_port_valid(dev, 1) check.
> If you are paranoid, you could also check the port len.
> 
> I don't remember if it is done somewhere, but a request_region should be
> used.

Thanks for that good hint, I'll take care of that tomorrow
and submit a new patch here.

Marcel Selhorst

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-26 17:41 ` matthieu castet
  2005-10-26 19:53   ` Marcel Selhorst
@ 2005-10-27 11:22   ` Marcel Selhorst
  2005-10-27 14:07     ` Kylene Jo Hall
                       ` (2 more replies)
  1 sibling, 3 replies; 17+ messages in thread
From: Marcel Selhorst @ 2005-10-27 11:22 UTC (permalink / raw)
  To: linux-kernel; +Cc: matthieu castet, Andrew Morton, Kylene Jo Hall

Dear all,

the following patch moves the Infineon TPM driver off pci device
and makes it a pure pnp-driver. It was tested with IFX0101 and
IFX0102 and is now based on the new tpm patchset (1 to 5) from Kylene
Hall submitted two days ago. It now also includes pnp-port validation
and region requesting.

Best regards,

Marcel Selhorst

Signed-off-by: Marcel Selhorst <selhorst@crypto.rub.de>
---

diff -pruN linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c
linux-2.6.14-rc5.infineon-v1.6/drivers/char/tpm/tpm_infineon.c
--- linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c	2005-10-27
13:28:54.000000000 +0200
+++ linux-2.6.14-rc5.infineon-v1.6/drivers/char/tpm/tpm_infineon.c	2005-10-27
13:25:19.000000000 +0200
@@ -5,6 +5,7 @@
  * Specifications at www.trustedcomputinggroup.org
  *
  * Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
+ * Sirrix AG - security technologies, http://www.sirrix.com and
  * Applied Data Security Group, Ruhr-University Bochum, Germany
  * Project-Homepage: http://www.prosec.rub.de/tpm
  *
@@ -31,7 +32,8 @@
 /* These values will be filled after PnP-call */
 static int TPM_INF_DATA = 0;
 static int TPM_INF_ADDR = 0;
-static int pnp_registered = 0;
+static int TPM_INF_BASE = 0;
+static int TPM_INF_PORT_LEN = 0;

 /* TPM header definitions */
 enum infineon_tpm_header {
@@ -143,11 +145,9 @@ static int wait(struct tpm_chip *chip, i
 	}
 	if (i == TPM_MAX_TRIES) {	/* timeout occurs */
 		if (wait_for_bit == STAT_XFE)
-			dev_err(chip->dev,
-				"Timeout in wait(STAT_XFE)\n");
+			dev_err(chip->dev, "Timeout in wait(STAT_XFE)\n");
 		if (wait_for_bit == STAT_RDA)
-			dev_err(chip->dev,
-				"Timeout in wait(STAT_RDA)\n");
+			dev_err(chip->dev, "Timeout in wait(STAT_RDA)\n");
 		return -EIO;
 	}
 	return 0;
@@ -221,8 +221,7 @@ recv_begin:
 		}

 		if ((size == 0x6D00) && (buf[1] == 0x80)) {
-			dev_err(chip->dev,
-				"Error handling on vendor layer!\n");
+			dev_err(chip->dev, "Error handling on vendor layer!\n");
 			return -EIO;
 		}

@@ -318,7 +317,7 @@ static void tpm_inf_cancel(struct tpm_ch

 static u8 tpm_inf_status(struct tpm_chip *chip)
 {
-	return inb(chip->vendor->base + 1);
+	return inb(chip->vendor->base + STAT);
 }

 static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
@@ -362,30 +361,11 @@ static const struct pnp_device_id tpm_pn
 	{"IFX0102", 0},
 	{"", 0}
 };
+
 MODULE_DEVICE_TABLE(pnp, tpm_pnp_tbl);

 static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
-					const struct pnp_device_id *dev_id)
-{
-	if (pnp_port_valid(dev, 0)) {
-		TPM_INF_ADDR = (pnp_port_start(dev, 0) & 0xff);
-		TPM_INF_DATA = ((TPM_INF_ADDR + 1) & 0xff);
-		tpm_inf.base = pnp_port_start(dev, 1);
-		dev_info(&dev->dev, "Found %s with ID %s\n",
-		dev->name, dev_id->id);
-		return 0;
-	}
-	return -ENODEV;
-}
-
-static struct pnp_driver tpm_inf_pnp = {
-	.name = "tpm_inf_pnp",
-	.id_table = tpm_pnp_tbl,
-	.probe = tpm_inf_pnp_probe,
-};
-
-static int __devinit tpm_inf_probe(struct pci_dev *pci_dev,
-				   const struct pci_device_id *pci_id)
+				       const struct pnp_device_id *dev_id)
 {
 	int rc = 0;
 	u8 iol, ioh;
@@ -394,30 +374,28 @@ static int __devinit tpm_inf_probe(struc
 	int productid[2];
 	char chipname[20];

-	rc = pci_enable_device(pci_dev);
-	if (rc)
-		return rc;
-
-	dev_info(&pci_dev->dev, "LPC-bus found at 0x%x\n", pci_id->device);
-
-	/* read IO-ports from PnP */
-	rc = pnp_register_driver(&tpm_inf_pnp);
-	if (rc < 0) {
-		dev_err(&pci_dev->dev,
-			"Error %x from pnp_register_driver!\n",rc);
-		goto error2;
-	}
-	if (!rc) {
-		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
-		goto error;
+	/* read IO-ports through PnP */
+	if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) &&
+	    !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) {
+		TPM_INF_ADDR = pnp_port_start(dev, 0);
+		TPM_INF_DATA = (TPM_INF_ADDR + 1);
+		TPM_INF_BASE = pnp_port_start(dev, 1);
+		TPM_INF_PORT_LEN = pnp_port_len(dev, 1);
+		if (!TPM_INF_PORT_LEN)
+			return -EINVAL;
+		dev_info(&dev->dev, "Found %s with ID %s\n",
+			 dev->name, dev_id->id);
+		if (!((TPM_INF_BASE >> 8) & 0xff))
+			return -EINVAL;
+		/* publish my base address and request region */
+		tpm_inf.base = TPM_INF_BASE;
+		if (request_region
+		    (tpm_inf.base, TPM_INF_PORT_LEN, "tpm_infineon0") == NULL) {
+			release_region(tpm_inf.base, TPM_INF_PORT_LEN);
+			return -EINVAL;
+		}
 	} else {
-		pnp_registered = 1;
-	}
-
-	/* Make sure, we have received valid config ports */
-	if (!TPM_INF_ADDR) {
-		dev_err(&pci_dev->dev, "No valid IO-ports received!\n");
-		goto error;
+		return -EINVAL;
 	}

 	/* query chip for its vendor, its version number a.s.o. */
@@ -449,10 +427,6 @@ static int __devinit tpm_inf_probe(struc

 	if ((vendorid[0] << 8 | vendorid[1]) == (TPM_INFINEON_DEV_VEN_VALUE)) {

-		if (tpm_inf.base == 0) {
-			dev_err(&pci_dev->dev, "No IO-ports found!\n");
-			goto error;
-		}
 		/* configure TPM with IO-ports */
 		outb(IOLIMH, TPM_INF_ADDR);
 		outb(((tpm_inf.base >> 8) & 0xff), TPM_INF_DATA);
@@ -466,10 +440,11 @@ static int __devinit tpm_inf_probe(struc
 		iol = inb(TPM_INF_DATA);

 		if ((ioh << 8 | iol) != tpm_inf.base) {
-			dev_err(&pci_dev->dev,
+			dev_err(&dev->dev,
 				"Could not set IO-ports to %04x\n",
 				tpm_inf.base);
-			goto error;
+			release_region(tpm_inf.base, TPM_INF_PORT_LEN);
+			return -EIO;
 		}

 		/* activate register */
@@ -481,7 +456,7 @@ static int __devinit tpm_inf_probe(struc
 		outb(RESET_LP_IRQC_DISABLE, tpm_inf.base + CMD);

 		/* Finally, we're done, print some infos */
-		dev_info(&pci_dev->dev, "TPM found: "
+		dev_info(&dev->dev, "TPM found: "
 			 "config base 0x%x, "
 			 "io base 0x%x, "
 			 "chip version %02x%02x, "
@@ -489,67 +464,51 @@ static int __devinit tpm_inf_probe(struc
 			 "product id %02x%02x"
 			 "%s\n",
 			 TPM_INF_ADDR,
-			 tpm_inf.base,
+			 TPM_INF_BASE,
 			 version[0], version[1],
 			 vendorid[0], vendorid[1],
 			 productid[0], productid[1], chipname);

-		rc = tpm_register_hardware(&pci_dev->dev, &tpm_inf);
-		if (rc < 0)
-			goto error;
+		rc = tpm_register_hardware(&dev->dev, &tpm_inf);
+		if (rc < 0) {
+			release_region(tpm_inf.base, TPM_INF_PORT_LEN);
+			return -ENODEV;
+		}
 		return 0;
 	} else {
-		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
-error:
-		pnp_unregister_driver(&tpm_inf_pnp);
-error2:
-		pci_disable_device(pci_dev);
-		pnp_registered = 0;
+		dev_info(&dev->dev, "No Infineon TPM found!\n");
 		return -ENODEV;
 	}
 }

-static __devexit void tpm_inf_remove(struct pci_dev* pci_dev)
+static __devexit void tpm_inf_pnp_remove(struct pnp_dev *dev)
 {
-	struct tpm_chip* chip = pci_get_drvdata(pci_dev);
-	
-	if( chip )
+	struct tpm_chip *chip = pnp_get_drvdata(dev);
+
+	if (chip) {
+		release_region(chip->vendor->base, TPM_INF_PORT_LEN);
 		tpm_remove_hardware(chip->dev);
+	}
 }

-static struct pci_device_id tpm_pci_tbl[] __devinitdata = {
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1)},
-	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2)},
-	{0,}
-};
-
-MODULE_DEVICE_TABLE(pci, tpm_pci_tbl);
-
-static struct pci_driver inf_pci_driver = {
-	.name = "tpm_inf",
-	.id_table = tpm_pci_tbl,
-	.probe = tpm_inf_probe,
-	.remove = __devexit_p(tpm_inf_remove),
-	.suspend = tpm_pm_suspend,
-	.resume = tpm_pm_resume,
+static struct pnp_driver tpm_inf_pnp = {
+	.name = "tpm_inf_pnp",
+	.driver.owner = THIS_MODULE,
+	.id_table = tpm_pnp_tbl,
+	.probe = tpm_inf_pnp_probe,
+	.remove = tpm_inf_pnp_remove,
+	.driver.suspend = tpm_pm_suspend,
+	.driver.resume = tpm_pm_resume,
 };

 static int __init init_inf(void)
 {
-	return pci_register_driver(&inf_pci_driver);
+	return pnp_register_driver(&tpm_inf_pnp);
 }

 static void __exit cleanup_inf(void)
 {
-	if (pnp_registered)
-		pnp_unregister_driver(&tpm_inf_pnp);
-	pci_unregister_driver(&inf_pci_driver);
+	pnp_unregister_driver(&tpm_inf_pnp);
 }

 module_init(init_inf);
@@ -557,5 +516,5 @@ module_exit(cleanup_inf);

 MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
 MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
-MODULE_VERSION("1.5");
+MODULE_VERSION("1.6");
 MODULE_LICENSE("GPL");

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-27 11:22   ` Marcel Selhorst
@ 2005-10-27 14:07     ` Kylene Jo Hall
  2005-10-27 21:55       ` Andrew Morton
  2005-10-27 21:33     ` [PATCH] Infineon TPM: move infineon driver off pci_dev Andrew Morton
  2005-10-27 21:42     ` matthieu castet
  2 siblings, 1 reply; 17+ messages in thread
From: Kylene Jo Hall @ 2005-10-27 14:07 UTC (permalink / raw)
  To: Marcel Selhorst; +Cc: linux-kernel, matthieu castet, Andrew Morton

Signed-off-by: Kylene Hall <kjhall@us.ibm.com>

On Thu, 2005-10-27 at 13:22 +0200, Marcel Selhorst wrote:
> Dear all,
> 
> the following patch moves the Infineon TPM driver off pci device
> and makes it a pure pnp-driver. It was tested with IFX0101 and
> IFX0102 and is now based on the new tpm patchset (1 to 5) from Kylene
> Hall submitted two days ago. It now also includes pnp-port validation
> and region requesting.
> 
> Best regards,
> 
> Marcel Selhorst
> 
> Signed-off-by: Marcel Selhorst <selhorst@crypto.rub.de>
> ---
> 
> diff -pruN linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c
> linux-2.6.14-rc5.infineon-v1.6/drivers/char/tpm/tpm_infineon.c
> --- linux-2.6.14-rc5.ibm/drivers/char/tpm/tpm_infineon.c	2005-10-27
> 13:28:54.000000000 +0200
> +++ linux-2.6.14-rc5.infineon-v1.6/drivers/char/tpm/tpm_infineon.c	2005-10-27
> 13:25:19.000000000 +0200
> @@ -5,6 +5,7 @@
>   * Specifications at www.trustedcomputinggroup.org
>   *
>   * Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
> + * Sirrix AG - security technologies, http://www.sirrix.com and
>   * Applied Data Security Group, Ruhr-University Bochum, Germany
>   * Project-Homepage: http://www.prosec.rub.de/tpm
>   *
> @@ -31,7 +32,8 @@
>  /* These values will be filled after PnP-call */
>  static int TPM_INF_DATA = 0;
>  static int TPM_INF_ADDR = 0;
> -static int pnp_registered = 0;
> +static int TPM_INF_BASE = 0;
> +static int TPM_INF_PORT_LEN = 0;
> 
>  /* TPM header definitions */
>  enum infineon_tpm_header {
> @@ -143,11 +145,9 @@ static int wait(struct tpm_chip *chip, i
>  	}
>  	if (i == TPM_MAX_TRIES) {	/* timeout occurs */
>  		if (wait_for_bit == STAT_XFE)
> -			dev_err(chip->dev,
> -				"Timeout in wait(STAT_XFE)\n");
> +			dev_err(chip->dev, "Timeout in wait(STAT_XFE)\n");
>  		if (wait_for_bit == STAT_RDA)
> -			dev_err(chip->dev,
> -				"Timeout in wait(STAT_RDA)\n");
> +			dev_err(chip->dev, "Timeout in wait(STAT_RDA)\n");
>  		return -EIO;
>  	}
>  	return 0;
> @@ -221,8 +221,7 @@ recv_begin:
>  		}
> 
>  		if ((size == 0x6D00) && (buf[1] == 0x80)) {
> -			dev_err(chip->dev,
> -				"Error handling on vendor layer!\n");
> +			dev_err(chip->dev, "Error handling on vendor layer!\n");
>  			return -EIO;
>  		}
> 
> @@ -318,7 +317,7 @@ static void tpm_inf_cancel(struct tpm_ch
> 
>  static u8 tpm_inf_status(struct tpm_chip *chip)
>  {
> -	return inb(chip->vendor->base + 1);
> +	return inb(chip->vendor->base + STAT);
>  }
> 
>  static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
> @@ -362,30 +361,11 @@ static const struct pnp_device_id tpm_pn
>  	{"IFX0102", 0},
>  	{"", 0}
>  };
> +
>  MODULE_DEVICE_TABLE(pnp, tpm_pnp_tbl);
> 
>  static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
> -					const struct pnp_device_id *dev_id)
> -{
> -	if (pnp_port_valid(dev, 0)) {
> -		TPM_INF_ADDR = (pnp_port_start(dev, 0) & 0xff);
> -		TPM_INF_DATA = ((TPM_INF_ADDR + 1) & 0xff);
> -		tpm_inf.base = pnp_port_start(dev, 1);
> -		dev_info(&dev->dev, "Found %s with ID %s\n",
> -		dev->name, dev_id->id);
> -		return 0;
> -	}
> -	return -ENODEV;
> -}
> -
> -static struct pnp_driver tpm_inf_pnp = {
> -	.name = "tpm_inf_pnp",
> -	.id_table = tpm_pnp_tbl,
> -	.probe = tpm_inf_pnp_probe,
> -};
> -
> -static int __devinit tpm_inf_probe(struct pci_dev *pci_dev,
> -				   const struct pci_device_id *pci_id)
> +				       const struct pnp_device_id *dev_id)
>  {
>  	int rc = 0;
>  	u8 iol, ioh;
> @@ -394,30 +374,28 @@ static int __devinit tpm_inf_probe(struc
>  	int productid[2];
>  	char chipname[20];
> 
> -	rc = pci_enable_device(pci_dev);
> -	if (rc)
> -		return rc;
> -
> -	dev_info(&pci_dev->dev, "LPC-bus found at 0x%x\n", pci_id->device);
> -
> -	/* read IO-ports from PnP */
> -	rc = pnp_register_driver(&tpm_inf_pnp);
> -	if (rc < 0) {
> -		dev_err(&pci_dev->dev,
> -			"Error %x from pnp_register_driver!\n",rc);
> -		goto error2;
> -	}
> -	if (!rc) {
> -		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
> -		goto error;
> +	/* read IO-ports through PnP */
> +	if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) &&
> +	    !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) {
> +		TPM_INF_ADDR = pnp_port_start(dev, 0);
> +		TPM_INF_DATA = (TPM_INF_ADDR + 1);
> +		TPM_INF_BASE = pnp_port_start(dev, 1);
> +		TPM_INF_PORT_LEN = pnp_port_len(dev, 1);
> +		if (!TPM_INF_PORT_LEN)
> +			return -EINVAL;
> +		dev_info(&dev->dev, "Found %s with ID %s\n",
> +			 dev->name, dev_id->id);
> +		if (!((TPM_INF_BASE >> 8) & 0xff))
> +			return -EINVAL;
> +		/* publish my base address and request region */
> +		tpm_inf.base = TPM_INF_BASE;
> +		if (request_region
> +		    (tpm_inf.base, TPM_INF_PORT_LEN, "tpm_infineon0") == NULL) {
> +			release_region(tpm_inf.base, TPM_INF_PORT_LEN);
> +			return -EINVAL;
> +		}
>  	} else {
> -		pnp_registered = 1;
> -	}
> -
> -	/* Make sure, we have received valid config ports */
> -	if (!TPM_INF_ADDR) {
> -		dev_err(&pci_dev->dev, "No valid IO-ports received!\n");
> -		goto error;
> +		return -EINVAL;
>  	}
> 
>  	/* query chip for its vendor, its version number a.s.o. */
> @@ -449,10 +427,6 @@ static int __devinit tpm_inf_probe(struc
> 
>  	if ((vendorid[0] << 8 | vendorid[1]) == (TPM_INFINEON_DEV_VEN_VALUE)) {
> 
> -		if (tpm_inf.base == 0) {
> -			dev_err(&pci_dev->dev, "No IO-ports found!\n");
> -			goto error;
> -		}
>  		/* configure TPM with IO-ports */
>  		outb(IOLIMH, TPM_INF_ADDR);
>  		outb(((tpm_inf.base >> 8) & 0xff), TPM_INF_DATA);
> @@ -466,10 +440,11 @@ static int __devinit tpm_inf_probe(struc
>  		iol = inb(TPM_INF_DATA);
> 
>  		if ((ioh << 8 | iol) != tpm_inf.base) {
> -			dev_err(&pci_dev->dev,
> +			dev_err(&dev->dev,
>  				"Could not set IO-ports to %04x\n",
>  				tpm_inf.base);
> -			goto error;
> +			release_region(tpm_inf.base, TPM_INF_PORT_LEN);
> +			return -EIO;
>  		}
> 
>  		/* activate register */
> @@ -481,7 +456,7 @@ static int __devinit tpm_inf_probe(struc
>  		outb(RESET_LP_IRQC_DISABLE, tpm_inf.base + CMD);
> 
>  		/* Finally, we're done, print some infos */
> -		dev_info(&pci_dev->dev, "TPM found: "
> +		dev_info(&dev->dev, "TPM found: "
>  			 "config base 0x%x, "
>  			 "io base 0x%x, "
>  			 "chip version %02x%02x, "
> @@ -489,67 +464,51 @@ static int __devinit tpm_inf_probe(struc
>  			 "product id %02x%02x"
>  			 "%s\n",
>  			 TPM_INF_ADDR,
> -			 tpm_inf.base,
> +			 TPM_INF_BASE,
>  			 version[0], version[1],
>  			 vendorid[0], vendorid[1],
>  			 productid[0], productid[1], chipname);
> 
> -		rc = tpm_register_hardware(&pci_dev->dev, &tpm_inf);
> -		if (rc < 0)
> -			goto error;
> +		rc = tpm_register_hardware(&dev->dev, &tpm_inf);
> +		if (rc < 0) {
> +			release_region(tpm_inf.base, TPM_INF_PORT_LEN);
> +			return -ENODEV;
> +		}
>  		return 0;
>  	} else {
> -		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
> -error:
> -		pnp_unregister_driver(&tpm_inf_pnp);
> -error2:
> -		pci_disable_device(pci_dev);
> -		pnp_registered = 0;
> +		dev_info(&dev->dev, "No Infineon TPM found!\n");
>  		return -ENODEV;
>  	}
>  }
> 
> -static __devexit void tpm_inf_remove(struct pci_dev* pci_dev)
> +static __devexit void tpm_inf_pnp_remove(struct pnp_dev *dev)
>  {
> -	struct tpm_chip* chip = pci_get_drvdata(pci_dev);
> -	
> -	if( chip )
> +	struct tpm_chip *chip = pnp_get_drvdata(dev);
> +
> +	if (chip) {
> +		release_region(chip->vendor->base, TPM_INF_PORT_LEN);
>  		tpm_remove_hardware(chip->dev);
> +	}
>  }
> 
> -static struct pci_device_id tpm_pci_tbl[] __devinitdata = {
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1)},
> -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2)},
> -	{0,}
> -};
> -
> -MODULE_DEVICE_TABLE(pci, tpm_pci_tbl);
> -
> -static struct pci_driver inf_pci_driver = {
> -	.name = "tpm_inf",
> -	.id_table = tpm_pci_tbl,
> -	.probe = tpm_inf_probe,
> -	.remove = __devexit_p(tpm_inf_remove),
> -	.suspend = tpm_pm_suspend,
> -	.resume = tpm_pm_resume,
> +static struct pnp_driver tpm_inf_pnp = {
> +	.name = "tpm_inf_pnp",
> +	.driver.owner = THIS_MODULE,
> +	.id_table = tpm_pnp_tbl,
> +	.probe = tpm_inf_pnp_probe,
> +	.remove = tpm_inf_pnp_remove,
> +	.driver.suspend = tpm_pm_suspend,
> +	.driver.resume = tpm_pm_resume,
>  };
> 
>  static int __init init_inf(void)
>  {
> -	return pci_register_driver(&inf_pci_driver);
> +	return pnp_register_driver(&tpm_inf_pnp);
>  }
> 
>  static void __exit cleanup_inf(void)
>  {
> -	if (pnp_registered)
> -		pnp_unregister_driver(&tpm_inf_pnp);
> -	pci_unregister_driver(&inf_pci_driver);
> +	pnp_unregister_driver(&tpm_inf_pnp);
>  }
> 
>  module_init(init_inf);
> @@ -557,5 +516,5 @@ module_exit(cleanup_inf);
> 
>  MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
>  MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
> -MODULE_VERSION("1.5");
> +MODULE_VERSION("1.6");
>  MODULE_LICENSE("GPL");
> 


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-27 11:22   ` Marcel Selhorst
  2005-10-27 14:07     ` Kylene Jo Hall
@ 2005-10-27 21:33     ` Andrew Morton
  2005-10-28  5:23       ` Marcel Selhorst
  2005-10-27 21:42     ` matthieu castet
  2 siblings, 1 reply; 17+ messages in thread
From: Andrew Morton @ 2005-10-27 21:33 UTC (permalink / raw)
  To: Marcel Selhorst; +Cc: linux-kernel, castet.matthieu, kjhall

Marcel Selhorst <selhorst@crypto.rub.de> wrote:
>
> @@ -489,67 +464,51 @@ static int __devinit tpm_inf_probe(struc
>  			 "product id %02x%02x"
>  			 "%s\n",
>  			 TPM_INF_ADDR,
> -			 tpm_inf.base,
> +			 TPM_INF_BASE,
>  			 version[0], version[1],
>  			 vendorid[0], vendorid[1],
>  			 productid[0], productid[1], chipname);
> 
> -		rc = tpm_register_hardware(&pci_dev->dev, &tpm_inf);
> -		if (rc < 0)
> -			goto error;
> +		rc = tpm_register_hardware(&dev->dev, &tpm_inf);
> +		if (rc < 0) {
> +			release_region(tpm_inf.base, TPM_INF_PORT_LEN);
> +			return -ENODEV;
> +		}
>  		return 0;
>  	} else {
> -		dev_info(&pci_dev->dev, "No Infineon TPM found!\n");
> -error:
> -		pnp_unregister_driver(&tpm_inf_pnp);
> -error2:
> -		pci_disable_device(pci_dev);
> -		pnp_registered = 0;
> +		dev_info(&dev->dev, "No Infineon TPM found!\n");
>  		return -ENODEV;
>  	}
>  }

This final return will leak the I/O region from request_region().

To reduce the chance of this happening again, please send a followup patch
which prevents this function from having `return' statements sprinkled all
over it.  An example would be drivers/net/8139cp.c:cp_init_one(), thanks.

If for some reason the leak is deliberate then a comment is needed.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-27 11:22   ` Marcel Selhorst
  2005-10-27 14:07     ` Kylene Jo Hall
  2005-10-27 21:33     ` [PATCH] Infineon TPM: move infineon driver off pci_dev Andrew Morton
@ 2005-10-27 21:42     ` matthieu castet
  2 siblings, 0 replies; 17+ messages in thread
From: matthieu castet @ 2005-10-27 21:42 UTC (permalink / raw)
  To: Marcel Selhorst; +Cc: linux-kernel, Andrew Morton, Kylene Jo Hall

Hi,

Marcel Selhorst wrote:
 > Dear all,
 >
 > the following patch moves the Infineon TPM driver off pci device
 > and makes it a pure pnp-driver. It was tested with IFX0101 and
 > IFX0102 and is now based on the new tpm patchset (1 to 5) from Kylene
 > Hall submitted two days ago. It now also includes pnp-port validation
 > and region requesting.
 >
 > Best regards,
 >
 > Marcel Selhorst
 >
 > Signed-off-by: Marcel Selhorst <selhorst@crypto.rub.de>
 > ---
 >

 > +	/* read IO-ports through PnP */
 > +	if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) &&
 > +	    !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) {
&& !(pnp_port_flags(dev, 1) & IORESOURCE_DISABLED)

 > +		TPM_INF_ADDR = pnp_port_start(dev, 0);
 > +		TPM_INF_DATA = (TPM_INF_ADDR + 1);
 > +		TPM_INF_BASE = pnp_port_start(dev, 1);
 > +		TPM_INF_PORT_LEN = pnp_port_len(dev, 1);
 > +		if (!TPM_INF_PORT_LEN)
 > +			return -EINVAL;
When I said to check the lenght I was thinking about
if (pnp_port_len(dev, 1) < 4) return -EINVAL;
According to infineon_tpm_register, the length is at least 4.

I whould also check that pnp_port_len(dev, 0) < 2.





 > +		dev_info(&dev->dev, "Found %s with ID %s\n",
 > +			 dev->name, dev_id->id);
 > +		if (!((TPM_INF_BASE >> 8) & 0xff))
 > +			return -EINVAL;
 > +		/* publish my base address and request region */
 > +		tpm_inf.base = TPM_INF_BASE;
 > +		if (request_region
 > +		    (tpm_inf.base, TPM_INF_PORT_LEN, "tpm_infineon0") == NULL) {
 > +			release_region(tpm_inf.base, TPM_INF_PORT_LEN);
if it failed, you don't need to release the region

a request_region (TPM_INF_ADDR, 2, "tpm_infineon0") could be usefull.

 > +			return -EINVAL;
 > +		}
 >  	} else {


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-27 14:07     ` Kylene Jo Hall
@ 2005-10-27 21:55       ` Andrew Morton
  2005-10-27 22:03         ` Roland Dreier
  2005-11-11 20:11         ` [PATCH] TPM: cleanups Kylene Jo Hall
  0 siblings, 2 replies; 17+ messages in thread
From: Andrew Morton @ 2005-10-27 21:55 UTC (permalink / raw)
  To: Kylene Jo Hall; +Cc: selhorst, linux-kernel, castet.matthieu


Have just taken a wander through the TPM driver.  I couldn't help myself - are
you OK with the below trivial changes?

Other things:

a)

ssize_t tpm_read(struct file * file, char __user *buf,
		 size_t size, loff_t * off)
{
	struct tpm_chip *chip = file->private_data;
	int ret_size;

	del_singleshot_timer_sync(&chip->user_read_timer);
	ret_size = atomic_read(&chip->data_pending);
	atomic_set(&chip->data_pending, 0);
	if (ret_size > 0) {	/* relay data */
		if (size < ret_size)
			ret_size = size;

		down(&chip->buffer_mutex);
		if (copy_to_user
		    ((void __user *) buf, chip->data_buffer, ret_size))
			ret_size = -EFAULT;

Why is the first arg to copy_to_user() typecast in this manner?  I don't
think the cast needs to be there?


b) user_reader_timeout does down() from within a timer handler!  That's
   deadlocky and is illegal - timer handlers are run from interrupt
   context.

   This should have generated a storm of runtime warnings if tested with
   CONFIG_PREEMPT and CONFIG_DEBUG_SPINLOCK_SLEEP.  Developers really should
   enable all the kernel debug options during development - they find bugs.

   Suggest you convert this to using schedule_work() or
   schedule_delayed_work(). 

c) In tpm_remove_hardware():

	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &= !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));

   Is that `!' supposed to be there?   Looks odd.

d) How did this happen?

   int tpm_pm_suspend(struct device *dev, pm_message_t pm_state, u32 level)

   device_driver.suspend() only takes two arguments nowadays.


e)

	int tpm_pm_resume(struct device *dev, u32 level)

   Ditto



diff -puN drivers/char/tpm/tpm_atmel.c~tpm-tidies drivers/char/tpm/tpm_atmel.c
--- 25/drivers/char/tpm/tpm_atmel.c~tpm-tidies	Thu Oct 27 14:52:43 2005
+++ 25-akpm/drivers/char/tpm/tpm_atmel.c	Thu Oct 27 14:52:43 2005
@@ -40,7 +40,7 @@ enum tpm_atmel_read_status {
 	ATML_STATUS_READY = 0x08
 };
 
-static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
+static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
 {
 	u8 status, *hdr = buf;
 	u32 size;
@@ -100,7 +100,7 @@ static int tpm_atml_recv(struct tpm_chip
 	return size;
 }
 
-static int tpm_atml_send(struct tpm_chip *chip, u8 * buf, size_t count)
+static int tpm_atml_send(struct tpm_chip *chip, u8  *buf, size_t count)
 {
 	int i;
 
@@ -159,12 +159,12 @@ static struct tpm_vendor_specific tpm_at
 	.miscdev = { .fops = &atmel_ops, },
 };
 
-static struct platform_device *pdev = NULL;
+static struct platform_device *pdev;
 
 static void __devexit tpm_atml_remove(struct device *dev)
 {
 	struct tpm_chip *chip = dev_get_drvdata(dev);
-	if ( chip ) {
+	if (chip) {
 		release_region(chip->vendor->base, 2);
 		tpm_remove_hardware(chip->dev);
 	}
@@ -201,19 +201,17 @@ static int __init init_atmel(void)
 		(tpm_read_index(TPM_ADDR, 0x01) != 0x01 ))
 		return -ENODEV;
 
-	pdev = kmalloc(sizeof(struct platform_device), GFP_KERNEL);
+	pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
 	if ( !pdev )
 		return -ENOMEM;
 
-	memset(pdev, 0, sizeof(struct platform_device));
-
 	pdev->name = "tpm_atmel0";
 	pdev->id = -1;
 	pdev->num_resources = 0;
 	pdev->dev.release = tpm_atml_remove;
 	pdev->dev.driver = &atml_drv;
 
-	if ((rc=platform_device_register(pdev)) < 0) {
+	if ((rc = platform_device_register(pdev)) < 0) {
 		kfree(pdev);
 		pdev = NULL;
 		return rc;
@@ -234,7 +232,8 @@ static int __init init_atmel(void)
 		return rc;
 	}
 
-	dev_info(&pdev->dev, "Atmel TPM 1.1, Base Address: 0x%x\n", tpm_atmel.base);
+	dev_info(&pdev->dev, "Atmel TPM 1.1, Base Address: 0x%x\n",
+			tpm_atmel.base);
 	return 0;
 }
 
diff -puN drivers/char/tpm/tpm.c~tpm-tidies drivers/char/tpm/tpm.c
--- 25/drivers/char/tpm/tpm.c~tpm-tidies	Thu Oct 27 14:52:43 2005
+++ 25-akpm/drivers/char/tpm/tpm.c	Thu Oct 27 14:52:43 2005
@@ -162,7 +162,8 @@ ssize_t tpm_show_pcrs(struct device *dev
 		    < READ_PCR_RESULT_SIZE){
 			dev_dbg(chip->dev, "A TPM error (%d) occurred"
 				" attempting to read PCR %d of %d\n",
-				be32_to_cpu(*((__be32 *) (data + 6))), i, num_pcrs);
+				be32_to_cpu(*((__be32 *) (data + 6))),
+				i, num_pcrs);
 			goto out;
 		}
 		str += sprintf(str, "PCR-%02d: ", i);
@@ -194,12 +195,11 @@ ssize_t tpm_show_pubek(struct device *de
 	if (chip == NULL)
 		return -ENODEV;
 
-	data = kmalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
+	data = kxalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
 
 	memcpy(data, readpubek, sizeof(readpubek));
-	memset(data + sizeof(readpubek), 0, 20);	/* zero nonce */
 
 	if ((len = tpm_transmit(chip, data, READ_PUBEK_RESULT_SIZE)) <
 	    READ_PUBEK_RESULT_SIZE) {
@@ -243,7 +243,6 @@ out:
 	kfree(data);
 	return rc;
 }
-
 EXPORT_SYMBOL_GPL(tpm_show_pubek);
 
 #define CAP_VER_RESULT_SIZE 18
@@ -312,7 +311,6 @@ ssize_t tpm_store_cancel(struct device *
 }
 EXPORT_SYMBOL_GPL(tpm_store_cancel);
 
-
 /*
  * Device file system interface to the TPM
  */
@@ -336,8 +334,7 @@ int tpm_open(struct inode *inode, struct
 	}
 
 	if (chip->num_opens) {
-		dev_dbg(chip->dev,
-			"Another process owns this TPM\n");
+		dev_dbg(chip->dev, "Another process owns this TPM\n");
 		rc = -EBUSY;
 		goto err_out;
 	}
@@ -363,7 +360,6 @@ err_out:
 	spin_unlock(&driver_lock);
 	return rc;
 }
-
 EXPORT_SYMBOL_GPL(tpm_open);
 
 int tpm_release(struct inode *inode, struct file *file)
@@ -380,10 +376,9 @@ int tpm_release(struct inode *inode, str
 	spin_unlock(&driver_lock);
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(tpm_release);
 
-ssize_t tpm_write(struct file * file, const char __user * buf,
+ssize_t tpm_write(struct file * file, const char __user *buf,
 		  size_t size, loff_t * off)
 {
 	struct tpm_chip *chip = file->private_data;
@@ -419,7 +414,7 @@ ssize_t tpm_write(struct file * file, co
 
 EXPORT_SYMBOL_GPL(tpm_write);
 
-ssize_t tpm_read(struct file * file, char __user * buf,
+ssize_t tpm_read(struct file * file, char __user *buf,
 		 size_t size, loff_t * off)
 {
 	struct tpm_chip *chip = file->private_data;
@@ -441,7 +436,6 @@ ssize_t tpm_read(struct file * file, cha
 
 	return ret_size;
 }
-
 EXPORT_SYMBOL_GPL(tpm_read);
 
 void tpm_remove_hardware(struct device *dev)
@@ -465,13 +459,13 @@ void tpm_remove_hardware(struct device *
 
 	sysfs_remove_group(&dev->kobj, chip->vendor->attr_group);
 
-	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &= !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
+	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &=
+		!(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
 
 	kfree(chip);
 
 	put_device(dev);
 }
-
 EXPORT_SYMBOL_GPL(tpm_remove_hardware);
 
 static u8 savestate[] = {
@@ -493,7 +487,6 @@ int tpm_pm_suspend(struct device *dev, p
 	tpm_transmit(chip, savestate, sizeof(savestate));
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(tpm_pm_suspend);
 
 /*
@@ -509,7 +502,6 @@ int tpm_pm_resume(struct device *dev, u3
 
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(tpm_pm_resume);
 
 /*
@@ -519,8 +511,7 @@ EXPORT_SYMBOL_GPL(tpm_pm_resume);
  * upon errant exit from this function specific probe function should call
  * pci_disable_device
  */
-int tpm_register_hardware(struct device *dev,
-			  struct tpm_vendor_specific *entry)
+int tpm_register_hardware(struct device *dev, struct tpm_vendor_specific *entry)
 {
 #define DEVNAME_SIZE 7
 
@@ -529,12 +520,10 @@ int tpm_register_hardware(struct device 
 	int i, j;
 
 	/* Driver specific per-device data */
-	chip = kmalloc(sizeof(*chip), GFP_KERNEL);
+	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
 	if (chip == NULL)
 		return -ENOMEM;
 
-	memset(chip, 0, sizeof(struct tpm_chip));
-
 	init_MUTEX(&chip->buffer_mutex);
 	init_MUTEX(&chip->tpm_mutex);
 	INIT_LIST_HEAD(&chip->list);
@@ -558,8 +547,7 @@ int tpm_register_hardware(struct device 
 
 dev_num_search_complete:
 	if (chip->dev_num < 0) {
-		dev_err(dev,
-			"No available tpm device numbers\n");
+		dev_err(dev, "No available tpm device numbers\n");
 		kfree(chip);
 		return -ENODEV;
 	} else if (chip->dev_num == 0)
@@ -597,7 +585,6 @@ dev_num_search_complete:
 
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(tpm_register_hardware);
 
 MODULE_AUTHOR("Leendert van Doorn (leendert@watson.ibm.com)");
diff -puN drivers/char/tpm/tpm_infineon.c~tpm-tidies drivers/char/tpm/tpm_infineon.c
--- 25/drivers/char/tpm/tpm_infineon.c~tpm-tidies	Thu Oct 27 14:52:43 2005
+++ 25-akpm/drivers/char/tpm/tpm_infineon.c	Thu Oct 27 14:52:43 2005
@@ -30,10 +30,10 @@
 #define	TPM_INFINEON_DEV_VEN_VALUE	0x15D1
 
 /* These values will be filled after PnP-call */
-static int TPM_INF_DATA = 0;
-static int TPM_INF_ADDR = 0;
-static int TPM_INF_BASE = 0;
-static int TPM_INF_PORT_LEN = 0;
+static int TPM_INF_DATA;
+static int TPM_INF_ADDR;
+static int TPM_INF_BASE;
+static int TPM_INF_PORT_LEN;
 
 /* TPM header definitions */
 enum infineon_tpm_header {
_


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-27 21:55       ` Andrew Morton
@ 2005-10-27 22:03         ` Roland Dreier
  2005-10-27 22:26           ` Andrew Morton
  2005-11-11 20:11         ` [PATCH] TPM: cleanups Kylene Jo Hall
  1 sibling, 1 reply; 17+ messages in thread
From: Roland Dreier @ 2005-10-27 22:03 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Kylene Jo Hall, selhorst, linux-kernel, castet.matthieu

Andrew, a few comments on your trivial comments:

    > -static int tpm_atml_send(struct tpm_chip *chip, u8 * buf, size_t count)
    > +static int tpm_atml_send(struct tpm_chip *chip, u8  *buf, size_t count)

There's still an extra space there I think.

    > -	data = kmalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
    > +	data = kxalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);

When did we add kxalloc()?  And what does it do?

    > -ssize_t tpm_write(struct file * file, const char __user * buf,
    > +ssize_t tpm_write(struct file * file, const char __user *buf,

Why delete one space between * and buf but not the one between * and file?

 - R.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-27 22:03         ` Roland Dreier
@ 2005-10-27 22:26           ` Andrew Morton
  2005-10-28 14:22             ` Kylene Jo Hall
  0 siblings, 1 reply; 17+ messages in thread
From: Andrew Morton @ 2005-10-27 22:26 UTC (permalink / raw)
  To: Roland Dreier; +Cc: kjhall, selhorst, linux-kernel, castet.matthieu

Roland Dreier <rolandd@cisco.com> wrote:
>
> Andrew, a few comments on your trivial comments:
> 
>     > -static int tpm_atml_send(struct tpm_chip *chip, u8 * buf, size_t count)
>     > +static int tpm_atml_send(struct tpm_chip *chip, u8  *buf, size_t count)
> 
> There's still an extra space there I think.

yup.

>     > -	data = kmalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
>     > +	data = kxalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
> 
> When did we add kxalloc()?  And what does it do?

I type with my heels.

>     > -ssize_t tpm_write(struct file * file, const char __user * buf,
>     > +ssize_t tpm_write(struct file * file, const char __user *buf,
> 
> Why delete one space between * and buf but not the one between * and file?


diff -puN drivers/char/tpm/tpm_atmel.c~tpm-tidies drivers/char/tpm/tpm_atmel.c
--- 25/drivers/char/tpm/tpm_atmel.c~tpm-tidies	Thu Oct 27 14:52:43 2005
+++ 25-akpm/drivers/char/tpm/tpm_atmel.c	Thu Oct 27 14:52:43 2005
@@ -40,7 +40,7 @@ enum tpm_atmel_read_status {
 	ATML_STATUS_READY = 0x08
 };
 
-static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
+static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
 {
 	u8 status, *hdr = buf;
 	u32 size;
@@ -100,7 +100,7 @@ static int tpm_atml_recv(struct tpm_chip
 	return size;
 }
 
-static int tpm_atml_send(struct tpm_chip *chip, u8 * buf, size_t count)
+static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
 {
 	int i;
 
@@ -159,12 +159,12 @@ static struct tpm_vendor_specific tpm_at
 	.miscdev = { .fops = &atmel_ops, },
 };
 
-static struct platform_device *pdev = NULL;
+static struct platform_device *pdev;
 
 static void __devexit tpm_atml_remove(struct device *dev)
 {
 	struct tpm_chip *chip = dev_get_drvdata(dev);
-	if ( chip ) {
+	if (chip) {
 		release_region(chip->vendor->base, 2);
 		tpm_remove_hardware(chip->dev);
 	}
@@ -201,19 +201,17 @@ static int __init init_atmel(void)
 		(tpm_read_index(TPM_ADDR, 0x01) != 0x01 ))
 		return -ENODEV;
 
-	pdev = kmalloc(sizeof(struct platform_device), GFP_KERNEL);
+	pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
 	if ( !pdev )
 		return -ENOMEM;
 
-	memset(pdev, 0, sizeof(struct platform_device));
-
 	pdev->name = "tpm_atmel0";
 	pdev->id = -1;
 	pdev->num_resources = 0;
 	pdev->dev.release = tpm_atml_remove;
 	pdev->dev.driver = &atml_drv;
 
-	if ((rc=platform_device_register(pdev)) < 0) {
+	if ((rc = platform_device_register(pdev)) < 0) {
 		kfree(pdev);
 		pdev = NULL;
 		return rc;
@@ -234,7 +232,8 @@ static int __init init_atmel(void)
 		return rc;
 	}
 
-	dev_info(&pdev->dev, "Atmel TPM 1.1, Base Address: 0x%x\n", tpm_atmel.base);
+	dev_info(&pdev->dev, "Atmel TPM 1.1, Base Address: 0x%x\n",
+			tpm_atmel.base);
 	return 0;
 }
 
diff -puN drivers/char/tpm/tpm.c~tpm-tidies drivers/char/tpm/tpm.c
--- 25/drivers/char/tpm/tpm.c~tpm-tidies	Thu Oct 27 14:52:43 2005
+++ 25-akpm/drivers/char/tpm/tpm.c	Thu Oct 27 14:52:43 2005
@@ -162,7 +162,8 @@ ssize_t tpm_show_pcrs(struct device *dev
 		    < READ_PCR_RESULT_SIZE){
 			dev_dbg(chip->dev, "A TPM error (%d) occurred"
 				" attempting to read PCR %d of %d\n",
-				be32_to_cpu(*((__be32 *) (data + 6))), i, num_pcrs);
+				be32_to_cpu(*((__be32 *) (data + 6))),
+				i, num_pcrs);
 			goto out;
 		}
 		str += sprintf(str, "PCR-%02d: ", i);
@@ -194,12 +195,11 @@ ssize_t tpm_show_pubek(struct device *de
 	if (chip == NULL)
 		return -ENODEV;
 
-	data = kmalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
+	data = kzalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
 
 	memcpy(data, readpubek, sizeof(readpubek));
-	memset(data + sizeof(readpubek), 0, 20);	/* zero nonce */
 
 	if ((len = tpm_transmit(chip, data, READ_PUBEK_RESULT_SIZE)) <
 	    READ_PUBEK_RESULT_SIZE) {
@@ -243,7 +243,6 @@ out:
 	kfree(data);
 	return rc;
 }
-
 EXPORT_SYMBOL_GPL(tpm_show_pubek);
 
 #define CAP_VER_RESULT_SIZE 18
@@ -312,7 +311,6 @@ ssize_t tpm_store_cancel(struct device *
 }
 EXPORT_SYMBOL_GPL(tpm_store_cancel);
 
-
 /*
  * Device file system interface to the TPM
  */
@@ -336,8 +334,7 @@ int tpm_open(struct inode *inode, struct
 	}
 
 	if (chip->num_opens) {
-		dev_dbg(chip->dev,
-			"Another process owns this TPM\n");
+		dev_dbg(chip->dev, "Another process owns this TPM\n");
 		rc = -EBUSY;
 		goto err_out;
 	}
@@ -363,7 +360,6 @@ err_out:
 	spin_unlock(&driver_lock);
 	return rc;
 }
-
 EXPORT_SYMBOL_GPL(tpm_open);
 
 int tpm_release(struct inode *inode, struct file *file)
@@ -380,10 +376,9 @@ int tpm_release(struct inode *inode, str
 	spin_unlock(&driver_lock);
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(tpm_release);
 
-ssize_t tpm_write(struct file * file, const char __user * buf,
+ssize_t tpm_write(struct file *file, const char __user *buf,
 		  size_t size, loff_t * off)
 {
 	struct tpm_chip *chip = file->private_data;
@@ -419,7 +414,7 @@ ssize_t tpm_write(struct file * file, co
 
 EXPORT_SYMBOL_GPL(tpm_write);
 
-ssize_t tpm_read(struct file * file, char __user * buf,
+ssize_t tpm_read(struct file * file, char __user *buf,
 		 size_t size, loff_t * off)
 {
 	struct tpm_chip *chip = file->private_data;
@@ -441,7 +436,6 @@ ssize_t tpm_read(struct file * file, cha
 
 	return ret_size;
 }
-
 EXPORT_SYMBOL_GPL(tpm_read);
 
 void tpm_remove_hardware(struct device *dev)
@@ -465,13 +459,13 @@ void tpm_remove_hardware(struct device *
 
 	sysfs_remove_group(&dev->kobj, chip->vendor->attr_group);
 
-	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &= !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
+	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &=
+		!(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
 
 	kfree(chip);
 
 	put_device(dev);
 }
-
 EXPORT_SYMBOL_GPL(tpm_remove_hardware);
 
 static u8 savestate[] = {
@@ -493,7 +487,6 @@ int tpm_pm_suspend(struct device *dev, p
 	tpm_transmit(chip, savestate, sizeof(savestate));
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(tpm_pm_suspend);
 
 /*
@@ -509,7 +502,6 @@ int tpm_pm_resume(struct device *dev, u3
 
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(tpm_pm_resume);
 
 /*
@@ -519,8 +511,7 @@ EXPORT_SYMBOL_GPL(tpm_pm_resume);
  * upon errant exit from this function specific probe function should call
  * pci_disable_device
  */
-int tpm_register_hardware(struct device *dev,
-			  struct tpm_vendor_specific *entry)
+int tpm_register_hardware(struct device *dev, struct tpm_vendor_specific *entry)
 {
 #define DEVNAME_SIZE 7
 
@@ -529,12 +520,10 @@ int tpm_register_hardware(struct device 
 	int i, j;
 
 	/* Driver specific per-device data */
-	chip = kmalloc(sizeof(*chip), GFP_KERNEL);
+	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
 	if (chip == NULL)
 		return -ENOMEM;
 
-	memset(chip, 0, sizeof(struct tpm_chip));
-
 	init_MUTEX(&chip->buffer_mutex);
 	init_MUTEX(&chip->tpm_mutex);
 	INIT_LIST_HEAD(&chip->list);
@@ -558,8 +547,7 @@ int tpm_register_hardware(struct device 
 
 dev_num_search_complete:
 	if (chip->dev_num < 0) {
-		dev_err(dev,
-			"No available tpm device numbers\n");
+		dev_err(dev, "No available tpm device numbers\n");
 		kfree(chip);
 		return -ENODEV;
 	} else if (chip->dev_num == 0)
@@ -597,7 +585,6 @@ dev_num_search_complete:
 
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(tpm_register_hardware);
 
 MODULE_AUTHOR("Leendert van Doorn (leendert@watson.ibm.com)");
diff -puN drivers/char/tpm/tpm_infineon.c~tpm-tidies drivers/char/tpm/tpm_infineon.c
--- 25/drivers/char/tpm/tpm_infineon.c~tpm-tidies	Thu Oct 27 14:52:43 2005
+++ 25-akpm/drivers/char/tpm/tpm_infineon.c	Thu Oct 27 14:52:43 2005
@@ -30,10 +30,10 @@
 #define	TPM_INFINEON_DEV_VEN_VALUE	0x15D1
 
 /* These values will be filled after PnP-call */
-static int TPM_INF_DATA = 0;
-static int TPM_INF_ADDR = 0;
-static int TPM_INF_BASE = 0;
-static int TPM_INF_PORT_LEN = 0;
+static int TPM_INF_DATA;
+static int TPM_INF_ADDR;
+static int TPM_INF_BASE;
+static int TPM_INF_PORT_LEN;
 
 /* TPM header definitions */
 enum infineon_tpm_header {
_


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-27 21:33     ` [PATCH] Infineon TPM: move infineon driver off pci_dev Andrew Morton
@ 2005-10-28  5:23       ` Marcel Selhorst
  0 siblings, 0 replies; 17+ messages in thread
From: Marcel Selhorst @ 2005-10-28  5:23 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel, castet.matthieu, kjhall

Hi Andrew,

> This final return will leak the I/O region from request_region().
> If for some reason the leak is deliberate then a comment is needed.

yep, you're right, I'll fix that

> To reduce the chance of this happening again, please send a followup patch
> which prevents this function from having `return' statements sprinkled all
> over it.  An example would be drivers/net/8139cp.c:cp_init_one(), thanks.

I will send a follow-up patch including the comments of Matthieu.

Thanks for reviewing!

Marcel

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] Infineon TPM: move infineon driver off pci_dev
  2005-10-27 22:26           ` Andrew Morton
@ 2005-10-28 14:22             ` Kylene Jo Hall
  0 siblings, 0 replies; 17+ messages in thread
From: Kylene Jo Hall @ 2005-10-28 14:22 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Roland Dreier, Marcel Selhorst, linux-kernel, castet.matthieu

Acked-by: Kylene Hall <kjhall@us.ibm.com>

On Thu, 2005-10-27 at 15:26 -0700, Andrew Morton wrote:
> Roland Dreier <rolandd@cisco.com> wrote:
> >
> > Andrew, a few comments on your trivial comments:
> > 
> >     > -static int tpm_atml_send(struct tpm_chip *chip, u8 * buf, size_t count)
> >     > +static int tpm_atml_send(struct tpm_chip *chip, u8  *buf, size_t count)
> > 
> > There's still an extra space there I think.
> 
> yup.
> 
> >     > -	data = kmalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
> >     > +	data = kxalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
> > 
> > When did we add kxalloc()?  And what does it do?
> 
> I type with my heels.
> 
> >     > -ssize_t tpm_write(struct file * file, const char __user * buf,
> >     > +ssize_t tpm_write(struct file * file, const char __user *buf,
> > 
> > Why delete one space between * and buf but not the one between * and file?
> 
> 
> diff -puN drivers/char/tpm/tpm_atmel.c~tpm-tidies drivers/char/tpm/tpm_atmel.c
> --- 25/drivers/char/tpm/tpm_atmel.c~tpm-tidies	Thu Oct 27 14:52:43 2005
> +++ 25-akpm/drivers/char/tpm/tpm_atmel.c	Thu Oct 27 14:52:43 2005
> @@ -40,7 +40,7 @@ enum tpm_atmel_read_status {
>  	ATML_STATUS_READY = 0x08
>  };
>  
> -static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
> +static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
>  {
>  	u8 status, *hdr = buf;
>  	u32 size;
> @@ -100,7 +100,7 @@ static int tpm_atml_recv(struct tpm_chip
>  	return size;
>  }
>  
> -static int tpm_atml_send(struct tpm_chip *chip, u8 * buf, size_t count)
> +static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
>  {
>  	int i;
>  
> @@ -159,12 +159,12 @@ static struct tpm_vendor_specific tpm_at
>  	.miscdev = { .fops = &atmel_ops, },
>  };
>  
> -static struct platform_device *pdev = NULL;
> +static struct platform_device *pdev;
>  
>  static void __devexit tpm_atml_remove(struct device *dev)
>  {
>  	struct tpm_chip *chip = dev_get_drvdata(dev);
> -	if ( chip ) {
> +	if (chip) {
>  		release_region(chip->vendor->base, 2);
>  		tpm_remove_hardware(chip->dev);
>  	}
> @@ -201,19 +201,17 @@ static int __init init_atmel(void)
>  		(tpm_read_index(TPM_ADDR, 0x01) != 0x01 ))
>  		return -ENODEV;
>  
> -	pdev = kmalloc(sizeof(struct platform_device), GFP_KERNEL);
> +	pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
>  	if ( !pdev )
>  		return -ENOMEM;
>  
> -	memset(pdev, 0, sizeof(struct platform_device));
> -
>  	pdev->name = "tpm_atmel0";
>  	pdev->id = -1;
>  	pdev->num_resources = 0;
>  	pdev->dev.release = tpm_atml_remove;
>  	pdev->dev.driver = &atml_drv;
>  
> -	if ((rc=platform_device_register(pdev)) < 0) {
> +	if ((rc = platform_device_register(pdev)) < 0) {
>  		kfree(pdev);
>  		pdev = NULL;
>  		return rc;
> @@ -234,7 +232,8 @@ static int __init init_atmel(void)
>  		return rc;
>  	}
>  
> -	dev_info(&pdev->dev, "Atmel TPM 1.1, Base Address: 0x%x\n", tpm_atmel.base);
> +	dev_info(&pdev->dev, "Atmel TPM 1.1, Base Address: 0x%x\n",
> +			tpm_atmel.base);
>  	return 0;
>  }
>  
> diff -puN drivers/char/tpm/tpm.c~tpm-tidies drivers/char/tpm/tpm.c
> --- 25/drivers/char/tpm/tpm.c~tpm-tidies	Thu Oct 27 14:52:43 2005
> +++ 25-akpm/drivers/char/tpm/tpm.c	Thu Oct 27 14:52:43 2005
> @@ -162,7 +162,8 @@ ssize_t tpm_show_pcrs(struct device *dev
>  		    < READ_PCR_RESULT_SIZE){
>  			dev_dbg(chip->dev, "A TPM error (%d) occurred"
>  				" attempting to read PCR %d of %d\n",
> -				be32_to_cpu(*((__be32 *) (data + 6))), i, num_pcrs);
> +				be32_to_cpu(*((__be32 *) (data + 6))),
> +				i, num_pcrs);
>  			goto out;
>  		}
>  		str += sprintf(str, "PCR-%02d: ", i);
> @@ -194,12 +195,11 @@ ssize_t tpm_show_pubek(struct device *de
>  	if (chip == NULL)
>  		return -ENODEV;
>  
> -	data = kmalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
> +	data = kzalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
>  	if (!data)
>  		return -ENOMEM;
>  
>  	memcpy(data, readpubek, sizeof(readpubek));
> -	memset(data + sizeof(readpubek), 0, 20);	/* zero nonce */
>  
>  	if ((len = tpm_transmit(chip, data, READ_PUBEK_RESULT_SIZE)) <
>  	    READ_PUBEK_RESULT_SIZE) {
> @@ -243,7 +243,6 @@ out:
>  	kfree(data);
>  	return rc;
>  }
> -
>  EXPORT_SYMBOL_GPL(tpm_show_pubek);
>  
>  #define CAP_VER_RESULT_SIZE 18
> @@ -312,7 +311,6 @@ ssize_t tpm_store_cancel(struct device *
>  }
>  EXPORT_SYMBOL_GPL(tpm_store_cancel);
>  
> -
>  /*
>   * Device file system interface to the TPM
>   */
> @@ -336,8 +334,7 @@ int tpm_open(struct inode *inode, struct
>  	}
>  
>  	if (chip->num_opens) {
> -		dev_dbg(chip->dev,
> -			"Another process owns this TPM\n");
> +		dev_dbg(chip->dev, "Another process owns this TPM\n");
>  		rc = -EBUSY;
>  		goto err_out;
>  	}
> @@ -363,7 +360,6 @@ err_out:
>  	spin_unlock(&driver_lock);
>  	return rc;
>  }
> -
>  EXPORT_SYMBOL_GPL(tpm_open);
>  
>  int tpm_release(struct inode *inode, struct file *file)
> @@ -380,10 +376,9 @@ int tpm_release(struct inode *inode, str
>  	spin_unlock(&driver_lock);
>  	return 0;
>  }
> -
>  EXPORT_SYMBOL_GPL(tpm_release);
>  
> -ssize_t tpm_write(struct file * file, const char __user * buf,
> +ssize_t tpm_write(struct file *file, const char __user *buf,
>  		  size_t size, loff_t * off)
>  {
>  	struct tpm_chip *chip = file->private_data;
> @@ -419,7 +414,7 @@ ssize_t tpm_write(struct file * file, co
>  
>  EXPORT_SYMBOL_GPL(tpm_write);
>  
> -ssize_t tpm_read(struct file * file, char __user * buf,
> +ssize_t tpm_read(struct file * file, char __user *buf,
>  		 size_t size, loff_t * off)
>  {
>  	struct tpm_chip *chip = file->private_data;
> @@ -441,7 +436,6 @@ ssize_t tpm_read(struct file * file, cha
>  
>  	return ret_size;
>  }
> -
>  EXPORT_SYMBOL_GPL(tpm_read);
>  
>  void tpm_remove_hardware(struct device *dev)
> @@ -465,13 +459,13 @@ void tpm_remove_hardware(struct device *
>  
>  	sysfs_remove_group(&dev->kobj, chip->vendor->attr_group);
>  
> -	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &= !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
> +	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &=
> +		!(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
>  
>  	kfree(chip);
>  
>  	put_device(dev);
>  }
> -
>  EXPORT_SYMBOL_GPL(tpm_remove_hardware);
>  
>  static u8 savestate[] = {
> @@ -493,7 +487,6 @@ int tpm_pm_suspend(struct device *dev, p
>  	tpm_transmit(chip, savestate, sizeof(savestate));
>  	return 0;
>  }
> -
>  EXPORT_SYMBOL_GPL(tpm_pm_suspend);
>  
>  /*
> @@ -509,7 +502,6 @@ int tpm_pm_resume(struct device *dev, u3
>  
>  	return 0;
>  }
> -
>  EXPORT_SYMBOL_GPL(tpm_pm_resume);
>  
>  /*
> @@ -519,8 +511,7 @@ EXPORT_SYMBOL_GPL(tpm_pm_resume);
>   * upon errant exit from this function specific probe function should call
>   * pci_disable_device
>   */
> -int tpm_register_hardware(struct device *dev,
> -			  struct tpm_vendor_specific *entry)
> +int tpm_register_hardware(struct device *dev, struct tpm_vendor_specific *entry)
>  {
>  #define DEVNAME_SIZE 7
>  
> @@ -529,12 +520,10 @@ int tpm_register_hardware(struct device 
>  	int i, j;
>  
>  	/* Driver specific per-device data */
> -	chip = kmalloc(sizeof(*chip), GFP_KERNEL);
> +	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
>  	if (chip == NULL)
>  		return -ENOMEM;
>  
> -	memset(chip, 0, sizeof(struct tpm_chip));
> -
>  	init_MUTEX(&chip->buffer_mutex);
>  	init_MUTEX(&chip->tpm_mutex);
>  	INIT_LIST_HEAD(&chip->list);
> @@ -558,8 +547,7 @@ int tpm_register_hardware(struct device 
>  
>  dev_num_search_complete:
>  	if (chip->dev_num < 0) {
> -		dev_err(dev,
> -			"No available tpm device numbers\n");
> +		dev_err(dev, "No available tpm device numbers\n");
>  		kfree(chip);
>  		return -ENODEV;
>  	} else if (chip->dev_num == 0)
> @@ -597,7 +585,6 @@ dev_num_search_complete:
>  
>  	return 0;
>  }
> -
>  EXPORT_SYMBOL_GPL(tpm_register_hardware);
>  
>  MODULE_AUTHOR("Leendert van Doorn (leendert@watson.ibm.com)");
> diff -puN drivers/char/tpm/tpm_infineon.c~tpm-tidies drivers/char/tpm/tpm_infineon.c
> --- 25/drivers/char/tpm/tpm_infineon.c~tpm-tidies	Thu Oct 27 14:52:43 2005
> +++ 25-akpm/drivers/char/tpm/tpm_infineon.c	Thu Oct 27 14:52:43 2005
> @@ -30,10 +30,10 @@
>  #define	TPM_INFINEON_DEV_VEN_VALUE	0x15D1
>  
>  /* These values will be filled after PnP-call */
> -static int TPM_INF_DATA = 0;
> -static int TPM_INF_ADDR = 0;
> -static int TPM_INF_BASE = 0;
> -static int TPM_INF_PORT_LEN = 0;
> +static int TPM_INF_DATA;
> +static int TPM_INF_ADDR;
> +static int TPM_INF_BASE;
> +static int TPM_INF_PORT_LEN;
>  
>  /* TPM header definitions */
>  enum infineon_tpm_header {
> _
> 
> 


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH] TPM: cleanups
  2005-10-27 21:55       ` Andrew Morton
  2005-10-27 22:03         ` Roland Dreier
@ 2005-11-11 20:11         ` Kylene Jo Hall
  2005-11-11 23:08           ` Kylene Jo Hall
  1 sibling, 1 reply; 17+ messages in thread
From: Kylene Jo Hall @ 2005-11-11 20:11 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Marcel Selhorst, linux-kernel, castet.matthieu

Patch to clean up a couple of issues recently pointed out with the
driver.  The fix for issue (c) was also pointed out by Steve Tate on the
tpm-devel list.


On Thu, 2005-10-27 at 14:55 -0700, Andrew Morton wrote: 
> Have just taken a wander through the TPM driver.  I couldn't help myself - are
> you OK with the below trivial changes?
> 
> Other things:
> 
> a)
> 
> ssize_t tpm_read(struct file * file, char __user *buf,
> 		 size_t size, loff_t * off)
> {
> f	struct tpm_chip *chip = file->private_data;
> 	int ret_size;
> 
> 	del_singleshot_timer_sync(&chip->user_read_timer);
> 	ret_size = atomic_read(&chip->data_pending);
> 	atomic_set(&chip->data_pending, 0);
> 	if (ret_size > 0) {	/* relay data */
> 		if (size < ret_size)
> 			ret_size = size;
> 
> 		down(&chip->buffer_mutex);
> 		if (copy_to_user
> 		    ((void __user *) buf, chip->data_buffer, ret_size))
> 			ret_size = -EFAULT;
> 
> Why is the first arg to copy_to_user() typecast in this manner?  I don't
> think the cast needs to be there?
> 
Fixed in the patch below.

> 
> b) user_reader_timeout does down() from within a timer handler!  That's
>    deadlocky and is illegal - timer handlers are run from interrupt
>    context.
> 
>    This should have generated a storm of runtime warnings if tested with
>    CONFIG_PREEMPT and CONFIG_DEBUG_SPINLOCK_SLEEP.  Developers really should
>    enable all the kernel debug options during development - they find bugs.
> 
>    Suggest you convert this to using schedule_work() or
>    schedule_delayed_work(). 
> 
I'll look into this.

> c) In tpm_remove_hardware():
> 
> 	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &= !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
> 
>    Is that `!' supposed to be there?   Looks odd.
> 
Fixed in the patch below.

> d) How did this happen?
> 
>    int tpm_pm_suspend(struct device *dev, pm_message_t pm_state, u32 level)
> 
>    device_driver.suspend() only takes two arguments nowadays.
> 
> 
> e)
> 
> 	int tpm_pm_resume(struct device *dev, u32 level)
> 
>    Ditto
> 

>

Signed-off-by: Kylene Hall <kjhall@us.ibm.com>
---
--- linux-2.6.14/drivers/char/tpm/tpm.c.orig	2005-11-11 14:08:48.000000000 -0600
+++ linux-2.6.14/drivers/char/tpm/tpm.c	2005-11-11 14:09:47.000000000
-0600
@@ -428,8 +428,7 @@ ssize_t tpm_read(struct file * file, cha
 			ret_size = size;
 
 		down(&chip->buffer_mutex);
-		if (copy_to_user
-		    ((void __user *) buf, chip->data_buffer, ret_size))
+		if (copy_to_user(buf, chip->data_buffer, ret_size))
 			ret_size = -EFAULT;
 		up(&chip->buffer_mutex);
 	}
@@ -460,7 +459,7 @@ void tpm_remove_hardware(struct device *
 	sysfs_remove_group(&dev->kobj, chip->vendor->attr_group);
 
 	dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &=
-		!(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
+		~(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
 
 	kfree(chip);
 



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] TPM: cleanups
  2005-11-11 20:11         ` [PATCH] TPM: cleanups Kylene Jo Hall
@ 2005-11-11 23:08           ` Kylene Jo Hall
  2005-11-12 21:48             ` Andrew Morton
  0 siblings, 1 reply; 17+ messages in thread
From: Kylene Jo Hall @ 2005-11-11 23:08 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Marcel Selhorst, linux-kernel, castet.matthieu


> > 
> > b) user_reader_timeout does down() from within a timer handler!  That's
> >    deadlocky and is illegal - timer handlers are run from interrupt
> >    context.
> > 
> >    This should have generated a storm of runtime warnings if tested with
> >    CONFIG_PREEMPT and CONFIG_DEBUG_SPINLOCK_SLEEP.  Developers really should
> >    enable all the kernel debug options during development - they find bugs.
> > 
> >    Suggest you convert this to using schedule_work() or
> >    schedule_delayed_work(). 
> > 
> I'll look into this.

Addressed this timer/interrupt/spinlock issue with schedule_work.

Signed-off-by: Kylene Hall <kjhall@us.ibm.com>
---
diff -urpN --exclude='*.o' --exclude='*.ko' --exclude='*.orig' --exclude='*mod*' --exclude='.*' --exclude='tpm_*' --exclude='*~' --exclude='*.rej' linux-2.6.14/drivers/char/tpm/tpm.c linux-2.6.14-rc4-tpm/drivers/char/tpm/tpm.c
--- linux-2.6.14/drivers/char/tpm/tpm.c	2005-11-11 14:09:47.000000000 -0600
+++ linux-2.6.14-rc4-tpm/drivers/char/tpm/tpm.c	2005-11-11 15:40:34.000000000 -0600
@@ -43,6 +43,13 @@ static void user_reader_timeout(unsigned
 {
 	struct tpm_chip *chip = (struct tpm_chip *) ptr;
 
+	schedule_work(&chip->work);
+}
+
+static void timeout_work(void * ptr)
+{
+	struct tpm_chip *chip = (struct tpm_chip*) ptr;
+
 	down(&chip->buffer_mutex);
 	atomic_set(&chip->data_pending, 0);
 	memset(chip->data_buffer, 0, TPM_BUFSIZE);
@@ -527,6 +535,8 @@ int tpm_register_hardware(struct device 
 	init_MUTEX(&chip->tpm_mutex);
 	INIT_LIST_HEAD(&chip->list);
 
+	INIT_WORK(&chip->work, timeout_work, chip);
+
 	init_timer(&chip->user_read_timer);
 	chip->user_read_timer.function = user_reader_timeout;
 	chip->user_read_timer.data = (unsigned long) chip;
diff -urpN --exclude='*.o' --exclude='*.ko' --exclude='*.orig' --exclude='*mod*' --exclude='.*' --exclude='tpm_*' --exclude='*~' --exclude='*.rej' linux-2.6.14/drivers/char/tpm/tpm.h linux-2.6.14-rc4-tpm/drivers/char/tpm/tpm.h
--- linux-2.6.14/drivers/char/tpm/tpm.h	2005-11-11 16:44:23.000000000 -0600
+++ linux-2.6.14-rc4-tpm/drivers/char/tpm/tpm.h	2005-11-11 15:39:03.000000000 -0600
@@ -77,6 +77,7 @@ struct tpm_chip {
 	struct semaphore buffer_mutex;
 
 	struct timer_list user_read_timer;	/* user needs to claim result */
+	struct work_struct work;
 	struct semaphore tpm_mutex;	/* tpm is processing */
 
 	struct tpm_vendor_specific *vendor;



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] TPM: cleanups
  2005-11-11 23:08           ` Kylene Jo Hall
@ 2005-11-12 21:48             ` Andrew Morton
  2005-11-16 22:48               ` Kylene Jo Hall
  0 siblings, 1 reply; 17+ messages in thread
From: Andrew Morton @ 2005-11-12 21:48 UTC (permalink / raw)
  To: Kylene Jo Hall; +Cc: selhorst, linux-kernel, castet.matthieu

Kylene Jo Hall <kjhall@us.ibm.com> wrote:
>
>  +	schedule_work(&chip->work);
>  +}
>  +
>  +static void timeout_work(void * ptr)
>  +{
>  +	struct tpm_chip *chip = (struct tpm_chip*) ptr;
>  +

I cannot see where the tpm driver stops that timer which it has running on
device close or on module unload.

Wherever it is, we'll now also need a flush_scheduled_work() to avoid a race
wherein the work handler is still executing while the module gets
unloaded.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] TPM: cleanups
  2005-11-12 21:48             ` Andrew Morton
@ 2005-11-16 22:48               ` Kylene Jo Hall
  0 siblings, 0 replies; 17+ messages in thread
From: Kylene Jo Hall @ 2005-11-16 22:48 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Marcel Selhorst, linux-kernel, castet.matthieu

Patch to add the necessary flush_schedule_work calls when canceling the
timer.

Signed-off-by: Kylene Hall <kjhall@us.ibm.com>

On Sat, 2005-11-12 at 13:48 -0800, Andrew Morton wrote:
> Kylene Jo Hall <kjhall@us.ibm.com> wrote:
> >
> >  +	schedule_work(&chip->work);
> >  +}
> >  +
> >  +static void timeout_work(void * ptr)
> >  +{
> >  +	struct tpm_chip *chip = (struct tpm_chip*) ptr;
> >  +
> 
> I cannot see where the tpm driver stops that timer which it has running on
> device close or on module unload.
> 
> Wherever it is, we'll now also need a flush_scheduled_work() to avoid a race
> wherein the work handler is still executing while the module gets
> unloaded.
> 

---
diff -uprN --exclude='.*' --exclude='*~' --exclude='*.o' --exclude='*.ko' --exclude='*.rej' --exclude='*.orig' --exclude='*infineon*' --exclude='*nsc*' --exclude='*mod*' linux-2.6.14/drivers/char/tpm/tpm.c linux-2.6.14-rc4-tpm/drivers/char/tpm/tpm.c
--- linux-2.6.14/drivers/char/tpm/tpm.c	2005-11-15 15:42:10.000000000 -0600
+++ linux-2.6.14-rc4-tpm/drivers/char/tpm/tpm.c	2005-11-15 14:11:20.000000000 -0600
@@ -377,6 +377,7 @@ int tpm_release(struct inode *inode, str
 	file->private_data = NULL;
 	chip->num_opens--;
 	del_singleshot_timer_sync(&chip->user_read_timer);
+	flush_scheduled_work();
 	atomic_set(&chip->data_pending, 0);
 	put_device(chip->dev);
 	kfree(chip->data_buffer);
@@ -428,6 +429,7 @@ ssize_t tpm_read(struct file * file, cha
 	int ret_size;
 
 	del_singleshot_timer_sync(&chip->user_read_timer);
+	flush_scheduled_work();
 	ret_size = atomic_read(&chip->data_pending);
 	atomic_set(&chip->data_pending, 0);
 	if (ret_size > 0) {	/* relay data */



^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2005-11-16 22:47 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-10-26 17:11 [PATCH] Infineon TPM: move infineon driver off pci_dev Marcel Selhorst
2005-10-26 17:23 ` Kylene Jo Hall
2005-10-26 17:41 ` matthieu castet
2005-10-26 19:53   ` Marcel Selhorst
2005-10-27 11:22   ` Marcel Selhorst
2005-10-27 14:07     ` Kylene Jo Hall
2005-10-27 21:55       ` Andrew Morton
2005-10-27 22:03         ` Roland Dreier
2005-10-27 22:26           ` Andrew Morton
2005-10-28 14:22             ` Kylene Jo Hall
2005-11-11 20:11         ` [PATCH] TPM: cleanups Kylene Jo Hall
2005-11-11 23:08           ` Kylene Jo Hall
2005-11-12 21:48             ` Andrew Morton
2005-11-16 22:48               ` Kylene Jo Hall
2005-10-27 21:33     ` [PATCH] Infineon TPM: move infineon driver off pci_dev Andrew Morton
2005-10-28  5:23       ` Marcel Selhorst
2005-10-27 21:42     ` matthieu castet

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox