Merge ../to-linus
This commit is contained in:
commit
95f193aa4f
126 changed files with 2550 additions and 1471 deletions
4
CREDITS
4
CREDITS
|
@ -2380,8 +2380,8 @@ E: tmolina@cablespeed.com
|
|||
D: bug fixes, documentation, minor hackery
|
||||
|
||||
N: James Morris
|
||||
E: jmorris@redhat.com
|
||||
W: http://www.intercode.com.au/jmorris/
|
||||
E: jmorris@namei.org
|
||||
W: http://namei.org/
|
||||
D: Netfilter, Linux Security Modules (LSM), SELinux, IPSec,
|
||||
D: Crypto API, general networking, miscellaneous.
|
||||
S: PO Box 707
|
||||
|
|
93
Documentation/arm/Samsung-S3C24XX/USB-Host.txt
Normal file
93
Documentation/arm/Samsung-S3C24XX/USB-Host.txt
Normal file
|
@ -0,0 +1,93 @@
|
|||
S3C24XX USB Host support
|
||||
========================
|
||||
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This document details the S3C2410/S3C2440 in-built OHCI USB host support.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Enable at least the following kernel options:
|
||||
|
||||
menuconfig:
|
||||
|
||||
Device Drivers --->
|
||||
USB support --->
|
||||
<*> Support for Host-side USB
|
||||
<*> OHCI HCD support
|
||||
|
||||
|
||||
.config:
|
||||
CONFIG_USB
|
||||
CONFIG_USB_OHCI_HCD
|
||||
|
||||
|
||||
Once these options are configured, the standard set of USB device
|
||||
drivers can be configured and used.
|
||||
|
||||
|
||||
Board Support
|
||||
-------------
|
||||
|
||||
The driver attaches to a platform device, which will need to be
|
||||
added by the board specific support file in linux/arch/arm/mach-s3c2410,
|
||||
such as mach-bast.c or mach-smdk2410.c
|
||||
|
||||
The platform device's platform_data field is only needed if the
|
||||
board implements extra power control or over-current monitoring.
|
||||
|
||||
The OHCI driver does not ensure the state of the S3C2410's MISCCTRL
|
||||
register, so if both ports are to be used for the host, then it is
|
||||
the board support file's responsibility to ensure that the second
|
||||
port is configured to be connected to the OHCI core.
|
||||
|
||||
|
||||
Platform Data
|
||||
-------------
|
||||
|
||||
See linux/include/asm-arm/arch-s3c2410/usb-control.h for the
|
||||
descriptions of the platform device data. An implementation
|
||||
can be found in linux/arch/arm/mach-s3c2410/usb-simtec.c .
|
||||
|
||||
The `struct s3c2410_hcd_info` contains a pair of functions
|
||||
that get called to enable over-current detection, and to
|
||||
control the port power status.
|
||||
|
||||
The ports are numbered 0 and 1.
|
||||
|
||||
power_control:
|
||||
|
||||
Called to enable or disable the power on the port.
|
||||
|
||||
enable_oc:
|
||||
|
||||
Called to enable or disable the over-current monitoring.
|
||||
This should claim or release the resources being used to
|
||||
check the power condition on the port, such as an IRQ.
|
||||
|
||||
report_oc:
|
||||
|
||||
The OHCI driver fills this field in for the over-current code
|
||||
to call when there is a change to the over-current state on
|
||||
an port. The ports argument is a bitmask of 1 bit per port,
|
||||
with bit X being 1 for an over-current on port X.
|
||||
|
||||
The function s3c2410_usb_report_oc() has been provided to
|
||||
ensure this is called correctly.
|
||||
|
||||
port[x]:
|
||||
|
||||
This is struct describes each port, 0 or 1. The platform driver
|
||||
should set the flags field of each port to S3C_HCDFLG_USED if
|
||||
the port is enabled.
|
||||
|
||||
|
||||
|
||||
Document Author
|
||||
---------------
|
||||
|
||||
Ben Dooks, (c) 2005 Simtec Electronics
|
|
@ -6,6 +6,11 @@ only the AMD64 specific ones are listed here.
|
|||
Machine check
|
||||
|
||||
mce=off disable machine check
|
||||
mce=bootlog Enable logging of machine checks left over from booting.
|
||||
Disabled by default because some BIOS leave bogus ones.
|
||||
If your BIOS doesn't do that it's a good idea to enable though
|
||||
to make sure you log even machine check events that result
|
||||
in a reboot.
|
||||
|
||||
nomce (for compatibility with i386): same as mce=off
|
||||
|
||||
|
|
|
@ -1658,7 +1658,7 @@ M: kuznet@ms2.inr.ac.ru
|
|||
P: Pekka Savola (ipv6)
|
||||
M: pekkas@netcore.fi
|
||||
P: James Morris
|
||||
M: jmorris@redhat.com
|
||||
M: jmorris@namei.org
|
||||
P: Hideaki YOSHIFUJI
|
||||
M: yoshfuji@linux-ipv6.org
|
||||
P: Patrick McHardy
|
||||
|
@ -2047,7 +2047,7 @@ SELINUX SECURITY MODULE
|
|||
P: Stephen Smalley
|
||||
M: sds@epoch.ncsc.mil
|
||||
P: James Morris
|
||||
M: jmorris@redhat.com
|
||||
M: jmorris@namei.org
|
||||
L: linux-kernel@vger.kernel.org (kernel issues)
|
||||
L: selinux@tycho.nsa.gov (general discussion)
|
||||
W: http://www.nsa.gov/selinux
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 13
|
||||
EXTRAVERSION =-rc5
|
||||
EXTRAVERSION =-rc6
|
||||
NAME=Woozy Numbat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -41,18 +41,19 @@ summary from [1.]>" for easy identification by the developers
|
|||
[2.] Full description of the problem/report:
|
||||
[3.] Keywords (i.e., modules, networking, kernel):
|
||||
[4.] Kernel version (from /proc/version):
|
||||
[5.] Output of Oops.. message (if applicable) with symbolic information
|
||||
[5.] Most recent kernel version which did not have the bug:
|
||||
[6.] Output of Oops.. message (if applicable) with symbolic information
|
||||
resolved (see Documentation/oops-tracing.txt)
|
||||
[6.] A small shell script or example program which triggers the
|
||||
[7.] A small shell script or example program which triggers the
|
||||
problem (if possible)
|
||||
[7.] Environment
|
||||
[7.1.] Software (add the output of the ver_linux script here)
|
||||
[7.2.] Processor information (from /proc/cpuinfo):
|
||||
[7.3.] Module information (from /proc/modules):
|
||||
[7.4.] Loaded driver and hardware information (/proc/ioports, /proc/iomem)
|
||||
[7.5.] PCI information ('lspci -vvv' as root)
|
||||
[7.6.] SCSI information (from /proc/scsi/scsi)
|
||||
[7.7.] Other information that might be relevant to the problem
|
||||
[8.] Environment
|
||||
[8.1.] Software (add the output of the ver_linux script here)
|
||||
[8.2.] Processor information (from /proc/cpuinfo):
|
||||
[8.3.] Module information (from /proc/modules):
|
||||
[8.4.] Loaded driver and hardware information (/proc/ioports, /proc/iomem)
|
||||
[8.5.] PCI information ('lspci -vvv' as root)
|
||||
[8.6.] SCSI information (from /proc/scsi/scsi)
|
||||
[8.7.] Other information that might be relevant to the problem
|
||||
(please look in /proc and include all information that you
|
||||
think to be relevant):
|
||||
[X.] Other notes, patches, fixes, workarounds:
|
||||
|
|
|
@ -533,6 +533,13 @@ ENTRY(__switch_to)
|
|||
ldr r3, [r2, #TI_TP_VALUE]
|
||||
stmia ip!, {r4 - sl, fp, sp, lr} @ Store most regs on stack
|
||||
ldr r6, [r2, #TI_CPU_DOMAIN]!
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
#ifdef CONFIG_CPU_MPCORE
|
||||
clrex
|
||||
#else
|
||||
strex r3, r4, [ip] @ Clear exclusive monitor
|
||||
#endif
|
||||
#endif
|
||||
#if defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_IWMMXT)
|
||||
mra r4, r5, acc0
|
||||
stmia ip, {r4, r5}
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
#include <linux/config.h>
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_MPCORE)
|
||||
.macro bitop, instr
|
||||
mov r2, #1
|
||||
and r3, r0, #7 @ Get bit offset
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* linux/arch/arm/mach-s3c2410/usb-simtec.c
|
||||
*
|
||||
* Copyright (c) 2004 Simtec Electronics
|
||||
* Copyright (c) 2004,2005 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* http://www.simtec.co.uk/products/EB2410ITX/
|
||||
|
@ -14,6 +14,8 @@
|
|||
* Modifications:
|
||||
* 14-Sep-2004 BJD Created
|
||||
* 18-Oct-2004 BJD Cleanups, and added code to report OC cleared
|
||||
* 09-Aug-2005 BJD Renamed s3c2410_report_oc to s3c2410_usb_report_oc
|
||||
* 09-Aug-2005 BJD Ports powered only if both are enabled
|
||||
*/
|
||||
|
||||
#define DEBUG
|
||||
|
@ -47,13 +49,19 @@
|
|||
* designed boards.
|
||||
*/
|
||||
|
||||
static unsigned int power_state[2];
|
||||
|
||||
static void
|
||||
usb_simtec_powercontrol(int port, int to)
|
||||
{
|
||||
pr_debug("usb_simtec_powercontrol(%d,%d)\n", port, to);
|
||||
|
||||
if (port == 1)
|
||||
s3c2410_gpio_setpin(S3C2410_GPB4, to ? 0:1);
|
||||
power_state[port] = to;
|
||||
|
||||
if (power_state[0] && power_state[1])
|
||||
s3c2410_gpio_setpin(S3C2410_GPB4, 0);
|
||||
else
|
||||
s3c2410_gpio_setpin(S3C2410_GPB4, 1);
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
|
@ -63,10 +71,10 @@ usb_simtec_ocirq(int irq, void *pw, struct pt_regs *regs)
|
|||
|
||||
if (s3c2410_gpio_getpin(S3C2410_GPG10) == 0) {
|
||||
pr_debug("usb_simtec: over-current irq (oc detected)\n");
|
||||
s3c2410_report_oc(info, 3);
|
||||
s3c2410_usb_report_oc(info, 3);
|
||||
} else {
|
||||
pr_debug("usb_simtec: over-current irq (oc cleared)\n");
|
||||
s3c2410_report_oc(info, 0);
|
||||
s3c2410_usb_report_oc(info, 0);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
|
|
@ -383,6 +383,7 @@ static void __init build_mem_type_table(void)
|
|||
{
|
||||
struct cachepolicy *cp;
|
||||
unsigned int cr = get_cr();
|
||||
unsigned int user_pgprot;
|
||||
int cpu_arch = cpu_architecture();
|
||||
int i;
|
||||
|
||||
|
@ -408,6 +409,9 @@ static void __init build_mem_type_table(void)
|
|||
}
|
||||
}
|
||||
|
||||
cp = &cache_policies[cachepolicy];
|
||||
user_pgprot = cp->pte;
|
||||
|
||||
/*
|
||||
* ARMv6 and above have extended page tables.
|
||||
*/
|
||||
|
@ -426,11 +430,18 @@ static void __init build_mem_type_table(void)
|
|||
mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||
mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||
|
||||
/*
|
||||
* Mark the device area as "shared device"
|
||||
*/
|
||||
mem_types[MT_DEVICE].prot_pte |= L_PTE_BUFFERABLE;
|
||||
mem_types[MT_DEVICE].prot_sect |= PMD_SECT_BUFFERED;
|
||||
}
|
||||
|
||||
cp = &cache_policies[cachepolicy];
|
||||
/*
|
||||
* User pages need to be mapped with the ASID
|
||||
* (iow, non-global)
|
||||
*/
|
||||
user_pgprot |= L_PTE_ASID;
|
||||
}
|
||||
|
||||
if (cpu_arch >= CPU_ARCH_ARMv5) {
|
||||
mem_types[MT_LOW_VECTORS].prot_pte |= cp->pte & PTE_CACHEABLE;
|
||||
|
@ -448,7 +459,7 @@ static void __init build_mem_type_table(void)
|
|||
|
||||
for (i = 0; i < 16; i++) {
|
||||
unsigned long v = pgprot_val(protection_map[i]);
|
||||
v &= (~(PTE_BUFFERABLE|PTE_CACHEABLE)) | cp->pte;
|
||||
v &= (~(PTE_BUFFERABLE|PTE_CACHEABLE)) | user_pgprot;
|
||||
protection_map[i] = __pgprot(v);
|
||||
}
|
||||
|
||||
|
|
|
@ -111,12 +111,6 @@ ENTRY(cpu_v6_switch_mm)
|
|||
mcr p15, 0, r1, c13, c0, 1 @ set context ID
|
||||
mov pc, lr
|
||||
|
||||
#define nG (1 << 11)
|
||||
#define APX (1 << 9)
|
||||
#define AP1 (1 << 5)
|
||||
#define AP0 (1 << 4)
|
||||
#define XN (1 << 0)
|
||||
|
||||
/*
|
||||
* cpu_v6_set_pte(ptep, pte)
|
||||
*
|
||||
|
@ -139,24 +133,24 @@ ENTRY(cpu_v6_switch_mm)
|
|||
ENTRY(cpu_v6_set_pte)
|
||||
str r1, [r0], #-2048 @ linux version
|
||||
|
||||
bic r2, r1, #0x00000ff0
|
||||
bic r2, r1, #0x000007f0
|
||||
bic r2, r2, #0x00000003
|
||||
orr r2, r2, #AP0 | 2
|
||||
orr r2, r2, #PTE_EXT_AP0 | 2
|
||||
|
||||
tst r1, #L_PTE_WRITE
|
||||
tstne r1, #L_PTE_DIRTY
|
||||
orreq r2, r2, #APX
|
||||
orreq r2, r2, #PTE_EXT_APX
|
||||
|
||||
tst r1, #L_PTE_USER
|
||||
orrne r2, r2, #AP1 | nG
|
||||
tstne r2, #APX
|
||||
bicne r2, r2, #APX | AP0
|
||||
orrne r2, r2, #PTE_EXT_AP1
|
||||
tstne r2, #PTE_EXT_APX
|
||||
bicne r2, r2, #PTE_EXT_APX | PTE_EXT_AP0
|
||||
|
||||
tst r1, #L_PTE_YOUNG
|
||||
biceq r2, r2, #APX | AP1 | AP0
|
||||
biceq r2, r2, #PTE_EXT_APX | PTE_EXT_AP_MASK
|
||||
|
||||
@ tst r1, #L_PTE_EXEC
|
||||
@ orreq r2, r2, #XN
|
||||
@ orreq r2, r2, #PTE_EXT_XN
|
||||
|
||||
tst r1, #L_PTE_PRESENT
|
||||
moveq r2, #0
|
||||
|
|
|
@ -9,12 +9,15 @@
|
|||
void (*pm_power_off)(void);
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
void machine_restart(char * __unused)
|
||||
void machine_shutdown(void)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
smp_send_stop();
|
||||
#endif
|
||||
}
|
||||
|
||||
void machine_emergency_restart(void)
|
||||
{
|
||||
/*
|
||||
* Visual Workstations restart after this
|
||||
* register is poked on the PIIX4
|
||||
|
@ -22,6 +25,12 @@ void machine_restart(char * __unused)
|
|||
outb(PIIX4_RESET_VAL, PIIX4_RESET_PORT);
|
||||
}
|
||||
|
||||
void machine_restart(char * __unused)
|
||||
{
|
||||
machine_shutdown();
|
||||
machine_emergency_restart();
|
||||
}
|
||||
|
||||
void machine_power_off(void)
|
||||
{
|
||||
unsigned short pm_status;
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include "cobalt.h"
|
||||
#include "piix4.h"
|
||||
|
||||
int no_broadcast;
|
||||
|
||||
char visws_board_type = -1;
|
||||
char visws_board_rev = -1;
|
||||
|
||||
|
|
|
@ -251,6 +251,12 @@ kb_wait(void)
|
|||
break;
|
||||
}
|
||||
|
||||
void
|
||||
machine_shutdown(void)
|
||||
{
|
||||
/* Architecture specific shutdown needed before a kexec */
|
||||
}
|
||||
|
||||
void
|
||||
machine_restart(char *cmd)
|
||||
{
|
||||
|
@ -278,6 +284,13 @@ machine_restart(char *cmd)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
machine_emergency_restart(void)
|
||||
{
|
||||
/*for now, just hook this to a warm restart */
|
||||
machine_restart(NULL);
|
||||
}
|
||||
|
||||
void
|
||||
mca_nmi_hook(void)
|
||||
{
|
||||
|
|
|
@ -243,14 +243,6 @@ static unsigned long calculate_numa_remap_pages(void)
|
|||
/* now the roundup is correct, convert to PAGE_SIZE pages */
|
||||
size = size * PTRS_PER_PTE;
|
||||
|
||||
if (node_end_pfn[nid] & (PTRS_PER_PTE-1)) {
|
||||
/*
|
||||
* Adjust size if node_end_pfn is not on a proper
|
||||
* pmd boundary. remap_numa_kva will barf otherwise.
|
||||
*/
|
||||
size += node_end_pfn[nid] & (PTRS_PER_PTE-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate the region we are allocating only contains valid
|
||||
* pages.
|
||||
|
@ -270,6 +262,17 @@ static unsigned long calculate_numa_remap_pages(void)
|
|||
reserve_pages += size;
|
||||
printk("Shrinking node %d from %ld pages to %ld pages\n",
|
||||
nid, node_end_pfn[nid], node_end_pfn[nid] - size);
|
||||
|
||||
if (node_end_pfn[nid] & (PTRS_PER_PTE-1)) {
|
||||
/*
|
||||
* Align node_end_pfn[] and node_remap_start_pfn[] to
|
||||
* pmd boundary. remap_numa_kva will barf otherwise.
|
||||
*/
|
||||
printk("Shrinking node %d further by %ld pages for proper alignment\n",
|
||||
nid, node_end_pfn[nid] & (PTRS_PER_PTE-1));
|
||||
size += node_end_pfn[nid] & (PTRS_PER_PTE-1);
|
||||
}
|
||||
|
||||
node_end_pfn[nid] -= size;
|
||||
node_remap_start_pfn[nid] = node_end_pfn[nid];
|
||||
}
|
||||
|
|
|
@ -18,8 +18,10 @@
|
|||
extern struct pci_raw_ops pci_direct_conf1;
|
||||
|
||||
static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; }
|
||||
static void pci_visws_disable_irq(struct pci_dev *dev) { }
|
||||
|
||||
int (*pcibios_enable_irq)(struct pci_dev *dev) = &pci_visws_enable_irq;
|
||||
void (*pcibios_disable_irq)(struct pci_dev *dev) = &pci_visws_disable_irq;
|
||||
|
||||
void __init pcibios_penalize_isa_irq(int irq, int active) {}
|
||||
|
||||
|
|
|
@ -179,7 +179,7 @@ static int can_do_pal_halt = 1;
|
|||
|
||||
static int __init nohalt_setup(char * str)
|
||||
{
|
||||
pal_halt = 0;
|
||||
pal_halt = can_do_pal_halt = 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("nohalt", nohalt_setup);
|
||||
|
|
|
@ -69,9 +69,9 @@ config FEC_QS6612
|
|||
|
||||
config ENET_BIG_BUFFERS
|
||||
bool "Use Big CPM Ethernet Buffers"
|
||||
depends on NET_ETHERNET
|
||||
depends on SCC_ENET || FEC_ENET
|
||||
help
|
||||
Allocate large buffers for MPC8xx Etherenet. Increases throughput
|
||||
Allocate large buffers for MPC8xx Ethernet. Increases throughput
|
||||
and decreases the likelihood of dropped packets, but costs memory.
|
||||
|
||||
config HTDMSOUND
|
||||
|
|
|
@ -39,8 +39,6 @@
|
|||
#include <asm/tlbflush.h>
|
||||
#include <asm/rheap.h>
|
||||
|
||||
extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep);
|
||||
|
||||
static void m8xx_cpm_dpinit(void);
|
||||
static uint host_buffer; /* One page of host buffer */
|
||||
static uint host_end; /* end + 1 */
|
||||
|
@ -108,14 +106,11 @@ struct hw_interrupt_type cpm_pic = {
|
|||
.end = cpm_eoi,
|
||||
};
|
||||
|
||||
extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
|
||||
|
||||
void
|
||||
m8xx_cpm_reset(uint bootpage)
|
||||
m8xx_cpm_reset(void)
|
||||
{
|
||||
volatile immap_t *imp;
|
||||
volatile cpm8xx_t *commproc;
|
||||
pte_t *pte;
|
||||
|
||||
imp = (immap_t *)IMAP_ADDR;
|
||||
commproc = (cpm8xx_t *)&imp->im_cpm;
|
||||
|
@ -143,17 +138,6 @@ m8xx_cpm_reset(uint bootpage)
|
|||
/* Reclaim the DP memory for our use. */
|
||||
m8xx_cpm_dpinit();
|
||||
|
||||
/* get the PTE for the bootpage */
|
||||
if (!get_pteptr(&init_mm, bootpage, &pte))
|
||||
panic("get_pteptr failed\n");
|
||||
|
||||
/* and make it uncachable */
|
||||
pte_val(*pte) |= _PAGE_NO_CACHE;
|
||||
_tlbie(bootpage);
|
||||
|
||||
host_buffer = bootpage;
|
||||
host_end = host_buffer + PAGE_SIZE;
|
||||
|
||||
/* Tell everyone where the comm processor resides.
|
||||
*/
|
||||
cpmp = (cpm8xx_t *)commproc;
|
||||
|
@ -384,8 +368,6 @@ static rh_info_t cpm_dpmem_info;
|
|||
|
||||
void m8xx_cpm_dpinit(void)
|
||||
{
|
||||
cpm8xx_t *cp = &((immap_t *)IMAP_ADDR)->im_cpm;
|
||||
|
||||
spin_lock_init(&cpm_dpmem_lock);
|
||||
|
||||
/* Initialize the info header */
|
||||
|
|
|
@ -173,7 +173,7 @@ struct fec_enet_private {
|
|||
uint phy_status;
|
||||
uint phy_speed;
|
||||
phy_info_t *phy;
|
||||
struct tq_struct phy_task;
|
||||
struct work_struct phy_task;
|
||||
|
||||
uint sequence_done;
|
||||
|
||||
|
@ -199,7 +199,8 @@ static int fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
|||
#ifdef CONFIG_USE_MDIO
|
||||
static void fec_enet_mii(struct net_device *dev);
|
||||
#endif /* CONFIG_USE_MDIO */
|
||||
static void fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs);
|
||||
static irqreturn_t fec_enet_interrupt(int irq, void * dev_id,
|
||||
struct pt_regs * regs);
|
||||
#ifdef CONFIG_FEC_PACKETHOOK
|
||||
static void fec_enet_tx(struct net_device *dev, __u32 regval);
|
||||
static void fec_enet_rx(struct net_device *dev, __u32 regval);
|
||||
|
@ -471,7 +472,7 @@ fec_timeout(struct net_device *dev)
|
|||
/* The interrupt handler.
|
||||
* This is called from the MPC core interrupt.
|
||||
*/
|
||||
static void
|
||||
static irqreturn_t
|
||||
fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
|
@ -525,6 +526,7 @@ printk("%s[%d] %s: unexpected FEC_ENET_MII event\n", __FILE__,__LINE__,__FUNCTIO
|
|||
}
|
||||
|
||||
}
|
||||
return IRQ_RETVAL(IRQ_HANDLED);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1263,8 +1265,9 @@ static void mii_display_status(struct net_device *dev)
|
|||
printk(".\n");
|
||||
}
|
||||
|
||||
static void mii_display_config(struct net_device *dev)
|
||||
static void mii_display_config(void *priv)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *)priv;
|
||||
struct fec_enet_private *fep = dev->priv;
|
||||
volatile uint *s = &(fep->phy_status);
|
||||
|
||||
|
@ -1294,8 +1297,9 @@ static void mii_display_config(struct net_device *dev)
|
|||
fep->sequence_done = 1;
|
||||
}
|
||||
|
||||
static void mii_relink(struct net_device *dev)
|
||||
static void mii_relink(void *priv)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *)priv;
|
||||
struct fec_enet_private *fep = dev->priv;
|
||||
int duplex;
|
||||
|
||||
|
@ -1323,18 +1327,16 @@ static void mii_queue_relink(uint mii_reg, struct net_device *dev)
|
|||
{
|
||||
struct fec_enet_private *fep = dev->priv;
|
||||
|
||||
fep->phy_task.routine = (void *)mii_relink;
|
||||
fep->phy_task.data = dev;
|
||||
schedule_task(&fep->phy_task);
|
||||
INIT_WORK(&fep->phy_task, mii_relink, (void *)dev);
|
||||
schedule_work(&fep->phy_task);
|
||||
}
|
||||
|
||||
static void mii_queue_config(uint mii_reg, struct net_device *dev)
|
||||
{
|
||||
struct fec_enet_private *fep = dev->priv;
|
||||
|
||||
fep->phy_task.routine = (void *)mii_display_config;
|
||||
fep->phy_task.data = dev;
|
||||
schedule_task(&fep->phy_task);
|
||||
INIT_WORK(&fep->phy_task, mii_display_config, (void *)dev);
|
||||
schedule_work(&fep->phy_task);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1403,11 +1405,11 @@ mii_discover_phy(uint mii_reg, struct net_device *dev)
|
|||
|
||||
/* This interrupt occurs when the PHY detects a link change.
|
||||
*/
|
||||
static void
|
||||
static
|
||||
#ifdef CONFIG_RPXCLASSIC
|
||||
mii_link_interrupt(void *dev_id)
|
||||
void mii_link_interrupt(void *dev_id)
|
||||
#else
|
||||
mii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs)
|
||||
irqreturn_t mii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs)
|
||||
#endif
|
||||
{
|
||||
#ifdef CONFIG_USE_MDIO
|
||||
|
@ -1440,6 +1442,9 @@ mii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs)
|
|||
printk("%s[%d] %s: unexpected Link interrupt\n", __FILE__,__LINE__,__FUNCTION__);
|
||||
#endif /* CONFIG_USE_MDIO */
|
||||
|
||||
#ifndef CONFIG_RPXCLASSIC
|
||||
return IRQ_RETVAL(IRQ_HANDLED);
|
||||
#endif /* CONFIG_RPXCLASSIC */
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1575,7 +1580,7 @@ static int __init fec_enet_init(void)
|
|||
struct fec_enet_private *fep;
|
||||
int i, j, k, err;
|
||||
unsigned char *eap, *iap, *ba;
|
||||
unsigned long mem_addr;
|
||||
dma_addr_t mem_addr;
|
||||
volatile cbd_t *bdp;
|
||||
cbd_t *cbd_base;
|
||||
volatile immap_t *immap;
|
||||
|
@ -1640,7 +1645,8 @@ static int __init fec_enet_init(void)
|
|||
printk("FEC initialization failed.\n");
|
||||
return 1;
|
||||
}
|
||||
cbd_base = (cbd_t *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr);
|
||||
cbd_base = (cbd_t *)dma_alloc_coherent(dev->class_dev.dev, PAGE_SIZE,
|
||||
&mem_addr, GFP_KERNEL);
|
||||
|
||||
/* Set receive and transmit descriptor base.
|
||||
*/
|
||||
|
@ -1657,7 +1663,10 @@ static int __init fec_enet_init(void)
|
|||
|
||||
/* Allocate a page.
|
||||
*/
|
||||
ba = (unsigned char *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr);
|
||||
ba = (unsigned char *)dma_alloc_coherent(dev->class_dev.dev,
|
||||
PAGE_SIZE,
|
||||
&mem_addr,
|
||||
GFP_KERNEL);
|
||||
/* BUG: no check for failure */
|
||||
|
||||
/* Initialize the BD for every fragment in the page.
|
||||
|
|
|
@ -324,7 +324,7 @@ EXPORT_SYMBOL(__res);
|
|||
|
||||
EXPORT_SYMBOL(next_mmu_context);
|
||||
EXPORT_SYMBOL(set_context);
|
||||
EXPORT_SYMBOL(handle_mm_fault); /* For MOL */
|
||||
EXPORT_SYMBOL_GPL(__handle_mm_fault); /* For MOL */
|
||||
EXPORT_SYMBOL(disarm_decr);
|
||||
#ifdef CONFIG_PPC_STD_MMU
|
||||
extern long mol_trampoline;
|
||||
|
|
|
@ -57,7 +57,7 @@ unsigned char __res[sizeof(bd_t)];
|
|||
extern void m8xx_ide_init(void);
|
||||
|
||||
extern unsigned long find_available_memory(void);
|
||||
extern void m8xx_cpm_reset(uint cpm_page);
|
||||
extern void m8xx_cpm_reset();
|
||||
extern void m8xx_wdt_handler_install(bd_t *bp);
|
||||
extern void rpxfb_alloc_pages(void);
|
||||
extern void cpm_interrupt_init(void);
|
||||
|
@ -70,13 +70,9 @@ board_init(void)
|
|||
void __init
|
||||
m8xx_setup_arch(void)
|
||||
{
|
||||
int cpm_page;
|
||||
|
||||
cpm_page = (int) alloc_bootmem_pages(PAGE_SIZE);
|
||||
|
||||
/* Reset the Communication Processor Module.
|
||||
*/
|
||||
m8xx_cpm_reset(cpm_page);
|
||||
m8xx_cpm_reset();
|
||||
|
||||
#ifdef CONFIG_FB_RPX
|
||||
rpxfb_alloc_pages();
|
||||
|
|
|
@ -191,8 +191,8 @@ struct platform_device ppc_sys_platform_devices[] = {
|
|||
.num_resources = 2,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.start = 0x22000,
|
||||
.end = 0x22fff,
|
||||
.start = 0x23000,
|
||||
.end = 0x23fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
|
@ -208,8 +208,8 @@ struct platform_device ppc_sys_platform_devices[] = {
|
|||
.num_resources = 2,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.start = 0x23000,
|
||||
.end = 0x23fff,
|
||||
.start = 0x22000,
|
||||
.end = 0x22fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
|
|
|
@ -1307,7 +1307,7 @@ local int huft_build(
|
|||
{
|
||||
*t = (inflate_huft *)Z_NULL;
|
||||
*m = 0;
|
||||
return Z_OK;
|
||||
return Z_DATA_ERROR;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1351,6 +1351,7 @@ local int huft_build(
|
|||
if ((j = *p++) != 0)
|
||||
v[x[j]++] = i;
|
||||
} while (++i < n);
|
||||
n = x[g]; /* set n to length of v */
|
||||
|
||||
|
||||
/* Generate the Huffman codes and for each, make the table entries */
|
||||
|
|
987
arch/ppc64/configs/bpa_defconfig
Normal file
987
arch/ppc64/configs/bpa_defconfig
Normal file
|
@ -0,0 +1,987 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:12:19 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_HAVE_DEC_LOCK=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
# CONFIG_KMOD is not set
|
||||
CONFIG_STOP_MACHINE=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
|
||||
#
|
||||
# Platform support
|
||||
#
|
||||
# CONFIG_PPC_ISERIES is not set
|
||||
CONFIG_PPC_MULTIPLATFORM=y
|
||||
# CONFIG_PPC_PSERIES is not set
|
||||
CONFIG_PPC_BPA=y
|
||||
# CONFIG_PPC_PMAC is not set
|
||||
# CONFIG_PPC_MAPLE is not set
|
||||
CONFIG_PPC=y
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_PPC_OF=y
|
||||
CONFIG_BPA_IIC=y
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_KEXEC=y
|
||||
# CONFIG_U3_DART is not set
|
||||
# CONFIG_BOOTX_TEXT is not set
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
# CONFIG_IOMMU_VMERGE is not set
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_NUMA is not set
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_PREEMPT_BKL=y
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_PPC_RTAS=y
|
||||
CONFIG_RTAS_PROC=y
|
||||
CONFIG_RTAS_FLASH=y
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
#
|
||||
# CONFIG_HOTPLUG_PCI is not set
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
# CONFIG_XFRM_USER is not set
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
CONFIG_NET_IPIP=y
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
CONFIG_INET_TUNNEL=y
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
CONFIG_IP_TCPDIAG_IPV6=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
|
||||
#
|
||||
# IP: Virtual Server Configuration
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
CONFIG_IPV6=y
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
CONFIG_INET6_AH=m
|
||||
CONFIG_INET6_ESP=m
|
||||
CONFIG_INET6_IPCOMP=m
|
||||
CONFIG_INET6_TUNNEL=m
|
||||
CONFIG_IPV6_TUNNEL=m
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
#
|
||||
CONFIG_IP_NF_CONNTRACK=y
|
||||
# CONFIG_IP_NF_CT_ACCT is not set
|
||||
# CONFIG_IP_NF_CONNTRACK_MARK is not set
|
||||
CONFIG_IP_NF_CT_PROTO_SCTP=y
|
||||
CONFIG_IP_NF_FTP=m
|
||||
CONFIG_IP_NF_IRC=m
|
||||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_MATCH_LIMIT=m
|
||||
CONFIG_IP_NF_MATCH_IPRANGE=m
|
||||
CONFIG_IP_NF_MATCH_MAC=m
|
||||
CONFIG_IP_NF_MATCH_PKTTYPE=m
|
||||
CONFIG_IP_NF_MATCH_MARK=m
|
||||
CONFIG_IP_NF_MATCH_MULTIPORT=m
|
||||
CONFIG_IP_NF_MATCH_TOS=m
|
||||
CONFIG_IP_NF_MATCH_RECENT=m
|
||||
CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_DSCP=m
|
||||
CONFIG_IP_NF_MATCH_AH_ESP=m
|
||||
CONFIG_IP_NF_MATCH_LENGTH=m
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_MATCH_TCPMSS=m
|
||||
CONFIG_IP_NF_MATCH_HELPER=m
|
||||
CONFIG_IP_NF_MATCH_STATE=m
|
||||
CONFIG_IP_NF_MATCH_CONNTRACK=m
|
||||
CONFIG_IP_NF_MATCH_OWNER=m
|
||||
CONFIG_IP_NF_MATCH_ADDRTYPE=m
|
||||
CONFIG_IP_NF_MATCH_REALM=m
|
||||
CONFIG_IP_NF_MATCH_SCTP=m
|
||||
CONFIG_IP_NF_MATCH_COMMENT=m
|
||||
CONFIG_IP_NF_MATCH_HASHLIMIT=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_TARGET_LOG=m
|
||||
CONFIG_IP_NF_TARGET_ULOG=m
|
||||
CONFIG_IP_NF_TARGET_TCPMSS=m
|
||||
CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_NAT_NEEDED=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=m
|
||||
CONFIG_IP_NF_TARGET_NETMAP=m
|
||||
CONFIG_IP_NF_TARGET_SAME=m
|
||||
CONFIG_IP_NF_NAT_SNMP_BASIC=m
|
||||
CONFIG_IP_NF_NAT_IRC=m
|
||||
CONFIG_IP_NF_NAT_FTP=m
|
||||
CONFIG_IP_NF_NAT_TFTP=m
|
||||
CONFIG_IP_NF_NAT_AMANDA=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_TARGET_TOS=m
|
||||
CONFIG_IP_NF_TARGET_ECN=m
|
||||
CONFIG_IP_NF_TARGET_DSCP=m
|
||||
CONFIG_IP_NF_TARGET_MARK=m
|
||||
CONFIG_IP_NF_TARGET_CLASSIFY=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_IP_NF_TARGET_NOTRACK=m
|
||||
CONFIG_IP_NF_ARPTABLES=m
|
||||
CONFIG_IP_NF_ARPFILTER=m
|
||||
CONFIG_IP_NF_ARP_MANGLE=m
|
||||
|
||||
#
|
||||
# IPv6: Netfilter Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP6_NF_QUEUE is not set
|
||||
# CONFIG_IP6_NF_IPTABLES is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
CONFIG_NET_CLS_ROUTE=y
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
CONFIG_BLK_DEV_NBD=y
|
||||
# CONFIG_BLK_DEV_SX8 is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=131072
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDE=y
|
||||
|
||||
#
|
||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||
#
|
||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||
CONFIG_BLK_DEV_IDEDISK=y
|
||||
CONFIG_IDEDISK_MULTI_MODE=y
|
||||
# CONFIG_BLK_DEV_IDECD is not set
|
||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
||||
# CONFIG_IDE_TASK_IOCTL is not set
|
||||
|
||||
#
|
||||
# IDE chipset support/bugfixes
|
||||
#
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_IDEPCI=y
|
||||
CONFIG_IDEPCI_SHARE_IRQ=y
|
||||
# CONFIG_BLK_DEV_OFFBOARD is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
# CONFIG_BLK_DEV_OPTI621 is not set
|
||||
# CONFIG_BLK_DEV_SL82C105 is not set
|
||||
CONFIG_BLK_DEV_IDEDMA_PCI=y
|
||||
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
|
||||
CONFIG_IDEDMA_PCI_AUTO=y
|
||||
# CONFIG_IDEDMA_ONLYDISK is not set
|
||||
CONFIG_BLK_DEV_AEC62XX=y
|
||||
# CONFIG_BLK_DEV_ALI15X3 is not set
|
||||
# CONFIG_BLK_DEV_AMD74XX is not set
|
||||
# CONFIG_BLK_DEV_CMD64X is not set
|
||||
# CONFIG_BLK_DEV_TRIFLEX is not set
|
||||
# CONFIG_BLK_DEV_CY82C693 is not set
|
||||
# CONFIG_BLK_DEV_CS5520 is not set
|
||||
# CONFIG_BLK_DEV_CS5530 is not set
|
||||
# CONFIG_BLK_DEV_HPT34X is not set
|
||||
# CONFIG_BLK_DEV_HPT366 is not set
|
||||
# CONFIG_BLK_DEV_SC1200 is not set
|
||||
# CONFIG_BLK_DEV_PIIX is not set
|
||||
# CONFIG_BLK_DEV_IT821X is not set
|
||||
# CONFIG_BLK_DEV_NS87415 is not set
|
||||
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
|
||||
# CONFIG_BLK_DEV_SVWKS is not set
|
||||
CONFIG_BLK_DEV_SIIMAGE=y
|
||||
# CONFIG_BLK_DEV_SLC90E66 is not set
|
||||
# CONFIG_BLK_DEV_TRM290 is not set
|
||||
# CONFIG_BLK_DEV_VIA82CXXX is not set
|
||||
# CONFIG_IDE_ARM is not set
|
||||
CONFIG_BLK_DEV_IDEDMA=y
|
||||
# CONFIG_IDEDMA_IVB is not set
|
||||
CONFIG_IDEDMA_AUTO=y
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
#
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
# CONFIG_NET_PCI is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
CONFIG_E1000=m
|
||||
# CONFIG_E1000_NAPI is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
CONFIG_SKGE=m
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
# CONFIG_MV643XX_ETH is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
# CONFIG_SERIO_I8042 is not set
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
# CONFIG_SERIO_PCIPS2 is not set
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_SERIAL_NONSTANDARD=y
|
||||
# CONFIG_ROCKETPORT is not set
|
||||
# CONFIG_CYCLADES is not set
|
||||
# CONFIG_MOXA_SMARTIO is not set
|
||||
# CONFIG_ISI is not set
|
||||
# CONFIG_SYNCLINK is not set
|
||||
# CONFIG_SYNCLINKMP is not set
|
||||
# CONFIG_N_HDLC is not set
|
||||
# CONFIG_SPECIALIX is not set
|
||||
# CONFIG_SX is not set
|
||||
# CONFIG_STALDRV is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
CONFIG_WATCHDOG=y
|
||||
# CONFIG_WATCHDOG_NOWAYOUT is not set
|
||||
|
||||
#
|
||||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_WATCHDOG_RTAS=y
|
||||
|
||||
#
|
||||
# PCI-based Watchdog Cards
|
||||
#
|
||||
# CONFIG_PCIPCWATCHDOG is not set
|
||||
# CONFIG_WDTPCI is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_AGP is not set
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_I2C_CHARDEV is not set
|
||||
|
||||
#
|
||||
# I2C Algorithms
|
||||
#
|
||||
CONFIG_I2C_ALGOBIT=y
|
||||
# CONFIG_I2C_ALGOPCF is not set
|
||||
# CONFIG_I2C_ALGOPCA is not set
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
# CONFIG_I2C_ALI1535 is not set
|
||||
# CONFIG_I2C_ALI1563 is not set
|
||||
# CONFIG_I2C_ALI15X3 is not set
|
||||
# CONFIG_I2C_AMD756 is not set
|
||||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_VIA is not set
|
||||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
# CONFIG_I2C_SENSOR is not set
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||
# CONFIG_EXT3_FS_SECURITY is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
CONFIG_ISO9660_FS=m
|
||||
CONFIG_JOLIET=y
|
||||
# CONFIG_ZISOFS is not set
|
||||
CONFIG_UDF_FS=m
|
||||
CONFIG_UDF_NLS=y
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_XATTR=y
|
||||
# CONFIG_TMPFS_SECURITY is not set
|
||||
CONFIG_HUGETLBFS=y
|
||||
CONFIG_HUGETLB_PAGE=y
|
||||
CONFIG_RAMFS=y
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V2_ACL=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
# CONFIG_NFSD_V4 is not set
|
||||
CONFIG_NFSD_TCP=y
|
||||
CONFIG_LOCKD=m
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=m
|
||||
CONFIG_NFS_ACL_SUPPORT=m
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=m
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_ACORN_PARTITION is not set
|
||||
# CONFIG_OSF_PARTITION is not set
|
||||
# CONFIG_AMIGA_PARTITION is not set
|
||||
# CONFIG_ATARI_PARTITION is not set
|
||||
# CONFIG_MAC_PARTITION is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
# CONFIG_BSD_DISKLABEL is not set
|
||||
# CONFIG_MINIX_SUBPARTITION is not set
|
||||
# CONFIG_SOLARIS_X86_PARTITION is not set
|
||||
# CONFIG_UNIXWARE_DISKLABEL is not set
|
||||
# CONFIG_LDM_PARTITION is not set
|
||||
# CONFIG_SGI_PARTITION is not set
|
||||
# CONFIG_ULTRIX_PARTITION is not set
|
||||
# CONFIG_SUN_PARTITION is not set
|
||||
CONFIG_EFI_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=m
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
CONFIG_NLS_ISO8859_1=m
|
||||
CONFIG_NLS_ISO8859_2=m
|
||||
CONFIG_NLS_ISO8859_3=m
|
||||
CONFIG_NLS_ISO8859_4=m
|
||||
CONFIG_NLS_ISO8859_5=m
|
||||
CONFIG_NLS_ISO8859_6=m
|
||||
CONFIG_NLS_ISO8859_7=m
|
||||
CONFIG_NLS_ISO8859_9=m
|
||||
CONFIG_NLS_ISO8859_13=m
|
||||
CONFIG_NLS_ISO8859_14=m
|
||||
CONFIG_NLS_ISO8859_15=m
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=15
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_DEBUG_STACKOVERFLOW is not set
|
||||
# CONFIG_KPROBES is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
CONFIG_DEBUGGER=y
|
||||
# CONFIG_XMON is not set
|
||||
# CONFIG_PPCDBG is not set
|
||||
CONFIG_IRQSTACKS=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
# CONFIG_CRYPTO_NULL is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
CONFIG_CRYPTO_MD5=m
|
||||
CONFIG_CRYPTO_SHA1=m
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
CONFIG_CRYPTO_DES=m
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_TWOFISH is not set
|
||||
# CONFIG_CRYPTO_SERPENT is not set
|
||||
# CONFIG_CRYPTO_AES is not set
|
||||
# CONFIG_CRYPTO_CAST5 is not set
|
||||
# CONFIG_CRYPTO_CAST6 is not set
|
||||
# CONFIG_CRYPTO_TEA is not set
|
||||
# CONFIG_CRYPTO_ARC4 is not set
|
||||
# CONFIG_CRYPTO_KHAZAD is not set
|
||||
# CONFIG_CRYPTO_ANUBIS is not set
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
# CONFIG_CRYPTO_CRC32C is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=m
|
||||
CONFIG_ZLIB_DEFLATE=m
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:40:34 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:16:59 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -267,8 +267,6 @@ CONFIG_NET_CLS_ROUTE=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -468,6 +466,7 @@ CONFIG_SCSI_QLA2XXX=y
|
|||
# CONFIG_SCSI_QLA2300 is not set
|
||||
# CONFIG_SCSI_QLA2322 is not set
|
||||
# CONFIG_SCSI_QLA6312 is not set
|
||||
# CONFIG_SCSI_QLA24XX is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
|
@ -539,11 +538,9 @@ CONFIG_IEEE1394_RAWIO=y
|
|||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
CONFIG_ADB=y
|
||||
CONFIG_ADB_PMU=y
|
||||
CONFIG_PMAC_SMU=y
|
||||
# CONFIG_PMAC_BACKLIGHT is not set
|
||||
# CONFIG_INPUT_ADBHID is not set
|
||||
CONFIG_THERM_PM72=y
|
||||
|
||||
#
|
||||
|
@ -631,6 +628,8 @@ CONFIG_PPPOE=m
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -718,7 +717,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:43:39 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:17:02 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -257,10 +257,6 @@ CONFIG_NET_CLS_ROUTE=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -388,6 +384,7 @@ CONFIG_SCSI_QLA2XXX=y
|
|||
# CONFIG_SCSI_QLA2300 is not set
|
||||
# CONFIG_SCSI_QLA2322 is not set
|
||||
# CONFIG_SCSI_QLA6312 is not set
|
||||
# CONFIG_SCSI_QLA24XX is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
|
@ -537,6 +534,10 @@ CONFIG_PPPOE=m
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -610,7 +611,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:46:18 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:17:04 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -193,8 +193,6 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -433,6 +431,8 @@ CONFIG_E1000=y
|
|||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -512,7 +512,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:47:54 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:17:07 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -287,10 +287,6 @@ CONFIG_NET_CLS_ROUTE=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -488,6 +484,7 @@ CONFIG_SCSI_QLA22XX=m
|
|||
CONFIG_SCSI_QLA2300=m
|
||||
CONFIG_SCSI_QLA2322=m
|
||||
CONFIG_SCSI_QLA6312=m
|
||||
CONFIG_SCSI_QLA24XX=m
|
||||
CONFIG_SCSI_LPFC=m
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
|
@ -645,6 +642,10 @@ CONFIG_PPPOE=m
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -746,7 +747,6 @@ CONFIG_HVCS=m
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:37:07 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:16:54 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -289,10 +289,6 @@ CONFIG_NET_CLS_ROUTE=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -506,6 +502,7 @@ CONFIG_SCSI_QLA22XX=m
|
|||
CONFIG_SCSI_QLA2300=m
|
||||
CONFIG_SCSI_QLA2322=m
|
||||
CONFIG_SCSI_QLA6312=m
|
||||
CONFIG_SCSI_QLA24XX=m
|
||||
CONFIG_SCSI_LPFC=m
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
|
@ -579,11 +576,9 @@ CONFIG_IEEE1394_AMDTP=m
|
|||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
CONFIG_ADB=y
|
||||
CONFIG_ADB_PMU=y
|
||||
CONFIG_PMAC_SMU=y
|
||||
# CONFIG_PMAC_BACKLIGHT is not set
|
||||
# CONFIG_INPUT_ADBHID is not set
|
||||
CONFIG_THERM_PM72=y
|
||||
|
||||
#
|
||||
|
@ -694,6 +689,10 @@ CONFIG_PPPOE=m
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -797,7 +796,6 @@ CONFIG_HVCS=m
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1803,7 +1803,7 @@ static void __init fixup_device_tree(void)
|
|||
if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
|
||||
== PROM_ERROR)
|
||||
return;
|
||||
if (u3_rev != 0x35)
|
||||
if (u3_rev != 0x35 && u3_rev != 0x37)
|
||||
return;
|
||||
/* does it need fixup ? */
|
||||
if (prom_getproplen(i2c, "interrupts") > 0)
|
||||
|
|
|
@ -413,12 +413,6 @@ static int pci_assign_bus_resource(const struct pci_bus *bus,
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno)
|
||||
{
|
||||
/* Not implemented for sparc64... */
|
||||
BUG();
|
||||
}
|
||||
|
||||
int pci_assign_resource(struct pci_dev *pdev, int resource)
|
||||
{
|
||||
struct pcidev_cookie *pcp = pdev->sysdata;
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/net.h>
|
||||
#include <linux/compat.h>
|
||||
#include <net/compat.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/string.h>
|
||||
|
@ -297,121 +298,165 @@ asmlinkage int solaris_sendmsg(int fd, struct sol_nmsghdr __user *user_msg, unsi
|
|||
{
|
||||
struct socket *sock;
|
||||
char address[MAX_SOCK_ADDR];
|
||||
struct iovec iov[UIO_FASTIOV];
|
||||
struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
|
||||
unsigned char ctl[sizeof(struct cmsghdr) + 20];
|
||||
unsigned char *ctl_buf = ctl;
|
||||
struct msghdr kern_msg;
|
||||
int err, total_len;
|
||||
struct msghdr msg_sys;
|
||||
int err, ctl_len, iov_size, total_len;
|
||||
|
||||
if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
|
||||
return -EFAULT;
|
||||
if(kern_msg.msg_iovlen > UIO_MAXIOV)
|
||||
return -EINVAL;
|
||||
err = verify_compat_iovec(&kern_msg, iov, address, VERIFY_READ);
|
||||
if (err < 0)
|
||||
err = -EFAULT;
|
||||
if (msghdr_from_user32_to_kern(&msg_sys, user_msg))
|
||||
goto out;
|
||||
|
||||
sock = sockfd_lookup(fd, &err);
|
||||
if (!sock)
|
||||
goto out;
|
||||
|
||||
/* do not move before msg_sys is valid */
|
||||
err = -EMSGSIZE;
|
||||
if (msg_sys.msg_iovlen > UIO_MAXIOV)
|
||||
goto out_put;
|
||||
|
||||
/* Check whether to allocate the iovec area*/
|
||||
err = -ENOMEM;
|
||||
iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);
|
||||
if (msg_sys.msg_iovlen > UIO_FASTIOV) {
|
||||
iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
|
||||
if (!iov)
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
err = verify_compat_iovec(&msg_sys, iov, address, VERIFY_READ);
|
||||
if (err < 0)
|
||||
goto out_freeiov;
|
||||
total_len = err;
|
||||
|
||||
if(kern_msg.msg_controllen) {
|
||||
struct sol_cmsghdr __user *ucmsg = kern_msg.msg_control;
|
||||
err = -ENOBUFS;
|
||||
if (msg_sys.msg_controllen > INT_MAX)
|
||||
goto out_freeiov;
|
||||
|
||||
ctl_len = msg_sys.msg_controllen;
|
||||
if (ctl_len) {
|
||||
struct sol_cmsghdr __user *ucmsg = msg_sys.msg_control;
|
||||
unsigned long *kcmsg;
|
||||
compat_size_t cmlen;
|
||||
|
||||
if (kern_msg.msg_controllen <= sizeof(compat_size_t))
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
if (ctl_len <= sizeof(compat_size_t))
|
||||
goto out_freeiov;
|
||||
|
||||
if(kern_msg.msg_controllen > sizeof(ctl)) {
|
||||
if (ctl_len > sizeof(ctl)) {
|
||||
err = -ENOBUFS;
|
||||
ctl_buf = kmalloc(kern_msg.msg_controllen, GFP_KERNEL);
|
||||
if(!ctl_buf)
|
||||
ctl_buf = kmalloc(ctl_len, GFP_KERNEL);
|
||||
if (!ctl_buf)
|
||||
goto out_freeiov;
|
||||
}
|
||||
__get_user(cmlen, &ucmsg->cmsg_len);
|
||||
kcmsg = (unsigned long *) ctl_buf;
|
||||
*kcmsg++ = (unsigned long)cmlen;
|
||||
err = -EFAULT;
|
||||
if(copy_from_user(kcmsg, &ucmsg->cmsg_level,
|
||||
kern_msg.msg_controllen - sizeof(compat_size_t)))
|
||||
if (copy_from_user(kcmsg, &ucmsg->cmsg_level,
|
||||
ctl_len - sizeof(compat_size_t)))
|
||||
goto out_freectl;
|
||||
kern_msg.msg_control = ctl_buf;
|
||||
msg_sys.msg_control = ctl_buf;
|
||||
}
|
||||
kern_msg.msg_flags = solaris_to_linux_msgflags(user_flags);
|
||||
msg_sys.msg_flags = solaris_to_linux_msgflags(user_flags);
|
||||
|
||||
lock_kernel();
|
||||
sock = sockfd_lookup(fd, &err);
|
||||
if (sock != NULL) {
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
kern_msg.msg_flags |= MSG_DONTWAIT;
|
||||
err = sock_sendmsg(sock, &kern_msg, total_len);
|
||||
sockfd_put(sock);
|
||||
}
|
||||
unlock_kernel();
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
msg_sys.msg_flags |= MSG_DONTWAIT;
|
||||
err = sock_sendmsg(sock, &msg_sys, total_len);
|
||||
|
||||
out_freectl:
|
||||
/* N.B. Use kfree here, as kern_msg.msg_controllen might change? */
|
||||
if(ctl_buf != ctl)
|
||||
kfree(ctl_buf);
|
||||
if (ctl_buf != ctl)
|
||||
sock_kfree_s(sock->sk, ctl_buf, ctl_len);
|
||||
out_freeiov:
|
||||
if(kern_msg.msg_iov != iov)
|
||||
kfree(kern_msg.msg_iov);
|
||||
out:
|
||||
if (iov != iovstack)
|
||||
sock_kfree_s(sock->sk, iov, iov_size);
|
||||
out_put:
|
||||
sockfd_put(sock);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
asmlinkage int solaris_recvmsg(int fd, struct sol_nmsghdr __user *user_msg, unsigned int user_flags)
|
||||
{
|
||||
struct iovec iovstack[UIO_FASTIOV];
|
||||
struct msghdr kern_msg;
|
||||
char addr[MAX_SOCK_ADDR];
|
||||
struct socket *sock;
|
||||
struct iovec iovstack[UIO_FASTIOV];
|
||||
struct iovec *iov = iovstack;
|
||||
struct msghdr msg_sys;
|
||||
unsigned long cmsg_ptr;
|
||||
int err, iov_size, total_len, len;
|
||||
|
||||
/* kernel mode address */
|
||||
char addr[MAX_SOCK_ADDR];
|
||||
|
||||
/* user mode address pointers */
|
||||
struct sockaddr __user *uaddr;
|
||||
int __user *uaddr_len;
|
||||
unsigned long cmsg_ptr;
|
||||
int err, total_len, len = 0;
|
||||
|
||||
if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
|
||||
if (msghdr_from_user32_to_kern(&msg_sys, user_msg))
|
||||
return -EFAULT;
|
||||
if(kern_msg.msg_iovlen > UIO_MAXIOV)
|
||||
return -EINVAL;
|
||||
|
||||
uaddr = kern_msg.msg_name;
|
||||
uaddr_len = &user_msg->msg_namelen;
|
||||
err = verify_compat_iovec(&kern_msg, iov, addr, VERIFY_WRITE);
|
||||
if (err < 0)
|
||||
sock = sockfd_lookup(fd, &err);
|
||||
if (!sock)
|
||||
goto out;
|
||||
|
||||
err = -EMSGSIZE;
|
||||
if (msg_sys.msg_iovlen > UIO_MAXIOV)
|
||||
goto out_put;
|
||||
|
||||
/* Check whether to allocate the iovec area*/
|
||||
err = -ENOMEM;
|
||||
iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);
|
||||
if (msg_sys.msg_iovlen > UIO_FASTIOV) {
|
||||
iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
|
||||
if (!iov)
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save the user-mode address (verify_iovec will change the
|
||||
* kernel msghdr to use the kernel address space)
|
||||
*/
|
||||
|
||||
uaddr = (void __user *) msg_sys.msg_name;
|
||||
uaddr_len = &user_msg->msg_namelen;
|
||||
err = verify_compat_iovec(&msg_sys, iov, addr, VERIFY_WRITE);
|
||||
if (err < 0)
|
||||
goto out_freeiov;
|
||||
total_len = err;
|
||||
|
||||
cmsg_ptr = (unsigned long) kern_msg.msg_control;
|
||||
kern_msg.msg_flags = 0;
|
||||
cmsg_ptr = (unsigned long) msg_sys.msg_control;
|
||||
msg_sys.msg_flags = MSG_CMSG_COMPAT;
|
||||
|
||||
lock_kernel();
|
||||
sock = sockfd_lookup(fd, &err);
|
||||
if (sock != NULL) {
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
user_flags |= MSG_DONTWAIT;
|
||||
err = sock_recvmsg(sock, &kern_msg, total_len, user_flags);
|
||||
if(err >= 0)
|
||||
len = err;
|
||||
sockfd_put(sock);
|
||||
}
|
||||
unlock_kernel();
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
user_flags |= MSG_DONTWAIT;
|
||||
|
||||
if(uaddr != NULL && err >= 0)
|
||||
err = move_addr_to_user(addr, kern_msg.msg_namelen, uaddr, uaddr_len);
|
||||
if(err >= 0) {
|
||||
err = __put_user(linux_to_solaris_msgflags(kern_msg.msg_flags), &user_msg->msg_flags);
|
||||
if(!err) {
|
||||
/* XXX Convert cmsg back into userspace 32-bit format... */
|
||||
err = __put_user((unsigned long)kern_msg.msg_control - cmsg_ptr,
|
||||
&user_msg->msg_controllen);
|
||||
}
|
||||
}
|
||||
|
||||
if(kern_msg.msg_iov != iov)
|
||||
kfree(kern_msg.msg_iov);
|
||||
out:
|
||||
err = sock_recvmsg(sock, &msg_sys, total_len, user_flags);
|
||||
if(err < 0)
|
||||
return err;
|
||||
return len;
|
||||
goto out_freeiov;
|
||||
|
||||
len = err;
|
||||
|
||||
if (uaddr != NULL) {
|
||||
err = move_addr_to_user(addr, msg_sys.msg_namelen, uaddr, uaddr_len);
|
||||
if (err < 0)
|
||||
goto out_freeiov;
|
||||
}
|
||||
err = __put_user(linux_to_solaris_msgflags(msg_sys.msg_flags), &user_msg->msg_flags);
|
||||
if (err)
|
||||
goto out_freeiov;
|
||||
err = __put_user((unsigned long)msg_sys.msg_control - cmsg_ptr,
|
||||
&user_msg->msg_controllen);
|
||||
if (err)
|
||||
goto out_freeiov;
|
||||
err = len;
|
||||
|
||||
out_freeiov:
|
||||
if (iov != iovstack)
|
||||
sock_kfree_s(sock->sk, iov, iov_size);
|
||||
out_put:
|
||||
sockfd_put(sock);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -322,3 +322,4 @@ module_exit(aes_fini);
|
|||
|
||||
MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("aes");
|
||||
|
|
|
@ -36,6 +36,7 @@ static unsigned long bank[NR_BANKS] = { [0 ... NR_BANKS-1] = ~0UL };
|
|||
static unsigned long console_logged;
|
||||
static int notify_user;
|
||||
static int rip_msr;
|
||||
static int mce_bootlog;
|
||||
|
||||
/*
|
||||
* Lockless MCE logging infrastructure.
|
||||
|
@ -197,10 +198,11 @@ void do_machine_check(struct pt_regs * regs, long error_code)
|
|||
rdmsrl(MSR_IA32_MC0_ADDR + i*4, m.addr);
|
||||
|
||||
mce_get_rip(&m, regs);
|
||||
if (error_code != -1)
|
||||
if (error_code >= 0)
|
||||
rdtscll(m.tsc);
|
||||
wrmsrl(MSR_IA32_MC0_STATUS + i*4, 0);
|
||||
mce_log(&m);
|
||||
if (error_code != -2)
|
||||
mce_log(&m);
|
||||
|
||||
/* Did this bank cause the exception? */
|
||||
/* Assume that the bank with uncorrectable errors did it,
|
||||
|
@ -315,7 +317,7 @@ static void mce_init(void *dummy)
|
|||
|
||||
/* Log the machine checks left over from the previous reset.
|
||||
This also clears all registers */
|
||||
do_machine_check(NULL, -1);
|
||||
do_machine_check(NULL, mce_bootlog ? -1 : -2);
|
||||
|
||||
set_in_cr4(X86_CR4_MCE);
|
||||
|
||||
|
@ -476,11 +478,17 @@ static int __init mcheck_disable(char *str)
|
|||
}
|
||||
|
||||
/* mce=off disables machine check. Note you can reenable it later
|
||||
using sysfs */
|
||||
using sysfs.
|
||||
mce=bootlog Log MCEs from before booting. Disabled by default to work
|
||||
around buggy BIOS that leave bogus MCEs. */
|
||||
static int __init mcheck_enable(char *str)
|
||||
{
|
||||
if (*str == '=')
|
||||
str++;
|
||||
if (!strcmp(str, "off"))
|
||||
mce_dont_init = 1;
|
||||
else if (!strcmp(str, "bootlog"))
|
||||
mce_bootlog = 1;
|
||||
else
|
||||
printk("mce= argument %s ignored. Please use /sys", str);
|
||||
return 0;
|
||||
|
|
|
@ -645,15 +645,15 @@ void __init setup_arch(char **cmdline_p)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
sparse_init();
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
if (crashk_res.start != crashk_res.end) {
|
||||
reserve_bootmem(crashk_res.start,
|
||||
crashk_res.end - crashk_res.start + 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
sparse_init();
|
||||
|
||||
paging_init();
|
||||
|
||||
check_ioapic();
|
||||
|
|
|
@ -1283,8 +1283,7 @@ static void do_fd_request(request_queue_t* q)
|
|||
if (fdc_busy) return;
|
||||
save_flags(flags);
|
||||
cli();
|
||||
while (fdc_busy)
|
||||
sleep_on(&fdc_wait);
|
||||
wait_event(fdc_wait, !fdc_busy);
|
||||
fdc_busy = 1;
|
||||
ENABLE_IRQ();
|
||||
restore_flags(flags);
|
||||
|
|
|
@ -719,7 +719,7 @@ struct request *blk_queue_find_tag(request_queue_t *q, int tag)
|
|||
{
|
||||
struct blk_queue_tag *bqt = q->queue_tags;
|
||||
|
||||
if (unlikely(bqt == NULL || tag >= bqt->max_depth))
|
||||
if (unlikely(bqt == NULL || tag >= bqt->real_max_depth))
|
||||
return NULL;
|
||||
|
||||
return bqt->tag_index[tag];
|
||||
|
@ -798,6 +798,7 @@ init_tag_map(request_queue_t *q, struct blk_queue_tag *tags, int depth)
|
|||
|
||||
memset(tag_index, 0, depth * sizeof(struct request *));
|
||||
memset(tag_map, 0, nr_ulongs * sizeof(unsigned long));
|
||||
tags->real_max_depth = depth;
|
||||
tags->max_depth = depth;
|
||||
tags->tag_index = tag_index;
|
||||
tags->tag_map = tag_map;
|
||||
|
@ -871,12 +872,23 @@ int blk_queue_resize_tags(request_queue_t *q, int new_depth)
|
|||
if (!bqt)
|
||||
return -ENXIO;
|
||||
|
||||
/*
|
||||
* if we already have large enough real_max_depth. just
|
||||
* adjust max_depth. *NOTE* as requests with tag value
|
||||
* between new_depth and real_max_depth can be in-flight, tag
|
||||
* map can not be shrunk blindly here.
|
||||
*/
|
||||
if (new_depth <= bqt->real_max_depth) {
|
||||
bqt->max_depth = new_depth;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* save the old state info, so we can copy it back
|
||||
*/
|
||||
tag_index = bqt->tag_index;
|
||||
tag_map = bqt->tag_map;
|
||||
max_depth = bqt->max_depth;
|
||||
max_depth = bqt->real_max_depth;
|
||||
|
||||
if (init_tag_map(q, bqt, new_depth))
|
||||
return -ENOMEM;
|
||||
|
@ -913,7 +925,7 @@ void blk_queue_end_tag(request_queue_t *q, struct request *rq)
|
|||
|
||||
BUG_ON(tag == -1);
|
||||
|
||||
if (unlikely(tag >= bqt->max_depth))
|
||||
if (unlikely(tag >= bqt->real_max_depth))
|
||||
/*
|
||||
* This can happen after tag depth has been reduced.
|
||||
* FIXME: how about a warning or info message here?
|
||||
|
|
|
@ -367,11 +367,8 @@ static inline void bpa10x_free_urb(struct urb *urb)
|
|||
if (!urb)
|
||||
return;
|
||||
|
||||
if (urb->setup_packet)
|
||||
kfree(urb->setup_packet);
|
||||
|
||||
if (urb->transfer_buffer)
|
||||
kfree(urb->transfer_buffer);
|
||||
kfree(urb->setup_packet);
|
||||
kfree(urb->transfer_buffer);
|
||||
|
||||
usb_free_urb(urb);
|
||||
}
|
||||
|
|
|
@ -58,8 +58,6 @@
|
|||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#undef BT_DMP
|
||||
#define BT_DMP( A... )
|
||||
#endif
|
||||
|
||||
static int hciextn = 1;
|
||||
|
|
|
@ -57,8 +57,6 @@
|
|||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#undef BT_DMP
|
||||
#define BT_DMP( A... )
|
||||
#endif
|
||||
|
||||
/* Initialize protocol */
|
||||
|
@ -125,7 +123,6 @@ static inline int h4_check_data_len(struct h4_struct *h4, int len)
|
|||
|
||||
BT_DBG("len %d room %d", len, room);
|
||||
if (!len) {
|
||||
BT_DMP(h4->rx_skb->data, h4->rx_skb->len);
|
||||
hci_recv_frame(h4->rx_skb);
|
||||
} else if (len > room) {
|
||||
BT_ERR("Data length is too large");
|
||||
|
@ -169,8 +166,6 @@ static int h4_recv(struct hci_uart *hu, void *data, int count)
|
|||
case H4_W4_DATA:
|
||||
BT_DBG("Complete data");
|
||||
|
||||
BT_DMP(h4->rx_skb->data, h4->rx_skb->len);
|
||||
|
||||
hci_recv_frame(h4->rx_skb);
|
||||
|
||||
h4->rx_state = H4_W4_PACKET_TYPE;
|
||||
|
|
|
@ -57,8 +57,6 @@
|
|||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#undef BT_DMP
|
||||
#define BT_DMP( A... )
|
||||
#endif
|
||||
|
||||
static int reset = 0;
|
||||
|
|
|
@ -57,8 +57,6 @@
|
|||
#ifndef CONFIG_BT_HCIUSB_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#undef BT_DMP
|
||||
#define BT_DMP(D...)
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_BT_HCIUSB_ZERO_PACKET
|
||||
|
@ -110,6 +108,9 @@ static struct usb_device_id blacklist_ids[] = {
|
|||
/* Microsoft Wireless Transceiver for Bluetooth 2.0 */
|
||||
{ USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET },
|
||||
|
||||
/* Kensington Bluetooth USB adapter */
|
||||
{ USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET },
|
||||
|
||||
/* ISSC Bluetooth Adapter v3.1 */
|
||||
{ USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET },
|
||||
|
||||
|
@ -387,10 +388,8 @@ static void hci_usb_unlink_urbs(struct hci_usb *husb)
|
|||
urb = &_urb->urb;
|
||||
BT_DBG("%s freeing _urb %p type %d urb %p",
|
||||
husb->hdev->name, _urb, _urb->type, urb);
|
||||
if (urb->setup_packet)
|
||||
kfree(urb->setup_packet);
|
||||
if (urb->transfer_buffer)
|
||||
kfree(urb->transfer_buffer);
|
||||
kfree(urb->setup_packet);
|
||||
kfree(urb->transfer_buffer);
|
||||
_urb_free(_urb);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,8 @@ config TCG_TPM
|
|||
obtained at: <http://sourceforge.net/projects/trousers>. To
|
||||
compile this driver as a module, choose M here; the module
|
||||
will be called tpm. If unsure, say N.
|
||||
Note: For more TPM drivers enable CONFIG_PNP, CONFIG_ACPI_BUS
|
||||
and CONFIG_PNPACPI.
|
||||
|
||||
config TCG_NSC
|
||||
tristate "National Semiconductor TPM Interface"
|
||||
|
@ -36,12 +38,13 @@ config TCG_ATMEL
|
|||
as a module, choose M here; the module will be called tpm_atmel.
|
||||
|
||||
config TCG_INFINEON
|
||||
tristate "Infineon Technologies SLD 9630 TPM Interface"
|
||||
depends on TCG_TPM
|
||||
tristate "Infineon Technologies TPM Interface"
|
||||
depends on TCG_TPM && PNPACPI
|
||||
---help---
|
||||
If you have a TPM security chip from Infineon Technologies
|
||||
say Yes and it will be accessible from within Linux. To
|
||||
compile this driver as a module, choose M here; the module
|
||||
(either SLD 9630 TT 1.1 or SLB 9635 TT 1.2) say Yes and it
|
||||
will be accessible from within Linux.
|
||||
To compile this driver as a module, choose M here; the module
|
||||
will be called tpm_infineon.
|
||||
Further information on this driver and the supported hardware
|
||||
can be found at http://www.prosec.rub.de/tpm
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Description:
|
||||
* Device Driver for the Infineon Technologies
|
||||
* SLD 9630 TT Trusted Platform Module
|
||||
* SLD 9630 TT 1.1 and SLB 9635 TT 1.2 Trusted Platform Module
|
||||
* Specifications at www.trustedcomputinggroup.org
|
||||
*
|
||||
* Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
|
||||
|
@ -12,9 +12,10 @@
|
|||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation, version 2 of the
|
||||
* License.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <linux/pnp.h>
|
||||
#include "tpm.h"
|
||||
|
||||
/* Infineon specific definitions */
|
||||
|
@ -26,8 +27,11 @@
|
|||
#define TPM_MSLEEP_TIME 3
|
||||
/* gives number of max. msleep()-calls before throwing timeout */
|
||||
#define TPM_MAX_TRIES 5000
|
||||
#define TCPA_INFINEON_DEV_VEN_VALUE 0x15D1
|
||||
#define TPM_DATA (TPM_ADDR + 1) & 0xff
|
||||
#define TPM_INFINEON_DEV_VEN_VALUE 0x15D1
|
||||
|
||||
/* These values will be filled after ACPI-call */
|
||||
static int TPM_INF_DATA = 0;
|
||||
static int TPM_INF_ADDR = 0;
|
||||
|
||||
/* TPM header definitions */
|
||||
enum infineon_tpm_header {
|
||||
|
@ -305,9 +309,10 @@ static int tpm_inf_send(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
|
||||
static void tpm_inf_cancel(struct tpm_chip *chip)
|
||||
{
|
||||
/* Nothing yet!
|
||||
This has something to do with the internal functions
|
||||
of the TPM. Abort isn't really necessary...
|
||||
/*
|
||||
Since we are using the legacy mode to communicate
|
||||
with the TPM, we have no cancel functions, but have
|
||||
a workaround for interrupting the TPM through WTX.
|
||||
*/
|
||||
}
|
||||
|
||||
|
@ -345,6 +350,32 @@ static struct tpm_vendor_specific tpm_inf = {
|
|||
.miscdev = {.fops = &inf_ops,},
|
||||
};
|
||||
|
||||
static const struct pnp_device_id tpm_pnp_tbl[] = {
|
||||
/* Infineon TPMs */
|
||||
{"IFX0101", 0},
|
||||
{"IFX0102", 0},
|
||||
{"", 0}
|
||||
};
|
||||
|
||||
static int __devinit tpm_inf_acpi_probe(struct pnp_dev *dev,
|
||||
const struct pnp_device_id *dev_id)
|
||||
{
|
||||
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);
|
||||
if (!((tpm_inf.base >> 8) & 0xff))
|
||||
tpm_inf.base = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pnp_driver tpm_inf_pnp = {
|
||||
.name = "tpm_inf_pnp",
|
||||
.id_table = tpm_pnp_tbl,
|
||||
.probe = tpm_inf_acpi_probe,
|
||||
};
|
||||
|
||||
static int __devinit tpm_inf_probe(struct pci_dev *pci_dev,
|
||||
const struct pci_device_id *pci_id)
|
||||
{
|
||||
|
@ -353,64 +384,99 @@ static int __devinit tpm_inf_probe(struct pci_dev *pci_dev,
|
|||
int vendorid[2];
|
||||
int version[2];
|
||||
int productid[2];
|
||||
char chipname[20];
|
||||
|
||||
if (pci_enable_device(pci_dev))
|
||||
return -EIO;
|
||||
|
||||
dev_info(&pci_dev->dev, "LPC-bus found at 0x%x\n", pci_id->device);
|
||||
|
||||
/* read IO-ports from ACPI */
|
||||
pnp_register_driver(&tpm_inf_pnp);
|
||||
pnp_unregister_driver(&tpm_inf_pnp);
|
||||
|
||||
/* Make sure, we have received valid config ports */
|
||||
if (!TPM_INF_ADDR) {
|
||||
pci_disable_device(pci_dev);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* query chip for its vendor, its version number a.s.o. */
|
||||
outb(ENABLE_REGISTER_PAIR, TPM_ADDR);
|
||||
outb(IDVENL, TPM_ADDR);
|
||||
vendorid[1] = inb(TPM_DATA);
|
||||
outb(IDVENH, TPM_ADDR);
|
||||
vendorid[0] = inb(TPM_DATA);
|
||||
outb(IDPDL, TPM_ADDR);
|
||||
productid[1] = inb(TPM_DATA);
|
||||
outb(IDPDH, TPM_ADDR);
|
||||
productid[0] = inb(TPM_DATA);
|
||||
outb(CHIP_ID1, TPM_ADDR);
|
||||
version[1] = inb(TPM_DATA);
|
||||
outb(CHIP_ID2, TPM_ADDR);
|
||||
version[0] = inb(TPM_DATA);
|
||||
outb(ENABLE_REGISTER_PAIR, TPM_INF_ADDR);
|
||||
outb(IDVENL, TPM_INF_ADDR);
|
||||
vendorid[1] = inb(TPM_INF_DATA);
|
||||
outb(IDVENH, TPM_INF_ADDR);
|
||||
vendorid[0] = inb(TPM_INF_DATA);
|
||||
outb(IDPDL, TPM_INF_ADDR);
|
||||
productid[1] = inb(TPM_INF_DATA);
|
||||
outb(IDPDH, TPM_INF_ADDR);
|
||||
productid[0] = inb(TPM_INF_DATA);
|
||||
outb(CHIP_ID1, TPM_INF_ADDR);
|
||||
version[1] = inb(TPM_INF_DATA);
|
||||
outb(CHIP_ID2, TPM_INF_ADDR);
|
||||
version[0] = inb(TPM_INF_DATA);
|
||||
|
||||
if ((vendorid[0] << 8 | vendorid[1]) == (TCPA_INFINEON_DEV_VEN_VALUE)) {
|
||||
switch ((productid[0] << 8) | productid[1]) {
|
||||
case 6:
|
||||
sprintf(chipname, " (SLD 9630 TT 1.1)");
|
||||
break;
|
||||
case 11:
|
||||
sprintf(chipname, " (SLB 9635 TT 1.2)");
|
||||
break;
|
||||
default:
|
||||
sprintf(chipname, " (unknown chip)");
|
||||
break;
|
||||
}
|
||||
chipname[19] = 0;
|
||||
|
||||
/* read IO-ports from TPM */
|
||||
outb(IOLIMH, TPM_ADDR);
|
||||
ioh = inb(TPM_DATA);
|
||||
outb(IOLIML, TPM_ADDR);
|
||||
iol = inb(TPM_DATA);
|
||||
tpm_inf.base = (ioh << 8) | iol;
|
||||
if ((vendorid[0] << 8 | vendorid[1]) == (TPM_INFINEON_DEV_VEN_VALUE)) {
|
||||
|
||||
if (tpm_inf.base == 0) {
|
||||
dev_err(&pci_dev->dev, "No IO-ports set!\n");
|
||||
dev_err(&pci_dev->dev, "No IO-ports found!\n");
|
||||
pci_disable_device(pci_dev);
|
||||
return -ENODEV;
|
||||
return -EIO;
|
||||
}
|
||||
/* configure TPM with IO-ports */
|
||||
outb(IOLIMH, TPM_INF_ADDR);
|
||||
outb(((tpm_inf.base >> 8) & 0xff), TPM_INF_DATA);
|
||||
outb(IOLIML, TPM_INF_ADDR);
|
||||
outb((tpm_inf.base & 0xff), TPM_INF_DATA);
|
||||
|
||||
/* control if IO-ports are set correctly */
|
||||
outb(IOLIMH, TPM_INF_ADDR);
|
||||
ioh = inb(TPM_INF_DATA);
|
||||
outb(IOLIML, TPM_INF_ADDR);
|
||||
iol = inb(TPM_INF_DATA);
|
||||
|
||||
if ((ioh << 8 | iol) != tpm_inf.base) {
|
||||
dev_err(&pci_dev->dev,
|
||||
"Could not set IO-ports to %04x\n",
|
||||
tpm_inf.base);
|
||||
pci_disable_device(pci_dev);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* activate register */
|
||||
outb(TPM_DAR, TPM_ADDR);
|
||||
outb(0x01, TPM_DATA);
|
||||
outb(DISABLE_REGISTER_PAIR, TPM_ADDR);
|
||||
outb(TPM_DAR, TPM_INF_ADDR);
|
||||
outb(0x01, TPM_INF_DATA);
|
||||
outb(DISABLE_REGISTER_PAIR, TPM_INF_ADDR);
|
||||
|
||||
/* disable RESET, LP and IRQC */
|
||||
outb(RESET_LP_IRQC_DISABLE, tpm_inf.base + CMD);
|
||||
|
||||
/* Finally, we're done, print some infos */
|
||||
dev_info(&pci_dev->dev, "TPM found: "
|
||||
"config base 0x%x, "
|
||||
"io base 0x%x, "
|
||||
"chip version %02x%02x, "
|
||||
"vendor id %x%x (Infineon), "
|
||||
"product id %02x%02x"
|
||||
"%s\n",
|
||||
TPM_INF_ADDR,
|
||||
tpm_inf.base,
|
||||
version[0], version[1],
|
||||
vendorid[0], vendorid[1],
|
||||
productid[0], productid[1], ((productid[0] == 0)
|
||||
&& (productid[1] ==
|
||||
6)) ?
|
||||
" (SLD 9630 TT 1.1)" : "");
|
||||
productid[0], productid[1], chipname);
|
||||
|
||||
rc = tpm_register_hardware(pci_dev, &tpm_inf);
|
||||
if (rc < 0) {
|
||||
|
@ -462,6 +528,6 @@ module_init(init_inf);
|
|||
module_exit(cleanup_inf);
|
||||
|
||||
MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
|
||||
MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT");
|
||||
MODULE_VERSION("1.4");
|
||||
MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
|
||||
MODULE_VERSION("1.5");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* i8xx_tco 0.07: TCO timer driver for i8xx chipsets
|
||||
* i8xx_tco: TCO timer driver for i8xx chipsets
|
||||
*
|
||||
* (c) Copyright 2000 kernel concepts <nils@kernelconcepts.de>, All Rights Reserved.
|
||||
* http://www.kernelconcepts.de
|
||||
|
@ -63,6 +63,9 @@
|
|||
* 20050128 Wim Van Sebroeck <wim@iguana.be>
|
||||
* 0.07 Added support for the ICH4-M, ICH6, ICH6R, ICH6-M, ICH6W and ICH6RW
|
||||
* chipsets. Also added support for the "undocumented" ICH7 chipset.
|
||||
* 20050807 Wim Van Sebroeck <wim@iguana.be>
|
||||
* 0.08 Make sure that the watchdog is only "armed" when started.
|
||||
* (Kernel Bug 4251)
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -87,7 +90,7 @@
|
|||
#include "i8xx_tco.h"
|
||||
|
||||
/* Module and version information */
|
||||
#define TCO_VERSION "0.07"
|
||||
#define TCO_VERSION "0.08"
|
||||
#define TCO_MODULE_NAME "i8xx TCO timer"
|
||||
#define TCO_DRIVER_NAME TCO_MODULE_NAME ", v" TCO_VERSION
|
||||
#define PFX TCO_MODULE_NAME ": "
|
||||
|
@ -125,10 +128,18 @@ static int tco_timer_start (void)
|
|||
unsigned char val;
|
||||
|
||||
spin_lock(&tco_lock);
|
||||
|
||||
/* disable chipset's NO_REBOOT bit */
|
||||
pci_read_config_byte (i8xx_tco_pci, 0xd4, &val);
|
||||
val &= 0xfd;
|
||||
pci_write_config_byte (i8xx_tco_pci, 0xd4, val);
|
||||
|
||||
/* Bit 11: TCO Timer Halt -> 0 = The TCO timer is enabled to count */
|
||||
val = inb (TCO1_CNT + 1);
|
||||
val &= 0xf7;
|
||||
outb (val, TCO1_CNT + 1);
|
||||
val = inb (TCO1_CNT + 1);
|
||||
|
||||
spin_unlock(&tco_lock);
|
||||
|
||||
if (val & 0x08)
|
||||
|
@ -138,13 +149,20 @@ static int tco_timer_start (void)
|
|||
|
||||
static int tco_timer_stop (void)
|
||||
{
|
||||
unsigned char val;
|
||||
unsigned char val, val1;
|
||||
|
||||
spin_lock(&tco_lock);
|
||||
/* Bit 11: TCO Timer Halt -> 1 = The TCO timer is disabled */
|
||||
val = inb (TCO1_CNT + 1);
|
||||
val |= 0x08;
|
||||
outb (val, TCO1_CNT + 1);
|
||||
val = inb (TCO1_CNT + 1);
|
||||
|
||||
/* Set the NO_REBOOT bit to prevent later reboots, just for sure */
|
||||
pci_read_config_byte (i8xx_tco_pci, 0xd4, &val1);
|
||||
val1 |= 0x02;
|
||||
pci_write_config_byte (i8xx_tco_pci, 0xd4, val1);
|
||||
|
||||
spin_unlock(&tco_lock);
|
||||
|
||||
if ((val & 0x08) == 0)
|
||||
|
@ -155,6 +173,7 @@ static int tco_timer_stop (void)
|
|||
static int tco_timer_keepalive (void)
|
||||
{
|
||||
spin_lock(&tco_lock);
|
||||
/* Reload the timer by writing to the TCO Timer Reload register */
|
||||
outb (0x01, TCO1_RLD);
|
||||
spin_unlock(&tco_lock);
|
||||
return 0;
|
||||
|
@ -417,9 +436,8 @@ static unsigned char __init i8xx_tco_getdevice (void)
|
|||
printk (KERN_ERR PFX "failed to get TCOBASE address\n");
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* Check chipset's NO_REBOOT bit
|
||||
*/
|
||||
|
||||
/* Check chipset's NO_REBOOT bit */
|
||||
pci_read_config_byte (i8xx_tco_pci, 0xd4, &val1);
|
||||
if (val1 & 0x02) {
|
||||
val1 &= 0xfd;
|
||||
|
@ -430,6 +448,10 @@ static unsigned char __init i8xx_tco_getdevice (void)
|
|||
return 0; /* Cannot reset NO_REBOOT bit */
|
||||
}
|
||||
}
|
||||
/* Disable reboots untill the watchdog starts */
|
||||
val1 |= 0x02;
|
||||
pci_write_config_byte (i8xx_tco_pci, 0xd4, val1);
|
||||
|
||||
/* Set the TCO_EN bit in SMI_EN register */
|
||||
if (!request_region (SMI_EN + 1, 1, "i8xx TCO")) {
|
||||
printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
|
||||
|
@ -505,17 +527,10 @@ static int __init watchdog_init (void)
|
|||
|
||||
static void __exit watchdog_cleanup (void)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
/* Stop the timer before we leave */
|
||||
if (!nowayout)
|
||||
tco_timer_stop ();
|
||||
|
||||
/* Set the NO_REBOOT bit to prevent later reboots, just for sure */
|
||||
pci_read_config_byte (i8xx_tco_pci, 0xd4, &val);
|
||||
val |= 0x02;
|
||||
pci_write_config_byte (i8xx_tco_pci, 0xd4, val);
|
||||
|
||||
/* Deregister */
|
||||
misc_deregister (&i8xx_tco_miscdev);
|
||||
unregister_reboot_notifier(&i8xx_tco_notifier);
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
#include <asm/sibyte/sb1250_smbus.h>
|
||||
|
||||
static struct i2c_algo_sibyte_data sibyte_board_data[2] = {
|
||||
{ NULL, 0, (void *) (KSEG1+A_SMB_BASE(0)) },
|
||||
{ NULL, 1, (void *) (KSEG1+A_SMB_BASE(1)) }
|
||||
{ NULL, 0, (void *) (CKSEG1+A_SMB_BASE(0)) },
|
||||
{ NULL, 1, (void *) (CKSEG1+A_SMB_BASE(1)) }
|
||||
};
|
||||
|
||||
static struct i2c_adapter sibyte_board_adapter[2] = {
|
||||
|
|
|
@ -1220,7 +1220,7 @@ static int ide_disk_probe(struct device *dev)
|
|||
goto failed;
|
||||
|
||||
g = alloc_disk_node(1 << PARTN_BITS,
|
||||
pcibus_to_node(drive->hwif->pci_dev->bus));
|
||||
hwif_to_node(drive->hwif));
|
||||
if (!g)
|
||||
goto out_free_idkp;
|
||||
|
||||
|
|
|
@ -960,15 +960,6 @@ static void save_match(ide_hwif_t *hwif, ide_hwif_t *new, ide_hwif_t **match)
|
|||
}
|
||||
#endif /* MAX_HWIFS > 1 */
|
||||
|
||||
static inline int hwif_to_node(ide_hwif_t *hwif)
|
||||
{
|
||||
if (hwif->pci_dev)
|
||||
return pcibus_to_node(hwif->pci_dev->bus);
|
||||
else
|
||||
/* Add ways to determine the node of other busses here */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* init request queue
|
||||
*/
|
||||
|
|
|
@ -275,9 +275,9 @@ static int __init ns558_init(void)
|
|||
|
||||
static void __exit ns558_exit(void)
|
||||
{
|
||||
struct ns558 *ns558;
|
||||
struct ns558 *ns558, *safe;
|
||||
|
||||
list_for_each_entry(ns558, &ns558_list, node) {
|
||||
list_for_each_entry_safe(ns558, safe, &ns558_list, node) {
|
||||
gameport_unregister_port(ns558->gameport);
|
||||
release_region(ns558->io & ~(ns558->size - 1), ns558->size);
|
||||
kfree(ns558);
|
||||
|
|
|
@ -1650,7 +1650,7 @@ static void __exit icn_exit(void)
|
|||
{
|
||||
isdn_ctrl cmd;
|
||||
icn_card *card = cards;
|
||||
icn_card *last;
|
||||
icn_card *last, *tmpcard;
|
||||
int i;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -1670,8 +1670,9 @@ static void __exit icn_exit(void)
|
|||
for (i = 0; i < ICN_BCH; i++)
|
||||
icn_free_queue(card, i);
|
||||
}
|
||||
card = card->next;
|
||||
tmpcard = card->next;
|
||||
spin_unlock_irqrestore(&card->lock, flags);
|
||||
card = tmpcard;
|
||||
}
|
||||
card = cards;
|
||||
cards = NULL;
|
||||
|
|
|
@ -188,7 +188,7 @@ config DVB_BCM3510
|
|||
support this frontend.
|
||||
|
||||
config DVB_LGDT330X
|
||||
tristate "LGDT3302 or LGDT3303 based (DViCO FusionHDTV Gold)"
|
||||
tristate "LG Electronics LGDT3302/LGDT3303 based"
|
||||
depends on DVB_CORE
|
||||
help
|
||||
An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
|
||||
|
|
|
@ -225,6 +225,22 @@ struct dvb_pll_desc dvb_pll_tua6034 = {
|
|||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tua6034);
|
||||
|
||||
/* Infineon TUA6034
|
||||
* used in LG Innotek TDVS-H062F
|
||||
*/
|
||||
struct dvb_pll_desc dvb_pll_tdvs_tua6034 = {
|
||||
.name = "LG/Infineon TUA6034",
|
||||
.min = 54000000,
|
||||
.max = 863000000,
|
||||
.count = 3,
|
||||
.entries = {
|
||||
{ 160000000, 44000000, 62500, 0xce, 0x01 },
|
||||
{ 455000000, 44000000, 62500, 0xce, 0x02 },
|
||||
{ 999999999, 44000000, 62500, 0xce, 0x04 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tdvs_tua6034);
|
||||
|
||||
/* Philips FMD1216ME
|
||||
* used in Medion Hybrid PCMCIA card and USB Box
|
||||
*/
|
||||
|
|
|
@ -31,6 +31,7 @@ extern struct dvb_pll_desc dvb_pll_unknown_1;
|
|||
extern struct dvb_pll_desc dvb_pll_tua6010xs;
|
||||
extern struct dvb_pll_desc dvb_pll_env57h1xd5;
|
||||
extern struct dvb_pll_desc dvb_pll_tua6034;
|
||||
extern struct dvb_pll_desc dvb_pll_tdvs_tua6034;
|
||||
extern struct dvb_pll_desc dvb_pll_tda665x;
|
||||
extern struct dvb_pll_desc dvb_pll_fmd1216me;
|
||||
extern struct dvb_pll_desc dvb_pll_tded4;
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
/*
|
||||
* Support for LGDT3302 & LGDT3303 (DViCO FusionHDTV Gold) - VSB/QAM
|
||||
* Support for LGDT3302 and LGDT3303 - VSB/QAM
|
||||
*
|
||||
* Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
|
||||
*
|
||||
* Based on code from Kirk Lapray <kirk_lapray@bigfoot.com>
|
||||
* Copyright (C) 2005
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
|
@ -25,11 +22,13 @@
|
|||
/*
|
||||
* NOTES ABOUT THIS DRIVER
|
||||
*
|
||||
* This driver supports DViCO FusionHDTV Gold under Linux.
|
||||
* This Linux driver supports:
|
||||
* DViCO FusionHDTV 3 Gold-Q
|
||||
* DViCO FusionHDTV 3 Gold-T
|
||||
* DViCO FusionHDTV 5 Gold
|
||||
*
|
||||
* TODO:
|
||||
* BER and signal strength always return 0.
|
||||
* Include support for LGDT3303
|
||||
* signal strength always returns 0.
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -41,7 +40,6 @@
|
|||
#include <asm/byteorder.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include "dvb-pll.h"
|
||||
#include "lgdt330x_priv.h"
|
||||
#include "lgdt330x.h"
|
||||
|
||||
|
@ -70,55 +68,37 @@ struct lgdt330x_state
|
|||
u32 current_frequency;
|
||||
};
|
||||
|
||||
static int i2c_writebytes (struct lgdt330x_state* state,
|
||||
u8 addr, /* demod_address or pll_address */
|
||||
static int i2c_write_demod_bytes (struct lgdt330x_state* state,
|
||||
u8 *buf, /* data bytes to send */
|
||||
int len /* number of bytes to send */ )
|
||||
{
|
||||
u8 tmp[] = { buf[0], buf[1] };
|
||||
struct i2c_msg msg =
|
||||
{ .addr = addr, .flags = 0, .buf = tmp, .len = 2 };
|
||||
int err;
|
||||
{ .addr = state->config->demod_address,
|
||||
.flags = 0,
|
||||
.buf = buf,
|
||||
.len = 2 };
|
||||
int i;
|
||||
int err;
|
||||
|
||||
for (i=1; i<len; i++) {
|
||||
tmp[1] = buf[i];
|
||||
for (i=0; i<len-1; i+=2){
|
||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
||||
printk(KERN_WARNING "lgdt330x: %s error (addr %02x <- %02x, err == %i)\n", __FUNCTION__, addr, buf[0], err);
|
||||
printk(KERN_WARNING "lgdt330x: %s error (addr %02x <- %02x, err = %i)\n", __FUNCTION__, msg.buf[0], msg.buf[1], err);
|
||||
if (err < 0)
|
||||
return err;
|
||||
else
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
tmp[0]++;
|
||||
msg.buf += 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int i2c_readbytes (struct lgdt330x_state* state,
|
||||
u8 addr, /* demod_address or pll_address */
|
||||
u8 *buf, /* holds data bytes read */
|
||||
int len /* number of bytes to read */ )
|
||||
{
|
||||
struct i2c_msg msg =
|
||||
{ .addr = addr, .flags = I2C_M_RD, .buf = buf, .len = len };
|
||||
int err;
|
||||
|
||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
||||
printk(KERN_WARNING "lgdt330x: %s error (addr %02x, err == %i)\n", __FUNCTION__, addr, err);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This routine writes the register (reg) to the demod bus
|
||||
* then reads the data returned for (len) bytes.
|
||||
*/
|
||||
|
||||
static u8 i2c_selectreadbytes (struct lgdt330x_state* state,
|
||||
static u8 i2c_read_demod_bytes (struct lgdt330x_state* state,
|
||||
enum I2C_REG reg, u8* buf, int len)
|
||||
{
|
||||
u8 wr [] = { reg };
|
||||
|
@ -139,7 +119,7 @@ static u8 i2c_selectreadbytes (struct lgdt330x_state* state,
|
|||
}
|
||||
|
||||
/* Software reset */
|
||||
int lgdt330x_SwReset(struct lgdt330x_state* state)
|
||||
static int lgdt3302_SwReset(struct lgdt330x_state* state)
|
||||
{
|
||||
u8 ret;
|
||||
u8 reset[] = {
|
||||
|
@ -148,23 +128,51 @@ int lgdt330x_SwReset(struct lgdt330x_state* state)
|
|||
* bits 5-0 are 1 to mask interrupts */
|
||||
};
|
||||
|
||||
ret = i2c_writebytes(state,
|
||||
state->config->demod_address,
|
||||
ret = i2c_write_demod_bytes(state,
|
||||
reset, sizeof(reset));
|
||||
if (ret == 0) {
|
||||
/* spec says reset takes 100 ns why wait */
|
||||
/* mdelay(100); */ /* keep low for 100mS */
|
||||
reset[1] = 0x7f; /* force reset high (inactive)
|
||||
* and unmask interrupts */
|
||||
ret = i2c_writebytes(state,
|
||||
state->config->demod_address,
|
||||
|
||||
/* force reset high (inactive) and unmask interrupts */
|
||||
reset[1] = 0x7f;
|
||||
ret = i2c_write_demod_bytes(state,
|
||||
reset, sizeof(reset));
|
||||
}
|
||||
/* Spec does not indicate a need for this either */
|
||||
/*mdelay(5); */ /* wait 5 msec before doing more */
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int lgdt3303_SwReset(struct lgdt330x_state* state)
|
||||
{
|
||||
u8 ret;
|
||||
u8 reset[] = {
|
||||
0x02,
|
||||
0x00 /* bit 0 is active low software reset */
|
||||
};
|
||||
|
||||
ret = i2c_write_demod_bytes(state,
|
||||
reset, sizeof(reset));
|
||||
if (ret == 0) {
|
||||
|
||||
/* force reset high (inactive) */
|
||||
reset[1] = 0x01;
|
||||
ret = i2c_write_demod_bytes(state,
|
||||
reset, sizeof(reset));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int lgdt330x_SwReset(struct lgdt330x_state* state)
|
||||
{
|
||||
switch (state->config->demod_chip) {
|
||||
case LGDT3302:
|
||||
return lgdt3302_SwReset(state);
|
||||
case LGDT3303:
|
||||
return lgdt3303_SwReset(state);
|
||||
default:
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int lgdt330x_init(struct dvb_frontend* fe)
|
||||
{
|
||||
/* Hardware reset is done using gpio[0] of cx23880x chip.
|
||||
|
@ -173,22 +181,98 @@ static int lgdt330x_init(struct dvb_frontend* fe)
|
|||
* Maybe there needs to be a callable function in cx88-core or
|
||||
* the caller of this function needs to do it. */
|
||||
|
||||
dprintk("%s entered\n", __FUNCTION__);
|
||||
return lgdt330x_SwReset((struct lgdt330x_state*) fe->demodulator_priv);
|
||||
/*
|
||||
* Array of byte pairs <address, value>
|
||||
* to initialize each different chip
|
||||
*/
|
||||
static u8 lgdt3302_init_data[] = {
|
||||
/* Use 50MHz parameter values from spec sheet since xtal is 50 */
|
||||
/* Change the value of NCOCTFV[25:0] of carrier
|
||||
recovery center frequency register */
|
||||
VSB_CARRIER_FREQ0, 0x00,
|
||||
VSB_CARRIER_FREQ1, 0x87,
|
||||
VSB_CARRIER_FREQ2, 0x8e,
|
||||
VSB_CARRIER_FREQ3, 0x01,
|
||||
/* Change the TPCLK pin polarity
|
||||
data is valid on falling clock */
|
||||
DEMUX_CONTROL, 0xfb,
|
||||
/* Change the value of IFBW[11:0] of
|
||||
AGC IF/RF loop filter bandwidth register */
|
||||
AGC_RF_BANDWIDTH0, 0x40,
|
||||
AGC_RF_BANDWIDTH1, 0x93,
|
||||
AGC_RF_BANDWIDTH2, 0x00,
|
||||
/* Change the value of bit 6, 'nINAGCBY' and
|
||||
'NSSEL[1:0] of ACG function control register 2 */
|
||||
AGC_FUNC_CTRL2, 0xc6,
|
||||
/* Change the value of bit 6 'RFFIX'
|
||||
of AGC function control register 3 */
|
||||
AGC_FUNC_CTRL3, 0x40,
|
||||
/* Set the value of 'INLVTHD' register 0x2a/0x2c
|
||||
to 0x7fe */
|
||||
AGC_DELAY0, 0x07,
|
||||
AGC_DELAY2, 0xfe,
|
||||
/* Change the value of IAGCBW[15:8]
|
||||
of inner AGC loop filter bandwith */
|
||||
AGC_LOOP_BANDWIDTH0, 0x08,
|
||||
AGC_LOOP_BANDWIDTH1, 0x9a
|
||||
};
|
||||
|
||||
static u8 lgdt3303_init_data[] = {
|
||||
0x4c, 0x14
|
||||
};
|
||||
|
||||
struct lgdt330x_state* state = fe->demodulator_priv;
|
||||
char *chip_name;
|
||||
int err;
|
||||
|
||||
switch (state->config->demod_chip) {
|
||||
case LGDT3302:
|
||||
chip_name = "LGDT3302";
|
||||
err = i2c_write_demod_bytes(state, lgdt3302_init_data,
|
||||
sizeof(lgdt3302_init_data));
|
||||
break;
|
||||
case LGDT3303:
|
||||
chip_name = "LGDT3303";
|
||||
err = i2c_write_demod_bytes(state, lgdt3303_init_data,
|
||||
sizeof(lgdt3303_init_data));
|
||||
break;
|
||||
default:
|
||||
chip_name = "undefined";
|
||||
printk (KERN_WARNING "Only LGDT3302 and LGDT3303 are supported chips.\n");
|
||||
err = -ENODEV;
|
||||
}
|
||||
dprintk("%s entered as %s\n", __FUNCTION__, chip_name);
|
||||
if (err < 0)
|
||||
return err;
|
||||
return lgdt330x_SwReset(state);
|
||||
}
|
||||
|
||||
static int lgdt330x_read_ber(struct dvb_frontend* fe, u32* ber)
|
||||
{
|
||||
*ber = 0; /* Dummy out for now */
|
||||
*ber = 0; /* Not supplied by the demod chips */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lgdt330x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
|
||||
{
|
||||
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
|
||||
struct lgdt330x_state* state = fe->demodulator_priv;
|
||||
int err;
|
||||
u8 buf[2];
|
||||
|
||||
i2c_selectreadbytes(state, PACKET_ERR_COUNTER1, buf, sizeof(buf));
|
||||
switch (state->config->demod_chip) {
|
||||
case LGDT3302:
|
||||
err = i2c_read_demod_bytes(state, LGDT3302_PACKET_ERR_COUNTER1,
|
||||
buf, sizeof(buf));
|
||||
break;
|
||||
case LGDT3303:
|
||||
err = i2c_read_demod_bytes(state, LGDT3303_PACKET_ERR_COUNTER1,
|
||||
buf, sizeof(buf));
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING
|
||||
"Only LGDT3302 and LGDT3303 are supported chips.\n");
|
||||
err = -ENODEV;
|
||||
}
|
||||
|
||||
*ucblocks = (buf[0] << 8) | buf[1];
|
||||
return 0;
|
||||
|
@ -197,123 +281,113 @@ static int lgdt330x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
|
|||
static int lgdt330x_set_parameters(struct dvb_frontend* fe,
|
||||
struct dvb_frontend_parameters *param)
|
||||
{
|
||||
struct lgdt330x_state* state =
|
||||
(struct lgdt330x_state*) fe->demodulator_priv;
|
||||
/*
|
||||
* Array of byte pairs <address, value>
|
||||
* to initialize 8VSB for lgdt3303 chip 50 MHz IF
|
||||
*/
|
||||
static u8 lgdt3303_8vsb_44_data[] = {
|
||||
0x04, 0x00,
|
||||
0x0d, 0x40,
|
||||
0x0e, 0x87,
|
||||
0x0f, 0x8e,
|
||||
0x10, 0x01,
|
||||
0x47, 0x8b };
|
||||
|
||||
/*
|
||||
* Array of byte pairs <address, value>
|
||||
* to initialize QAM for lgdt3303 chip
|
||||
*/
|
||||
static u8 lgdt3303_qam_data[] = {
|
||||
0x04, 0x00,
|
||||
0x0d, 0x00,
|
||||
0x0e, 0x00,
|
||||
0x0f, 0x00,
|
||||
0x10, 0x00,
|
||||
0x51, 0x63,
|
||||
0x47, 0x66,
|
||||
0x48, 0x66,
|
||||
0x4d, 0x1a,
|
||||
0x49, 0x08,
|
||||
0x4a, 0x9b };
|
||||
|
||||
struct lgdt330x_state* state = fe->demodulator_priv;
|
||||
|
||||
/* Use 50MHz parameter values from spec sheet since xtal is 50 */
|
||||
static u8 top_ctrl_cfg[] = { TOP_CONTROL, 0x03 };
|
||||
static u8 vsb_freq_cfg[] = { VSB_CARRIER_FREQ0, 0x00, 0x87, 0x8e, 0x01 };
|
||||
static u8 demux_ctrl_cfg[] = { DEMUX_CONTROL, 0xfb };
|
||||
static u8 agc_rf_cfg[] = { AGC_RF_BANDWIDTH0, 0x40, 0x93, 0x00 };
|
||||
static u8 agc_ctrl_cfg[] = { AGC_FUNC_CTRL2, 0xc6, 0x40 };
|
||||
static u8 agc_delay_cfg[] = { AGC_DELAY0, 0x07, 0x00, 0xfe };
|
||||
static u8 agc_loop_cfg[] = { AGC_LOOP_BANDWIDTH0, 0x08, 0x9a };
|
||||
|
||||
int err;
|
||||
/* Change only if we are actually changing the modulation */
|
||||
if (state->current_modulation != param->u.vsb.modulation) {
|
||||
switch(param->u.vsb.modulation) {
|
||||
case VSB_8:
|
||||
dprintk("%s: VSB_8 MODE\n", __FUNCTION__);
|
||||
|
||||
/* Select VSB mode and serial MPEG interface */
|
||||
top_ctrl_cfg[1] = 0x07;
|
||||
/* Select VSB mode */
|
||||
top_ctrl_cfg[1] = 0x03;
|
||||
|
||||
/* Select ANT connector if supported by card */
|
||||
if (state->config->pll_rf_set)
|
||||
state->config->pll_rf_set(fe, 1);
|
||||
|
||||
if (state->config->demod_chip == LGDT3303) {
|
||||
err = i2c_write_demod_bytes(state, lgdt3303_8vsb_44_data,
|
||||
sizeof(lgdt3303_8vsb_44_data));
|
||||
}
|
||||
break;
|
||||
|
||||
case QAM_64:
|
||||
dprintk("%s: QAM_64 MODE\n", __FUNCTION__);
|
||||
|
||||
/* Select QAM_64 mode and serial MPEG interface */
|
||||
top_ctrl_cfg[1] = 0x04;
|
||||
/* Select QAM_64 mode */
|
||||
top_ctrl_cfg[1] = 0x00;
|
||||
|
||||
/* Select CABLE connector if supported by card */
|
||||
if (state->config->pll_rf_set)
|
||||
state->config->pll_rf_set(fe, 0);
|
||||
|
||||
if (state->config->demod_chip == LGDT3303) {
|
||||
err = i2c_write_demod_bytes(state, lgdt3303_qam_data,
|
||||
sizeof(lgdt3303_qam_data));
|
||||
}
|
||||
break;
|
||||
|
||||
case QAM_256:
|
||||
dprintk("%s: QAM_256 MODE\n", __FUNCTION__);
|
||||
|
||||
/* Select QAM_256 mode and serial MPEG interface */
|
||||
top_ctrl_cfg[1] = 0x05;
|
||||
/* Select QAM_256 mode */
|
||||
top_ctrl_cfg[1] = 0x01;
|
||||
|
||||
/* Select CABLE connector if supported by card */
|
||||
if (state->config->pll_rf_set)
|
||||
state->config->pll_rf_set(fe, 0);
|
||||
|
||||
if (state->config->demod_chip == LGDT3303) {
|
||||
err = i2c_write_demod_bytes(state, lgdt3303_qam_data,
|
||||
sizeof(lgdt3303_qam_data));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING "lgdt330x: %s: Modulation type(%d) UNSUPPORTED\n", __FUNCTION__, param->u.vsb.modulation);
|
||||
return -1;
|
||||
}
|
||||
/* Initializations common to all modes */
|
||||
/*
|
||||
* select serial or parallel MPEG harware interface
|
||||
* Serial: 0x04 for LGDT3302 or 0x40 for LGDT3303
|
||||
* Parallel: 0x00
|
||||
*/
|
||||
top_ctrl_cfg[1] |= state->config->serial_mpeg;
|
||||
|
||||
/* Select the requested mode */
|
||||
i2c_writebytes(state, state->config->demod_address,
|
||||
top_ctrl_cfg, sizeof(top_ctrl_cfg));
|
||||
|
||||
/* Change the value of IFBW[11:0]
|
||||
of AGC IF/RF loop filter bandwidth register */
|
||||
i2c_writebytes(state, state->config->demod_address,
|
||||
agc_rf_cfg, sizeof(agc_rf_cfg));
|
||||
|
||||
/* Change the value of bit 6, 'nINAGCBY' and
|
||||
'NSSEL[1:0] of ACG function control register 2 */
|
||||
/* Change the value of bit 6 'RFFIX'
|
||||
of AGC function control register 3 */
|
||||
i2c_writebytes(state, state->config->demod_address,
|
||||
agc_ctrl_cfg, sizeof(agc_ctrl_cfg));
|
||||
|
||||
/* Change the TPCLK pin polarity
|
||||
data is valid on falling clock */
|
||||
i2c_writebytes(state, state->config->demod_address,
|
||||
demux_ctrl_cfg, sizeof(demux_ctrl_cfg));
|
||||
|
||||
/* Change the value of NCOCTFV[25:0] of carrier
|
||||
recovery center frequency register */
|
||||
i2c_writebytes(state, state->config->demod_address,
|
||||
vsb_freq_cfg, sizeof(vsb_freq_cfg));
|
||||
|
||||
/* Set the value of 'INLVTHD' register 0x2a/0x2c to 0x7fe */
|
||||
i2c_writebytes(state, state->config->demod_address,
|
||||
agc_delay_cfg, sizeof(agc_delay_cfg));
|
||||
|
||||
/* Change the value of IAGCBW[15:8]
|
||||
of inner AGC loop filter bandwith */
|
||||
i2c_writebytes(state, state->config->demod_address,
|
||||
agc_loop_cfg, sizeof(agc_loop_cfg));
|
||||
|
||||
i2c_write_demod_bytes(state, top_ctrl_cfg,
|
||||
sizeof(top_ctrl_cfg));
|
||||
state->config->set_ts_params(fe, 0);
|
||||
state->current_modulation = param->u.vsb.modulation;
|
||||
}
|
||||
|
||||
/* Change only if we are actually changing the channel */
|
||||
if (state->current_frequency != param->frequency) {
|
||||
u8 buf[5];
|
||||
struct i2c_msg msg = { .flags = 0, .buf = &buf[1], .len = 4 };
|
||||
int err;
|
||||
|
||||
state->config->pll_set(fe, param, buf);
|
||||
msg.addr = buf[0];
|
||||
|
||||
dprintk("%s: tuner at 0x%02x bytes: 0x%02x 0x%02x "
|
||||
"0x%02x 0x%02x\n", __FUNCTION__,
|
||||
buf[0],buf[1],buf[2],buf[3],buf[4]);
|
||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
||||
printk(KERN_WARNING "lgdt330x: %s error (addr %02x <- %02x, err = %i)\n", __FUNCTION__, buf[0], buf[1], err);
|
||||
if (err < 0)
|
||||
return err;
|
||||
else
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
#if 0
|
||||
/* Check the status of the tuner pll */
|
||||
i2c_readbytes(state, buf[0], &buf[1], 1);
|
||||
dprintk("%s: tuner status byte = 0x%02x\n", __FUNCTION__, buf[1]);
|
||||
#endif
|
||||
/* Update current frequency */
|
||||
/* Tune to the new frequency */
|
||||
state->config->pll_set(fe, param);
|
||||
/* Keep track of the new frequency */
|
||||
state->current_frequency = param->frequency;
|
||||
}
|
||||
lgdt330x_SwReset(state);
|
||||
|
@ -328,21 +402,15 @@ static int lgdt330x_get_frontend(struct dvb_frontend* fe,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lgdt330x_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
||||
static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
||||
{
|
||||
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
|
||||
struct lgdt330x_state* state = fe->demodulator_priv;
|
||||
u8 buf[3];
|
||||
|
||||
*status = 0; /* Reset status result */
|
||||
|
||||
/*
|
||||
* You must set the Mask bits to 1 in the IRQ_MASK in order
|
||||
* to see that status bit in the IRQ_STATUS register.
|
||||
* This is done in SwReset();
|
||||
*/
|
||||
|
||||
/* AGC status register */
|
||||
i2c_selectreadbytes(state, AGC_STATUS, buf, 1);
|
||||
i2c_read_demod_bytes(state, AGC_STATUS, buf, 1);
|
||||
dprintk("%s: AGC_STATUS = 0x%02x\n", __FUNCTION__, buf[0]);
|
||||
if ((buf[0] & 0x0c) == 0x8){
|
||||
/* Test signal does not exist flag */
|
||||
|
@ -353,16 +421,15 @@ static int lgdt330x_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* You must set the Mask bits to 1 in the IRQ_MASK in order
|
||||
* to see that status bit in the IRQ_STATUS register.
|
||||
* This is done in SwReset();
|
||||
*/
|
||||
/* signal status */
|
||||
i2c_selectreadbytes(state, TOP_CONTROL, buf, sizeof(buf));
|
||||
i2c_read_demod_bytes(state, TOP_CONTROL, buf, sizeof(buf));
|
||||
dprintk("%s: TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n", __FUNCTION__, buf[0], buf[1], buf[2]);
|
||||
|
||||
#if 0
|
||||
/* Alternative method to check for a signal */
|
||||
/* using the SNR good/bad interrupts. */
|
||||
if ((buf[2] & 0x30) == 0x10)
|
||||
*status |= FE_HAS_SIGNAL;
|
||||
#endif
|
||||
|
||||
/* sync status */
|
||||
if ((buf[2] & 0x03) == 0x01) {
|
||||
|
@ -376,7 +443,7 @@ static int lgdt330x_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
|||
}
|
||||
|
||||
/* Carrier Recovery Lock Status Register */
|
||||
i2c_selectreadbytes(state, CARRIER_LOCK, buf, 1);
|
||||
i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
|
||||
dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]);
|
||||
switch (state->current_modulation) {
|
||||
case QAM_256:
|
||||
|
@ -396,13 +463,75 @@ static int lgdt330x_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lgdt330x_read_signal_strength(struct dvb_frontend* fe, u16* strength)
|
||||
static int lgdt3303_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
||||
{
|
||||
/* not directly available. */
|
||||
struct lgdt330x_state* state = fe->demodulator_priv;
|
||||
int err;
|
||||
u8 buf[3];
|
||||
|
||||
*status = 0; /* Reset status result */
|
||||
|
||||
/* lgdt3303 AGC status register */
|
||||
err = i2c_read_demod_bytes(state, 0x58, buf, 1);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
dprintk("%s: AGC_STATUS = 0x%02x\n", __FUNCTION__, buf[0]);
|
||||
if ((buf[0] & 0x21) == 0x01){
|
||||
/* Test input signal does not exist flag */
|
||||
/* as well as the AGC lock flag. */
|
||||
*status |= FE_HAS_SIGNAL;
|
||||
} else {
|
||||
/* Without a signal all other status bits are meaningless */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Carrier Recovery Lock Status Register */
|
||||
i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
|
||||
dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]);
|
||||
switch (state->current_modulation) {
|
||||
case QAM_256:
|
||||
case QAM_64:
|
||||
/* Need to undestand why there are 3 lock levels here */
|
||||
if ((buf[0] & 0x07) == 0x07)
|
||||
*status |= FE_HAS_CARRIER;
|
||||
else
|
||||
break;
|
||||
i2c_read_demod_bytes(state, 0x8a, buf, 1);
|
||||
if ((buf[0] & 0x04) == 0x04)
|
||||
*status |= FE_HAS_SYNC;
|
||||
if ((buf[0] & 0x01) == 0x01)
|
||||
*status |= FE_HAS_LOCK;
|
||||
if ((buf[0] & 0x08) == 0x08)
|
||||
*status |= FE_HAS_VITERBI;
|
||||
break;
|
||||
case VSB_8:
|
||||
if ((buf[0] & 0x80) == 0x80)
|
||||
*status |= FE_HAS_CARRIER;
|
||||
else
|
||||
break;
|
||||
i2c_read_demod_bytes(state, 0x38, buf, 1);
|
||||
if ((buf[0] & 0x02) == 0x00)
|
||||
*status |= FE_HAS_SYNC;
|
||||
if ((buf[0] & 0x01) == 0x01) {
|
||||
*status |= FE_HAS_LOCK;
|
||||
*status |= FE_HAS_VITERBI;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printk("KERN_WARNING lgdt330x: %s: Modulation set to unsupported value\n", __FUNCTION__);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lgdt330x_read_snr(struct dvb_frontend* fe, u16* snr)
|
||||
static int lgdt330x_read_signal_strength(struct dvb_frontend* fe, u16* strength)
|
||||
{
|
||||
/* not directly available. */
|
||||
*strength = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr)
|
||||
{
|
||||
#ifdef SNR_IN_DB
|
||||
/*
|
||||
|
@ -451,7 +580,7 @@ static int lgdt330x_read_snr(struct dvb_frontend* fe, u16* snr)
|
|||
91, 115, 144, 182, 229, 288, 362, 456, 574, 722,
|
||||
909, 1144, 1440, 1813, 2282, 2873, 3617, 4553, 5732, 7216,
|
||||
9084, 11436, 14396, 18124, 22817, 28724, 36161, 45524, 57312, 72151,
|
||||
90833, 114351, 143960, 181235, 228161, 0x040000
|
||||
90833, 114351, 143960, 181235, 228161, 0x080000
|
||||
};
|
||||
|
||||
static u8 buf[5];/* read data buffer */
|
||||
|
@ -459,8 +588,8 @@ static int lgdt330x_read_snr(struct dvb_frontend* fe, u16* snr)
|
|||
static u32 snr_db; /* index into SNR_EQ[] */
|
||||
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
|
||||
|
||||
/* read both equalizer and pase tracker noise data */
|
||||
i2c_selectreadbytes(state, EQPH_ERR0, buf, sizeof(buf));
|
||||
/* read both equalizer and phase tracker noise data */
|
||||
i2c_read_demod_bytes(state, EQPH_ERR0, buf, sizeof(buf));
|
||||
|
||||
if (state->current_modulation == VSB_8) {
|
||||
/* Equalizer Mean-Square Error Register for VSB */
|
||||
|
@ -496,19 +625,20 @@ static int lgdt330x_read_snr(struct dvb_frontend* fe, u16* snr)
|
|||
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
|
||||
|
||||
/* read both equalizer and pase tracker noise data */
|
||||
i2c_selectreadbytes(state, EQPH_ERR0, buf, sizeof(buf));
|
||||
i2c_read_demod_bytes(state, EQPH_ERR0, buf, sizeof(buf));
|
||||
|
||||
if (state->current_modulation == VSB_8) {
|
||||
/* Equalizer Mean-Square Error Register for VSB */
|
||||
noise = ((buf[0] & 7) << 16) | (buf[1] << 8) | buf[2];
|
||||
} else {
|
||||
/* Phase Tracker Mean-Square Error Register for QAM */
|
||||
/* Phase Tracker Mean-Square Error Register for VSB */
|
||||
noise = ((buf[0] & 7<<3) << 13) | (buf[3] << 8) | buf[4];
|
||||
} else {
|
||||
|
||||
/* Carrier Recovery Mean-Square Error for QAM */
|
||||
i2c_read_demod_bytes(state, 0x1a, buf, 2);
|
||||
noise = ((buf[0] & 3) << 8) | buf[1];
|
||||
}
|
||||
|
||||
/* Small values for noise mean signal is better so invert noise */
|
||||
/* Noise is 19 bit value so discard 3 LSB*/
|
||||
*snr = ~noise>>3;
|
||||
*snr = ~noise;
|
||||
#endif
|
||||
|
||||
dprintk("%s: noise = 0x%05x, snr = %idb\n",__FUNCTION__, noise, *snr);
|
||||
|
@ -516,6 +646,32 @@ static int lgdt330x_read_snr(struct dvb_frontend* fe, u16* snr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lgdt3303_read_snr(struct dvb_frontend* fe, u16* snr)
|
||||
{
|
||||
/* Return the raw noise value */
|
||||
static u8 buf[5];/* read data buffer */
|
||||
static u32 noise; /* noise value */
|
||||
struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
|
||||
|
||||
if (state->current_modulation == VSB_8) {
|
||||
|
||||
/* Phase Tracker Mean-Square Error Register for VSB */
|
||||
noise = ((buf[0] & 7) << 16) | (buf[3] << 8) | buf[4];
|
||||
} else {
|
||||
|
||||
/* Carrier Recovery Mean-Square Error for QAM */
|
||||
i2c_read_demod_bytes(state, 0x1a, buf, 2);
|
||||
noise = (buf[0] << 8) | buf[1];
|
||||
}
|
||||
|
||||
/* Small values for noise mean signal is better so invert noise */
|
||||
*snr = ~noise;
|
||||
|
||||
dprintk("%s: noise = 0x%05x, snr = %idb\n",__FUNCTION__, noise, *snr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lgdt330x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
|
||||
{
|
||||
/* I have no idea about this - it may not be needed */
|
||||
|
@ -531,7 +687,8 @@ static void lgdt330x_release(struct dvb_frontend* fe)
|
|||
kfree(state);
|
||||
}
|
||||
|
||||
static struct dvb_frontend_ops lgdt330x_ops;
|
||||
static struct dvb_frontend_ops lgdt3302_ops;
|
||||
static struct dvb_frontend_ops lgdt3303_ops;
|
||||
|
||||
struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config,
|
||||
struct i2c_adapter* i2c)
|
||||
|
@ -548,9 +705,19 @@ struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config,
|
|||
/* Setup the state */
|
||||
state->config = config;
|
||||
state->i2c = i2c;
|
||||
memcpy(&state->ops, &lgdt330x_ops, sizeof(struct dvb_frontend_ops));
|
||||
switch (config->demod_chip) {
|
||||
case LGDT3302:
|
||||
memcpy(&state->ops, &lgdt3302_ops, sizeof(struct dvb_frontend_ops));
|
||||
break;
|
||||
case LGDT3303:
|
||||
memcpy(&state->ops, &lgdt3303_ops, sizeof(struct dvb_frontend_ops));
|
||||
break;
|
||||
default:
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Verify communication with demod chip */
|
||||
if (i2c_selectreadbytes(state, 2, buf, 1))
|
||||
if (i2c_read_demod_bytes(state, 2, buf, 1))
|
||||
goto error;
|
||||
|
||||
state->current_frequency = -1;
|
||||
|
@ -568,9 +735,9 @@ struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct dvb_frontend_ops lgdt330x_ops = {
|
||||
static struct dvb_frontend_ops lgdt3302_ops = {
|
||||
.info = {
|
||||
.name= "LG Electronics lgdt330x VSB/QAM Frontend",
|
||||
.name= "LG Electronics LGDT3302 VSB/QAM Frontend",
|
||||
.type = FE_ATSC,
|
||||
.frequency_min= 54000000,
|
||||
.frequency_max= 858000000,
|
||||
|
@ -584,15 +751,39 @@ static struct dvb_frontend_ops lgdt330x_ops = {
|
|||
.set_frontend = lgdt330x_set_parameters,
|
||||
.get_frontend = lgdt330x_get_frontend,
|
||||
.get_tune_settings = lgdt330x_get_tune_settings,
|
||||
.read_status = lgdt330x_read_status,
|
||||
.read_status = lgdt3302_read_status,
|
||||
.read_ber = lgdt330x_read_ber,
|
||||
.read_signal_strength = lgdt330x_read_signal_strength,
|
||||
.read_snr = lgdt330x_read_snr,
|
||||
.read_snr = lgdt3302_read_snr,
|
||||
.read_ucblocks = lgdt330x_read_ucblocks,
|
||||
.release = lgdt330x_release,
|
||||
};
|
||||
|
||||
MODULE_DESCRIPTION("lgdt330x [DViCO FusionHDTV 3 Gold] (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
|
||||
static struct dvb_frontend_ops lgdt3303_ops = {
|
||||
.info = {
|
||||
.name= "LG Electronics LGDT3303 VSB/QAM Frontend",
|
||||
.type = FE_ATSC,
|
||||
.frequency_min= 54000000,
|
||||
.frequency_max= 858000000,
|
||||
.frequency_stepsize= 62500,
|
||||
/* Symbol rate is for all VSB modes need to check QAM */
|
||||
.symbol_rate_min = 10762000,
|
||||
.symbol_rate_max = 10762000,
|
||||
.caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
|
||||
},
|
||||
.init = lgdt330x_init,
|
||||
.set_frontend = lgdt330x_set_parameters,
|
||||
.get_frontend = lgdt330x_get_frontend,
|
||||
.get_tune_settings = lgdt330x_get_tune_settings,
|
||||
.read_status = lgdt3303_read_status,
|
||||
.read_ber = lgdt330x_read_ber,
|
||||
.read_signal_strength = lgdt330x_read_signal_strength,
|
||||
.read_snr = lgdt3303_read_snr,
|
||||
.read_ucblocks = lgdt330x_read_ucblocks,
|
||||
.release = lgdt330x_release,
|
||||
};
|
||||
|
||||
MODULE_DESCRIPTION("LGDT330X (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
|
||||
MODULE_AUTHOR("Wilson Michaels");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
|
@ -601,6 +792,5 @@ EXPORT_SYMBOL(lgdt330x_attach);
|
|||
/*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* compile-command: "make DVB=1"
|
||||
* End:
|
||||
*/
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Support for LGDT3302 & LGDT3303 (DViCO FustionHDTV Gold) - VSB/QAM
|
||||
* Support for LGDT3302 and LGDT3303 - VSB/QAM
|
||||
*
|
||||
* Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
|
||||
*
|
||||
|
@ -24,14 +24,26 @@
|
|||
|
||||
#include <linux/dvb/frontend.h>
|
||||
|
||||
typedef enum lg_chip_t {
|
||||
UNDEFINED,
|
||||
LGDT3302,
|
||||
LGDT3303
|
||||
}lg_chip_type;
|
||||
|
||||
struct lgdt330x_config
|
||||
{
|
||||
/* The demodulator's i2c address */
|
||||
u8 demod_address;
|
||||
|
||||
/* LG demodulator chip LGDT3302 or LGDT3303 */
|
||||
lg_chip_type demod_chip;
|
||||
|
||||
/* MPEG hardware interface - 0:parallel 1:serial */
|
||||
int serial_mpeg;
|
||||
|
||||
/* PLL interface */
|
||||
int (*pll_rf_set) (struct dvb_frontend* fe, int index);
|
||||
int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pll_address);
|
||||
int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);
|
||||
|
||||
/* Need to set device param for start_dma */
|
||||
int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Support for LGDT3302 & LGDT3303 (DViCO FustionHDTV Gold) - VSB/QAM
|
||||
* Support for LGDT3302 and LGDT3303 - VSB/QAM
|
||||
*
|
||||
* Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
|
||||
*
|
||||
|
@ -57,8 +57,10 @@ enum I2C_REG {
|
|||
PH_ERR1= 0x4a,
|
||||
PH_ERR2= 0x4b,
|
||||
DEMUX_CONTROL= 0x66,
|
||||
PACKET_ERR_COUNTER1= 0x6a,
|
||||
PACKET_ERR_COUNTER2= 0x6b,
|
||||
LGDT3302_PACKET_ERR_COUNTER1= 0x6a,
|
||||
LGDT3302_PACKET_ERR_COUNTER2= 0x6b,
|
||||
LGDT3303_PACKET_ERR_COUNTER1= 0x8b,
|
||||
LGDT3303_PACKET_ERR_COUNTER2= 0x8c,
|
||||
};
|
||||
|
||||
#endif /* _LGDT330X_PRIV_ */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* $Id: cx88-dvb.c,v 1.54 2005/07/25 05:13:50 mkrufky Exp $
|
||||
* $Id: cx88-dvb.c,v 1.58 2005/08/07 09:24:08 mkrufky Exp $
|
||||
*
|
||||
* device driver for Conexant 2388x based TV cards
|
||||
* MPEG Transport Stream (DVB) routines
|
||||
|
@ -208,14 +208,26 @@ static struct or51132_config pchdtv_hd3000 = {
|
|||
|
||||
#ifdef HAVE_LGDT330X
|
||||
static int lgdt330x_pll_set(struct dvb_frontend* fe,
|
||||
struct dvb_frontend_parameters* params,
|
||||
u8* pllbuf)
|
||||
struct dvb_frontend_parameters* params)
|
||||
{
|
||||
struct cx8802_dev *dev= fe->dvb->priv;
|
||||
u8 buf[4];
|
||||
struct i2c_msg msg =
|
||||
{ .addr = dev->core->pll_addr, .flags = 0, .buf = buf, .len = 4 };
|
||||
int err;
|
||||
|
||||
pllbuf[0] = dev->core->pll_addr;
|
||||
dvb_pll_configure(dev->core->pll_desc, &pllbuf[1],
|
||||
params->frequency, 0);
|
||||
dvb_pll_configure(dev->core->pll_desc, buf, params->frequency, 0);
|
||||
dprintk(1, "%s: tuner at 0x%02x bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n",
|
||||
__FUNCTION__, msg.addr, buf[0],buf[1],buf[2],buf[3]);
|
||||
if ((err = i2c_transfer(&dev->core->i2c_adap, &msg, 1)) != 1) {
|
||||
printk(KERN_WARNING "cx88-dvb: %s error "
|
||||
"(addr %02x <- %02x, err = %i)\n",
|
||||
__FUNCTION__, buf[0], buf[1], err);
|
||||
if (err < 0)
|
||||
return err;
|
||||
else
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -244,6 +256,8 @@ static int lgdt330x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
|
|||
|
||||
static struct lgdt330x_config fusionhdtv_3_gold = {
|
||||
.demod_address = 0x0e,
|
||||
.demod_chip = LGDT3302,
|
||||
.serial_mpeg = 0x04, /* TPSERIAL for 3302 in TOP_CONTROL */
|
||||
.pll_set = lgdt330x_pll_set,
|
||||
.set_ts_params = lgdt330x_set_ts_param,
|
||||
};
|
||||
|
|
|
@ -53,6 +53,9 @@ config I2O_CONFIG
|
|||
To compile this support as a module, choose M here: the
|
||||
module will be called i2o_config.
|
||||
|
||||
Note: If you want to use the new API you have to download the
|
||||
i2o_config patch from http://i2o.shadowconnect.com/
|
||||
|
||||
config I2O_CONFIG_OLD_IOCTL
|
||||
bool "Enable ioctls (OBSOLETE)"
|
||||
depends on I2O_CONFIG
|
||||
|
|
|
@ -30,503 +30,9 @@
|
|||
|
||||
static struct i2o_driver i2o_config_driver;
|
||||
|
||||
/* Special file operations for sysfs */
|
||||
struct fops_attribute {
|
||||
struct bin_attribute bin;
|
||||
struct file_operations fops;
|
||||
};
|
||||
|
||||
/**
|
||||
* sysfs_read_dummy
|
||||
*/
|
||||
static ssize_t sysfs_read_dummy(struct kobject *kobj, char *buf, loff_t offset,
|
||||
size_t count)
|
||||
{
|
||||
return 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* sysfs_write_dummy
|
||||
*/
|
||||
static ssize_t sysfs_write_dummy(struct kobject *kobj, char *buf, loff_t offset,
|
||||
size_t count)
|
||||
{
|
||||
return 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* sysfs_create_fops_file - Creates attribute with special file operations
|
||||
* @kobj: kobject which should contains the attribute
|
||||
* @attr: attributes which should be used to create file
|
||||
*
|
||||
* First creates attribute @attr in kobject @kobj. If it is the first time
|
||||
* this function is called, merge old fops from sysfs with new one and
|
||||
* write it back. Afterwords the new fops will be set for the created
|
||||
* attribute.
|
||||
*
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
static int sysfs_create_fops_file(struct kobject *kobj,
|
||||
struct fops_attribute *attr)
|
||||
{
|
||||
struct file_operations tmp, *fops;
|
||||
struct dentry *d;
|
||||
struct qstr qstr;
|
||||
int rc;
|
||||
|
||||
fops = &attr->fops;
|
||||
|
||||
if (fops->read)
|
||||
attr->bin.read = sysfs_read_dummy;
|
||||
|
||||
if (fops->write)
|
||||
attr->bin.write = sysfs_write_dummy;
|
||||
|
||||
if ((rc = sysfs_create_bin_file(kobj, &attr->bin)))
|
||||
return rc;
|
||||
|
||||
qstr.name = attr->bin.attr.name;
|
||||
qstr.len = strlen(qstr.name);
|
||||
qstr.hash = full_name_hash(qstr.name, qstr.len);
|
||||
|
||||
if ((d = lookup_hash(&qstr, kobj->dentry))) {
|
||||
if (!fops->owner) {
|
||||
memcpy(&tmp, d->d_inode->i_fop, sizeof(tmp));
|
||||
if (fops->read)
|
||||
tmp.read = fops->read;
|
||||
if (fops->write)
|
||||
tmp.write = fops->write;
|
||||
memcpy(fops, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
d->d_inode->i_fop = fops;
|
||||
} else
|
||||
sysfs_remove_bin_file(kobj, &attr->bin);
|
||||
|
||||
return -ENOENT;
|
||||
};
|
||||
|
||||
/**
|
||||
* sysfs_remove_fops_file - Remove attribute with special file operations
|
||||
* @kobj: kobject which contains the attribute
|
||||
* @attr: attributes which are used to create file
|
||||
*
|
||||
* Only wrapper arround sysfs_remove_bin_file()
|
||||
*
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
static inline int sysfs_remove_fops_file(struct kobject *kobj,
|
||||
struct fops_attribute *attr)
|
||||
{
|
||||
return sysfs_remove_bin_file(kobj, &attr->bin);
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_config_read_hrt - Returns the HRT of the controller
|
||||
* @kob: kernel object handle
|
||||
* @buf: buffer into which the HRT should be copied
|
||||
* @off: file offset
|
||||
* @count: number of bytes to read
|
||||
*
|
||||
* Put @count bytes starting at @off into @buf from the HRT of the I2O
|
||||
* controller corresponding to @kobj.
|
||||
*
|
||||
* Returns number of bytes copied into buffer.
|
||||
*/
|
||||
static ssize_t i2o_config_read_hrt(struct kobject *kobj, char *buf,
|
||||
loff_t offset, size_t count)
|
||||
{
|
||||
struct i2o_controller *c = kobj_to_i2o_device(kobj)->iop;
|
||||
i2o_hrt *hrt = c->hrt.virt;
|
||||
|
||||
u32 size = (hrt->num_entries * hrt->entry_len + 2) * 4;
|
||||
|
||||
if (offset > size)
|
||||
return 0;
|
||||
|
||||
if (offset + count > size)
|
||||
count = size - offset;
|
||||
|
||||
memcpy(buf, (u8 *) hrt + offset, count);
|
||||
|
||||
return count;
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_config_read_lct - Returns the LCT of the controller
|
||||
* @kob: kernel object handle
|
||||
* @buf: buffer into which the LCT should be copied
|
||||
* @off: file offset
|
||||
* @count: number of bytes to read
|
||||
*
|
||||
* Put @count bytes starting at @off into @buf from the LCT of the I2O
|
||||
* controller corresponding to @kobj.
|
||||
*
|
||||
* Returns number of bytes copied into buffer.
|
||||
*/
|
||||
static ssize_t i2o_config_read_lct(struct kobject *kobj, char *buf,
|
||||
loff_t offset, size_t count)
|
||||
{
|
||||
struct i2o_controller *c = kobj_to_i2o_device(kobj)->iop;
|
||||
u32 size = c->lct->table_size * 4;
|
||||
|
||||
if (offset > size)
|
||||
return 0;
|
||||
|
||||
if (offset + count > size)
|
||||
count = size - offset;
|
||||
|
||||
memcpy(buf, (u8 *) c->lct + offset, count);
|
||||
|
||||
return count;
|
||||
};
|
||||
|
||||
#define I2O_CONFIG_SW_ATTR(_name,_mode,_type,_swid) \
|
||||
static ssize_t i2o_config_##_name##_read(struct file *file, char __user *buf, size_t count, loff_t * offset) { \
|
||||
return i2o_config_sw_read(file, buf, count, offset, _type, _swid); \
|
||||
};\
|
||||
\
|
||||
static ssize_t i2o_config_##_name##_write(struct file *file, const char __user *buf, size_t count, loff_t * offset) { \
|
||||
return i2o_config_sw_write(file, buf, count, offset, _type, _swid); \
|
||||
}; \
|
||||
\
|
||||
static struct fops_attribute i2o_config_attr_##_name = { \
|
||||
.bin = { .attr = { .name = __stringify(_name), .mode = _mode, \
|
||||
.owner = THIS_MODULE }, \
|
||||
.size = 0, }, \
|
||||
.fops = { .write = i2o_config_##_name##_write, \
|
||||
.read = i2o_config_##_name##_read} \
|
||||
};
|
||||
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC
|
||||
|
||||
/**
|
||||
* i2o_config_dpt_reagion - Converts type and id to flash region
|
||||
* @swtype: type of software module reading
|
||||
* @swid: id of software which should be read
|
||||
*
|
||||
* Converts type and id from I2O spec to the matching region for DPT /
|
||||
* Adaptec controllers.
|
||||
*
|
||||
* Returns region which match type and id or -1 on error.
|
||||
*/
|
||||
static u32 i2o_config_dpt_region(u8 swtype, u8 swid)
|
||||
{
|
||||
switch (swtype) {
|
||||
case I2O_SOFTWARE_MODULE_IRTOS:
|
||||
/*
|
||||
* content: operation firmware
|
||||
* region size:
|
||||
* 0xbc000 for 2554, 3754, 2564, 3757
|
||||
* 0x170000 for 2865
|
||||
* 0x17c000 for 3966
|
||||
*/
|
||||
if (!swid)
|
||||
return 0;
|
||||
|
||||
break;
|
||||
|
||||
case I2O_SOFTWARE_MODULE_IOP_PRIVATE:
|
||||
/*
|
||||
* content: BIOS and SMOR
|
||||
* BIOS size: first 0x8000 bytes
|
||||
* region size:
|
||||
* 0x40000 for 2554, 3754, 2564, 3757
|
||||
* 0x80000 for 2865, 3966
|
||||
*/
|
||||
if (!swid)
|
||||
return 1;
|
||||
|
||||
break;
|
||||
|
||||
case I2O_SOFTWARE_MODULE_IOP_CONFIG:
|
||||
switch (swid) {
|
||||
case 0:
|
||||
/*
|
||||
* content: NVRAM defaults
|
||||
* region size: 0x2000 bytes
|
||||
*/
|
||||
return 2;
|
||||
case 1:
|
||||
/*
|
||||
* content: serial number
|
||||
* region size: 0x2000 bytes
|
||||
*/
|
||||
return 3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* i2o_config_sw_read - Read a software module from controller
|
||||
* @file: file pointer
|
||||
* @buf: buffer into which the data should be copied
|
||||
* @count: number of bytes to read
|
||||
* @off: file offset
|
||||
* @swtype: type of software module reading
|
||||
* @swid: id of software which should be read
|
||||
*
|
||||
* Transfers @count bytes at offset @offset from IOP into buffer using
|
||||
* type @swtype and id @swid as described in I2O spec.
|
||||
*
|
||||
* Returns number of bytes copied into buffer or error code on failure.
|
||||
*/
|
||||
static ssize_t i2o_config_sw_read(struct file *file, char __user * buf,
|
||||
size_t count, loff_t * offset, u8 swtype,
|
||||
u32 swid)
|
||||
{
|
||||
struct sysfs_dirent *sd = file->f_dentry->d_parent->d_fsdata;
|
||||
struct kobject *kobj = sd->s_element;
|
||||
struct i2o_controller *c = kobj_to_i2o_device(kobj)->iop;
|
||||
u32 m, function = I2O_CMD_SW_UPLOAD;
|
||||
struct i2o_dma buffer;
|
||||
struct i2o_message __iomem *msg;
|
||||
u32 __iomem *mptr;
|
||||
int rc, status;
|
||||
|
||||
m = i2o_msg_get_wait(c, &msg, I2O_TIMEOUT_MESSAGE_GET);
|
||||
if (m == I2O_QUEUE_EMPTY)
|
||||
return -EBUSY;
|
||||
|
||||
mptr = &msg->body[3];
|
||||
|
||||
if ((rc = i2o_dma_alloc(&c->pdev->dev, &buffer, count, GFP_KERNEL))) {
|
||||
i2o_msg_nop(c, m);
|
||||
return rc;
|
||||
}
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC
|
||||
if (c->adaptec) {
|
||||
mptr = &msg->body[4];
|
||||
function = I2O_CMD_PRIVATE;
|
||||
|
||||
writel(TEN_WORD_MSG_SIZE | SGL_OFFSET_8, &msg->u.head[0]);
|
||||
|
||||
writel(I2O_VENDOR_DPT << 16 | I2O_DPT_FLASH_READ,
|
||||
&msg->body[0]);
|
||||
writel(i2o_config_dpt_region(swtype, swid), &msg->body[1]);
|
||||
writel(*offset, &msg->body[2]);
|
||||
writel(count, &msg->body[3]);
|
||||
} else
|
||||
#endif
|
||||
writel(NINE_WORD_MSG_SIZE | SGL_OFFSET_7, &msg->u.head[0]);
|
||||
|
||||
writel(0xD0000000 | count, mptr++);
|
||||
writel(buffer.phys, mptr);
|
||||
|
||||
writel(function << 24 | HOST_TID << 12 | ADAPTER_TID, &msg->u.head[1]);
|
||||
writel(i2o_config_driver.context, &msg->u.head[2]);
|
||||
writel(0, &msg->u.head[3]);
|
||||
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC
|
||||
if (!c->adaptec)
|
||||
#endif
|
||||
{
|
||||
writel((u32) swtype << 16 | (u32) 1 << 8, &msg->body[0]);
|
||||
writel(0, &msg->body[1]);
|
||||
writel(swid, &msg->body[2]);
|
||||
}
|
||||
|
||||
status = i2o_msg_post_wait_mem(c, m, 60, &buffer);
|
||||
|
||||
if (status == I2O_POST_WAIT_OK) {
|
||||
if (!(rc = copy_to_user(buf, buffer.virt, count))) {
|
||||
rc = count;
|
||||
*offset += count;
|
||||
}
|
||||
} else
|
||||
rc = -EIO;
|
||||
|
||||
if (status != -ETIMEDOUT)
|
||||
i2o_dma_free(&c->pdev->dev, &buffer);
|
||||
|
||||
return rc;
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_config_sw_write - Write a software module to controller
|
||||
* @file: file pointer
|
||||
* @buf: buffer into which the data should be copied
|
||||
* @count: number of bytes to read
|
||||
* @off: file offset
|
||||
* @swtype: type of software module writing
|
||||
* @swid: id of software which should be written
|
||||
*
|
||||
* Transfers @count bytes at offset @offset from buffer to IOP using
|
||||
* type @swtype and id @swid as described in I2O spec.
|
||||
*
|
||||
* Returns number of bytes copied from buffer or error code on failure.
|
||||
*/
|
||||
static ssize_t i2o_config_sw_write(struct file *file, const char __user * buf,
|
||||
size_t count, loff_t * offset, u8 swtype,
|
||||
u32 swid)
|
||||
{
|
||||
struct sysfs_dirent *sd = file->f_dentry->d_parent->d_fsdata;
|
||||
struct kobject *kobj = sd->s_element;
|
||||
struct i2o_controller *c = kobj_to_i2o_device(kobj)->iop;
|
||||
u32 m, function = I2O_CMD_SW_DOWNLOAD;
|
||||
struct i2o_dma buffer;
|
||||
struct i2o_message __iomem *msg;
|
||||
u32 __iomem *mptr;
|
||||
int rc, status;
|
||||
|
||||
m = i2o_msg_get_wait(c, &msg, I2O_TIMEOUT_MESSAGE_GET);
|
||||
if (m == I2O_QUEUE_EMPTY)
|
||||
return -EBUSY;
|
||||
|
||||
mptr = &msg->body[3];
|
||||
|
||||
if ((rc = i2o_dma_alloc(&c->pdev->dev, &buffer, count, GFP_KERNEL)))
|
||||
goto nop_msg;
|
||||
|
||||
if ((rc = copy_from_user(buffer.virt, buf, count)))
|
||||
goto free_buffer;
|
||||
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC
|
||||
if (c->adaptec) {
|
||||
mptr = &msg->body[4];
|
||||
function = I2O_CMD_PRIVATE;
|
||||
|
||||
writel(TEN_WORD_MSG_SIZE | SGL_OFFSET_8, &msg->u.head[0]);
|
||||
|
||||
writel(I2O_VENDOR_DPT << 16 | I2O_DPT_FLASH_WRITE,
|
||||
&msg->body[0]);
|
||||
writel(i2o_config_dpt_region(swtype, swid), &msg->body[1]);
|
||||
writel(*offset, &msg->body[2]);
|
||||
writel(count, &msg->body[3]);
|
||||
} else
|
||||
#endif
|
||||
writel(NINE_WORD_MSG_SIZE | SGL_OFFSET_7, &msg->u.head[0]);
|
||||
|
||||
writel(0xD4000000 | count, mptr++);
|
||||
writel(buffer.phys, mptr);
|
||||
|
||||
writel(function << 24 | HOST_TID << 12 | ADAPTER_TID, &msg->u.head[1]);
|
||||
writel(i2o_config_driver.context, &msg->u.head[2]);
|
||||
writel(0, &msg->u.head[3]);
|
||||
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC
|
||||
if (!c->adaptec)
|
||||
#endif
|
||||
{
|
||||
writel((u32) swtype << 16 | (u32) 1 << 8, &msg->body[0]);
|
||||
writel(0, &msg->body[1]);
|
||||
writel(swid, &msg->body[2]);
|
||||
}
|
||||
|
||||
status = i2o_msg_post_wait_mem(c, m, 60, &buffer);
|
||||
|
||||
if (status != -ETIMEDOUT)
|
||||
i2o_dma_free(&c->pdev->dev, &buffer);
|
||||
|
||||
if (status != I2O_POST_WAIT_OK)
|
||||
return -EIO;
|
||||
|
||||
*offset += count;
|
||||
|
||||
return count;
|
||||
|
||||
free_buffer:
|
||||
i2o_dma_free(&c->pdev->dev, &buffer);
|
||||
|
||||
nop_msg:
|
||||
i2o_msg_nop(c, m);
|
||||
|
||||
return rc;
|
||||
};
|
||||
|
||||
/* attribute for HRT in sysfs */
|
||||
static struct bin_attribute i2o_config_hrt_attr = {
|
||||
.attr = {
|
||||
.name = "hrt",
|
||||
.mode = S_IRUGO,
|
||||
.owner = THIS_MODULE},
|
||||
.size = 0,
|
||||
.read = i2o_config_read_hrt
|
||||
};
|
||||
|
||||
/* attribute for LCT in sysfs */
|
||||
static struct bin_attribute i2o_config_lct_attr = {
|
||||
.attr = {
|
||||
.name = "lct",
|
||||
.mode = S_IRUGO,
|
||||
.owner = THIS_MODULE},
|
||||
.size = 0,
|
||||
.read = i2o_config_read_lct
|
||||
};
|
||||
|
||||
/* IRTOS firmware access */
|
||||
I2O_CONFIG_SW_ATTR(irtos, S_IWRSR, I2O_SOFTWARE_MODULE_IRTOS, 0);
|
||||
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC
|
||||
|
||||
/*
|
||||
* attribute for BIOS / SMOR, nvram and serial number access on DPT / Adaptec
|
||||
* controllers
|
||||
*/
|
||||
I2O_CONFIG_SW_ATTR(bios, S_IWRSR, I2O_SOFTWARE_MODULE_IOP_PRIVATE, 0);
|
||||
I2O_CONFIG_SW_ATTR(nvram, S_IWRSR, I2O_SOFTWARE_MODULE_IOP_CONFIG, 0);
|
||||
I2O_CONFIG_SW_ATTR(serial, S_IWRSR, I2O_SOFTWARE_MODULE_IOP_CONFIG, 1);
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* i2o_config_notify_controller_add - Notify of added controller
|
||||
* @c: the controller which was added
|
||||
*
|
||||
* If a I2O controller is added, we catch the notification to add sysfs
|
||||
* entries.
|
||||
*/
|
||||
static void i2o_config_notify_controller_add(struct i2o_controller *c)
|
||||
{
|
||||
struct kobject *kobj = &c->exec->device.kobj;
|
||||
|
||||
sysfs_create_bin_file(kobj, &i2o_config_hrt_attr);
|
||||
sysfs_create_bin_file(kobj, &i2o_config_lct_attr);
|
||||
|
||||
sysfs_create_fops_file(kobj, &i2o_config_attr_irtos);
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC
|
||||
if (c->adaptec) {
|
||||
sysfs_create_fops_file(kobj, &i2o_config_attr_bios);
|
||||
sysfs_create_fops_file(kobj, &i2o_config_attr_nvram);
|
||||
sysfs_create_fops_file(kobj, &i2o_config_attr_serial);
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_config_notify_controller_remove - Notify of removed controller
|
||||
* @c: the controller which was removed
|
||||
*
|
||||
* If a I2O controller is removed, we catch the notification to remove the
|
||||
* sysfs entries.
|
||||
*/
|
||||
static void i2o_config_notify_controller_remove(struct i2o_controller *c)
|
||||
{
|
||||
struct kobject *kobj = &c->exec->device.kobj;
|
||||
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC
|
||||
if (c->adaptec) {
|
||||
sysfs_remove_fops_file(kobj, &i2o_config_attr_serial);
|
||||
sysfs_remove_fops_file(kobj, &i2o_config_attr_nvram);
|
||||
sysfs_remove_fops_file(kobj, &i2o_config_attr_bios);
|
||||
}
|
||||
#endif
|
||||
sysfs_remove_fops_file(kobj, &i2o_config_attr_irtos);
|
||||
|
||||
sysfs_remove_bin_file(kobj, &i2o_config_lct_attr);
|
||||
sysfs_remove_bin_file(kobj, &i2o_config_hrt_attr);
|
||||
};
|
||||
|
||||
/* Config OSM driver struct */
|
||||
static struct i2o_driver i2o_config_driver = {
|
||||
.name = OSM_NAME,
|
||||
.notify_controller_add = i2o_config_notify_controller_add,
|
||||
.notify_controller_remove = i2o_config_notify_controller_remove
|
||||
};
|
||||
|
||||
#ifdef CONFIG_I2O_CONFIG_OLD_IOCTL
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
#include <linux/i2o.h>
|
||||
#include "core.h"
|
||||
|
||||
#define OSM_DESCRIPTION "I2O-subsystem"
|
||||
|
||||
/* PCI device id table for all I2O controllers */
|
||||
static struct pci_device_id __devinitdata i2o_pci_ids[] = {
|
||||
{PCI_DEVICE_CLASS(PCI_CLASS_INTELLIGENT_I2O << 8, 0xffff00)},
|
||||
|
@ -66,6 +68,8 @@ static void i2o_pci_free(struct i2o_controller *c)
|
|||
|
||||
if (c->base.virt)
|
||||
iounmap(c->base.virt);
|
||||
|
||||
pci_release_regions(c->pdev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -84,6 +88,11 @@ static int __devinit i2o_pci_alloc(struct i2o_controller *c)
|
|||
struct device *dev = &pdev->dev;
|
||||
int i;
|
||||
|
||||
if (pci_request_regions(pdev, OSM_DESCRIPTION)) {
|
||||
printk(KERN_ERR "%s: device already claimed\n", c->name);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
/* Skip I/O spaces */
|
||||
if (!(pci_resource_flags(pdev, i) & IORESOURCE_IO)) {
|
||||
|
@ -138,6 +147,7 @@ static int __devinit i2o_pci_alloc(struct i2o_controller *c)
|
|||
c->base.virt = ioremap_nocache(c->base.phys, c->base.len);
|
||||
if (!c->base.virt) {
|
||||
printk(KERN_ERR "%s: Unable to map controller.\n", c->name);
|
||||
i2o_pci_free(c);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
#include "wbsd.h"
|
||||
|
||||
#define DRIVER_NAME "wbsd"
|
||||
#define DRIVER_VERSION "1.2"
|
||||
#define DRIVER_VERSION "1.3"
|
||||
|
||||
#ifdef CONFIG_MMC_DEBUG
|
||||
#define DBG(x...) \
|
||||
|
|
|
@ -130,12 +130,11 @@ struct sixpack {
|
|||
|
||||
#define AX25_6PACK_HEADER_LEN 0
|
||||
|
||||
static void sp_start_tx_timer(struct sixpack *);
|
||||
static void sixpack_decode(struct sixpack *, unsigned char[], int);
|
||||
static int encode_sixpack(unsigned char *, unsigned char *, int, unsigned char);
|
||||
|
||||
/*
|
||||
* perform the persistence/slottime algorithm for CSMA access. If the
|
||||
* Perform the persistence/slottime algorithm for CSMA access. If the
|
||||
* persistence check was successful, write the data to the serial driver.
|
||||
* Note that in case of DAMA operation, the data is not sent here.
|
||||
*/
|
||||
|
@ -143,7 +142,7 @@ static int encode_sixpack(unsigned char *, unsigned char *, int, unsigned char);
|
|||
static void sp_xmit_on_air(unsigned long channel)
|
||||
{
|
||||
struct sixpack *sp = (struct sixpack *) channel;
|
||||
int actual;
|
||||
int actual, when = sp->slottime;
|
||||
static unsigned char random;
|
||||
|
||||
random = random * 17 + 41;
|
||||
|
@ -159,20 +158,10 @@ static void sp_xmit_on_air(unsigned long channel)
|
|||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->status2 = 0;
|
||||
} else
|
||||
sp_start_tx_timer(sp);
|
||||
mod_timer(&sp->tx_t, jiffies + ((when + 1) * HZ) / 100);
|
||||
}
|
||||
|
||||
/* ----> 6pack timer interrupt handler and friends. <---- */
|
||||
static void sp_start_tx_timer(struct sixpack *sp)
|
||||
{
|
||||
int when = sp->slottime;
|
||||
|
||||
del_timer(&sp->tx_t);
|
||||
sp->tx_t.data = (unsigned long) sp;
|
||||
sp->tx_t.function = sp_xmit_on_air;
|
||||
sp->tx_t.expires = jiffies + ((when + 1) * HZ) / 100;
|
||||
add_timer(&sp->tx_t);
|
||||
}
|
||||
|
||||
/* Encapsulate one AX.25 frame and stuff into a TTY queue. */
|
||||
static void sp_encaps(struct sixpack *sp, unsigned char *icp, int len)
|
||||
|
@ -243,8 +232,7 @@ static void sp_encaps(struct sixpack *sp, unsigned char *icp, int len)
|
|||
sp->xleft = count;
|
||||
sp->xhead = sp->xbuff;
|
||||
sp->status2 = count;
|
||||
if (sp->duplex == 0)
|
||||
sp_start_tx_timer(sp);
|
||||
sp_xmit_on_air((unsigned long)sp);
|
||||
}
|
||||
|
||||
return;
|
||||
|
|
|
@ -66,8 +66,8 @@
|
|||
|
||||
#define DRV_MODULE_NAME "tg3"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "3.34"
|
||||
#define DRV_MODULE_RELDATE "July 25, 2005"
|
||||
#define DRV_MODULE_VERSION "3.35"
|
||||
#define DRV_MODULE_RELDATE "August 6, 2005"
|
||||
|
||||
#define TG3_DEF_MAC_MODE 0
|
||||
#define TG3_DEF_RX_MODE 0
|
||||
|
@ -10421,6 +10421,12 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
|||
|
||||
tg3_init_coal(tp);
|
||||
|
||||
/* Now that we have fully setup the chip, save away a snapshot
|
||||
* of the PCI config space. We need to restore this after
|
||||
* GRC_MISC_CFG core clock resets and some resume events.
|
||||
*/
|
||||
pci_save_state(tp->pdev);
|
||||
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
printk(KERN_ERR PFX "Cannot register net device, "
|
||||
|
@ -10430,12 +10436,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
|||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
/* Now that we have fully setup the chip, save away a snapshot
|
||||
* of the PCI config space. We need to restore this after
|
||||
* GRC_MISC_CFG core clock resets and some resume events.
|
||||
*/
|
||||
pci_save_state(tp->pdev);
|
||||
|
||||
printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (PCI%s:%s:%s) %sBaseT Ethernet ",
|
||||
dev->name,
|
||||
tp->board_part_number,
|
||||
|
|
|
@ -221,37 +221,6 @@ pci_find_parent_resource(const struct pci_dev *dev, struct resource *res)
|
|||
return best;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_restore_bars - restore a devices BAR values (e.g. after wake-up)
|
||||
* @dev: PCI device to have its BARs restored
|
||||
*
|
||||
* Restore the BAR values for a given device, so as to make it
|
||||
* accessible by its driver.
|
||||
*/
|
||||
void
|
||||
pci_restore_bars(struct pci_dev *dev)
|
||||
{
|
||||
int i, numres;
|
||||
|
||||
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... */
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < numres; i ++)
|
||||
pci_update_resource(dev, &dev->resource[i], i);
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_set_power_state - Set the power state of a PCI device
|
||||
* @dev: PCI device to be suspended
|
||||
|
@ -270,7 +239,7 @@ int (*platform_pci_set_power_state)(struct pci_dev *dev, pci_power_t t);
|
|||
int
|
||||
pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||
{
|
||||
int pm, need_restore = 0;
|
||||
int pm;
|
||||
u16 pmcsr, pmc;
|
||||
|
||||
/* bound the state we're entering */
|
||||
|
@ -309,17 +278,14 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr);
|
||||
|
||||
/* If we're in D3, force entire word to 0.
|
||||
* This doesn't affect PME_Status, disables PME_En, and
|
||||
* sets PowerState to 0.
|
||||
*/
|
||||
if (dev->current_state >= PCI_D3hot) {
|
||||
if (!(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET))
|
||||
need_restore = 1;
|
||||
if (dev->current_state >= PCI_D3hot)
|
||||
pmcsr = 0;
|
||||
} else {
|
||||
else {
|
||||
pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr);
|
||||
pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
|
||||
pmcsr |= state;
|
||||
}
|
||||
|
@ -342,22 +308,6 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
|||
platform_pci_set_power_state(dev, state);
|
||||
|
||||
dev->current_state = state;
|
||||
|
||||
/* According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT
|
||||
* INTERFACE SPECIFICATION, REV. 1.2", a device transitioning
|
||||
* from D3hot to D0 _may_ perform an internal reset, thereby
|
||||
* going to "D0 Uninitialized" rather than "D0 Initialized".
|
||||
* For example, at least some versions of the 3c905B and the
|
||||
* 3c556B exhibit this behaviour.
|
||||
*
|
||||
* At least some laptop BIOSen (e.g. the Thinkpad T21) leave
|
||||
* devices in a D3hot state at boot. Consequently, we need to
|
||||
* restore at least the BARs so that the device will be
|
||||
* accessible to its driver.
|
||||
*/
|
||||
if (need_restore)
|
||||
pci_restore_bars(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -855,7 +805,6 @@ struct pci_dev *isa_bridge;
|
|||
EXPORT_SYMBOL(isa_bridge);
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL_GPL(pci_restore_bars);
|
||||
EXPORT_SYMBOL(pci_enable_device_bars);
|
||||
EXPORT_SYMBOL(pci_enable_device);
|
||||
EXPORT_SYMBOL(pci_disable_device);
|
||||
|
|
|
@ -373,6 +373,25 @@ static void __devinit quirk_vt82c686_acpi(struct pci_dev *dev)
|
|||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi );
|
||||
|
||||
/*
|
||||
* VIA VT8235 ISA Bridge: Two IO regions pointed to by words at
|
||||
* 0x88 (128 bytes of power management registers)
|
||||
* 0xd0 (16 bytes of SMB registers)
|
||||
*/
|
||||
static void __devinit quirk_vt8235_acpi(struct pci_dev *dev)
|
||||
{
|
||||
u16 pm, smb;
|
||||
|
||||
pci_read_config_word(dev, 0x88, &pm);
|
||||
pm &= PCI_BASE_ADDRESS_IO_MASK;
|
||||
quirk_io_region(dev, pm, 128, PCI_BRIDGE_RESOURCES);
|
||||
|
||||
pci_read_config_word(dev, 0xd0, &smb);
|
||||
smb &= PCI_BASE_ADDRESS_IO_MASK;
|
||||
quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 1);
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi);
|
||||
|
||||
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
|
||||
|
|
|
@ -26,13 +26,18 @@
|
|||
#include "pci.h"
|
||||
|
||||
|
||||
void
|
||||
static void
|
||||
pci_update_resource(struct pci_dev *dev, struct resource *res, int resno)
|
||||
{
|
||||
struct pci_bus_region region;
|
||||
u32 new, check, mask;
|
||||
int reg;
|
||||
|
||||
/* Ignore resources for unimplemented BARs and unused resource slots
|
||||
for 64 bit BARs. */
|
||||
if (!res->flags)
|
||||
return;
|
||||
|
||||
pcibios_resource_to_bus(dev, ®ion, res);
|
||||
|
||||
pr_debug(" got res [%lx:%lx] bus [%lx:%lx] flags %lx for "
|
||||
|
@ -67,7 +72,7 @@ pci_update_resource(struct pci_dev *dev, struct resource *res, int resno)
|
|||
|
||||
if ((new & (PCI_BASE_ADDRESS_SPACE|PCI_BASE_ADDRESS_MEM_TYPE_MASK)) ==
|
||||
(PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64)) {
|
||||
new = 0; /* currently everyone zeros the high address */
|
||||
new = region.start >> 16 >> 16;
|
||||
pci_write_config_dword(dev, reg + 4, new);
|
||||
pci_read_config_dword(dev, reg + 4, &check);
|
||||
if (check != new) {
|
||||
|
|
|
@ -8119,21 +8119,23 @@ static struct notifier_block qeth_ip6_notifier = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static int
|
||||
__qeth_reboot_event_card(struct device *dev, void *data)
|
||||
{
|
||||
struct qeth_card *card;
|
||||
|
||||
card = (struct qeth_card *) dev->driver_data;
|
||||
qeth_clear_ip_list(card, 0, 0);
|
||||
qeth_qdio_clear_card(card, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
qeth_reboot_event(struct notifier_block *this, unsigned long event, void *ptr)
|
||||
{
|
||||
|
||||
struct device *entry;
|
||||
struct qeth_card *card;
|
||||
|
||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
||||
list_for_each_entry(entry, &qeth_ccwgroup_driver.driver.devices,
|
||||
driver_list) {
|
||||
card = (struct qeth_card *) entry->driver_data;
|
||||
qeth_clear_ip_list(card, 0, 0);
|
||||
qeth_qdio_clear_card(card, 0);
|
||||
}
|
||||
up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
||||
driver_for_each_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
|
||||
__qeth_reboot_event_card);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,23 +27,33 @@ const char *VERSION_QETH_PROC_C = "$Revision: 1.13 $";
|
|||
#define QETH_PROCFILE_NAME "qeth"
|
||||
static struct proc_dir_entry *qeth_procfile;
|
||||
|
||||
static int
|
||||
qeth_procfile_seq_match(struct device *dev, void *data)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void *
|
||||
qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
||||
{
|
||||
struct list_head *next_card = NULL;
|
||||
int i = 0;
|
||||
struct device *dev;
|
||||
loff_t nr;
|
||||
|
||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
||||
|
||||
if (*offset == 0)
|
||||
nr = *offset;
|
||||
if (nr == 0)
|
||||
return SEQ_START_TOKEN;
|
||||
|
||||
/* get card at pos *offset */
|
||||
list_for_each(next_card, &qeth_ccwgroup_driver.driver.devices)
|
||||
if (++i == *offset)
|
||||
return next_card;
|
||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL,
|
||||
NULL, qeth_procfile_seq_match);
|
||||
|
||||
return NULL;
|
||||
/* get card at pos *offset */
|
||||
nr = *offset;
|
||||
while (nr-- > 1 && dev)
|
||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
|
||||
NULL, qeth_procfile_seq_match);
|
||||
return (void *) dev;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -55,23 +65,21 @@ qeth_procfile_seq_stop(struct seq_file *s, void* it)
|
|||
static void *
|
||||
qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
|
||||
{
|
||||
struct list_head *next_card = NULL;
|
||||
struct list_head *current_card;
|
||||
struct device *prev, *next;
|
||||
|
||||
if (it == SEQ_START_TOKEN) {
|
||||
next_card = qeth_ccwgroup_driver.driver.devices.next;
|
||||
if (next_card->next == next_card) /* list empty */
|
||||
return NULL;
|
||||
(*offset)++;
|
||||
} else {
|
||||
current_card = (struct list_head *)it;
|
||||
if (current_card->next == &qeth_ccwgroup_driver.driver.devices)
|
||||
return NULL; /* end of list reached */
|
||||
next_card = current_card->next;
|
||||
(*offset)++;
|
||||
next = driver_find_device(&qeth_ccwgroup_driver.driver,
|
||||
NULL, NULL, qeth_procfile_seq_match);
|
||||
if (next)
|
||||
(*offset)++;
|
||||
return (void *) next;
|
||||
}
|
||||
|
||||
return next_card;
|
||||
prev = (struct device *) it;
|
||||
next = driver_find_device(&qeth_ccwgroup_driver.driver,
|
||||
prev, NULL, qeth_procfile_seq_match);
|
||||
if (next)
|
||||
(*offset)++;
|
||||
return (void *) next;
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
|
@ -126,7 +134,7 @@ qeth_procfile_seq_show(struct seq_file *s, void *it)
|
|||
"-------------- ---- ------ ---------- ---- "
|
||||
"---- ----- -----\n");
|
||||
} else {
|
||||
device = list_entry(it, struct device, driver_list);
|
||||
device = (struct device *) it;
|
||||
card = device->driver_data;
|
||||
seq_printf(s, "%s/%s/%s x%02X %-10s %-14s %-4i ",
|
||||
CARD_RDEV_ID(card),
|
||||
|
@ -180,17 +188,20 @@ static struct proc_dir_entry *qeth_perf_procfile;
|
|||
static void *
|
||||
qeth_perf_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
||||
{
|
||||
struct list_head *next_card = NULL;
|
||||
int i = 0;
|
||||
struct device *dev = NULL;
|
||||
int nr;
|
||||
|
||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
||||
/* get card at pos *offset */
|
||||
list_for_each(next_card, &qeth_ccwgroup_driver.driver.devices){
|
||||
if (i == *offset)
|
||||
return next_card;
|
||||
i++;
|
||||
}
|
||||
return NULL;
|
||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
|
||||
qeth_procfile_seq_match);
|
||||
|
||||
/* get card at pos *offset */
|
||||
nr = *offset;
|
||||
while (nr-- > 1 && dev)
|
||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
|
||||
NULL, qeth_procfile_seq_match);
|
||||
return (void *) dev;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -202,12 +213,14 @@ qeth_perf_procfile_seq_stop(struct seq_file *s, void* it)
|
|||
static void *
|
||||
qeth_perf_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
|
||||
{
|
||||
struct list_head *current_card = (struct list_head *)it;
|
||||
struct device *prev, *next;
|
||||
|
||||
if (current_card->next == &qeth_ccwgroup_driver.driver.devices)
|
||||
return NULL; /* end of list reached */
|
||||
(*offset)++;
|
||||
return current_card->next;
|
||||
prev = (struct device *) it;
|
||||
next = driver_find_device(&qeth_ccwgroup_driver.driver, prev,
|
||||
NULL, qeth_procfile_seq_match);
|
||||
if (next)
|
||||
(*offset)++;
|
||||
return (void *) next;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -216,7 +229,7 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
|
|||
struct device *device;
|
||||
struct qeth_card *card;
|
||||
|
||||
device = list_entry(it, struct device, driver_list);
|
||||
device = (struct device *) it;
|
||||
card = device->driver_data;
|
||||
seq_printf(s, "For card with devnos %s/%s/%s (%s):\n",
|
||||
CARD_RDEV_ID(card),
|
||||
|
@ -318,8 +331,8 @@ static struct proc_dir_entry *qeth_ipato_procfile;
|
|||
static void *
|
||||
qeth_ipato_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
||||
{
|
||||
struct list_head *next_card = NULL;
|
||||
int i = 0;
|
||||
struct device *dev;
|
||||
loff_t nr;
|
||||
|
||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
||||
/* TODO: finish this */
|
||||
|
@ -328,13 +341,16 @@ qeth_ipato_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
|||
* output driver settings then;
|
||||
* else output setting for respective card
|
||||
*/
|
||||
|
||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
|
||||
qeth_procfile_seq_match);
|
||||
|
||||
/* get card at pos *offset */
|
||||
list_for_each(next_card, &qeth_ccwgroup_driver.driver.devices){
|
||||
if (i == *offset)
|
||||
return next_card;
|
||||
i++;
|
||||
}
|
||||
return NULL;
|
||||
nr = *offset;
|
||||
while (nr-- > 1 && dev)
|
||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
|
||||
NULL, qeth_procfile_seq_match);
|
||||
return (void *) dev;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -346,18 +362,14 @@ qeth_ipato_procfile_seq_stop(struct seq_file *s, void* it)
|
|||
static void *
|
||||
qeth_ipato_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
|
||||
{
|
||||
struct list_head *current_card = (struct list_head *)it;
|
||||
struct device *prev, *next;
|
||||
|
||||
/* TODO: finish this */
|
||||
/*
|
||||
* maybe SEQ_SATRT_TOKEN can be returned for offset 0
|
||||
* output driver settings then;
|
||||
* else output setting for respective card
|
||||
*/
|
||||
if (current_card->next == &qeth_ccwgroup_driver.driver.devices)
|
||||
return NULL; /* end of list reached */
|
||||
(*offset)++;
|
||||
return current_card->next;
|
||||
prev = (struct device *) it;
|
||||
next = driver_find_device(&qeth_ccwgroup_driver.driver, prev,
|
||||
NULL, qeth_procfile_seq_match);
|
||||
if (next)
|
||||
(*offset)++;
|
||||
return (void *) next;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -372,7 +384,7 @@ qeth_ipato_procfile_seq_show(struct seq_file *s, void *it)
|
|||
* output driver settings then;
|
||||
* else output setting for respective card
|
||||
*/
|
||||
device = list_entry(it, struct device, driver_list);
|
||||
device = (struct device *) it;
|
||||
card = device->driver_data;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#define __KERNEL_SYSCALLS__
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
|
@ -459,10 +460,6 @@ static struct task_struct *kenvctrld_task;
|
|||
|
||||
static int kenvctrld(void *__unused)
|
||||
{
|
||||
daemonize("kenvctrld");
|
||||
allow_signal(SIGKILL);
|
||||
kenvctrld_task = current;
|
||||
|
||||
printk(KERN_INFO "bbc_envctrl: kenvctrld starting...\n");
|
||||
last_warning_jiffies = jiffies - WARN_INTERVAL;
|
||||
for (;;) {
|
||||
|
@ -470,7 +467,7 @@ static int kenvctrld(void *__unused)
|
|||
struct bbc_fan_control *fp;
|
||||
|
||||
msleep_interruptible(POLL_INTERVAL);
|
||||
if (signal_pending(current))
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
|
||||
for (tp = all_bbc_temps; tp; tp = tp->next) {
|
||||
|
@ -577,7 +574,6 @@ int bbc_envctrl_init(void)
|
|||
int temp_index = 0;
|
||||
int fan_index = 0;
|
||||
int devidx = 0;
|
||||
int err = 0;
|
||||
|
||||
while ((echild = bbc_i2c_getdev(devidx++)) != NULL) {
|
||||
if (!strcmp(echild->prom_name, "temperature"))
|
||||
|
@ -585,9 +581,13 @@ int bbc_envctrl_init(void)
|
|||
if (!strcmp(echild->prom_name, "fan-control"))
|
||||
attach_one_fan(echild, fan_index++);
|
||||
}
|
||||
if (temp_index != 0 && fan_index != 0)
|
||||
err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES);
|
||||
return err;
|
||||
if (temp_index != 0 && fan_index != 0) {
|
||||
kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
|
||||
if (IS_ERR(kenvctrld_task))
|
||||
return PTR_ERR(kenvctrld_task);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void destroy_one_temp(struct bbc_cpu_temperature *tp)
|
||||
|
@ -607,26 +607,7 @@ void bbc_envctrl_cleanup(void)
|
|||
struct bbc_cpu_temperature *tp;
|
||||
struct bbc_fan_control *fp;
|
||||
|
||||
if (kenvctrld_task != NULL) {
|
||||
force_sig(SIGKILL, kenvctrld_task);
|
||||
for (;;) {
|
||||
struct task_struct *p;
|
||||
int found = 0;
|
||||
|
||||
read_lock(&tasklist_lock);
|
||||
for_each_process(p) {
|
||||
if (p == kenvctrld_task) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
read_unlock(&tasklist_lock);
|
||||
if (!found)
|
||||
break;
|
||||
msleep(1000);
|
||||
}
|
||||
kenvctrld_task = NULL;
|
||||
}
|
||||
kthread_stop(kenvctrld_task);
|
||||
|
||||
tp = all_bbc_temps;
|
||||
while (tp != NULL) {
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ioport.h>
|
||||
|
@ -1010,16 +1011,13 @@ static int kenvctrld(void *__unused)
|
|||
|
||||
poll_interval = 5000; /* TODO env_mon_interval */
|
||||
|
||||
daemonize("kenvctrld");
|
||||
allow_signal(SIGKILL);
|
||||
|
||||
kenvctrld_task = current;
|
||||
|
||||
printk(KERN_INFO "envctrl: %s starting...\n", current->comm);
|
||||
for (;;) {
|
||||
if(msleep_interruptible(poll_interval))
|
||||
break;
|
||||
msleep_interruptible(poll_interval);
|
||||
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
|
||||
for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) {
|
||||
if (0 < envctrl_read_cpu_info(whichcpu, cputemp,
|
||||
ENVCTRL_CPUTEMP_MON,
|
||||
|
@ -1041,7 +1039,6 @@ static int kenvctrld(void *__unused)
|
|||
|
||||
static int __init envctrl_init(void)
|
||||
{
|
||||
#ifdef CONFIG_PCI
|
||||
struct linux_ebus *ebus = NULL;
|
||||
struct linux_ebus_device *edev = NULL;
|
||||
struct linux_ebus_child *edev_child = NULL;
|
||||
|
@ -1118,9 +1115,11 @@ static int __init envctrl_init(void)
|
|||
i2c_childlist[i].addr, (0 == i) ? ("\n") : (" "));
|
||||
}
|
||||
|
||||
err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES);
|
||||
if (err < 0)
|
||||
kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
|
||||
if (IS_ERR(kenvctrld_task)) {
|
||||
err = PTR_ERR(kenvctrld_task);
|
||||
goto out_deregister;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1133,37 +1132,13 @@ static int __init envctrl_init(void)
|
|||
kfree(i2c_childlist[i].tables);
|
||||
}
|
||||
return err;
|
||||
#else
|
||||
return -ENODEV;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __exit envctrl_cleanup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (NULL != kenvctrld_task) {
|
||||
force_sig(SIGKILL, kenvctrld_task);
|
||||
for (;;) {
|
||||
struct task_struct *p;
|
||||
int found = 0;
|
||||
|
||||
read_lock(&tasklist_lock);
|
||||
for_each_process(p) {
|
||||
if (p == kenvctrld_task) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
read_unlock(&tasklist_lock);
|
||||
|
||||
if (!found)
|
||||
break;
|
||||
|
||||
msleep(1000);
|
||||
}
|
||||
kenvctrld_task = NULL;
|
||||
}
|
||||
kthread_stop(kenvctrld_task);
|
||||
|
||||
iounmap(i2c);
|
||||
misc_deregister(&envctrl_dev);
|
||||
|
|
|
@ -129,8 +129,6 @@ struct vfc_dev {
|
|||
struct vfc_regs *phys_regs;
|
||||
unsigned int control_reg;
|
||||
struct semaphore device_lock_sem;
|
||||
struct timer_list poll_timer;
|
||||
wait_queue_head_t poll_wait;
|
||||
int instance;
|
||||
int busy;
|
||||
unsigned long which_io;
|
||||
|
|
|
@ -137,7 +137,6 @@ int init_vfc_devstruct(struct vfc_dev *dev, int instance)
|
|||
dev->instance=instance;
|
||||
init_MUTEX(&dev->device_lock_sem);
|
||||
dev->control_reg=0;
|
||||
init_waitqueue_head(&dev->poll_wait);
|
||||
dev->busy=0;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -79,25 +79,10 @@ int vfc_pcf8584_init(struct vfc_dev *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void vfc_i2c_delay_wakeup(struct vfc_dev *dev)
|
||||
{
|
||||
/* Used to profile code and eliminate too many delays */
|
||||
VFC_I2C_DEBUG_PRINTK(("vfc%d: Delaying\n", dev->instance));
|
||||
wake_up(&dev->poll_wait);
|
||||
}
|
||||
|
||||
void vfc_i2c_delay_no_busy(struct vfc_dev *dev, unsigned long usecs)
|
||||
{
|
||||
DEFINE_WAIT(wait);
|
||||
init_timer(&dev->poll_timer);
|
||||
dev->poll_timer.expires = jiffies + usecs_to_jiffies(usecs);
|
||||
dev->poll_timer.data=(unsigned long)dev;
|
||||
dev->poll_timer.function=(void *)(unsigned long)vfc_i2c_delay_wakeup;
|
||||
add_timer(&dev->poll_timer);
|
||||
prepare_to_wait(&dev->poll_wait, &wait, TASK_UNINTERRUPTIBLE);
|
||||
schedule();
|
||||
del_timer(&dev->poll_timer);
|
||||
finish_wait(&dev->poll_wait, &wait);
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
schedule_timeout(usecs_to_jiffies(usecs));
|
||||
}
|
||||
|
||||
void inline vfc_i2c_delay(struct vfc_dev *dev)
|
||||
|
|
|
@ -907,9 +907,13 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
|
|||
raptorFlag = TRUE;
|
||||
}
|
||||
|
||||
|
||||
if (pci_request_regions(pDev, "dpt_i2o")) {
|
||||
PERROR("dpti: adpt_config_hba: pci request region failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
base_addr_virt = ioremap(base_addr0_phys,hba_map0_area_size);
|
||||
if (!base_addr_virt) {
|
||||
pci_release_regions(pDev);
|
||||
PERROR("dpti: adpt_config_hba: io remap failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -919,6 +923,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
|
|||
if (!msg_addr_virt) {
|
||||
PERROR("dpti: adpt_config_hba: io remap failed on BAR1\n");
|
||||
iounmap(base_addr_virt);
|
||||
pci_release_regions(pDev);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
|
@ -932,6 +937,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
|
|||
iounmap(msg_addr_virt);
|
||||
}
|
||||
iounmap(base_addr_virt);
|
||||
pci_release_regions(pDev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(pHba, 0, sizeof(adpt_hba));
|
||||
|
@ -1027,6 +1033,7 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba)
|
|||
up(&adpt_configuration_lock);
|
||||
|
||||
iounmap(pHba->base_addr_virt);
|
||||
pci_release_regions(pHba->pDev);
|
||||
if(pHba->msg_addr_virt != pHba->base_addr_virt){
|
||||
iounmap(pHba->msg_addr_virt);
|
||||
}
|
||||
|
|
|
@ -385,6 +385,7 @@ int ata_scsi_error(struct Scsi_Host *host)
|
|||
* appropriate place
|
||||
*/
|
||||
host->host_failed--;
|
||||
INIT_LIST_HEAD(&host->eh_cmd_q);
|
||||
|
||||
DPRINTK("EXIT\n");
|
||||
return 0;
|
||||
|
|
|
@ -468,7 +468,7 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc)
|
|||
for (i = 0; i < last; i++) {
|
||||
buf[idx++] = cpu_to_le32(sg_dma_address(&sg[i]));
|
||||
buf[idx++] = cpu_to_le32(sg_dma_len(&sg[i]));
|
||||
total_len += sg[i].length;
|
||||
total_len += sg_dma_len(&sg[i]);
|
||||
}
|
||||
buf[idx - 1] |= cpu_to_le32(ATA_PRD_EOT);
|
||||
sgt_len = idx * 4;
|
||||
|
|
|
@ -336,9 +336,23 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
|
|||
unsigned long flags;
|
||||
const int size = sizeof(struct scsi_target)
|
||||
+ shost->transportt->target_size;
|
||||
struct scsi_target *starget = kmalloc(size, GFP_ATOMIC);
|
||||
struct scsi_target *starget;
|
||||
struct scsi_target *found_target;
|
||||
|
||||
/*
|
||||
* Obtain the real parent from the transport. The transport
|
||||
* is allowed to fail (no error) if there is nothing at that
|
||||
* target id.
|
||||
*/
|
||||
if (shost->transportt->target_parent) {
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
parent = shost->transportt->target_parent(shost, channel, id);
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
if (!parent)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
starget = kmalloc(size, GFP_KERNEL);
|
||||
if (!starget) {
|
||||
printk(KERN_ERR "%s: allocation failure\n", __FUNCTION__);
|
||||
return NULL;
|
||||
|
|
|
@ -1022,6 +1022,23 @@ static int fc_rport_match(struct attribute_container *cont,
|
|||
return &i->rport_attr_cont.ac == cont;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Must be called with shost->host_lock held
|
||||
*/
|
||||
static struct device *fc_target_parent(struct Scsi_Host *shost,
|
||||
int channel, uint id)
|
||||
{
|
||||
struct fc_rport *rport;
|
||||
|
||||
list_for_each_entry(rport, &fc_host_rports(shost), peers)
|
||||
if ((rport->channel == channel) &&
|
||||
(rport->scsi_target_id == id))
|
||||
return &rport->dev;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct scsi_transport_template *
|
||||
fc_attach_transport(struct fc_function_template *ft)
|
||||
{
|
||||
|
@ -1057,6 +1074,8 @@ fc_attach_transport(struct fc_function_template *ft)
|
|||
|
||||
/* Transport uses the shost workq for scsi scanning */
|
||||
i->t.create_work_queue = 1;
|
||||
|
||||
i->t.target_parent = fc_target_parent;
|
||||
|
||||
/*
|
||||
* Setup SCSI Target Attributes.
|
||||
|
|
|
@ -40,13 +40,15 @@
|
|||
#define TX_NUM_FIFO 4
|
||||
#define TX_BUF_SIZE 32
|
||||
|
||||
#define SCC_WAIT_CLOSING 100
|
||||
|
||||
struct uart_cpm_port {
|
||||
struct uart_port port;
|
||||
u16 rx_nrfifos;
|
||||
u16 rx_nrfifos;
|
||||
u16 rx_fifosize;
|
||||
u16 tx_nrfifos;
|
||||
u16 tx_nrfifos;
|
||||
u16 tx_fifosize;
|
||||
smc_t *smcp;
|
||||
smc_t *smcp;
|
||||
smc_uart_t *smcup;
|
||||
scc_t *sccp;
|
||||
scc_uart_t *sccup;
|
||||
|
@ -67,6 +69,8 @@ struct uart_cpm_port {
|
|||
int bits;
|
||||
/* Keep track of 'odd' SMC2 wirings */
|
||||
int is_portb;
|
||||
/* wait on close if needed */
|
||||
int wait_closing;
|
||||
};
|
||||
|
||||
extern int cpm_uart_port_map[UART_NR];
|
||||
|
|
|
@ -9,9 +9,10 @@
|
|||
*
|
||||
* Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2)
|
||||
* Pantelis Antoniou (panto@intracom.gr) (CPM1)
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2004 Freescale Semiconductor, Inc.
|
||||
* (C) 2004 Intracom, S.A.
|
||||
* (C) 2005 MontaVista Software, Inc. by Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -70,8 +71,22 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo);
|
|||
|
||||
/**************************************************************/
|
||||
|
||||
static inline unsigned long cpu2cpm_addr(void *addr)
|
||||
{
|
||||
if ((unsigned long)addr >= CPM_ADDR)
|
||||
return (unsigned long)addr;
|
||||
return virt_to_bus(addr);
|
||||
}
|
||||
|
||||
static inline void *cpm2cpu_addr(unsigned long addr)
|
||||
{
|
||||
if (addr >= CPM_ADDR)
|
||||
return (void *)addr;
|
||||
return bus_to_virt(addr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check, if transmit buffers are processed
|
||||
* Check, if transmit buffers are processed
|
||||
*/
|
||||
static unsigned int cpm_uart_tx_empty(struct uart_port *port)
|
||||
{
|
||||
|
@ -143,15 +158,18 @@ static void cpm_uart_start_tx(struct uart_port *port, unsigned int tty_start)
|
|||
}
|
||||
|
||||
if (cpm_uart_tx_pump(port) != 0) {
|
||||
if (IS_SMC(pinfo))
|
||||
if (IS_SMC(pinfo)) {
|
||||
smcp->smc_smcm |= SMCM_TX;
|
||||
else
|
||||
smcp->smc_smcmr |= SMCMR_TEN;
|
||||
} else {
|
||||
sccp->scc_sccm |= UART_SCCM_TX;
|
||||
pinfo->sccp->scc_gsmrl |= SCC_GSMRL_ENT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Stop receiver
|
||||
* Stop receiver
|
||||
*/
|
||||
static void cpm_uart_stop_rx(struct uart_port *port)
|
||||
{
|
||||
|
@ -176,7 +194,7 @@ static void cpm_uart_enable_ms(struct uart_port *port)
|
|||
}
|
||||
|
||||
/*
|
||||
* Generate a break.
|
||||
* Generate a break.
|
||||
*/
|
||||
static void cpm_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
{
|
||||
|
@ -231,7 +249,7 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs)
|
|||
/* get number of characters, and check spce in flip-buffer */
|
||||
i = bdp->cbd_datlen;
|
||||
|
||||
/* If we have not enough room in tty flip buffer, then we try
|
||||
/* If we have not enough room in tty flip buffer, then we try
|
||||
* later, which will be the next rx-interrupt or a timeout
|
||||
*/
|
||||
if ((tty->flip.count + i) >= TTY_FLIPBUF_SIZE) {
|
||||
|
@ -243,7 +261,7 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs)
|
|||
}
|
||||
|
||||
/* get pointer */
|
||||
cp = (unsigned char *)bus_to_virt(bdp->cbd_bufaddr);
|
||||
cp = cpm2cpu_addr(bdp->cbd_bufaddr);
|
||||
|
||||
/* loop through the buffer */
|
||||
while (i-- > 0) {
|
||||
|
@ -265,13 +283,14 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs)
|
|||
} /* End while (i--) */
|
||||
|
||||
/* This BD is ready to be used again. Clear status. get next */
|
||||
bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV);
|
||||
bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV | BD_SC_ID);
|
||||
bdp->cbd_sc |= BD_SC_EMPTY;
|
||||
|
||||
if (bdp->cbd_sc & BD_SC_WRAP)
|
||||
bdp = pinfo->rx_bd_base;
|
||||
else
|
||||
bdp++;
|
||||
|
||||
} /* End for (;;) */
|
||||
|
||||
/* Write back buffer pointer */
|
||||
|
@ -336,22 +355,22 @@ static irqreturn_t cpm_uart_int(int irq, void *data, struct pt_regs *regs)
|
|||
|
||||
if (IS_SMC(pinfo)) {
|
||||
events = smcp->smc_smce;
|
||||
smcp->smc_smce = events;
|
||||
if (events & SMCM_BRKE)
|
||||
uart_handle_break(port);
|
||||
if (events & SMCM_RX)
|
||||
cpm_uart_int_rx(port, regs);
|
||||
if (events & SMCM_TX)
|
||||
cpm_uart_int_tx(port, regs);
|
||||
smcp->smc_smce = events;
|
||||
} else {
|
||||
events = sccp->scc_scce;
|
||||
sccp->scc_scce = events;
|
||||
if (events & UART_SCCM_BRKE)
|
||||
uart_handle_break(port);
|
||||
if (events & UART_SCCM_RX)
|
||||
cpm_uart_int_rx(port, regs);
|
||||
if (events & UART_SCCM_TX)
|
||||
cpm_uart_int_tx(port, regs);
|
||||
sccp->scc_scce = events;
|
||||
}
|
||||
return (events) ? IRQ_HANDLED : IRQ_NONE;
|
||||
}
|
||||
|
@ -360,6 +379,7 @@ static int cpm_uart_startup(struct uart_port *port)
|
|||
{
|
||||
int retval;
|
||||
struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
|
||||
int line = pinfo - cpm_uart_ports;
|
||||
|
||||
pr_debug("CPM uart[%d]:startup\n", port->line);
|
||||
|
||||
|
@ -376,9 +396,19 @@ static int cpm_uart_startup(struct uart_port *port)
|
|||
pinfo->sccp->scc_sccm |= UART_SCCM_RX;
|
||||
}
|
||||
|
||||
if (!(pinfo->flags & FLAG_CONSOLE))
|
||||
cpm_line_cr_cmd(line,CPM_CR_INIT_TRX);
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline void cpm_uart_wait_until_send(struct uart_cpm_port *pinfo)
|
||||
{
|
||||
unsigned long target_jiffies = jiffies + pinfo->wait_closing;
|
||||
|
||||
while (!time_after(jiffies, target_jiffies))
|
||||
schedule();
|
||||
}
|
||||
|
||||
/*
|
||||
* Shutdown the uart
|
||||
*/
|
||||
|
@ -394,6 +424,12 @@ static void cpm_uart_shutdown(struct uart_port *port)
|
|||
|
||||
/* If the port is not the console, disable Rx and Tx. */
|
||||
if (!(pinfo->flags & FLAG_CONSOLE)) {
|
||||
/* Wait for all the BDs marked sent */
|
||||
while(!cpm_uart_tx_empty(port))
|
||||
schedule_timeout(2);
|
||||
if(pinfo->wait_closing)
|
||||
cpm_uart_wait_until_send(pinfo);
|
||||
|
||||
/* Stop uarts */
|
||||
if (IS_SMC(pinfo)) {
|
||||
volatile smc_t *smcp = pinfo->smcp;
|
||||
|
@ -502,7 +538,7 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
|||
*/
|
||||
if ((termios->c_cflag & CREAD) == 0)
|
||||
port->read_status_mask &= ~BD_SC_EMPTY;
|
||||
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
|
||||
/* Start bit has not been added (so don't, because we would just
|
||||
|
@ -569,7 +605,8 @@ static int cpm_uart_tx_pump(struct uart_port *port)
|
|||
/* Pick next descriptor and fill from buffer */
|
||||
bdp = pinfo->tx_cur;
|
||||
|
||||
p = bus_to_virt(bdp->cbd_bufaddr);
|
||||
p = cpm2cpu_addr(bdp->cbd_bufaddr);
|
||||
|
||||
*p++ = xmit->buf[xmit->tail];
|
||||
bdp->cbd_datlen = 1;
|
||||
bdp->cbd_sc |= BD_SC_READY;
|
||||
|
@ -595,7 +632,7 @@ static int cpm_uart_tx_pump(struct uart_port *port)
|
|||
|
||||
while (!(bdp->cbd_sc & BD_SC_READY) && (xmit->tail != xmit->head)) {
|
||||
count = 0;
|
||||
p = bus_to_virt(bdp->cbd_bufaddr);
|
||||
p = cpm2cpu_addr(bdp->cbd_bufaddr);
|
||||
while (count < pinfo->tx_fifosize) {
|
||||
*p++ = xmit->buf[xmit->tail];
|
||||
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
|
||||
|
@ -606,6 +643,7 @@ static int cpm_uart_tx_pump(struct uart_port *port)
|
|||
}
|
||||
bdp->cbd_datlen = count;
|
||||
bdp->cbd_sc |= BD_SC_READY;
|
||||
__asm__("eieio");
|
||||
/* Get next BD. */
|
||||
if (bdp->cbd_sc & BD_SC_WRAP)
|
||||
bdp = pinfo->tx_bd_base;
|
||||
|
@ -643,12 +681,12 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo)
|
|||
mem_addr = pinfo->mem_addr;
|
||||
bdp = pinfo->rx_cur = pinfo->rx_bd_base;
|
||||
for (i = 0; i < (pinfo->rx_nrfifos - 1); i++, bdp++) {
|
||||
bdp->cbd_bufaddr = virt_to_bus(mem_addr);
|
||||
bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr);
|
||||
bdp->cbd_sc = BD_SC_EMPTY | BD_SC_INTRPT;
|
||||
mem_addr += pinfo->rx_fifosize;
|
||||
}
|
||||
|
||||
bdp->cbd_bufaddr = virt_to_bus(mem_addr);
|
||||
|
||||
bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr);
|
||||
bdp->cbd_sc = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT;
|
||||
|
||||
/* Set the physical address of the host memory
|
||||
|
@ -658,12 +696,12 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo)
|
|||
mem_addr = pinfo->mem_addr + L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize);
|
||||
bdp = pinfo->tx_cur = pinfo->tx_bd_base;
|
||||
for (i = 0; i < (pinfo->tx_nrfifos - 1); i++, bdp++) {
|
||||
bdp->cbd_bufaddr = virt_to_bus(mem_addr);
|
||||
bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr);
|
||||
bdp->cbd_sc = BD_SC_INTRPT;
|
||||
mem_addr += pinfo->tx_fifosize;
|
||||
}
|
||||
|
||||
bdp->cbd_bufaddr = virt_to_bus(mem_addr);
|
||||
|
||||
bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr);
|
||||
bdp->cbd_sc = BD_SC_WRAP | BD_SC_INTRPT;
|
||||
}
|
||||
|
||||
|
@ -763,6 +801,8 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo)
|
|||
/* Using idle charater time requires some additional tuning. */
|
||||
up->smc_mrblr = pinfo->rx_fifosize;
|
||||
up->smc_maxidl = pinfo->rx_fifosize;
|
||||
up->smc_brklen = 0;
|
||||
up->smc_brkec = 0;
|
||||
up->smc_brkcr = 1;
|
||||
|
||||
cpm_line_cr_cmd(line, CPM_CR_INIT_TRX);
|
||||
|
@ -796,7 +836,7 @@ static int cpm_uart_request_port(struct uart_port *port)
|
|||
/*
|
||||
* Setup any port IO, connect any baud rate generators,
|
||||
* etc. This is expected to be handled by board
|
||||
* dependant code
|
||||
* dependant code
|
||||
*/
|
||||
if (pinfo->set_lineif)
|
||||
pinfo->set_lineif(pinfo);
|
||||
|
@ -815,6 +855,10 @@ static int cpm_uart_request_port(struct uart_port *port)
|
|||
return ret;
|
||||
|
||||
cpm_uart_initbd(pinfo);
|
||||
if (IS_SMC(pinfo))
|
||||
cpm_uart_init_smc(pinfo);
|
||||
else
|
||||
cpm_uart_init_scc(pinfo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -869,7 +913,7 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = {
|
|||
.flags = FLAG_SMC,
|
||||
.tx_nrfifos = TX_NUM_FIFO,
|
||||
.tx_fifosize = TX_BUF_SIZE,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_fifosize = RX_BUF_SIZE,
|
||||
.set_lineif = smc1_lineif,
|
||||
},
|
||||
|
@ -883,7 +927,7 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = {
|
|||
.flags = FLAG_SMC,
|
||||
.tx_nrfifos = TX_NUM_FIFO,
|
||||
.tx_fifosize = TX_BUF_SIZE,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_fifosize = RX_BUF_SIZE,
|
||||
.set_lineif = smc2_lineif,
|
||||
#ifdef CONFIG_SERIAL_CPM_ALT_SMC2
|
||||
|
@ -899,9 +943,10 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = {
|
|||
},
|
||||
.tx_nrfifos = TX_NUM_FIFO,
|
||||
.tx_fifosize = TX_BUF_SIZE,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_fifosize = RX_BUF_SIZE,
|
||||
.set_lineif = scc1_lineif,
|
||||
.wait_closing = SCC_WAIT_CLOSING,
|
||||
},
|
||||
[UART_SCC2] = {
|
||||
.port = {
|
||||
|
@ -912,9 +957,10 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = {
|
|||
},
|
||||
.tx_nrfifos = TX_NUM_FIFO,
|
||||
.tx_fifosize = TX_BUF_SIZE,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_fifosize = RX_BUF_SIZE,
|
||||
.set_lineif = scc2_lineif,
|
||||
.wait_closing = SCC_WAIT_CLOSING,
|
||||
},
|
||||
[UART_SCC3] = {
|
||||
.port = {
|
||||
|
@ -925,9 +971,10 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = {
|
|||
},
|
||||
.tx_nrfifos = TX_NUM_FIFO,
|
||||
.tx_fifosize = TX_BUF_SIZE,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_fifosize = RX_BUF_SIZE,
|
||||
.set_lineif = scc3_lineif,
|
||||
.wait_closing = SCC_WAIT_CLOSING,
|
||||
},
|
||||
[UART_SCC4] = {
|
||||
.port = {
|
||||
|
@ -938,9 +985,10 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = {
|
|||
},
|
||||
.tx_nrfifos = TX_NUM_FIFO,
|
||||
.tx_fifosize = TX_BUF_SIZE,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_nrfifos = RX_NUM_FIFO,
|
||||
.rx_fifosize = RX_BUF_SIZE,
|
||||
.set_lineif = scc4_lineif,
|
||||
.wait_closing = SCC_WAIT_CLOSING,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -983,11 +1031,8 @@ static void cpm_uart_console_write(struct console *co, const char *s,
|
|||
* If the buffer address is in the CPM DPRAM, don't
|
||||
* convert it.
|
||||
*/
|
||||
if ((uint) (bdp->cbd_bufaddr) > (uint) CPM_ADDR)
|
||||
cp = (unsigned char *) (bdp->cbd_bufaddr);
|
||||
else
|
||||
cp = bus_to_virt(bdp->cbd_bufaddr);
|
||||
|
||||
cp = cpm2cpu_addr(bdp->cbd_bufaddr);
|
||||
|
||||
*cp = *s;
|
||||
|
||||
bdp->cbd_datlen = 1;
|
||||
|
@ -1003,10 +1048,7 @@ static void cpm_uart_console_write(struct console *co, const char *s,
|
|||
while ((bdp->cbd_sc & BD_SC_READY) != 0)
|
||||
;
|
||||
|
||||
if ((uint) (bdp->cbd_bufaddr) > (uint) CPM_ADDR)
|
||||
cp = (unsigned char *) (bdp->cbd_bufaddr);
|
||||
else
|
||||
cp = bus_to_virt(bdp->cbd_bufaddr);
|
||||
cp = cpm2cpu_addr(bdp->cbd_bufaddr);
|
||||
|
||||
*cp = 13;
|
||||
bdp->cbd_datlen = 1;
|
||||
|
@ -1045,7 +1087,7 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
|
|||
port =
|
||||
(struct uart_port *)&cpm_uart_ports[cpm_uart_port_map[co->index]];
|
||||
pinfo = (struct uart_cpm_port *)port;
|
||||
|
||||
|
||||
pinfo->flags |= FLAG_CONSOLE;
|
||||
|
||||
if (options) {
|
||||
|
@ -1062,7 +1104,7 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
|
|||
/*
|
||||
* Setup any port IO, connect any baud rate generators,
|
||||
* etc. This is expected to be handled by board
|
||||
* dependant code
|
||||
* dependant code
|
||||
*/
|
||||
if (pinfo->set_lineif)
|
||||
pinfo->set_lineif(pinfo);
|
||||
|
@ -1092,14 +1134,14 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
|
|||
return 0;
|
||||
}
|
||||
|
||||
extern struct uart_driver cpm_reg;
|
||||
static struct uart_driver cpm_reg;
|
||||
static struct console cpm_scc_uart_console = {
|
||||
.name "ttyCPM",
|
||||
.write cpm_uart_console_write,
|
||||
.device uart_console_device,
|
||||
.setup cpm_uart_console_setup,
|
||||
.flags CON_PRINTBUFFER,
|
||||
.index -1,
|
||||
.name = "ttyCPM",
|
||||
.write = cpm_uart_console_write,
|
||||
.device = uart_console_device,
|
||||
.setup = cpm_uart_console_setup,
|
||||
.flags = CON_PRINTBUFFER,
|
||||
.index = -1,
|
||||
.data = &cpm_reg,
|
||||
};
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2)
|
||||
* Pantelis Antoniou (panto@intracom.gr) (CPM1)
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2004 Freescale Semiconductor, Inc.
|
||||
* (C) 2004 Intracom, S.A.
|
||||
*
|
||||
|
@ -82,6 +82,17 @@ void cpm_line_cr_cmd(int line, int cmd)
|
|||
void smc1_lineif(struct uart_cpm_port *pinfo)
|
||||
{
|
||||
volatile cpm8xx_t *cp = cpmp;
|
||||
|
||||
(void)cp; /* fix warning */
|
||||
#if defined (CONFIG_MPC885ADS)
|
||||
/* Enable SMC1 transceivers */
|
||||
{
|
||||
cp->cp_pepar |= 0x000000c0;
|
||||
cp->cp_pedir &= ~0x000000c0;
|
||||
cp->cp_peso &= ~0x00000040;
|
||||
cp->cp_peso |= 0x00000080;
|
||||
}
|
||||
#elif defined (CONFIG_MPC86XADS)
|
||||
unsigned int iobits = 0x000000c0;
|
||||
|
||||
if (!pinfo->is_portb) {
|
||||
|
@ -93,41 +104,33 @@ void smc1_lineif(struct uart_cpm_port *pinfo)
|
|||
((immap_t *)IMAP_ADDR)->im_ioport.iop_padir &= ~iobits;
|
||||
((immap_t *)IMAP_ADDR)->im_ioport.iop_paodr &= ~iobits;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MPC885ADS
|
||||
/* Enable SMC1 transceivers */
|
||||
{
|
||||
volatile uint __iomem *bcsr1 = ioremap(BCSR1, 4);
|
||||
uint tmp;
|
||||
|
||||
tmp = in_be32(bcsr1);
|
||||
tmp &= ~BCSR1_RS232EN_1;
|
||||
out_be32(bcsr1, tmp);
|
||||
iounmap(bcsr1);
|
||||
}
|
||||
#endif
|
||||
|
||||
pinfo->brg = 1;
|
||||
}
|
||||
|
||||
void smc2_lineif(struct uart_cpm_port *pinfo)
|
||||
{
|
||||
#ifdef CONFIG_MPC885ADS
|
||||
volatile cpm8xx_t *cp = cpmp;
|
||||
volatile uint __iomem *bcsr1;
|
||||
uint tmp;
|
||||
|
||||
(void)cp; /* fix warning */
|
||||
#if defined (CONFIG_MPC885ADS)
|
||||
cp->cp_pepar |= 0x00000c00;
|
||||
cp->cp_pedir &= ~0x00000c00;
|
||||
cp->cp_peso &= ~0x00000400;
|
||||
cp->cp_peso |= 0x00000800;
|
||||
#elif defined (CONFIG_MPC86XADS)
|
||||
unsigned int iobits = 0x00000c00;
|
||||
|
||||
if (!pinfo->is_portb) {
|
||||
cp->cp_pbpar |= iobits;
|
||||
cp->cp_pbdir &= ~iobits;
|
||||
cp->cp_pbodr &= ~iobits;
|
||||
} else {
|
||||
((immap_t *)IMAP_ADDR)->im_ioport.iop_papar |= iobits;
|
||||
((immap_t *)IMAP_ADDR)->im_ioport.iop_padir &= ~iobits;
|
||||
((immap_t *)IMAP_ADDR)->im_ioport.iop_paodr &= ~iobits;
|
||||
}
|
||||
|
||||
/* Enable SMC2 transceivers */
|
||||
bcsr1 = ioremap(BCSR1, 4);
|
||||
tmp = in_be32(bcsr1);
|
||||
tmp &= ~BCSR1_RS232EN_2;
|
||||
out_be32(bcsr1, tmp);
|
||||
iounmap(bcsr1);
|
||||
#endif
|
||||
|
||||
pinfo->brg = 2;
|
||||
|
@ -158,7 +161,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo)
|
|||
}
|
||||
|
||||
/*
|
||||
* Allocate DP-Ram and memory buffers. We need to allocate a transmit and
|
||||
* Allocate DP-Ram and memory buffers. We need to allocate a transmit and
|
||||
* receive buffer descriptors from dual port ram, and a character
|
||||
* buffer area from host mem. If we are allocating for the console we need
|
||||
* to do it from bootmem
|
||||
|
@ -185,6 +188,8 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
|
|||
memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) +
|
||||
L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize);
|
||||
if (is_con) {
|
||||
/* was hostalloc but changed cause it blows away the */
|
||||
/* large tlb mapping when pinning the kernel area */
|
||||
mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8));
|
||||
dma_addr = 0;
|
||||
} else
|
||||
|
|
|
@ -246,6 +246,11 @@ static const struct fb_videomode modedb[] = {
|
|||
/* 480x300 @ 72 Hz, 48.0 kHz hsync */
|
||||
NULL, 72, 480, 300, 33386, 40, 24, 11, 19, 80, 3,
|
||||
0, FB_VMODE_DOUBLE
|
||||
}, {
|
||||
/* 1920x1200 @ 60 Hz, 74.5 Khz hsync */
|
||||
NULL, 60, 1920, 1200, 5177, 128, 336, 1, 38, 208, 3,
|
||||
FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
FB_VMODE_NONINTERLACED
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -1324,6 +1324,13 @@ static int __devinit nvidia_set_fbinfo(struct fb_info *info)
|
|||
|
||||
fb_videomode_to_var(&nvidiafb_default_var, &modedb);
|
||||
nvidiafb_default_var.bits_per_pixel = 8;
|
||||
} else if (par->fpWidth && par->fpHeight) {
|
||||
char buf[16];
|
||||
|
||||
memset(buf, 0, 16);
|
||||
snprintf(buf, 15, "%dx%d", par->fpWidth, par->fpHeight);
|
||||
fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb,
|
||||
specs->modedb_len, &modedb, 8);
|
||||
}
|
||||
|
||||
if (mode_option)
|
||||
|
|
|
@ -717,6 +717,9 @@ static void pxafb_enable_controller(struct pxafb_info *fbi)
|
|||
DPRINTK("reg_lccr2 0x%08x\n", (unsigned int) fbi->reg_lccr2);
|
||||
DPRINTK("reg_lccr3 0x%08x\n", (unsigned int) fbi->reg_lccr3);
|
||||
|
||||
/* enable LCD controller clock */
|
||||
pxa_set_cken(CKEN16_LCD, 1);
|
||||
|
||||
/* Sequence from 11.7.10 */
|
||||
LCCR3 = fbi->reg_lccr3;
|
||||
LCCR2 = fbi->reg_lccr2;
|
||||
|
@ -750,6 +753,9 @@ static void pxafb_disable_controller(struct pxafb_info *fbi)
|
|||
|
||||
schedule_timeout(20 * HZ / 1000);
|
||||
remove_wait_queue(&fbi->ctrlr_wait, &wait);
|
||||
|
||||
/* disable LCD controller clock */
|
||||
pxa_set_cken(CKEN16_LCD, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1299,8 +1305,6 @@ int __init pxafb_probe(struct device *dev)
|
|||
ret = -ENOMEM;
|
||||
goto failed;
|
||||
}
|
||||
/* enable LCD controller clock */
|
||||
pxa_set_cken(CKEN16_LCD, 1);
|
||||
|
||||
ret = request_irq(IRQ_LCD, pxafb_handle_irq, SA_INTERRUPT, "LCD", fbi);
|
||||
if (ret) {
|
||||
|
|
|
@ -598,7 +598,7 @@ sa1100fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
|
|||
* requests for the LCD controller. If we hit this, it means we're
|
||||
* doing nothing but LCD DMA.
|
||||
*/
|
||||
static unsigned int sa1100fb_display_dma_period(struct fb_var_screeninfo *var)
|
||||
static inline unsigned int sa1100fb_display_dma_period(struct fb_var_screeninfo *var)
|
||||
{
|
||||
/*
|
||||
* Period = pixclock * bits_per_byte * bytes_per_transfer
|
||||
|
|
8
fs/bio.c
8
fs/bio.c
|
@ -248,17 +248,13 @@ inline void __bio_clone(struct bio *bio, struct bio *bio_src)
|
|||
{
|
||||
request_queue_t *q = bdev_get_queue(bio_src->bi_bdev);
|
||||
|
||||
memcpy(bio->bi_io_vec, bio_src->bi_io_vec, bio_src->bi_max_vecs * sizeof(struct bio_vec));
|
||||
memcpy(bio->bi_io_vec, bio_src->bi_io_vec,
|
||||
bio_src->bi_max_vecs * sizeof(struct bio_vec));
|
||||
|
||||
bio->bi_sector = bio_src->bi_sector;
|
||||
bio->bi_bdev = bio_src->bi_bdev;
|
||||
bio->bi_flags |= 1 << BIO_CLONED;
|
||||
bio->bi_rw = bio_src->bi_rw;
|
||||
|
||||
/*
|
||||
* notes -- maybe just leave bi_idx alone. assume identical mapping
|
||||
* for the clone
|
||||
*/
|
||||
bio->bi_vcnt = bio_src->bi_vcnt;
|
||||
bio->bi_size = bio_src->bi_size;
|
||||
bio->bi_idx = bio_src->bi_idx;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/string.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/fsnotify.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/smp_lock.h>
|
||||
|
@ -101,6 +102,7 @@ static inline void dentry_iput(struct dentry * dentry)
|
|||
list_del_init(&dentry->d_alias);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
spin_unlock(&dcache_lock);
|
||||
fsnotify_inoderemove(inode);
|
||||
if (dentry->d_op && dentry->d_op->d_iput)
|
||||
dentry->d_op->d_iput(dentry, inode);
|
||||
else
|
||||
|
@ -1165,13 +1167,16 @@ int d_validate(struct dentry *dentry, struct dentry *dparent)
|
|||
|
||||
void d_delete(struct dentry * dentry)
|
||||
{
|
||||
int isdir = 0;
|
||||
/*
|
||||
* Are we the only user?
|
||||
*/
|
||||
spin_lock(&dcache_lock);
|
||||
spin_lock(&dentry->d_lock);
|
||||
isdir = S_ISDIR(dentry->d_inode->i_mode);
|
||||
if (atomic_read(&dentry->d_count) == 1) {
|
||||
dentry_iput(dentry);
|
||||
fsnotify_nameremove(dentry, isdir);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1180,6 +1185,8 @@ void d_delete(struct dentry * dentry)
|
|||
|
||||
spin_unlock(&dentry->d_lock);
|
||||
spin_unlock(&dcache_lock);
|
||||
|
||||
fsnotify_nameremove(dentry, isdir);
|
||||
}
|
||||
|
||||
static void __d_rehash(struct dentry * entry, struct hlist_head *list)
|
||||
|
|
|
@ -129,8 +129,14 @@ static int zisofs_readpage(struct file *file, struct page *page)
|
|||
cend = le32_to_cpu(*(__le32 *)(bh->b_data + (blockendptr & bufmask)));
|
||||
brelse(bh);
|
||||
|
||||
if (cstart > cend)
|
||||
goto eio;
|
||||
|
||||
csize = cend-cstart;
|
||||
|
||||
if (csize > deflateBound(1UL << zisofs_block_shift))
|
||||
goto eio;
|
||||
|
||||
/* Now page[] contains an array of pages, any of which can be NULL,
|
||||
and the locks on which we hold. We should now read the data and
|
||||
release the pages. If the pages are NULL the decompressed data
|
||||
|
|
|
@ -1802,7 +1802,6 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry)
|
|||
up(&dentry->d_inode->i_sem);
|
||||
if (!error) {
|
||||
d_delete(dentry);
|
||||
fsnotify_rmdir(dentry, dentry->d_inode, dir);
|
||||
}
|
||||
dput(dentry);
|
||||
|
||||
|
@ -1874,9 +1873,7 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry)
|
|||
|
||||
/* We don't d_delete() NFS sillyrenamed files--they still exist. */
|
||||
if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) {
|
||||
struct inode *inode = dentry->d_inode;
|
||||
d_delete(dentry);
|
||||
fsnotify_unlink(dentry, inode, dir);
|
||||
}
|
||||
|
||||
return error;
|
||||
|
|
|
@ -160,7 +160,7 @@ clone_mnt(struct vfsmount *old, struct dentry *root)
|
|||
mnt->mnt_root = dget(root);
|
||||
mnt->mnt_mountpoint = mnt->mnt_root;
|
||||
mnt->mnt_parent = mnt;
|
||||
mnt->mnt_namespace = old->mnt_namespace;
|
||||
mnt->mnt_namespace = current->namespace;
|
||||
|
||||
/* stick the duplicate mount on the same expiry list
|
||||
* as the original if that was on one */
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
* Changelog:
|
||||
* 11-Sep-2004 BJD Created file
|
||||
* 21-Sep-2004 BJD Updated port info
|
||||
* 09-Aug-2005 BJD Renamed s3c2410_report_oc s3c2410_usb_report_oc
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_USBCONTROL_H
|
||||
|
@ -35,7 +36,7 @@ struct s3c2410_hcd_info {
|
|||
void (*report_oc)(struct s3c2410_hcd_info *, int ports);
|
||||
};
|
||||
|
||||
static void inline s3c2410_report_oc(struct s3c2410_hcd_info *info, int ports)
|
||||
static void inline s3c2410_usb_report_oc(struct s3c2410_hcd_info *info, int ports)
|
||||
{
|
||||
if (info->report_oc != NULL) {
|
||||
(info->report_oc)(info, ports);
|
||||
|
|
|
@ -188,12 +188,18 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
|
|||
/*
|
||||
* - extended small page/tiny page
|
||||
*/
|
||||
#define PTE_EXT_XN (1 << 0) /* v6 */
|
||||
#define PTE_EXT_AP_MASK (3 << 4)
|
||||
#define PTE_EXT_AP0 (1 << 4)
|
||||
#define PTE_EXT_AP1 (2 << 4)
|
||||
#define PTE_EXT_AP_UNO_SRO (0 << 4)
|
||||
#define PTE_EXT_AP_UNO_SRW (1 << 4)
|
||||
#define PTE_EXT_AP_URO_SRW (2 << 4)
|
||||
#define PTE_EXT_AP_URW_SRW (3 << 4)
|
||||
#define PTE_EXT_AP_UNO_SRW (PTE_EXT_AP0)
|
||||
#define PTE_EXT_AP_URO_SRW (PTE_EXT_AP1)
|
||||
#define PTE_EXT_AP_URW_SRW (PTE_EXT_AP1|PTE_EXT_AP0)
|
||||
#define PTE_EXT_TEX(x) ((x) << 6) /* v5 */
|
||||
#define PTE_EXT_APX (1 << 9) /* v6 */
|
||||
#define PTE_EXT_SHARED (1 << 10) /* v6 */
|
||||
#define PTE_EXT_NG (1 << 11) /* v6 */
|
||||
|
||||
/*
|
||||
* - small page
|
||||
|
@ -224,6 +230,8 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
|
|||
#define L_PTE_WRITE (1 << 5)
|
||||
#define L_PTE_EXEC (1 << 6)
|
||||
#define L_PTE_DIRTY (1 << 7)
|
||||
#define L_PTE_SHARED (1 << 10) /* shared between CPUs (v6) */
|
||||
#define L_PTE_ASID (1 << 11) /* non-global (use ASID, v6) */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* defines for inline arch setup functions */
|
||||
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/i8259.h>
|
||||
#include "cobalt.h"
|
||||
|
||||
static inline void do_timer_interrupt_hook(struct pt_regs *regs)
|
||||
|
|
|
@ -202,18 +202,64 @@ extern unsigned long ioremap_bot, ioremap_base;
|
|||
*
|
||||
* Note that these bits preclude future use of a page size
|
||||
* less than 4KB.
|
||||
*
|
||||
*
|
||||
* PPC 440 core has following TLB attribute fields;
|
||||
*
|
||||
* TLB1:
|
||||
* 0 1 2 3 4 ... 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
||||
* RPN................................. - - - - - - ERPN.......
|
||||
*
|
||||
* TLB2:
|
||||
* 0 1 2 3 4 ... 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
||||
* - - - - - - U0 U1 U2 U3 W I M G E - UX UW UR SX SW SR
|
||||
*
|
||||
* There are some constrains and options, to decide mapping software bits
|
||||
* into TLB entry.
|
||||
*
|
||||
* - PRESENT *must* be in the bottom three bits because swap cache
|
||||
* entries use the top 29 bits for TLB2.
|
||||
*
|
||||
* - FILE *must* be in the bottom three bits because swap cache
|
||||
* entries use the top 29 bits for TLB2.
|
||||
*
|
||||
* - CACHE COHERENT bit (M) has no effect on PPC440 core, because it
|
||||
* doesn't support SMP. So we can use this as software bit, like
|
||||
* DIRTY.
|
||||
*
|
||||
* With the PPC 44x Linux implementation, the 0-11th LSBs of the PTE are used
|
||||
* for memory protection related functions (see PTE structure in
|
||||
* include/asm-ppc/mmu.h). The _PAGE_XXX definitions in this file map to the
|
||||
* above bits. Note that the bit values are CPU specific, not architecture
|
||||
* specific.
|
||||
*
|
||||
* The kernel PTE entry holds an arch-dependent swp_entry structure under
|
||||
* certain situations. In other words, in such situations some portion of
|
||||
* the PTE bits are used as a swp_entry. In the PPC implementation, the
|
||||
* 3-24th LSB are shared with swp_entry, however the 0-2nd three LSB still
|
||||
* hold protection values. That means the three protection bits are
|
||||
* reserved for both PTE and SWAP entry at the most significant three
|
||||
* LSBs.
|
||||
*
|
||||
* There are three protection bits available for SWAP entry:
|
||||
* _PAGE_PRESENT
|
||||
* _PAGE_FILE
|
||||
* _PAGE_HASHPTE (if HW has)
|
||||
*
|
||||
* So those three bits have to be inside of 0-2nd LSB of PTE.
|
||||
*
|
||||
*/
|
||||
|
||||
#define _PAGE_PRESENT 0x00000001 /* S: PTE valid */
|
||||
#define _PAGE_RW 0x00000002 /* S: Write permission */
|
||||
#define _PAGE_DIRTY 0x00000004 /* S: Page dirty */
|
||||
#define _PAGE_FILE 0x00000004 /* S: nonlinear file mapping */
|
||||
#define _PAGE_ACCESSED 0x00000008 /* S: Page referenced */
|
||||
#define _PAGE_HWWRITE 0x00000010 /* H: Dirty & RW */
|
||||
#define _PAGE_HWEXEC 0x00000020 /* H: Execute permission */
|
||||
#define _PAGE_USER 0x00000040 /* S: User page */
|
||||
#define _PAGE_ENDIAN 0x00000080 /* H: E bit */
|
||||
#define _PAGE_GUARDED 0x00000100 /* H: G bit */
|
||||
#define _PAGE_COHERENT 0x00000200 /* H: M bit */
|
||||
#define _PAGE_FILE 0x00000400 /* S: nonlinear file mapping */
|
||||
#define _PAGE_DIRTY 0x00000200 /* S: Page dirty */
|
||||
#define _PAGE_NO_CACHE 0x00000400 /* H: I bit */
|
||||
#define _PAGE_WRITETHRU 0x00000800 /* H: W bit */
|
||||
|
||||
|
|
|
@ -301,6 +301,7 @@ struct blk_queue_tag {
|
|||
struct list_head busy_list; /* fifo list of busy tags */
|
||||
int busy; /* current depth */
|
||||
int max_depth; /* what we will send to device */
|
||||
int real_max_depth; /* what the array can hold */
|
||||
atomic_t refcnt; /* map can be shared */
|
||||
};
|
||||
|
||||
|
|
|
@ -44,26 +44,22 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
|
|||
}
|
||||
|
||||
/*
|
||||
* fsnotify_unlink - file was unlinked
|
||||
* fsnotify_nameremove - a filename was removed from a directory
|
||||
*/
|
||||
static inline void fsnotify_unlink(struct dentry *dentry, struct inode *inode, struct inode *dir)
|
||||
static inline void fsnotify_nameremove(struct dentry *dentry, int isdir)
|
||||
{
|
||||
inode_dir_notify(dir, DN_DELETE);
|
||||
inotify_inode_queue_event(dir, IN_DELETE, 0, dentry->d_name.name);
|
||||
inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL);
|
||||
|
||||
inotify_inode_is_dead(inode);
|
||||
if (isdir)
|
||||
isdir = IN_ISDIR;
|
||||
dnotify_parent(dentry, DN_DELETE);
|
||||
inotify_dentry_parent_queue_event(dentry, IN_DELETE|isdir, 0, dentry->d_name.name);
|
||||
}
|
||||
|
||||
/*
|
||||
* fsnotify_rmdir - directory was removed
|
||||
* fsnotify_inoderemove - an inode is going away
|
||||
*/
|
||||
static inline void fsnotify_rmdir(struct dentry *dentry, struct inode *inode,
|
||||
struct inode *dir)
|
||||
static inline void fsnotify_inoderemove(struct inode *inode)
|
||||
{
|
||||
inode_dir_notify(dir, DN_DELETE);
|
||||
inotify_inode_queue_event(dir,IN_DELETE|IN_ISDIR,0,dentry->d_name.name);
|
||||
inotify_inode_queue_event(inode, IN_DELETE_SELF | IN_ISDIR, 0, NULL);
|
||||
inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL);
|
||||
inotify_inode_is_dead(inode);
|
||||
}
|
||||
|
||||
|
|
|
@ -1501,4 +1501,10 @@ extern struct bus_type ide_bus_type;
|
|||
#define ide_id_has_flush_cache_ext(id) \
|
||||
(((id)->cfs_enable_2 & 0x2400) == 0x2400)
|
||||
|
||||
static inline int hwif_to_node(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = hwif->pci_dev;
|
||||
return dev ? pcibus_to_node(dev->bus) : -1;
|
||||
}
|
||||
|
||||
#endif /* _IDE_H */
|
||||
|
|
|
@ -12,15 +12,13 @@
|
|||
#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */
|
||||
#define NETLINK_XFRM 6 /* ipsec */
|
||||
#define NETLINK_SELINUX 7 /* SELinux event notifications */
|
||||
#define NETLINK_ARPD 8
|
||||
#define NETLINK_ISCSI 8 /* Open-iSCSI */
|
||||
#define NETLINK_AUDIT 9 /* auditing */
|
||||
#define NETLINK_FIB_LOOKUP 10
|
||||
#define NETLINK_ROUTE6 11 /* af_inet6 route comm channel */
|
||||
#define NETLINK_NETFILTER 12 /* netfilter subsystem */
|
||||
#define NETLINK_IP6_FW 13
|
||||
#define NETLINK_DNRTMSG 14 /* DECnet routing messages */
|
||||
#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */
|
||||
#define NETLINK_TAPBASE 16 /* 16 to 31 are ethertap */
|
||||
|
||||
#define MAX_LINKS 32
|
||||
|
||||
|
|
|
@ -225,7 +225,6 @@
|
|||
#define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */
|
||||
#define PCI_PM_CTRL 4 /* PM control and status register */
|
||||
#define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */
|
||||
#define PCI_PM_CTRL_NO_SOFT_RESET 0x0004 /* No reset for D3hot->D0 */
|
||||
#define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */
|
||||
#define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */
|
||||
#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */
|
||||
|
@ -817,9 +816,7 @@ int pci_set_mwi(struct pci_dev *dev);
|
|||
void pci_clear_mwi(struct pci_dev *dev);
|
||||
int pci_set_dma_mask(struct pci_dev *dev, u64 mask);
|
||||
int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask);
|
||||
void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno);
|
||||
int pci_assign_resource(struct pci_dev *dev, int i);
|
||||
void pci_restore_bars(struct pci_dev *dev);
|
||||
|
||||
/* ROM control related routines */
|
||||
void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue