rpms/kernel/FC-4 jwltest-acpi-dsdt-initrd.patch, NONE, 1.1.8.1 jwltest-b44-link-check.patch, NONE, 1.1.10.1 jwltest-ipw2100-1_1_0.patch, NONE, 1.1.12.1 jwltest-pci-enable-d3hot.patch, NONE, 1.1.6.1 jwltest-tpm-fixes.patch, NONE, 1.1.18.1 kernel-2.6.spec, 1.1387, 1.1387.2.1
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Fri Jul 1 21:02:19 UTC 2005
- Previous message (by thread): rpms/gtk2/devel gtk+-2.7.0-themename.patch, 1.1, 1.2 gtk2.spec, 1.79, 1.80
- Next message (by thread): rpms/kernel/FC-4/configs config-generic, 1.28, 1.28.6.1 config-ia64-generic, 1.3, 1.3.16.1 config-x86-generic, 1.8, 1.8.14.1 config-x86_64-generic, 1.8, 1.8.6.1
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: linville
Update of /cvs/dist/rpms/kernel/FC-4
In directory cvs.devel.redhat.com:/tmp/cvs-serv19147
Modified Files:
Tag: private-linville-fc4-jwltest-10-branch
kernel-2.6.spec
Added Files:
Tag: private-linville-fc4-jwltest-10-branch
jwltest-acpi-dsdt-initrd.patch jwltest-b44-link-check.patch
jwltest-ipw2100-1_1_0.patch jwltest-pci-enable-d3hot.patch
jwltest-tpm-fixes.patch
Log Message:
jwltest-acpi-dsdt-initrd.patch:
drivers/acpi/Kconfig | 13 ++++
drivers/acpi/osl.c | 115 +++++++++++++++++++++++++++++++++++++-------
drivers/acpi/tables/tbget.c | 8 ++-
init/main.c | 16 +++---
4 files changed, 126 insertions(+), 26 deletions(-)
--- NEW FILE jwltest-acpi-dsdt-initrd.patch ---
--- linux-2.6.12/drivers/acpi/Kconfig.orig 2005-06-17 15:48:29.000000000 -0400
+++ linux-2.6.12/drivers/acpi/Kconfig 2005-06-22 12:23:14.467811177 -0400
@@ -352,4 +352,17 @@ config ACPI_HOTPLUG_MEMORY
$>modprobe acpi_memhotplug
endif # ACPI
+config ACPI_INITRD
+ bool "Read DSDT from initrd or initramfs"
+ depends on ACPI && BLK_DEV_INITRD && !ACPI_CUSTOM_DSDT
+ default n
+ help
+ The DSDT (Differentiated System Description Table) often needs to be
+ overridden because of broken BIOS implementations. If you want to use
+ a customized DSDT, please use the mkinitrd tool (mkinitrd package) to
+ attach the DSDT to the initrd or initramfs
+ (see http://gaugusch.at/kernel.shtml for details)
+ If there is no DSDT found in the initrd, the DSDT from the BIOS is
+ used. It is save to say yes here.
+
endmenu
--- linux-2.6.12/drivers/acpi/osl.c.orig 2005-06-17 15:48:29.000000000 -0400
+++ linux-2.6.12/drivers/acpi/osl.c 2005-06-22 12:23:14.469810910 -0400
@@ -44,7 +44,10 @@
#include <asm/uaccess.h>
#include <linux/efi.h>
-
+#ifdef CONFIG_ACPI_INITRD
+#include<linux/syscalls.h>
+#include <linux/initrd.h>
+#endif
#define _COMPONENT ACPI_OS_SERVICES
ACPI_MODULE_NAME ("osl")
@@ -246,25 +249,105 @@ acpi_os_predefined_override (const struc
return AE_OK;
}
-acpi_status
-acpi_os_table_override (struct acpi_table_header *existing_table,
- struct acpi_table_header **new_table)
-{
- if (!existing_table || !new_table)
- return AE_BAD_PARAMETER;
+#ifdef CONFIG_ACPI_INITRD
+static char *
+acpi_find_dsdt_initrd(void)
+{
+ static const char signature[] = "INITRDDSDT123DSDT123";
+ char *dsdt_start = NULL;
+ char *dsdt_buffer = NULL;
+ unsigned long len = 0, len2 = 0;
+ int fd;
+ char ramfs_dsdt_name[10] = "/DSDT.aml";
+ struct kstat stat;
+
+ /* try to get dsdt from tail of initrd */
+ if ((fd = sys_open(ramfs_dsdt_name, O_RDONLY, 0)) < 0) {
+ if (initrd_start) {
+ char *data = (char *)initrd_start;
+
+ printk(KERN_INFO PREFIX "Looking for DSDT in initrd...");
+
+ /* Search for the start signature */
+ while (data < (char *)initrd_end - sizeof(signature) - 4) {
+ if (!memcmp(data, signature, sizeof(signature))) {
+ data += sizeof(signature);
+ if (!memcmp(data, "DSDT", 4))
+ dsdt_start = data;
+ break;
+ }
+ data++;
+ }
-#ifdef CONFIG_ACPI_CUSTOM_DSDT
- if (strncmp(existing_table->signature, "DSDT", 4) == 0)
- *new_table = (struct acpi_table_header*)AmlCode;
- else
+ if (dsdt_start){
+ printk(PREFIX " found at offset %zu",
+ dsdt_start - (char *)initrd_start);
+ len = (char*) initrd_end - dsdt_start;
+ printk(", size: %lu bytes\n", len);
+ dsdt_buffer = ACPI_MEM_ALLOCATE(len + 1);
+ memcpy(dsdt_buffer, dsdt_start, len);
+ *(dsdt_buffer + len + 1)= '\0';
+ }
+ else
+ printk(" not found!\n");
+ }
+ }
+ /* get dsdt from initramfs */
+ else{
+ printk(KERN_INFO PREFIX "Looking for DSDT in initramfs...");
+ if (vfs_stat(ramfs_dsdt_name, &stat) < 0){
+ printk ("error getting stats for file %s\n", ramfs_dsdt_name);
+ return NULL;
+ }
+
+ len = stat.size;
+ dsdt_buffer = ACPI_MEM_ALLOCATE(len + 1);
+ if (!dsdt_buffer) {
+ printk("Could not allocate %lu bytes of memory\n", len);
+ return NULL;
+ }
+ printk (" found %s ...", ramfs_dsdt_name);
+
+ len2 = sys_read (fd, (char __user *) dsdt_buffer, len);
+ if (len2 < len ){
+ printk(PREFIX "\nError trying to read %lu bytes from %s\n",
+ len, ramfs_dsdt_name);
+ ACPI_MEM_FREE (dsdt_buffer);
+ dsdt_buffer = NULL;
+ }
+ else{
+ printk(" successfully read %lu bytes from %s\n",
+ len, ramfs_dsdt_name);
+ *(dsdt_buffer + len + 1) = '\0';
+ }
+ }
+ if (!dsdt_buffer)
+ printk(" not found!\n");
+ return dsdt_buffer;
+}
+#endif
+
+acpi_status
+ acpi_os_table_override (struct acpi_table_header *existing_table,
+ struct acpi_table_header **new_table)
+ {
+ if (!existing_table || !new_table)
+ return AE_BAD_PARAMETER;
+
*new_table = NULL;
-#else
- *new_table = NULL;
+ if (strncmp(existing_table->signature, "DSDT", 4) == 0) {
+#ifdef CONFIG_ACPI_CUSTOM_DSDT
+ *new_table = (struct acpi_table_header*)AmlCode;
+#elif defined(CONFIG_ACPI_INITRD)
+ *new_table = (struct acpi_table_header*)acpi_find_dsdt_initrd();
#endif
+ if (*new_table)
+ printk(KERN_INFO PREFIX "Using customized DSDT\n");
+ }
return AE_OK;
-}
-
-static irqreturn_t
+ }
+
+ static irqreturn_t
acpi_irq(int irq, void *dev_id, struct pt_regs *regs)
{
return (*acpi_irq_handler)(acpi_irq_context) ? IRQ_HANDLED : IRQ_NONE;
--- linux-2.6.12/drivers/acpi/tables/tbget.c.orig 2005-06-17 15:48:29.000000000 -0400
+++ linux-2.6.12/drivers/acpi/tables/tbget.c 2005-06-22 12:23:14.471810644 -0400
@@ -45,7 +45,6 @@
#include <acpi/acpi.h>
#include <acpi/actables.h>
-
#define _COMPONENT ACPI_TABLES
ACPI_MODULE_NAME ("tbget")
@@ -287,12 +286,17 @@ acpi_tb_table_override (
acpi_format_exception (status)));
return_ACPI_STATUS (status);
}
-
+
/* Copy the table info */
ACPI_REPORT_INFO (("Table [%4.4s] replaced by host OS\n",
table_info->pointer->signature));
+#ifdef CONFIG_ACPI_INITRD
+ if (new_table)
+ ACPI_MEM_FREE(new_table);
+#endif
+
return_ACPI_STATUS (AE_OK);
}
--- linux-2.6.12/init/main.c.orig 2005-06-22 12:16:17.014413511 -0400
+++ linux-2.6.12/init/main.c 2005-06-22 12:23:14.473810378 -0400
@@ -520,8 +520,6 @@ asmlinkage void __init start_kernel(void
check_bugs();
- acpi_early_init(); /* before LAPIC and SMP init */
-
/* Do the rest non-__init'ed, we're now alive */
rest_init();
}
@@ -651,6 +649,14 @@ static int init(void * unused)
*/
child_reaper = current;
+ /*
+ * Do this before initcalls, because some drivers want to access
+ * firmware files.
+ */
+ populate_rootfs();
+
+ acpi_early_init(); /* before LAPIC and SMP init */
+
/* Sets up cpus_possible() */
smp_prepare_cpus(max_cpus);
@@ -661,12 +667,6 @@ static int init(void * unused)
cpuset_init_smp();
- /*
- * Do this before initcalls, because some drivers want to access
- * firmware files.
- */
- populate_rootfs();
-
do_basic_setup();
sched_init_smp();
jwltest-b44-link-check.patch:
b44.c | 3 +++
1 files changed, 3 insertions(+)
--- NEW FILE jwltest-b44-link-check.patch ---
--- linux-2.6.11/drivers/net/b44.c.orig 2005-06-07 09:51:48.349772547 -0400
+++ linux-2.6.11/drivers/net/b44.c 2005-06-07 09:55:19.579618942 -0400
@@ -1286,6 +1286,9 @@
b44_init_hw(bp);
bp->flags |= B44_FLAG_INIT_COMPLETE;
+ netif_carrier_off(dev);
+ b44_check_phy(bp);
+
spin_unlock_irq(&bp->lock);
init_timer(&bp->timer);
jwltest-ipw2100-1_1_0.patch:
Documentation/networking/README.ipw2100 | 162
drivers/net/wireless/Kconfig | 55
drivers/net/wireless/Makefile | 4
drivers/net/wireless/ieee80211/ieee80211.h | 85
drivers/net/wireless/ieee80211/ieee80211_crypt.c | 4
drivers/net/wireless/ieee80211/ieee80211_crypt.h | 6
drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c | 3
drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c | 3
drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c | 4
drivers/net/wireless/ieee80211/ieee80211_module.c | 50
drivers/net/wireless/ieee80211/ieee80211_rx.c | 226
drivers/net/wireless/ieee80211/ieee80211_tx.c | 113
drivers/net/wireless/ieee80211/ieee80211_wx.c | 148
drivers/net/wireless/ipw2100.c | 8649 +++++++++++++++++
drivers/net/wireless/ipw2100.h | 1278 ++
drivers/net/wireless/ipw2100/LICENSE | 339
drivers/net/wireless/ipw2100/Makefile | 15
drivers/net/wireless/ipw2100/ipw2100.c | 8972 ------------------
drivers/net/wireless/ipw2100/ipw2100.h | 1287 --
19 files changed, 10409 insertions(+), 10994 deletions(-)
--- NEW FILE jwltest-ipw2100-1_1_0.patch ---
--- linux-2.6.12/Documentation/networking/README.ipw2100.orig 2005-06-22 13:38:36.756298804 -0400
+++ linux-2.6.12/Documentation/networking/README.ipw2100 2005-06-22 13:39:36.938279261 -0400
@@ -1,32 +1,59 @@
-Intel PRO/Wireless 2100 802.11b Driver for Linux
+===========================
+Intel(R) PRO/Wireless 2100 Network Connection Driver for Linux
README.ipw2100
-October 13, 2004
+March 14, 2005
+===========================
+Index
+---------------------------
+0. Introduction
+1. Release 1.1.0 Current Features
+2. Command Line Parameters
+3. Sysfs Helper Files
+4. Radio Kill Switch
+5. Dynamic Firmware
+6. Power Management
+7. Support
+8. License
-Release 0.56 Current Features
+
+===========================
+0. Introduction
------------ ----- ----- ---- --- -- -
-- IBSS and BSS modes
-- 802.11 fragmentation
+This document provides a brief overview of the features supported by the
+IPW2100 driver project. The main project website, where the latest
+development version of the driver can be found, is:
+
+ http://ipw2100.sourceforge.net
+
+There you can find the not only the latest releases, but also information about
+potential fixes and patches, as well as links to the development mailing list
+for the driver project.
+
+
+===========================
+1. Release 1.1.0 Current Supported Features
+---------------------------
+- Managed (BSS) and Ad-Hoc (IBSS)
- WEP (shared key and open)
-- wireless extension support
-- 802.1x EAP via xsupplicant
+- Wireless Tools support
+- 802.1x (tested with XSupplicant 1.0.1)
+
+Enabled (but not supported) features:
- Monitor/RFMon mode
-- transmit power control
-- long/short preamble support
-- power states support (ACPI)
+- WPA/WPA2
-TODO
------------- ----- ----- ---- --- -- -
-- Fix bugs... The biggies:
- C3 corruption
- Fragmentation
+The distinction between officially supported and enabled is a reflection
+on the amount of validation and interoperability testing that has been
+performed on a given feature.
-Command Line Parameters
------------- ----- ----- ---- --- -- -
+===========================
+2. Command Line Parameters
+---------------------------
If the driver is built as a module, the following optional parameters are used
by entering them on the command line with the modprobe command using this
@@ -34,54 +61,82 @@ syntax:
modprobe ipw2100 [<option>=<VAL1><,VAL2>...]
-For example, to set the interface name for driver, entering:
-
- modprobe ipw2100 if_name=wlan%d
+For example, to disable the radio on driver loading, enter:
-results in the ipw2100 driver defaulting to the wlan prefix, with the system
-assigning a unique number in place of %d. The default interface name is eth%d.
+ modprobe ipw2100 disable=1
The ipw2100 driver supports the following module parameters:
Name Value Example:
debug 0x0-0xffffffff debug=1024
-if_name string if_name=wlan%d
mode 0,1,2 mode=1 /* AdHoc */
channel int channel=3 /* Only valid in AdHoc or Monitor */
associate boolean associate=0 /* Do NOT auto associate */
disable boolean disable=1 /* Do not power the HW */
-Radio Kill Switch
------------- ----- ----- ---- --- -- -
-Most laptops provide the ability for the user to physically disable the radio.
-Some vendors have implemented this as a physical switch that requires no
-software to turn the radio off and on. On other laptops, however, the switch
-is controlled through a button being pressed and a software driver then making
-calls to turn the radio off and on. This is referred to as a "software based
-RF kill switch"
+===========================
+3. Sysfs Helper Files
+---------------------------
-To determine if you have such a switch, you can check the contents of:
+There are several ways to control the behavior of the driver. Many of the
+general capabilities are exposed through the Wireless Tools (iwconfig). There
+are a few capabilities that are exposed through entries in the Linux Sysfs.
- /sys/bus/pci/drivers/ipw2100/*/rf_kill
-A value of:
+----- Driver Level ------
+For the driver level files, look in /sys/bus/pci/drivers/ipw2100/
+
+ debug_level
- Radio is {en,dis}abled by RF switch
+ This controls the same global as the 'debug' module parameter. For
+ information on the various debugging levels available, run the 'dvals'
+ script found in the driver source directory.
-means that you have an RF switch and the radio is in the state
-described.
+ NOTE: 'debug_level' is only enabled if CONFIG_IPW2100_DEBUG is turn
+ on.
-A value of:
+----- Device Level ------
+For the device level files look in
+
+ /sys/bus/pci/drivers/ipw2100/{PCI-ID}/
- Your hardware does not have an RF switch
+For example:
+ /sys/bus/pci/drivers/ipw2100/0000:02:01.0
-is self explanatory. In this case you should not need to worry about
-enabling the radio.
+For the device level files, see /sys/bus/pci/drivers/ipw2100:
+ rf_kill
+ read -
+ 0 = RF kill not enabled (radio on)
+ 1 = SW based RF kill active (radio off)
+ 2 = HW based RF kill active (radio off)
+ 3 = Both HW and SW RF kill active (radio off)
+ write -
+ 0 = If SW based RF kill active, turn the radio back on
+ 1 = If radio is on, activate SW based RF kill
+
+ NOTE: If you enable the SW based RF kill and then toggle the HW
+ based RF kill from ON -> OFF -> ON, the radio will NOT come back on
+
+
+===========================
+4. Radio Kill Switch
+---------------------------
+Most laptops provide the ability for the user to physically disable the radio.
+Some vendors have implemented this as a physical switch that requires no
+software to turn the radio off and on. On other laptops, however, the switch
+is controlled through a button being pressed and a software driver then making
+calls to turn the radio off and on. This is referred to as a "software based
+RF kill switch"
-Dynamic Firmware
------------- ----- ----- ---- --- -- -
+See the Sysfs helper file 'rf_kill' for determining the state of the RF switch
+on your system.
+
+
+===========================
+5. Dynamic Firmware
+---------------------------
As the firmware is licensed under a restricted use license, it can not be
included within the kernel sources. To enable the IPW2100 you will need a
firmware image to load into the wireless NIC's processors.
@@ -91,8 +146,9 @@ You can obtain these images from <http:/
See INSTALL for instructions on installing the firmware.
-Power Management
------------- ----- ----- ---- --- -- -
+===========================
+6. Power Management
+---------------------------
The IPW2100 supports the configuration of the Power Save Protocol
through a private wireless extension interface. The IPW2100 supports
[...22272 lines suppressed...]
+
+
+int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf, size_t max)
+{
+ char ver[MAX_FW_VERSION_LEN];
+ u32 len = MAX_FW_VERSION_LEN;
+ u32 tmp;
+ int i;
+ /* firmware version is an ascii string (max len of 14) */
+ if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM,
+ ver, &len))
+ return -EIO;
+ tmp = max;
+ if (len >= max)
+ len = max - 1;
+ for (i = 0; i < len; i++)
+ buf[i] = ver[i];
+ buf[i] = '\0';
+ return tmp;
+}
+
+int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf, size_t max)
+{
+ u32 ver;
+ u32 len = sizeof(ver);
+ /* microcode version is a 32 bit integer */
+ if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION,
+ &ver, &len))
+ return -EIO;
+ return snprintf(buf, max, "%08X", ver);
+}
+
+/*
+ * On exit, the firmware will have been freed from the fw list
+ */
+int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
+{
+ /* firmware is constructed of N contiguous entries, each entry is
+ * structured as:
+ *
+ * offset sie desc
+ * 0 4 address to write to
+ * 4 2 length of data run
+ * 6 length data
+ */
+ unsigned int addr;
+ unsigned short len;
+
+ const unsigned char *firmware_data = fw->fw.data;
+ unsigned int firmware_data_left = fw->fw.size;
+
+ while (firmware_data_left > 0) {
+ addr = *(u32 *)(firmware_data);
+ firmware_data += 4;
+ firmware_data_left -= 4;
+
+ len = *(u16 *)(firmware_data);
+ firmware_data += 2;
+ firmware_data_left -= 2;
+
+ if (len > 32) {
+ IPW_DEBUG_ERROR(
+ "Invalid firmware run-length of %d bytes\n",
+ len);
+ return -EINVAL;
+ }
+
+ write_nic_memory(priv->net_dev, addr, len, firmware_data);
+ firmware_data += len;
+ firmware_data_left -= len;
+ }
+
+ return 0;
+}
+
+struct symbol_alive_response {
+ u8 cmd_id;
+ u8 seq_num;
+ u8 ucode_rev;
+ u8 eeprom_valid;
+ u16 valid_flags;
+ u8 IEEE_addr[6];
+ u16 flags;
+ u16 pcb_rev;
+ u16 clock_settle_time; // 1us LSB
+ u16 powerup_settle_time; // 1us LSB
+ u16 hop_settle_time; // 1us LSB
+ u8 date[3]; // month, day, year
+ u8 time[2]; // hours, minutes
+ u8 ucode_valid;
+};
+
+int ipw2100_ucode_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
+{
+ struct net_device *dev = priv->net_dev;
+ const unsigned char *microcode_data = fw->uc.data;
+ unsigned int microcode_data_left = fw->uc.size;
+
+ struct symbol_alive_response response;
+ int i, j;
+ u8 data;
+
+ /* Symbol control */
+ write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
+ readl((void *)(dev->base_addr));
+ write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
+ readl((void *)(dev->base_addr));
+
+ /* HW config */
+ write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
+ readl((void *)(dev->base_addr));
+ write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
+ readl((void *)(dev->base_addr));
+
+ /* EN_CS_ACCESS bit to reset control store pointer */
+ write_nic_byte(dev, 0x210000, 0x40);
+ readl((void *)(dev->base_addr));
+ write_nic_byte(dev, 0x210000, 0x0);
+ readl((void *)(dev->base_addr));
+ write_nic_byte(dev, 0x210000, 0x40);
+ readl((void *)(dev->base_addr));
+
+ /* copy microcode from buffer into Symbol */
+
+ while (microcode_data_left > 0) {
+ write_nic_byte(dev, 0x210010, *microcode_data++);
+ write_nic_byte(dev, 0x210010, *microcode_data++);
+ microcode_data_left -= 2;
+ }
+
+ /* EN_CS_ACCESS bit to reset the control store pointer */
+ write_nic_byte(dev, 0x210000, 0x0);
+ readl((void *)(dev->base_addr));
+
+ /* Enable System (Reg 0)
+ * first enable causes garbage in RX FIFO */
+ write_nic_byte(dev, 0x210000, 0x0);
+ readl((void *)(dev->base_addr));
+ write_nic_byte(dev, 0x210000, 0x80);
+ readl((void *)(dev->base_addr));
+
+ /* Reset External Baseband Reg */
+ write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
+ readl((void *)(dev->base_addr));
+ write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
+ readl((void *)(dev->base_addr));
+
+ /* HW Config (Reg 5) */
+ write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
+ readl((void *)(dev->base_addr));
+ write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
+ readl((void *)(dev->base_addr));
+
+ /* Enable System (Reg 0)
+ * second enable should be OK */
+ write_nic_byte(dev, 0x210000, 0x00); // clear enable system
+ readl((void *)(dev->base_addr));
+ write_nic_byte(dev, 0x210000, 0x80); // set enable system
+
+ /* check Symbol is enabled - upped this from 5 as it wasn't always
+ * catching the update */
+ for (i = 0; i < 10; i++) {
+ udelay(10);
+
+ /* check Dino is enabled bit */
+ read_nic_byte(dev, 0x210000, &data);
+ if (data & 0x1)
+ break;
+ }
+
+ if (i == 10) {
+ IPW_DEBUG_ERROR("%s: Error initializing Symbol\n",
+ dev->name);
+ return -EIO;
+ }
+
+ /* Get Symbol alive response */
+ for (i = 0; i < 30; i++) {
+ /* Read alive response structure */
+ for (j = 0;
+ j < (sizeof(struct symbol_alive_response) >> 1);
+ j++)
+ read_nic_word(dev, 0x210004,
+ ((u16 *)&response) + j);
+
+ if ((response.cmd_id == 1) &&
+ (response.ucode_valid == 0x1))
+ break;
+ udelay(10);
+ }
+
+ if (i == 30) {
+ IPW_DEBUG_ERROR("%s: No response from Symbol - hw not alive\n",
+ dev->name);
+ printk_buf(IPW_DL_ERROR, (u8*)&response, sizeof(response));
+ return -EIO;
+ }
+
+ return 0;
+}
jwltest-pci-enable-d3hot.patch:
pci.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 48 insertions(+), 1 deletion(-)
--- NEW FILE jwltest-pci-enable-d3hot.patch ---
--- linux-2.6.12/drivers/pci/pci.c.orig 2005-06-30 20:25:14.355816494 -0400
+++ linux-2.6.12/drivers/pci/pci.c 2005-06-30 20:32:33.827281683 -0400
@@ -378,9 +378,56 @@ pci_restore_state(struct pci_dev *dev)
int
pci_enable_device_bars(struct pci_dev *dev, int bars)
{
- int err;
+ int i, numres, err;
pci_set_power_state(dev, PCI_D0);
+
+ /* Some devices lose PCI config header data during D3hot->D0
+ transition. Since some firmware leaves devices in D3hot
+ state at boot, this information needs to be restored. We
+ could force drivers to do this, but better to leave them
+ ignorant of PCI PM trivia...
+ */
+ switch (dev->hdr_type) {
+ case PCI_HEADER_TYPE_NORMAL:
+ numres = 6;
+ break;
+ case PCI_HEADER_TYPE_BRIDGE:
+ numres = 2;
+ break;
+ case PCI_HEADER_TYPE_CARDBUS:
+ numres = 1;
+ break;
+ default:
+ /* Should never get here, but just in case... */
+ numres = 0;
+ break;
+ }
+ for (i = 0; i < numres; i ++) {
+ struct pci_bus_region region;
+ u32 val;
+ int reg;
+
+ if (!dev->resource[i].flags)
+ continue;
+
+ pcibios_resource_to_bus(dev, ®ion, &dev->resource[i]);
+
+ val = region.start
+ | (dev->resource[i].flags & PCI_REGION_FLAG_MASK);
+
+ reg = PCI_BASE_ADDRESS_0 + (i * 4);
+
+ pci_write_config_dword(dev, reg, val);
+
+ if ((val & (PCI_BASE_ADDRESS_SPACE
+ | PCI_BASE_ADDRESS_MEM_TYPE_MASK))
+ == (PCI_BASE_ADDRESS_SPACE_MEMORY
+ | PCI_BASE_ADDRESS_MEM_TYPE_64)) {
+ pci_write_config_dword(dev, reg + 4, 0);
+ }
+ }
+
if ((err = pcibios_enable_device(dev, bars)) < 0)
return err;
return 0;
jwltest-tpm-fixes.patch:
tpm.c | 303 ++++++++++++++++++++----------------------------------------
tpm.h | 21 ++--
tpm_atmel.c | 52 +++++++---
tpm_nsc.c | 93 ++++++++++++------
4 files changed, 219 insertions(+), 250 deletions(-)
--- NEW FILE jwltest-tpm-fixes.patch ---
--- linux-2.6.11/drivers/char/tpm/tpm.h.orig 2005-05-24 13:43:56.044704174 -0400
+++ linux-2.6.11/drivers/char/tpm/tpm.h 2005-05-24 13:44:13.637362054 -0400
@@ -25,23 +25,34 @@
#include <linux/fs.h>
#include <linux/miscdevice.h>
-#define TPM_TIMEOUT msecs_to_jiffies(5)
+enum tpm_timeout {
+ TPM_TIMEOUT = 5, /* msecs */
+};
/* TPM addresses */
-#define TPM_ADDR 0x4E
-#define TPM_DATA 0x4F
+enum tpm_addr {
+ TPM_ADDR = 0x4E,
+ TPM_DATA = 0x4F
+};
+
+extern ssize_t tpm_show_pubek(struct device *, char *);
+extern ssize_t tpm_show_pcrs(struct device *, char *);
+extern ssize_t tpm_show_caps(struct device *, char *);
+extern ssize_t tpm_store_cancel(struct device *, const char *, size_t);
struct tpm_chip;
struct tpm_vendor_specific {
u8 req_complete_mask;
u8 req_complete_val;
+ u8 req_canceled;
u16 base; /* TPM base address */
int (*recv) (struct tpm_chip *, u8 *, size_t);
int (*send) (struct tpm_chip *, u8 *, size_t);
void (*cancel) (struct tpm_chip *);
struct miscdevice miscdev;
+ struct attribute_group *attr_group;
};
struct tpm_chip {
@@ -58,8 +69,6 @@ struct tpm_chip {
struct timer_list user_read_timer; /* user needs to claim result */
struct semaphore tpm_mutex; /* tpm is processing */
- struct timer_list device_timer; /* tpm is processing */
- struct semaphore timer_manipulation_mutex;
struct tpm_vendor_specific *vendor;
@@ -79,8 +88,6 @@ static inline void tpm_write_index(int i
}
extern void tpm_time_expired(unsigned long);
-extern int tpm_lpc_bus_init(struct pci_dev *, u16);
-
extern int tpm_register_hardware(struct pci_dev *,
struct tpm_vendor_specific *);
extern int tpm_open(struct inode *, struct file *);
--- linux-2.6.11/drivers/char/tpm/tpm.c.orig 2005-05-24 13:43:56.046703908 -0400
+++ linux-2.6.11/drivers/char/tpm/tpm.c 2005-05-24 13:44:44.021317017 -0400
@@ -28,19 +28,16 @@
#include <linux/spinlock.h>
#include "tpm.h"
-#define TPM_MINOR 224 /* officially assigned */
-
-#define TPM_BUFSIZE 2048
-
-/* PCI configuration addresses */
-#define PCI_GEN_PMCON_1 0xA0
-#define PCI_GEN1_DEC 0xE4
-#define PCI_LPC_EN 0xE6
-#define PCI_GEN2_DEC 0xEC
+enum tpm_const {
+ TPM_MINOR = 224, /* officially assigned */
+ TPM_BUFSIZE = 2048,
+ TPM_NUM_DEVICES = 256,
+ TPM_NUM_MASK_ENTRIES = TPM_NUM_DEVICES / (8 * sizeof(int))
+};
static LIST_HEAD(tpm_chip_list);
static DEFINE_SPINLOCK(driver_lock);
-static int dev_mask[32];
+static int dev_mask[TPM_NUM_MASK_ENTRIES];
static void user_reader_timeout(unsigned long ptr)
{
@@ -61,83 +58,15 @@ void tpm_time_expired(unsigned long ptr)
EXPORT_SYMBOL_GPL(tpm_time_expired);
/*
- * Initialize the LPC bus and enable the TPM ports
- */
-int tpm_lpc_bus_init(struct pci_dev *pci_dev, u16 base)
-{
- u32 lpcenable, tmp;
- int is_lpcm = 0;
-
- switch (pci_dev->vendor) {
- case PCI_VENDOR_ID_INTEL:
- switch (pci_dev->device) {
- case PCI_DEVICE_ID_INTEL_82801CA_12:
- case PCI_DEVICE_ID_INTEL_82801DB_12:
- is_lpcm = 1;
- break;
- }
- /* init ICH (enable LPC) */
- pci_read_config_dword(pci_dev, PCI_GEN1_DEC, &lpcenable);
- lpcenable |= 0x20000000;
- pci_write_config_dword(pci_dev, PCI_GEN1_DEC, lpcenable);
-
- if (is_lpcm) {
- pci_read_config_dword(pci_dev, PCI_GEN1_DEC,
- &lpcenable);
- if ((lpcenable & 0x20000000) == 0) {
- dev_err(&pci_dev->dev,
- "cannot enable LPC\n");
- return -ENODEV;
- }
- }
-
- /* initialize TPM registers */
- pci_read_config_dword(pci_dev, PCI_GEN2_DEC, &tmp);
-
- if (!is_lpcm)
- tmp = (tmp & 0xFFFF0000) | (base & 0xFFF0);
- else
- tmp =
- (tmp & 0xFFFF0000) | (base & 0xFFF0) |
- 0x00000001;
-
- pci_write_config_dword(pci_dev, PCI_GEN2_DEC, tmp);
-
- if (is_lpcm) {
- pci_read_config_dword(pci_dev, PCI_GEN_PMCON_1,
- &tmp);
- tmp |= 0x00000004; /* enable CLKRUN */
- pci_write_config_dword(pci_dev, PCI_GEN_PMCON_1,
- tmp);
- }
- tpm_write_index(0x0D, 0x55); /* unlock 4F */
- tpm_write_index(0x0A, 0x00); /* int disable */
- tpm_write_index(0x08, base); /* base addr lo */
- tpm_write_index(0x09, (base & 0xFF00) >> 8); /* base addr hi */
- tpm_write_index(0x0D, 0xAA); /* lock 4F */
- break;
- case PCI_VENDOR_ID_AMD:
- /* nothing yet */
- break;
- }
-
- return 0;
-}
-
-EXPORT_SYMBOL_GPL(tpm_lpc_bus_init);
-
-/*
* Internal kernel interface to transmit TPM commands
*/
static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
size_t bufsiz)
{
- ssize_t len;
+ ssize_t rc;
u32 count;
- __be32 *native_size;
- native_size = (__force __be32 *) (buf + 2);
- count = be32_to_cpu(*native_size);
+ count = be32_to_cpu(*((__be32 *) (buf + 2)));
if (count == 0)
return -ENODATA;
@@ -149,30 +78,27 @@ static ssize_t tpm_transmit(struct tpm_c
down(&chip->tpm_mutex);
- if ((len = chip->vendor->send(chip, (u8 *) buf, count)) < 0) {
+ if ((rc = chip->vendor->send(chip, (u8 *) buf, count)) < 0) {
dev_err(&chip->pci_dev->dev,
- "tpm_transmit: tpm_send: error %zd\n", len);
- return len;
+ "tpm_transmit: tpm_send: error %Zd\n", rc);
+ goto out;
}
- down(&chip->timer_manipulation_mutex);
chip->time_expired = 0;
- init_timer(&chip->device_timer);
- chip->device_timer.function = tpm_time_expired;
- chip->device_timer.expires = jiffies + 2 * 60 * HZ;
- chip->device_timer.data = (unsigned long) &chip->time_expired;
- add_timer(&chip->device_timer);
- up(&chip->timer_manipulation_mutex);
do {
u8 status = inb(chip->vendor->base + 1);
if ((status & chip->vendor->req_complete_mask) ==
chip->vendor->req_complete_val) {
- down(&chip->timer_manipulation_mutex);
- del_singleshot_timer_sync(&chip->device_timer);
- up(&chip->timer_manipulation_mutex);
goto out_recv;
}
+
+ if ((status == chip->vendor->req_canceled)) {
+ dev_err(&chip->pci_dev->dev, "Operation Canceled\n");
+ rc = -ECANCELED;
+ goto out;
+ }
+
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(TPM_TIMEOUT);
rmb();
@@ -180,22 +106,23 @@ static ssize_t tpm_transmit(struct tpm_c
chip->vendor->cancel(chip);
- dev_err(&chip->pci_dev->dev, "Time expired\n");
- up(&chip->tpm_mutex);
- return -EIO;
+ dev_err(&chip->pci_dev->dev, "Operation Timed out\n");
+ rc = -ETIME;
+ goto out;
out_recv:
- len = chip->vendor->recv(chip, (u8 *) buf, bufsiz);
- if (len < 0)
+ rc = chip->vendor->recv(chip, (u8 *) buf, bufsiz);
+ if (rc < 0)
dev_err(&chip->pci_dev->dev,
- "tpm_transmit: tpm_recv: error %zd\n", len);
+ "tpm_transmit: tpm_recv: error %Zd\n", rc);
+out:
up(&chip->tpm_mutex);
- return len;
+ return rc;
}
#define TPM_DIGEST_SIZE 20
#define CAP_PCR_RESULT_SIZE 18
-static u8 cap_pcr[] = {
+static const u8 cap_pcr[] = {
0, 193, /* TPM_TAG_RQU_COMMAND */
0, 0, 0, 22, /* length */
0, 0, 0, 101, /* TPM_ORD_GetCapability */
@@ -205,22 +132,23 @@ static u8 cap_pcr[] = {
};
#define READ_PCR_RESULT_SIZE 30
-static u8 pcrread[] = {
+static const u8 pcrread[] = {
0, 193, /* TPM_TAG_RQU_COMMAND */
0, 0, 0, 14, /* length */
0, 0, 0, 21, /* TPM_ORD_PcrRead */
0, 0, 0, 0 /* PCR index */
};
-static ssize_t show_pcrs(struct device *dev, char *buf)
+ssize_t tpm_show_pcrs(struct device *dev, char *buf)
{
u8 data[READ_PCR_RESULT_SIZE];
ssize_t len;
- int i, j, index, num_pcrs;
+ int i, j, num_pcrs;
+ __be32 index;
char *str = buf;
struct tpm_chip *chip =
- pci_get_drvdata(container_of(dev, struct pci_dev, dev));
+ pci_get_drvdata(to_pci_dev(dev));
if (chip == NULL)
return -ENODEV;
@@ -229,7 +157,7 @@ static ssize_t show_pcrs(struct device *
< CAP_PCR_RESULT_SIZE)
return len;
- num_pcrs = be32_to_cpu(*((__force __be32 *) (data + 14)));
+ num_pcrs = be32_to_cpu(*((__be32 *) (data + 14)));
for (i = 0; i < num_pcrs; i++) {
memcpy(data, pcrread, sizeof(pcrread));
@@ -246,34 +174,39 @@ static ssize_t show_pcrs(struct device *
return str - buf;
}
-static DEVICE_ATTR(pcrs, S_IRUGO, show_pcrs, NULL);
+EXPORT_SYMBOL_GPL(tpm_show_pcrs);
#define READ_PUBEK_RESULT_SIZE 314
-static u8 readpubek[] = {
+static const u8 readpubek[] = {
0, 193, /* TPM_TAG_RQU_COMMAND */
0, 0, 0, 30, /* length */
0, 0, 0, 124, /* TPM_ORD_ReadPubek */
};
-static ssize_t show_pubek(struct device *dev, char *buf)
+ssize_t tpm_show_pubek(struct device *dev, char *buf)
{
- u8 data[READ_PUBEK_RESULT_SIZE];
+ u8 *data;
ssize_t len;
- __be32 *native_val;
- int i;
+ int i, rc;
char *str = buf;
struct tpm_chip *chip =
- pci_get_drvdata(container_of(dev, struct pci_dev, dev));
+ pci_get_drvdata(to_pci_dev(dev));
if (chip == NULL)
return -ENODEV;
+ data = kmalloc(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, sizeof(data))) <
- READ_PUBEK_RESULT_SIZE)
- return len;
+ if ((len = tpm_transmit(chip, data, READ_PUBEK_RESULT_SIZE)) <
+ READ_PUBEK_RESULT_SIZE) {
+ rc = len;
+ goto out;
+ }
/*
ignore header 10 bytes
@@ -286,8 +219,6 @@ static ssize_t show_pubek(struct device
ignore checksum 20 bytes
*/
- native_val = (__force __be32 *) (data + 34);
-
str +=
sprintf(str,
"Algorithm: %02X %02X %02X %02X\nEncscheme: %02X %02X\n"
@@ -298,21 +229,23 @@ static ssize_t show_pubek(struct device
data[15], data[16], data[17], data[22], data[23],
data[24], data[25], data[26], data[27], data[28],
data[29], data[30], data[31], data[32], data[33],
- be32_to_cpu(*native_val)
- );
+ be32_to_cpu(*((__be32 *) (data + 32))));
for (i = 0; i < 256; i++) {
str += sprintf(str, "%02X ", data[i + 39]);
if ((i + 1) % 16 == 0)
str += sprintf(str, "\n");
}
- return str - buf;
+ rc = str - buf;
+out:
+ kfree(data);
+ return rc;
}
-static DEVICE_ATTR(pubek, S_IRUGO, show_pubek, NULL);
+EXPORT_SYMBOL_GPL(tpm_show_pubek);
#define CAP_VER_RESULT_SIZE 18
-static u8 cap_version[] = {
+static const u8 cap_version[] = {
0, 193, /* TPM_TAG_RQU_COMMAND */
0, 0, 0, 18, /* length */
0, 0, 0, 101, /* TPM_ORD_GetCapability */
@@ -321,7 +254,7 @@ static u8 cap_version[] = {
};
#define CAP_MANUFACTURER_RESULT_SIZE 18
-static u8 cap_manufacturer[] = {
+static const u8 cap_manufacturer[] = {
0, 193, /* TPM_TAG_RQU_COMMAND */
0, 0, 0, 22, /* length */
0, 0, 0, 101, /* TPM_ORD_GetCapability */
@@ -330,14 +263,14 @@ static u8 cap_manufacturer[] = {
0, 0, 1, 3
};
-static ssize_t show_caps(struct device *dev, char *buf)
+ssize_t tpm_show_caps(struct device *dev, char *buf)
{
- u8 data[READ_PUBEK_RESULT_SIZE];
+ u8 data[sizeof(cap_manufacturer)];
ssize_t len;
char *str = buf;
struct tpm_chip *chip =
- pci_get_drvdata(container_of(dev, struct pci_dev, dev));
+ pci_get_drvdata(to_pci_dev(dev));
if (chip == NULL)
return -ENODEV;
@@ -348,7 +281,7 @@ static ssize_t show_caps(struct device *
return len;
str += sprintf(str, "Manufacturer: 0x%x\n",
- be32_to_cpu(*(data + 14)));
+ be32_to_cpu(*((__be32 *) (data + 14))));
memcpy(data, cap_version, sizeof(cap_version));
@@ -364,7 +297,21 @@ static ssize_t show_caps(struct device *
return str - buf;
}
-static DEVICE_ATTR(caps, S_IRUGO, show_caps, NULL);
+EXPORT_SYMBOL_GPL(tpm_show_caps);
+
+ssize_t tpm_store_cancel(struct device * dev, const char *buf,
+ size_t count)
+{
+ struct tpm_chip *chip = dev_get_drvdata(dev);
+ if (chip == NULL)
+ return 0;
+
+ chip->vendor->cancel(chip);
+ return count;
+}
+
+EXPORT_SYMBOL_GPL(tpm_store_cancel);
+
/*
* Device file system interface to the TPM
@@ -422,24 +369,15 @@ EXPORT_SYMBOL_GPL(tpm_open);
int tpm_release(struct inode *inode, struct file *file)
{
struct tpm_chip *chip = file->private_data;
-
- file->private_data = NULL;
spin_lock(&driver_lock);
+ file->private_data = NULL;
chip->num_opens--;
- spin_unlock(&driver_lock);
-
- down(&chip->timer_manipulation_mutex);
- if (timer_pending(&chip->user_read_timer))
- del_singleshot_timer_sync(&chip->user_read_timer);
- else if (timer_pending(&chip->device_timer))
- del_singleshot_timer_sync(&chip->device_timer);
- up(&chip->timer_manipulation_mutex);
-
- kfree(chip->data_buffer);
+ del_singleshot_timer_sync(&chip->user_read_timer);
atomic_set(&chip->data_pending, 0);
-
pci_dev_put(chip->pci_dev);
+ kfree(chip->data_buffer);
+ spin_unlock(&driver_lock);
return 0;
}
@@ -476,13 +414,7 @@ ssize_t tpm_write(struct file * file, co
up(&chip->buffer_mutex);
/* Set a timeout by which the reader must come claim the result */
- down(&chip->timer_manipulation_mutex);
- init_timer(&chip->user_read_timer);
- chip->user_read_timer.function = user_reader_timeout;
- chip->user_read_timer.data = (unsigned long) chip;
- chip->user_read_timer.expires = jiffies + (60 * HZ);
- add_timer(&chip->user_read_timer);
- up(&chip->timer_manipulation_mutex);
+ mod_timer(&chip->user_read_timer, jiffies + (60 * HZ));
return in_size;
}
@@ -493,29 +425,19 @@ ssize_t tpm_read(struct file * file, cha
size_t size, loff_t * off)
{
struct tpm_chip *chip = file->private_data;
- int ret_size = -ENODATA;
+ int ret_size;
- if (atomic_read(&chip->data_pending) != 0) { /* Result available */
- down(&chip->timer_manipulation_mutex);
- del_singleshot_timer_sync(&chip->user_read_timer);
- up(&chip->timer_manipulation_mutex);
+ 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);
-
- ret_size = atomic_read(&chip->data_pending);
- atomic_set(&chip->data_pending, 0);
-
- if (ret_size == 0) /* timeout just occurred */
- ret_size = -ETIME;
- else if (ret_size > 0) { /* relay data */
- if (size < ret_size)
- ret_size = size;
-
- if (copy_to_user((void __user *) buf,
- chip->data_buffer, ret_size)) {
- ret_size = -EFAULT;
- }
- }
+ if (copy_to_user
+ ((void __user *) buf, chip->data_buffer, ret_size))
+ ret_size = -EFAULT;
up(&chip->buffer_mutex);
}
@@ -542,13 +464,11 @@ void __devexit tpm_remove(struct pci_dev
pci_set_drvdata(pci_dev, NULL);
misc_deregister(&chip->vendor->miscdev);
- device_remove_file(&pci_dev->dev, &dev_attr_pubek);
- device_remove_file(&pci_dev->dev, &dev_attr_pcrs);
- device_remove_file(&pci_dev->dev, &dev_attr_caps);
+ sysfs_remove_group(&pci_dev->dev.kobj, chip->vendor->attr_group);
pci_disable_device(pci_dev);
- dev_mask[chip->dev_num / 32] &= !(1 << (chip->dev_num % 32));
+ dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &= !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));
kfree(chip);
@@ -590,10 +510,6 @@ int tpm_pm_resume(struct pci_dev *pci_de
if (chip == NULL)
return -ENODEV;
- spin_lock(&driver_lock);
- tpm_lpc_bus_init(pci_dev, chip->vendor->base);
- spin_unlock(&driver_lock);
-
return 0;
}
@@ -622,17 +538,21 @@ int tpm_register_hardware(struct pci_dev
init_MUTEX(&chip->buffer_mutex);
init_MUTEX(&chip->tpm_mutex);
- init_MUTEX(&chip->timer_manipulation_mutex);
INIT_LIST_HEAD(&chip->list);
+ init_timer(&chip->user_read_timer);
+ chip->user_read_timer.function = user_reader_timeout;
+ chip->user_read_timer.data = (unsigned long) chip;
+
chip->vendor = entry;
chip->dev_num = -1;
- for (i = 0; i < 32; i++)
- for (j = 0; j < 8; j++)
+ for (i = 0; i < TPM_NUM_MASK_ENTRIES; i++)
+ for (j = 0; j < 8 * sizeof(int); j++)
if ((dev_mask[i] & (1 << j)) == 0) {
- chip->dev_num = i * 32 + j;
+ chip->dev_num =
+ i * TPM_NUM_MASK_ENTRIES + j;
dev_mask[i] |= 1 << j;
goto dev_num_search_complete;
}
@@ -665,31 +585,20 @@ dev_num_search_complete:
return -ENODEV;
}
+ spin_lock(&driver_lock);
+
pci_set_drvdata(pci_dev, chip);
list_add(&chip->list, &tpm_chip_list);
- device_create_file(&pci_dev->dev, &dev_attr_pubek);
- device_create_file(&pci_dev->dev, &dev_attr_pcrs);
- device_create_file(&pci_dev->dev, &dev_attr_caps);
-
- return 0;
-}
+ spin_unlock(&driver_lock);
-EXPORT_SYMBOL_GPL(tpm_register_hardware);
+ sysfs_create_group(&pci_dev->dev.kobj, chip->vendor->attr_group);
-static int __init init_tpm(void)
-{
return 0;
}
-static void __exit cleanup_tpm(void)
-{
-
-}
-
-module_init(init_tpm);
-module_exit(cleanup_tpm);
+EXPORT_SYMBOL_GPL(tpm_register_hardware);
MODULE_AUTHOR("Leendert van Doorn (leendert at watson.ibm.com)");
MODULE_DESCRIPTION("TPM Driver");
--- linux-2.6.11/drivers/char/tpm/tpm_atmel.c.orig 2005-05-24 13:43:56.046703908 -0400
+++ linux-2.6.11/drivers/char/tpm/tpm_atmel.c 2005-05-24 13:44:13.639361788 -0400
@@ -22,17 +22,23 @@
#include "tpm.h"
/* Atmel definitions */
-#define TPM_ATML_BASE 0x400
+enum tpm_atmel_addr {
+ TPM_ATMEL_BASE_ADDR_LO = 0x08,
+ TPM_ATMEL_BASE_ADDR_HI = 0x09
+};
/* write status bits */
-#define ATML_STATUS_ABORT 0x01
-#define ATML_STATUS_LASTBYTE 0x04
-
+enum tpm_atmel_write_status {
+ ATML_STATUS_ABORT = 0x01,
+ ATML_STATUS_LASTBYTE = 0x04
+};
/* read status bits */
-#define ATML_STATUS_BUSY 0x01
-#define ATML_STATUS_DATA_AVAIL 0x02
-#define ATML_STATUS_REWRITE 0x04
-
+enum tpm_atmel_read_status {
+ ATML_STATUS_BUSY = 0x01,
+ ATML_STATUS_DATA_AVAIL = 0x02,
+ ATML_STATUS_REWRITE = 0x04,
+ ATML_STATUS_READY = 0x08
+};
static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
{
@@ -121,14 +127,30 @@ static struct file_operations atmel_ops
.release = tpm_release,
};
+static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
+static DEVICE_ATTR(pcrs, S_IRUGO, tpm_show_pcrs, NULL);
+static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps, NULL);
+static DEVICE_ATTR(cancel, S_IWUSR |S_IWGRP, NULL, tpm_store_cancel);
+
+static struct attribute* atmel_attrs[] = {
+ &dev_attr_pubek.attr,
+ &dev_attr_pcrs.attr,
+ &dev_attr_caps.attr,
+ &dev_attr_cancel.attr,
+ 0,
+};
+
+static struct attribute_group atmel_attr_grp = { .attrs = atmel_attrs };
+
static struct tpm_vendor_specific tpm_atmel = {
.recv = tpm_atml_recv,
.send = tpm_atml_send,
.cancel = tpm_atml_cancel,
.req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL,
.req_complete_val = ATML_STATUS_DATA_AVAIL,
- .base = TPM_ATML_BASE,
- .miscdev = { .fops = &atmel_ops, },
+ .req_canceled = ATML_STATUS_READY,
+ .attr_group = &atmel_attr_grp,
+ .miscdev.fops = &atmel_ops,
};
static int __devinit tpm_atml_init(struct pci_dev *pci_dev,
@@ -136,14 +158,16 @@ static int __devinit tpm_atml_init(struc
{
u8 version[4];
int rc = 0;
+ int lo, hi;
if (pci_enable_device(pci_dev))
return -EIO;
- if (tpm_lpc_bus_init(pci_dev, TPM_ATML_BASE)) {
- rc = -ENODEV;
- goto out_err;
- }
+ lo = tpm_read_index( TPM_ATMEL_BASE_ADDR_LO );
+ hi = tpm_read_index( TPM_ATMEL_BASE_ADDR_HI );
+
+ tpm_atmel.base = (hi<<8)|lo;
+ dev_dbg( &pci_dev->dev, "Operating with base: 0x%x\n", tpm_atmel.base);
/* verify that it is an Atmel part */
if (tpm_read_index(4) != 'A' || tpm_read_index(5) != 'T'
--- linux-2.6.11/drivers/char/tpm/tpm_nsc.c.orig 2005-05-24 13:43:56.047703775 -0400
+++ linux-2.6.11/drivers/char/tpm/tpm_nsc.c 2005-05-24 13:44:13.640361655 -0400
@@ -22,34 +22,46 @@
#include "tpm.h"
/* National definitions */
-#define TPM_NSC_BASE 0x360
-#define TPM_NSC_IRQ 0x07
+enum tpm_nsc_addr{
+ TPM_NSC_BASE = 0x360,
+ TPM_NSC_IRQ = 0x07,
+ TPM_NSC_BASE0_HI = 0x60,
+ TPM_NSC_BASE0_LO = 0x61,
+ TPM_NSC_BASE1_HI = 0x62,
+ TPM_NSC_BASE1_LO = 0x63
+};
-#define NSC_LDN_INDEX 0x07
-#define NSC_SID_INDEX 0x20
-#define NSC_LDC_INDEX 0x30
-#define NSC_DIO_INDEX 0x60
-#define NSC_CIO_INDEX 0x62
-#define NSC_IRQ_INDEX 0x70
-#define NSC_ITS_INDEX 0x71
-
-#define NSC_STATUS 0x01
-#define NSC_COMMAND 0x01
-#define NSC_DATA 0x00
+enum tpm_nsc_index {
+ NSC_LDN_INDEX = 0x07,
+ NSC_SID_INDEX = 0x20,
+ NSC_LDC_INDEX = 0x30,
+ NSC_DIO_INDEX = 0x60,
+ NSC_CIO_INDEX = 0x62,
+ NSC_IRQ_INDEX = 0x70,
+ NSC_ITS_INDEX = 0x71
+};
-/* status bits */
-#define NSC_STATUS_OBF 0x01 /* output buffer full */
-#define NSC_STATUS_IBF 0x02 /* input buffer full */
-#define NSC_STATUS_F0 0x04 /* F0 */
-#define NSC_STATUS_A2 0x08 /* A2 */
-#define NSC_STATUS_RDY 0x10 /* ready to receive command */
-#define NSC_STATUS_IBR 0x20 /* ready to receive data */
+enum tpm_nsc_status_loc {
+ NSC_STATUS = 0x01,
+ NSC_COMMAND = 0x01,
+ NSC_DATA = 0x00
+};
+/* status bits */
+enum tpm_nsc_status {
+ NSC_STATUS_OBF = 0x01, /* output buffer full */
+ NSC_STATUS_IBF = 0x02, /* input buffer full */
+ NSC_STATUS_F0 = 0x04, /* F0 */
+ NSC_STATUS_A2 = 0x08, /* A2 */
+ NSC_STATUS_RDY = 0x10, /* ready to receive command */
+ NSC_STATUS_IBR = 0x20 /* ready to receive data */
+};
/* command bits */
-#define NSC_COMMAND_NORMAL 0x01 /* normal mode */
-#define NSC_COMMAND_EOC 0x03
-#define NSC_COMMAND_CANCEL 0x22
-
+enum tpm_nsc_cmd_mode {
+ NSC_COMMAND_NORMAL = 0x01, /* normal mode */
+ NSC_COMMAND_EOC = 0x03,
+ NSC_COMMAND_CANCEL = 0x22
+};
/*
* Wait for a certain status to appear
*/
@@ -228,30 +240,47 @@ static struct file_operations nsc_ops =
.release = tpm_release,
};
+static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
+static DEVICE_ATTR(pcrs, S_IRUGO, tpm_show_pcrs, NULL);
+static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps, NULL);
+static DEVICE_ATTR(cancel, S_IWUSR|S_IWGRP, NULL, tpm_store_cancel);
+
+static struct attribute * nsc_attrs[] = {
+ &dev_attr_pubek.attr,
+ &dev_attr_pcrs.attr,
+ &dev_attr_caps.attr,
+ &dev_attr_cancel.attr,
+ 0,
+};
+
+static struct attribute_group nsc_attr_grp = { .attrs = nsc_attrs };
+
static struct tpm_vendor_specific tpm_nsc = {
.recv = tpm_nsc_recv,
.send = tpm_nsc_send,
.cancel = tpm_nsc_cancel,
.req_complete_mask = NSC_STATUS_OBF,
.req_complete_val = NSC_STATUS_OBF,
- .base = TPM_NSC_BASE,
- .miscdev = { .fops = &nsc_ops, },
-
+ .req_canceled = NSC_STATUS_RDY,
+ .attr_group = &nsc_attr_grp,
+ .miscdev.fops = &nsc_ops,
+
};
static int __devinit tpm_nsc_init(struct pci_dev *pci_dev,
const struct pci_device_id *pci_id)
{
int rc = 0;
+ int lo, hi;
+
+ hi = tpm_read_index(TPM_NSC_BASE0_HI);
+ lo = tpm_read_index(TPM_NSC_BASE0_LO);
+
+ tpm_nsc.base = (hi<<8) | lo;
if (pci_enable_device(pci_dev))
return -EIO;
- if (tpm_lpc_bus_init(pci_dev, TPM_NSC_BASE)) {
- rc = -ENODEV;
- goto out_err;
- }
-
/* verify that it is a National part (SID) */
if (tpm_read_index(NSC_SID_INDEX) != 0xEF) {
rc = -ENODEV;
Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/dist/rpms/kernel/FC-4/kernel-2.6.spec,v
retrieving revision 1.1387
retrieving revision 1.1387.2.1
diff -u -r1.1387 -r1.1387.2.1
--- kernel-2.6.spec 1 Jul 2005 16:29:24 -0000 1.1387
+++ kernel-2.6.spec 1 Jul 2005 21:02:04 -0000 1.1387.2.1
@@ -24,7 +24,8 @@
%define sublevel 12
%define kversion 2.6.%{sublevel}
%define rpmversion 2.6.%{sublevel}
-%define rhbsys %([ -r /etc/beehive-root -o -n "%{?__beehive_build}" ] && echo || echo .`whoami`)
+#%define rhbsys %([ -r /etc/beehive-root -o -n "%{?__beehive_build}" ] && echo || echo .`whoami`)
+%define rhbsys .jwltest.10
%if %{FC3}
%define release %(R="$Revision$"; RR="${R##: }"; echo ${RR%%?})_FC3%{rhbsys}
%endif
@@ -163,7 +164,8 @@
License: GPLv2
Version: %{rpmversion}
Release: %{release}
-ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 ppc64iseries sparc sparc64
+#ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 ppc64iseries sparc sparc64
+ExclusiveArch: noarch %{all_x86} x86_64 ppc64 ppc64iseries ppc
ExclusiveOS: Linux
Provides: kernel = %{version}
Provides: kernel-drm = 4.3.0
@@ -306,6 +308,7 @@
Patch1301: linux-2.6.12-net-sundance-ip100A.patch
Patch1302: linux-2.6.12-net-make-orinoco-suck-less.patch
Patch1304: linux-2.6.12-net-atm-lanai-nodev-rmmod.patch
+Patch1305: jwltest-b44-link-check.patch
# USB bits
Patch1400: linux-2.6.12-usb-old_scheme_first.patch
@@ -343,6 +346,9 @@
Patch1890: linux-2.6.12-firedire-init-breakage.patch
Patch1900: linux-2.6.12-pwc-warning.patch
Patch1910: linux-2.6.12-ns558-nodev-rmmod.patch
+Patch1920: jwltest-tpm-fixes.patch
+Patch1930: jwltest-acpi-dsdt-initrd.patch
+Patch1940: jwltest-pci-enable-d3hot.patch
Patch2000: linux-2.6.11-vm-taint.patch
Patch2001: linux-2.6.9-vm-oomkiller-debugging.patch
@@ -358,6 +364,7 @@
Patch3020: linux-2.6.9-ipw2100.patch
Patch3021: linux-2.6.9-ipw2200.patch
Patch3022: linux-2.6.9-ieee80211.patch
+Patch3023: jwltest-ipw2100-1_1_0.patch
#
# 10000 to 20000 is for stuff that has to come last due to the
@@ -724,6 +731,8 @@
%patch1302 -p1
# Fix rmmod lanai
%patch1304 -p1
+# b44 early link check
+%patch1305 -p1
# USB Bits.
# Enable both old and new style USB initialisation.
@@ -793,6 +802,12 @@
%patch1900 -p1
# Fix oops in ns558 on rmmod
%patch1910 -p1
+# TPM fixes
+%patch1920 -p1
+# Add DSDT override from initrd
+%patch1930 -p1
+# avoid PCI config loss during enable from D3hot
+%patch1940 -p1
#
# VM related fixes.
@@ -820,6 +835,7 @@
%patch3020 -p1
%patch3021 -p1
%patch3022 -p1
+#%patch3023 -p1 -E
#
# Patches 5000 to 6000 are reserved for new drivers that are about to
- Previous message (by thread): rpms/gtk2/devel gtk+-2.7.0-themename.patch, 1.1, 1.2 gtk2.spec, 1.79, 1.80
- Next message (by thread): rpms/kernel/FC-4/configs config-generic, 1.28, 1.28.6.1 config-ia64-generic, 1.3, 1.3.16.1 config-x86-generic, 1.8, 1.8.14.1 config-x86_64-generic, 1.8, 1.8.6.1
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the fedora-cvs-commits
mailing list